gnusmail.filters.mail_metadata.MultilabelFolder.java Source code

Java tutorial

Introduction

Here is the source code for gnusmail.filters.mail_metadata.MultilabelFolder.java

Source

/*
 * Copyright 2011 Universidad de Mlaga.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 3 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 3 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 3 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Universidad de Mlaga, 29071 Malaga, Spain or visit
 * www.uma.es if you need additional information or have any questions.
 * 
 */
package gnusmail.filters.mail_metadata;

import gnusmail.core.ConfigManager;
import gnusmail.datasource.Document;
import gnusmail.datasource.mailconnection.MailMessage;
import gnusmail.datasource.mailconnection.MessageInfo;
import gnusmail.filters.Filter;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

import javax.mail.Message;

import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;

public class MultilabelFolder extends Filter {
    private Set<String> existingFolders;
    List<Attribute> attList;
    private Map<String, Attribute> attrMap;

    public MultilabelFolder() {
        this.existingFolders = new TreeSet<String>();
        attList = new ArrayList<Attribute>();
        attrMap = new TreeMap<String, Attribute>();
    }

    @Override
    public List<Attribute> getAttributes() {
        attrMap = new TreeMap<String, Attribute>();
        for (String word : this.existingFolders) {
            FastVector values = new FastVector();
            values.addElement("1");
            values.addElement("0");
            Attribute att = new Attribute(word, values);
            attList.add(att);
            attrMap.put(word, att);
        }
        return attList;
    }

    @Override
    public void updateAttValues(Document doc) {
        if (doc instanceof MailMessage) {
            Message m = ((MailMessage) doc).getMessage();
            MessageInfo mi = new MessageInfo(m);
            String mainFolder = mi.getFolderAsString();
            List<String> listOfFolders = extractFoldersFromHierarchy(mainFolder);
            for (String folder : listOfFolders) {
                this.existingFolders.add(folder);
            }
        }
    }

    @Override
    public void updateInstance(Instance inst, Document doc) {
        if (doc instanceof MailMessage) {
            Message m = ((MailMessage) doc).getMessage();
            MessageInfo mi = new MessageInfo(m);
            List<String> listOfFolders = extractFoldersFromHierarchy(mi.getFolderAsString());
            for (Attribute att : attList) {
                if (listOfFolders.contains(att.name())) {
                    inst.setValue(att, "1");
                } else {
                    inst.setValue(att, "0");
                }
            }
        }
    }

    private List<String> extractFoldersFromHierarchy(String folder) {
        String separator = "\\.";
        String folders[] = folder.split(separator);
        List<String> multilabelFolders = new ArrayList<String>();
        int length = 0;
        for (int i = 0; i < folders.length; i++) {
            length += folders[i].length();
            String s = folder.substring(0, length + i);
            multilabelFolders.add(s);
        }
        return multilabelFolders;
    }

    public void writeToFile() {
        String filename = ConfigManager.CONF_FOLDER + "labels.xml";
        try {
            Writer output = new BufferedWriter(new FileWriter(new File(filename)));
            output.write(
                    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<labels xmlns=\"http://mulan.sourceforge.net/labels\">\n");
            for (String folder : this.existingFolders) {
                output.write("\t<label name=\"" + folder + "\"/>\n");
            }
            output.write("</labels>");
            output.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void writeToHierarchicalFile() {
        String filename = ConfigManager.CONF_FOLDER + "labels.xml";
        try {
            Writer output = new BufferedWriter(new FileWriter(new File(filename)));
            output.write(
                    "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<labels xmlns=\"http://mulan.sourceforge.net/labels\">\n");
            Iterator<String> iter = this.existingFolders.iterator();
            if (iter.hasNext()) {
                String folder = iter.next();
                recursiveLabels(iter, output, folder, "\t");
                output.write("\t<label name=\"INBOX.DUMMY\"/>\n");
            }
            output.write("</labels>");
            output.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private String recursiveLabels(Iterator<String> iter, Writer output, String parentFolder, String tab)
            throws IOException {
        output.write(tab + "<label name=\"" + parentFolder + "\">\n");
        int count = 0;
        boolean readNextFolder = true;
        String folder = null;
        while (iter.hasNext()) {
            if (readNextFolder) {
                folder = iter.next();
            } else {
                readNextFolder = true;
            }
            if (folder.startsWith(parentFolder)) {
                folder = recursiveLabels(iter, output, folder, tab + "\t");
                if (folder != null) {
                    readNextFolder = false;
                }
            } else {
                break;
            }
            count++;
        }
        if (count == 1) {
            output.write(tab + "\t<label name=\"" + parentFolder + ".DUMMY\"/>\n");
        }
        output.write(tab + "</label>\n");
        return folder;
    }

}