SLING-7536 : Refactor implementation
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
index a204001..d3be338 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
@@ -59,11 +59,11 @@
 import org.apache.sling.servlets.resolver.internal.helper.ResourceCollector;
 import org.apache.sling.servlets.resolver.internal.resolution.ResolutionCache;
 import org.apache.sling.servlets.resolver.internal.resource.SlingServletConfig;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.metatype.annotations.Designate;
 import org.slf4j.Logger;
@@ -102,28 +102,28 @@
     @Reference
     private ResolutionCache resolutionCache;
 
-    private ResourceResolver sharedScriptResolver;
-
     @Reference(target="(name=org.apache.sling)")
     private ServletContext servletContext;
 
     // the default servlet if no other servlet applies for a request. This
     // field is set on demand by getDefaultServlet()
-    private Servlet defaultServlet;
+    private volatile Servlet defaultServlet;
 
     // the default error handler servlet if no other error servlet applies for
     // a request. This field is set on demand by getDefaultErrorServlet()
-    private Servlet fallbackErrorServlet;
+    private volatile Servlet fallbackErrorServlet;
+
+    private volatile ResourceResolver sharedScriptResolver;
 
     /**
      * The allowed execution paths.
      */
-    private String[] executionPaths;
+    private volatile String[] executionPaths;
 
     /**
      * The default extensions
      */
-    private String[] defaultExtensions;
+    private volatile String[] defaultExtensions;
 
     // ---------- ServletResolver interface -----------------------------------
 
@@ -638,7 +638,7 @@
      * Activate this component.
      */
     @Activate
-    protected void activate(final BundleContext context, final ResolverConfig config) throws LoginException {
+    protected void activate(final ResolverConfig config) throws LoginException {
         this.sharedScriptResolver =
                 resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object)SERVICE_USER));
 
@@ -649,11 +649,18 @@
         this.getDefaultServlet();
     }
 
+    @Modified
+    protected void modified(final ResolverConfig config) throws LoginException {
+        this.deactivate();
+        this.activate(config);
+    }
+
     /**
      * Deactivate this component.
      */
     @Deactivate
     protected void deactivate() {
+        this.resolutionCache.flushCache();
         // destroy the fallback error handler servlet
         if (fallbackErrorServlet != null) {
             try {
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java b/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
index c758372..79ca6dc 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/console/WebConsolePlugin.java
@@ -53,6 +53,7 @@
 import org.osgi.framework.Constants;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Modified;
 import org.osgi.service.component.annotations.Reference;
 
 @SuppressWarnings("serial")
@@ -85,17 +86,18 @@
     /**
      * The allowed execution paths.
      */
-    private String[] executionPaths;
+    private volatile String[] executionPaths;
 
     /**
      * The default extensions
      */
-    private String[] defaultExtensions;
+    private volatile String[] defaultExtensions;
 
     /**
      * Activate this component.
      */
     @Activate
+    @Modified
     protected void activate(final ResolverConfig config) {
         this.executionPaths = AbstractResourceCollector.getExecutionPaths(config.servletresolver_paths());
         this.defaultExtensions = config.servletresolver_defaultExtensions();
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
index 52fe1f1..f954f6b 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resolution/ResolutionCache.java
@@ -46,6 +46,7 @@
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Modified;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventConstants;
@@ -73,7 +74,7 @@
     private volatile Map<AbstractResourceCollector, Servlet> cache;
 
     /** The cache size. */
-    private int cacheSize;
+    private volatile int cacheSize;
 
     /** Flag to log warning if cache size exceed only once. */
     private volatile boolean logCacheSizeWarning;
@@ -115,7 +116,7 @@
         props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Servlet Resolver Event Handler");
         props.put(Constants.SERVICE_VENDOR,"The Apache Software Foundation");
 
-        // the event listener is for updating the script enginge extensions
+        // the event listener is for updating the script engine extensions
         props.put(EventConstants.EVENT_TOPIC, new String[] {
                 "javax/script/ScriptEngineFactory/*",
                 "org/apache/sling/api/adapter/AdapterFactory/*",
@@ -141,6 +142,13 @@
         updateScriptEngineExtensions();
     }
 
+    @Modified
+    protected void modified(final BundleContext context,
+            final ResolverConfig config) throws LoginException {
+        this.deactivate();
+        this.activate(context, config);
+    }
+
     /**
      * Deactivate this component.
      */
@@ -167,7 +175,10 @@
         }
     }
 
-
+    /**
+     * Get the list of script engine extensions
+     * @return The list of script engine extensions
+     */
     public List<String> getScriptEngineExtensions() {
         return this.scriptEnginesExtensions;
     }
@@ -197,7 +208,7 @@
         updateScriptEngineExtensions();
     }
 
-    private void flushCache() {
+    public void flushCache() {
         // use local variable to avoid racing with deactivate
         final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
         if ( localCache != null ) {
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
index 8d9344b..074a73a 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
@@ -21,7 +21,6 @@
 import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertEquals;
 
-import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -67,6 +66,12 @@
     private MockResourceResolver mockResourceResolver;
 
     @Before public void setUp() throws Exception {
+        final ResolverConfig config = Mockito.mock(ResolverConfig.class);
+        Mockito.when(config.servletresolver_servletRoot()).thenReturn("0");
+        Mockito.when(config.servletresolver_paths()).thenReturn(new String[] { "/"});
+        Mockito.when(config.servletresolver_defaultExtensions()).thenReturn(new String[] {"html"});
+        Mockito.when(config.servletresolver_cacheSize()).thenReturn(200);
+
         mockResourceResolver = new MockResourceResolver() {
             @Override
             public void close() {
@@ -156,35 +161,7 @@
             ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
             SERVLET_EXTENSION);
 
-//        servletResolver.bindServlet(SlingServletResolverTest.this.servlet, serviceReference);
-        servletResolver.activate(bundleContext, new ResolverConfig() {
-
-            @Override
-            public Class<? extends Annotation> annotationType() {
-                return ResolverConfig.class;
-            }
-
-            @Override
-            public String servletresolver_servletRoot() {
-                return "0";
-            }
-
-            @Override
-            public String[] servletresolver_paths() {
-                return new String[] {"/"};
-            }
-
-            @Override
-            public String[] servletresolver_defaultExtensions() {
-                // TODO Auto-generated method stub
-                return new String[] {"html"};
-            }
-
-            @Override
-            public int servletresolver_cacheSize() {
-                return 200;
-            }
-        });
+        servletResolver.activate(config);
 
         String path = "/"
             + MockSlingHttpServletRequest.RESOURCE_TYPE