experimental version of JSP indexer
diff --git a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
index 13d74a1..243243c 100644
--- a/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
+++ b/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/java/search/JSPIndexManager.java
@@ -21,6 +21,7 @@
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -30,6 +31,7 @@
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jdt.internal.core.JavaModelManager;
@@ -47,9 +49,10 @@
*
* @author pavery
*/
-public class JSPIndexManager implements IResourceChangeListener {
+public class JSPIndexManager {
// for debugging
+ // TODO move this to Logger, as we have in SSE
static final boolean DEBUG;
static {
String value = Platform.getDebugOption("org.eclipse.jst.jsp.core/debug/jspindexmanager"); //$NON-NLS-1$
@@ -58,10 +61,11 @@
private static final String PKEY_INDEX_STATE = "jspIndexState"; //$NON-NLS-1$
- final IndexWorkspaceJob indexingJob = new IndexWorkspaceJob();
+ private IndexWorkspaceJob indexingJob = new IndexWorkspaceJob();
+ // TODO: consider enumeration for these int constants
// set to S_UPDATING once a resource change comes in
// set to S_STABLE if:
// - we know we aren't interested in the resource change
@@ -201,7 +205,8 @@
*/
private class ProcessFilesJob extends Job {
List fileList = null;
- private final int maximumToRemember = 50;
+
+ // private final int maximumToRemember = 50;
ProcessFilesJob(String taskName) {
super(taskName);
@@ -215,20 +220,23 @@
if (DEBUG) {
System.out.println("JSPIndexManager queuing " + files.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
}
- schedule(20);
}
synchronized IFile[] getFiles() {
IFile[] files = (IFile[]) fileList.toArray(new IFile[fileList.size()]);
- if (fileList.size() > maximumToRemember) {
- fileList = new ArrayList();
- }
- else {
- fileList.clear();
- }
+ // if (fileList.size() > maximumToRemember) {
+ // fileList = new ArrayList();
+ // }
+ // else {
+ // fileList.clear();
+ // }
return files;
}
+ synchronized void clearFiles() {
+ fileList.clear();
+ }
+
protected IStatus run(IProgressMonitor monitor) {
// System.out.println("indexer monitor" + monitor);
if (isCanceled(monitor) || frameworkIsShuttingDown()) {
@@ -240,6 +248,8 @@
try {
IFile[] filesToBeProcessed = getFiles();
+ clearFiles();
+
if (DEBUG) {
System.out.println("JSPIndexManager indexing " + filesToBeProcessed.length + " files"); //$NON-NLS-2$ //$NON-NLS-1$
}
@@ -325,13 +335,19 @@
// end class ProcessFilesJob
private static JSPIndexManager fSingleton = null;
+ private boolean initialized;
+ private boolean initializing = true;
+
+ private IndexJobCoordinator indexJobCoordinator;
+ private IResourceChangeListener jspResourceChangeListener;
+
private JSPResourceVisitor fVisitor = null;
private IContentType fContentTypeJSP = null;
static long fTotalTime = 0;
// Job for processing resource delta
- ProcessFilesJob processFilesJob = null;
+ private ProcessFilesJob processFilesJob = null;
private JSPIndexManager() {
processFilesJob = new ProcessFilesJob(JSPCoreMessages.JSPIndexManager_0);
@@ -353,75 +369,36 @@
return fSingleton;
}
- /**
- * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
- */
- public void resourceChanged(IResourceChangeEvent event) {
+ public void initialize() {
- // ignore resource changes if already rebuilding
- if (getIndexState() == S_REBUILDING)
- return;
- // previously canceled, needs entire index rebuild
- if (getIndexState() == S_CANCELED) {
- rebuildIndex();
- return;
- }
+ JSPIndexManager singleInstance = getInstance();
- // set flag, so we know if a job is going to be started
- // and the state will eventually be set back to S_STABLE
- boolean beganProcess = false;
- setUpdatingState();
- IResourceDelta delta = event.getDelta();
- if (delta != null) {
- // only care about adds or changes right now...
- int kind = delta.getKind();
- boolean added = (kind & IResourceDelta.ADDED) == IResourceDelta.ADDED;
- boolean changed = (kind & IResourceDelta.CHANGED) == IResourceDelta.CHANGED;
- if (added || changed) {
+ if (!singleInstance.initialized) {
+ singleInstance.initialized = true;
- // only analyze the full (starting at root) delta hierarchy
- if (delta.getFullPath().toString().equals("/")) { //$NON-NLS-1$
- try {
- JSPResourceVisitor v = getVisitor();
- // clear from last run
- v.reset();
- // count files, possibly do this in a job too...
- // don't include PHANTOM resources
- delta.accept(v, false);
+ singleInstance.indexJobCoordinator = new IndexJobCoordinator();
+ singleInstance.jspResourceChangeListener = new JSPResourceChangeListener();
- // process files from this delta
- IFile[] files = v.getFiles();
- if (files.length > 0) {
- // processFiles(files);
- indexFiles(files);
- beganProcess = true;
- }
- }
- catch (CoreException e) {
- // need to set state here somehow, and reindex
- // otherwise index will be unreliable
- if (DEBUG)
- Logger.logException(e);
- }
- catch (Exception e) {
- // need to set state here somehow, and reindex
- // otherwise index will be unreliable
- if (DEBUG)
- Logger.logException(e);
- }
- }
- }
+ // added as JobChange listener so JSPIndexManager can be smarter
+ // about when it runs
+ Platform.getJobManager().addJobChangeListener(singleInstance.indexJobCoordinator);
+
+ // add JSPIndexManager to keep JSP Index up to date
+ // listening for IResourceChangeEvent.PRE_DELETE and
+ // IResourceChangeEvent.POST_CHANGE
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(jspResourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+
+ // https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=5091
+ // makes sure IndexManager is aware of our indexes
+ saveIndexes();
+ singleInstance.initializing = false;
}
- // if we never kicked off process, job won't set back to stable
- // so we set it here
- if (!beganProcess) {
- setStableState();
- }
+
}
- public synchronized void setIndexState(int state) {
+ synchronized void setIndexState(int state) {
if (DEBUG) {
System.out.println("JSPIndexManager setting index state to: " + state2String(state)); //$NON-NLS-1$
}
@@ -450,41 +427,41 @@
return s;
}
- public int getIndexState() {
+ int getIndexState() {
return JSPCorePlugin.getDefault().getPluginPreferences().getInt(PKEY_INDEX_STATE);
}
- public void setUpdatingState() {
+ void setUpdatingState() {
if (getIndexState() != S_CANCELED)
setIndexState(S_UPDATING);
}
- public void setCanceledState() {
+ void setCanceledState() {
setIndexState(JSPIndexManager.S_CANCELED);
}
// ca
- public void setStableState() {
+ void setStableState() {
if (getIndexState() != S_CANCELED)
setIndexState(S_STABLE);
}
- public void setRebuildingState() {
+ void setRebuildingState() {
setIndexState(S_REBUILDING);
}
- public synchronized void rebuildIndexIfNeeded() {
+ synchronized void rebuildIndexIfNeeded() {
if (getIndexState() != S_STABLE) {
rebuildIndex();
}
}
- private void rebuildIndex() {
+ void rebuildIndex() {
if (DEBUG)
System.out.println("*** JSP Index unstable, requesting re-indexing"); //$NON-NLS-1$
- indexingJob.addJobChangeListener(new JobChangeAdapter() {
+ getIndexingJob().addJobChangeListener(new JobChangeAdapter() {
public void aboutToRun(IJobChangeEvent event) {
super.aboutToRun(event);
setRebuildingState();
@@ -493,10 +470,10 @@
public void done(IJobChangeEvent event) {
super.done(event);
setStableState();
- indexingJob.removeJobChangeListener(this);
+ getIndexingJob().removeJobChangeListener(this);
}
});
- indexingJob.schedule();
+ getIndexingJob().schedule();
}
@@ -506,7 +483,7 @@
*
* @param files
*/
- public final void indexFiles(IFile[] files) {
+ final void indexFiles(IFile[] files) {
// don't use this rule
// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=4931
// processFiles.setRule(new IndexFileRule());
@@ -529,7 +506,7 @@
// https://w3.opensource.ibm.com/bugzilla/show_bug.cgi?id=5091
// makes sure IndexManager is aware of our indexes
- public void saveIndexes() {
+ void saveIndexes() {
IndexManager indexManager = JavaModelManager.getJavaModelManager().getIndexManager();
IPath jspModelWorkingLocation = JSPSearchSupport.getInstance().getModelJspPluginWorkingLocation();
@@ -580,6 +557,18 @@
public void shutdown() {
+
+ // stop listening
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(jspResourceChangeListener);
+
+
+ // stop any searching
+ JSPSearchSupport.getInstance().setCanceled(true);
+
+ // stop listening to jobs
+ Platform.getJobManager().removeJobChangeListener(indexJobCoordinator);
+
+
int maxwait = 5000;
if (processFilesJob != null) {
processFilesJob.cancel();
@@ -609,4 +598,138 @@
}
}
}
+
+ private class IndexJobCoordinator implements IJobChangeListener {
+
+ public void aboutToRun(IJobChangeEvent event) {
+ // do nothing
+ }
+
+ public void awake(IJobChangeEvent event) {
+ // do nothing
+ }
+
+ public void done(IJobChangeEvent event) {
+
+ Job jobToCoordinate = event.getJob();
+ if (isJobToAvoid(jobToCoordinate)) {
+ if (getProcessFilesJob().getFiles().length > 0)
+ getProcessFilesJob().schedule(500);
+
+ }
+ }
+
+ private boolean isJobToAvoid(Job jobToCoordinate) {
+ boolean result = false;
+ if (jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_AUTO_BUILD) || jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_MANUAL_BUILD) || jobToCoordinate.belongsTo(ResourcesPlugin.FAMILY_AUTO_REFRESH)) {
+ result = true;
+ }
+ return result;
+
+ }
+
+ public void running(IJobChangeEvent event) {
+ // do nothing
+
+ }
+
+ public void scheduled(IJobChangeEvent event) {
+ // do nothing
+ }
+
+ public void sleeping(IJobChangeEvent event) {
+ // do nothing
+ }
+
+ }
+
+ private class JSPResourceChangeListener implements IResourceChangeListener {
+
+
+ /**
+ * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
+ */
+ public void resourceChanged(IResourceChangeEvent event) {
+
+ if (isInitializing())
+ return;
+
+ // ignore resource changes if already rebuilding
+ if (getIndexState() == S_REBUILDING)
+ return;
+ // previously canceled, needs entire index rebuild
+ if (getIndexState() == S_CANCELED) {
+ rebuildIndex();
+ return;
+ }
+
+ // set flag, so we know if a job is going to be started
+ // and the state will eventually be set back to S_STABLE
+ boolean beganProcess = false;
+ setUpdatingState();
+
+ IResourceDelta delta = event.getDelta();
+ if (delta != null) {
+ // only care about adds or changes right now...
+ int kind = delta.getKind();
+ boolean added = (kind & IResourceDelta.ADDED) == IResourceDelta.ADDED;
+ boolean changed = (kind & IResourceDelta.CHANGED) == IResourceDelta.CHANGED;
+ if (added || changed) {
+
+ // only analyze the full (starting at root) delta
+ // hierarchy
+ if (delta.getFullPath().toString().equals("/")) { //$NON-NLS-1$
+ try {
+ JSPResourceVisitor v = getVisitor();
+ // clear from last run
+ v.reset();
+ // count files, possibly do this in a job too...
+ // don't include PHANTOM resources
+ delta.accept(v, false);
+
+ // process files from this delta
+ IFile[] files = v.getFiles();
+ if (files.length > 0) {
+ // processFiles(files);
+ indexFiles(files);
+ beganProcess = true;
+ }
+ }
+ catch (CoreException e) {
+ // need to set state here somehow, and reindex
+ // otherwise index will be unreliable
+ if (DEBUG)
+ Logger.logException(e);
+ }
+ catch (Exception e) {
+ // need to set state here somehow, and reindex
+ // otherwise index will be unreliable
+ if (DEBUG)
+ Logger.logException(e);
+ }
+ }
+ }
+
+ }
+ // if we never kicked off process, job won't set back to stable
+ // so we set it here
+ if (!beganProcess) {
+ setStableState();
+ }
+ }
+
+ }
+
+ IndexWorkspaceJob getIndexingJob() {
+ return indexingJob;
+ }
+
+ ProcessFilesJob getProcessFilesJob() {
+ return processFilesJob;
+ }
+
+ boolean isInitializing() {
+ return initializing;
+ }
+
}
\ No newline at end of file