You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/01/11 15:09:57 UTC
svn commit: r1057642 - in
/sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp:
JspScriptEngineFactory.java jasper/compiler/JspRuntimeContext.java
Author: cziegeler
Date: Tue Jan 11 14:09:56 2011
New Revision: 1057642
URL: http://svn.apache.org/viewvc?rev=1057642&view=rev
Log:
SLING-1928 : JSP API classes from the environment can't be used.
Modified:
sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/JspScriptEngineFactory.java
sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/JspRuntimeContext.java
Modified: sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/JspScriptEngineFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/JspScriptEngineFactory.java?rev=1057642&r1=1057641&r2=1057642&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/JspScriptEngineFactory.java (original)
+++ sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/JspScriptEngineFactory.java Tue Jan 11 14:09:56 2011
@@ -115,6 +115,9 @@ public class JspScriptEngineFactory
private ServiceRegistration eventHandlerRegistration;
+ /** The handler for the jsp factories. */
+ private JspRuntimeContext.JspFactoryHandler jspFactoryHandler;
+
public static final String[] SCRIPT_TYPE = { "jsp", "jspf", "jspx" };
public static final String[] NAMES = { "jsp", "JSP" };
@@ -161,6 +164,7 @@ public class JspScriptEngineFactory
}
final SlingIOProvider io = this.ioProvider;
io.setRequestResourceResolver(resolver);
+ jspFactoryHandler.incUsage();
try {
final JspServletWrapperAdapter jsp = getJspWrapperAdapter(scriptHelper);
// create a SlingBindings object
@@ -168,6 +172,7 @@ public class JspScriptEngineFactory
slingBindings.putAll(bindings);
jsp.service(slingBindings);
} finally {
+ jspFactoryHandler.decUsage();
io.resetRequestResourceResolver();
}
}
@@ -217,6 +222,8 @@ public class JspScriptEngineFactory
Thread.currentThread().setContextClassLoader(jspClassLoader);
try {
+ this.jspFactoryHandler = JspRuntimeContext.initFactoryHandler();
+
this.tldLocationsCache = new SlingTldLocationsCache(componentContext.getBundleContext());
// prepare some classes
@@ -283,6 +290,8 @@ public class JspScriptEngineFactory
}
ioProvider = null;
+ this.jspFactoryHandler.destroy();
+ this.jspFactoryHandler = null;
}
/**
Modified: sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/JspRuntimeContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/JspRuntimeContext.java?rev=1057642&r1=1057641&r2=1057642&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/JspRuntimeContext.java (original)
+++ sling/trunk/bundles/scripting/jsp/src/main/java/org/apache/sling/scripting/jsp/jasper/compiler/JspRuntimeContext.java Tue Jan 11 14:09:56 2011
@@ -33,8 +33,14 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import javax.servlet.Servlet;
import javax.servlet.ServletContext;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.jsp.JspApplicationContext;
+import javax.servlet.jsp.JspEngineInfo;
import javax.servlet.jsp.JspFactory;
+import javax.servlet.jsp.PageContext;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
@@ -71,11 +77,86 @@ public final class JspRuntimeContext {
/** The {@link IOProvider} used to get access to output */
private IOProvider ioProvider = IOProvider.DEFAULT;
+ /** This is a delegate forwarding either to our own factory
+ * or the original one.
+ * Depending on the USE_OWN_FACTORY flag.
+ */
+ public static final class JspFactoryHandler extends JspFactory {
+
+ private final JspFactory original;
+
+ private final JspFactory own;
+
+ public JspFactoryHandler(final JspFactory orig, final JspFactory own) {
+ this.original = (orig instanceof JspFactoryHandler ? ((JspFactoryHandler)orig).original : orig);
+ this.own = own;
+ }
+
+ private JspFactory getFactory() {
+ final Integer useOwnFactory = USE_OWN_FACTORY.get();
+ if ( useOwnFactory == null || useOwnFactory.intValue() == 0 ) {
+ return this.original;
+ }
+ return this.own;
+ }
+
+ @Override
+ public PageContext getPageContext(Servlet paramServlet,
+ ServletRequest paramServletRequest,
+ ServletResponse paramServletResponse, String paramString,
+ boolean paramBoolean1, int paramInt, boolean paramBoolean2) {
+ return this.getFactory().getPageContext(paramServlet, paramServletRequest,
+ paramServletResponse, paramString, paramBoolean1,
+ paramInt, paramBoolean2);
+ }
+
+ @Override
+ public void releasePageContext(PageContext paramPageContext) {
+ this.getFactory().releasePageContext(paramPageContext);
+ }
+
+ @Override
+ public JspEngineInfo getEngineInfo() {
+ return this.getFactory().getEngineInfo();
+ }
+
+ @Override
+ public JspApplicationContext getJspApplicationContext(
+ ServletContext paramServletContext) {
+ return this.getFactory().getJspApplicationContext(paramServletContext);
+ }
+
+ /**
+ * Reset the jsp factory.
+ */
+ public void destroy() {
+ final JspFactory current = JspFactory.getDefaultFactory();
+ if ( current == this ) {
+ JspFactory.setDefaultFactory(this.original);
+ }
+ }
+
+ public void incUsage() {
+ final Integer count = JspRuntimeContext.USE_OWN_FACTORY.get();
+ int newCount = 1;
+ if ( count != null ) {
+ newCount = count + 1;
+ }
+ JspRuntimeContext.USE_OWN_FACTORY.set(newCount);
+ }
+
+ public void decUsage() {
+ final Integer count = JspRuntimeContext.USE_OWN_FACTORY.get();
+ JspRuntimeContext.USE_OWN_FACTORY.set(count - 1);
+ }
+ }
+
/**
* Preload classes required at runtime by a JSP servlet so that
* we don't get a defineClassInPackage security exception.
+ * And set jsp factory
*/
- static {
+ public static JspFactoryHandler initFactoryHandler() {
JspFactoryImpl factory = new JspFactoryImpl();
SecurityClassLoad.securityClassLoad(factory.getClass().getClassLoader());
if( System.getSecurityManager() != null ) {
@@ -98,9 +179,13 @@ public final class JspRuntimeContext {
}
}
- JspFactory.setDefaultFactory(factory);
+ final JspFactoryHandler key = new JspFactoryHandler(JspFactory.getDefaultFactory(), factory);
+ JspFactory.setDefaultFactory(key);
+ return key;
}
+ private static final ThreadLocal<Integer> USE_OWN_FACTORY = new ThreadLocal<Integer>();
+
// ----------------------------------------------------------- Constructors
/**