Author: nbelaevski
Date: 2008-08-15 12:39:23 -0400 (Fri, 15 Aug 2008)
New Revision: 10121
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/FilterServletResponseWrapper.java
Log:
https://jira.jboss.org/jira/browse/RF-4095
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java 2008-08-15
15:49:39 UTC (rev 10120)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java 2008-08-15
16:39:23 UTC (rev 10121)
@@ -71,8 +71,12 @@
private boolean forcexml = false;
+ private boolean forceNotRf = false;
+
private static final String FORCEXML_PARAMETER = "forceparser";
+ private static final String FORCENOTRF_PARAMETER = "forcenotrf";
+
private static final String INIT_PARAMETER_PREFIX =
"org.ajax4jsf.xmlfilter.";
public static final String TEXT_HTML = "text/html";
@@ -98,6 +102,14 @@
INIT_PARAMETER_PREFIX + FORCEXML_PARAMETER);
}
setupForceXml(forceXmlParameter);
+
+ String forceNotRfParameter = config.getInitParameter(FORCENOTRF_PARAMETER);
+ if (forceNotRfParameter == null) {
+ forceNotRfParameter = config.getServletContext().getInitParameter(
+ INIT_PARAMETER_PREFIX + FORCENOTRF_PARAMETER);
+ }
+ setupForcenotrf(forceNotRfParameter);
+
setMimetype((String) nz(config.getInitParameter(MIME_TYPE_PARAMETER),
"text/xml"));
setPublicid((String) nz(config.getInitParameter(PUBLICID_PARAMETER),
@@ -110,16 +122,31 @@
}
+ private Boolean stringToBoolean(String s) {
+ if ("false".equalsIgnoreCase(s)) {
+ return Boolean.FALSE;
+ } else if ("true".equalsIgnoreCase(s)) {
+ return Boolean.TRUE;
+ }
+
+ return null;
+ }
+
+ private void setupForcenotrf(String paramValue) {
+ Boolean val = stringToBoolean(paramValue);
+ if (val != null) {
+ this.forceNotRf = val.booleanValue();
+ }
+ }
+
/**
* @param forceXmlParameter
*/
private void setupForceXml(String forceXmlParameter) {
- if ("false".equalsIgnoreCase(forceXmlParameter)) {
- this.forcexml = false;
+ Boolean val = stringToBoolean(forceXmlParameter);
+ if (val != null) {
+ this.forcexml = val.booleanValue();
}
- if ("true".equalsIgnoreCase(forceXmlParameter)) {
- this.forcexml = true;
- }
}
/**
@@ -175,6 +202,9 @@
}
String viewId = (String) request
.getAttribute(AjaxViewHandler.VIEW_ID_KEY);
+ Object[] headEvents = (Object[]) request
+ .getAttribute(AjaxContext.HEAD_EVENTS_PARAMETER);
+
HtmlParser parser = null;
// setup response
// Redirect in AJAX request - convert to special response recognized by
@@ -210,102 +240,126 @@
} else {
response.sendRedirect(redirectLocation);
}
+
+
return;
- } else if ("true".equals(servletResponseWrapper.getHeaders().get(
+
+ } else {
+ if ("true".equals(servletResponseWrapper.getHeaders().get(
AjaxContainerRenderer.AJAX_FLAG_HEADER))) {
- if (log.isDebugEnabled()) {
- log
- .debug("Process response to well-formed XML for AJAX XMLHttpRequest
parser");
- }
- // Not caching AJAX request
- response.setHeader("Cache-Control",
- "no-cache, must-revalidate, max_age=0, no-store");
- response.setHeader("Expires", "0");
- response.setHeader("Pragma", "no-cache");
- // response.setCharacterEncoding(servletResponseWrapper
- // .getCharacterEncoding()); //
- // JSContentHandler.DEFAULT_ENCODING);
- // Set the content-type. For AJAX responses default encoding -
- // UTF8.
- // TODO - for null encoding, setup only Output encoding for
- // filter ?
- String outputEncoding = "UTF-8";
- String contentType = getMimetype() + ";charset=" + outputEncoding;
- response.setContentType(contentType);
- parser = getParser(getMimetype(), true, viewId);
- if (null == parser) {
- throw new ServletException(Messages.getMessage(
- Messages.PARSER_NOT_INSTANTIATED_ERROR, contentType));
- }
- output = createResponseWriter(response, outputEncoding);
- parser.setDoctype(getPublicid());
- parser.setInputEncoding(characterEncoding);
- parser.setOutputEncoding(outputEncoding);
- parser.setViewState((String) request
- .getAttribute(AjaxViewHandler.SERIALIZED_STATE_KEY));
- } else {
- // setup conversion reules for output contentType, send directly
- // if content not
- // supported by tidy.
- String contentType = servletResponseWrapper.getContentType();
- String contentTypeCharset = contentType;
- if (log.isDebugEnabled()) {
- log.debug("create HTML/XML parser for content type: "
- + contentType);
- }
- // if(contentType == null){
- // contentType = request.getContentType();
- // }
- if (contentTypeCharset != null) {
- if (contentTypeCharset.indexOf("charset") < 0
- && null != characterEncoding) {
- contentTypeCharset += ";charset=" + characterEncoding;
- }
- parser = getParser(contentTypeCharset, false, viewId);
- }
- // null or unsupported content type
- if (null == parser) {
if (log.isDebugEnabled()) {
log
- .debug("Parser not have support for the such content type, send response
as-is");
+ .debug("Process response to well-formed XML for AJAX XMLHttpRequest
parser");
}
- try {
- if (servletResponseWrapper.isUseWriter()) {
+ // Not caching AJAX request
+ response.setHeader("Cache-Control",
+ "no-cache, must-revalidate, max_age=0, no-store");
+ response.setHeader("Expires", "0");
+ response.setHeader("Pragma", "no-cache");
+ // response.setCharacterEncoding(servletResponseWrapper
+ // .getCharacterEncoding()); //
+ // JSContentHandler.DEFAULT_ENCODING);
+ // Set the content-type. For AJAX responses default encoding -
+ // UTF8.
+ // TODO - for null encoding, setup only Output encoding for
+ // filter ?
+ String outputEncoding = "UTF-8";
+ String contentType = getMimetype() + ";charset=" + outputEncoding;
+ response.setContentType(contentType);
+ parser = getParser(getMimetype(), true, viewId);
+ if (null == parser) {
+ throw new ServletException(Messages.getMessage(
+ Messages.PARSER_NOT_INSTANTIATED_ERROR, contentType));
+ }
+ output = createOutputWriter(response, outputEncoding);
+ parser.setDoctype(getPublicid());
+ parser.setInputEncoding(characterEncoding);
+ parser.setOutputEncoding(outputEncoding);
+ parser.setViewState((String) request
+ .getAttribute(AjaxViewHandler.SERIALIZED_STATE_KEY));
+ } else {
+ // setup conversion reules for output contentType, send directly
+ // if content not
+ // supported by tidy.
+ String contentType = servletResponseWrapper.getContentType();
+ String contentTypeCharset = contentType;
+ if (log.isDebugEnabled()) {
+ log.debug("create HTML/XML parser for content type: "
+ + contentType);
+ }
+ // if(contentType == null){
+ // contentType = request.getContentType();
+ // }
+ boolean forcenotrf = isForcenotrf();
+
+ if (forcenotrf || !servletResponseWrapper.isError()) {
+ if (forcenotrf || (headEvents != null && headEvents.length != 0)) {
if (contentTypeCharset != null) {
- response.setContentType(contentTypeCharset);
+ if (contentTypeCharset.indexOf("charset") < 0
+ && null != characterEncoding) {
+ contentTypeCharset += ";charset=" + characterEncoding;
+ }
+ parser = getParser(contentTypeCharset, false, viewId);
+ if (null == parser) {
+ if (log.isDebugEnabled()) {
+ log
+ .debug("Parser not have support for the such content type, send response
as-is");
+ }
+ }
}
-
- output = createResponseWriter(response,
- characterEncoding);
- servletResponseWrapper.sendContent(output);
- } else if (servletResponseWrapper.isUseStream()) {
- if (contentType != null) {
- response.setContentType(contentType);
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("No resource inclusions detected, send response as-is");
}
-
- ServletOutputStream out = response.getOutputStream();
- servletResponseWrapper.sendContent(out);
}
- } finally {
- // reuseWrapper(servletResponseWrapper);
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Servlet error occured, send response as-is");
+ }
}
- return;
+
+
+ // null or unsupported content type
+ if (null == parser) {
+ try {
+ if (servletResponseWrapper.isUseWriter()) {
+ if (contentTypeCharset != null) {
+ response.setContentType(contentTypeCharset);
+ }
+
+ output = createOutputWriter(response,
+ characterEncoding);
+ servletResponseWrapper.sendContent(output);
+ } else if (servletResponseWrapper.isUseStream()) {
+ if (contentType != null) {
+ response.setContentType(contentType);
+ }
+
+ ServletOutputStream out = response.getOutputStream();
+ servletResponseWrapper.sendContent(out);
+ }
+ } finally {
+ // reuseWrapper(servletResponseWrapper);
+ }
+
+
+ return;
+ }
+
+ if (contentTypeCharset != null) {
+ response.setContentType(contentTypeCharset);
+ }
+
+ output = createOutputWriter(response, characterEncoding);
+
+ parser.setInputEncoding(characterEncoding);
+ parser.setOutputEncoding(characterEncoding);
}
-
- if (contentTypeCharset != null) {
- response.setContentType(contentTypeCharset);
- }
-
- output = createResponseWriter(response, characterEncoding);
-
- parser.setInputEncoding(characterEncoding);
- parser.setOutputEncoding(characterEncoding);
}
-
+
try {
// Setup scripts and styles
- parser.setHeadEvents((Object[]) request
- .getAttribute(AjaxContext.HEAD_EVENTS_PARAMETER));
+ parser.setHeadEvents(headEvents);
// Process parsing.
long startTimeMills = System.currentTimeMillis();
servletResponseWrapper.parseContent(output, parser);
@@ -358,7 +412,7 @@
response.setHeader("Expires", "0");
response.setHeader("Pragma", "no-cache");
response.setContentType(getMimetype() + ";charset=UTF-8");
- output = createResponseWriter(response, "UTF-8");
+ output = createOutputWriter(response, "UTF-8");
return output;
}
@@ -409,7 +463,7 @@
* @throws IOException
* @throws UnsupportedEncodingException
*/
- private Writer createResponseWriter(final HttpServletResponse response,
+ private Writer createOutputWriter(final HttpServletResponse response,
String characterEncoding) throws IOException,
UnsupportedEncodingException {
Writer output;
@@ -498,6 +552,10 @@
return this.forcexml;
}
+ public boolean isForcenotrf() {
+ return this.forceNotRf;
+ }
+
/**
* @param forcexml
* The forcexml to set.
@@ -505,6 +563,10 @@
protected void setForcexml(boolean forcexml) {
this.forcexml = forcexml;
}
+
+ protected void setForcenotrf(boolean forcenotrf) {
+ this.forceNotRf = forcenotrf;
+ }
private Object nz(Object param, Object def) {
return param != null ? param : def;
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/FilterServletResponseWrapper.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/FilterServletResponseWrapper.java 2008-08-15
15:49:39 UTC (rev 10120)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/FilterServletResponseWrapper.java 2008-08-15
16:39:23 UTC (rev 10121)
@@ -117,6 +117,8 @@
private boolean useNullStream = false;
+ private boolean error = false;
+
private List<Cookie> cookies = new ArrayList<Cookie>();
public FilterServletResponseWrapper(HttpServletResponse response) {
@@ -649,5 +651,18 @@
public Collection<Cookie> getCookies() {
return cookies;
}
+
+ public void sendError(int sc) throws IOException {
+ this.error = true;
+ super.sendError(sc);
+ }
+ public void sendError(int sc, String msg) throws IOException {
+ this.error = true;
+ super.sendError(sc, msg);
+ }
+
+ public boolean isError() {
+ return error;
+ }
}