Author: cziegeler Date: Wed Oct 19 10:19:44 2016 New Revision: 1765572 URL: http://svn.apache.org/viewvc?rev=1765572&view=rev Log: SLING-6006 : SlingServletResolver should move to new ResourceChangeListener API . Apply patch from Rachit Kumar. Also updating to latest parent pom
Modified: sling/trunk/bundles/servlets/resolver/pom.xml sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/SlingServletConfig.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/SlingServletResolverCacheMBean.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/package-info.java Modified: sling/trunk/bundles/servlets/resolver/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/pom.xml?rev=1765572&r1=1765571&r2=1765572&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/pom.xml (original) +++ sling/trunk/bundles/servlets/resolver/pom.xml Wed Oct 19 10:19:44 2016 @@ -23,7 +23,7 @@ <parent> <groupId>org.apache.sling</groupId> <artifactId>sling</artifactId> - <version>26</version> + <version>29</version> <relativePath /> </parent> @@ -85,7 +85,7 @@ <dependencies> <dependency> <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> + <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>org.apache.sling</groupId> @@ -94,6 +94,18 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.event</artifactId> + <version>1.3.1</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.component</artifactId> + <version>1.3.0</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.adapter</artifactId> <version>2.0.4</version> @@ -108,7 +120,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.osgi</artifactId> - <version>2.0.6</version> + <version>2.2.0</version> <scope>provided</scope> </dependency> <dependency> @@ -119,11 +131,7 @@ </dependency> <dependency> <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> + <artifactId>osgi.core</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> @@ -148,9 +156,5 @@ <groupId>org.jmock</groupId> <artifactId>jmock-junit4</artifactId> </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.scr.annotations</artifactId> - </dependency> </dependencies> </project> Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1765572&r1=1765571&r2=1765572&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Wed Oct 19 10:19:44 2016 @@ -52,8 +52,8 @@ import javax.servlet.http.HttpServletReq import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; +import org.apache.felix.scr.annotations.Activate; import org.apache.felix.scr.annotations.Component; -import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.PropertyUnbounded; import org.apache.felix.scr.annotations.Reference; @@ -75,11 +75,14 @@ import org.apache.sling.api.resource.Res import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.SyntheticResource; +import org.apache.sling.api.resource.observation.ExternalResourceChangeListener; +import org.apache.sling.api.resource.observation.ResourceChange; +import org.apache.sling.api.resource.observation.ResourceChangeListener; import org.apache.sling.api.scripting.SlingScript; import org.apache.sling.api.scripting.SlingScriptResolver; import org.apache.sling.api.servlets.OptingServlet; import org.apache.sling.api.servlets.ServletResolver; -import org.apache.sling.commons.osgi.OsgiUtil; +import org.apache.sling.commons.osgi.PropertiesUtil; import org.apache.sling.engine.ResponseUtil; import org.apache.sling.engine.servlets.ErrorHandler; import org.apache.sling.servlets.resolver.internal.defaults.DefaultErrorHandlerServlet; @@ -110,26 +113,17 @@ import org.slf4j.LoggerFactory; * The resolver uses an own session to find the scripts. * */ -@Component(name="org.apache.sling.servlets.resolver.SlingServletResolver", metatype=true, - label="%servletresolver.name", description="%servletresolver.description") -@Service(value={ServletResolver.class, SlingScriptResolver.class, ErrorHandler.class, SlingRequestListener.class}) -@Properties({ - @Property(name="service.description", value="Sling Servlet Resolver and Error Handler"), - @Property(name="event.topics", propertyPrivate=true, - value={"org/apache/sling/api/resource/Resource/*", - "org/apache/sling/api/resource/ResourceProvider/*", - "javax/script/ScriptEngineFactory/*", - "org/apache/sling/api/adapter/AdapterFactory/*", - "org/apache/sling/scripting/core/BindingsValuesProvider/*"}) -}) -@Reference(name="Servlet", referenceInterface=javax.servlet.Servlet.class, - cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE, policy=ReferencePolicy.DYNAMIC) +@Component(name = "org.apache.sling.servlets.resolver.SlingServletResolver", metatype = true, label = "%servletresolver.name", description = "%servletresolver.description") +@Service(value = { ServletResolver.class, SlingScriptResolver.class, ErrorHandler.class, SlingRequestListener.class }) +@Property(name = Constants.SERVICE_DESCRIPTION, value = "Apache Sling Servlet Resolver and Error Handler") +@Reference(name = "Servlet", referenceInterface = javax.servlet.Servlet.class, cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC) public class SlingServletResolver implements ServletResolver, SlingScriptResolver, SlingRequestListener, ErrorHandler, - EventHandler { + EventHandler, + ResourceChangeListener,ExternalResourceChangeListener { /** * The default servlet root is the first search path (which is usally /apps) @@ -780,7 +774,7 @@ public class SlingServletResolver private Map<String, Object> createAuthenticationInfo(final Dictionary<String, Object> props) { final Map<String, Object> authInfo = new HashMap<String, Object>(); // if a script user is configured we use this user to read the scripts - final String scriptUser = OsgiUtil.toString(props.get(PROP_SCRIPT_USER), null); + final String scriptUser = PropertiesUtil.toString(props.get(PROP_SCRIPT_USER), null); if (scriptUser != null && scriptUser.length() > 0) { authInfo.put(ResourceResolverFactory.USER_IMPERSONATION, scriptUser); } @@ -792,7 +786,7 @@ public class SlingServletResolver /** * Activate this component. */ - @SuppressWarnings("unchecked") + @Activate protected void activate(final ComponentContext context) throws LoginException { // from configuration if available final Dictionary<?, ?> properties = context.getProperties(); @@ -818,7 +812,7 @@ public class SlingServletResolver createAllServlets(refs); // execution paths - this.executionPaths = OsgiUtil.toStringArray(properties.get(PROP_PATHS), DEFAULT_PATHS); + this.executionPaths = PropertiesUtil.toStringArray(properties.get(PROP_PATHS), DEFAULT_PATHS); if ( this.executionPaths != null ) { // if we find a string combination that basically allows all paths, // we simply set the array to null @@ -838,10 +832,10 @@ public class SlingServletResolver } } } - this.defaultExtensions = OsgiUtil.toStringArray(properties.get(PROP_DEFAULT_EXTENSIONS), DEFAULT_DEFAULT_EXTENSIONS); + this.defaultExtensions = PropertiesUtil.toStringArray(properties.get(PROP_DEFAULT_EXTENSIONS), DEFAULT_DEFAULT_EXTENSIONS); // create cache - if a cache size is configured - this.cacheSize = OsgiUtil.toInteger(properties.get(PROP_CACHE_SIZE), DEFAULT_CACHE_SIZE); + this.cacheSize = PropertiesUtil.toInteger(properties.get(PROP_CACHE_SIZE), DEFAULT_CACHE_SIZE); if (this.cacheSize > 5) { this.cache = new ConcurrentHashMap<AbstractResourceCollector, Servlet>(cacheSize); this.logCacheSizeWarning = true; @@ -853,11 +847,19 @@ public class SlingServletResolver this.getDefaultServlet(); // and finally register as event listener - this.eventHandlerReg = context.getBundleContext().registerService(EventHandler.class.getName(), this, - properties); - this.plugin = new ServletResolverWebConsolePlugin(context.getBundleContext()); + final Dictionary<String, Object> props = new Hashtable<String, Object>(); + props.put("event.topics", new String[] {"javax/script/ScriptEngineFactory/*", + "org/apache/sling/api/adapter/AdapterFactory/*","org/apache/sling/scripting/core/BindingsValuesProvider/*" }); + props.put(ResourceChangeListener.PATHS, "/"); + props.put("service.description", "Apache Sling Servlet Resolver and Error Handler"); + props.put("service.vendor","The Apache Software Foundation"); + + this.eventHandlerReg = context.getBundleContext() + .registerService(new String[] {ResourceChangeListener.class.getName(), EventHandler.class.getName()}, this, props); + + this.plugin = new ServletResolverWebConsolePlugin(context.getBundleContext()); if (this.cacheSize > 0) { try { Dictionary<String, String> mbeanProps = new Hashtable<String, String>(); @@ -1067,7 +1069,6 @@ public class SlingServletResolver public void handleEvent(final Event event) { if (this.cache != null) { boolean flushCache = false; - // we may receive different events final String topic = event.getTopic(); if (topic.startsWith("javax/script/ScriptEngineFactory/")) { @@ -1080,21 +1081,6 @@ public class SlingServletResolver } else if (topic.startsWith("org/apache/sling/scripting/core/BindingsValuesProvider/")) { // bindings values provide factory added or removed: we always flush flushCache = true; - } else { - // this is a resource or resource provider event - - // if the path of the event is a sub path of a search path - // we flush the whole cache - final String path = (String) event.getProperty(SlingConstants.PROPERTY_PATH); - if ( path != null ) { - int index = 0; - while (!flushCache && index < searchPaths.length) { - if (path.startsWith(this.searchPaths[index])) { - flushCache = true; - } - index++; - } - } } if (flushCache) { flushCache(); @@ -1413,4 +1399,31 @@ public class SlingServletResolver } } + + @Override + public void onChange(List<ResourceChange> changes) { + if (this.cache != null) { + boolean flushCache = false; + for(ResourceChange change : changes){ + // we may receive different events + final String topic = change.getType().toString(); + // this is a resource or resource provider event + // if the path of the event is a sub path of a search path + // we flush the whole cache + final String path = change.getPath(); + if ( path != null ) { + int index = 0; + while (!flushCache && index < searchPaths.length) { + if (path.startsWith(this.searchPaths[index])) { + flushCache = true; + } + index++; + } + } + if (flushCache) { + flushCache(); + } + } + } + } } Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/SlingServletConfig.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/SlingServletConfig.java?rev=1765572&r1=1765571&r2=1765572&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/SlingServletConfig.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/SlingServletConfig.java Wed Oct 19 10:19:44 2016 @@ -58,6 +58,7 @@ public class SlingServletConfig implemen /** * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String) */ + @Override public String getInitParameter(String name) { Object prop = reference.getProperty(name); return (prop == null) ? null : String.valueOf(prop); @@ -66,14 +67,16 @@ public class SlingServletConfig implemen /** * @see javax.servlet.ServletConfig#getInitParameterNames() */ - public Enumeration<?> getInitParameterNames() { - List<?> keys = Arrays.asList(reference.getPropertyKeys()); + @Override + public Enumeration<String> getInitParameterNames() { + List<String> keys = Arrays.asList(reference.getPropertyKeys()); return Collections.enumeration(keys); } /** * @see javax.servlet.ServletConfig#getServletContext() */ + @Override public ServletContext getServletContext() { return servletContext; } @@ -81,6 +84,7 @@ public class SlingServletConfig implemen /** * @see javax.servlet.ServletConfig#getServletName() */ + @Override public String getServletName() { return this.name; } Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/SlingServletResolverCacheMBean.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/SlingServletResolverCacheMBean.java?rev=1765572&r1=1765571&r2=1765572&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/SlingServletResolverCacheMBean.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/SlingServletResolverCacheMBean.java Wed Oct 19 10:19:44 2016 @@ -18,21 +18,24 @@ */ package org.apache.sling.servlets.resolver.jmx; +import org.osgi.annotation.versioning.ProviderType; + /** * This is the management interface for the SlingServletResolver's cache. */ +@ProviderType public interface SlingServletResolverCacheMBean { /** * Get the current size of the servlet resolver cache - * + * * @return the cache size */ int getCacheSize(); - + /** * Get the maximum configured size of the servlet resolver cache - * + * * @return the maximum configured size */ int getMaximumCacheSize(); Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/package-info.java?rev=1765572&r1=1765571&r2=1765572&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/package-info.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/jmx/package-info.java Wed Oct 19 10:19:44 2016 @@ -17,8 +17,8 @@ * under the License. */ -@Version("2.3.6") +@org.osgi.annotation.versioning.Version("2.3.7") package org.apache.sling.servlets.resolver.jmx; -import aQute.bnd.annotation.Version; +