You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@struts.apache.org by cr...@apache.org on 2006/01/25 21:09:35 UTC

svn commit: r372303 - in /struts/shale/trunk: tiger/ tiger/nbproject/ tiger/src/java/org/apache/shale/tiger/faces/ tiger/src/java/org/apache/shale/tiger/register/ tiger/src/test/org/apache/shale/tiger/faces/ xdocs/

Author: craigmcc
Date: Wed Jan 25 12:09:24 2006
New Revision: 372303

URL: http://svn.apache.org/viewcvs?rev=372303&view=rev
Log:
The Shale Tiger Extensions now support the ability for JSF components,
converters, renderers, and validators to register themselves with the
JSF runtime, without having to be declared in a faces-config.xml file.

Thanks to Gary vanMatre for the suggestion to do this.

Added:
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java   (with props)
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java   (with props)
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java   (with props)
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java   (with props)
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html   (with props)
    struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java   (with props)
    struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java   (with props)
    struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java   (with props)
    struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java   (with props)
Modified:
    struts/shale/trunk/tiger/build.xml
    struts/shale/trunk/tiger/nbproject/project.xml
    struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/faces/LifecycleListener.java
    struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java
    struts/shale/trunk/xdocs/features-tiger-extensions.xml

Modified: struts/shale/trunk/tiger/build.xml
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/build.xml?rev=372303&r1=372302&r2=372303&view=diff
==============================================================================
--- struts/shale/trunk/tiger/build.xml (original)
+++ struts/shale/trunk/tiger/build.xml Wed Jan 25 12:09:24 2006
@@ -273,6 +273,13 @@
       </fileset>
     </copy>
 
+    <!-- Copy runtime objects to webapp structure -->
+    <mkdir         dir="${build.home}/test-webapp/WEB-INF/classes/org/apache/shale/tiger/faces"/>
+    <copy        todir="${build.home}/test-webapp/WEB-INF/classes/org/apache/shale/tiger/faces">
+      <fileset     dir="${build.home}/test-classes/org/apache/shale/tiger/faces"
+              includes="My*.class"/>
+    </copy>
+
   </target>
 
 

