Xcos search: index help JARs
[scilab.git] / scilab / modules / xcos / src / java / org / scilab / modules / xcos / palette / PaletteSearchManager.java
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2015 - Marcos CARDINOT
4  * Copyright (C) 2017 - Scilab Enterprises - Clement DAVID
5  *
6  * This file must be used under the terms of the CeCILL.
7  * This source file is licensed as described in the file COPYING, which
8  * you should have received as part of this distribution.  The terms
9  * are also available at
10  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
11  *
12  */
13
14 package org.scilab.modules.xcos.palette;
15
16 import java.io.File;
17 import java.io.IOException;
18 import java.util.HashMap;
19 import java.util.List;
20 import java.util.Map;
21 import java.util.logging.Level;
22 import java.util.logging.Logger;
23
24 import javax.swing.JScrollPane;
25 import javax.swing.tree.TreeModel;
26
27 import org.apache.lucene.analysis.Analyzer;
28 import org.apache.lucene.analysis.standard.StandardAnalyzer;
29 import org.apache.lucene.document.Document;
30 import org.apache.lucene.index.IndexWriter;
31 import org.apache.lucene.index.IndexWriterConfig;
32 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
33 import org.apache.lucene.store.Directory;
34 import org.apache.lucene.store.RAMDirectory;
35 import org.scilab.modules.xcos.palette.model.PaletteBlock;
36 import org.scilab.modules.xcos.palette.model.PaletteNode;
37 import org.scilab.modules.xcos.palette.model.PreLoaded;
38 import org.scilab.modules.xcos.palette.view.PaletteManagerPanel;
39 import org.scilab.modules.xcos.palette.view.PaletteManagerView;
40 import org.scilab.modules.xcos.palette.view.PaletteSearchView;
41 import org.scilab.modules.xcos.utils.XcosMessages;
42
43 /**
44  * Manager class for the palettes search.
45  * @author Marcos Cardinot <mcardinot@gmail.com>
46  */
47 public final class PaletteSearchManager {
48
49     private Boolean indexIsOutdated = true;
50
51     private Analyzer analyzer;
52     private IndexWriter writer;
53     private PaletteIndexer paletteIndexer;
54     private PaletteSearcher paletteSearcher;
55     private PaletteSearchView view;
56     private Map<String, PaletteBlock> nameToPalette;
57
58     /** Default constructor */
59     public PaletteSearchManager() {
60         try {
61             Directory ramDir = new RAMDirectory();
62             analyzer = new StandardAnalyzer();
63             IndexWriterConfig config = new IndexWriterConfig(analyzer);
64             config.setOpenMode(OpenMode.CREATE);
65             writer = new IndexWriter(ramDir, config);
66         } catch (IOException ex) {
67             Logger.getLogger(PaletteSearchManager.class.getName()).log(Level.SEVERE, null, ex);
68         }
69
70         nameToPalette = new HashMap<>();
71         view = new PaletteSearchView();
72         paletteIndexer = new PaletteIndexer(this);
73         paletteSearcher = new PaletteSearcher(this);
74     }
75
76     /**
77      * Look for a block into the Index.
78      * @param query Query
79      */
80     public void search(String query) {
81         PaletteManagerView.get().getTree().clearSelection();
82         view.initComponents();
83
84         final String queryLabel = "'" + query + "' - ";
85         view.setText(queryLabel + XcosMessages.SEARCHING);
86
87         PaletteManagerPanel panel = PaletteManagerView.get().getPanel();
88         JScrollPane scrollPane = (JScrollPane) panel.getRightComponent();
89         scrollPane.setViewportView(view);
90
91         if (indexIsOutdated) {
92             refreshIndex();
93             indexIsOutdated = false;
94         }
95
96         List<Document> found = paletteSearcher.search(query);
97         for (Document doc : found) {
98             PaletteBlock block = nameToPalette.get(doc.get("refname"));
99             if (block != null) {
100                 view.addBlock(block);
101             }
102         }
103         view.setText(queryLabel + found.size() + " " + XcosMessages.MATCHES);
104         view.revalidate();
105         scrollPane.revalidate();
106     }
107
108     /**
109      * Refreshes the whole Index
110      */
111     private void refreshIndex() {
112         TreeModel model = PaletteManagerView.get().getTree().getModel();
113         if (model != null) {
114             loadHashTable(model, model.getRoot(), "");
115             paletteIndexer.createIndex(nameToPalette);
116         }
117     }
118
119     /**
120      * Recursive function that loads a hashtable containing all available blocks.
121      * @param model TreeModel
122      * @param obj Object
123      * @param treePath String
124      */
125     private void loadHashTable(TreeModel model, Object obj, String treePath) {
126         int  cc = model.getChildCount(obj);
127         for (int i = 0; i < cc; ++i) {
128             PaletteNode node = (PaletteNode) model.getChild(obj, i);
129             if (node instanceof PreLoaded) {
130                 for (PaletteBlock b : ((PreLoaded) node).getBlock()) {
131                     nameToPalette.put(b.getName(), b);
132                 }
133             } else {
134                 loadHashTable(model, node, treePath + File.separator + node.toString());
135             }
136         }
137     }
138
139     /**
140      * When the Index is outdated, the PaletteSearchManager
141      * will refresh it before the next search().
142      * @param b True if it is outdated.
143      */
144     public void setIndexIsOutdated(Boolean b) {
145         indexIsOutdated = b;
146     }
147
148     /**
149      * Get analyzer
150      * @return Analyzer
151      */
152     public Analyzer getAnalyzer() {
153         return analyzer;
154     }
155
156     /**
157      * Get IndexWriter
158      * @return IndexWriter
159      */
160     public IndexWriter getIndexWriter() {
161         return writer;
162     }
163 }