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/02/06 06:40:58 UTC

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

Author: craigmcc
Date: Sun Feb  5 21:40:57 2006
New Revision: 375191

URL: http://svn.apache.org/viewcvs?rev=375191&view=rev
Log:
Commit the code that actually implements all of the fix for issue 38487
(narrow the set of jars scanned for annotations to those that have a
META-INF/faces-config.xml resource), plus fix a bug that caused the
actual parsing of such resources to be skipped.

Modified:
    struts/shale/trunk/tiger/build.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/tiger/src/test/org/apache/shale/tiger/faces/VariableResolverImplTestCase.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=375191&r1=375190&r2=375191&view=diff
==============================================================================
--- struts/shale/trunk/tiger/build.xml (original)
+++ struts/shale/trunk/tiger/build.xml Sun Feb  5 21:40:57 2006
@@ -263,10 +263,15 @@
     <!-- Copy non-Java Sources -->
     <copy        todir="${build.home}/test-classes">
       <fileset     dir="src/test">
-        <exclude  name="**/*.java"/>
+        <exclude  name="**/*.java **/faces-config.xml"/>
       </fileset>
     </copy>
 
+    <!-- Copy manifest for jar file -->
+    <mkdir         dir="${build.home}/test-classes/META-INF"/>
+    <copy        todir="${build.home}/test-classes/META-INF"
+                  file="src/test/org/apache/shale/tiger/faces/faces-config.xml"/>
+
     <!-- 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">
@@ -293,7 +298,7 @@
     <mkdir         dir="${build.home}/test-webapp/WEB-INF/lib"/>
     <jar      destfile="${build.home}/test-webapp/WEB-INF/lib/test.jar"
                basedir="${build.home}/test-classes"
-              includes="org/apache/shale/tiger/config/TestBean3.class"/>
+              includes="org/apache/shale/tiger/config/TestBean3.class META-INF/faces-config.xml"/>
 
   </target>
 

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=375191&r1=375190&r2=375191&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 Sun Feb  5 21:40:57 2006
@@ -113,7 +113,7 @@
      * inside application JARs.</p>
      */
     private static final String FACES_CONFIG_IMPLICIT =
