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.1.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-java.git
commit 2d16abbd3400349729c2ffc38cbcf77aa4c960a9 Author: Carsten Ziegeler <[email protected]> AuthorDate: Wed Oct 5 13:08:15 2016 +0000 SLING-6003 : JavaScriptEngineFactory should move to new ResourceChangeListener API . Apply patch from abdul hameed pathan and improve registration of event listener. git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/scripting/java@1763446 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 33 +--- .../sling/scripting/java/impl/CompilerOptions.java | 4 +- .../java/impl/JavaScriptEngineFactory.java | 76 ++++----- .../scripting/java/impl/JavaServletConfig.java | 19 +-- .../scripting/java/impl/JavaServletContext.java | 179 ++++++++++++++++++++- 5 files changed, 227 insertions(+), 84 deletions(-) diff --git a/pom.xml b/pom.xml index 67fabd4..329dc8c 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ <parent> <groupId>org.apache.sling</groupId> <artifactId>sling</artifactId> - <version>26</version> + <version>28</version> <relativePath /> </parent> @@ -53,19 +53,11 @@ <extensions>true</extensions> <configuration> <instructions> - <Private-Package> - org.apache.sling.scripting.java.impl - </Private-Package> <ScriptEngine-Name>${project.name}</ScriptEngine-Name> <ScriptEngine-Version>${project.version}</ScriptEngine-Version> </instructions> </configuration> </plugin> - </plugins> - </build> - - <reporting> - <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> @@ -77,28 +69,18 @@ </configuration> </plugin> </plugins> - </reporting> + </build> <dependencies> <dependency> <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.scr.annotations</artifactId> + <artifactId>osgi.core</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> - <version>2.0.8</version> + <version>2.11.0</version> <scope>provided</scope> </dependency> <dependency> @@ -110,7 +92,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.compiler</artifactId> - <version>2.1.0</version> + <version>2.3.0</version> <scope>provided</scope> </dependency> <dependency> @@ -127,14 +109,11 @@ </dependency> <dependency> <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.5</version> - <scope>provided</scope> + <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> - <scope>provided</scope> </dependency> <dependency> <groupId>javax.inject</groupId> diff --git a/src/main/java/org/apache/sling/scripting/java/impl/CompilerOptions.java b/src/main/java/org/apache/sling/scripting/java/impl/CompilerOptions.java index 190c71f..795d86d 100644 --- a/src/main/java/org/apache/sling/scripting/java/impl/CompilerOptions.java +++ b/src/main/java/org/apache/sling/scripting/java/impl/CompilerOptions.java @@ -16,7 +16,7 @@ */ package org.apache.sling.scripting.java.impl; -import java.util.Dictionary; +import java.util.Map; import org.apache.sling.commons.compiler.Options; import org.apache.sling.commons.osgi.PropertiesUtil; @@ -31,7 +31,7 @@ public class CompilerOptions extends Options { * Create an compiler options object using data available from * the component configuration. */ - public static CompilerOptions createOptions(final Dictionary<String, Object> props) { + public static CompilerOptions createOptions(final Map<String, Object> props) { final String currentVersion = System.getProperty("java.specification.version"); final CompilerOptions opts = new CompilerOptions(); diff --git a/src/main/java/org/apache/sling/scripting/java/impl/JavaScriptEngineFactory.java b/src/main/java/org/apache/sling/scripting/java/impl/JavaScriptEngineFactory.java index bcd5d0a..77a9309 100644 --- a/src/main/java/org/apache/sling/scripting/java/impl/JavaScriptEngineFactory.java +++ b/src/main/java/org/apache/sling/scripting/java/impl/JavaScriptEngineFactory.java @@ -20,8 +20,9 @@ import static org.apache.sling.api.scripting.SlingBindings.SLING; import java.io.IOException; import java.io.Reader; -import java.util.Dictionary; import java.util.Hashtable; +import java.util.List; +import java.util.Map; import javax.script.Bindings; import javax.script.ScriptContext; @@ -31,17 +32,22 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; -import org.apache.sling.api.SlingConstants; import org.apache.sling.api.SlingException; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingIOException; import org.apache.sling.api.SlingServletException; import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.observation.ExternalResourceChangeListener; +import org.apache.sling.api.resource.observation.ResourceChange; +import org.apache.sling.api.resource.observation.ResourceChange.ChangeType; +import org.apache.sling.api.resource.observation.ResourceChangeListener; import org.apache.sling.api.scripting.SlingBindings; import org.apache.sling.api.scripting.SlingScript; import org.apache.sling.api.scripting.SlingScriptConstants; @@ -49,10 +55,6 @@ import org.apache.sling.api.scripting.SlingScriptHelper; import org.apache.sling.commons.compiler.JavaCompiler; 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; @@ -61,18 +63,20 @@ import org.slf4j.LoggerFactory; * */ @Component(metatype=true, label="%javahandler.name", description="%javahandler.description") -@Service(value=javax.script.ScriptEngineFactory.class) +@Service(value={javax.script.ScriptEngineFactory.class, ResourceChangeListener.class}) @Properties({ @Property(name="service.vendor", value="The Apache Software Foundation"), @Property(name="service.description", value="Java Servlet Script Handler"), @Property(name=JavaScriptEngineFactory.PROPERTY_COMPILER_SOURCE_V_M, value=JavaScriptEngineFactory.VERSION_AUTO), @Property(name=JavaScriptEngineFactory.PROPERTY_COMPILER_TARGET_V_M, value=JavaScriptEngineFactory.VERSION_AUTO), @Property(name=JavaScriptEngineFactory.PROPERTY_CLASSDEBUGINFO, boolValue=true), - @Property(name=JavaScriptEngineFactory.PROPERTY_ENCODING, value="UTF-8") + @Property(name=JavaScriptEngineFactory.PROPERTY_ENCODING, value="UTF-8"), + @Property(name = ResourceChangeListener.CHANGES, value = {"CHANGED","REMOVED"}), + @Property(name = ResourceChangeListener.PATHS, value = {"glob:."}, propertyPrivate = true) }) public class JavaScriptEngineFactory extends AbstractScriptEngineFactory - implements EventHandler { + implements ResourceChangeListener, ExternalResourceChangeListener { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -98,8 +102,6 @@ public class JavaScriptEngineFactory private ServletConfig servletConfig; - private ServiceRegistration eventHandlerRegistration; - public static final String SCRIPT_TYPE = "java"; /** @@ -112,6 +114,7 @@ public class JavaScriptEngineFactory /** * @see javax.script.ScriptEngineFactory#getScriptEngine() */ + @Override public ScriptEngine getScriptEngine() { return new JavaScriptEngine(this); } @@ -119,6 +122,7 @@ public class JavaScriptEngineFactory /** * @see javax.script.ScriptEngineFactory#getLanguageName() */ + @Override public String getLanguageName() { return "Java Servlet Compiler"; } @@ -126,6 +130,7 @@ public class JavaScriptEngineFactory /** * @see javax.script.ScriptEngineFactory#getLanguageVersion() */ + @Override public String getLanguageVersion() { return "1.5"; } @@ -145,38 +150,25 @@ public class JavaScriptEngineFactory /** * Activate this engine * - * @param componentContext + * @param config Configuration properties */ - @SuppressWarnings("unchecked") - protected void activate(final ComponentContext componentContext) { - final CompilerOptions opts = CompilerOptions.createOptions(componentContext.getProperties()); + @Activate + protected void activate(final Map<String, Object> config) { + final CompilerOptions opts = CompilerOptions.createOptions(new Hashtable<>(config)); this.ioProvider = new SlingIOProvider(this.javaCompiler, opts); this.javaServletContext = new JavaServletContext(ioProvider, slingServletContext); - this.servletConfig = new JavaServletConfig(javaServletContext, - componentContext.getProperties()); - - // register event handler - 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.servletConfig = new JavaServletConfig(javaServletContext, config); - this.eventHandlerRegistration = componentContext.getBundleContext() - .registerService(EventHandler.class.getName(), this, props); logger.info("Activating Apache Sling Script Engine for Java with options {}", opts); } /** * Deactivate this engine - * @param componentContext */ - protected void deactivate(final ComponentContext componentContext) { - if ( this.eventHandlerRegistration != null ) { - this.eventHandlerRegistration.unregister(); - this.eventHandlerRegistration = null; - } + @Deactivate + protected void deactivate() { if ( this.ioProvider != null ) { this.ioProvider.destroy(); this.ioProvider = null; @@ -249,16 +241,17 @@ public class JavaScriptEngineFactory return wrapper; } - /** - * @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), false); - } else if ( SlingConstants.TOPIC_RESOURCE_REMOVED.equals(event.getTopic()) ) { - this.handleModification((String)event.getProperty(SlingConstants.PROPERTY_PATH), true); - } - } + @Override + public void onChange(List<ResourceChange> resourceChange) { + for(ResourceChange change : resourceChange){ + ChangeType topic = change.getType(); + if (topic.equals(ChangeType.CHANGED)) { + this.handleModification(change.getPath(), false); + } else if (topic.equals(ChangeType.REMOVED)){ + this.handleModification(change.getPath(), true); + } + } + } private void handleModification(final String scriptName, final boolean remove) { this.ioProvider.getServletCache().removeWrapper(scriptName); @@ -273,6 +266,7 @@ public class JavaScriptEngineFactory /** * @see javax.script.ScriptEngine#eval(java.io.Reader, javax.script.ScriptContext) */ + @Override public Object eval(Reader script, ScriptContext context) throws ScriptException { final Bindings props = context.getBindings(ScriptContext.ENGINE_SCOPE); diff --git a/src/main/java/org/apache/sling/scripting/java/impl/JavaServletConfig.java b/src/main/java/org/apache/sling/scripting/java/impl/JavaServletConfig.java index 278c9c4..10ca0c4 100644 --- a/src/main/java/org/apache/sling/scripting/java/impl/JavaServletConfig.java +++ b/src/main/java/org/apache/sling/scripting/java/impl/JavaServletConfig.java @@ -19,7 +19,6 @@ package org.apache.sling.scripting.java.impl; import java.util.Collections; -import java.util.Dictionary; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -43,7 +42,7 @@ public class JavaServletConfig implements ServletConfig { private final Map<String, String> initParams; - public JavaServletConfig(ServletContext servletContext, Dictionary<?, ?> config) { + public JavaServletConfig(ServletContext servletContext, Map<String, Object> config) { this.servletContext = servletContext; // set the servlet name @@ -55,14 +54,12 @@ public class JavaServletConfig implements ServletConfig { // copy the "java." properties initParams = new HashMap<String, String>(); - for (Enumeration<?> ke = config.keys(); ke.hasMoreElements();) { - final String key = (String) ke.nextElement(); - if (key.startsWith("java.")) { - final Object value = config.get(key); - if ( value != null ) { - final String strValue = String.valueOf(value).trim(); + for (final Map.Entry<String, Object> entry : config.entrySet()) { + if (entry.getKey().startsWith("java.")) { + if ( entry.getValue() != null ) { + final String strValue = String.valueOf(entry.getValue()).trim(); if ( strValue.length() > 0 ) { - initParams.put(key.substring("java.".length()), strValue); + initParams.put(entry.getKey().substring("java.".length()), strValue); } } } @@ -72,6 +69,7 @@ public class JavaServletConfig implements ServletConfig { /** * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String) */ + @Override public String getInitParameter(String name) { return initParams.get(name); } @@ -79,6 +77,7 @@ public class JavaServletConfig implements ServletConfig { /** * @see javax.servlet.ServletConfig#getInitParameterNames() */ + @Override public Enumeration<String> getInitParameterNames() { return Collections.enumeration(initParams.keySet()); } @@ -86,6 +85,7 @@ public class JavaServletConfig implements ServletConfig { /** * @see javax.servlet.ServletConfig#getServletContext() */ + @Override public ServletContext getServletContext() { return servletContext; } @@ -93,6 +93,7 @@ public class JavaServletConfig implements ServletConfig { /** * @see javax.servlet.ServletConfig#getServletName() */ + @Override public String getServletName() { return servletName; } diff --git a/src/main/java/org/apache/sling/scripting/java/impl/JavaServletContext.java b/src/main/java/org/apache/sling/scripting/java/impl/JavaServletContext.java index 7f8a02d..c9c2775 100644 --- a/src/main/java/org/apache/sling/scripting/java/impl/JavaServletContext.java +++ b/src/main/java/org/apache/sling/scripting/java/impl/JavaServletContext.java @@ -20,12 +20,21 @@ import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Enumeration; +import java.util.EventListener; +import java.util.Map; import java.util.Set; +import javax.servlet.Filter; +import javax.servlet.FilterRegistration; import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; +import javax.servlet.ServletRegistration.Dynamic; +import javax.servlet.SessionCookieConfig; +import javax.servlet.SessionTrackingMode; +import javax.servlet.descriptor.JspConfigDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +59,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getResource(java.lang.String) */ + @Override public URL getResource(String path) throws MalformedURLException { if (path.startsWith("/")) { URL url = ioProvider.getURL(path); @@ -65,6 +75,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String) */ + @Override public InputStream getResourceAsStream(String path) { // path might be an URL, so only check resource provider in case of an // absolute path - assuming URLs have no leading slash at all, we @@ -98,13 +109,15 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String) */ - public Set<?> getResourcePaths(String path) { + @Override + public Set<String> getResourcePaths(String path) { return ioProvider.getResourcePaths(path); } /** * @see javax.servlet.ServletContext#log(java.lang.String) */ + @Override public void log(String msg) { log.info(msg); } @@ -112,6 +125,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String) */ + @Override @Deprecated public void log(Exception exception, String msg) { log(msg, exception); @@ -120,6 +134,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable) */ + @Override public void log(String message, Throwable throwable) { log.error(message, throwable); } @@ -127,6 +142,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getAttribute(java.lang.String) */ + @Override public Object getAttribute(String name) { return delegatee.getAttribute(name); } @@ -134,13 +150,15 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getAttributeNames() */ - public Enumeration<?> getAttributeNames() { + @Override + public Enumeration<String> getAttributeNames() { return delegatee.getAttributeNames(); } /** * @see javax.servlet.ServletContext#removeAttribute(java.lang.String) */ + @Override public void removeAttribute(String name) { delegatee.removeAttribute(name); } @@ -148,6 +166,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object) */ + @Override public void setAttribute(String name, Object object) { delegatee.setAttribute(name, object); } @@ -155,6 +174,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getContext(java.lang.String) */ + @Override public ServletContext getContext(String uripath) { return delegatee.getContext(uripath); } @@ -162,6 +182,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getInitParameter(java.lang.String) */ + @Override public String getInitParameter(String name) { return delegatee.getInitParameter(name); } @@ -169,13 +190,15 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getInitParameterNames() */ - public Enumeration<?> getInitParameterNames() { + @Override + public Enumeration<String> getInitParameterNames() { return delegatee.getInitParameterNames(); } /** * @see javax.servlet.ServletContext#getMajorVersion() */ + @Override public int getMajorVersion() { return delegatee.getMajorVersion(); } @@ -183,6 +206,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getMimeType(java.lang.String) */ + @Override public String getMimeType(String file) { return delegatee.getMimeType(file); } @@ -190,6 +214,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getMinorVersion() */ + @Override public int getMinorVersion() { return delegatee.getMinorVersion(); } @@ -197,6 +222,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String) */ + @Override public RequestDispatcher getNamedDispatcher(String name) { return delegatee.getNamedDispatcher(name); } @@ -204,6 +230,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getRealPath(java.lang.String) */ + @Override public String getRealPath(String path) { return delegatee.getRealPath(path); } @@ -211,6 +238,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String) */ + @Override public RequestDispatcher getRequestDispatcher(String path) { return delegatee.getRequestDispatcher(path); } @@ -218,6 +246,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getServerInfo() */ + @Override public String getServerInfo() { return delegatee.getServerInfo(); } @@ -225,6 +254,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getServlet(java.lang.String) */ + @Override @Deprecated public Servlet getServlet(String name) throws ServletException { return delegatee.getServlet(name); @@ -233,6 +263,7 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getServletContextName() */ + @Override public String getServletContextName() { return delegatee.getServletContextName(); } @@ -240,26 +271,164 @@ public class JavaServletContext implements ServletContext { /** * @see javax.servlet.ServletContext#getServletNames() */ + @Override @Deprecated - public Enumeration<?> getServletNames() { + public Enumeration<String> getServletNames() { return delegatee.getServletNames(); } /** * @see javax.servlet.ServletContext#getServlets() */ + @Override @Deprecated - public Enumeration<?> getServlets() { + public Enumeration<Servlet> getServlets() { return delegatee.getServlets(); } /** * @see javax.servlet.ServletContext#getContextPath() */ + @Override public String getContextPath() { return delegatee.getContextPath(); } + @Override + public int getEffectiveMajorVersion() { + return delegatee.getEffectiveMajorVersion(); + } + + @Override + public int getEffectiveMinorVersion() { + return delegatee.getEffectiveMinorVersion(); + } + + @Override + public boolean setInitParameter(String name, String value) { + return delegatee.setInitParameter(name, value); + } + + @Override + public Dynamic addServlet(String servletName, String className) { + return delegatee.addServlet(servletName, className); + } + + @Override + public Dynamic addServlet(String servletName, Servlet servlet) { + return delegatee.addServlet(servletName, servlet); + } + + @Override + public Dynamic addServlet(String servletName, Class<? extends Servlet> servletClass) { + return delegatee.addServlet(servletName, servletClass); + } + + @Override + public <T extends Servlet> T createServlet(Class<T> clazz) throws ServletException { + return delegatee.createServlet(clazz); + } + + @Override + public ServletRegistration getServletRegistration(String servletName) { + return delegatee.getServletRegistration(servletName); + } + + @Override + public Map<String, ? extends ServletRegistration> getServletRegistrations() { + return delegatee.getServletRegistrations(); + } + + @Override + public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, String className) { + return delegatee.addFilter(filterName, className); + } + + @Override + public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Filter filter) { + return delegatee.addFilter(filterName, filter); + } + + @Override + public javax.servlet.FilterRegistration.Dynamic addFilter(String filterName, Class<? extends Filter> filterClass) { + return delegatee.addFilter(filterName, filterClass); + } + + @Override + public <T extends Filter> T createFilter(Class<T> clazz) throws ServletException { + return delegatee.createFilter(clazz); + } + + @Override + public FilterRegistration getFilterRegistration(String filterName) { + return delegatee.getFilterRegistration(filterName); + } + + @Override + public Map<String, ? extends FilterRegistration> getFilterRegistrations() { + return delegatee.getFilterRegistrations(); + } + + @Override + public SessionCookieConfig getSessionCookieConfig() { + return delegatee.getSessionCookieConfig(); + } + + @Override + public void setSessionTrackingModes(Set<SessionTrackingMode> sessionTrackingModes) { + delegatee.setSessionTrackingModes(sessionTrackingModes); + } + + @Override + public Set<SessionTrackingMode> getDefaultSessionTrackingModes() { + return delegatee.getDefaultSessionTrackingModes(); + } + + @Override + public Set<SessionTrackingMode> getEffectiveSessionTrackingModes() { + return delegatee.getEffectiveSessionTrackingModes(); + } + + @Override + public void addListener(String className) { + delegatee.addListener(className); + } + + @Override + public <T extends EventListener> void addListener(T t) { + delegatee.addListener(t); + } + + @Override + public void addListener(Class<? extends EventListener> listenerClass) { + delegatee.addListener(listenerClass); + } + + @Override + public <T extends EventListener> T createListener(Class<T> clazz) throws ServletException { + return delegatee.createListener(clazz); + } + + @Override + public JspConfigDescriptor getJspConfigDescriptor() { + return delegatee.getJspConfigDescriptor(); + } + + @Override + public ClassLoader getClassLoader() { + return delegatee.getClassLoader(); + } + + @Override + public void declareRoles(String... roleNames) { + delegatee.declareRoles(roleNames); + } + + @Override + public String getVirtualServerName() { + return delegatee.getVirtualServerName(); + } + //---------- internal ----------------------------------------------------- private URL getUrlForResource(String path) { -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