Modified: struts/shale/trunk/tiger/nbproject/project.xml
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/nbproject/project.xml?rev=372303&r1=372302&r2=372303&view=diff
==============================================================================
--- struts/shale/trunk/tiger/nbproject/project.xml (original)
+++ struts/shale/trunk/tiger/nbproject/project.xml Wed Jan 25 12:09:24 2006
@@ -1,88 +1,88 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://www.netbeans.org/ns/project/1">
-    <type>org.netbeans.modules.ant.freeform</type>
-    <configuration>
-        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
-            <!-- Do not use Project Properties customizer when editing this file manually. -->
-            <name>Shale Tiger Extensions</name>
-            <properties/>
-            <folders>
-                <source-folder>
-                    <label>Configuration Files</label>
-                    <type>java</type>
-                    <location>src/conf</location>
-                </source-folder>
-                <source-folder>
-                    <label>Java Sources</label>
-                    <type>java</type>
-                    <location>src/java</location>
-                </source-folder>
-                <source-folder>
-                    <label>Test Sources</label>
-                    <type>java</type>
-                    <location>src/test</location>
-                </source-folder>
-            </folders>
-            <ide-actions>
-                <action name="build">
-                    <target>compile</target>
-                </action>
-                <action name="clean">
-                    <target>clean</target>
-                </action>
-                <action name="javadoc">
-                    <target>docs</target>
-                </action>
-                <action name="test">
-                    <target>test</target>
-                </action>
-                <action name="rebuild">
-                    <target>clean</target>
-                    <target>compile</target>
-                </action>
-            </ide-actions>
-            <export>
-                <type>folder</type>
-                <location>target/classes</location>
-                <build-target>compile</build-target>
-            </export>
-            <view>
-                <items>
-                    <source-folder style="packages">
-                        <label>Configuration Files</label>
-                        <location>src/conf</location>
-                    </source-folder>
-                    <source-folder style="packages">
-                        <label>Java Sources</label>
-                        <location>src/java</location>
-                    </source-folder>
-                    <source-folder style="packages">
-                        <label>Test Sources</label>
-                        <location>src/test</location>
-                    </source-folder>
-                    <source-file>
-                        <location>build.xml</location>
-                    </source-file>
-                </items>
-                <context-menu>
-                    <ide-action name="build"/>
-                    <ide-action name="clean"/>
-                    <ide-action name="javadoc"/>
-                    <ide-action name="test"/>
-                    <ide-action name="rebuild"/>
-                </context-menu>
-            </view>
-            <subprojects/>
-        </general-data>
-        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/1">
-            <compilation-unit>
-                <package-root>src/conf</package-root>
-                <package-root>src/java</package-root>
-                <package-root>src/test</package-root>
-                <classpath mode="compile">../core-library/target/lib/shale-core.jar;../test-framework/target/lib/shale-test.jar;../../../../../usr/local/jsf-1_1_01/lib/jsf-api.jar;../../../../../usr/local/jsf-1_1_01/lib/commons-digester.jar;../../../../../usr/local/jsf-1_1_01/lib/commons-beanutils.jar;../../../../../usr/local/jsf-1_1_01/lib/commons-collections.jar;../../../../../usr/local/jsf-1_1_01/lib/commons-logging.jar;../../../../../usr/local/junit3.8.1/junit.jar;../../../../../usr/local/jakarta-tomcat-5.0.28/common/lib/jsp-api.jar;../../../../../usr/local/jakarta-tomcat-5.0.28/common/lib/servlet-api.jar</classpath>
-                <built-to>target/classes</built-to>
-                <source-level>1.5</source-level>
-            </compilation-unit>
-        </java-data>
-    </configuration>
-</project>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.ant.freeform</type>
+    <configuration>
+        <general-data xmlns="http://www.netbeans.org/ns/freeform-project/1">
+            <!-- Do not use Project Properties customizer when editing this file manually. -->
+            <name>Shale Tiger Extensions</name>
+            <properties/>
+            <folders>
+                <source-folder>
+                    <label>Configuration Files</label>
+                    <type>java</type>
+                    <location>src/conf</location>
+                </source-folder>
+                <source-folder>
+                    <label>Java Sources</label>
+                    <type>java</type>
+                    <location>src/java</location>
+                </source-folder>
+                <source-folder>
+                    <label>Test Sources</label>
+                    <type>java</type>
+                    <location>src/test</location>
+                </source-folder>
+            </folders>
+            <ide-actions>
+                <action name="build">
+                    <target>compile</target>
+                </action>
+                <action name="clean">
+                    <target>clean</target>
+                </action>
+                <action name="javadoc">
+                    <target>docs</target>
+                </action>
+                <action name="test">
+                    <target>test</target>
+                </action>
+                <action name="rebuild">
+                    <target>clean</target>
+                    <target>compile</target>
+                </action>
+            </ide-actions>
+            <export>
+                <type>folder</type>
+                <location>target/classes</location>
+                <build-target>compile</build-target>
+            </export>
+            <view>
+                <items>
+                    <source-folder style="packages">
+                        <label>Configuration Files</label>
+                        <location>src/conf</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>Java Sources</label>
+                        <location>src/java</location>
+                    </source-folder>
+                    <source-folder style="packages">
+                        <label>Test Sources</label>
+                        <location>src/test</location>
+                    </source-folder>
+                    <source-file>
+                        <location>build.xml</location>
+                    </source-file>
+                </items>
+                <context-menu>
+                    <ide-action name="build"/>
+                    <ide-action name="clean"/>
+                    <ide-action name="javadoc"/>
+                    <ide-action name="test"/>
+                    <ide-action name="rebuild"/>
+                </context-menu>
+            </view>
+            <subprojects/>
+        </general-data>
+        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/1">
+            <compilation-unit>
+                <package-root>src/conf</package-root>
+                <package-root>src/java</package-root>
+                <package-root>src/test</package-root>
+                <classpath mode="compile">../core-library/target/lib/shale-core.jar:../test-framework/target/lib/shale-test.jar:../../../../../usr/local/jsf-1_1_01/lib/jsf-api.jar:../../../../../usr/local/jsf-1_1_01/lib/commons-digester.jar:../../../../../usr/local/jsf-1_1_01/lib/commons-beanutils.jar:../../../../../usr/local/jsf-1_1_01/lib/commons-collections.jar:../../../../../usr/local/jsf-1_1_01/lib/commons-logging.jar:../../../../../usr/local/junit3.8.1/junit.jar:../lib/jsp-api/jsp-api.jar:../lib/servlet-api/servlet-api.jar</classpath>
+                <built-to>target/classes</built-to>
+                <source-level>1.5</source-level>
+            </compilation-unit>
+        </java-data>
+    </configuration>
+</project>

