7 Replies Latest reply on May 10, 2007 12:13 PM by fleury

    Configuring Facelets into Seam

    fleury

      Hey,

      I have some troubles to configure a custom facelet tag library.

      Configuration files :

      faces-config.xml :

      <?xml version='1.0' encoding='UTF-8'?>
      <!DOCTYPE faces-config PUBLIC
      "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
      "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">

      <faces-config>


      <message-bundle>messages</message-bundle>
      <!-- Disabled when using Ajax4JSF -->
      <!--
      <view-handler>org.jboss.seam.ui.facelet.SeamFaceletViewHandler</view-handler>
      -->


      <!-- Seam transaction management -->

      <phase-listener>org.jboss.seam.jsf.TransactionalSeamPhaseListener</phase-listener>


      <!-- No Seam transaction management -->
      <!--

      <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>

      -->

      </faces-config>


      web.xml


      <?xml version="1.0" ?>
      <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
      version="2.4">

      <!-- Ajax4jsf (must come first!) -->


      <display-name>Ajax4jsf Filter</display-name>
      <filter-name>ajax4jsf</filter-name>
      <filter-class>org.ajax4jsf.Filter</filter-class>


      <filter-mapping>
      <filter-name>ajax4jsf</filter-name>
      <url-pattern>*.seam</url-pattern>
      </filter-mapping>

      <context-param>
      <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
      <param-value>org.jboss.seam.ui.facelet.SeamFaceletViewHandler</param-value>
      </context-param>

      <context-param>
      <param-name>org.ajax4jsf.SKIN</param-name>
      <param-value>blueSky</param-value>
      </context-param>

      <!-- Seam -->


      <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>



      <filter-name>Seam Filter</filter-name>
      <filter-class>org.jboss.seam.web.SeamFilter</filter-class>


      <filter-mapping>
      <filter-name>Seam Filter</filter-name>
      <url-pattern>/*</url-pattern>
      </filter-mapping>


      <servlet-name>Seam Resource Servlet</servlet-name>
      <servlet-class>org.jboss.seam.servlet.ResourceServlet</servlet-class>


      <servlet-mapping>
      <servlet-name>Seam Resource Servlet</servlet-name>
      <url-pattern>/seam/resource/*</url-pattern>
      </servlet-mapping>

      <!-- MyFaces -->


      <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>


      <!-- Facelets tag libraries (semi-colon separated) -->
      <context-param>
      <param-name>facelets.LIBRARIES</param-name>
      <param-value>/WEB-INF/jbpm-tf.taglib.xml</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.STATE_SAVING_METHOD</param-name>
      <param-value>client</param-value>
      </context-param>

      <context-param>
      <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
      <param-value>.xhtml</param-value>
      </context-param>


      <servlet-name>Faces Servlet</servlet-name>
      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
      <load-on-startup>1</load-on-startup>


      <servlet-mapping>
      <servlet-name>Faces Servlet</servlet-name>
      <url-pattern>*.seam</url-pattern>
      </servlet-mapping>

      <security-constraint>
      <display-name>Restrict raw XHTML Documents</display-name>
      <web-resource-collection>
      <web-resource-name>XHTML</web-resource-name>
      <url-pattern>*.xhtml</url-pattern>
      </web-resource-collection>
      <auth-constraint>
      <role-name>NONE</role-name>
      </auth-constraint>
      </security-constraint>

      </web-app>


      jpbm-tf.taglib.xml


      <?xml version="1.0"?>

      <!DOCTYPE facelet-taglib PUBLIC
      "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
      "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

      <facelet-taglib>
      <library-class>cns.genoscope.console.TaskFormLibrary</library-class>
      </facelet-taglib>


      I gtot the following exception :


      16:27:32,928 ERROR [STDERR] 10 mai 2007 16:27:32 com.sun.facelets.FaceletViewHandler initializeCompiler
      GRAVE: Error Loading Library: /WEB-INF/jbpm-tf.taglib.xml
      java.io.IOException: Error parsing [jndi:/localhost/seam_console/WEB-INF/jbpm-tf.taglib.xml]:
      at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:398)
      at com.sun.facelets.FaceletViewHandler.initializeCompiler(FaceletViewHandler.java:268)
      at com.sun.facelets.FaceletViewHandler.initialize(FaceletViewHandler.java:155)
      at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:516)
      at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
      at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:229)
      at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63)
      at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:60)
      at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
      at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
      at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
      at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57)
      at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
      at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:79)
      at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:49)
      at org.jboss.seam.web.SeamFilter.doFilter(SeamFilter.java:84)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:96)
      at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:220)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
      at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
      at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
      at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
      at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112)
      at java.lang.Thread.run(Thread.java:595)
      Caused by: org.xml.sax.SAXException: Error Handling [jndi:/localhost/seam_console/WEB-INF/jbpm-tf.taglib.xml@8,71] <library-class>
      at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.endElement(TagLibraryConfig.java:259)
      at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
      at org.apache.xerces.impl.dtd.XMLDTDValidator.endNamespaceScope(Unknown Source)
      at org.apache.xerces.impl.dtd.XMLDTDValidator.handleEndElement(Unknown Source)
      at org.apache.xerces.impl.dtd.XMLDTDValidator.endElement(Unknown Source)
      at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
      at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
      at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
      at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
      at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
      at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
      at javax.xml.parsers.SAXParser.parse(Unknown Source)
      at javax.xml.parsers.SAXParser.parse(Unknown Source)
      at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:395)
      ... 43 more
      Caused by: java.lang.Exception: cns.genoscope.console.TaskFormLibrary must be an instance of com.sun.facelets.tag.TagLibrary
      at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.createClass(TagLibraryConfig.java:281)
      at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.processLibraryClass(TagLibraryConfig.java:327)
      at com.sun.facelets.compiler.TagLibraryConfig$LibraryHandler.endElement(TagLibraryConfig.java:167)
      ... 58 more
      16:27:33,450 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/ajax4jsf-1.1.1-SNAPSHOT.jar!/META-INF/a4j.taglib.xml
      16:27:33,458 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jboss-seam-pdf.jar!/META-INF/seam-pdf.taglib.xml
      16:27:33,472 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/tmp/deploy/tmp10076seam_console.ear-contents/jsf-facelets.jar!/META-INF/jstl-core.taglib.xml
      16:27:33,477 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-core.taglib.xml
      16:27:33,484 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jboss-seam-mail.jar!/META-INF/seam-mail.taglib.xml
      16:27:33,540 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-core.taglib.xml
      16:27:33,566 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/tmp/deploy/tmp10076seam_console.ear-contents/jsf-facelets.jar!/META-INF/jstl-fn.taglib.xml
      16:27:33,576 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/tmp/deploy/tmp10076seam_console.ear-contents/jsf-facelets.jar!/META-INF/jsf-html.taglib.xml
      16:27:33,582 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-fn.taglib.xml
      16:27:33,607 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/tmp/deploy/tmp10076seam_console.ear-contents/jsf-facelets.jar!/META-INF/jsf-ui.taglib.xml
      16:27:33,614 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-ui.taglib.xml
      16:27:33,674 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit
      INFO: Added Library from: jar:file:/home/lfleury/jboss-4.0.5.GA/server/default/./tmp/deploy/tmp10076seam_console.ear-contents/seam_console-exp.war/WEB-INF/lib/richfaces-3.0.1-SNAPSHOT.jar!/META-INF/rich.taglib.xml
      16:27:33,684 ERROR [STDERR] 10 mai 2007 16:27:33 com.sun.facelets.compiler.TagLibraryConfig loadImplicit


      Thank you for your help

      LF



        • 1. Re: Configuring Facelets into Seam
          pmuir

          Post the cns.genoscope.console.TaskFormLibrary class

          • 2. Re: Configuring Facelets into Seam
            fleury

            The TaskFormLibrary class :

            package cns.genoscope.console;

            import com.sun.facelets.tag.AbstractTagLibrary;
            import com.sun.facelets.tag.TagLibrary;

            import javax.faces.context.FacesContext;
            import javax.faces.application.Application;

            public final class TaskFormLibrary extends AbstractTagLibrary {
            public TaskFormLibrary() {
            super("http://jbpm.org/jsf/tf");

            final FacesContext facesContext = FacesContext.getCurrentInstance();
            final Application application = facesContext.getApplication();

            // Task form environment setup
            application.addComponent("org.jbpm.tf.TaskForm", "org.jbpm.webapp.tag.tf.ui.TaskForm");
            addComponent("taskForm", "org.jbpm.tf.TaskForm", null);

            // Task form include tag
            addTagHandler("includeTaskForm", IncludeTaskFormHandler.class);

            }
            }


            Thanks

            • 3. Re: Configuring Facelets into Seam
              pmuir

              Odd, I think you have a classloading problem. Is the TaskFormLibarary in the war classes? Check you don't have more than one copy of facelets.jar hanging around.

              Why not just use xml to set up your components?

              • 4. Re: Configuring Facelets into Seam
                fleury

                Thank you Petemuir for your help

                I'm using Jboss server (jboss-4.0.5.GA) and my TaskFormLibrary class appears only in the subdirectory jar of the exploded-archives folder, with the other classes of my session beans but not in the war subdirectory. Found no copy of facelets.jar.


                Why not just use xml to set up your components?


                Could you show me how to use xml for my tag library ?

                Thanks


                • 5. Re: Configuring Facelets into Seam
                  fleury

                  Petemuir, I'm coming back to this point :

                  Check you don't have more than one copy of facelets.jar hanging around.


                  I have a jsf-facelets.jar file in the lib directory and this declaration in my application.xml file :


                  jsf-facelets.jar



                  Is this the right configuration ?
                  If i remove this declaration, i get the expected exception :

                  java.lang.NoClassDefFoundError: com/sun/facelets/tag/AbstractTagLibrary


                  Thank you for your reply

                  • 6. Re: Configuring Facelets into Seam
                    pmuir

                    You need to have jsf-facelets.jar in WEB-INF/lib (stuff *will* break otherwise) and if you want to do the ClassLibrary in code, you'll need to make sure its on the war classloader.

                    https://facelets.dev.java.net/nonav/docs/dev/docbook.html#taglib-create (or look at the jboss-seam-ui.jar/META-INF/*.taglib.xml for an example) - the xml way of declaring tags is *much* easier.

                    • 7. Re: Configuring Facelets into Seam
                      fleury

                      ok, I look the jboss-seam-ui.jar/META-INF/*.taglib.xml for an example

                      Again, thanks a lot petemuir for your help