cn.edu.thss.iise.beehivez.server.index.petrinetindex.relationindex.TaskRelationIndex.java Source code

Java tutorial

Introduction

Here is the source code for cn.edu.thss.iise.beehivez.server.index.petrinetindex.relationindex.TaskRelationIndex.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.petrinetindex.relationindex;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import java.sql.ResultSet;
import java.sql.Statement;
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.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.store.FSDirectory;
import org.processmining.framework.models.petrinet.PetriNet;
import org.processmining.framework.models.petrinet.Transition;

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.index.labelindex.LabelLuceneIndex;
import cn.edu.thss.iise.beehivez.server.index.petrinetindex.PetriNetIndex;
import cn.edu.thss.iise.beehivez.server.index.ProcessQueryResult;
import cn.edu.thss.iise.beehivez.server.index.petrinetindex.relationindex.queryparser.QueryParser;
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.ToolKit;

/**
 * @author Tao Jin
 * 
 */
public class TaskRelationIndex extends PetriNetIndex {
    private static final String indexDirectory = GlobalParameter.getHomeDirectory() + "/index/TaskRelationIndex";
    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) {
        PetrinetObject pno = (PetrinetObject) o;
        try {
            // get the object of petri net and process id
            PetriNet pn = pno.getPetriNet();
            if (pn == null) {
                pn = PetriNetUtil.getPetriNetFromPnmlBytes(pno.getPnml());
            }
            if (pn == null) {
                System.out.println("null petri net in addPetriNet of TransitionRelationIndex");
                return;
            }

            Document doc = TransitionRelationDocument.Document(pn, pno.getProcess_id());
            indexWriter.addDocument(doc);
            indexWriter.commit();

            // update the label index
            for (Transition t : pn.getTransitions()) {
                labelIndex.addLabel(t.getIdentifier());
            }
        } 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();

            DataManager dm = DataManager.getInstance();
            ResultSet rs = dm.executeSelectSQL("select process_id from petrinet", 0, Integer.MAX_VALUE,
                    dm.getFetchSize());
            while (rs.next()) {
                PetrinetObject pno = new PetrinetObject();

                long process_id = rs.getLong("process_id");
                pno.setProcess_id(process_id);

                PetriNet pn = dm.getProcessPetriNet(process_id);
                pno.setPetriNet(pn);

                this.addProcessModel(pno);
                pn.destroyPetriNet();
            }
            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 pno) {
        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 String) {
                String query = (String) o;

                // analyze the query
                StringReader sr = new StringReader(query);
                BufferedReader br = new BufferedReader(sr);
                QueryParser parser = new QueryParser(br);
                if (GlobalParameter.isEnableSimilarLabel()) {
                    parser.setSemanticAide(this.labelIndex, GlobalParameter.getLabelSemanticSimilarity());
                }
                Query q = parser.parse();
                // System.out.println("before optimization");
                // System.out.println(q.toString());
                br.close();
                sr.close();

                // optimize the query here
                // bq = parser.optimize(bq);
                // System.out.println("after optimization");
                // System.out.println(bq.toString());

                // query the lucene
                IndexReader reader = IndexReader.open(FSDirectory.open(INDEX_DIR), true);
                Searcher searcher = new IndexSearcher(reader);

                RelationQueryResultCollector collector = new RelationQueryResultCollector(reader);
                searcher.search(q, collector);
                ret = collector.getQueryResult();
                searcher.close();
                reader.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return ret;
    }

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

    // @Override
    // protected void init() {
    // String str = this.getClass().getCanonicalName();
    // this.javaClassName = str;
    // this.name = str.substring(str.lastIndexOf(".") + 1);
    //
    // }

    @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() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean supportSimilarLabel() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean supportSimilarQuery() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean supportTextQuery() {
        // TODO Auto-generated method stub
        return true;
    }

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

    }
}