Modified: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/faces/LifecycleListener.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/faces/LifecycleListener.java?rev=372303&r1=372302&r2=372303&view=diff
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/faces/LifecycleListener.java (original)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/faces/LifecycleListener.java Wed Jan 25 12:09:24 2006
@@ -28,6 +28,12 @@
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import javax.faces.FacesException;
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.application.ApplicationFactory;
+import javax.faces.render.RenderKit;
+import javax.faces.render.RenderKitFactory;
+import javax.faces.render.Renderer;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -40,6 +46,10 @@
 import org.apache.shale.tiger.managed.Value;
 import org.apache.shale.tiger.managed.config.ManagedBeanConfig;
 import org.apache.shale.tiger.managed.config.ManagedPropertyConfig;
+import org.apache.shale.tiger.register.FacesComponent;
+import org.apache.shale.tiger.register.FacesConverter;
+import org.apache.shale.tiger.register.FacesRenderer;
+import org.apache.shale.tiger.register.FacesValidator;
 import org.apache.shale.util.Messages;
 import org.xml.sax.SAXException;
 
@@ -161,6 +171,7 @@
         try {
             classes = webClasses(servletContext);
             for (Class clazz : classes) {
+                registerClass(clazz, application());
                 scanClass(clazz, config);
             }
         } catch (Exception e) {
@@ -175,6 +186,7 @@
             for (JarFile archive : archives) {
                 classes = archiveClasses(servletContext, archive);
                 for (Class clazz : classes) {
+                    registerClass(clazz, application());
                     scanClass(clazz, config);
                 }
             }
@@ -229,6 +241,23 @@
     // --------------------------------------------------------- Private Methods
 
 
+    private Application application = null;
+
+
+    /**
+     * <p>Return the <code>Application</code> for this application.</p>
+     */
+    private Application application() {
+
+        if (application == null) {
+            application = ((ApplicationFactory) FactoryFinder.
+              getFactory(FactoryFinder.APPLICATION_FACTORY)).getApplication();
+        }
+        return application;
+
+    }
+
+
     /**
      * <p>Return a list of classes from the specified JAR archive.  If this
      * archive has no classes in it, a zero-length list is returned.</p>
@@ -417,6 +446,83 @@
         }
         parser.setResource(resource);
         parser.parse();
+
+    }
+
+
+    private RenderKitFactory rkFactory = null;
+
+
+    /**
+     * <p>Return the <code>RenderKitFactory</code> for this application.</p>
+     */
+    private RenderKitFactory renderKitFactory() {
+
+        if (rkFactory == null) {
+            rkFactory = (RenderKitFactory)
+              FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+        }
+        return rkFactory;
+
+    }
+
+
+    /**
+     * <p>Register the specified class with the specified JavaServer Faces
+     * <code>Application</code> instance, based on annotations that the
+     * class is annotated with.</p>
+     *
+     * @param clazz Class to be registered
+     * @param application <code>Application</code> instance with which to
+     *  register this class
+     */
+    private void registerClass(Class clazz, Application application) {
+
+        if (log().isTraceEnabled()) {
+            log().trace("registerClass(" + clazz.getName() + ")");
+        }
+        FacesComponent comp = (FacesComponent) clazz.getAnnotation(FacesComponent.class);
+        if (comp != null) {
+            if (log().isTraceEnabled()) {
+                log().trace("addComponent(" + comp.value() + "," + clazz.getName() + ")");
+            }
+            application().addComponent(comp.value(), clazz.getName());
+        }
+
+        FacesConverter conv = (FacesConverter) clazz.getAnnotation(FacesConverter.class);
+        if (conv != null) {
+            if (log().isTraceEnabled()) {
+                log().trace("addConverter(" + conv.value() + "," + clazz.getName() + ")");
+            }
+            application().addConverter(conv.value(), clazz.getName());
+        }
+
+        FacesRenderer rend = (FacesRenderer) clazz.getAnnotation(FacesRenderer.class);
+        if (rend != null) {
+            String renderKitId = rend.renderKitId();
+            if (renderKitId == null) {
+                renderKitId = RenderKitFactory.HTML_BASIC_RENDER_KIT;
+            }
+            if (log().isTraceEnabled()) {
+                log().trace("addRenderer(" + renderKitId + ", " + rend.componentFamily() +
+                        ", " + rend.rendererType() + ", " + clazz.getName() + ")");
+            }
+            try {
+                RenderKit rk = renderKitFactory().getRenderKit(null, renderKitId);
+                rk.addRenderer(rend.componentFamily(), rend.rendererType(),
+                               (Renderer) clazz.newInstance());
+            } catch (Exception e) {
+                throw new FacesException(e);
+            }
+        }
+
+        FacesValidator val = (FacesValidator) clazz.getAnnotation(FacesValidator.class);
+        if (val != null) {
+            if (log().isTraceEnabled()) {
+                log().trace("addValidator(" + val.value() + "," + clazz.getName() + ")");
+            }
+            application().addValidator(val.value(), clazz.getName());
+        }
 
     }
 

Added: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java (added)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004-2005 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.register;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <p>Class-level annotation indicating that this class should be registered
+ * as a JavaServer Faces <code>UIComponent</code> under the component type
+ * specified by the <code>value</code> attribute.</p>
+ *
+ * <p><strong>ASSERTION</strong> - The annotated class implements
+ * <code>UIComponent</code> or extends <code>UIComponentBase</code>.</p>
+ *
+ * @since 1.0.1
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface FacesComponent {
+
+    /**
+     * <p>The component type under which this component should be registered.</p>
+     */
+    String value();
+
+
+}

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesComponent.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java (added)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004-2005 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.register;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <p>Class-level annotation indicating that this class should be registered
+ * as a JavaServer Faces <code>Converter</code> under the converter id
+ * specified by the <code>value</code> attribute.</p>
+ *
+ * <p><strong>ASSERTION</strong> - The annotated class implements
+ * <code>Converter</code>.</p>
+ *
+ * @since 1.0.1
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface FacesConverter {
+
+    /**
+     * <p>The converter id under which this converter should be registered.</p>
+     */
+    String value();
+
+
+}

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesConverter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java (added)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004-2005 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.register;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.faces.render.RenderKitFactory;
+
+/**
+ * <p>Class-level annotation indicating that this class should be registered
+ * as a JavaServer Faces <code>Renderer</code> under the parameters
+ * specified by our attributes.</p>
+ *
+ * <p><strong>ASSERTION</strong> - The annotated class implements
+ * <code>Renderer</code>.</p>
+ *
+ * @since 1.0.1
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface FacesRenderer {
+
+
+    /**
+     * <p>The <code>RenderKit</code> identifier of the <code>RenderKit</code>
+     * with which we should register.  If not specified, we will register
+     * in the default HTML Basic <code>RenderKit</code>.</p>
+     */
+    String renderKitId() default RenderKitFactory.HTML_BASIC_RENDER_KIT;
+
+
+    /**
+     * <p>The renderer type under which we should register.</p>
+     */
+    String rendererType();
+
+
+    /**
+     * <p>The component family for which we should register.</p>
+     */
+    String componentFamily();
+
+
+}

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java (added)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2004-2005 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.register;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * <p>Class-level annotation indicating that this class should be registered
+ * as a JavaServer Faces <code>Validator</code> under the validator id
+ * specified by the <code>value</code> attribute.</p>
+ *
+ * <p><strong>ASSERTION</strong> - The annotated class implements
+ * <code>Validator</code>.</p>
+ *
+ * @since 1.0.1
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface FacesValidator {
+
+    /**
+     * <p>The validator id under which this validator should be registered.</p>
+     */
+    String value();
+
+
+}

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/FacesValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html (added)
+++ struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html Wed Jan 25 12:09:24 2006
@@ -0,0 +1,84 @@
+<!--
+ * Copyright 2004-2005 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.
+-->
+
+<!-- $Id$ -->
+
+<body>
+
+<p>This package contains Java SE 5 <em>annotations</em> that allow you to
+register several types of JavaServer Faces artifacts (components, converters,
+renderers, and validators) without having to define them in a configuration
+resource.  Because the JavaServer Faces runtime does not support classes with
+arbitrary inheritance hierarchies to implement particular features, the
+actual classes themselves must also extend the corresponding JavaServer Faces
+APIs to be usable.</p>
+
+<p>To declare a JavaServer Faces <code>UIComponent</code> class:</p>
+<pre>
+    import javax.faces.component.UIComponentBase;
+    import org.apache.shale.tiger.register.FacesComponent;
+    
+    &#64;FacesComponent("com.mycompany.mytypes.MY_COMPONENT_TYPE")
+    public class MyComponent extends UIComponentBase {
+      ...
+    }
+</pre>
+
+<p>To declare a JavaServer Faces by-id <code>Converter</code> class:</p>
+<pre>
+    import javax.faces.convert.Converter;
+    import org.apache.shale.tiger.register.FacesConverter;
+    
+    &#64;FacesConverter("com.mycompany.mytypes.MY_CONVERTER_ID")
+    public class MyConverter implements Converter {
+      ...
+    }
+</pre>
+
+<p>To declare a JavaServer Faces <code>Validator</code> class:</p>
+<pre>
+    import javax.faces.convert.Validator;
+    import org.apache.shale.tiger.register.Validator;
+    
+    &#64;FacesValidator("com.mycompany.mytypes.MY_VALIDATOR_ID")
+    public class MyValidator implements Validator {
+      ...
+    }
+</pre>
+
+<p>To declare a JavaServer Faces <code>Renderer</code> class:</p>
+<pre>
+    import javax.faces.render.Renderer;
+    import org.apache.shale.tiger.register.FacesRenderer;
+    
+    &#64;FacesRenderer(renderKitId="myRenderKitId" rendererType="myRendererType"
+                   componentFamily="javax.faces.Input")
+    public class MyRenderer implements Renderer {
+      ...
+    }
+</pre>
+
+<p>If the <code>renderKitId</code> attribute is not specified, the
+<code>Renderer</code> will be registered in the default HTML Basic
+<code>RenderKit</code>.</p>
+
+<p>API STATUS:  Experimental.</p>
+
+<p>IMPLEMENTATION STATUS:  Not yet implemented.</p>
+
+@since 1.0.1
+
+</body>

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/java/org/apache/shale/tiger/register/package.html
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java?rev=372303&r1=372302&r2=372303&view=diff
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java (original)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/LifecycleListenerTestCase.java Wed Jan 25 12:09:24 2006
@@ -19,6 +19,10 @@
 import java.io.File;
 import java.util.Map;
 import java.util.Set;
