myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Adam Winer" <awi...@gmail.com>
Subject [JSF1.2] JspViewHandlerImpl flushing issue (was Re: [Trinidad] tr:table PPR failing)
Date Fri, 14 Sep 2007 20:53:42 GMT
(Changing subject to bring this to the attention of non-Trinidad folks)
Tim, could you file a MYFACES JIRA issue?  This looks like an important
issue.  It also explains why I haven't really seen this - I've done 95% of
my testing with the RI, not the MyFaces 1.2 impl.

-- Adam



On 9/14/07, Timothy M. Braun <TBraun@fellowshipvillage.org> wrote:
>
> This seems to fix the problem.
>
> I moved the flush so it was after the call to the ppr writer endDocument
> method.  Everything works beautifully now.
>
> Here is the source for the new JspViewHandlerImpl
>
> /*
> * Copyright 2004 The Apache Software Foundation.
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> * You may obtain a copy of the License at
> *
> *      http://www.apache.org/licenses/LICENSE-2.0
> *
> * Unless required by applicable law or agreed to in writing, software
> * distributed under the License is distributed on an "AS IS" BASIS,
> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> * See the License for the specific language governing permissions and
> * limitations under the License.
> */
> package org.apache.myfaces.application.jsp;
>
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory;
> import org.apache.myfaces.application.DefaultViewHandlerSupport;
> import org.apache.myfaces.application.InvalidViewIdException;
> import org.apache.myfaces.application.ViewHandlerSupport;
>
> import javax.faces.FacesException;
> import javax.faces.FactoryFinder;
> import javax.faces.application.Application;
> import javax.faces.application.StateManager;
> import javax.faces.application.ViewHandler;
> import javax.faces.component.UIViewRoot;
> import javax.faces.context.ExternalContext;
> import javax.faces.context.FacesContext;
> import javax.faces.context.ResponseWriter;
> import javax.faces.render.RenderKit;
> import javax.faces.render.RenderKitFactory;
> import javax.faces.render.ResponseStateManager;
> import javax.servlet.ServletRequest;
> import javax.servlet.ServletResponse;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
> import javax.servlet.http.HttpSession;
> import javax.servlet.jsp.jstl.core.Config;
> import java.io.IOException;
> import java.io.StringWriter;
> import java.io.Writer;
> import java.util.Iterator;
> import java.util.Locale;
>
> /**
> * @author Thomas Spiegl (latest modification by $Author: baranda $)
> * @author Bruno Aranda
> * @version $Revision: 542008 $ $Date: 2007-05-27 19:45:19 +0200 (So, 27
> Mai 2007) $
> */
> public class JspViewHandlerImpl extends ViewHandler
> {
>     private static final Log log =
> LogFactory.getLog(JspViewHandlerImpl.class);
>     public static final String FORM_STATE_MARKER =
> "<!--@@JSF_FORM_STATE_MARKER@@-->";
>     public static final int FORM_STATE_MARKER_LEN =
> FORM_STATE_MARKER.length();
>
>     private static final String AFTER_VIEW_TAG_CONTENT_PARAM =
> JspViewHandlerImpl.class + ".AFTER_VIEW_TAG_CONTENT";
>
>     private ViewHandlerSupport _viewHandlerSupport;
>
>     public JspViewHandlerImpl()
>     {
>         if (log.isTraceEnabled())
>             log.trace("New ViewHandler instance created");
>     }
>
>     /**
>      * @param viewHandlerSupport
>      *            the viewHandlerSupport to set
>      */
>     public void setViewHandlerSupport(ViewHandlerSupport
> viewHandlerSupport)
>     {
>         _viewHandlerSupport = viewHandlerSupport;
>     }
>
>     /**
>      * @return the viewHandlerSupport
>      */
>     protected ViewHandlerSupport getViewHandlerSupport()
>     {
>         if (_viewHandlerSupport == null)
>         {
>             _viewHandlerSupport = new DefaultViewHandlerSupport();
>         }
>         return _viewHandlerSupport;
>     }
>
>     public Locale calculateLocale(FacesContext facesContext)
>     {
>         Application application = facesContext.getApplication();
>         for (Iterator<Locale> requestLocales =
> facesContext.getExternalContext().getRequestLocales(); requestLocales
>                 .hasNext();)
>         {
>             Locale requestLocale = requestLocales.next();
>             for (Iterator<Locale> supportedLocales =
> application.getSupportedLocales(); supportedLocales.hasNext();)
>             {
>                 Locale supportedLocale = supportedLocales.next();
>                 // higher priority to a language match over an exact
> match
>                 // that occures further down (see Jstl Reference 1.0
> 8.3.1)
>                 if
> (requestLocale.getLanguage().equals(supportedLocale.getLanguage())
>                         && (supportedLocale.getCountry() == null ||
> supportedLocale.getCountry().length() == 0))
>                 {
>                     return supportedLocale;
>                 }
>                 else if (supportedLocale.equals(requestLocale))
>                 {
>                     return supportedLocale;
>                 }
>             }
>         }
>
>         Locale defaultLocale = application.getDefaultLocale();
>         return defaultLocale != null ? defaultLocale :
> Locale.getDefault();
>     }
>
>     public String calculateRenderKitId(FacesContext facesContext)
>     {
>         Object renderKitId =
> facesContext.getExternalContext().getRequestMap().get(
>                 ResponseStateManager.RENDER_KIT_ID_PARAM);
>         if (renderKitId == null)
>         {
>             renderKitId =
> facesContext.getApplication().getDefaultRenderKitId();
>         }
>         if (renderKitId == null)
>         {
>             renderKitId = RenderKitFactory.HTML_BASIC_RENDER_KIT;
>         }
>         return renderKitId.toString();
>     }
>
>     /**
>      */
>     public UIViewRoot createView(FacesContext facesContext, String
> viewId)
>     {
>         String calculatedViewId = viewId;
>         try
>         {
>             calculatedViewId =
> getViewHandlerSupport().calculateViewId(facesContext, viewId);
>         }
>         catch (InvalidViewIdException e)
>         {
>             sendSourceNotFound(facesContext, e.getMessage());
>         }
>
>         Application application = facesContext.getApplication();
>         ViewHandler applicationViewHandler =
> application.getViewHandler();
>
>         Locale currentLocale = null;
>         String currentRenderKitId = null;
>         UIViewRoot uiViewRoot = facesContext.getViewRoot();
>         if (uiViewRoot != null)
>         {
>             // Remember current locale and renderKitId
>             currentLocale = uiViewRoot.getLocale();
>             currentRenderKitId = uiViewRoot.getRenderKitId();
>         }
>
>         uiViewRoot = (UIViewRoot)
> application.createComponent(UIViewRoot.COMPONENT_TYPE);
>
>         uiViewRoot.setViewId(calculatedViewId);
>
>         if (currentLocale != null)
>         {
>             // set old locale
>             uiViewRoot.setLocale(currentLocale);
>         }
>         else
>         {
>             // calculate locale
>
> uiViewRoot.setLocale(applicationViewHandler.calculateLocale(facesContext
> ));
>         }
>
>         if (currentRenderKitId != null)
>         {
>             // set old renderKit
>             uiViewRoot.setRenderKitId(currentRenderKitId);
>         }
>         else
>         {
>             // calculate renderKit
>
> uiViewRoot.setRenderKitId(applicationViewHandler.calculateRenderKitId(fa
> cesContext));
>         }
>
>         if (log.isTraceEnabled())
>             log.trace("Created view " + viewId);
>         return uiViewRoot;
>     }
>
>     private void sendSourceNotFound(FacesContext context, String
> message)
>     {
>         HttpServletResponse response = (HttpServletResponse)
> context.getExternalContext().getResponse();
>         try
>         {
>             context.responseComplete();
>             response.sendError(HttpServletResponse.SC_NOT_FOUND,
> message);
>         }
>         catch (IOException ioe)
>         {
>             throw new FacesException(ioe);
>         }
>     }
>
>     public String getActionURL(FacesContext facesContext, String viewId)
>     {
>         return getViewHandlerSupport().calculateActionURL(facesContext,
> viewId);
>     }
>
>     public String getResourceURL(FacesContext facesContext, String path)
>     {
>         if (path.length() > 0 && path.charAt(0) == '/')
>         {
>             return
> facesContext.getExternalContext().getRequestContextPath() + path;
>         }
>
>         return path;
>
>     }
>
>     public void renderView(FacesContext facesContext, UIViewRoot
> viewToRender) throws IOException, FacesException
>     {
>         if (viewToRender == null)
>         {
>             log.fatal("viewToRender must not be null");
>             throw new NullPointerException("viewToRender must not be
> null");
>         }
>
>         // do not render the view if the rendered attribute for the view
> is false
>         if (!viewToRender.isRendered())
>         {
>             if (log.isTraceEnabled())
>                 log.trace("View is not rendered");
>             return;
>         }
>
>         ExternalContext externalContext =
> facesContext.getExternalContext();
>
>         String viewId = facesContext.getViewRoot().getViewId();
>
>         if (log.isTraceEnabled())
>             log.trace("Rendering JSP view: " + viewId);
>
>         ServletResponse response = (ServletResponse)
> externalContext.getResponse();
>         ServletRequest request = (ServletRequest)
> externalContext.getRequest();
>
>         Locale locale = viewToRender.getLocale();
>         response.setLocale(locale);
>         Config.set(request, Config.FMT_LOCALE,
> facesContext.getViewRoot().getLocale());
>
>         ViewResponseWrapper wrappedResponse = new
> ViewResponseWrapper((HttpServletResponse) response);
>
>         externalContext.setResponse(wrappedResponse);
>         externalContext.dispatch(viewId);
>         externalContext.setResponse(response);
>
>         boolean errorResponse = wrappedResponse.getStatus() < 200 ||
> wrappedResponse.getStatus() > 299;
>         if (errorResponse)
>         {
>             wrappedResponse.flushToWrappedResponse();
>         }
>
>         // store the wrapped response in the request, so it is
> thread-safe
>
> externalContext.getRequestMap().put(AFTER_VIEW_TAG_CONTENT_PARAM,
> wrappedResponse);
>
>         // handle character encoding as of section 2.5.2.2 of JSF 1.1
>         if (externalContext.getRequest() instanceof HttpServletRequest)
>         {
>             HttpServletRequest httpServletRequest = (HttpServletRequest)
> externalContext.getRequest();
>             HttpSession session = httpServletRequest.getSession(false);
>
>             if (session != null)
>             {
>                 session.setAttribute(ViewHandler.CHARACTER_ENCODING_KEY,
> response.getCharacterEncoding());
>             }
>         }
>
>         // render the view in this method (since JSF 1.2)
>         RenderKitFactory renderFactory = (RenderKitFactory)
> FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
>         RenderKit renderKit = renderFactory.getRenderKit(facesContext,
> viewToRender.getRenderKitId());
>
>         ResponseWriter newResponseWriter;
>         StateMarkerAwareWriter stateAwareWriter = new
> StateMarkerAwareWriter();
>
>         // If the FacesContext has a non-null ResponseWriter create a
> new writer using its
>         // cloneWithWriter() method, passing the response's Writer as
> the argument.
>         // Otherwise, use the current RenderKit to create a new
> ResponseWriter.
>         ResponseWriter oldResponseWriter =
> facesContext.getResponseWriter();
>         if (oldResponseWriter != null)
>         {
>             newResponseWriter =
> oldResponseWriter.cloneWithWriter(stateAwareWriter);
>         }
>         else
>         {
>             if (log.isTraceEnabled())
>                 log.trace("Creating new ResponseWriter");
>             newResponseWriter =
> renderKit.createResponseWriter(stateAwareWriter, null,
>                     ((HttpServletRequest)
> externalContext.getRequest()).getCharacterEncoding());
>         }
>
>         // Set the new ResponseWriter into the FacesContext, saving the
> old one aside.
>         facesContext.setResponseWriter(newResponseWriter);
>
>         // Call startDocument() on the ResponseWriter.
>         newResponseWriter.startDocument();
>
>         // Call encodeAll() on the UIViewRoot
>         viewToRender.encodeAll(facesContext);
>
>         ResponseWriter responseWriter;
>         if (oldResponseWriter != null)
>         {
>             responseWriter =
> oldResponseWriter.cloneWithWriter(response.getWriter());
>         }
>         else
>         {
>             responseWriter =
> newResponseWriter.cloneWithWriter(response.getWriter());
>         }
>         facesContext.setResponseWriter(responseWriter);
>
>         // Output any content in the wrappedResponse response from above
> to the response, removing the
>         // wrappedResponse response from the thread-safe storage.
>         ViewResponseWrapper afterViewTagResponse = (ViewResponseWrapper)
> externalContext.getRequestMap().get(
>                 AFTER_VIEW_TAG_CONTENT_PARAM);
>
> externalContext.getRequestMap().remove(AFTER_VIEW_TAG_CONTENT_PARAM);
>
>         if (afterViewTagResponse != null)
>         {
>             afterViewTagResponse.flushToWriter(response.getWriter());
>         }
>
>         // Call endDocument() on the ResponseWriter
>         newResponseWriter.endDocument();
>
>         // Timothy M. Braun:  Moved to after endDocument call to ensure
>         //  all content is flushed to the real writer
>         // response.getWriter().write(stateAwareWriter.parseResponse());
>         stateAwareWriter.flushToWriter(response.getWriter());
>
>         // If the old ResponseWriter was not null, place the old
> ResponseWriter back
>         // into the FacesContext.
>         if (oldResponseWriter != null)
>         {
>             facesContext.setResponseWriter(oldResponseWriter);
>         }
>
>         response.flushBuffer();
>     }
>
>     public UIViewRoot restoreView(FacesContext facesContext, String
> viewId)
>     {
>         Application application = facesContext.getApplication();
>         ViewHandler applicationViewHandler =
> application.getViewHandler();
>         String renderKitId =
> applicationViewHandler.calculateRenderKitId(facesContext);
>         String calculatedViewId =
> getViewHandlerSupport().calculateViewId(facesContext, viewId);
>         UIViewRoot viewRoot =
> application.getStateManager().restoreView(facesContext,
> calculatedViewId, renderKitId);
>         return viewRoot;
>     }
>
>     /**
>      * Writes a state marker that is replaced later by one or more
> hidden form inputs.
>      *
>      * @param facesContext
>      * @throws IOException
>      */
>     public void writeState(FacesContext facesContext) throws IOException
>     {
>         facesContext.getResponseWriter().write(FORM_STATE_MARKER);
>     }
>
>     /**
>      * Writes the response and replaces the state marker tags with the
> state information for the current context
>      */
>     private static class StateMarkerAwareWriter extends StringWriter
>     {
>         public StateMarkerAwareWriter()
>         {
>         }
>
>         public void flushToWriter(Writer writer) throws IOException
>         {
>             FacesContext facesContext =
> FacesContext.getCurrentInstance();
>             StateManager stateManager =
> facesContext.getApplication().getStateManager();
>
>             StringWriter stateWriter = new StringWriter();
>             ResponseWriter realWriter =
> facesContext.getResponseWriter();
>
> facesContext.setResponseWriter(realWriter.cloneWithWriter(stateWriter));
>
>             Object serializedView = stateManager.saveView(facesContext);
>
>             stateManager.writeState(facesContext, serializedView);
>             facesContext.setResponseWriter(realWriter);
>
>             StringBuffer contentBuffer = getBuffer();
>             StringBuffer state = stateWriter.getBuffer();
>
>             int form_marker;
>             while ((form_marker =
> contentBuffer.indexOf(JspViewHandlerImpl.FORM_STATE_MARKER)) > -1 )
>             {
>                 //FORM_STATE_MARKER found, replace it
>                 contentBuffer.replace(form_marker, form_marker +
> FORM_STATE_MARKER_LEN, state.toString());
>             }
>
>             int bufferLength = contentBuffer.length();
>             int index = 0;
>             int bufferSize = 512;
>
>             while (index < bufferLength)
>             {
>                 int maxSize = Math.min(bufferSize, bufferLength -
> index);
>                 char[] bufToWrite = new char[maxSize];
>
>                 contentBuffer.getChars(index, index + maxSize,
> bufToWrite, 0);
>                 writer.write(bufToWrite);
>
>                 index += bufferSize;
>             }
>
>         }
>     }
>
> }
>
>
>
> -----Original Message-----
> From: Timothy M. Braun [mailto:TBraun@fellowshipvillage.org]
> Sent: Friday, September 14, 2007 11:01 AM
> To: MyFaces Discussion
> Subject: RE: [Trinidad] tr:table PPR failing
>
> Ok... please bare with me as this is the first time I have really dug
> into the internals of trinidad and myfaces.  The problem seems to be
> coming from the JspViewHandlerImpl class inside the renderView method.
> I'm not really sure what is trying to be accomplished, but the response
> writer is getting replaced with an instance of StateAwareResponseWriter
> which wraps a StringBuffer.  The StateAwareResponseWriter is then
> wrapped by an XhtmlResponseWriter and an instance of PPRResponseWriter.
> Once this is done, the partial view is rendered to the writer.  The
> state aware writer then gets flushed to the real response writer and
> then the ppr writer's endDocument method is called.  Inside the
> endDocument method of the ppr writer, the buffered script tags and
> </content> element are sent to the ppr's writer.  The problem is, this
> writer never get's flushed to the real writer.  Since the state aware
> writer wraps a string buffer, this information get lost forever.
>
> The whole thing starts on line 297 of
> org.apache.myfaces.application.jsp.JspViewHandlerImpl
>
> Don't know if this helps...
>
> Tim
>
> -----Original Message-----
> From: Timothy M. Braun [mailto:TBraun@fellowshipvillage.org]
> Sent: Friday, September 14, 2007 9:56 AM
> To: MyFaces Discussion
> Subject: RE: [Trinidad] tr:table PPR failing
>
> So I did a little more investigating and something really interesting is
> going on.  I set a breakpoint in PPRResponseWriter.endDocument().  This
> is where the </content> element get appended to the response.  If I look
> at the output buffer at this stage, I can see there is a lot of
> information with seems to be missing from the response the browser
> receives.  I have included the buffer contents below.  As you can see,
> the browser doesn't see anything past the last </fragment> element so
> it's not receiving the script elements either.
>
> Any Ideas?
> Tim
>
> <?xml version="1.0" ?>
> <?Tr-XHR-Response-Type ?>
>         <content
>
> action="/vbm/faces/pages/secure/telephony/accountSearch.jspx">
>                 <fragment><![CDATA[<div
> id="j_id_jsp_1566647018_3:acctTable"><table cellpadding="0"
> cellspacing="0" border="0" width="90%" summary=""><tr><td><table
> cellpadding="0" cellspacing="0" border="0" width="100%" summary=""
> class="x6m"><tr><td><button type="button"
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:j_id_jsp_1566647018_15'});return false;" class="x6s">Clear
> Results</button></td><td
> width="100%"></td></tr></table></td></tr><tr><td><table
cellpadding="0"
> cellspacing="0" border="0" width="100%" summary="" class="x6q"><tr><td
> nowrap="nowrap" valign="middle"><a onclick="return
> _submitHideShow('acctForm',1,'show','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTable__xc_sa','all')" href="#"
> id="j_id_jsp_1566647018_3:acctTable__xc_sa" class="xi">Show All
> Details</a>&#xa0;|&#xa0;<a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTable__xc_ha','all')" href="#"
> id="j_id_jsp_1566647018_3:acctTable__xc_ha" class="xi">Hide All
> Details</a></td></tr></table></td></tr><tr><td><table
class="x6k"
> cellpadding="1" cellspacing="0" border="0" width="100%"><tr><th
> id="j_id0" width="1%" nowrap="nowrap" class="x75">Details</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_16" class="x75
> xaf">Name</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_18" class="x75
> xaf">Active</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_20" class="x75
> xaf">Actions</th></tr><tr><td headers="j_id0" class="x6v xat"
> nowrap="nowrap"><div><a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTabledd0','0')" href="#"
> id="j_id_jsp_1566647018_3:acctTabledd0"><span title="Select to hide
> information" class="x9q">&#x25bc;</span></a><a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTabledd0','0')" href="#"
> class="xi">Hide</a></div></td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_16"
> class="x6v xat">Name Removed</td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_18"
> class="x6v xat">true</td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_20"
> class="x6v xat"><a
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:0:j_id_jsp_1566647018_21'});return false;" class="xi"
> href="#">Close</a></td></tr><tr><td headers="j_id0" colspan="4"
> class="x79 xat"><div class="x9m"><h3 class="x65">Account
> Details</h3><div>Bill Cycle: Independant<div></div>Created:
> 12/15/2006<div></div>Last Modified: 12/15/2006</div><div class="x9m"><h4
> class="x65">Plans</h4><div
> id="j_id_jsp_1566647018_3:acctTable:0:j_id_jsp_1566647018_32"><table
> cellpadding="0" cellspacing="0" border="0" width="50%"
> summary=""><tr><td><table class="x6k" cellpadding="1" cellspacing="0"
> border="0" width="100%"><tr><th scope="col" class="x75">Type</th><th
> scope="col" class="x75 xaf">Extension</th><th scope="col" class="x75
> xaf">DID Number</th><th scope="col" class="x75 xaf">Active</th><th
> scope="col" class="x75 xaf">Actions</th></tr><tr><td class="x6v
> xat">Basic 250</td><td class="x6v xat">5112</td><td class="x6v
> xat">(908) 604-0215</td><td class="x6v xat">true</td><td class="x6v
> xat"><a
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:0:j_id_jsp_1566647018_32:0:j_id_jsp_1566647018_43'});return false;"
> class="xi" href="#">View</a></td></tr></table></td></tr></table><input
> type="hidden"
> name="j_id_jsp_1566647018_3:acctTable:0:j_id_jsp_1566647018_32:rangeStar
> t"
> value="0"></input></div></div></div></td></tr></table></td></tr></table>
> <input type="hidden" name="j_id_jsp_1566647018_3:acctTable:rangeStart"
> value="0"></input></div>]]></fragment>
>                 <fragment><![CDATA[<span
> id="_acctForm_Postscript"><input type="hidden"
> name="javax.faces.ViewState" value="!3ca5b351"></input><input
> type="hidden" name="event"></input><input type="hidden"
> name="source"></input><input type="hidden" name="partial"></input><input
> type="hidden" name="value"></input><input type="hidden"
> name="state"></input></span>]]></fragment>
>                 <script><![CDATA[function _submitHideShow(a,v,b,c,l,d)
> {var o = {event:b,source:c};if (d!=(void 0))
> o.value=d;_setRequestedFocusNode(document,l,false,window);_submitPartial
> Change(a,v,o);return false;}]]></script>
>
> <script><![CDATA[_uixt_j_id_jsp_1566647018_3_acctTable_0_j_id_jsp_156664
> 7018_32=new
> CollectionComponent('acctForm','j_id_jsp_1566647018_3:acctTable:0:j_id_j
> sp_1566647018_32');]]></script>
>
> <script><![CDATA[_uixt_j_id_jsp_1566647018_3_acctTable=new
> CollectionComponent('acctForm','j_id_jsp_1566647018_3:acctTable');]]></s
> cript>
>                 <script><![CDATA[var
> _resetacctFormNames=["event","source","partial","value","state"];]]></sc
> ript>
>                 <script><![CDATA[function _acctFormValidator(){return
> true;}var acctForm_SF={};]]></script>
>         </content>
>
>
> -----Original Message-----
> From: Timothy M. Braun [mailto:TBraun@fellowshipvillage.org]
> Sent: Friday, September 14, 2007 12:26 AM
> To: MyFaces Discussion
> Subject: RE: [Trinidad] tr:table PPR failing
>
> Adam--
>         I used firebug and the problem arises from a parse error of the
> xml response.  It seems as though the </content> closing element is
> missing from the response.  I have included the text from the response
> below.
>
> <content
>         action="/vbm/faces/pages/secure/telephony/accountSearch.jspx">
>         <fragment><![CDATA[<div
> id="j_id_jsp_1566647018_3:acctTable"><table cellpadding="0"
> cellspacing="0" border="0" width="90%" summary=""><tr><td><table
> cellpadding="0" cellspacing="0" border="0" width="100%" summary=""
> class="x6m"><tr><td><button type="button"
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:j_id_jsp_1566647018_15'});return false;" class="x6s">Clear
> Results</button></td><td
> width="100%"></td></tr></table></td></tr><tr><td><table
cellpadding="0"
> cellspacing="0" border="0" width="100%" summary="" class="x6q"><tr><td
> nowrap="nowrap" valign="middle"><a onclick="return
> _submitHideShow('acctForm',1,'show','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTable__xc_sa','all')" href="#"
> id="j_id_jsp_1566647018_3:acctTable__xc_sa" class="xi">Show All
> Details</a>&#xa0;|&#xa0;<a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTable__xc_ha','all')" href="#"
> id="j_id_jsp_1566647018_3:acctTable__xc_ha" class="xi">Hide All
> Details</a></td></tr></table></td></tr><tr><td><table
class="x6k"
> cellpadding="1" cellspacing="0" border="0" width="100%"><tr><th
> id="j_id0" width="1%" nowrap="nowrap" class="x75">Details</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_16" class="x75
> xaf">Name</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_18" class="x75
> xaf">Active</th><th
> id="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_20" class="x75
> xaf">Actions</th></tr><tr><td headers="j_id0" class="x6v xat"
> nowrap="nowrap"><div><a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTabledd0','0')" href="#"
> id="j_id_jsp_1566647018_3:acctTabledd0"><span title="Select to hide
> information" class="x9q">&#x25bc;</span></a><a onclick="return
> _submitHideShow('acctForm',1,'hide','j_id_jsp_1566647018_3:acctTable','j
> _id_jsp_1566647018_3:acctTabledd0','0')" href="#"
> class="xi">Hide</a></div></td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_16"
> class="x6v xat">Name removed for privacy</td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_18"
> class="x6v xat">true</td><td
> headers="j_id_jsp_1566647018_3:acctTable:j_id_jsp_1566647018_20"
> class="x6v xat"><a
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:0:j_id_jsp_1566647018_21'});return false;" class="xi"
> href="#">Close</a></td></tr><tr><td headers="j_id0" colspan="4"
> class="x79 xat"><div class="x9m"><h3 class="x65">Account
> Details</h3><div>Bill Cycle: Independant<div></div>Created:
> 12/15/2006<div></div>Last Modified: 12/15/2006</div><div class="x9m"><h4
> class="x65">Plans</h4><div
> id="j_id_jsp_1566647018_3:acctTable:0:j_id_jsp_1566647018_32"><table
> cellpadding="0" cellspacing="0" border="0" width="50%"
> summary=""><tr><td><table class="x6k" cellpadding="1" cellspacing="0"
> border="0" width="100%"><tr><th scope="col" class="x75">Type</th><th
> scope="col" class="x75 xaf">Extension</th><th scope="col" class="x75
> xaf">DID Number</th><th scope="col" class="x75 xaf">Active</th><th
> scope="col" class="x75 xaf">Actions</th></tr><tr><td class="x6v
> xat">Basic 250</td><td class="x6v xat">5112</td><td class="x6v
> xat">(908) 604-0215</td><td class="x6v xat">true</td><td class="x6v
> xat"><a
> onclick="submitForm('acctForm',1,{source:'j_id_jsp_1566647018_3:acctTabl
> e:0:j_id_jsp_1566647018_32:0:j_id_jsp_1566647018_43'});return false;"
> class="xi" href="#">View</a></td></tr></table></td></tr></table><input
> type="hidden"
> name="j_id_jsp_1566647018_3:acctTable:0:j_id_jsp_1566647018_32:rangeStar
> t"
> value="0"></input></div></div></div></td></tr></table></td></tr></table>
> <input type="hidden" name="j_id_jsp_1566647018_3:acctTable:rangeStart"
> value="0"></input></div>]]></fragment>
>         <fragment><![CDATA[<span id="_acctForm_Postscript"><input
> type="hidden" name="javax.faces.ViewState"
> value="!-4bdfb93a"></input><input type="hidden"
> name="event"></input><input type="hidden" name="source"></input><input
> type="hidden" name="partial"></input><input type="hidden"
> name="value"></input><input type="hidden"
> name="state"></input></span>]]></fragment>
>
> Thanks,
> Tim
>
> -----Original Message-----
> From: Adam Winer [mailto:awiner@gmail.com]
> Sent: Thursday, September 13, 2007 12:46 PM
> To: MyFaces Discussion
> Subject: Re: [Trinidad] tr:table PPR failing
>
> On 9/13/07, Adam Winer <awiner@gmail.com> wrote:
> > On 9/13/07, Andrew Robinson <andrew.rw.robinson@gmail.com> wrote:
> > > Timothy,
> > >
> > > I stripped the page and the AJAX down to the ID attributes only
> > > (FYI I used this set of commands with VIM to do this:
> > > %s/></>\r</g | %s/^.\+\(id="[^"]\+"\).*/\1/ | %s/^[^i].\+\n// |
sort
> > > )
> >
> > Can I get you on permanent retainer for VIM-editing? :)
> >
> > > Here are the results:
> > >
> > > Page:
> > > id="acctPage:acctTable"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_17"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_19"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_21"
> > > id="acctPage:acctTable__xc_ha"
> > > id="acctPage:acctTable__xc_sa"
> > > id="acctPage:acctTabledd0"
> > > id="j_id0"
> > >
> > > AJAX response:
> > > id="_acctForm_Postscript"
> > > id="acctPage:acctTable"
> > > id="acctPage:acctTable:0:j_id_jsp_1566647018_33"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_17"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_19"
> > > id="acctPage:acctTable:j_id_jsp_1566647018_21"
> > > id="acctPage:acctTable__xc_ha"
> > > id="acctPage:acctTabledd0"
> > > id="j_id0"
> > >
> > > As you can see, the following items in the AJAX were not in the
> page:
> > > id="_acctForm_Postscript"
> > > id="acctPage:acctTable:0:j_id_jsp_1566647018_33"
> > >
> > > Looking at your page source, there is no form element. The form is
> > > required AFAIK. This may be just because you didn't provide the full
> > > source though.
> >
> > I suspect so... the submission wouldn't have gotten far at all
> > without a form element.  The "postscript" in the PPR reply
> > is in fact part of the form.
> >
> > It looks as though the issue is exactly related to trying to get that
> > expanded row to show up, since the one missing ID is ":0:"
> > (that is, the first row of the table).  Lemme try this locally.
>
> Ech, ignore that commentary.  Diffing the full set of IDs isn't
> really relevant here:  PPR can, of course, introduce new IDs.
> It just can't introduce new *top* IDs - each fragment has to
> point to an existing ID.  We've got two fragments in here:
>
> <div id="acctPage:acctTable">
> <span id="_acctForm_Postscript">
>
> And these do seem to be in the page already.  But even
> if they weren't, it seems that the current JS code would simply
> drop them and move on.
>
> Tim, could you by any chance use FireBug's JS debugger to
> step through TrPage.prototype._handlePprResponse()?  It's
> not clear where this JS error is coming from.
>
> (FWIW, the basic table row-disclosure demo seems to be working
> fine for me, at least on FF (haven't tested IE)).
>
> -- Adam
>
>
>
>
>

Mime
View raw message