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@1763446 13f79535-47bb-0310-9956-ffa450edef68
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 @@
      * 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 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.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.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 @@
  *
  */
 @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 @@
 
     private ServletConfig servletConfig;
 
-    private ServiceRegistration eventHandlerRegistration;
-
     public static final String SCRIPT_TYPE = "java";
 
     /**
@@ -112,6 +114,7 @@
     /**
      * @see javax.script.ScriptEngineFactory#getScriptEngine()
      */
+    @Override
     public ScriptEngine getScriptEngine() {
         return new JavaScriptEngine(this);
     }
@@ -119,6 +122,7 @@
     /**
      * @see javax.script.ScriptEngineFactory#getLanguageName()
      */
+    @Override
     public String getLanguageName() {
         return "Java Servlet Compiler";
     }
@@ -126,6 +130,7 @@
     /**
      * @see javax.script.ScriptEngineFactory#getLanguageVersion()
      */
+    @Override
     public String getLanguageVersion() {
         return "1.5";
     }
@@ -145,38 +150,25 @@
     /**
      * 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());
+        this.servletConfig = new JavaServletConfig(javaServletContext, config);
 
-        // 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.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 @@
         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 @@
         /**
          * @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 @@
 
     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 @@
 
         // 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 @@
     /**
      * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String)
      */
+    @Override
     public String getInitParameter(String name) {
         return initParams.get(name);
     }
@@ -79,6 +77,7 @@
     /**
      * @see javax.servlet.ServletConfig#getInitParameterNames()
      */
+    @Override
     public Enumeration<String> getInitParameterNames() {
         return Collections.enumeration(initParams.keySet());
     }
@@ -86,6 +85,7 @@
     /**
      * @see javax.servlet.ServletConfig#getServletContext()
      */
+    @Override
     public ServletContext getServletContext() {
         return servletContext;
     }
@@ -93,6 +93,7 @@
     /**
      * @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.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 @@
     /**
      * @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 @@
     /**
      * @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 @@
     /**
      * @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 @@
     /**
      * @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 @@
     /**
      * @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 @@
     /**
      * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
      */
+    @Override
     public Object getAttribute(String name) {
         return delegatee.getAttribute(name);
     }
@@ -134,13 +150,15 @@
     /**
      * @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 @@
     /**
      * @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 @@
     /**
      * @see javax.servlet.ServletContext#getContext(java.lang.String)
      */
+    @Override
     public ServletContext getContext(String uripath) {
         return delegatee.getContext(uripath);
     }
@@ -162,6 +182,7 @@
     /**
      * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
      */
+    @Override
     public String getInitParameter(String name) {
         return delegatee.getInitParameter(name);
     }
@@ -169,13 +190,15 @@
     /**
      * @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 @@
     /**
      * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
      */
+    @Override
     public String getMimeType(String file) {
         return delegatee.getMimeType(file);
     }
@@ -190,6 +214,7 @@
     /**
      * @see javax.servlet.ServletContext#getMinorVersion()
      */
+    @Override
     public int getMinorVersion() {
         return delegatee.getMinorVersion();
     }
@@ -197,6 +222,7 @@
     /**
      * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
      */
+    @Override
     public RequestDispatcher getNamedDispatcher(String name) {
         return delegatee.getNamedDispatcher(name);
     }
@@ -204,6 +230,7 @@
     /**
      * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
      */
+    @Override
     public String getRealPath(String path) {
         return delegatee.getRealPath(path);
     }
@@ -211,6 +238,7 @@
     /**
      * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
      */
+    @Override
     public RequestDispatcher getRequestDispatcher(String path) {
         return delegatee.getRequestDispatcher(path);
     }
@@ -218,6 +246,7 @@
     /**
      * @see javax.servlet.ServletContext#getServerInfo()
      */
+    @Override
     public String getServerInfo() {
         return delegatee.getServerInfo();
     }
@@ -225,6 +254,7 @@
     /**
      * @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 @@
     /**
      * @see javax.servlet.ServletContext#getServletContextName()
      */
+    @Override
     public String getServletContextName() {
         return delegatee.getServletContextName();
     }
@@ -240,26 +271,164 @@
     /**
      * @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) {