use of org.eclipse.jdt.internal.core.index.Index in project che by eclipse.
the class IndexManager method jobWasCancelled.
public synchronized void jobWasCancelled(IPath containerPath) {
IndexLocation indexLocation = computeIndexLocation(containerPath);
Index index = getIndex(indexLocation);
if (index != null) {
index.monitor = null;
this.indexes.removeKey(indexLocation);
}
updateIndexState(indexLocation, UNKNOWN_STATE);
}
use of org.eclipse.jdt.internal.core.index.Index in project che by eclipse.
the class IndexManager method getIndex.
/**
* Returns the index for a given project, according to the following algorithm:
* - if index is already in memory: answers this one back
* - if (reuseExistingFile) then read it and return this index and record it in memory
* - if (createIfMissing) then create a new empty index and record it in memory
* <p/>
* Warning: Does not check whether index is consistent (not being used)
*/
public synchronized Index getIndex(IPath containerPath, IndexLocation indexLocation, boolean reuseExistingFile, boolean createIfMissing) {
// Path is already canonical per construction
Index index = getIndex(indexLocation);
if (index == null) {
Object state = getIndexStates().get(indexLocation);
Integer currentIndexState = state == null ? UNKNOWN_STATE : (Integer) state;
if (currentIndexState == UNKNOWN_STATE) {
// should only be reachable for query jobs
// IF you put an index in the cache, then AddJarFileToIndex fails because it thinks there is nothing to do
rebuildIndex(indexLocation, containerPath);
return null;
}
// index isn't cached, consider reusing an existing index file
String containerPathString = containerPath.getDevice() == null ? containerPath.toString() : containerPath.toOSString();
if (reuseExistingFile) {
if (indexLocation.exists()) {
// check before creating index so as to avoid creating a new empty index if file is missing
try {
index = new Index(indexLocation, containerPathString, true);
this.indexes.put(indexLocation, index);
return index;
} catch (IOException e) {
// failed to read the existing file or its no longer compatible
if (currentIndexState != REBUILDING_STATE && currentIndexState != REUSE_STATE) {
// corrupt, unless the index is already being rebuilt
if (JobManager.VERBOSE)
Util.verbose("-> cannot reuse existing index: " + indexLocation + " path: " + //$NON-NLS-1$ //$NON-NLS-2$
containerPathString);
rebuildIndex(indexLocation, containerPath);
return null;
}
/*index = null;*/
// will fall thru to createIfMissing & create a empty index for the rebuild all job to populate
}
}
if (currentIndexState == SAVED_STATE) {
// rebuild index if existing file is missing
rebuildIndex(indexLocation, containerPath);
return null;
}
if (currentIndexState == REUSE_STATE) {
// supposed to be in reuse state but error in the index file, so reindex.
if (JobManager.VERBOSE)
Util.verbose("-> cannot reuse given index: " + indexLocation + " path: " + //$NON-NLS-1$ //$NON-NLS-2$
containerPathString);
this.indexLocations.put(containerPath, null);
indexLocation = computeIndexLocation(containerPath);
rebuildIndex(indexLocation, containerPath);
return null;
}
}
// index wasn't found on disk, consider creating an empty new one
if (createIfMissing) {
try {
if (JobManager.VERBOSE)
Util.verbose(//$NON-NLS-1$ //$NON-NLS-2$
"-> create empty index: " + indexLocation + " path: " + containerPathString);
index = new Index(indexLocation, containerPathString, false);
this.indexes.put(indexLocation, index);
return index;
} catch (IOException e) {
if (JobManager.VERBOSE)
Util.verbose("-> unable to create empty index: " + indexLocation + " path: " + //$NON-NLS-1$ //$NON-NLS-2$
containerPathString);
// The file could not be created. Possible reason: the project has been deleted.
return null;
}
}
}
//System.out.println(" index name: " + path.toOSString() + " <----> " + index.getIndexFile().getName());
return index;
}
use of org.eclipse.jdt.internal.core.index.Index in project che by eclipse.
the class IndexManager method removeIndex.
/**
* Removes the index for a given path.
* This is a no-op if the index did not exist.
*/
public synchronized void removeIndex(IPath containerPath) {
if (JobManager.VERBOSE || DEBUG)
//$NON-NLS-1$
Util.verbose("removing index " + containerPath);
IndexLocation indexLocation = computeIndexLocation(containerPath);
Index index = getIndex(indexLocation);
File indexFile = null;
if (index != null) {
index.monitor = null;
indexFile = index.getIndexFile();
}
if (indexFile == null)
// index is not cached yet, but still want to delete the file
indexFile = indexLocation.getIndexFile();
if (this.indexStates.get(indexLocation) == REUSE_STATE) {
indexLocation.close();
this.indexLocations.put(containerPath, null);
} else if (indexFile != null && indexFile.exists()) {
if (DEBUG)
//$NON-NLS-1$
Util.verbose("removing index file " + indexFile);
indexFile.delete();
}
this.indexes.removeKey(indexLocation);
if (IS_MANAGING_PRODUCT_INDEXES_PROPERTY) {
this.indexLocations.removeKey(containerPath);
}
updateIndexState(indexLocation, null);
}
use of org.eclipse.jdt.internal.core.index.Index in project che by eclipse.
the class IndexManager method getIndexes.
/**
* Returns all the existing indexes for a list of index locations.
* Note that this may trigger some indexes recreation work
*
* @param locations
* The list of of the index files path
* @return The corresponding indexes list.
*/
public Index[] getIndexes(IndexLocation[] locations, IProgressMonitor progressMonitor) {
// acquire the in-memory indexes on the fly
int length = locations.length;
Index[] locatedIndexes = new Index[length];
int count = 0;
if (this.javaLikeNamesChanged) {
this.javaLikeNamesChanged = hasJavaLikeNamesChanged();
}
for (int i = 0; i < length; i++) {
if (progressMonitor != null && progressMonitor.isCanceled()) {
throw new OperationCanceledException();
}
// may trigger some index recreation work
IndexLocation indexLocation = locations[i];
Index index = getIndex(indexLocation);
if (index == null) {
// only need containerPath if the index must be built
IPath containerPath = (IPath) this.indexLocations.keyForValue(indexLocation);
if (containerPath != null) {
// sanity check
index = getIndex(containerPath, indexLocation, true, /*reuse index file*/
false);
if (index != null && this.javaLikeNamesChanged && !index.isIndexForJar()) {
// When a change in java like names extension has been detected, all
// non jar files indexes (i.e. containing sources) need to be rebuilt.
// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=286379
File indexFile = index.getIndexFile();
if (indexFile.exists()) {
if (DEBUG)
//$NON-NLS-1$
Util.verbose("Change in javaLikeNames - removing index file for " + containerPath);
indexFile.delete();
}
this.indexes.put(indexLocation, null);
rebuildIndex(indexLocation, containerPath);
index = null;
}
} else {
if (indexLocation.isParticipantIndex() && indexLocation.exists()) {
// the index belongs to non-jdt search participant
try {
IPath container = getParticipantsContainer(indexLocation);
if (container != null) {
index = new Index(indexLocation, container.toOSString(), true);
this.indexes.put(indexLocation, index);
}
} catch (IOException e) {
// ignore
}
}
}
}
if (index != null)
// only consider indexes which are ready
locatedIndexes[count++] = index;
}
if (this.javaLikeNamesChanged) {
writeJavaLikeNamesFile();
this.javaLikeNamesChanged = false;
}
if (count < length) {
System.arraycopy(locatedIndexes, 0, locatedIndexes = new Index[count], 0, count);
}
return locatedIndexes;
}
use of org.eclipse.jdt.internal.core.index.Index in project che by eclipse.
the class IndexManager method addIndex.
synchronized boolean addIndex(IPath containerPath, IndexLocation indexFile) {
getIndexStates().put(indexFile, REUSE_STATE);
this.indexLocations.put(containerPath, indexFile);
Index index = getIndex(containerPath, indexFile, true, false);
if (index == null) {
indexFile.close();
this.indexLocations.put(containerPath, null);
return false;
}
writeIndexMapFile();
return true;
}
Aggregations