Update of /var/cvs/src/org/mmbase/framework
In directory james.mmbase.org:/tmp/cvs-serv8962
Modified Files:
CachedRenderer.java
Log Message:
Added support for ETag's, while viewcvs uses that
See also: http://cvs.mmbase.org/viewcvs/src/org/mmbase/framework
Index: CachedRenderer.java
===================================================================
RCS file: /var/cvs/src/org/mmbase/framework/CachedRenderer.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- CachedRenderer.java 13 Jan 2009 20:28:07 -0000 1.5
+++ CachedRenderer.java 13 Jan 2009 20:59:58 -0000 1.6
@@ -51,7 +51,7 @@
]]></pre>
*
* @author Michiel Meeuwissen
- * @version $Id: CachedRenderer.java,v 1.5 2009/01/13 20:28:07 michiel Exp $
+ * @version $Id: CachedRenderer.java,v 1.6 2009/01/13 20:59:58 michiel Exp $
* @since MMBase-1.9.1
*/
@@ -114,16 +114,39 @@
return k.toString();
}
+ private static final String CACHE_EXTENSION = ".cache";
+ private static final String ETAG_EXTENSION = ".etag";
+
protected File getCacheFile(Parameters blockParameters, RenderHints hints)
{
File dir = new File(MMBase.getMMBase().getDataDir(), directory);
File componentDir = new File(dir, getBlock().getComponent().getName());
File blockDir = new File(componentDir, getBlock().getName());
blockDir.mkdirs();
- String key = getBlock().getName() + "_" + getKey(blockParameters) +
"_" + hints.getWindowState() + "_" + hints.getId() + "_" +
hints.getStyleClass() + ".cache";
+ String key = getBlock().getName() + "_" + getKey(blockParameters) +
"_" + hints.getWindowState() + "_" + hints.getId() + "_" +
hints.getStyleClass() + CACHE_EXTENSION;
return new File(blockDir, key);
}
+ protected File getETagFile(File file) {
+ String name = file.getName();
+ File dir = file.getParentFile();
+ String tagName = name.substring(0, name.length() -
CACHE_EXTENSION.length());
+ return new File(dir, tagName + ETAG_EXTENSION);
+ }
+
+ protected void writeETag(File f, String etag) throws IOException {
+ Writer fw = new OutputStreamWriter(new FileOutputStream(f), "UTF-8");
+ fw.write(etag);
+ fw.close();
+ }
+
+ protected String readETag(File f) throws IOException {
+ BufferedReader fr = new BufferedReader(new InputStreamReader(new
FileInputStream(f), "UTF-8"));
+ String t = fr.readLine();
+ fr.close();
+ return t;
+ }
+
protected void renderFile(File f , Writer w) throws FrameworkException,
IOException {
writeRenderTime(new Date(f.lastModified()), w);
BufferedReader reader = new BufferedReader(new InputStreamReader(new
FileInputStream(f), "UTF-8"));
@@ -156,11 +179,21 @@
renderFile(cacheFile, w);
}
} else {
- // user last modified
+ // use last modified or etag.
URI uri = getWraps().getUri(blockParameters, hints);
if (uri == null) throw new FrameworkException("" + getWraps()
+ " did not return an URI, and cannot be cached using getLastModified");
URLConnection connection = uri.toURL().openConnection();
connection.setConnectTimeout(timeout);
+ String etag = connection.getHeaderField("ETag");
+ if (etag != null) {
+ File etagFile = getETagFile(cacheFile);
+ if ( ! cacheFile.exists() || ! etagFile.exists() || !
etag.equals(readETag(etagFile))) {
+ renderWrappedAndFile(cacheFile, blockParameters, w,
hints);
+ writeETag(etagFile, etag);
+ } else {
+ renderFile(cacheFile, w);
+ }
+ } else {
long modified = connection.getLastModified();
if (! cacheFile.exists() || (cacheFile.lastModified() <
modified)) {
log.service("Rendering " + uri + " because " + cacheFile +
" older than " + new Date(modified));
@@ -169,6 +202,7 @@
renderFile(cacheFile, w);
}
}
+ }
} catch (MalformedURLException mfe) {
throw new FrameworkException(mfe);
} catch (IOException mfe) {
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs