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")
[email protected]("2.3.7")
package org.apache.sling.servlets.resolver.jmx;
-import aQute.bnd.annotation.Version;
+