-            "META_INF/faces-config.xml";
+            "META-INF/faces-config.xml";
 
 
     /**
@@ -157,7 +157,17 @@
     /**
      * <p>Configure a {@link FacesConfigConfig} bean representing metadata
      * from the <code>faces-config.xml</code> resource(s) for this
-     * application, and store it in an application scope attribute.</p>
+     * application, and store it in an application scope attribute.  In
+     * addition, scan classes in the following locations for Shale Tiger
+     * Extensions specific runtime annotations:</p>
+     * <ul>
+     * <li>All classes under <code>/WEB-INF/classes</code>.</li>
+     * <li>All classes in JAR files under <code>/WEB-INF/lib</code> that
+     *     contain an embedded <code>META-INF/faces-config.xml</code>
+     *     resource (the contents of that resource are irrelevant; it is
+     *     simply used to flag a JAR file as containing JavaServer Faces
+     *     related artifacts).</li>
+     * </ul>
      *
      * @param event <code>ServletContextEvent</code. representing the
      *  application that is starting up
@@ -274,8 +284,8 @@
 
 
     /**
-     * <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>
+     * <p>Return a list of classes to examine from the specified JAR archive.
+     * If this archive has no classes in it, a zero-length list is returned.</p>
      *
      * @param context <code>ServletContext</code> instance for
      *  this application
@@ -286,11 +296,12 @@
     private List<Class> archiveClasses(ServletContext context, JarFile jar)
         throws ClassNotFoundException {
 
+        // Accumulate and return a list of classes in this JAR file
+        List<Class> list = new ArrayList<Class>();
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
         if (loader == null) {
             loader = this.getClass().getClassLoader();
         }
-        List<Class> list = new ArrayList<Class>();
         Enumeration<JarEntry> entries = jar.entries();
         while (entries.hasMoreElements()) {
             JarEntry entry = entries.nextElement();
@@ -612,9 +623,10 @@
 
     /**
      * <p>Return a list of the JAR archives defined under the
-     * <code>/WEB-INF/lib</code> directory of this web application.
-     * If there are no such JAR archives, a zero-length list
-     * will be returned.</p>
+     * <code>/WEB-INF/lib</code> directory of this web application
+     * that contain a <code>META-INF/faces-config.xml</code> resource
+     * (even if that resource is empty).  If there are no such JAR archives,
+     * a zero-length list will be returned.</p>
      *
      * @param servletContext <code>ServletContext</code> instance for
      *  this application
@@ -635,6 +647,15 @@
             String jarURLString = "jar:" + url.toString() + "!/";
             url = new URL(jarURLString);
             JarFile jarFile = ((JarURLConnection) url.openConnection()).getJarFile();
+            // Skip this JAR file if it does not have a META-INF/faces-config.xml
+            // resource (even if that resource is empty)
+            JarEntry signal = jarFile.getJarEntry(FACES_CONFIG_IMPLICIT);
+            if (signal == null) {
+                if (log().isTraceEnabled()) {
+                    log().trace("Skip JAR file " + path + " because it has no META-INF/faces-config.xml resource");
+                }
+                continue;
+            }
             list.add(jarFile);
         }
         return list;

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=375191&r1=375190&r2=375191&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 Sun Feb  5 21:40:57 2006
@@ -126,7 +126,7 @@
         assertNotNull(config);
         Map<String,ManagedBeanConfig> mbMap = fcConfig.getManagedBeans();
         assertNotNull(mbMap);
-        assertEquals(4, mbMap.size());
+        assertEquals(5, mbMap.size());
 
         ManagedPropertyConfig mpConfig = null;
 
@@ -264,6 +264,87 @@
         assertEquals("java.lang.String", mpConfig.getType());
         assertEquals("Override The Annotation", mpConfig.getValue());
         assertTrue(!mpConfig.isNullValue());
+
+        // Validate configuration of bean3
+        ManagedBeanConfig bean3 = fcConfig.getManagedBean("bean3");
+        assertNotNull(bean3);
+        assertTrue(bean3 == mbMap.get("bean3"));
+        assertEquals("bean3", bean3.getName());
+        assertEquals("org.apache.shale.tiger.config.TestBean3", bean3.getType());
+        assertEquals("session", bean3.getScope());
+        assertNull(bean3.getListEntries());
+        assertNull(bean3.getMapEntries());
+        Map<String,ManagedPropertyConfig> bean3Map = bean3.getProperties();
+        assertNotNull(bean3Map);
+        assertEquals(8, bean3Map.size());
+
+        mpConfig = bean3.getProperty("byteProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("byteProperty"));
+        assertEquals("byteProperty", mpConfig.getName());
+        assertEquals("byte", mpConfig.getType());
+        assertEquals("-1", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("charProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("charProperty"));
+        assertEquals("charProperty", mpConfig.getName());
+        assertEquals("char", mpConfig.getType());
+        assertEquals("z", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("doubleProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("doubleProperty"));
+        assertEquals("doubleProperty", mpConfig.getName());
+        assertEquals("double", mpConfig.getType());
+        assertEquals("-2.0", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("floatProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("floatProperty"));
+        assertEquals("floatProperty", mpConfig.getName());
+        assertEquals("float", mpConfig.getType());
+        assertEquals("-3.0", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("intProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("intProperty"));
+        assertEquals("intProperty", mpConfig.getName());
+        assertEquals("int", mpConfig.getType());
+        assertEquals("-4", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("longProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("longProperty"));
+        assertEquals("longProperty", mpConfig.getName());
+        assertEquals("long", mpConfig.getType());
+        assertEquals("-5", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("shortProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("shortProperty"));
+        assertEquals("shortProperty", mpConfig.getName());
+        assertEquals("short", mpConfig.getType());
+        assertEquals("-6", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        mpConfig = bean3.getProperty("stringProperty");
+        assertNotNull(mpConfig);
+        assertTrue(mpConfig == bean3Map.get("stringProperty"));
+        assertEquals("stringProperty", mpConfig.getName());
+        assertEquals("java.lang.String", mpConfig.getType());
+        assertEquals("Annotated", mpConfig.getValue());
+        assertTrue(!mpConfig.isNullValue());
+
+        // Test existence of "org.apache.shale.TAG_UTILITY_BEAN" managed bean
+        ManagedBeanConfig tagUtilityBean = fcConfig.getManagedBean("org.apache.shale.TAG_UTILITY_BEAN");
+        assertNotNull(tagUtilityBean);
 
         // Finalize the servlet context listener
         listener.contextDestroyed(event);

Modified: struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/VariableResolverImplTestCase.java
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/VariableResolverImplTestCase.java?rev=375191&r1=375190&r2=375191&view=diff
==============================================================================
--- struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/VariableResolverImplTestCase.java (original)
+++ struts/shale/trunk/tiger/src/test/org/apache/shale/tiger/faces/VariableResolverImplTestCase.java Sun Feb  5 21:40:57 2006
@@ -221,7 +221,7 @@
             externalContext.getApplicationMap().
             get(LifecycleListener.FACES_CONFIG_CONFIG);
         assertNotNull(config);
-        assertEquals(4, config.getManagedBeans().size());
+        assertEquals(5, config.getManagedBeans().size());
 
     }
 

Modified: struts/shale/trunk/xdocs/features-tiger-extensions.xml
URL: http://svn.apache.org/viewcvs/struts/shale/trunk/xdocs/features-tiger-extensions.xml?rev=375191&r1=375190&r2=375191&view=diff
==============================================================================
--- struts/shale/trunk/xdocs/features-tiger-extensions.xml (original)
+++ struts/shale/trunk/xdocs/features-tiger-extensions.xml Sun Feb  5 21:40:57 2006
@@ -138,6 +138,16 @@
         or later container, and <strong>MUST</strong> include the
         <code>shale-tiger.jar</code> resource in your web application.</p>
 
+        <p>To optimize performance at application startup, the Shale Tiger
+        Extensions will <strong>ONLY</strong> examine classes (to see if
+        they include the appropriate annotations) in the following lcoations:</p>
+        <ul>
+            <li>Any class under <code>/WEB-INF/classes</code>.</li>
+            <li>Any class in a JAR file under <code>/WEB-INF/lib</code> that
+                includes a <code>META-INF/faces-config.xml</code> resource,
+                indicating that this JAR file is relevant to JavaServer Faces.</li>
+        </ul>
+
         <h4>Using Annotated Managed Beans</h4>
 
         <p>To use the <em>Annotated Managed Beans</em> feature, you must



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