only activate EL support if JSP ExpressionFactory actually available (SPR-6852)

This commit is contained in:
Juergen Hoeller 2010-02-17 21:54:21 +00:00
parent 6aa05994ae
commit 36940c5fc8
2 changed files with 35 additions and 13 deletions

View File

@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import javax.servlet.jsp.JspFactory;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -143,8 +144,6 @@ public class TilesConfigurer implements ServletContextAware, InitializingBean, D
Boolean.toString(false)); Boolean.toString(false));
this.tilesPropertyMap.put(DefinitionsFactory.LOCALE_RESOLVER_IMPL_PROPERTY, this.tilesPropertyMap.put(DefinitionsFactory.LOCALE_RESOLVER_IMPL_PROPERTY,
SpringLocaleResolver.class.getName()); SpringLocaleResolver.class.getName());
this.tilesPropertyMap.put(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, tilesElPresent ?
"org.apache.tiles.evaluator.el.ELAttributeEvaluator" : DirectAttributeEvaluator.class.getName());
} }
@ -288,6 +287,15 @@ public class TilesConfigurer implements ServletContextAware, InitializingBean, D
* @see #createTilesInitializer() * @see #createTilesInitializer()
*/ */
public void afterPropertiesSet() throws TilesException { public void afterPropertiesSet() throws TilesException {
boolean activateEl = false;
if (tilesElPresent) {
activateEl = new JspExpressionChecker().isExpressionFactoryAvailable();
if (!this.tilesPropertyMap.containsKey(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM)) {
this.tilesPropertyMap.put(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, activateEl ?
"org.apache.tiles.evaluator.el.ELAttributeEvaluator" : DirectAttributeEvaluator.class.getName());
}
}
SpringTilesApplicationContextFactory factory = new SpringTilesApplicationContextFactory(); SpringTilesApplicationContextFactory factory = new SpringTilesApplicationContextFactory();
factory.init(this.tilesPropertyMap); factory.init(this.tilesPropertyMap);
TilesApplicationContext preliminaryContext = factory.createApplicationContext(this.servletContext); TilesApplicationContext preliminaryContext = factory.createApplicationContext(this.servletContext);
@ -300,6 +308,7 @@ public class TilesConfigurer implements ServletContextAware, InitializingBean, D
// We need to do this after initialization simply because we're reusing the // We need to do this after initialization simply because we're reusing the
// original CompleteAutoloadTilesInitializer above. We cannot subclass // original CompleteAutoloadTilesInitializer above. We cannot subclass
// CompleteAutoloadTilesInitializer when compiling against Tiles 2.1... // CompleteAutoloadTilesInitializer when compiling against Tiles 2.1...
logger.debug("Registering Tiles 2.2 LocaleResolver for complete-autoload setup");
try { try {
BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext); BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext);
DefinitionsFactory definitionsFactory = container.getDefinitionsFactory(); DefinitionsFactory definitionsFactory = container.getDefinitionsFactory();
@ -311,12 +320,12 @@ public class TilesConfigurer implements ServletContextAware, InitializingBean, D
} }
} }
if (tilesElPresent && this.tilesInitializer instanceof SpringTilesInitializer) { if (activateEl && this.tilesInitializer instanceof SpringTilesInitializer) {
// Again, we need to do this after initialization since SpringTilesContainerFactory // Again, we need to do this after initialization since SpringTilesContainerFactory
// cannot override template methods that refer to Tiles 2.2 classes: in this case, // cannot override template methods that refer to Tiles 2.2 classes: in this case,
// AttributeEvaluatorFactory as createAttributeEvaluatorFactory return type. // AttributeEvaluatorFactory as createAttributeEvaluatorFactory return type.
BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext); BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext);
TilesElActivator.registerEvaluator(container); new TilesElActivator().registerEvaluator(container);
} }
} }
@ -423,9 +432,29 @@ public class TilesConfigurer implements ServletContextAware, InitializingBean, D
} }
private static class TilesElActivator { private class JspExpressionChecker {
public static void registerEvaluator(BasicTilesContainer container) { public boolean isExpressionFactoryAvailable() {
try {
JspFactory factory = JspFactory.getDefaultFactory();
if (factory != null &&
factory.getJspApplicationContext(servletContext).getExpressionFactory() != null) {
logger.info("Found JSP 2.1 ExpressionFactory");
return true;
}
}
catch (Throwable ex) {
logger.warn("Could not obtain JSP 2.1 ExpressionFactory", ex);
}
return false;
}
}
private class TilesElActivator {
public void registerEvaluator(BasicTilesContainer container) {
logger.debug("Registering Tiles 2.2 AttributeEvaluatorFactory for JSP 2.1");
try { try {
ClassLoader cl = TilesElActivator.class.getClassLoader(); ClassLoader cl = TilesElActivator.class.getClassLoader();
Class aef = cl.loadClass("org.apache.tiles.evaluator.AttributeEvaluatorFactory"); Class aef = cl.loadClass("org.apache.tiles.evaluator.AttributeEvaluatorFactory");

View File

@ -16,11 +16,7 @@
package org.springframework.web.servlet.view.tiles2; package org.springframework.web.servlet.view.tiles2;
import java.util.Properties;
import org.apache.tiles.context.TilesRequestContext; import org.apache.tiles.context.TilesRequestContext;
import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
import org.apache.tiles.factory.TilesContainerFactory;
import org.apache.tiles.impl.BasicTilesContainer; import org.apache.tiles.impl.BasicTilesContainer;
import org.apache.tiles.servlet.context.ServletTilesRequestContext; import org.apache.tiles.servlet.context.ServletTilesRequestContext;
import org.apache.tiles.servlet.context.ServletUtil; import org.apache.tiles.servlet.context.ServletUtil;
@ -41,9 +37,6 @@ public class TilesConfigurerTests {
MockServletContext sc = new MockServletContext(); MockServletContext sc = new MockServletContext();
TilesConfigurer tc = new TilesConfigurer(); TilesConfigurer tc = new TilesConfigurer();
tc.setDefinitions(new String[] {"/org/springframework/web/servlet/view/tiles2/tiles-definitions.xml"}); tc.setDefinitions(new String[] {"/org/springframework/web/servlet/view/tiles2/tiles-definitions.xml"});
Properties props = new Properties();
props.setProperty(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, DirectAttributeEvaluator.class.getName());
tc.setTilesProperties(props);
tc.setServletContext(sc); tc.setServletContext(sc);
tc.afterPropertiesSet(); tc.afterPropertiesSet();