private File dir;
private long tooOldChanging;
private long tooOldStable;
+ private TraceHandler tracer = new TraceHandler();
+
+ /**
+ * Only for inheritance.
+ */
+ protected Cache() {
+ }
/**
* Create a new {@link Cache} object.
public Cache(File dir, int hoursChanging, int hoursStable)
throws IOException {
this.dir = dir;
- this.tooOldChanging = 1000 * 60 * 60 * hoursChanging;
- this.tooOldStable = 1000 * 60 * 60 * hoursStable;
+ this.tooOldChanging = 1000L * 60 * 60 * hoursChanging;
+ this.tooOldStable = 1000L * 60 * 60 * hoursStable;
if (dir != null && !dir.exists()) {
dir.mkdirs();
}
}
+ /**
+ * The traces handler for this {@link Cache}.
+ *
+ * @return the traces handler
+ */
+ public TraceHandler getTraceHandler() {
+ return tracer;
+ }
+
+ /**
+ * The traces handler for this {@link Cache}.
+ *
+ * @param tracer
+ * the new traces handler
+ */
+ public void setTraceHandler(TraceHandler tracer) {
+ if (tracer == null) {
+ tracer = new TraceHandler(false, false, false);
+ }
+
+ this.tracer = tracer;
+ }
+
+ /**
+ * Check the resource to see if it is in the cache.
+ *
+ * @param uniqueID
+ * the resource to check
+ * @param allowTooOld
+ * allow files even if they are considered too old
+ * @param stable
+ * a stable file (that dones't change too often) -- parameter
+ * used to check if the file is too old to keep or not
+ *
+ * @return TRUE if it is
+ *
+ */
+ public boolean check(String uniqueID, boolean allowTooOld, boolean stable) {
+ return check(getCached(uniqueID), allowTooOld, stable);
+ }
+
/**
* Check the resource to see if it is in the cache.
*
*
*/
public boolean check(URL url, boolean allowTooOld, boolean stable) {
- File file = getCached(url);
- if (file.exists()) {
- if (allowTooOld || !isOld(file, stable)) {
+ return check(getCached(url), allowTooOld, stable);
+ }
+
+ /**
+ * Check the resource to see if it is in the cache.
+ *
+ * @param cached
+ * the resource to check
+ * @param allowTooOld
+ * allow files even if they are considered too old
+ * @param stable
+ * a stable file (that dones't change too often) -- parameter
+ * used to check if the file is too old to keep or not
+ *
+ * @return TRUE if it is
+ *
+ */
+ private boolean check(File cached, boolean allowTooOld, boolean stable) {
+ if (cached.exists() && cached.isFile()) {
+ if (!allowTooOld && isOld(cached, stable)) {
+ if (!cached.delete()) {
+ tracer.error("Cannot delete temporary file: "
+ + cached.getAbsolutePath());
+ }
+ } else {
return true;
}
}
return clean(onlyOld, dir);
}
- /**
- * Trace information (info/error) generated by this class.
- * <p>
- * You can override it if you don't want the default sysout/syserr.
- *
- * @param message
- * the message
- * @param error
- * TRUE for error messages, FALSE for information messages
- */
- protected void trace(String message, boolean error) {
- if (error) {
- System.err.println(message);
- } else {
- System.out.println(message);
- }
- }
-
/**
* Clean the cache (delete the cached items) in the given cache directory.
*
*/
private int clean(boolean onlyOld, File cacheDir) {
int num = 0;
- for (File file : cacheDir.listFiles()) {
- if (file.isDirectory()) {
- num += clean(onlyOld, file);
- } else {
- if (!onlyOld || isOld(file, true)) {
- if (file.delete()) {
- num++;
- } else {
- trace("Cannot delete temporary file: "
- + file.getAbsolutePath(), true);
+ File[] files = cacheDir.listFiles();
+ if (files != null) {
+ for (File file : files) {
+ if (file.isDirectory()) {
+ num += clean(onlyOld, file);
+ } else {
+ if (!onlyOld || isOld(file, true)) {
+ if (file.delete()) {
+ num++;
+ } else {
+ tracer.error("Cannot delete temporary file: "
+ + file.getAbsolutePath());
+ }
}
}
}
* used to check if the file is too old to keep or not
*
* @return the opened resource if found, NULL if not
- *
- * @throws IOException
- * in case of I/O error
*/
public InputStream load(String uniqueID, boolean allowTooOld, boolean stable) {
return load(getCached(uniqueID), allowTooOld, stable);
* used to check if the file is too old to keep or not
*
* @return the opened resource if found, NULL if not
- *
- * @throws IOException
- * in case of I/O error
*/
- public InputStream load(URL url, boolean allowTooOld, boolean stable)
- throws IOException {
+ public InputStream load(URL url, boolean allowTooOld, boolean stable) {
return load(getCached(url), allowTooOld, stable);
}
/**
* Open a resource from the cache if it exists.
*
- * @param url
+ * @param cached
* the resource to open
* @param allowTooOld
* allow files even if they are considered too old
* used to check if the file is too old to keep or not
*
* @return the opened resource if found, NULL if not
- *
- * @throws IOException
- * in case of I/O error
*/
private InputStream load(File cached, boolean allowTooOld, boolean stable) {
- if (cached.exists() && (allowTooOld || !isOld(cached, stable))) {
+ if (cached.exists() && cached.isFile()
+ && (allowTooOld || !isOld(cached, stable))) {
try {
return new MarkableFileInputStream(new FileInputStream(cached));
} catch (FileNotFoundException e) {
* @param uniqueID
* a unique ID used to locate the cached resource
*
- * @return the resulting {@link File}
- *
* @throws IOException
* in case of I/O error
*/
- public File save(InputStream in, String uniqueID) throws IOException {
+ public void save(InputStream in, String uniqueID) throws IOException {
File cached = getCached(uniqueID);
cached.getParentFile().mkdirs();
- return save(in, cached);
+ save(in, cached);
}
/**
* @throws IOException
* in case of I/O error
*/
- public File save(InputStream in, URL url) throws IOException {
+ public void save(InputStream in, URL url) throws IOException {
File cached = getCached(url);
- return save(in, cached);
+ save(in, cached);
}
/**
* @throws IOException
* in case of I/O error
*/
- private File save(InputStream in, File cached) throws IOException {
+ private void save(InputStream in, File cached) throws IOException {
IOUtils.write(in, cached);
- return cached;
+ }
+
+ /**
+ * Remove the given resource from the cache.
+ *
+ * @param uniqueID
+ * a unique ID used to locate the cached resource
+ *
+ * @return TRUE if it was removed
+ */
+ public boolean remove(String uniqueID) {
+ File cached = getCached(uniqueID);
+ return cached.delete();
+ }
+
+ /**
+ * Remove the given resource from the cache.
+ *
+ * @param url
+ * the {@link URL} used to locate the cached resource
+ *
+ * @return TRUE if it was removed
+ */
+ public boolean remove(URL url) {
+ File cached = getCached(url);
+ return cached.delete();
}
/**
long time = new Date().getTime() - file.lastModified();
if (time < 0) {
- trace("Timestamp in the future for file: " + file.getAbsolutePath(),
- true);
+ tracer.error("Timestamp in the future for file: "
+ + file.getAbsolutePath());
}
return time < 0 || time > max;
if (name == null || name.isEmpty()) {
// File
File file = new File(url.getFile());
- subdir = new File(file.getParent().replace("..", "__"));
+ if (file.getParent() == null) {
+ subdir = new File("+");
+ } else {
+ subdir = new File(file.getParent().replace("..", "__"));
+ }
subdir = new File(dir, allowedChars(subdir.getPath()));
name = allowedChars(url.getFile());
} else {