cn.edu.thss.iise.beehivez.server.index.yawlindex.yawltasksluceneindex.YAWLTasksLuceneIndex.java Source code

Java tutorial

Introduction

Here is the source code for cn.edu.thss.iise.beehivez.server.index.yawlindex.yawltasksluceneindex.YAWLTasksLuceneIndex.java

Source

/**
 * BeehiveZ is a business process model and instance management system.
 * Copyright (C) 2011  
 * Institute of Information System and Engineering, School of Software, Tsinghua University,
 * Beijing, China
 *
 * Contact: jintao05@gmail.com 
 *
 * This program is a free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation with the version of 2.
 *
 * This program 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package cn.edu.thss.iise.beehivez.server.index.yawlindex.yawltasksluceneindex;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.FSDirectory;
import org.processmining.framework.models.petrinet.PetriNet;
import org.processmining.framework.models.petrinet.Transition;
import org.processmining.importing.pnml.PnmlImport;
import org.processmining.mining.petrinetmining.PetriNetResult;
import org.yawlfoundation.yawl.elements.YNet;
import org.yawlfoundation.yawl.elements.YTask;

import cn.edu.thss.iise.beehivez.server.datamanagement.DataManager;
import cn.edu.thss.iise.beehivez.server.datamanagement.pojo.PetrinetObject;
import cn.edu.thss.iise.beehivez.server.datamanagement.pojo.ProcessObject;
import cn.edu.thss.iise.beehivez.server.filelogger.Indexlogger;
import cn.edu.thss.iise.beehivez.server.graph.isomorphism.Ullman4PetriNet;
import cn.edu.thss.iise.beehivez.server.graph.isomorphism.Ullman4YAWL;
import cn.edu.thss.iise.beehivez.server.graph.isomorphism.VF24YAWL;
import cn.edu.thss.iise.beehivez.server.index.ProcessQueryResult;
import cn.edu.thss.iise.beehivez.server.index.labelindex.LabelLuceneIndex;
import cn.edu.thss.iise.beehivez.server.index.labelindex.SimilarLabelQueryResult;
import cn.edu.thss.iise.beehivez.server.index.luceneindex.analyzer.SemicolonAnalyzer;
import cn.edu.thss.iise.beehivez.server.index.petrinetindex.tarluceneindex.PetriNetTARsDocument;
import cn.edu.thss.iise.beehivez.server.index.petrinetindex.tarluceneindex.TARsQueryResultCollector;
import cn.edu.thss.iise.beehivez.server.index.yawlindex.YAWLIndex;
import cn.edu.thss.iise.beehivez.server.parameter.GlobalParameter;
import cn.edu.thss.iise.beehivez.server.util.FileUtil;
import cn.edu.thss.iise.beehivez.server.util.PetriNetUtil;
import cn.edu.thss.iise.beehivez.server.util.TransitionLabelPair;
import cn.edu.thss.iise.beehivez.server.util.YAWLUtil;

/**
 * @author Tao Jin
 * 
 */
public class YAWLTasksLuceneIndex extends YAWLIndex {
    private static final String indexDirectory = GlobalParameter.getHomeDirectory() + "/index/YawlTasksLuceneIndex";
    private static final File INDEX_DIR = new File(indexDirectory);
    private static IndexWriter indexWriter = null;
    private LabelLuceneIndex labelIndex = new LabelLuceneIndex(indexDirectory);

