1 2 Previous Next 20 Replies Latest reply on May 9, 2012 2:14 PM by kenfinni

    Seam Messages

    andre.pankraz

      Hello,

      i use Portletbridge 2 Snapshot with Seam 2.2.0 GA in JBoss Portal 2.7.2.

      Very often i see:

      11:37:53,090 ERROR [SeamExceptionHandlerImpl] Unable to process exception with Seam exception handler
      java.lang.ClassCastException: org.jboss.seam.faces.FacesMessages cannot be cast to org.jboss.portletbridge.seam.FacesMessages
       at org.jboss.portletbridge.seam.FacesMessages.instance(FacesMessages.java:91)
       at org.jboss.portletbridge.SeamExceptionHandlerImpl.handleException(SeamExceptionHandlerImpl.java:140)
       at org.jboss.portletbridge.SeamExceptionHandlerImpl.handleViewSetup(SeamExceptionHandlerImpl.java:93)
       at org.jboss.portletbridge.SeamExceptionHandlerImpl.processRenderException(SeamExceptionHandlerImpl.java:85)
       at org.jboss.portletbridge.AjaxPortletBridge.doFacesRequest(AjaxPortletBridge.java:665)
       at javax.portlet.faces.GenericFacesPortlet.doFacesDispatch(GenericFacesPortlet.java:598)
       at javax.portlet.faces.GenericFacesPortlet.doView(GenericFacesPortlet.java:486)
       at javax.portlet.GenericPortlet.doDispatch(GenericPortlet.java:328)
       at javax.portlet.faces.GenericFacesPortlet.doDispatch(GenericFacesPortlet.java:457)
       at javax.portlet.GenericPortlet.render(GenericPortlet.java:233)
      


      Have i forgotten some configuration?


      Another problem is the usage of "%" as first character in an input field.

      Caused by: java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
       at java.net.URLDecoder.decode(URLDecoder.java:168)
       at org.jboss.portletbridge.context.PortalActionURL.decodeURL(PortalActionURL.java:100)
       at org.jboss.portletbridge.context.PortalActionURL.setQueryString(PortalActionURL.java:318)
       at org.jboss.portletbridge.context.PortalActionURL.<init>(PortalActionURL.java:93)
       at org.jboss.portletbridge.context.AbstractExternalContext.encodeActionURL(AbstractExternalContext.java:517)
       at org.jboss.seam.ui.util.ViewUrlBuilder.getEncodedUrl(ViewUrlBuilder.java:52)
       at org.jboss.seam.ui.component.UISeamCommandBase.getUrl(UISeamCommandBase.java:120)
       at org.jboss.seam.ui.renderkit.LinkRendererBase.doEncodeBegin(LinkRendererBase.java:26)
       at org.jboss.seam.ui.util.cdk.RendererBase.encodeBegin(RendererBase.java:79)
       at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813)
       at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:275)
       at org.richfaces.renderkit.AbstractTableRenderer.encodeHeaderFacets(AbstractTableRenderer.java:299)
       at org.richfaces.renderkit.AbstractTableRenderer.encodeHeader(AbstractTableRenderer.java:192)
       at org.richfaces.renderkit.AbstractTableRenderer.encodeTableStructure(AbstractTableRenderer.java:159)
       at org.richfaces.renderkit.html.DataTableRenderer.doEncodeBegin(DataTableRenderer.java:160)
       at org.richfaces.renderkit.html.DataTableRenderer.doEncodeBegin(DataTableRenderer.java:148)
       at org.ajax4jsf.renderkit.RendererBase.encodeBegin(RendererBase.java:100)
       at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813)
       at javax.faces.component.UIData.encodeBegin(UIData.java:962)
       at org.ajax4jsf.component.UIDataAdaptor.encodeBegin(UIDataAdaptor.java:1202)
       at org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:275)
       at org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:258)
       at org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:220)
       at org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:215)
       at org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:120)
       at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837)
       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
       at javax.faces.component.UIComponent.encodeAll(UIComponent.java:942)
       at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:592)
       at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
       at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
       at org.jboss.portletbridge.lifecycle.RenderResponsePhase.executePhase(RenderResponsePhase.java:58)
       at org.jboss.portletbridge.lifecycle.LifecyclePhase.execute(LifecyclePhase.java:72)
       ... 236 more
      


      Any ideas?

      Best regards,
      André

        • 1. Re: Seam Messages
          andre.pankraz

          Another cast problem with seam-debug debug.xhtml:

          15:18:51,958 ERROR [LifecyclePhase] Error to execute beforePhase RENDER_RESPONSE 6 method for listener
          java.lang.ClassCastException: org.jboss.portletbridge.richfaces.BufferedRenderResponseWrapper cannot be cast to javax.servlet.http.HttpServletResponse
           at org.jboss.seam.debug.jsf.SeamDebugPhaseListener.beforePhase(SeamDebugPhaseListener.java:48)
           at org.jboss.portletbridge.lifecycle.LifecyclePhase.execute(LifecyclePhase.java:65)
           at org.jboss.portletbridge.lifecycle.PortletLifecycle.render(PortletLifecycle.java:155)
          


          • 2. Re: Seam Messages
            andre.pankraz

            And another problem...org.jboss.portletbridge.richfaces.resource.PortletScriptRenderer:

             String scriptId = context.getPathInfo();
             OutputStream out = context.getOutputStream();
             scriptId = scriptId.substring(scriptId.lastIndexOf("/") + 1);
            


            context is PortletRessourceContext, which delivers:
             public String getPathInfo() {
             return null;//request.getPathInfo();
             }
            


            so we get NullPointer by default.


            Hmmm...problem overload ;)

            • 3. Re: Seam Messages
              andre.pankraz

              short update to first of 4 problems so far...

              there is a file seam.properties missing in portletbridge-impl.jar (include empty one under src/main/ressource).

              without this the following component is never injected:

              package org.jboss.portletbridge.seam;
               ...
              
              import javax.faces.application.FacesMessage;
              import java.util.ArrayList;
              import java.util.Iterator;
              import java.util.List;
              
              /**
               * @author Joseph Berdat
               */
              
              @SuppressWarnings("serial")
              @Scope(ScopeType.CONVERSATION)
              @Name(StatusMessages.COMPONENT_NAME)
              @Install(precedence=DEPLOYMENT, classDependencies="javax.faces.context.FacesContext")
              @BypassInterceptors
              public class FacesMessages extends org.jboss.seam.faces.FacesMessages {
              



              now we get:

              16:48:10,521 INFO [Component] Component: org.jboss.seam.international.statusMessages, scope: CONVERSATION, type: JAVA_BEAN, class: org.jboss.portletbridge.seam.FacesMessages


              and no more class cast exceptions.

              • 4. Re: Seam Messages
                alexsmirnov

                Thank your for deep investigation, it is very helpful. I already fixed ExceptionHandler for Seam, with your advise.
                The problem with invalid characters in s:link and s:button parameters is much deeper. I recently fixed URL parameters encoding/decoding in the bridge but that breaks the old workaround for the same issue in Seam code. I afraid it is not possible to fix that issue without compatibility problems, sorry.
                PortletScriptRenderer is going to be moved from separate project into bridge-impl because bridge itself needs a custom resource manager that renders resources URL's as portlet ResourceURL.

                • 5. Re: Seam Messages
                  andre.pankraz

                  Thx,

                  good work!

                  concerning the trailing "%" problem:

                  The problem only occurs in the render phase and not in "processAction" phase -> handleNavigation() -> decodeUrl(), because there % is encoded as %25 as necessary.

                  In the render phase a link is created:

                  HtmlLink.getUrl() -> ViewUrlBuilder.getEncodedUrl() -> RenderPortletExternalContextImpl.encodeActionUrl() -> PortalActionURL. -> PortalActionURL.setQueryString() -> decodeUrl() ????

                  Why decodeUrl() is called in the encodeActionUrl phase? Shouldn't this be encodeUrl? The input parameter is % here and this is the problem.


                  Best regards,
                  André

                  • 6. Re: Seam Messages
                    andre.pankraz

                    decode is OK...problem is, the function
                    AbstractExternalContext.encodeActionUrl()
                    is called with encoded url parameters in action phase and without url encoded parameters for link creation in render phase.

                    in seam-ui 2.2.0 in UISeamCommandBase we find:
                    ViewUrlBuilder url = new ViewUrlBuilder(viewId, getFragment(), !isPortletRequest(getFacesContext()));


                    so this is intended behaviour in portlet environment...very strange to me, without this addition in seam-ui this stuff would work?! what was the intention? ok the seam guys know...


                    or should it be the other way around and the action phase should have decoded the url parameters before the callout to AbstractExternalContext.encodeActionUrl()?


                    One or the other way has to be the correct one and i have no problems patching the code for our environment because this is a show stopper (under many, see Seam context problem...). I cannot say to the customer, sry...don't use %, all is OK.


                    Best regards,
                    André

                    • 7. Re: Seam Messages
                      alexsmirnov

                      That is problem in the Seam s:link and s:button renderer base class UISeamCommandBase has been inspired by me far ago ( sorry about my mistake ) as incorrect fix for portlet environment. Because I fixed encoding in bridge, the old workaround becomes a problem.
                      removing that check form Seam code could inspire a versions incompatibility mess.
                      We can provide custom version of seam command renderer with Bridge 2.0 release. The other idea seems like as ugly hack, but it may work: isPortletRequest relays on static field with PortletRequest class so Bridge could use reflection to clear that field and return Seam command renderer to encoding parameter values in all request types.

                      • 8. Re: Seam Messages
                        alexsmirnov

                        Good news: the problem with ScriptRenderer has been resolved.

                        • 9. Re: Seam Messages
                          andre.pankraz

                          thx, really thx,

                          great work!
                          thx for clarification, with the hints i can patch it myself and later integrate the final solution (patching seam-ui class or your reflection hint or adding phase-isrenderphase check in bridge encodeURL or something like that)


                          i have allready checked the script renderer stuff (fisheye RSS is nice).
                          No exceptions, running fine.

                          I have a strange problem though. After my Conversation Context Fix (see ejb-transaction thread) i can run seam-gen app portlets.

                          They use Richfaces and i have copied your updated settings out of the example (see web.xml attached).


                          I get 8 Requests for the single seam-gen List-Portlet.
                          Main request: http://localhost:8080/portal/portal/default/IFOS+Fachadmin
                          Following:
                          404: http://localhost:8080/ifosApp/faces/rfRes/org/ajax4jsf/framework.pack.js
                          404: http://localhost:8080/ifosApp/faces/rfRes/org/richfaces/ui.pack.js
                          200, CSS OK: http://localhost:8080/portal/portal/default/IFOS+Fachadmin/blogPortletWindow?id=%2Fstylesheet%2Ftheme.css&action=f&cacheability=PAGE
                          200, is Login Page, dont know why: http://localhost:8080/portal/auth/portal/default/IFOS+Fachadmin
                          200, but is full HTML page, not an image: http://localhost:8080/portal/portal/default/IFOS+Fachadmin/blogPortletWindow?rfRes=org.richfaces.renderkit.html.GradientA&action=b&cacheability=PAGE&DATA=%2FB%2FeAH7%21%213Tj2v7mAAZZAV3
                          200, but is full html page not an image: http://localhost:8080/portal/portal/default/IFOS+Fachadmin/blogPortletWindow?rfRes=org.richfaces.renderkit.html.images.SliderFieldGradient&action=b&cacheability=PAGE&DATA=%2FB%2FeAH79-XN%21%21%21%21mQAaRgXe
                          200, but is full html page, not an image: http://localhost:8080/portal/portal/default/IFOS+Fachadmin/blogPortletWindow?rfRes=org.richfaces.renderkit.images.TabGradientB&action=b&cacheability=PAGE&DATA=%2FB%2FeAH7%21%21%21%21%213vHmAAaGQWj


                          The portlet page is rendered 4 times, because the gradient images are also rendered as full portal HTML pages (4 full requests with SQL selects).
                          If i run the app out of portlet environment, and check the image links, i get gradient images.
                          e.g.: http://localhost:8080/ifosApp/rfResorg.richfaces.renderkit.html.images.SliderFieldGradient/DATB/eAH79-XN!!!!mQAaRgXe.xhtml
                          if i run in the portlet environment, i get 4 page requests and no images.

                          i have updatet to the today svn code...strange.

                          <?xml version="1.0" encoding="UTF-8"?>
                          <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
                           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
                           <display-name>IFOS</display-name>
                           <description>IFOS - Interaktiven FOrtbildungsSystem fuer die BUNDesverwaltung</description>
                           <!-- Ajax4jsf -->
                           <context-param>
                           <param-name>org.jboss.portletbridge.WRAP_SCRIPTS</param-name>
                           <param-value>true</param-value>
                           </context-param>
                           <context-param>
                           <param-name>org.jboss.portletbridge.ExceptionHandler</param-name>
                           <param-value>org.jboss.portletbridge.SeamExceptionHandlerImpl</param-value>
                           </context-param>
                           <context-param>
                           <param-name>javax.faces.LIFECYCLE_ID</param-name>
                           <param-value>SEAM_PORTLET</param-value>
                           </context-param>
                          
                           <context-param>
                           <param-name>javax.portlet.faces.RENDER_POLICY</param-name>
                           <param-value>ALWAYS_DELEGATE</param-value>
                           </context-param>
                           <context-param>
                           <param-name>javax.portlet.faces.preserveActionParams</param-name>
                           <param-value>true</param-value>
                           </context-param>
                           <context-param>
                           <param-name>org.ajax4jsf.RESOURCE_URI_PREFIX</param-name>
                           <param-value>rfRes</param-value>
                           </context-param>
                           <!--
                           <context-param>
                           <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
                           <param-value>false</param-value>
                           </context-param>
                           -->
                           <context-param>
                           <param-name>org.richfaces.SKIN</param-name>
                           <param-value>blueSky</param-value>
                           </context-param>
                           <context-param>
                           <param-name>org.richfaces.LoadStyleStrategy</param-name>
                           <param-value>DEFAULT</param-value>
                           </context-param>
                           <context-param>
                           <param-name>org.richfaces.LoadScriptStrategy</param-name>
                           <param-value>ALL</param-value>
                           </context-param>
                           <!-- Facelets development mode (disable in production) -->
                           <context-param>
                           <param-name>facelets.DEVELOPMENT</param-name>
                           <param-value>true</param-value>
                           </context-param>
                          
                           <!-- JSF -->
                           <context-param>
                           <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
                           <param-value>.xhtml</param-value>
                           </context-param>
                           <context-param>
                           <param-name>facelets.VIEW_MAPPINGS</param-name>
                           <param-value>*.xhtml</param-value>
                           </context-param>
                          
                           <filter>
                           <filter-name>Seam Filter</filter-name>
                           <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
                           </filter>
                           <filter-mapping>
                           <filter-name>Seam Filter</filter-name>
                           <servlet-name>Faces Servlet</servlet-name>
                           <dispatcher>FORWARD</dispatcher>
                           <dispatcher>REQUEST</dispatcher>
                           <dispatcher>INCLUDE</dispatcher>
                           </filter-mapping>
                           <listener>
                           <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
                           </listener>
                           <servlet>
                           <servlet-name>Seam Resource Servlet</servlet-name>
                           <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
                           </servlet>
                           <servlet>
                           <servlet-name>Faces Servlet</servlet-name>
                           <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
                           <load-on-startup>1</load-on-startup>
                           </servlet>
                           <servlet-mapping>
                           <servlet-name>Seam Resource Servlet</servlet-name>
                           <url-pattern>/seam/resource/*</url-pattern>
                           </servlet-mapping>
                           <servlet-mapping>
                           <servlet-name>Faces Servlet</servlet-name>
                           <url-pattern>*.xhtml</url-pattern>
                           </servlet-mapping>
                           <session-config>
                           <!--
                           in minutes, less than the SFSB timeout, default is 30 minutes in
                           jboss, see comments to standardjboss.xml / max-bean-life in seam
                           reference documentation
                           -->
                           <session-timeout>29</session-timeout>
                           </session-config>
                           <security-constraint>
                           <!--
                           prevent download of Seam's "*.page.xml", cannot restrict less than
                           "*.xml", siehe auch "Arten von Pattern" unter
                           https://wiki.imise.uni-leipzig.de/Themen/WebApp/WebXml
                           -->
                           <web-resource-collection>
                           <web-resource-name>no_access</web-resource-name>
                           <url-pattern>*.xml</url-pattern>
                           </web-resource-collection>
                           <auth-constraint />
                           </security-constraint>
                           <login-config>
                           <auth-method>BASIC</auth-method>
                           </login-config>
                          </web-app>
                          


                          • 10. Re: Seam Messages
                            andre.pankraz

                            gradient images are working with the today version, for instance

                            http://localhost:8080/portal/portal/default/IFOS+Fachadmin/blogPortletWindow?rfRes=org.richfaces.renderkit.html.GradientA&action=b&cacheability=PAGE&DATA=%2FB%2FeAH7%21%213Tj2v7mAAZZAV3

                            is really a gradient image now, only one backend page request.

                            thx a lot!


                            only the lines



                            in jboss_portlet for seamBookingPortlet should be checked, i get 404 for this ressources...like expected.

                            • 11. Re: Seam Messages
                              andre.pankraz

                              I have found out the problem with resource links like:

                              - /ifosApp/faces/rfResorg/richfaces/renderkit/html/css/basic_both.xcss
                              - /ifosApp/faces/rfRes/org/ajax4jsf/framework.pack.js

                              they where all invalid (404) for my web application.

                              According to Seam docu 30.1.4.6 Seam includes Ajax4jfs filter. But this doesn't work for Resource Requests, even if the Seam Servlet delivers /faces/*.

                              So i included the ajax4jsf config only for delivering these resources, seam includes ajax4jfs for the remaining tasks by itself:

                              &lt;filter>
                              &lt;display-name>Ajax4jsf Filter&lt;/display-name>
                              &lt;filter-name>ajax4jsf&lt;/filter-name>
                              &lt;filter-class>org.ajax4jsf.Filter&lt;/filter-class>
                              &lt;/filter>
                              &lt;filter-mapping>
                              &lt;filter-name>ajax4jsf&lt;/filter-name>
                              &lt;url-pattern>/faces/*&lt;/url-pattern>
                              &lt;dispatcher>FORWARD&lt;/dispatcher>
                              &lt;dispatcher>REQUEST&lt;/dispatcher>
                              &lt;dispatcher>INCLUDE&lt;/dispatcher>
                              &lt;/filter-mapping>

                              context-param:
                              org.ajax4jsf.RESOURCE_URI_PREFIX -> rfRes (like in example)



                              Small additional hint:

                              seamBooking example "import.sql" includes datasets like this:

                              insert into Hotel (id, price, name, address, city, state, zip, country) values (20, 250, 'Meliá White House', 'Albany Street', 'Regents Park London', '', 'NW13UP', 'Great Britain')

                              Oracle considers empty strings '' as null.

                              you should uncomment NotNull in Hotel.java:

                              @Length(min=2, max=10) // @NotNull
                              public String getState()
                              {
                              return state;
                              }

                              • 12. Re: Seam Messages
                                andre.pankraz

                                Hi,


                                more tests...

                                Seam Filters doesn't work with your Seam settings, maybe thats the reason why ajax4jsf Filter isn't installed correctly through Seam (see above) e.g. following test is never called in portlet mode.:

                                package de.init.bakoev.ifos.app.util;
                                
                                import java.io.IOException;
                                
                                import javax.servlet.FilterChain;
                                import javax.servlet.ServletException;
                                import javax.servlet.ServletRequest;
                                import javax.servlet.ServletResponse;
                                
                                import org.jboss.seam.ScopeType;
                                import org.jboss.seam.annotations.Name;
                                import org.jboss.seam.annotations.Scope;
                                import org.jboss.seam.annotations.Startup;
                                import org.jboss.seam.annotations.intercept.BypassInterceptors;
                                import org.jboss.seam.web.AbstractFilter;
                                
                                @Startup
                                @Scope(ScopeType.APPLICATION)
                                @Name("standaloneFilter")
                                @BypassInterceptors
                                // @Filter(within = "org.jboss.seam.web.ajax4jsfFilter")
                                public class StandaloneFilter extends AbstractFilter {
                                
                                 @Override
                                 public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
                                 final FilterChain filterChain) throws IOException, ServletException {
                                 System.out.println("###FILTER!");
                                 filterChain.doFilter(servletRequest, servletResponse);
                                 }
                                
                                }
                                


                                Quite severe bug?


                                Minor Bug:

                                Seam Captcha doesn't work in portlet mode, seems the answer changes over process-request or some caching problem:
                                <h:inputText id="verifyCaptcha" required="true"
                                 value="#{captcha.response}" />
                                <h:message for="verifyCaptcha" />
                                



                                Another iInteresting Bug:

                                I have 3 Portlets on one Page, than i get too deep recursion javascript probleme if i load the richfaces js three times (like your example template does):
                                line 3165 in framework.pack.js:
                                }else{if(LOG._onkeydown){LOG._onkeydown(G)


                                you shouldn't place this stuff into the portlets, even for GateIn.


                                Best regards,
                                Andre

                                • 13. Re: Seam Messages
                                  andre.pankraz

                                  to the last problem, the richfaces seam portlets are crazy slow if i have multiple portlets on a page. (inputText fields)

                                  IE even shows out of mem, firefox is very slow.

                                  has nothing to do with loading js once or multiple times, even only loading it once results in very laggy inputText fields.


                                  no ajax4jsf stuff used...a simple
                                  <h:inputText id="nutzername" required="true"
                                  value="#{nutzer.nutzername}" />

                                  • 14. Re: Seam Messages
                                    andre.pankraz

                                    forget the js problems, the problem was multiple
                                    <a:log hotkey="D" />
                                    in each portlet one, resulting in the -> too deep recursion


                                    the other 2 problems remain, no seam filters called and seam captchas not working

                                    1 2 Previous Next