Author: apetrelli
Date: Tue May 12 21:44:39 2009
New Revision: 774104

URL: http://svn.apache.org/viewvc?rev=774104&view=rev
Log:
TILES-404
Merge from trunk to TILES_2_1_X branch.
Applied a modified version of the patch submitted by Scott Andrews.

Modified:
    tiles/framework/branches/TILES_2_1_X/   (props changed)
    
tiles/framework/branches/TILES_2_1_X/tiles-api/src/main/java/org/apache/tiles/reflect/ClassUtil.java
    
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesApplicationContextFactory.java
    
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
    
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesRequestContextFactory.java
    
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
    
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
    
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
    tiles/framework/branches/TILES_2_1_X/tiles-test/   (props changed)

Propchange: tiles/framework/branches/TILES_2_1_X/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 12 21:44:39 2009
@@ -1 +1 @@
-/tiles/framework/trunk:749981,761052,761061
+/tiles/framework/trunk:749981,761052,761061,772781

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-api/src/main/java/org/apache/tiles/reflect/ClassUtil.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-api/src/main/java/org/apache/tiles/reflect/ClassUtil.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-api/src/main/java/org/apache/tiles/reflect/ClassUtil.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-api/src/main/java/org/apache/tiles/reflect/ClassUtil.java
 Tue May 12 21:44:39 2009
@@ -39,6 +39,29 @@
     }
 
     /**
+     * Returns the class and casts it to the correct subclass.<br>
+     * It tries to use the thread's current classloader first and, if it does
+     * not succeed, uses the classloader of ClassUtil.
+     *
+     * @param <T> The subclass to use.
+     * @param className The name of the class to load.
+     * @param baseClass The base class to subclass to.
+     * @return The loaded class.
+     * @throws ClassNotFoundException If the class has not been found.
+     * @since 2.1.3
+     */
+    public static <T> Class<? extends T> getClass(String className,
+            Class<T> baseClass) throws ClassNotFoundException {
+        ClassLoader classLoader = Thread.currentThread()
+                .getContextClassLoader();
+        if (classLoader == null) {
+            classLoader = ClassUtil.class.getClassLoader();
+        }
+        return Class.forName(className, true, classLoader)
+                .asSubclass(baseClass);
+    }
+
+    /**
      * Returns an instance of the given class name, by calling the default
      * constructor.
      *
@@ -65,12 +88,12 @@
      * @since 2.0.7
      */
     public static Object instantiate(String className, boolean returnNull) {
-        ClassLoader original = Thread.currentThread().getContextClassLoader();
-        if (original == null) {
-            
Thread.currentThread().setContextClassLoader(ClassUtil.class.getClassLoader());
+        ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
+        if (classLoader == null) {
+            classLoader = ClassUtil.class.getClassLoader();
         }
         try {
-            Class<?> namedClass = Class.forName(className);
+            Class<? extends Object> namedClass = getClass(className, 
Object.class);
             return namedClass.newInstance();
         } catch (ClassNotFoundException e) {
             if (returnNull) {
@@ -87,12 +110,6 @@
                             + className
                             + "'. Make sure that this class has a default 
constructor",
                     e);
-        } finally {
-            // If the original context classloader of the current thread was
-            // null, it must be reset.
-            if (original == null) {
-                Thread.currentThread().setContextClassLoader(null);
-            }
         }
     }
 

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesApplicationContextFactory.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesApplicationContextFactory.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesApplicationContextFactory.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesApplicationContextFactory.java
 Tue May 12 21:44:39 2009
@@ -26,6 +26,7 @@
 import org.apache.tiles.Initializable;
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.awareness.AbstractTilesApplicationContextFactoryAware;
+import org.apache.tiles.reflect.ClassUtil;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -81,7 +82,6 @@
     }
 
     /** {...@inheritdoc} */
