You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ba...@apache.org on 2006/01/24 01:31:33 UTC
svn commit: r371739 - in
/myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html:
HtmlResponseWriterImpl.java util/AddResource.java
Author: baranda
Date: Mon Jan 23 16:31:27 2006
New Revision: 371739
URL: http://svn.apache.org/viewcvs?rev=371739&view=rev
Log:
Removed functionality from ResponseWriterImpl.endCode() that provoked MYFACES-152 and MYFACES-883. Now it is possible to use the f:view tag before the body tag. The myfaces javascript code is created in the viewTag.doEndTag() method but it is not inserted in the response till the ExtensionsFilter does the post-parsing.
Modified:
myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java
myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java
Modified: myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java
URL: http://svn.apache.org/viewcvs/myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java?rev=371739&r1=371738&r2=371739&view=diff
==============================================================================
--- myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java (original)
+++ myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java Mon Jan 23 16:31:27 2006
@@ -15,19 +15,16 @@
*/
package org.apache.myfaces.renderkit.html;
-import org.apache.myfaces.config.MyfacesConfig;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.renderkit.RendererUtils;
import org.apache.myfaces.renderkit.html.util.DummyFormResponseWriter;
import org.apache.myfaces.renderkit.html.util.DummyFormUtils;
import org.apache.myfaces.renderkit.html.util.HTMLEncoder;
-import org.apache.myfaces.renderkit.html.util.JavascriptUtils;
import org.apache.myfaces.renderkit.html.util.UnicodeEncoder;
-import org.apache.myfaces.renderkit.RendererUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
-import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -153,34 +150,6 @@
public void endDocument() throws IOException
{
- flush();
- if (_writeDummyForm)
- {
- DummyFormUtils.writeDummyForm(this, _dummyFormParams);
- }
-
- FacesContext facesContext = FacesContext.getCurrentInstance();
- MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(facesContext.getExternalContext());
- if (myfacesConfig.isDetectJavascript())
- {
- if (! JavascriptUtils.isJavascriptDetected(facesContext.getExternalContext()))
- {
-
- startElement(HTML.SCRIPT_ELEM,null);
- writeAttribute(HTML.SCRIPT_TYPE_ATTR,HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT,null);
- StringBuffer script = new StringBuffer();
- script.append("document.location.replace('").
- append(facesContext.getApplication().getViewHandler().getResourceURL(facesContext, "/_javascriptDetector_")).append("?goto=").append(facesContext.getApplication().getViewHandler().getActionURL(facesContext, facesContext.getViewRoot().getViewId())).append("');");
- writeText(script.toString(),null);
- endElement(HTML.SCRIPT_ELEM);
- }
- }
-
- if (myfacesConfig.isAutoScroll())
- {
- JavascriptUtils.renderAutoScrollFunction(facesContext, this);
- }
-
_writer.flush();
}
Modified: myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java
URL: http://svn.apache.org/viewcvs/myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java?rev=371739&r1=371738&r2=371739&view=diff
==============================================================================
--- myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java (original)
+++ myfaces/commons/trunk/src/main/java/org/apache/myfaces/renderkit/html/util/AddResource.java Mon Jan 23 16:31:27 2006
@@ -15,13 +15,6 @@
*/
package org.apache.myfaces.renderkit.html.util;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import java.util.Set;
-
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.logging.Log;
@@ -36,6 +29,8 @@
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
/**
* This is a utility class to render link to resources used by custom components.
@@ -101,6 +96,14 @@
public static final Position BODY_END = new Position(1);
public static final Position BODY_ONLOAD = new Position(2);
+ private StringBuffer originalResponse;
+ private boolean parserCalled = false;
+ private int headerInsertPosition = -1;
+ private int bodyInsertPosition = -1;
+ private int beforeBodyPosition = -1;
+ private int afterBodyContentInsertPosition = -1;
+ private int beforeBodyEndPosition = -1;
+
private AddResource(String contextPath)
{
_contextPath = contextPath;
@@ -671,25 +674,61 @@
}
/**
- * Add the resources to the <head> of the page.
- * If the head tag is missing, but the <body> tag is present, the head tag is added.
- * If both are missing, no resource is added.
- *
- * The ordering is such that the user header CSS & JS override the MyFaces' ones.
+ * Parses the response to mark the positions where code will be inserted
*/
- public void writeWithFullHeader(HttpServletRequest request, String bufferedResponse,
+ public void parseResponse(HttpServletRequest request, String bufferedResponse,
HttpServletResponse response) throws IOException
{
- StringBuffer originalResponse = new StringBuffer(bufferedResponse);
+ originalResponse = new StringBuffer(bufferedResponse);
ParseCallbackListener l = new ParseCallbackListener();
ReducedHTMLParser.parse(originalResponse, l);
- int headerInsertPosition = l.getHeaderInsertPosition();
- int bodyInsertPosition = l.getBodyInsertPosition();
- int beforeBodyPosition = l.getBeforeBodyPosition();
- int afterBodyContentInsertPosition = l.getAfterBodyContentInsertPosition();
+ headerInsertPosition = l.getHeaderInsertPosition();
+ bodyInsertPosition = l.getBodyInsertPosition();
+ beforeBodyPosition = l.getBeforeBodyPosition();
+ afterBodyContentInsertPosition = l.getAfterBodyContentInsertPosition();
+ beforeBodyEndPosition = l.getAfterBodyEndPosition()-7; // 7, which is the length of </body>
+
+ parserCalled = true;
+ }
+
+ /**
+ * Writes the javascript code necessary for myfaces in every page, just befode the closing </body> tag
+ */
+ public void writeMyFacesJavascriptBeforeBodyEnd(HttpServletRequest request,
+ HttpServletResponse response) throws IOException
+ {
+ if (!parserCalled)
+ {
+ throw new IOException("Method parseResponse has to be called first");
+ }
+
+ ResponseWriter writer = new HtmlResponseWriterImpl(response.getWriter(), HtmlRendererUtils
+ .selectContentType(request.getHeader("accept")), null);
+
+ if (beforeBodyEndPosition >= 0)
+ {
+ String myFacesJavascript = (String) request.getAttribute("org.apache.myfaces.myFacesJavascript");
+ originalResponse.insert(beforeBodyEndPosition, myFacesJavascript);
+ }
+ }
+
+ /**
+ * Add the resources to the <head> of the page.
+ * If the head tag is missing, but the <body> tag is present, the head tag is added.
+ * If both are missing, no resource is added.
+ *
+ * The ordering is such that the user header CSS & JS override the MyFaces' ones.
+ */
+ public void writeWithFullHeader(HttpServletRequest request,
+ HttpServletResponse response) throws IOException
+ {
+ if (!parserCalled)
+ {
+ throw new IOException("Method parseResponse has to be called first");
+ }
boolean addHeaderTags = false;
@@ -787,6 +826,16 @@
}
+ }
+
+ /**
+ * Writes the response
+ */
+ public void writeResponse(HttpServletRequest request,
+ HttpServletResponse response) throws IOException
+ {
+ ResponseWriter writer = new HtmlResponseWriterImpl(response.getWriter(), HtmlRendererUtils
+ .selectContentType(request.getHeader("accept")), null);
writer.write(originalResponse.toString());
}
@@ -1068,6 +1117,7 @@
private int bodyInsertPosition = -1;
private int beforeBodyPosition = -1;
private int afterBodyContentInsertPosition = -1;
+ private int afterBodyEndPosition = -1;
public void openedStartTag(int charIndex, int tagIdentifier)
{
@@ -1099,6 +1149,10 @@
public void closedEndTag(int charIndex, int tagIdentifier)
{
+ if (tagIdentifier == ReducedHTMLParser.BODY_TAG)
+ {
+ afterBodyEndPosition = charIndex;
+ }
}
public void attribute(int charIndex, int tagIdentifier, String key, String value)
@@ -1123,6 +1177,10 @@
public int getAfterBodyContentInsertPosition()
{
return afterBodyContentInsertPosition;
+ }
+
+ public int getAfterBodyEndPosition() {
+ return afterBodyEndPosition;
}
}
}