only activate EL support if JSP ExpressionFactory actually available (SPR-6852)
This commit is contained in:
parent
6aa05994ae
commit
36940c5fc8
|
|
@ -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");
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue