Author: nbelaevski
Date: 2009-07-07 19:21:53 -0400 (Tue, 07 Jul 2009)
New Revision: 14820
Added:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/CachedResourceImpl.java
Modified:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceImpl.java
Log:
Reintegrated community/3.3.x into JSF 2.0 branch
Added:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/CachedResourceImpl.java
===================================================================
---
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/CachedResourceImpl.java
(rev 0)
+++
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/CachedResourceImpl.java 2009-07-07
23:21:53 UTC (rev 14820)
@@ -0,0 +1,124 @@
+/**
+ *
+ */
+package org.richfaces.resource;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.faces.application.Resource;
+import javax.faces.context.FacesContext;
+
+import org.richfaces.util.Util;
+
+/**
+ * @author Nick Belaevski
+ * @since 4.0
+ */
+public class CachedResourceImpl extends ResourceImpl {
+
+ private Map<String, String> headers;
+
+ private byte[] content;
+
+ private String entityTag;
+
+ private Date lastModified;
+
+ private void initializeFromHeaders() {
+ this.entityTag = null;
+ this.lastModified = null;
+
+ for (Entry<String, String> headerEntry: headers.entrySet()) {
+ String headerKey = headerEntry.getKey().toLowerCase(Locale.US);
+ if ("etag".equals(headerKey)) {
+ this.entityTag = headerEntry.getValue();
+ } else if ("last-modified".equals(headerKey)) {
+ this.lastModified = Util.parseHttpDate(headerEntry.getValue());
+ }
+ }
+
+ }
+
+ private byte[] readContent(InputStream is) throws IOException {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ try {
+ Util.copyStreamContent(is, os);
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ os.close();
+ }
+
+ return os.toByteArray();
+ }
+
+ public void initialize(Resource resource) {
+ setResourceName(resource.getResourceName());
+ this.headers = resource.getResponseHeaders();
+
+ initializeFromHeaders();
+ try {
+ this.content = readContent(resource.getInputStream());
+ } catch (IOException e) {
+ e.printStackTrace();
+ // TODO: handle exception
+ }
+ }
+
+ @Override
+ public InputStream getInputStream() {
+ return new ByteArrayInputStream(content);
+ }
+
+ @Override
+ public String getRequestPath() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public Map<String, String> getResponseHeaders() {
+ return new HashMap<String, String>(headers);
+ }
+
+ @Override
+ public URL getURL() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public String getContentType(FacesContext context) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isCacheable(FacesContext context) {
+ return true;
+ }
+
+ @Override
+ protected String getEntityTag(FacesContext context) {
+ return entityTag;
+ }
+
+ @Override
+ protected Date getLastModified(FacesContext context) {
+ return lastModified;
+ }
+
+}
Modified:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceImpl.java
===================================================================
---
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceImpl.java 2009-07-07
19:35:55 UTC (rev 14819)
+++
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceImpl.java 2009-07-07
23:21:53 UTC (rev 14820)
@@ -127,7 +127,7 @@
*/
public abstract String getContentType(FacesContext context);
- public String getEntityTag(FacesContext context) {
+ protected String getEntityTag(FacesContext context) {
int contentLength = getContentLength(context);
Date lastModified = getLastModified(context);
@@ -280,24 +280,15 @@
private static final Pattern ETAG_PATTERN =
Pattern.compile("(?:W/)?\"([^\"]+)\"(?:,\\s*)?");
- private boolean userCopyIsStale(FacesContext context) {
- Date serverLastModified = getLastModified(context);
- if (serverLastModified == null) {
+ private boolean userCopyIsStale(Date lastModified, Date modifiedCondition) {
+ if (lastModified == null || modifiedCondition == null) {
return true;
}
- String headerValue =
context.getExternalContext().getRequestHeaderMap().get("If-Modified-Since");
- Date clientLastModified = Util.parseHttpDate(headerValue);
- if (clientLastModified == null) {
- return true;
- }
-
// 1000 ms due to round
// modification
// time to seconds.
- long serverLastModifiedTime = serverLastModified.getTime() - 1000;
-
- return serverLastModifiedTime > clientLastModified.getTime();
+ return (lastModified.getTime() - modifiedCondition.getTime()) > 1000;
}
@Override
@@ -309,21 +300,30 @@
ExternalContext externalContext = context.getExternalContext();
Map<String, String> requestHeaderMap = externalContext.getRequestHeaderMap();
- String ifNoneMatch = requestHeaderMap.get("If-None-Match");
- if (ifNoneMatch != null) {
- Matcher eTagMatcher = ETAG_PATTERN.matcher(ifNoneMatch);
+ String matchCondition = requestHeaderMap.get("If-None-Match");
+ String modifiedCondition = requestHeaderMap.get("If-Modified-Since");
+
+ String resourceEntityTag = getEntityTag(context);
+
+ if (matchCondition != null) {
+ Matcher eTagMatcher = ETAG_PATTERN.matcher(matchCondition);
while (eTagMatcher.find()) {
- String eTag = eTagMatcher.group(1);
+ String conditionEntityTag = eTagMatcher.group(1);
- if (eTag.equals(getEntityTag(context))) {
- return userCopyIsStale(context);
+ if (conditionEntityTag.equals(resourceEntityTag)) {
+ if (modifiedCondition == null) {
+ return false;
+ } else {
+ return userCopyIsStale(getLastModified(context),
+ Util.parseHttpDate(modifiedCondition));
+ }
}
}
return true;
}
- return userCopyIsStale(context);
+ return userCopyIsStale(getLastModified(context),
Util.parseHttpDate(modifiedCondition));
}
}
Show replies by date