+import javax.faces.component.UIComponent;
+import javax.faces.convert.Converter;
+import javax.faces.render.Renderer;
+import javax.faces.validator.Validator;
 import javax.servlet.ServletContextEvent;
 import junit.framework.Test;
 import junit.framework.TestCase;
@@ -271,6 +275,31 @@
     public void testPristine() {
 
         assertNotNull(listener);
+
+    }
+
+
+    // Test registration of JavaServer Faces objects
+    public void testRegister() {
+
+        // Create a ServletContextEvent we will pass to the event methods
+        ServletContextEvent event = new ServletContextEvent(servletContext);
+
+        // Initialize the servlet context listener
+        listener.contextInitialized(event);
+
+        // Check for the widgets that should have been registered
+        UIComponent comp = application.createComponent("foo.MyComponent");
+        assertNotNull(comp);
+        Converter conv = application.createConverter("foo.MyConverter");
+        assertNotNull(conv);
+        Renderer rend = renderKit.getRenderer("foo.MyFamily", "foo.MyRenderer");
+        assertNotNull(rend);
+        Validator val = application.createValidator("foo.MyValidator");
+        assertNotNull(val);
+
+        // Finalize the servlet context listener
+        listener.contextDestroyed(event);
 
     }
 

Added: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java (added)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2006 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.faces;
+
+import javax.faces.component.UIComponentBase;
+import org.apache.shale.tiger.register.FacesComponent;
+
+/**
+ * <p>Test component for Shale Tiger unit tests.</p>
+ */
+@FacesComponent("foo.MyComponent")
+public class MyComponent extends UIComponentBase {
+    
+
+    public String getFamily() {
+        return "MyFamily";
+    }
+
+
+}

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyComponent.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java (added)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2006 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.faces;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.convert.Converter;
+import org.apache.shale.tiger.register.FacesConverter;
+
+/**
+ * <p>Test converter for Shale Tiger unit tests.</p>
+ */
+@FacesConverter("foo.MyConverter")
+public class MyConverter implements Converter {
+    
+    public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object object) {
+        throw new UnsupportedOperationException();
+    }
+
+    public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String string) {
+        throw new UnsupportedOperationException();
+    }
+
+}

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyConverter.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java (added)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2006 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.faces;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.render.Renderer;
+import org.apache.shale.tiger.register.FacesRenderer;
+
+/**
+ * <p>Test renderer for Shale Tiger unit tests.</p>
+ */
+@FacesRenderer(rendererType="foo.MyRenderer", componentFamily="foo.MyFamily")
+public class MyRenderer extends Renderer {
+
+}

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyRenderer.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java?rev=372303&view=auto
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java (added)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java Wed Jan 25 12:09:24 2006
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2006 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.tiger.faces;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.validator.Validator;
+import javax.faces.validator.ValidatorException;
+import org.apache.shale.tiger.register.FacesValidator;
+
+/**
+ * <p>Test validator for Shale Tiger unit tests.</p>
+ */
+@FacesValidator("foo.MyValidator")
+public class MyValidator implements Validator {
+
+    public void validate(FacesContext facesContext, UIComponent uIComponent, Object object) throws ValidatorException {
+        throw new UnsupportedOperationException();
+    }
+    
+}

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/MyValidator.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: struts/shale/trunk/xdocs/features-tiger-extensions.xml
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/xdocs/features-tiger-extensions.xml?rev=372303&r1=372302&r2=372303&view=diff
==============================================================================
--- struts/shale/trunk/xdocs/features-tiger-extensions.xml (original)
+++ struts/shale/trunk/xdocs/features-tiger-extensions.xml Wed Jan 25 12:09:24 2006
@@ -26,6 +26,10 @@
               rather than requiring the backing bean to implement the
               <code>ViewController</code> interface and provide methods
               with the names defined by this interface.</li>
