This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.scripting.java-2.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-java.git
commit bfc4376767c22c779d16078f9ad8369a1ac02308 Author: Carsten Ziegeler <[email protected]> AuthorDate: Wed Feb 17 15:31:27 2010 +0000 SLING-1385 : Recompile java scripts on modification and avoid periodic checks git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/scripting/java@911018 13f79535-47bb-0310-9956-ffa450edef68 --- .../sling/scripting/java/CompilationContext.java | 20 ++++--- .../scripting/java/JavaScriptEngineFactory.java | 66 +++++++++++++++++----- .../org/apache/sling/scripting/java/Options.java | 32 ----------- .../sling/scripting/java/ServletWrapper.java | 10 ++-- .../OSGI-INF/metatype/metatype.properties | 10 ---- 5 files changed, 68 insertions(+), 70 deletions(-) diff --git a/src/main/java/org/apache/sling/scripting/java/CompilationContext.java b/src/main/java/org/apache/sling/scripting/java/CompilationContext.java index ebf646c..764d95b 100644 --- a/src/main/java/org/apache/sling/scripting/java/CompilationContext.java +++ b/src/main/java/org/apache/sling/scripting/java/CompilationContext.java @@ -52,7 +52,7 @@ public class CompilationContext { private ServletCache servletCache; - private long lastModificationTest = 0L; + private volatile long lastModificationTest = 0L; private int removed = 0; private Class<?> servletClass; @@ -131,18 +131,22 @@ public class CompilationContext { return false; } + public long getLastModificationTest() { + return this.lastModificationTest; + } + + public void setLastModificationTest(final long value) { + this.lastModificationTest = value; + } + /** * Check if the compiled class file is older than the source file */ public boolean isOutDated() { - if (this.options.getModificationTestInterval() > 0) { - - if (this.lastModificationTest - + (this.options.getModificationTestInterval() * 1000) > System.currentTimeMillis()) { - return false; - } - this.lastModificationTest = System.currentTimeMillis(); + if ( this.lastModificationTest > 0 ) { + return false; } + this.lastModificationTest = System.currentTimeMillis(); final long sourceLastModified = this.ioProvider.lastModified(getSourcePath()); diff --git a/src/main/java/org/apache/sling/scripting/java/JavaScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/java/JavaScriptEngineFactory.java index 605c0ca..2e1e4a6 100644 --- a/src/main/java/org/apache/sling/scripting/java/JavaScriptEngineFactory.java +++ b/src/main/java/org/apache/sling/scripting/java/JavaScriptEngineFactory.java @@ -19,6 +19,8 @@ package org.apache.sling.scripting.java; import static org.apache.sling.api.scripting.SlingBindings.SLING; import java.io.Reader; +import java.util.Dictionary; +import java.util.Hashtable; import javax.script.Bindings; import javax.script.ScriptContext; @@ -27,6 +29,7 @@ import javax.script.ScriptException; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; +import org.apache.sling.api.SlingConstants; import org.apache.sling.api.SlingException; import org.apache.sling.api.SlingIOException; import org.apache.sling.api.SlingServletException; @@ -39,7 +42,10 @@ import org.apache.sling.commons.classloader.ClassLoaderWriter; import org.apache.sling.commons.classloader.DynamicClassLoaderManager; import org.apache.sling.scripting.api.AbstractScriptEngineFactory; import org.apache.sling.scripting.api.AbstractSlingScriptEngine; +import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,19 +55,19 @@ import org.slf4j.LoggerFactory; * @scr.component label="%javahandler.name" description="%javahandler.description" * @scr.property name="service.description" value="Java Servlet Script Handler" * @scr.property name="service.vendor" value="The Apache Software Foundation" - * @scr.service + * @scr.service interface="javax.script.ScriptEngineFactory" * * @scr.property name="java.javaEncoding" value="UTF-8" * @scr.property name="java.compilerSourceVM" value="1.5" * @scr.property name="java.compilerTargetVM" value="1.5" - * @scr.property name="java.development" value="true" type="Boolean" - * @scr.property name="java.modificationTestInterval" value="-1" * @scr.property name="java.classdebuginfo" value="true" type="Boolean" */ -public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { +public class JavaScriptEngineFactory + extends AbstractScriptEngineFactory + implements EventHandler { /** default logger */ - private final Logger log = LoggerFactory.getLogger(getClass()); + private final Logger logger = LoggerFactory.getLogger(getClass()); /** * @scr.reference @@ -90,6 +96,8 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { /** Compiler options. */ private Options compilerOptions; + private ServiceRegistration eventHandlerRegistration; + public static final String SCRIPT_TYPE = "java"; /** @@ -124,7 +132,7 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { * Activate this engine * @param componentContext */ - protected void activate(ComponentContext componentContext) { + protected void activate(final ComponentContext componentContext) { this.ioProvider = new SlingIOProvider(this.classLoaderWriter); this.servletCache = new ServletCache(); @@ -135,20 +143,31 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { componentContext.getProperties()); this.compilerOptions = new Options(componentContext, this.javaClassLoader); - if (log.isDebugEnabled()) { - log.debug("JavaServletScriptEngine.activate()"); + final Dictionary<String, String> props = new Hashtable<String, String>(); + props.put("event.topics","org/apache/sling/api/resource/*"); + props.put("service.description","Java Servlet Script Modification Handler"); + props.put("service.vendor","The Apache Software Foundation"); + + this.eventHandlerRegistration = componentContext.getBundleContext() + .registerService(EventHandler.class.getName(), this, props); + if (logger.isDebugEnabled()) { + logger.debug("JavaServletScriptEngine.activate()"); } } /** * Deactivate this engine - * @param oldComponentContext + * @param componentContext */ - protected void deactivate(ComponentContext oldComponentContext) { - if (log.isDebugEnabled()) { - log.debug("JavaServletScriptEngine.deactivate()"); + protected void deactivate(final ComponentContext componentContext) { + if (logger.isDebugEnabled()) { + logger.debug("JavaServletScriptEngine.deactivate()"); } + if ( this.eventHandlerRegistration != null ) { + this.eventHandlerRegistration.unregister(); + this.eventHandlerRegistration = null; + } ioProvider = null; javaServletContext = null; servletConfig = null; @@ -164,7 +183,6 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { * @throws SlingServletException * @throws SlingIOException */ - @SuppressWarnings("unchecked") private void callServlet(final Bindings bindings, final SlingScriptHelper scriptHelper, final ScriptContext context) { @@ -185,8 +203,8 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { } } - private ServletWrapper getWrapperAdapter( - SlingScriptHelper scriptHelper) throws SlingException { + private ServletWrapper getWrapperAdapter(final SlingScriptHelper scriptHelper) + throws SlingException { SlingScript script = scriptHelper.getScript(); final String scriptName = script.getScriptResource().getPath(); @@ -247,6 +265,24 @@ public class JavaScriptEngineFactory extends AbstractScriptEngineFactory { } // ---------- Internal ----------------------------------------------------- + /** + * @see org.osgi.service.event.EventHandler#handleEvent(org.osgi.service.event.Event) + */ + public void handleEvent(Event event) { + if ( SlingConstants.TOPIC_RESOURCE_CHANGED.equals(event.getTopic()) ) { + this.handleModification((String)event.getProperty(SlingConstants.PROPERTY_PATH)); + } else if ( SlingConstants.TOPIC_RESOURCE_REMOVED.equals(event.getTopic()) ) { + this.handleModification((String)event.getProperty(SlingConstants.PROPERTY_PATH)); + } + } + + private void handleModification(final String scriptName) { + final ServletWrapper wrapper = this.servletCache.getWrapper(scriptName); + if ( wrapper != null ) { + wrapper.getCompilationContext().setLastModificationTest(0); + } + } + private static class JavaScriptEngine extends AbstractSlingScriptEngine { JavaScriptEngine(JavaScriptEngineFactory factory) { diff --git a/src/main/java/org/apache/sling/scripting/java/Options.java b/src/main/java/org/apache/sling/scripting/java/Options.java index 375c348..4dea523 100644 --- a/src/main/java/org/apache/sling/scripting/java/Options.java +++ b/src/main/java/org/apache/sling/scripting/java/Options.java @@ -34,21 +34,12 @@ public class Options { private static final String PROPERTY_COMPILER_TARGET_V_M = "compilerTargetVM"; - private static final String PROPERTY_DEVELOPMENT = "development"; - - private static final String PROPERTY_MODIFICATION_TEST_INTERVAL = "modificationTestInterval"; - private static final String PROPERTY_CLASSDEBUGINFO = "classdebuginfo"; /** Default source and target VM version (value is "1.5"). */ private static final String DEFAULT_VM_VERSION = "1.5"; /** - * Is the engine being used in development mode? - */ - private final boolean development; - - /** * Do we want to include debugging information in the class file? */ private final boolean classDebugInfo; @@ -69,11 +60,6 @@ public class Options { private final String javaEncoding; /** - * Modification test interval. - */ - private final int modificationTestInterval; - - /** * Classloader */ private final ClassLoader classLoader; @@ -91,8 +77,6 @@ public class Options { final Properties properties = new Properties(); // set default values first properties.put(PROPERTY_CLASSDEBUGINFO, "true"); - properties.put(PROPERTY_DEVELOPMENT, "true"); - properties.put(PROPERTY_MODIFICATION_TEST_INTERVAL, "-1"); properties.put(PROPERTY_COMPILER_TARGET_V_M, DEFAULT_VM_VERSION); properties.put(PROPERTY_COMPILER_SOURCE_V_M, DEFAULT_VM_VERSION); properties.put(PROPERTY_JAVA_ENCODING, "UTF-8"); @@ -112,8 +96,6 @@ public class Options { } this.classDebugInfo = Boolean.valueOf(properties.get(PROPERTY_CLASSDEBUGINFO).toString()); - this.modificationTestInterval = Integer.valueOf(properties.get(PROPERTY_MODIFICATION_TEST_INTERVAL).toString()); - this.development = Boolean.valueOf(properties.get(PROPERTY_DEVELOPMENT).toString()); this.compilerTargetVM = properties.get(PROPERTY_COMPILER_TARGET_V_M).toString(); this.compilerSourceVM = properties.get(PROPERTY_COMPILER_SOURCE_V_M).toString(); this.javaEncoding = properties.get(PROPERTY_JAVA_ENCODING).toString(); @@ -133,20 +115,6 @@ public class Options { return this.classDebugInfo; } - /** - * Modification test interval. - */ - public int getModificationTestInterval() { - return this.modificationTestInterval; - } - - /** - * Is the engine being used in development mode? - */ - public boolean getDevelopment() { - return this.development; - } - public ClassLoader getClassLoader() { return this.classLoader; } diff --git a/src/main/java/org/apache/sling/scripting/java/ServletWrapper.java b/src/main/java/org/apache/sling/scripting/java/ServletWrapper.java index 4d948f5..481d832 100644 --- a/src/main/java/org/apache/sling/scripting/java/ServletWrapper.java +++ b/src/main/java/org/apache/sling/scripting/java/ServletWrapper.java @@ -53,9 +53,6 @@ public class ServletWrapper { /** Reload flag. */ private boolean reload = true; - /** Compiler options. */ - private final Options options; - private Servlet theServlet; private long available = 0L; private boolean firstTime = true; @@ -72,7 +69,6 @@ public class ServletWrapper { final ServletCache servletCache) { this.config = config; this.servletUri = servletPath; - this.options = options; this.ctxt = new CompilationContext(servletUri, options, ioProvider, servletCache, this); } @@ -85,6 +81,10 @@ public class ServletWrapper { this.reload = reload; } + public CompilationContext getCompilationContext() { + return this.ctxt; + } + /** * Get the servlet. * @return The servlet. @@ -189,7 +189,7 @@ public class ServletWrapper { /* * (1) Compile */ - if (options.getDevelopment() || firstTime ) { + if (firstTime || ctxt.getLastModificationTest() == 0 ) { synchronized (this) { firstTime = false; diff --git a/src/main/resources/OSGI-INF/metatype/metatype.properties b/src/main/resources/OSGI-INF/metatype/metatype.properties index c6e2467..dad70ff 100644 --- a/src/main/resources/OSGI-INF/metatype/metatype.properties +++ b/src/main/resources/OSGI-INF/metatype/metatype.properties @@ -30,16 +30,6 @@ java.classdebuginfo.name = Generate Debug Info java.classdebuginfo.description = Should the class file be compiled with \ debugging information? true or false, default true. -java.modificationTestInterval.name = Modification Check Interval -java.modificationTestInterval.description = Checks for modification for a \ - given Java file will be performed only once every \ - specified amount of seconds. Setting this to -1 will cause the source to be checked \ - on every access. Default is -1. - -java.development.name = Development Mode -java.development.description = Is scripting used in development mode (will check \ - for modification on every access)? true or false, default true. - java.javaEncoding.name = Source Encoding java.javaEncoding.description = Encoding to be used to read the source files. \ This defaults to UTF-8 and should only be changed in very specific circumstances. -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
