Skip to content

Commit 36940c5

Browse files
committed
only activate EL support if JSP ExpressionFactory actually available (SPR-6852)
1 parent 6aa0599 commit 36940c5

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

org.springframework.web.servlet/src/main/java/org/springframework/web/servlet/view/tiles2/TilesConfigurer.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.Map;
2727
import java.util.Properties;
2828
import javax.servlet.ServletContext;
29+
import javax.servlet.jsp.JspFactory;
2930

3031
import org.apache.commons.logging.Log;
3132
import org.apache.commons.logging.LogFactory;
@@ -143,8 +144,6 @@ public TilesConfigurer() {
143144
Boolean.toString(false));
144145
this.tilesPropertyMap.put(DefinitionsFactory.LOCALE_RESOLVER_IMPL_PROPERTY,
145146
SpringLocaleResolver.class.getName());
146-
this.tilesPropertyMap.put(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, tilesElPresent ?
147-
"org.apache.tiles.evaluator.el.ELAttributeEvaluator" : DirectAttributeEvaluator.class.getName());
148147
}
149148

150149

@@ -288,6 +287,15 @@ public void setServletContext(ServletContext servletContext) {
288287
* @see #createTilesInitializer()
289288
*/
290289
public void afterPropertiesSet() throws TilesException {
290+
boolean activateEl = false;
291+
if (tilesElPresent) {
292+
activateEl = new JspExpressionChecker().isExpressionFactoryAvailable();
293+
if (!this.tilesPropertyMap.containsKey(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM)) {
294+
this.tilesPropertyMap.put(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, activateEl ?
295+
"org.apache.tiles.evaluator.el.ELAttributeEvaluator" : DirectAttributeEvaluator.class.getName());
296+
}
297+
}
298+
291299
SpringTilesApplicationContextFactory factory = new SpringTilesApplicationContextFactory();
292300
factory.init(this.tilesPropertyMap);
293301
TilesApplicationContext preliminaryContext = factory.createApplicationContext(this.servletContext);
@@ -300,6 +308,7 @@ public void afterPropertiesSet() throws TilesException {
300308
// We need to do this after initialization simply because we're reusing the
301309
// original CompleteAutoloadTilesInitializer above. We cannot subclass
302310
// CompleteAutoloadTilesInitializer when compiling against Tiles 2.1...
311+
logger.debug("Registering Tiles 2.2 LocaleResolver for complete-autoload setup");
303312
try {
304313
BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext);
305314
DefinitionsFactory definitionsFactory = container.getDefinitionsFactory();
@@ -311,12 +320,12 @@ public void afterPropertiesSet() throws TilesException {
311320
}
312321
}
313322

314-
if (tilesElPresent && this.tilesInitializer instanceof SpringTilesInitializer) {
323+
if (activateEl && this.tilesInitializer instanceof SpringTilesInitializer) {
315324
// Again, we need to do this after initialization since SpringTilesContainerFactory
316325
// cannot override template methods that refer to Tiles 2.2 classes: in this case,
317326
// AttributeEvaluatorFactory as createAttributeEvaluatorFactory return type.
318327
BasicTilesContainer container = (BasicTilesContainer) ServletUtil.getContainer(this.servletContext);
319-
TilesElActivator.registerEvaluator(container);
328+
new TilesElActivator().registerEvaluator(container);
320329
}
321330
}
322331

@@ -423,9 +432,29 @@ protected PreparerFactory createPreparerFactory(TilesApplicationContext applicat
423432
}
424433

425434

426-
private static class TilesElActivator {
435+
private class JspExpressionChecker {
436+
437+
public boolean isExpressionFactoryAvailable() {
438+
try {
439+
JspFactory factory = JspFactory.getDefaultFactory();
440+
if (factory != null &&
441+
factory.getJspApplicationContext(servletContext).getExpressionFactory() != null) {
442+
logger.info("Found JSP 2.1 ExpressionFactory");
443+
return true;
444+
}
445+
}
446+
catch (Throwable ex) {
447+
logger.warn("Could not obtain JSP 2.1 ExpressionFactory", ex);
448+
}
449+
return false;
450+
}
451+
}
452+
453+
454+
private class TilesElActivator {
427455

428-
public static void registerEvaluator(BasicTilesContainer container) {
456+
public void registerEvaluator(BasicTilesContainer container) {
457+
logger.debug("Registering Tiles 2.2 AttributeEvaluatorFactory for JSP 2.1");
429458
try {
430459
ClassLoader cl = TilesElActivator.class.getClassLoader();
431460
Class aef = cl.loadClass("org.apache.tiles.evaluator.AttributeEvaluatorFactory");

org.springframework.web.servlet/src/test/java/org/springframework/web/servlet/view/tiles2/TilesConfigurerTests.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@
1616

1717
package org.springframework.web.servlet.view.tiles2;
1818

19-
import java.util.Properties;
20-
2119
import org.apache.tiles.context.TilesRequestContext;
22-
import org.apache.tiles.evaluator.impl.DirectAttributeEvaluator;
23-
import org.apache.tiles.factory.TilesContainerFactory;
2420
import org.apache.tiles.impl.BasicTilesContainer;
2521
import org.apache.tiles.servlet.context.ServletTilesRequestContext;
2622
import org.apache.tiles.servlet.context.ServletUtil;
@@ -41,9 +37,6 @@ public void simpleBootstrap() {
4137
MockServletContext sc = new MockServletContext();
4238
TilesConfigurer tc = new TilesConfigurer();
4339
tc.setDefinitions(new String[] {"/org/springframework/web/servlet/view/tiles2/tiles-definitions.xml"});
44-
Properties props = new Properties();
45-
props.setProperty(TilesContainerFactory.ATTRIBUTE_EVALUATOR_INIT_PARAM, DirectAttributeEvaluator.class.getName());
46-
tc.setTilesProperties(props);
4740
tc.setServletContext(sc);
4841
tc.afterPropertiesSet();
4942

0 commit comments

Comments
 (0)