+          <li>The ability for JavaServer Faces components, converters,
+              renderers,and validators to register themselves with the
+              runtime system, without having to be declared in a
+              <code>faces-config.xml</code> resource.</li>
         </ul>
 
         <p>These features are enabled automatically if you include
@@ -108,6 +112,22 @@
         view controller callbacks, you are <code>NOT</code> required to
         provide a method that is marked with the corresponding annotaiton.</p>
 
+        <h4>Annotated Component Registration</h4>
+
+        <p>A standard JavaServer Faces runtime environment allows an
+        application, or a component library, to register custom classes
+        as JavaServer Faces components, converters, renderers,and validators,
+        using the <code>&lt;component&gt;</code>, <code>&lt;converter&gt;</code>,
+        <code>&lt;renderer&gt;</code>, and <code>&lt;validator&gt;</code>
+        elements, respectively, in a <code>faces-config.xml</code> resource.
+        The Shale Tiger extensions allow the implementation classes for these
+        objects to register themselves by virtue of the existence of an
+        annotation on the class, without requiring a configuration resource
+        to be present.  In each case, the class being registered must still
+        implement the corresponding JavaServer Faces API (for example, a
+        converter registered in this manner must still implement the
+        <code>javax.faces.convert.Converter</code> interface).</p>
+
       </subsection>
 
       <a name="tiger-using"/>
