myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Martin Marinschek" <martin.marinsc...@gmail.com>
Subject Re: [JSF1.2] JspViewHandlerImpl flushing issue (was Re: [Trinidad] tr:table PPR failing)
Date Sat, 15 Sep 2007 03:47:47 GMT
Hi Tim,

could you supply a patch versus the new source-code - or somehow else
highlight the differences you did?

regards,

Martin

On 9/14/07, Adam Winer <awiner@gmail.com> wrote:
> (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
> >
> >
> >
> >
> >
>
>


-- 

http://www.irian.at

Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German

Professional Support for Apache MyFaces

Mime
View raw message