myfaces-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Shane Petroff <sh...@mayet.ca>
Subject Re: [Trinidad] PPR and inputDate problems
Date Mon, 11 Feb 2008 16:37:48 GMT
Rafa PĂ©rez wrote:
> Could you change your h:dataTable for a tr:table?? Just to see what 
> happens...

Tried this days ago, but to no avail. The value change is fired, but no 
partial triggers field refresh. The first time through it I used a plain 
partialTriggers name. From there I tried ::finalMarkField (at first I 
didn't notice that I'd lost one level of naming containers so I had 3 
colons). I've also tried Andrew's subform and am using 2 inputText 
components in case the inputDate is the issue. No dice on all accounts.

Shane


> On Feb 11, 2008 8:30 AM, Shane Petroff <shane@mayet.ca 
> <mailto:shane@mayet.ca>> wrote:
>
>     Andrew Robinson wrote:
>>     Subform is a naming container, so you will have to give it an ID
>>     and use colons to get out and back in.
>
>     OK, when I tried, I didn't explicitly name the subforms, I just
>     used 4 colons. Unfortunately, the subforms (named or not) made
>     things worse. When the subforms were introduced, the value change
>     listener is never called.
>
>
>
>>     Replace the inputDate with an outputText of the same ID -- does
>>     it update?
>>     - If so this is not a PPR problem
>
>     It does not update; this was my original setup. It is not PPR per
>     se, because I slapped a couple of arbitrary text boxes on the form
>     and was able to get them linked very easily, the issue seems to be
>     PPR within the dataTable.
>
>
>
>>     Leave it as an inputDate and use the Firebug extension in Firefox
>>     to view the AJAX response. Does it contain the inputDate?
>
>     I've never really used Firebug before, so forgive me if I've got
>     it wrong, but in Inspect/Console, there appears to be POST entries
>     corresponding to the AJAX calls (Common1_0_5.js line 10680 to be
>     specific). The POST tab indicates what looks to be correct data:
>
>     _idJsp1:_idJsp4:6:finalMarkField 	44
>     _idJsp1:_idJsp4:6:withdrawalDate 	
>     _idJsp1:_idJsp4:7:finalMarkField 	
>     _idJsp1:_idJsp4:7:withdrawalDate 	
>     _idJsp1:_idJsp4:8:finalMarkField 	
>     _idJsp1:_idJsp4:8:withdrawalDate 	
>     _idJsp1:_idJsp4:9:finalMarkField 	
>     _idJsp1:_idJsp4:9:withdrawalDate 	
>     _idJsp1:xxx 	
>     _idJsp1:yyy 	
>     event 	autosub
>     org.apache.myfaces.trinidad.faces.FORM 	_idJsp1
>     org.apache.myfaces.trinidad.faces.STATE 	!5e7200c0
>     partial 	true
>     source 	_idJsp1:_idJsp4:6:finalMarkField
>
>
>     but the response tab make no mention of the date field.
>
>     <?xml version="1.0" ?>
>     <?Tr-XHR-Response-Type ?>
>     <content action="/reportCard/pages/classList.jsf">
>     <body class="page-background">
>
>     <!-- MYFACES JAVASCRIPT -->
>     </body>
>     <fragment><![CDATA[<span id="tr__idJsp1_Postscript"><input
>     type="hidden" name="org.apache.myfaces.trinidad
>     .faces.STATE" value="!5e7200c0"><input type="hidden"
>     name="source"></span>]]></fragment>
>     <script><![CDATA[TrPage.getInstance()._addResetFields('_idJsp1',["source"]);]]></script><script><![CDATA
>     [var _idJsp1_SF={};]]></script></content>
>
>
>
>>     If the above shows that it is not a PPR problem and you don't
>>     want to bother with the subform, put a breakpoint in your set
>>     method to see who is calling it and with what value. The stack
>>     trace should show you the caller and you can determine the phase.
>
>     This I'd done previously, but wasn't able to decipher the results.
>     If I manufacture an exception, then fill in and print it's stack
>     trace, I get the following:
>
>     WARNING: Could not find partial trigger :::finalMarkField from
>     CoreInputText[UIXEditableFacesBeanImpl, id=withdrawalDate]
>     (The warning is generated prior to manufacturing the exception
>     below. This scenario is with no subforms)
>
>     java.lang.Exception
>         at
>     ca.mayet.backing.ClassListBean.finalMarkChanged(ClassListBean.java:188)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at
>     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at
>     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at java.lang.reflect.Method.invoke(Method.java:597)
>         at
>     org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:132)
>         at
>     org.apache.myfaces.trinidad.component.UIXComponentBase.broadcastToMethodBinding(UIXComponentBase.java:1188)
>         at
>     org.apache.myfaces.trinidad.component.UIXEditableValue.broadcast(UIXEditableValue.java:213)
>         at javax.faces.component.UIData.broadcast(UIData.java:517)
>         at
>     javax.faces.component.UIViewRoot._broadcastForPhase(UIViewRoot.java:97)
>         at
>     javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:150)
>         at
>     org.apache.myfaces.lifecycle.ProcessValidationsExecutor.execute(ProcessValidationsExecutor.java:32)
>         at
>     org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:95)
>         at
>     org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:70)
>         at javax.faces.webapp.FacesServlet.service(FacesServlet.java:139)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>         at
>     org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>         at
>     org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._invokeDoFilter(TrinidadFilterImpl.java:253)
>         at
>     org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl._doFilterImpl(TrinidadFilterImpl.java:210)
>         at
>     org.apache.myfaces.trinidadinternal.webapp.TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:164)
>         at
>     org.apache.myfaces.trinidad.webapp.TrinidadFilter.doFilter(TrinidadFilter.java:92)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>         at
>     org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:173)
>         at
>     org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>         at
>     ca.mayet.SessionTimeoutRedirectFilter.doFilter(SessionTimeoutRedirectFilter.java:78)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
>         at
>     org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
>         at
>     org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
>         at
>     org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
>         at
>     org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>         at
>     org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
>         at
>     org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
>         at
>     org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
>         at
>     org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
>         at
>     org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
>         at
>     org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
>         at
>     org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
>         at
>     org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
>         at java.lang.Thread.run(Thread.java:619)
>
>     How can I tell from this information which phase is being
>     executed? I'm assuming that the processValidators call buried in
>     there tells me that it is happening early (before model updates),
>     but the info didn't mean much to me. FWIW, there are no validators
>     attached, unless there is something embedded in the component itself.
>
>>     otherwise, try this:
>
>     except for the names, this is what I'd tried previously.
>     Unfortunately, naming the subforms did not help.
>
>     In any case, thanks for all of your help Andrew.
>
>     Shane
>
>
>
>>     <h:dataTable ...
>>       <h:column>
>>         <f:facet
>>           name="header">
>>           <h:outputText
>>             value="#{bundle.ClassListFinalMarkHeader}"
>>             styleClass="label"/>
>>         </f:facet>
>>         <tr:subform id="finalMarkForm">
>>           <tr:inputText
>>             id="finalMarkField"
>>             columns="5"
>>             value="#{studentSec.finalMark}"
>>             autoSubmit="true"
>>             valueChangeListener="#{classListBean.finalMarkChanged}"/>
>>         </tr:subform>
>>       </h:column>
>>       <h:column>
>>         <f:facet
>>           name="header">
>>           <h:outputText
>>             value="#{bundle.ClassListWithdrawalDateHeader}"
>>             styleClass="label"/>
>>         </f:facet>
>>         <tr:subform id="withdrawalDateForm">
>>           <tr:inputDate
>>             id="withdrawalDate"
>>             columns="11"
>>             partialTriggers=":::finalMarkForm:finalMarkField"
>>             value="#{studentSec.withdrawalDate}"
>>             required="false"/>
>>           <h:message for="withdrawalDate"/>
>>         </tr:subform>
>>       </h:column>
>>
>>     Note that in trinidad 1.x.7 this will become
>>     partialTriggers="::finalMarkForm:finalMarkField" (one less colon).
>>
>>
>>
>>     On Feb 8, 2008 4:26 PM, Shane Petroff <shane@mayet.ca
>>     <mailto:shane@mayet.ca>> wrote:
>>
>>         Andrew Robinson wrote:
>>>         I think I know your problem. It is a phase issue 
>>
>>         I'll take your word for it, but I guess the only thing I
>>         could do to try and trace it through was to set a breakpoint
>>         in the decode method and step through everything.
>>
>>
>>>         and why value change listeners (VCL) suck in JSF (really bad
>>>         architecture)
>>
>>         Is there a better option? Even combos fire value changes.
>>
>>
>>
>>>         The VCL architecture sucks as it is not transaction aware,
>>>         and the events fired in the validation doesn't mean that the
>>>         update will ever be done (so the new value may never become
>>>         the actual value). Also, when the VCL is invoked, the model
>>>         is not updated, so you can't trust values from the model
>>>         layer (beans) since they may have pending changes.
>>>
>>>         I haven't tried it, but add a <tr:subform> around each
>>>         input. This should only validate & update the value that has
>>>         changed instead of the entire form.
>>         Didn't work. I'm using
>>
>>           <h:column>
>>                 <tr:subform>
>>                     <tr:inputText
>>
>>         and similar for the inputDate
>>
>>         One curious thing about this layout is that it can no longer
>>         find partial triggers fields when a normal name is specified
>>         for partialTriggers.
>>
>>         Feb 8, 2008 5:12:16 PM
>>         org.apache.myfaces.trinidadinternal.context.RequestContextImpl
>>         addPartialTriggerListeners
>>         WARNING: Could not find partial trigger finalMarkField from
>>         CoreInputDate[UIXEditableFacesBeanImpl, id=_idJsp14]
>>
>>         I tried the preceding colons as well (4 of them this time
>>         because of the additional nesting), but no luck there either.
>>
>>         Surely I'm not the first person to try to use PPR/ValueChange
>>         on an editable table am I?
>>
>>
>>>
>>>         On Feb 8, 2008 1:14 PM, Shane Petroff <shane@mayet.ca
>>>         <mailto:shane@mayet.ca>> wrote:
>>>
>>>             Andrew Robinson wrote:
>>>>
>>>>             What trinidad build are you using?
>>>
>>>             Trinidad 1.0.5,
>>>             MyFaces Core 1.1.5
>>>
>>>
>>>
>>>>             colons should not be necessary for components in the
>>>>             same naming container.
>>>
>>>             Tried with and without. Using the colons clearly does
>>>             not work because it issues the warning:
>>>
>>>             WARNING: Could not find partial trigger
>>>             :::finalMarkField from
>>>             CoreInputDate[UIXEditableFacesBeanImpl, id=_idJsp12]
>>>
>>>             With no preceding colons there is no warning generated,
>>>             but the field is never refreshed either. The value
>>>             change method is below, as is a stripped down jsp. I can
>>>             see the value change being fired, but where would I even
>>>             set a breakpoint to tell if anything is happening on the
>>>             partialTriggers side?
>>>
>>>
>>>
>>>
>>>                 public void finalMarkChanged( ValueChangeEvent event )
>>>                 {
>>>                     StudentSection ss = (StudentSection)
>>>             m_Table.getRowData();
>>>                     ss.setWithdrawalDate(new Date()); // I'm
>>>             assuming that this instance is still around to refresh
>>>             the field from
>>>
>>>                     System.out.println( "finalMarkChanged for " +
>>>             ss.getStudentName() + " " + ss.getWithdrawalDate() );
>>>                 }
>>>
>>>
>>>             <f:view>
>>>
>>>             <tr:document title="#{bundle.ClassListHeader}">
>>>
>>>
>>>             <body class="page-background">
>>>
>>>             <h:form>
>>>
>>>               <h:panelGrid headerClass="page-header" styleClass="panel"
>>>                            columns="1" cellpadding="5">
>>>
>>>                 <h:messages showDetail="true" showSummary="false"
>>>             styleClass="errors"/>
>>>
>>>                 <h:dataTable styleClass="dataTable"
>>>                              rowClasses="list-row-even,list-row-odd"
>>>             cellpadding="4" border="0"
>>>                              headerClass="list-header"
>>>                              cellspacing="0"
>>>                              value="#{classListBean.studentSections}"
>>>                              var="studentSec"
>>>                              binding="#{classListBean.table}">
>>>
>>>                   <h:column>
>>>                     <f:facet name="header">
>>>                       <h:commandLink styleClass="table-header"
>>>             id="studentDesc"
>>>                                     
>>>             actionListener="#{classListBean.sort}">
>>>                         <h:outputText
>>>             value="#{bundle.StudentColHeader}"/>
>>>                       </h:commandLink>
>>>                     </f:facet>
>>>                     <h:outputText value="#{studentSec.studentName}"/>
>>>                   </h:column>
>>>
>>>                   <h:column>
>>>                     <f:facet name="header">
>>>                         <h:outputText
>>>             value="#{bundle.ClassListFinalMarkHeader}"
>>>             styleClass="label"/>
>>>                     </f:facet>
>>>                     <tr:inputText id="finalMarkField"
>>>                                   columns="5"
>>>                                   value="#{studentSec.finalMark}"
>>>                                   autoSubmit="true"
>>>                                  
>>>             valueChangeListener="#{classListBean.finalMarkChanged}"/>
>>>                   </h:column>
>>>
>>>                   <h:column>
>>>                     <f:facet name="header">
>>>                         <h:outputText
>>>             value="#{bundle.ClassListWithdrawalDateHeader}"
>>>             styleClass="label"/>
>>>                     </f:facet>
>>>                     <tr:inputDate columns="11"
>>>
>>>                                   partialTriggers=":::finalMarkField"
>>>                                   value="#{studentSec.withdrawalDate}"
>>>                                   required="false" >
>>>                         <f:convertDateTime pattern="dd-MMM-yyyy"
>>>             timeZone="#{configBundle.TimeZone}"/>
>>>                     </tr:inputDate>
>>>                   </h:column>
>>>
>>>                 </h:dataTable>
>>>
>>>               </h:panelGrid>
>>>
>>>             </h:form>
>>>
>>>             </body>
>>>
>>>             </tr:document>
>>>
>>>             </f:view>
>>>
>>>
>>>>
>>>>
>>>>             On Feb 8, 2008 10:31 AM, Shane Petroff <shane@mayet.ca
>>>>             <mailto:shane@mayet.ca>> wrote:
>>>>
>>>>                 Matthias Wessendorf wrote:
>>>>                 > ah,
>>>>                 > I just noticed, that "finalMarkField" is inside a
>>>>                 table (naming container).
>>>>                 > haven't read your code carefully, sorry.
>>>>                 >
>>>>                 > can you *try* partialTriggers=":::finalMarkField" ?
>>>>                 >
>>>>
>>>>                 No joy... cleared the browser cache first, then
>>>>                 dumped tomcat's cache,
>>>>                 did a full build and restarted the server. I also
>>>>                 tried :: and ::::
>>>>                 variants (3 does appear to be the correct number
>>>>                 though based on the
>>>>                 generated html), but still no partial triggers
>>>>                 refresh. Would it be more
>>>>                 likely to work if I switched to a tr:table?
>>>>
>>>>                 --
>>>>                 Shane
>>>>
>>>>
>>>             -- 
>>>             Shane
>>>
>>>
>>
>>
>>         -- 
>>         Shane
>>
>>
>
>
>     -- 
>     Shane
>
>


-- 
Shane


Mime
View raw message