-    @SuppressWarnings("unchecked")
     public void init(Map<String, String> configParameters) {
         String[] classNames = null;
         String classNamesString = configParameters.get(FACTORY_CLASS_NAMES);
@@ -95,23 +95,16 @@
         factories = new ArrayList<AbstractTilesApplicationContextFactory>();
         for (int i = 0; i < classNames.length; i++) {
             try {
-                Class<AbstractTilesApplicationContextFactory> clazz =
-                    (Class<AbstractTilesApplicationContextFactory>) Class
-                        .forName(classNames[i]);
-                if (AbstractTilesApplicationContextFactory.class
-                        .isAssignableFrom(clazz)) {
-                    AbstractTilesApplicationContextFactory factory = clazz
-                            .newInstance();
-                    if (factory instanceof 
AbstractTilesApplicationContextFactoryAware) {
-                        ((AbstractTilesApplicationContextFactoryAware) factory)
-                                .setApplicationContextFactory(this);
-                    }
-                    factories.add(factory);
-                } else {
-                    throw new IllegalArgumentException("The class "
-                            + classNames[i]
-                            + " does not implement TilesContextFactory");
+                Class<? extends AbstractTilesApplicationContextFactory> clazz 
= ClassUtil
+                        .getClass(classNames[i],
+                                AbstractTilesApplicationContextFactory.class);
+                AbstractTilesApplicationContextFactory factory = clazz
+                        .newInstance();
+                if (factory instanceof 
AbstractTilesApplicationContextFactoryAware) {
+                    ((AbstractTilesApplicationContextFactoryAware) factory)
+                            .setApplicationContextFactory(this);
                 }
+                factories.add(factory);
             } catch (ClassNotFoundException e) {
                 // We log it, because it could be a default configuration 
class that
                 // is simply not present.

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesContextFactory.java
 Tue May 12 21:44:39 2009
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.awareness.TilesRequestContextFactoryAware;
+import org.apache.tiles.reflect.ClassUtil;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -84,7 +85,6 @@
     }
 
     /** {...@inheritdoc} */
-    @SuppressWarnings("unchecked")
     public void init(Map<String, String> configParameters) {
         String[] classNames = null;
         String classNamesString = configParameters.get(FACTORY_CLASS_NAMES);
@@ -98,20 +98,14 @@
         factories = new ArrayList<TilesContextFactory>();
         for (int i = 0; i < classNames.length; i++) {
             try {
-                Class<TilesContextFactory> clazz = 
(Class<TilesContextFactory>) Class
-                        .forName(classNames[i]);
-                if (TilesContextFactory.class.isAssignableFrom(clazz)) {
-                    TilesContextFactory factory = clazz.newInstance();
-                    if (factory instanceof TilesRequestContextFactoryAware) {
-                        ((TilesRequestContextFactoryAware) factory)
-                                .setRequestContextFactory(this);
-                    }
-                    factories.add(factory);
-                } else {
-                    throw new IllegalArgumentException("The class "
-                            + classNames[i]
-                            + " does not implement TilesContextFactory");
+                Class<? extends TilesContextFactory> clazz = ClassUtil
+                        .getClass(classNames[i], TilesContextFactory.class);
+                TilesContextFactory factory = clazz.newInstance();
+                if (factory instanceof TilesRequestContextFactoryAware) {
+                    ((TilesRequestContextFactoryAware) factory)
+                            .setRequestContextFactory(this);
                 }
+                factories.add(factory);
             } catch (ClassNotFoundException e) {
                 // We log it, because it could be a default configuration 
class that
                 // is simply not present.

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesRequestContextFactory.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesRequestContextFactory.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesRequestContextFactory.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/context/ChainedTilesRequestContextFactory.java
 Tue May 12 21:44:39 2009
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.TilesApplicationContext;
 import org.apache.tiles.awareness.TilesRequestContextFactoryAware;
+import org.apache.tiles.reflect.ClassUtil;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -80,7 +81,6 @@
     }
 
     /** {...@inheritdoc} */
-    @SuppressWarnings("unchecked")
     public void init(Map<String, String> configParameters) {
         String[] classNames = null;
         String classNamesString = configParameters.get(FACTORY_CLASS_NAMES);
@@ -94,16 +94,11 @@
         factories = new ArrayList<TilesRequestContextFactory>();
         for (int i = 0; i < classNames.length; i++) {
             try {
-                Class<TilesRequestContextFactory> clazz = 
(Class<TilesRequestContextFactory>) Class
-                        .forName(classNames[i]);
-                if (TilesRequestContextFactory.class.isAssignableFrom(clazz)) {
-                    TilesRequestContextFactory factory = clazz.newInstance();
-                    factories.add(factory);
-                } else {
-                    throw new IllegalArgumentException("The class "
-                            + classNames[i]
-                            + " does not implement 
TilesRequestContextFactory");
-                }
+                Class<? extends TilesRequestContextFactory> clazz = ClassUtil
+                        .getClass(classNames[i],
+                                TilesRequestContextFactory.class);
+                TilesRequestContextFactory factory = clazz.newInstance();
+                factories.add(factory);
             } catch (ClassNotFoundException e) {
                 // We log it, because it could be a default configuration 
class that
                 // is simply not present.

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-core/src/main/java/org/apache/tiles/factory/BasicTilesContainerFactory.java
 Tue May 12 21:44:39 2009
@@ -49,6 +49,7 @@
 import org.apache.tiles.locale.impl.DefaultLocaleResolver;
 import org.apache.tiles.preparer.BasicPreparerFactory;
 import org.apache.tiles.preparer.PreparerFactory;
+import org.apache.tiles.reflect.ClassUtil;
 import org.apache.tiles.renderer.AttributeRenderer;
 import org.apache.tiles.renderer.RendererFactory;
 import org.apache.tiles.renderer.impl.BasicRendererFactory;
@@ -162,9 +163,8 @@
             TilesRequestContextFactory parent) {
         TilesRequestContextFactory retValue = null;
         try {
-            Class<? extends TilesRequestContextFactory> clazz = Class
-                    .forName(className).asSubclass(
-                            TilesRequestContextFactory.class);
+            Class<? extends TilesRequestContextFactory> clazz = ClassUtil
+                    .getClass(className, TilesRequestContextFactory.class);
             retValue = clazz.newInstance();
             if (parent != null
                     && retValue instanceof TilesRequestContextFactoryAware) {
@@ -173,14 +173,14 @@
             }
         } catch (ClassNotFoundException e) {
             if (log.isDebugEnabled()) {
-                log.debug("Cannot find JspTilesContextFactory, ignoring 
problem", e);
+                log.debug("Cannot find class '" + className + "', ignoring 
problem", e);
             }
         } catch (InstantiationException e) {
             throw new TilesContainerFactoryException(
-                    "Cannot instantiate JspTilesContextFactory", e);
+                    "Cannot instantiate '" + className + "'", e);
         } catch (IllegalAccessException e) {
             throw new TilesContainerFactoryException(
-                    "Cannot access default constructor JspTilesContextFactory",
+                    "Cannot access default constructor '" + className + "'",
                     e);
         }
         if (retValue != null) {

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDecorationFilter.java
 Tue May 12 21:44:39 2009
@@ -25,6 +25,7 @@
 import org.apache.tiles.Attribute;
 import org.apache.tiles.AttributeContext;
 import org.apache.tiles.TilesContainer;
+import org.apache.tiles.reflect.ClassUtil;
 import org.apache.tiles.servlet.context.ServletUtil;
 
 import javax.servlet.Filter;
@@ -175,8 +176,7 @@
         temp = config.getInitParameter("mutator");
         if (temp != null) {
             try {
-                mutator = (AttributeContextMutator) Class.forName(temp)
-                        .newInstance();
+                mutator = (AttributeContextMutator) 
ClassUtil.instantiate(temp);
             } catch (Exception e) {
                 throw new ServletException("Unable to instantiate specified 
context mutator.", e);
             }

Modified: 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
URL: 
http://svn.apache.org/viewvc/tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java?rev=774104&r1=774103&r2=774104&view=diff
==============================================================================
--- 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
 (original)
+++ 
tiles/framework/branches/TILES_2_1_X/tiles-servlet/src/main/java/org/apache/tiles/web/util/TilesDispatchServlet.java
 Tue May 12 21:44:39 2009
@@ -24,6 +24,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.tiles.TilesContainer;
 import org.apache.tiles.AttributeContext;
+import org.apache.tiles.reflect.ClassUtil;
 import org.apache.tiles.servlet.context.ServletUtil;
 
 import javax.servlet.ServletException;
@@ -75,8 +76,7 @@
         String temp = getInitParameter("mutator");
         if (temp != null) {
             try {
-                mutator = (AttributeContextMutator) Class.forName(temp)
-                        .newInstance();
+                mutator = (AttributeContextMutator) 
ClassUtil.instantiate(temp);
             } catch (Exception e) {
                 throw new ServletException("Unable to instantiate specified 
context mutator.", e);
             }

Propchange: tiles/framework/branches/TILES_2_1_X/tiles-test/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 12 21:44:39 2009
@@ -1 +1 @@
-/tiles/framework/trunk/tiles-test:747340
+/tiles/framework/trunk/tiles-test:747340,772781


Reply via email to