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