Author: nbelaevski
Date: 2009-07-01 06:36:19 -0400 (Wed, 01 Jul 2009)
New Revision: 14756
Modified:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/util/Util.java
Log:
Resources: handler refactoring
Modified:
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java
===================================================================
---
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java 2009-07-01
10:34:51 UTC (rev 14755)
+++
branches/jsf2.0/framework/impl/src/main/java/org/richfaces/resource/ResourceHandlerImpl.java 2009-07-01
10:36:19 UTC (rev 14756)
@@ -24,6 +24,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
@@ -76,21 +77,21 @@
}
}
- public boolean isResourceRequest(FacesContext context) {
- if (defaultHandler.isResourceRequest(context)) {
- return true;
- } else {
- Boolean resourceRequest = BooleanRequestStateVariable.RESOURCE_REQUEST.get(context);
- if (resourceRequest == null) {
- String resourceName = getResourceKey(context);
- //TODO handle exclusions
- resourceRequest = resourceName != null ? Boolean.TRUE : Boolean.FALSE;
- BooleanRequestStateVariable.RESOURCE_REQUEST.set(context, resourceRequest);
- }
+ protected boolean isThisHandlerResourceRequest(FacesContext context) {
+ Boolean resourceRequest = BooleanRequestStateVariable.RESOURCE_REQUEST.get(context);
+ if (resourceRequest == null) {
+ String resourceName = getResourceKey(context);
+ //TODO handle exclusions
+ resourceRequest = resourceName != null ? Boolean.TRUE : Boolean.FALSE;
+ BooleanRequestStateVariable.RESOURCE_REQUEST.set(context, resourceRequest);
+ }
- return resourceRequest.booleanValue();
- }
+ return resourceRequest.booleanValue();
}
+
+ public boolean isResourceRequest(FacesContext context) {
+ return isThisHandlerResourceRequest(context) ||
defaultHandler.isResourceRequest(context);
+ }
private void sendNotModified(FacesContext context) {
context.getExternalContext().setResponseStatus(HttpServletResponse.SC_NOT_MODIFIED);
@@ -101,9 +102,7 @@
}
public void handleResourceRequest(FacesContext context) throws IOException {
- if (defaultHandler.isResourceRequest(context)) {
- defaultHandler.handleResourceRequest(context);
- } else {
+ if (isThisHandlerResourceRequest(context)) {
String resourceKey = getResourceKey(context);
if (resourceKey == null) {
@@ -131,24 +130,31 @@
stateHolder.restoreState(context, resourceCodec.decodeResourceData(resourceKey));
}
- Map<String, String> headers = resource.getResponseHeaders();
-
if (resource.userAgentNeedsUpdate(context)) {
+ Map<String, String> headers = resource.getResponseHeaders();
for (Entry<String, String> headerEntry : headers.entrySet()) {
- externalContext.setResponseHeader(headerEntry.getKey(), headerEntry.getValue());
+ String headerName = headerEntry.getKey();
+ String headerValue = headerEntry.getValue();
+
+ //TODO should external context handles this itself?
+ if ("content-length".equals(headerName.toLowerCase(Locale.US))) {
+ try {
+ externalContext.setResponseContentLength(Integer.parseInt(headerValue));
+ } catch (NumberFormatException e) {
+ // TODO: handle exception
+ }
+ } else if ("content-type".equals(headerName.toLowerCase(Locale.US))) {
+ externalContext.setResponseContentType(headerValue);
+ } else {
+ externalContext.setResponseHeader(headerName, headerValue);
+ }
}
InputStream is = resource.getInputStream();
OutputStream os = externalContext.getResponseOutputStream();
try {
- byte[] bs = new byte[8192];
- int read;
-
- while ((read = is.read(bs)) > 0) {
- os.write(bs, 0, read);
- }
-
+ Util.copyStreamContent(is, os);
} finally {
if (is != null) {
try {
@@ -164,6 +170,8 @@
} else {
sendNotModified(context);
}
+ } else {
+ defaultHandler.handleResourceRequest(context);
}
}
@@ -176,7 +184,7 @@
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
if (contextClassLoader != null) {
try {
- Class<?> resourceClass = contextClassLoader.loadClass(resourceName);
+ Class<?> resourceClass = Class.forName(resourceName, true,
contextClassLoader);
if (Resource.class.isAssignableFrom(resourceClass)) {
resource = (Resource) resourceClass.newInstance();
resource.setResourceName(resourceName);
@@ -187,7 +195,6 @@
}
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
- e1.printStackTrace();
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
Modified: branches/jsf2.0/framework/impl/src/main/java/org/richfaces/util/Util.java
===================================================================
--- branches/jsf2.0/framework/impl/src/main/java/org/richfaces/util/Util.java 2009-07-01
10:34:51 UTC (rev 14755)
+++ branches/jsf2.0/framework/impl/src/main/java/org/richfaces/util/Util.java 2009-07-01
10:36:19 UTC (rev 14756)
@@ -44,10 +44,16 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import java.io.OutputStream;
import java.io.StreamCorruptedException;
import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -77,11 +83,13 @@
/* HTTP Date format required by the HTTP/1.1 RFC */
private static final String RFC1123_DATE_PATTERN = "EEE, dd MMM yyyy HH:mm:ss
zzz";
- private static final SimpleDateFormat RFC1123_DATE_FORMATTER =
- new SimpleDateFormat(RFC1123_DATE_PATTERN, Locale.US);
+ private static final SimpleDateFormat RFC1123_DATE_FORMATTER;
static {
- RFC1123_DATE_FORMATTER.setTimeZone(TimeZone.getTimeZone("GMT"));
+ SimpleDateFormat format = new SimpleDateFormat(RFC1123_DATE_PATTERN, Locale.US);
+ format.setTimeZone(TimeZone.getTimeZone("GMT"));
+
+ RFC1123_DATE_FORMATTER = format;
}
public static String getMappingForRequest(FacesContext context) {
@@ -318,4 +326,24 @@
return resourceName;
}
+
+ public static void copyStreamContent(InputStream is, OutputStream os) throws
IOException {
+ ReadableByteChannel inChannel = Channels.newChannel(is);
+ WritableByteChannel outChannel = Channels.newChannel(os);
+
+ //TODO make this configurable
+ ByteBuffer buffer = ByteBuffer.allocate(8192);
+ int read;
+
+ while ((read = inChannel.read(buffer)) > 0) {
+ buffer.rewind();
+ buffer.limit(read);
+
+ while (read > 0) {
+ read -= outChannel.write(buffer);
+ }
+
+ buffer.clear();
+ }
+ }
}
Show replies by date