@@ -188,6 +208,81 @@
         // This class is not interested in preprocess or destroy
         // methods, so they are not defined
 
+    }
+</source>
+
+        <h4>Using Annotated Component Registration</h4>
+
+        <p>To use the <em>Annotated Component Registration</em> feature,
+        you mus use annotations from the <code>org.apache.shale.tiger.register</code>
+        package, as illustrated below:</p>
+
+        <p>An annotated component registration should look like this:</p>
+
+<source>
+    package com.mycompany.mypackage;
+    
+    import javax.faces.component.UIComponentBase;
+    import org.apache.shale.tiger.register.FacesComponent;
+
+    &#64;FacesComponent("my.component.type")
+    public class MyComponent extends UIComponentBase {
+    
+        ...
+        
+    }
+</source>
+
+        <p>An annotated converter registration should look like this:</p>
+
+<source>
+    package com.mycompany.mypackage;
+    
+    import javax.faces.convert.Converter;
+    import org.apache.shale.tiger.register.FacesConverter;
+
+    &#64;FacesConverter("my.converter.id")
+    public class MyConverter implements Converter {
+    
+        ...
+        
+    }
+</source>
+
+        <p>An annotated renderer registration should look like this
+        (if the <code>renderKitId</code> attribute is not specified,
+        the renderer will be registered with the standard HTML Basic
+        renderkit):</p>
+
+<source>
+    package com.mycompany.mypackage;
+    
+    import javax.faces.render.Renderer;
+    import org.apache.shale.tiger.register.FacesRenderer;
+
+    &#64;FacesRenderer(renderKitId="my.render.kit.id",
+                       componentFamily="my.component.family",
+                       rendererType="my.renderer.type")
+    public class MyRenderer extends Renderer {
+    
+        ...
+        
+    }
+</source>
+
+        <p>An annotated validator registration should look like this:</p>
+
+<source>
+    package com.mycompany.mypackage;
+    
+    import javax.faces.validator.Validator;
+    import org.apache.shale.tiger.register.FacesValidator;
+
+    &#64;FacesConverter("my.validator.id")
+    public class MyValidator implements Validator {
+    
+        ...
+        
     }
 </source>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org