package com.revolsys.net.urlcache;
import java.io.File;
import java.io.IOException;
import java.net.CacheRequest;
import java.net.CacheResponse;
import java.net.ResponseCache;
import java.net.URI;
import java.net.URLConnection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.zip.CRC32;
import com.revolsys.io.BaseCloseable;
import com.revolsys.io.FileUtil;
import com.revolsys.value.ThreadBooleanValue;
public class FileResponseCache extends ResponseCache {
private static final ThreadBooleanValue enabled = new ThreadBooleanValue(true);
public static BaseCloseable disable() {
return enabled.closeable(false);
}
private final File directory;
public FileResponseCache() {
this(System.getProperty("java.io.tmpdir"));
}
public FileResponseCache(final File directory) {
if (!directory.exists()) {
directory.mkdirs();
}
this.directory = directory;
}
public FileResponseCache(final String directory) {
this(new File(directory));
}
@Override
public CacheResponse get(final URI uri, final String method,
final Map<String, List<String>> headers) throws IOException {
if (enabled.isTrue()) {
if (headers.isEmpty() && method.equals("GET")) {
final File file = toFile(uri);
if (file != null && file.exists()) {
return new FileCacheResponse(file, headers);
}
}
}
return null;
}
@SuppressWarnings("deprecation")
@Override
public CacheRequest put(final URI uri, final URLConnection connection) throws IOException {
if (enabled.isTrue()) {
final File file = toFile(uri);
if (file != null) {
long lastModified = 0;
String dateString = connection.getHeaderField("last-modified");
if (dateString != null) {
try {
if (dateString.indexOf("GMT") == -1) {
dateString = dateString + " GMT";
}
lastModified = Date.parse(dateString);
file.setLastModified(lastModified);
} catch (final Exception e) {
}
}
return new FileCacheRequest(file);
}
}
return null;
}
private File toFile(final URI uri) {
final String scheme = uri.getScheme();
if (scheme.equals("http") || scheme.equals("https")) {
File file = new File(this.directory, scheme);
final String host = uri.getHost();
file = new File(file, host);
final int port = uri.getPort();
if (port != -1) {
file = new File(file, String.valueOf(port));
}
String extension = null;
String fileName = null;
final String path = uri.getPath();
if (path != null) {
file = new File(file, path);
if (!path.endsWith("/")) {
extension = FileUtil.getFileNameExtension(file);
if (extension.length() > 0) {
fileName = FileUtil.getFileNamePrefix(file);
} else {
fileName = FileUtil.getFileName(file);
}
file = file.getParentFile();
}
}
if (fileName == null) {
final CRC32 crc32 = new CRC32();
crc32.update(uri.toString().getBytes());
fileName = String.valueOf(crc32.getValue());
}
final String query = uri.getQuery();
if (query != null) {
final CRC32 crc32 = new CRC32();
crc32.update(query.getBytes());
fileName += "-q" + crc32.getValue();
}
if (extension.length() > 0) {
fileName = fileName + "." + extension;
}
return new File(file, fileName);
}
return null;
}
}