blob: 3b3cc956a0604cca91a142be2e919e26f50681ac [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Google, Inc 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
*
* Contributors:
* Stefan Xenos (Google) - Initial implementation
*******************************************************************************/
package org.eclipse.jdt.internal.core.nd.indexer;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.internal.core.nd.Nd;
/**
* Holds a cache that maps filenames (absolute paths on the local filesystem) to "up to date" states.
* A file is "up to date" if its content is known to be in sync with the index. A file
* is not up to date if there is any possibility that its content might be out of sync with the
* index.
*/
public class FileStateCache {
private final Map<String, Boolean> fileStateCache = new HashMap<>();
/**
* Returns true if the file at the given path is in sync with the index. Returns false if the file has already
* been tested and might be out-of-sync. Returns null if its status is unknown and needs to be tested.
*
* @param location an absolute path on the filesystem
*/
public Boolean isUpToDate(String location) {
synchronized (this.fileStateCache) {
return this.fileStateCache.get(location);
}
}
/**
* Returns the cache for the given {@link Nd} instance.
*
* @return the cache for the given {@link Nd}. Creates one if it doesn't exist yet.
*/
public static FileStateCache getCache(Nd nd) {
return nd.getData(FileStateCache.class, FileStateCache::create);
}
/**
* Creates a new instance of {@link FileStateCache}.
*/
private static FileStateCache create() {
return new FileStateCache();
}
/**
* Inserts a new entry into the cache.
*
* @param location absolute filesystem path to the file
* @param result true if the file is definitely in sync with the index, false if there is any possibility of it
* being out of sync.
*/
public void put(String location, boolean result) {
synchronized (this.fileStateCache) {
this.fileStateCache.put(location, result);
}
}
/**
* Clears the entire cache.
*/
public void clear() {
synchronized (this.fileStateCache) {
this.fileStateCache.clear();
}
}
/**
* Removes a single entry from the cache.
*
* @param location absolute filesystem path to the file.
*/
public void remove(String location) {
synchronized (this.fileStateCache) {
this.fileStateCache.remove(location);
}
}
}