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