/* * Copyright (c) 2009 Andrejs Jermakovics. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Andrejs Jermakovics - initial implementation */ package it.unibz.instasearch; import it.unibz.instasearch.indexing.Searcher; import it.unibz.instasearch.indexing.Searcher.SearcherConfig; import it.unibz.instasearch.indexing.WorkspaceIndexer; import it.unibz.instasearch.indexing.WorkspaceIndexerJDT; import it.unibz.instasearch.jobs.DeleteIndexJob; import it.unibz.instasearch.jobs.IndexUpdateJob; import it.unibz.instasearch.jobs.IndexingJob; import it.unibz.instasearch.prefs.PreferenceConstants; import java.io.IOException; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.jobs.Job; /** * InstaSearch class. Manages indexing jobs */ public class InstaSearch { private WorkspaceIndexer indexer; private Searcher searcher; private IndexingJob indexingJob; private IndexUpdateJob indexUpdateJob; InstaSearch() throws Exception { try { indexer = new WorkspaceIndexerJDT(); // if have JDT installed, we can index jars } catch(Throwable ignored) { // NoClassDefFoundError // no jdt, nevermind InstaSearchPlugin.debug(ignored); } if( indexer == null ) indexer = new WorkspaceIndexer(); // create default indexer searcher = new Searcher(getSearcherConfig()); indexer.setIndexChangeListener(searcher); InstaSearchPlugin.addPreferenceChangeListener(indexer); InstaSearchPlugin.addPreferenceChangeListener(searcher); String lastVer = InstaSearchPlugin.getDefault().getPreferenceStore().getString("version"); String curVer = InstaSearchPlugin.getVersion(); InstaSearchPlugin.getDefault().getPreferenceStore().setValue("version", curVer); if( !indexer.isIndexed() || !indexer.isReadable() || !curVer.equals(lastVer) ) createIndex(); else searcher.onIndexUpdate(); int indexUpdateInterval = InstaSearchPlugin.getIntPref(PreferenceConstants.P_INDEX_UPDATE_INTERVAL); boolean indexUpdateEnabled = InstaSearchPlugin.getBoolPref(PreferenceConstants.P_INDEX_UPDATE_ENABLED); indexUpdateJob = new IndexUpdateJob(indexer, searcher); indexUpdateJob.setSystem(true); if ((indexUpdateEnabled) && (indexUpdateInterval > 0)){ indexUpdateJob.schedule(indexUpdateInterval); } InstaSearchPlugin.addPreferenceChangeListener(indexUpdateJob); } public WorkspaceIndexer getIndexer() { return indexer; } public Searcher getSearcher() { return searcher; } public void rebuildIndex() { createIndex(); } public void deleteIndex() { DeleteIndexJob deleteIndexJob = new DeleteIndexJob(indexer); deleteIndexJob.schedule(); } public boolean isIndexing() { if( indexingJob == null ) return false; if( indexingJob.getState() == WorkspaceJob.RUNNING || indexingJob.getState() == WorkspaceJob.WAITING ) return true; return false; } /** * Starts the indexing job * */ public void createIndex() { if( indexingJob == null ) { indexingJob = new IndexingJob(indexer); indexingJob.setPriority(Job.LONG); // long running job } else if( isIndexing() ) return; indexingJob.schedule(); } void cancelJobs() { if( indexingJob != null ) indexingJob.cancel(); if( indexUpdateJob != null ) indexUpdateJob.cancel(); } /** * Update the index with the latest changes */ public void updateIndex() { if( indexUpdateJob != null ) { indexUpdateJob.cancel(); indexUpdateJob.schedule(); } } public SearcherConfig getSearcherConfig() { return new SearcherConfig() { @SuppressWarnings("deprecation") public Directory getIndexDir() throws IOException { return FSDirectory.getDirectory(InstaSearchPlugin.getIndexDirLocation(), false); } public boolean getBoolPref(String pref) { return InstaSearchPlugin.getBoolPref(pref); } public void log(Exception e) { InstaSearchPlugin.log(e); } }; } }