    @Override
    public void addProcessModel(Object o) {
        ProcessObject po = (ProcessObject) o;
        try {
            // get the object of yawl net and process id
            YNet net = (YNet) po.getObject();
            if (net == null) {
                net = YAWLUtil.getYNetFromDefinition(po.getDefinition());
                po.setObject(net);
            }
            if (net == null) {
                System.out.println("null yawl model in addProcessModel of TaskLuceneIndex");
                return;
            }

            Document doc = YAWLTasksDocument.Document(net, po.getProcess_id());
            indexWriter.addDocument(doc);
            indexWriter.commit();

            // update the label index
            for (YTask task : net.getNetTasks()) {
                labelIndex.addLabel(task.getName().trim());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void close() {
        try {
            if (indexWriter != null) {
                indexWriter.optimize();
                indexWriter.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        labelIndex.close();
    }

    @Override
    public boolean create() {
        try {
            if (indexWriter != null) {
                indexWriter.close();
            }
            indexWriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SemicolonAnalyzer(), true,
                    IndexWriter.MaxFieldLength.UNLIMITED);

            labelIndex.create();
            labelIndex.addLabel("null");

            DataManager dm = DataManager.getInstance();
            int limit = dm.getPageSize();
            ResultSet rs = dm.executeSelectSQL(
                    "select process_id from process where type='" + ProcessObject.TYPEYAWL + "'", 0,
                    Integer.MAX_VALUE, dm.getFetchSize());
            while (rs.next()) {
                ProcessObject po = new ProcessObject();
                long process_id = rs.getLong("process_id");
                po.setProcess_id(process_id);

                byte[] definition = dm.getProcessDefinitionBytes(process_id);
                po.setDefinition(definition);
                po.setObject(YAWLUtil.getYNetFromDefinition(definition));

                this.addProcessModel(po);
            }
            Statement stmt = rs.getStatement();
            rs.close();
            stmt.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        return true;
    }

    @Override
    public void delProcessModel(Object o) {
        System.out.println("need to be implemented");
    }

    @Override
    public boolean destroy() {
        close();
        FileUtil.deleteFile(indexDirectory);
        return true;
    }

    @Override
    public TreeSet<ProcessQueryResult> getProcessModels(Object o, float similarity) {
        TreeSet<ProcessQueryResult> ret = new TreeSet<ProcessQueryResult>();

        try {
            if (o instanceof YNet) {
                YNet query = (YNet) o;

                IndexReader reader = IndexReader.open(FSDirectory.open(INDEX_DIR), true);
                Searcher searcher = new IndexSearcher(reader);
                BooleanQuery bq = new BooleanQuery();
                BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);

                // expand the tasks with their similar ones
                HashSet<String> expandedTasks = new HashSet<String>();

                if (GlobalParameter.isEnableSimilarLabel()) {
                    // label similarity is enabled
                    for (YTask task : query.getNetTasks()) {
                        String taskName = task.getName().trim();
                        if (expandedTasks.add(taskName)) {
                            BooleanQuery subq = new BooleanQuery();
                            // Term term = new
                            // Term(YAWLTasksDocument.FIELDTASKS,
                            // taskName);
                            // TermQuery termQuery = new TermQuery(term);
                            // subq.add(termQuery, Occur.SHOULD);

                            TreeSet<SimilarLabelQueryResult> similarTasks = labelIndex.getSimilarLabels(taskName,
                                    GlobalParameter.getLabelSemanticSimilarity());
                            Iterator<SimilarLabelQueryResult> it = similarTasks.iterator();
                            while (it.hasNext()) {
                                SimilarLabelQueryResult sl = it.next();
                                String similarTaskName = sl.getLabel();
                                Term term = new Term(YAWLTasksDocument.FIELDTASKS, similarTaskName);
                                TermQuery termQuery = new TermQuery(term);
                                subq.add(termQuery, Occur.SHOULD);
                            }
                            if (subq.getClauses().length > 0) {
                                bq.add(subq, Occur.MUST);
                            } else {
                                return ret;
                            }
                        }
                    }
                } else {
                    // label similarity is not enabled
                    for (YTask task : query.getNetTasks()) {
                        String taskName = task.getName().trim();
                        if (expandedTasks.add(taskName)) {
                            Term term = new Term(YAWLTasksDocument.FIELDTASKS, taskName);
                            TermQuery termQuery = new TermQuery(term);
                            bq.add(termQuery, Occur.MUST);
                        }
                    }
                }

                // for (YTask task : query.getNetTasks()) {
                // String taskName = task.getName().trim();
                // if (GlobalParameter.isEnableSimilarLabel()) {
                // // label similarity is enabled
                // if (expandedTasks.add(taskName)) {
                // BooleanQuery subq = new BooleanQuery();
                // // Term term = new
                // // Term(YAWLTasksDocument.FIELDTASKS,
                // // taskName);
                // // TermQuery termQuery = new TermQuery(term);
                // // subq.add(termQuery, Occur.SHOULD);
                //
                // TreeSet<SimilarLabelQueryResult> similarTasks = labelIndex
                // .getSimilarLabels(taskName, GlobalParameter
                // .getLabelSemanticSimilarity());
                // Iterator<SimilarLabelQueryResult> it = similarTasks
                // .iterator();
                // while (it.hasNext()) {
                // SimilarLabelQueryResult sl = it.next();
                // String similarTaskName = sl.getLabel();
                // Term term = new Term(
                // YAWLTasksDocument.FIELDTASKS,
                // similarTaskName);
                // TermQuery termQuery = new TermQuery(term);
                // subq.add(termQuery, Occur.SHOULD);
                // }
                // if (subq.getClauses().length > 0) {
                // bq.add(subq, Occur.MUST);
                // } else {
                // return ret;
                // }
                // }
                // } else {
                // // label similarity is not enabled
                // if (expandedTasks.add(taskName)) {
                // Term term = new Term(YAWLTasksDocument.FIELDTASKS,
                // taskName);
                // TermQuery termQuery = new TermQuery(term);
                // bq.add(termQuery, Occur.MUST);
                // }
                // }
                // }

                YAWLTasksQueryResultCollector collector = new YAWLTasksQueryResultCollector(reader);
                searcher.search(bq, collector);
                ret = collector.getQueryResult();
                searcher.close();
                reader.close();

                // sub graph isomorphism check using Ullman's algorithm
                // accurately match
                Iterator<ProcessQueryResult> it = ret.iterator();
                while (it.hasNext()) {
                    ProcessQueryResult pqr = it.next();
                    long process_id = pqr.getProcess_id();
                    DataManager dm = DataManager.getInstance();
                    YNet model = YAWLUtil.getYNetFromDefinition(dm.getProcessDefinitionBytes(process_id));
                    if (!Ullman4YAWL.subGraphIsomorphism(query, model)) {
                        it.remove();
                    }
                    // if (!VF24YAWL.subGraphIsomorphism(query, model)) {
                    // it.remove();
                    // }
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }

    @Override
    public float getStorageSizeInMB() {
        return FileUtil.getFileSizeInMB(indexDirectory);
    }

    @Override
    public boolean open() {
        try {
            if (indexWriter != null) {
                indexWriter.close();
            }
            indexWriter = new IndexWriter(FSDirectory.open(INDEX_DIR), new SemicolonAnalyzer(), false,
                    IndexWriter.MaxFieldLength.UNLIMITED);
            labelIndex.open();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    @Override
    public boolean supportGraphQuery() {
        return true;
    }

    @Override
    public boolean supportSimilarLabel() {
        return true;
    }

    @Override
    public boolean supportSimilarQuery() {
        return false;
    }

    @Override
    public boolean supportTextQuery() {
        return false;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}