Author: cziegeler
Date: Mon Jul 20 15:40:33 2009
New Revision: 795878
URL: http://svn.apache.org/viewvc?rev=795878&view=rev
Log:
SLING-1050 - Use new dynamic class loader.
Modified:
sling/trunk/bundles/scripting/javascript/pom.xml
sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
Modified: sling/trunk/bundles/scripting/javascript/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/javascript/pom.xml?rev=795878&r1=795877&r2=795878&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/javascript/pom.xml (original)
+++ sling/trunk/bundles/scripting/javascript/pom.xml Mon Jul 20 15:40:33 2009
@@ -62,7 +62,6 @@
!org.mozilla.javascript.xml.impl.xmlbeans,
org.mozilla.javascript.*
</Private-Package>
- <DynamicImport-Package>*</DynamicImport-Package>
<ScriptEngine-Name>${pom.name}</ScriptEngine-Name>
<ScriptEngine-Version>${pom.version}</ScriptEngine-Version>
</instructions>
@@ -113,6 +112,11 @@
</dependency>
<dependency>
<groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.classloader</artifactId>
+ <version>0.9.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.json</artifactId>
<version>2.0.2-incubator</version>
</dependency>
Modified:
sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java?rev=795878&r1=795877&r2=795878&view=diff
==============================================================================
---
sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
(original)
+++
sling/trunk/bundles/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/internal/RhinoJavaScriptEngineFactory.java
Mon Jul 20 15:40:33 2009
@@ -24,6 +24,7 @@
import javax.script.ScriptEngine;
+import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
import org.apache.sling.scripting.api.AbstractScriptEngineFactory;
import org.apache.sling.scripting.javascript.RhinoHostObjectProvider;
import org.apache.sling.scripting.javascript.SlingWrapper;
@@ -52,7 +53,7 @@
/**
* The <code>RhinoJavaScriptEngineFactory</code> TODO
- *
+ *
* @scr.component metatype="no"
* @scr.service interface="javax.script.ScriptEngineFactory"
* @scr.reference name="HostObjectProvider"
@@ -79,11 +80,14 @@
private String languageVersion;
private SlingWrapFactory wrapFactory;
-
+
private Scriptable rootScope;
private final Set<RhinoHostObjectProvider> hostObjectProvider = new
HashSet<RhinoHostObjectProvider>();
+ /** @scr.reference */
+ private DynamicClassLoaderManager dynamicClassLoaderManager;
+
public ScriptEngine getScriptEngine() {
return new RhinoJavaScriptEngine(this, getRootScope());
}
@@ -103,21 +107,21 @@
SlingWrapFactory getWrapFactory() {
return wrapFactory;
}
-
+
@SuppressWarnings("unchecked")
private Scriptable getRootScope() {
if (rootScope == null) {
final Context rhinoContext = Context.enter();
try {
-
+
Scriptable tmpScope = rhinoContext.initStandardObjects(
new ImporterTopLevel(), false);
-
+
// default classes
addHostObjects(tmpScope,
(Class<? extends ScriptableObject>[]) HOSTOBJECT_CLASSES);
-
+
// provided classes
for (RhinoHostObjectProvider provider : hostObjectProvider) {
addHostObjects(tmpScope, provider.getHostObjectClasses());
@@ -126,10 +130,10 @@
addImportedPackages(rhinoContext, tmpScope,
provider.getImportedPackages());
}
-
+
// only assign the root scope when complete set up
rootScope = tmpScope;
-
+
} finally {
// ensure the context is exited after setting up the
// the new root scope
@@ -141,7 +145,7 @@
}
private void dropRootScope() {
-
+
// ensure the debugger is closed if the root scope will
// be replaced to ensure no references to the old scope
// and context remain
@@ -149,11 +153,11 @@
if (contextFactory instanceof SlingContextFactory) {
((SlingContextFactory) contextFactory).exitDebugger();
}
-
+
// drop the scope
rootScope = null;
}
-
+
// ---------- SCR integration
protected void activate(ComponentContext context) {
@@ -164,7 +168,7 @@
// setup the wrap factory
wrapFactory = new SlingWrapFactory();
-
+
// initialize the Rhino Context Factory
SlingContextFactory.setup(this);
@@ -179,20 +183,25 @@
"application/javascript");
setNames("javascript", ECMA_SCRIPT_EXTENSION, ESP_SCRIPT_EXTENSION);
- ContextFactory contextFactory = ContextFactory.getGlobal();
+ final ContextFactory contextFactory = ContextFactory.getGlobal();
if (contextFactory instanceof SlingContextFactory) {
((SlingContextFactory) contextFactory).setDebugging(debugging);
}
+ // set the dynamic class loader as the application class loader
+ final DynamicClassLoaderManager dclm = this.dynamicClassLoaderManager;
+ if ( dclm != null ) {
+
contextFactory.initApplicationClassLoader(dynamicClassLoaderManager.getDynamicClassLoader());
+ }
}
protected void deactivate(ComponentContext context) {
// remove the root scope
dropRootScope();
-
+
// remove our context factory
SlingContextFactory.teardown();
-
+
// remove references
wrapFactory = null;
hostObjectProvider.clear();
@@ -226,24 +235,24 @@
ScriptableObject.defineClass(scope, clazz);
if (SlingWrapper.class.isAssignableFrom(clazz)) {
-
+
// SlingWrappers can map to several classes if needed
final SlingWrapper hostWrapper = (SlingWrapper)
clazz.newInstance();;
for (Class<?> c : hostWrapper.getWrappedClasses()) {
getWrapFactory().registerWrapper(c,
hostWrapper.getClassName());
}
-
+
} else {
-
+
// but other Scriptable host objects need to be
// registered as well
final Scriptable host = clazz.newInstance();
getWrapFactory().registerWrapper(
host.getClass(), host.getClassName());
-
+
}
-
+
} catch (Throwable t) {
log.warn("addHostObjects: Cannot prepare host object "
+ clazz, t);