blob: 3fef1c35c179c281017fa163be579585079ff19c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* 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
*
*******************************************************************************/
package org.eclipse.dltk.core.search.indexing;
import java.io.IOException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.compiler.util.SimpleLookupTable;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IBuiltinModuleProvider;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IDLTKProject;
import org.eclipse.dltk.core.ISourceElementParser;
import org.eclipse.dltk.core.search.SearchEngine;
import org.eclipse.dltk.core.search.SearchParticipant;
import org.eclipse.dltk.core.search.index.Index;
import org.eclipse.dltk.internal.core.BuiltinProjectFragment;
import org.eclipse.dltk.internal.core.search.DLTKSearchDocument;
import org.eclipse.dltk.internal.core.search.processing.JobManager;
class AddBuiltinFolderToIndex extends IndexRequest {
IProject project;
IDLTKProject scriptProject;
public AddBuiltinFolderToIndex(IPath folderPath, IProject project,
IndexManager manager) {
super(folderPath, manager);
this.project = project;
scriptProject = DLTKCore.create(this.project);
}
public int hashCode() {
// if (this.containerPath != null)
// return this.containerPath.hashCode();
try {
IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
.getLanguageToolkit(scriptProject);
return languageToolkit.getNatureID().hashCode();
} catch (CoreException e) {
return -1;
}
}
public boolean equals(Object o) {
if (o instanceof AddBuiltinFolderToIndex) {
try {
IDLTKLanguageToolkit languageToolkit = DLTKLanguageManager
.getLanguageToolkit(scriptProject);
IDLTKLanguageToolkit languageToolki2 = DLTKLanguageManager
.getLanguageToolkit(((AddBuiltinFolderToIndex) o).scriptProject);
if (languageToolkit.getNatureID().equals(
languageToolki2.getNatureID())) {
return true;
}
} catch (CoreException e) {
return false;
}
// if (this.containerPath != null)
// return this.containerPath.equals(((AddBuiltinFolderToIndex)
// o).containerPath);
}
return false;
}
// private static String EXISTS = "OK"; //$NON-NLS-1$
// private static String DELETED = "DELETED"; //$NON-NLS-1$
public boolean execute(IProgressMonitor progressMonitor) {
if (this.isCancelled || progressMonitor != null
&& progressMonitor.isCanceled())
return true;
if (!project.isAccessible())
return true; // nothing to do
/* ensure no concurrent write access to index */
// IPath fullPath = project.getProject().getFullPath();
String cfp = containerPath.toString();
if( cfp.startsWith(IBuildpathEntry.BUILTIN_EXTERNAL_ENTRY_STR)) {
cfp = cfp.substring(IBuildpathEntry.BUILTIN_EXTERNAL_ENTRY_STR.length());
}
Index index = this.manager.getSpecialIndex("builtin", cfp, containerPath.toOSString() );
if (index == null) {
if (JobManager.VERBOSE)
org.eclipse.dltk.internal.core.util.Util
.verbose("-> index could not be created for " + this.containerPath); //$NON-NLS-1$
return true;
}
ReadWriteMonitor monitor = index.monitor;
if (monitor == null) {
if (JobManager.VERBOSE)
org.eclipse.dltk.internal.core.util.Util
.verbose("-> index for " + this.containerPath + " just got deleted"); //$NON-NLS-1$//$NON-NLS-2$
return true; // index got deleted since acquired
}
try {
monitor.enterRead(); // ask permission to read
final IPath container = this.containerPath;
final IndexManager indexManager = this.manager;
final ISourceElementParser parser = indexManager
.getSourceElementParser(scriptProject, null/*
* requestor will be
* set by indexer
*/);
final SourceIndexerRequestor requestor = indexManager
.getSourceRequestor(scriptProject);
if (JobManager.VERBOSE)
org.eclipse.dltk.internal.core.util.Util
.verbose("-> indexing " + containerPath.toOSString()); //$NON-NLS-1$
long initialTime = System.currentTimeMillis();
SearchParticipant participant = SearchEngine
.getDefaultSearchParticipant();
visit(null, scriptProject, parser, requestor, indexManager, container,
true, participant, index);
this.manager.saveIndex(index);
if (JobManager.VERBOSE)
org.eclipse.dltk.internal.core.util.Util
.verbose("-> done indexing of " //$NON-NLS-1$
+ containerPath.toOSString()
+ " (" //$NON-NLS-1$
+ (System.currentTimeMillis() - initialTime)
+ "ms)"); //$NON-NLS-1$
} catch (IOException ex) {
if (JobManager.VERBOSE) {
org.eclipse.dltk.internal.core.util.Util
.verbose("-> failed to index " + this.containerPath + " because of the following exception:"); //$NON-NLS-1$ //$NON-NLS-2$
ex.printStackTrace();
}
// manager.removeIndex(this.containerPath);
return false;
} finally {
monitor.exitRead(); // free read lock
}
return true;
}
private void visit(SimpleLookupTable table, IDLTKProject project, ISourceElementParser parser, SourceIndexerRequestor requestor, IndexManager indexManager,
IPath container, boolean operation, SearchParticipant participant, Index index) {
IDLTKLanguageToolkit toolkit = null;
try {
toolkit = DLTKLanguageManager.getLanguageToolkit(project);
} catch (CoreException e) {
if( DLTKCore.DEBUG ) {
e.printStackTrace();
}
}
IBuiltinModuleProvider provider = BuiltinProjectFragment.getBuiltinProvider(project);
if( provider == null ) {
return;
}
String[] files = provider.getBuiltinModules();
if (files != null) {
for (int i = 0; i < files.length; ++i) {
if (this.isCancelled) {
if (JobManager.VERBOSE)
org.eclipse.dltk.internal.core.util.Util.verbose("-> indexing of " + containerPath.toOSString() + " has been cancelled"); //$NON-NLS-1$ //$NON-NLS-2$
return;
}
indexDocument(parser, requestor, participant, index, files[i], toolkit, provider.getBuiltinModuleContent(files[i]) );
}
}
}
private void indexDocument(ISourceElementParser parser,
SourceIndexerRequestor requestor, SearchParticipant participant,
Index index, String path, IDLTKLanguageToolkit toolkit, String contents ) {
IPath dpath = (new Path(path));/*.removeFirstSegments(this.containerPath
.segmentCount());*/
dpath = dpath.setDevice(null);
DLTKSearchDocument entryDocument = new DLTKSearchDocument(dpath
.toOSString(), new Path( "" ), contents.toCharArray(), participant, true);
entryDocument.parser = parser;
entryDocument.requestor = requestor;
entryDocument.toolkit = toolkit;
this.manager.indexDocument(entryDocument, participant, index,
this.containerPath);
}
public String toString() {
return "adding " + this.containerPath + " to index " + this.containerPath; //$NON-NLS-1$ //$NON-NLS-2$
}
}