SLING-10493 review and resolve code quality warnings and issues (#16)
reported by sonar
diff --git a/pom.xml b/pom.xml
index bbba837..a5c9899 100644
--- a/pom.xml
+++ b/pom.xml
@@ -153,6 +153,41 @@
</configuration>
</plugin>
</plugins>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>
+ com.github.spotbugs
+ </groupId>
+ <artifactId>
+ spotbugs-maven-plugin
+ </artifactId>
+ <versionRange>
+ [3.1.11,)
+ </versionRange>
+ <goals>
+ <goal>check</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
</build>
<dependencies>
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java b/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
index b8c4035..0069e27 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptor.java
@@ -23,11 +23,11 @@
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
-import org.apache.commons.lang3.ArrayUtils;
import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestUtil;
import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.engine.RequestUtil;
import org.apache.sling.servlets.resolver.internal.resource.SlingServletConfig;
+import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -46,7 +46,11 @@
// a valid selector or extension to avoid collisions
private static final String EMPTY_VALUE = ".EMPTY.";
+ private static final String[] EMPTY_STRINGS = new String[0];
+
static class InvalidPropertyException extends RuntimeException {
+ private static final long serialVersionUID = -119036154771528511L;
+
InvalidPropertyException(String reason) {
super(reason);
}
@@ -79,7 +83,7 @@
private boolean accept(String servletName, SlingServletConfig config, String servicePropertyKey, boolean emptyValueApplies, String ... requestValues) {
final String [] propValues = toStringArray(config.getServiceProperty(servicePropertyKey));
- if(propValues == null) {
+ if(propValues.length == 0) {
LOGGER.debug("Property {} is null or empty, not checking that value for {}", servicePropertyKey, servletName);
return true;
}
@@ -109,7 +113,7 @@
return accepted;
}
- private static String [] toStringArray(final Object value) {
+ private static @NotNull String [] toStringArray(final Object value) {
if(value instanceof String) {
return new String[] { (String)value };
} else if(value instanceof String []) {
@@ -118,6 +122,6 @@
final Object [] objArray = (Object[])value;
return Arrays.copyOf(objArray, objArray.length, String[].class);
}
- return null;
+ return EMPTY_STRINGS;
}
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
index 21941d8..330f115 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
@@ -42,25 +42,25 @@
+ "or a number which specifies the resource resolver's search path entry index. The default value "
+ "is 0 (usually stands for \"/apps\" in the search paths). The number can be -1 which always "
+ "points to the last search path entry.")
- String servletresolver_servletRoot() default "0";
+ String servletresolver_servletRoot() default "0"; // NOSONAR
/** The default cache size for the script resolution. */
@AttributeDefinition(name = "Cache Size", description = "This property configures the size of the "
+ "cache used for script resolution. A value lower than 5 disables the cache.")
- int servletresolver_cacheSize() default 200;
+ int servletresolver_cacheSize() default 200; // NOSONAR
@AttributeDefinition(name = "Execution Paths", description = "The paths to search for executable scripts. If no path is configured "
+ "this is treated like the default (/ = root) which allows to execute all scripts. By configuring some "
+ "paths the execution of scripts can be limited. If a configured value ends with a slash, the whole sub tree "
+ "is allowed. Without a slash an exact matching script is allowed.")
- String[] servletresolver_paths() default "/";
+ String[] servletresolver_paths() default "/"; // NOSONAR
@AttributeDefinition(name = "Default Extensions", description = "The list of extensions for which the default behavior "
+ "will be used. This means that the last path segment of the resource type can be used as the script name.")
- String[] servletresolver_defaultExtensions() default "html";
+ String[] servletresolver_defaultExtensions() default "html"; // NOSONAR
@AttributeDefinition(name = "Mount Providers", description = "Should servlets be mounted as resource providers?" +
" If true (the default), servlets will be represented in the content tree using resource provider -" +
" otherwise, servlets will be decorated back into the content tree using a decorator.")
- boolean servletresolver_mountProviders() default true;
+ boolean servletresolver_mountProviders() default true; // NOSONAR
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
index c5a75ce..f1a4597 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
@@ -19,6 +19,7 @@
package org.apache.sling.servlets.resolver.internal;
import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
import javax.servlet.Servlet;
@@ -44,7 +45,7 @@
*/
public class ScriptResource extends AbstractResource {
- private volatile Resource sharedResource;
+ private AtomicReference<Resource> sharedResource = new AtomicReference<>();
private final ResourceResolver sharedResourceResolver;
@@ -65,10 +66,12 @@
if ( perThreadResolver != null && perThreadResolver.isLive() ) {
return perThreadResolver.getResource(this.path);
}
- if ( this.sharedResource == null ) {
- this.sharedResource = this.sharedResourceResolver.getResource(this.path);
+ Resource resource = this.sharedResource.get();
+ if ( resource == null ) {
+ resource = this.sharedResourceResolver.getResource(this.path);
+ this.sharedResource.set(resource);
}
- return this.sharedResource;
+ return resource;
}
/**
@@ -100,7 +103,7 @@
*/
@SuppressWarnings("unchecked")
@Override
- public <AdapterType> AdapterType adaptTo(final Class<AdapterType> type) {
+ public <T> T adaptTo(final Class<T> type) {
if ( type == Servlet.class ) {
Resource activeResource = this.getActiveResource();
while (activeResource instanceof ResourceWrapper) {
@@ -109,13 +112,13 @@
if (! (activeResource instanceof ServletResource)) {
final Servlet s = (Servlet) super.adaptTo(type);
if ( s != null ) {
- return (AdapterType)s;
+ return (T)s;
}
}
} else if ( type == SlingScript.class ) {
final SlingScript s = (SlingScript)super.adaptTo(type);
if ( s != null ) {
- return (AdapterType)s;
+ return (T)s;
}
}
return this.getActiveResource().adaptTo(type);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
index 46382c0..5ac8eb0 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
@@ -36,12 +36,12 @@
public class ScriptResourceResolver extends ResourceResolverWrapper {
private final ResourceResolver resolver;
- private final Supplier<MergingServletResourceProvider> provider;
+ private final Supplier<MergingServletResourceProvider> providerSupplier;
public ScriptResourceResolver(ResourceResolver resolver, Supplier<MergingServletResourceProvider> provider) {
super(resolver);
this.resolver = resolver;
- this.provider = provider;
+ this.providerSupplier = provider;
}
public static ScriptResourceResolver wrap(ResourceResolver scriptResourceResolver, Supplier<MergingServletResourceProvider> provider) {
@@ -53,14 +53,15 @@
return () -> listChildren(parent);
}
+ @Override
public Resource getResource(String scriptPath) {
- MergingServletResourceProvider provider = this.provider.get();
+ MergingServletResourceProvider provider = this.providerSupplier.get();
if (provider == null) {
return super.getResource(scriptPath);
}
else {
- return wrap(provider.getResource(new ResolveContext() {
+ return wrap(provider.getResource(new ResolveContext<Object>() {
@Override
public ResourceResolver getResourceResolver() {
return ScriptResourceResolver.this;
@@ -78,14 +79,14 @@
@Override
public ResourceProvider<?> getParentResourceProvider() {
- return new ResourceProvider() {
+ return new ResourceProvider<Object>() {
@Override
- public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+ public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
return resolver.getResource(path);
}
@Override
- public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+ public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent) {
return resolver.listChildren(parent);
}
};
@@ -97,19 +98,19 @@
@Override
public Resource getResource(Resource base, @NotNull String path) {
if (!path.startsWith("/") && base != null) {
- path = base.getPath() + "/" + path;
+ path = String.format("%s/%s", base.getPath(), path);
}
return getResource(path);
}
@Override
public Iterator<Resource> listChildren(Resource parent) {
- MergingServletResourceProvider provider = this.provider.get();
+ MergingServletResourceProvider provider = this.providerSupplier.get();
if (provider == null) {
return super.listChildren(parent);
}
else {
- return wrap(provider.listChildren(new ResolveContext() {
+ return wrap(provider.listChildren(new ResolveContext<Object>() {
@Override
public ResourceResolver getResourceResolver() {
return ScriptResourceResolver.this;
@@ -125,14 +126,14 @@
}
public ResourceProvider<?> getParentResourceProvider() {
- return new ResourceProvider() {
+ return new ResourceProvider<Object>() {
@Override
- public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+ public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
return resolver.getResource(path);
}
@Override
- public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+ public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent) {
return resolver.listChildren(parent);
}
};
@@ -167,8 +168,9 @@
return resource;
}
- public ScriptResourceResolver clone(Map o) throws LoginException {
- return ScriptResourceResolver.wrap(resolver.clone(o), provider);
+ @Override
+ public ScriptResourceResolver clone(Map<String, Object> o) throws LoginException {
+ return ScriptResourceResolver.wrap(resolver.clone(o), providerSupplier);
}
private class ScriptResourceResolverResourceWrapper extends ResourceWrapper {
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 7318608..3b23e07 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
@@ -27,7 +27,7 @@
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
-import java.util.function.Supplier;
+import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
@@ -113,25 +113,25 @@
// the default servlet if no other servlet applies for a request. This
// field is set on demand by getDefaultServlet()
- private volatile Servlet defaultServlet;
+ private AtomicReference<Servlet> defaultServlet = new AtomicReference<>();
// the default error handler servlet if no other error servlet applies for
// a request. This field is set on demand by getDefaultErrorServlet()
- private volatile Servlet fallbackErrorServlet;
+ private AtomicReference<Servlet> fallbackErrorServlet = new AtomicReference<>();
- private volatile ResourceResolver sharedScriptResolver;
+ private AtomicReference<ResourceResolver> sharedScriptResolver = new AtomicReference<>();
private final ThreadLocal<ResourceResolver> perThreadScriptResolver = new ThreadLocal<>();
/**
* The allowed execution paths.
*/
- private volatile String[] executionPaths;
+ private AtomicReference<String[]> executionPaths = new AtomicReference<>();
/**
* The default extensions
*/
- private volatile String[] defaultExtensions;
+ private AtomicReference<String[]> defaultExtensions = new AtomicReference<>();
private final PathBasedServletAcceptor pathBasedServletAcceptor = new PathBasedServletAcceptor();
@@ -154,9 +154,9 @@
final Resource resource = request.getResource();
// start tracking servlet resolution
- final RequestProgressTracker tracker = request.getRequestProgressTracker();
+ final RequestProgressTracker progressTracker = request.getRequestProgressTracker();
final String timerName = "resolveServlet(" + resource.getPath() + ")";
- tracker.startTimer(timerName);
+ progressTracker.startTimer(timerName);
final String resourceType = resource.getResourceType();
if (LOGGER.isDebugEnabled()) {
@@ -166,7 +166,7 @@
final ResourceResolver scriptResolver = this.getScriptResourceResolver();
Servlet servlet = null;
- if ( resourceType != null && resourceType.length() > 0 ) {
+ if ( resourceType.length() > 0 ) {
servlet = resolveServletInternal(request, null, resourceType, scriptResolver);
}
@@ -179,19 +179,11 @@
}
// track servlet resolution termination
- if (servlet == null) {
- tracker.logTimer(timerName, "Servlet resolution failed. See log for details");
- } else {
- tracker.logTimer(timerName, "Using servlet {0}", RequestUtil.getServletName(servlet));
- }
+ progressTracker.logTimer(timerName, "Using servlet {0}", RequestUtil.getServletName(servlet));
// log the servlet found
if (LOGGER.isDebugEnabled()) {
- if (servlet != null) {
- LOGGER.debug("Servlet {} found for resource={}", RequestUtil.getServletName(servlet), resource);
- } else {
- LOGGER.debug("No servlet found for resource={}", resource);
- }
+ LOGGER.debug("Servlet {} found for resource={}", RequestUtil.getServletName(servlet), resource);
}
return servlet;
@@ -215,7 +207,7 @@
// log the servlet found
if (LOGGER.isDebugEnabled()) {
if (servlet != null) {
- LOGGER.debug("Servlet {} found for resource {} and script name {}", new Object[] {RequestUtil.getServletName(servlet), resource, scriptName});
+ LOGGER.debug("Servlet {} found for resource {} and script name {}", RequestUtil.getServletName(servlet), resource, scriptName);
} else {
LOGGER.debug("No servlet found for resource {} and script name {}", resource, scriptName);
}
@@ -268,7 +260,7 @@
// return a resource wrapper to make sure the implementation
// switches from the per thread resource resolver to the shared once
// the per thread resource resolver is closed
- return new ScriptResource(scriptResource, perThreadScriptResolver::get, this.sharedScriptResolver).adaptTo(Servlet.class);
+ return new ScriptResource(scriptResource, perThreadScriptResolver::get, this.sharedScriptResolver.get()).adaptTo(Servlet.class);
}
// ---------- ErrorHandler interface --------------------------------------
@@ -285,14 +277,14 @@
// do not handle, if already handling ....
if (request.getAttribute(SlingConstants.ERROR_REQUEST_URI) != null) {
- LOGGER.error("handleError: Recursive invocation. Not further handling status " + status + "(" + message + ")");
+ LOGGER.error("handleError: Recursive invocation. Not further handling status {}({})", status, message);
return;
}
// start tracker
- RequestProgressTracker tracker = request.getRequestProgressTracker();
+ RequestProgressTracker progressTracker = request.getRequestProgressTracker();
String timerName = "handleError:status=" + status;
- tracker.startTimer(timerName);
+ progressTracker.startTimer(timerName);
final ResourceResolver scriptResolver = this.getScriptResourceResolver();
try {
@@ -303,7 +295,7 @@
String extension = request.getRequestPathInfo().getExtension();
ResourceCollector locationUtil = new ResourceCollector(String.valueOf(status),
DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
- extension, this.executionPaths);
+ extension, this.executionPaths.get());
Servlet servlet = getServletInternal(locationUtil, request, scriptResolver);
// fall back to default servlet if none
@@ -312,7 +304,7 @@
}
// set the message properties
- request.setAttribute(ERROR_STATUS, new Integer(status));
+ request.setAttribute(ERROR_STATUS, Integer.valueOf(status));
request.setAttribute(ERROR_MESSAGE, message);
// the servlet name for a sendError handling is still stored
@@ -323,12 +315,12 @@
}
// log a track entry after resolution before calling the handler
- tracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
+ progressTracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
handleError(servlet, request, response);
} finally {
- tracker.logTimer(timerName, "Error handler finished");
+ progressTracker.logTimer(timerName, "Error handler finished");
}
}
@@ -345,9 +337,9 @@
}
// start tracker
- RequestProgressTracker tracker = request.getRequestProgressTracker();
+ RequestProgressTracker progressTracker = request.getRequestProgressTracker();
String timerName = "handleError:throwable=" + throwable.getClass().getName();
- tracker.startTimer(timerName);
+ progressTracker.startTimer(timerName);
final ResourceResolver scriptResolver = this.getScriptResourceResolver();
try {
@@ -361,7 +353,7 @@
String extension = request.getRequestPathInfo().getExtension();
ResourceCollector locationUtil = new ResourceCollector(tClass.getSimpleName(),
DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
- extension, this.executionPaths);
+ extension, this.executionPaths.get());
servlet = getServletInternal(locationUtil, request, scriptResolver);
// go to the base class
@@ -378,11 +370,11 @@
request.setAttribute(SlingConstants.ERROR_MESSAGE, throwable.getMessage());
// log a track entry after resolution before calling the handler
- tracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
+ progressTracker.logTimer(timerName, "Using handler {0}", RequestUtil.getServletName(servlet));
handleError(servlet, request, response);
} finally {
- tracker.logTimer(timerName, "Error handler finished");
+ progressTracker.logTimer(timerName, "Error handler finished");
}
}
@@ -393,9 +385,9 @@
if ( scriptResolver == null ) {
// no per thread, let's use the shared one
synchronized ( this.sharedScriptResolver ) {
- this.sharedScriptResolver.refresh();
+ this.sharedScriptResolver.get().refresh();
}
- scriptResolver = this.sharedScriptResolver;
+ scriptResolver = this.sharedScriptResolver.get();
}
return scriptResolver;
}
@@ -407,7 +399,7 @@
public void onEvent(final SlingRequestEvent event) {
if ( event.getType() == SlingRequestEvent.EventType.EVENT_INIT ) {
try {
- this.perThreadScriptResolver.set(this.sharedScriptResolver.clone(null));
+ this.perThreadScriptResolver.set(this.sharedScriptResolver.get().clone(null));
} catch (final LoginException e) {
LOGGER.error("Unable to create new script resolver clone", e);
}
@@ -431,7 +423,7 @@
*/
private Resource getErrorResource(final SlingHttpServletRequest request) {
Resource res = request.getResource();
- if (res == null) {
+ if (res == null) { // NOSONAR
res = new SyntheticResource(request.getResourceResolver(), request.getPathInfo(),
DEFAULT_ERROR_HANDLER_RESOURCE_TYPE);
}
@@ -452,7 +444,7 @@
// path of a servlet (or script)
if (scriptNameOrResourceType.charAt(0) == '/') {
final String scriptPath = ResourceUtil.normalize(scriptNameOrResourceType);
- if (scriptPath != null && isPathAllowed(scriptPath, this.executionPaths) ) {
+ if (scriptPath != null && isPathAllowed(scriptPath, this.executionPaths.get()) ) {
final Resource res = resolver.getResource(scriptPath);
servlet = this.getServlet(res);
if (servlet != null && !pathBasedServletAcceptor.accept(request, servlet)) {
@@ -478,9 +470,9 @@
// the resource type is not absolute, so lets go for the deep search
final AbstractResourceCollector locationUtil;
if ( request != null ) {
- locationUtil = ResourceCollector.create(request, this.executionPaths, this.defaultExtensions);
+ locationUtil = ResourceCollector.create(request, this.executionPaths.get(), this.defaultExtensions.get());
} else {
- locationUtil = NamedScriptResourceCollector.create(scriptNameOrResourceType, resource, this.executionPaths);
+ locationUtil = NamedScriptResourceCollector.create(scriptNameOrResourceType, resource, this.executionPaths.get());
}
servlet = getServletInternal(locationUtil, request, resolver);
@@ -568,17 +560,18 @@
* be used if the default servlets have not been registered (yet).
*/
private Servlet getDefaultServlet() {
- if (defaultServlet == null) {
+ Servlet servlet = defaultServlet.get();
+ if (servlet == null) {
try {
- Servlet servlet = new DefaultServlet();
+ servlet = new DefaultServlet();
servlet.init(new SlingServletConfig(servletContext, null, "Apache Sling Core Default Servlet"));
- defaultServlet = servlet;
+ defaultServlet.set(servlet);
} catch (final ServletException se) {
LOGGER.error("Failed to initialize default servlet", se);
}
}
- return defaultServlet;
+ return servlet;
}
/**
@@ -605,7 +598,7 @@
final ResourceCollector locationUtil = new ResourceCollector(
ServletResolverConstants.DEFAULT_ERROR_HANDLER_METHOD,
DEFAULT_ERROR_HANDLER_RESOURCE_TYPE, resource,
- extension, this.executionPaths);
+ extension, this.executionPaths.get());
final Servlet servlet = getServletInternal(locationUtil, request, resolver);
if (servlet != null) {
return servlet;
@@ -613,19 +606,20 @@
// if no registered default error handler could be found use
// the DefaultErrorHandlerServlet as an ad-hoc fallback
- if (fallbackErrorServlet == null) {
+ Servlet fallbackServlet = fallbackErrorServlet.get();
+ if (fallbackServlet == null) {
// fall back to an adhoc instance of the DefaultErrorHandlerServlet
// if the actual service is not registered (yet ?)
try {
- final Servlet defaultServlet = new DefaultErrorHandlerServlet();
- defaultServlet.init(new SlingServletConfig(servletContext,
+ fallbackServlet = new DefaultErrorHandlerServlet();
+ fallbackServlet.init(new SlingServletConfig(servletContext,
null, "Sling (Ad Hoc) Default Error Handler Servlet"));
- fallbackErrorServlet = defaultServlet;
+ fallbackErrorServlet.set(fallbackServlet);
} catch (ServletException se) {
LOGGER.error("Failed to initialize error servlet", se);
}
}
- return fallbackErrorServlet;
+ return fallbackServlet;
}
private void handleError(final Servlet errorHandler, final SlingHttpServletRequest request, final SlingHttpServletResponse response)
@@ -656,7 +650,7 @@
// close the response (SLING-2724)
wrappedResponse.getWriter().close();
}
- } catch (final Throwable t) {
+ } catch (final Throwable t) { // NOSONAR
LOGGER.error("Calling the error handler resulted in an error", t);
LOGGER.error("Original error " + request.getAttribute(SlingConstants.ERROR_EXCEPTION_TYPE),
(Throwable) request.getAttribute(SlingConstants.ERROR_EXCEPTION));
@@ -668,20 +662,21 @@
// ---------- SCR Integration ----------------------------------------------
- private volatile ServiceTracker tracker;
+ private ServiceTracker<MergingServletResourceProvider, MergingServletResourceProvider> tracker;
/**
* Activate this component.
*/
@Activate
protected void activate(final BundleContext context, final ResolverConfig config) throws LoginException {
- this.tracker = new ServiceTracker(context, MergingServletResourceProvider.class, null);
+ this.tracker = new ServiceTracker<>(context, MergingServletResourceProvider.class, null);
this.tracker.open();
- this.sharedScriptResolver =
+ this.sharedScriptResolver.set(
ScriptResourceResolver.wrap(resourceResolverFactory.getServiceResourceResolver(Collections.singletonMap(ResourceResolverFactory.SUBSERVICE, (Object)SERVICE_USER)),
- (Supplier) this.tracker::getService);
+ this.tracker::getService)
+ );
- this.executionPaths = getExecutionPaths(config.servletresolver_paths());
- this.defaultExtensions = config.servletresolver_defaultExtensions();
+ this.executionPaths.set(getExecutionPaths(config.servletresolver_paths()));
+ this.defaultExtensions.set(config.servletresolver_defaultExtensions());
// setup default servlet
this.getDefaultServlet();
@@ -701,20 +696,27 @@
this.tracker.close();
this.resolutionCache.flushCache();
// destroy the fallback error handler servlet
- if (fallbackErrorServlet != null) {
+ Servlet servlet = fallbackErrorServlet.get();
+ if (servlet != null) {
try {
- fallbackErrorServlet.destroy();
- } catch (Throwable t) {
+ servlet.destroy();
+ } catch (Throwable t) { // NOSONAR
// ignore
} finally {
- fallbackErrorServlet = null;
+ fallbackErrorServlet.set(null);
}
}
if (this.sharedScriptResolver != null) {
- this.sharedScriptResolver.close();
- this.sharedScriptResolver = null;
+ ResourceResolver rr = this.sharedScriptResolver.get();
+ if (rr != null) {
+ rr.close();
+ }
+ this.sharedScriptResolver.set(null);
}
+
+ this.executionPaths.set(null);
+ this.defaultExtensions.set(null);
}
/**
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
index 4dfa0f2..d6a77d4 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptServlet.java
@@ -21,7 +21,6 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
-import java.util.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;
@@ -39,12 +38,13 @@
import org.jetbrains.annotations.NotNull;
public class BundledScriptServlet extends GenericServlet {
- private final BundledRenderUnit executable;
+ private static final long serialVersionUID = 6320375093932073555L;
+ private final BundledRenderUnit executable; // NOSONAR
private final String servletInfo;
- private final Set<ResourceType> types;
+ private final Set<ResourceType> types; // NOSONAR
- public BundledScriptServlet(@NotNull LinkedHashSet<TypeProvider> wiredTypeProviders,
+ public BundledScriptServlet(@NotNull Set<TypeProvider> wiredTypeProviders,
@NotNull BundledRenderUnit executable) {
this.executable = executable;
this.servletInfo = "Script " + executable.getPath();
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
index 0b71ba2..251b9c3 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTracker.java
@@ -36,6 +36,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -55,7 +56,6 @@
import org.apache.sling.api.request.RequestDispatcherOptions;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.type.ResourceType;
-import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.ServletResolverConstants;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.scripting.spi.bundle.BundledRenderUnit;
@@ -110,27 +110,39 @@
@Reference
private ServletMounter mounter;
- private volatile BundleContext m_context;
- private volatile BundleTracker<List<ServiceRegistration<Servlet>>> m_tracker;
- private volatile Map<Set<String>, ServiceRegistration<Servlet>> m_dispatchers = new HashMap<>();
+ private AtomicReference<BundleContext> bundleContext = new AtomicReference<>();
+ private AtomicReference<BundleTracker<List<ServiceRegistration<Servlet>>>> tracker = new AtomicReference<>();
+ private AtomicReference<Map<Set<String>, ServiceRegistration<Servlet>>> dispatchers = new AtomicReference<>();
@Activate
protected void activate(BundleContext context) {
- m_context = context;
- m_tracker = new BundleTracker<>(context, Bundle.ACTIVE, this);
- m_tracker.open();
+ bundleContext.set(context);
+ dispatchers.set(new HashMap<>());
+ BundleTracker<List<ServiceRegistration<Servlet>>> bt = new BundleTracker<>(context, Bundle.ACTIVE, this);
+ tracker.set(bt);
+ bt.open();
}
@Deactivate
protected void deactivate() {
- m_tracker.close();
+ BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.getAndSet(null);
+ if (bt != null) {
+ bt.close();
+ }
+ bundleContext.set(null);
+ dispatchers.set(null);
}
@Override
public List<ServiceRegistration<Servlet>> addingBundle(Bundle bundle, BundleEvent event) {
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
+ Bundle bcBundle = null;
+ BundleContext bc = bundleContext.get();
+ if (bc != null) {
+ bcBundle = bc.getBundle();
+ }
if (bundleWiring.getRequiredWires("osgi.extender").stream().map(BundleWire::getProvider).map(BundleRevision::getBundle)
- .anyMatch(m_context.getBundle()::equals)) {
+ .anyMatch(bcBundle::equals)) {
LOGGER.debug("Inspecting bundle {} for {} capability.", bundle.getSymbolicName(), NS_SLING_SERVLET);
List<BundleCapability> capabilities = bundleWiring.getCapabilities(NS_SLING_SERVLET);
Map<BundleCapability, BundledRenderUnitCapability> cache = new HashMap<>();
@@ -270,7 +282,8 @@
private final AtomicLong idCounter = new AtomicLong(0);
- private ServiceRegistration<Servlet> register(BundleContext context, Servlet servlet, Hashtable<String, Object> properties) {
+ private ServiceRegistration<Servlet> register(BundleContext context, Servlet servlet,
+ Hashtable<String, Object> properties) { // NOSONAR
if (mounter.mountProviders()) {
return context.registerService(Servlet.class, servlet, properties);
}
@@ -278,6 +291,7 @@
final Long id = idCounter.getAndIncrement();
properties.put(Constants.SERVICE_ID, id);
properties.put(BundledHooks.class.getName(), "true");
+ @SuppressWarnings("unchecked")
final ServiceReference<Servlet> reference = (ServiceReference<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceReference.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
@@ -291,7 +305,12 @@
return context.getBundle();
}
else if (method.equals(ServiceReference.class.getMethod("getUsingBundles"))) {
- return new Bundle[]{ m_context.getBundle() };
+ BundleContext bc = bundleContext.get();
+ if (bc != null) {
+ return new Bundle[] { bc.getBundle() };
+ } else {
+ return new Bundle[0];
+ }
}
else if (method.equals(ServiceReference.class.getMethod("isAssignableTo", Bundle.class, String.class))) {
return Servlet.class.getName().equals(args[1]);
@@ -313,7 +332,7 @@
}
private int compareTo(Object arg) {
- ServiceReference other = (ServiceReference) arg;
+ ServiceReference<?> other = (ServiceReference<?>) arg;
Long id;
if ("true".equals(other.getProperty(BundledHooks.class.getName()))) {
id = (Long) properties.get(Constants.SERVICE_ID);
@@ -356,7 +375,8 @@
mounter.bindServlet(servlet, reference);
- return (ServiceRegistration<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceRegistration.class}, new InvocationHandler(){
+ @SuppressWarnings("unchecked")
+ ServiceRegistration<Servlet> newProxyInstance = (ServiceRegistration<Servlet>) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ServiceRegistration.class}, new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.equals(ServiceRegistration.class.getMethod("getReference"))) {
@@ -370,7 +390,7 @@
return null;
}
else if (method.getName().equals("equals") && Arrays.equals(method.getParameterTypes(), new Class[]{Object.class})) {
- return args[0] instanceof ServiceRegistration && reference.compareTo(((ServiceRegistration) args[0]).getReference()) == 0;
+ return args[0] instanceof ServiceRegistration && reference.compareTo(((ServiceRegistration<?>) args[0]).getReference()) == 0;
}
else if (method.getName().equals("hashCode") && method.getParameterCount() == 0) {
return id.intValue();
@@ -382,16 +402,26 @@
}
}
});
+ return newProxyInstance;
}
}
private void refreshDispatcher(List<ServiceRegistration<Servlet>> regs) {
- Map<Set<String>, ServiceRegistration<Servlet>> dispatchers = new HashMap<>();
- Stream.concat(m_tracker.getTracked().values().stream(), Stream.of(regs)).flatMap(List::stream)
+ BundleContext bc = bundleContext.get();
+ Map<Bundle, List<ServiceRegistration<Servlet>>> tracked;
+ BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.get();
+ if (bt != null) {
+ tracked = bt.getTracked();
+ } else {
+ tracked = Collections.emptyMap();
+ }
+ Map<Set<String>, ServiceRegistration<Servlet>> oldDispatchers = dispatchers.get();
+ Map<Set<String>, ServiceRegistration<Servlet>> newDispatchers = new HashMap<>();
+ Stream.concat(tracked.values().stream(), Stream.of(regs)).flatMap(List::stream)
.filter(ref -> getResourceTypeVersion(ref.getReference()) != null)
.map(this::toProperties)
.collect(Collectors.groupingBy(BundledScriptTracker::getResourceTypes)).forEach((rt, propList) -> {
- Hashtable<String, Object> properties = new Hashtable<>();
+ Hashtable<String, Object> properties = new Hashtable<>(); // NOSONAR
properties.put(ServletResolverConstants.SLING_SERVLET_NAME, String.format("%s (%s)", DispatcherServlet.class.getSimpleName(),
rt));
properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, rt.toArray());
@@ -405,7 +435,8 @@
if (!methods.equals(new HashSet<>(Arrays.asList("GET", "HEAD")))) {
properties.put(ServletResolverConstants.SLING_SERVLET_METHODS, methods.toArray(new String[0]));
}
- ServiceRegistration<Servlet> reg = m_dispatchers.remove(rt);
+
+ ServiceRegistration<Servlet> reg = oldDispatchers.remove(rt);
if (reg == null) {
Optional<BundleContext> registeringBundle = propList.stream().map(props -> {
Bundle bundle = (Bundle) props.get(REGISTERING_BUNDLE);
@@ -421,7 +452,7 @@
ServletResolverConstants.SLING_SERVLET_METHODS + "=" + methods + "}");
properties.put(BundledHooks.class.getName(), "true");
- reg = register(registeringBundle.orElse(m_context), new DispatcherServlet(rt), properties);
+ reg = register(registeringBundle.orElse(bc), new DispatcherServlet(rt), properties);
} else {
if (!new HashSet<>(Arrays.asList(PropertiesUtil
.toStringArray(reg.getReference().getProperty(ServletResolverConstants.SLING_SERVLET_METHODS), new String[0])))
@@ -429,14 +460,14 @@
reg.setProperties(properties);
}
}
- dispatchers.put(rt, reg);
+ newDispatchers.put(rt, reg);
});
- m_dispatchers.values().forEach(ServiceRegistration::unregister);
- m_dispatchers = dispatchers;
+ oldDispatchers.values().forEach(ServiceRegistration::unregister);
+ dispatchers.set(newDispatchers);
}
- private Hashtable<String, Object> toProperties(ServiceRegistration<?> reg) {
- Hashtable<String, Object> result = new Hashtable<>();
+ private Map<String, Object> toProperties(ServiceRegistration<?> reg) {
+ Map<String, Object> result = new HashMap<>();
ServiceReference<?> ref = reg.getReference();
set(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES, ref, result);
@@ -448,7 +479,7 @@
return result;
}
- private void set(String key, ServiceReference<?> ref, Hashtable<String, Object> props) {
+ private void set(String key, ServiceReference<?> ref, Map<String, Object> props) {
Object value = ref.getProperty(key);
if (value != null) {
props.put(key, value);
@@ -468,10 +499,11 @@
}
private class DispatcherServlet extends GenericServlet {
- private final Set<String> m_rt;
+ private static final long serialVersionUID = -1917128676758775458L;
+ private final Set<String> resourceType;
DispatcherServlet(Set<String> rt) {
- m_rt = rt;
+ this.resourceType = rt;
}
@Override
@@ -479,15 +511,25 @@
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) req;
- Optional<ServiceRegistration<Servlet>> target = m_tracker.getTracked().values().stream().flatMap(List::stream)
+ Map<Bundle, List<ServiceRegistration<Servlet>>> tracked;
+ BundleTracker<List<ServiceRegistration<Servlet>>> bt = tracker.get();
+ if (bt != null) {
+ tracked = bt.getTracked();
+ } else {
+ tracked = Collections.emptyMap();
+ }
+ BundleContext bc = bundleContext.get();
+ final Bundle bcBundle = bc == null ? null : bc.getBundle();
+
+ Optional<ServiceRegistration<Servlet>> target = tracked.values().stream().flatMap(List::stream)
.filter(
- reg -> !reg.getReference().getBundle().equals(m_context.getBundle())
+ reg -> !reg.getReference().getBundle().equals(bcBundle)
)
.filter(reg -> getResourceTypeVersion(reg.getReference()) != null)
.filter(reg ->
{
- Hashtable<String, Object> props = toProperties(reg);
- return getResourceTypes(props).equals(m_rt) &&
+ Map<String, Object> props = toProperties(reg);
+ return getResourceTypes(props).equals(resourceType) &&
Arrays.asList(PropertiesUtil
.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_METHODS),
new String[]{"GET", "HEAD"}))
@@ -564,7 +606,7 @@
return null;
}
- private static Set<String> getResourceTypes(Hashtable<String, Object> props) {
+ private static Set<String> getResourceTypes(Map<String, Object> props) {
Set<String> resourceTypes = new HashSet<>();
String[] values = PropertiesUtil.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
for (String resourceTypeValue : values) {
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 c3ee850..542a3c5 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
@@ -25,6 +25,7 @@
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
@@ -75,23 +76,23 @@
private static final String SERVICE_USER_CONSOLE = "console";
@Reference(target="("+ServiceUserMapped.SUBSERVICENAME+"=" + SERVICE_USER_CONSOLE + ")")
- private ServiceUserMapped consoleServiceUserMapped;
+ private ServiceUserMapped consoleServiceUserMapped; // NOSONAR
@Reference
- private ResourceResolverFactory resourceResolverFactory;
+ private ResourceResolverFactory resourceResolverFactory; // NOSONAR
@Reference
- private ResolutionCache resolutionCache;
+ private ResolutionCache resolutionCache; // NOSONAR
/**
* The allowed execution paths.
*/
- private volatile String[] executionPaths;
+ private AtomicReference<String[]> executionPaths = new AtomicReference<>(); // NOSONAR
/**
* The default extensions
*/
- private volatile String[] defaultExtensions;
+ private AtomicReference<String[]> defaultExtensions = new AtomicReference<>(); // NOSONAR
/**
* Activate this component.
@@ -99,8 +100,8 @@
@Activate
@Modified
protected void activate(final ResolverConfig config) {
- this.executionPaths = SlingServletResolver.getExecutionPaths(config.servletresolver_paths());
- this.defaultExtensions = config.servletresolver_defaultExtensions();
+ this.executionPaths.set(SlingServletResolver.getExecutionPaths(config.servletresolver_paths()));
+ this.defaultExtensions.set(config.servletresolver_defaultExtensions());
}
@Override
@@ -169,13 +170,13 @@
tdContent(pw);
pw.println("<dl>");
pw.println("<dt>Path</dt>");
- pw.print("<dd>");
+ dd(pw);
pw.print(ResponseUtil.escapeXml(requestPathInfo.getResourcePath()));
pw.print("<br/>");
pw.print(CONSOLE_PATH_WARNING);
- pw.println("</dd>");
+ closeDd(pw);
pw.println("<dt>Selectors</dt>");
- pw.print("<dd>");
+ dd(pw);
if (requestPathInfo.getSelectors().length == 0) {
pw.print("<none>");
} else {
@@ -183,17 +184,17 @@
pw.print(ResponseUtil.escapeXml(StringUtils.join(requestPathInfo.getSelectors(), ", ")));
pw.print("]");
}
- pw.println("</dd>");
+ closeDd(pw);
pw.println("<dt>Extension</dt>");
- pw.print("<dd>");
+ dd(pw);
pw.print(ResponseUtil.escapeXml(requestPathInfo.getExtension()));
- pw.println("</dd>");
+ closeDd(pw);
pw.println("</dl>");
- pw.println("</dd>");
+ closeDd(pw);
pw.println("<dt>Suffix</dt>");
- pw.print("<dd>");
+ dd(pw);
pw.print(ResponseUtil.escapeXml(requestPathInfo.getSuffix()));
- pw.println("</dd>");
+ closeDd(pw);
pw.println("</dl>");
closeTd(pw);
closeTr(pw);
@@ -208,8 +209,8 @@
final ResourceCollector locationUtil = ResourceCollector.create(
resource,
requestPathInfo.getExtension(),
- executionPaths,
- defaultExtensions,
+ executionPaths.get(),
+ defaultExtensions.get(),
method,
requestPathInfo.getSelectors());
servlets = locationUtil.getServlets(resourceResolver, resolutionCache.getScriptEngineExtensions());
@@ -234,7 +235,7 @@
outputServlets(pw, servlets.iterator());
pw.println("</ol>");
}
- pw.println("</td>");
+ closeTd(pw);
closeTr(pw);
}
@@ -253,6 +254,13 @@
pw.print("</td>");
}
+ private void dd(final PrintWriter pw) {
+ pw.println("<dd>");
+ }
+ private void closeDd(final PrintWriter pw) {
+ pw.print("</dd>");
+ }
+
@SuppressWarnings("unused")
private URL getResource(final String path) {
if (path.startsWith("/servletresolver/res/ui")) {
@@ -281,7 +289,7 @@
Resource candidateResource = iterator.next();
Servlet candidate = candidateResource.adaptTo(Servlet.class);
if (candidate != null) {
- final boolean allowed = SlingServletResolver.isPathAllowed(candidateResource.getPath(), this.executionPaths);
+ final boolean allowed = SlingServletResolver.isPathAllowed(candidateResource.getPath(), this.executionPaths.get());
pw.print("<li>");
if ( !allowed ) {
pw.print("<del>");
@@ -333,14 +341,16 @@
try {
fullPath = new URL(urlString).getPath();
} catch(MalformedURLException ignore) {
+ // ignored
}
}
final int firstDot = fullPath.indexOf(".");
final ResourceMetadata metadata = new ResourceMetadata();
- final Resource r = new SyntheticResource(null, metadata, null);
+ final Resource r = new SyntheticResource(null, metadata, null); // NOSONAR
metadata.setResolutionPath(firstDot < 0 ? fullPath : fullPath.substring(0, firstDot));
metadata.setResolutionPathInfo(firstDot < 0 ? null : fullPath.substring(firstDot));
return new SlingRequestPathInfo(r);
}
+
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
index 0d410ef..12044bb 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultErrorHandlerServlet.java
@@ -60,7 +60,7 @@
private static final String HTML_CONTENT_TYPE = "text/html";
/** default log */
- private final Logger log = LoggerFactory.getLogger(DefaultErrorHandlerServlet.class);
+ private final transient Logger log = LoggerFactory.getLogger(DefaultErrorHandlerServlet.class);
@Override
public void service(ServletRequest req, ServletResponse res)
@@ -298,7 +298,7 @@
}
public static String statusToString(int statusCode) {
- switch (statusCode) {
+ switch (statusCode) { // NOSONAR
case 100:
return "Continue";
case 101:
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
index 9384957..03c0535 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java
@@ -20,7 +20,6 @@
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
@@ -56,7 +55,7 @@
protected final String[] executionPaths;
- public AbstractResourceCollector(final String baseResourceType,
+ protected AbstractResourceCollector(final String baseResourceType,
final String resourceType,
final String resourceSuperType,
final String extension,
@@ -70,34 +69,31 @@
public final Collection<Resource> getServlets(final ResourceResolver resolver, final List<String> scriptExtensions) {
- final SortedSet<WeightedResource> resources = new TreeSet<>(new Comparator<WeightedResource>() {
- @Override
- public int compare(WeightedResource o1, WeightedResource o2) {
- String o1Parent = ResourceUtil.getParent(o1.getPath());
- String o2Parent = ResourceUtil.getParent(o2.getPath());
- if (o1Parent != null && o2Parent != null && o1Parent.equals(o2Parent)) {
- String o1ScriptName = o1.getName();
- String o2ScriptName = o2.getName();
- String o1Extension = getScriptExtension(o1ScriptName);
- String o2Extension = getScriptExtension(o2ScriptName);
- if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
- String o1ScriptWithoutExtension = o1ScriptName.substring(0, o1ScriptName.lastIndexOf("." + o1Extension));
- String o2ScriptWithoutExtension = o2ScriptName.substring(0, o2ScriptName.lastIndexOf("." + o2Extension));
- if (o1ScriptWithoutExtension.equals(o2ScriptWithoutExtension)) {
- int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
- int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
- if (o1ExtensionIndex == o2ExtensionIndex || o1ExtensionIndex == -1 || o2ExtensionIndex == -1) {
- return o1.compareTo(o2);
- } else if (o1ExtensionIndex > o2ExtensionIndex) {
- return -1;
- } else {
- return 1;
- }
+ final SortedSet<WeightedResource> resources = new TreeSet<>((o1, o2) -> {
+ String o1Parent = ResourceUtil.getParent(o1.getPath());
+ String o2Parent = ResourceUtil.getParent(o2.getPath());
+ if (o1Parent != null && o2Parent != null && o1Parent.equals(o2Parent)) {
+ String o1ScriptName = o1.getName();
+ String o2ScriptName = o2.getName();
+ String o1Extension = getScriptExtension(o1ScriptName);
+ String o2Extension = getScriptExtension(o2ScriptName);
+ if (StringUtils.isNotEmpty(o1Extension) && StringUtils.isNotEmpty(o2Extension)) {
+ String o1ScriptWithoutExtension = o1ScriptName.substring(0, o1ScriptName.lastIndexOf("." + o1Extension));
+ String o2ScriptWithoutExtension = o2ScriptName.substring(0, o2ScriptName.lastIndexOf("." + o2Extension));
+ if (o1ScriptWithoutExtension.equals(o2ScriptWithoutExtension)) {
+ int o1ExtensionIndex = scriptExtensions.indexOf(o1Extension);
+ int o2ExtensionIndex = scriptExtensions.indexOf(o2Extension);
+ if (o1ExtensionIndex == o2ExtensionIndex || o1ExtensionIndex == -1 || o2ExtensionIndex == -1) {
+ return o1.compareTo(o2);
+ } else if (o1ExtensionIndex > o2ExtensionIndex) {
+ return -1;
+ } else {
+ return 1;
}
}
}
- return o1.compareTo(o2);
}
+ return o1.compareTo(o2);
});
final Iterator<String> locations = new LocationIterator(resourceType, resourceSuperType,
baseResourceType, resolver);
@@ -122,7 +118,7 @@
return result;
}
- abstract protected void getWeightedResources(final Set<WeightedResource> resources,
+ protected abstract void getWeightedResources(final Set<WeightedResource> resources,
final Resource location);
/**
@@ -183,13 +179,10 @@
return true;
}
final AbstractResourceCollector o = (AbstractResourceCollector)obj;
- if ( stringEquals(resourceType, o.resourceType)
+ return stringEquals(resourceType, o.resourceType)
&& stringEquals(resourceSuperType, o.resourceSuperType)
&& stringEquals(extension, o.extension)
- && stringEquals(baseResourceType, o.baseResourceType)) {
- return true;
- }
- return false;
+ && stringEquals(baseResourceType, o.baseResourceType);
}
@Override
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
index 56e1a2c..f7fdc3c 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/LocationIterator.java
@@ -49,10 +49,6 @@
*/
public class LocationIterator implements Iterator<String> {
- // The resource for which this iterator is created. This resource
- // gives the initial resource type and the first resource super type
- //private final Resource resource;
-
// The resource resolver used to find resource super types of
// resource types
private final ResourceResolver resolver;
@@ -85,7 +81,7 @@
private String nextLocation;
/** Set of used resource types to detect a circular resource type hierarchy. */
- private final Set<String> usedResourceTypes = new HashSet<String>();
+ private final Set<String> usedResourceTypes = new HashSet<>();
/**
* Creates an instance of this iterator starting with a location built from
@@ -103,7 +99,7 @@
this.baseResourceType = baseResourceType;
String[] tmpPath = resolver.getSearchPath();
- if (tmpPath == null || tmpPath.length == 0) {
+ if (tmpPath.length == 0) {
tmpPath = new String[] { "/" };
}
searchPath = tmpPath;
@@ -144,6 +140,7 @@
/**
* @throws UnsupportedOperationException
*/
+ @Override
public void remove() {
throw new UnsupportedOperationException();
}
@@ -230,7 +227,7 @@
// get the resource type resource and check its super type
String resourceSuperType = null;
// if the path is absolute, use it directly
- if ( rtPath != null && rtPath.startsWith("/") ) {
+ if ( rtPath.startsWith("/") ) {
final String candidatePath = rtPath;
final Resource rtResource = resourceResolver.getResource(candidatePath);
@@ -240,8 +237,8 @@
} else {
// if the path is relative we use the search paths
- for(final String searchPath : this.searchPath) {
- final String candidatePath = searchPath + rtPath;
+ for (final String path : this.searchPath) {
+ final String candidatePath = path + rtPath;
final Resource rtResource = resourceResolver.getResource(candidatePath);
if ( rtResource != null && rtResource.getResourceSuperType() != null ) {
resourceSuperType = rtResource.getResourceSuperType();
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
index 0ed8a9b..c39e86a 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java
@@ -114,36 +114,44 @@
while (children.hasNext()) {
final Resource child = children.next();
- if ( !SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths) ) {
- continue;
- }
- final String currentScriptName = child.getName();
- final int lastDot = currentScriptName.lastIndexOf('.');
- if (lastDot < 0) {
- // no extension in the name, this is not a script
- continue;
- }
+ if ( SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths) ) {
+ final String currentScriptName = child.getName();
+ final int lastDot = currentScriptName.lastIndexOf('.');
+ if (lastDot < 0) {
+ // no extension in the name, this is not a script
+ continue;
+ }
- if ( currentScriptName.substring(0, lastDot).equals(name) ) {
- this.addWeightedResource(resources, child, 0, WeightedResource.WEIGHT_PREFIX);
+ if ( currentScriptName.substring(0, lastDot).equals(name) ) {
+ this.addWeightedResource(resources, child, 0, WeightedResource.WEIGHT_PREFIX);
+ }
}
}
}
@Override
- public boolean equals(Object obj) {
- if ( !(obj instanceof NamedScriptResourceCollector) ) {
- return false;
- }
- if ( obj == this ) {
- return true;
- }
- if ( super.equals(obj) ) {
- final NamedScriptResourceCollector o = (NamedScriptResourceCollector)obj;
- if ( stringEquals(scriptName, o.scriptName)) {
- return true;
- }
- }
- return false;
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + ((scriptName == null) ? 0 : scriptName.hashCode());
+ return result;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ NamedScriptResourceCollector other = (NamedScriptResourceCollector) obj;
+ if (scriptName == null) {
+ if (other.scriptName != null)
+ return false;
+ } else if (!scriptName.equals(other.scriptName))
+ return false;
+ return true;
+ }
+
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
index 4ff7104..6a10661 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java
@@ -18,6 +18,7 @@
*/
package org.apache.sling.servlets.resolver.internal.helper;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
@@ -225,7 +226,7 @@
: null;
Iterator<Resource> children = resolver.listChildren(current);
- while (children.hasNext()) {
+ while (children.hasNext()) { // NOSONAR
Resource child = children.next();
if (!SlingServletResolver.isPathAllowed(child.getPath(), this.executionPaths)) {
@@ -265,7 +266,6 @@
if (scriptName.equals(methodName)) {
addWeightedResource(resources, child, selIdx,
WeightedResource.WEIGHT_NONE);
- continue;
}
}
@@ -325,7 +325,7 @@
return true;
}
- if (scriptName.equals(suffix.substring(1))) {
+ if (suffix != null && !suffix.isEmpty() && scriptName.equals(suffix.substring(1))) {
addWeightedResource(resources, child, selIdx,
WeightedResource.WEIGHT_EXTENSION + ((htmlSuffix != null) ? WeightedResource.WEIGHT_METHOD : WeightedResource.WEIGHT_NONE));
return true;
@@ -375,28 +375,38 @@
}
@Override
- public boolean equals(Object obj) {
- if (!(obj instanceof ResourceCollector)) {
- return false;
- }
- if (obj == this) {
- return true;
- }
- if (super.equals(obj)) {
- final ResourceCollector o = (ResourceCollector) obj;
- if (isGet == o.isGet && isDefaultExtension == o.isDefaultExtension
- && numRequestSelectors == o.numRequestSelectors
- && stringEquals(methodName, o.methodName)) {
- // now compare selectors
- for (int i = 0; i < numRequestSelectors; i++) {
- if (!stringEquals(requestSelectors[i],
- o.requestSelectors[i])) {
- return false;
- }
- }
- return true;
- }
- }
- return false;
+ public int hashCode() {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + (isDefaultExtension ? 1231 : 1237);
+ result = prime * result + (isGet ? 1231 : 1237);
+ result = prime * result + ((methodName == null) ? 0 : methodName.hashCode());
+ result = prime * result + numRequestSelectors;
+ result = prime * result + Arrays.hashCode(requestSelectors);
+ return result;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ResourceCollector other = (ResourceCollector) obj;
+ if (isDefaultExtension != other.isDefaultExtension)
+ return false;
+ if (isGet != other.isGet)
+ return false;
+ if (methodName == null) {
+ if (other.methodName != null)
+ return false;
+ } else if (!methodName.equals(other.methodName))
+ return false;
+ if (numRequestSelectors != other.numRequestSelectors)
+ return false;
+ return Arrays.equals(requestSelectors, other.requestSelectors);
+ }
+
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
index a93a3e7..e84c6eb 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResource.java
@@ -89,36 +89,36 @@
this.methodPrefixWeight = methodPrefixWeight;
}
- final public int getOrdinal() {
+ public final int getOrdinal() {
return ordinal;
}
- final public int getNumSelectors() {
+ public final int getNumSelectors() {
return numSelectors;
}
- final public int getMethodPrefixWeight() {
+ public final int getMethodPrefixWeight() {
return methodPrefixWeight;
}
@Override
- final public int hashCode() {
+ public final int hashCode() {
return ordinal;
}
@Override
- final public boolean equals(Object obj) {
+ public final boolean equals(Object obj) {
return obj == this;
}
@Override
- final public String toString() {
+ public final String toString() {
return getClass().getSimpleName() + "[" + getOrdinal() + "]: "
+ getResource() + ", #selectors=" + getNumSelectors()
+ ", methodPrefixWeight=" + getMethodPrefixWeight();
}
- final public int compareTo(WeightedResource o) {
+ public final int compareTo(WeightedResource o) {
if (equals(o)) {
return 0;
}
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 f954f6b..5ae49b5 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
@@ -25,6 +25,7 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReference;
import javax.management.NotCompliantMBeanException;
import javax.management.StandardMBean;
@@ -32,7 +33,6 @@
import javax.script.ScriptEngineManager;
import javax.servlet.Servlet;
-import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.observation.ExternalResourceChangeListener;
import org.apache.sling.api.resource.observation.ResourceChange;
import org.apache.sling.api.resource.observation.ResourceChangeListener;
@@ -68,10 +68,10 @@
@Reference
private ScriptEngineManager scriptEngineManager;
- private volatile List<String> scriptEnginesExtensions = Collections.emptyList();
+ private AtomicReference<List<String>> scriptEnginesExtensions = new AtomicReference<>(Collections.emptyList());
/** The script resolution cache. */
- private volatile Map<AbstractResourceCollector, Servlet> cache;
+ private AtomicReference<Map<AbstractResourceCollector, Servlet>> cache = new AtomicReference<>();
/** The cache size. */
private volatile int cacheSize;
@@ -80,39 +80,39 @@
private volatile boolean logCacheSizeWarning;
/** Registration as event handler. */
- private volatile ServiceRegistration<EventHandler> eventHandlerRegistration;
+ private AtomicReference<ServiceRegistration<EventHandler>> eventHandlerRegistration = new AtomicReference<>();
- private volatile ServiceRegistration<ResourceChangeListener> resourceListenerRegistration;
+ private AtomicReference<ServiceRegistration<ResourceChangeListener>> resourceListenerRegistration = new AtomicReference<>();
- private volatile ServiceRegistration<SlingServletResolverCacheMBean> mbeanRegistration;
+ private AtomicReference<ServiceRegistration<SlingServletResolverCacheMBean>> mbeanRegistration = new AtomicReference<>();
/**
* Activate this component.
*/
@Activate
protected void activate(final BundleContext context,
- final ResolverConfig config) throws LoginException {
+ final ResolverConfig config) {
// create cache - if a cache size is configured
this.cacheSize = config.servletresolver_cacheSize();
if (this.cacheSize > 5) {
- this.cache = new ConcurrentHashMap<>(cacheSize);
+ this.cache.set(new ConcurrentHashMap<>(cacheSize));
this.logCacheSizeWarning = true;
// register MBean
try {
- Dictionary<String, String> mbeanProps = new Hashtable<>();
+ Dictionary<String, String> mbeanProps = new Hashtable<>(); // NOSONAR
mbeanProps.put("jmx.objectname", "org.apache.sling:type=servletResolver,service=SlingServletResolverCache");
ServletResolverCacheMBeanImpl mbean = new ServletResolverCacheMBeanImpl();
- mbeanRegistration = context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
- } catch (final Throwable t) {
+ mbeanRegistration.set(context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps));
+ } catch (final Throwable t) { // NOSONAR
logger.warn("Unable to register servlets resolver cache MBean", t);
}
}
// and finally register as event listener
// to invalidate cache and script extensions
- final Dictionary<String, Object> props = new Hashtable<>();
+ final Dictionary<String, Object> props = new Hashtable<>(); // NOSONAR
props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Servlet Resolver Event Handler");
props.put(Constants.SERVICE_VENDOR,"The Apache Software Foundation");
@@ -122,7 +122,7 @@
"org/apache/sling/api/adapter/AdapterFactory/*",
"org/apache/sling/scripting/core/BindingsValuesProvider/*" });
- this.eventHandlerRegistration = context.registerService(EventHandler.class, this, props);
+ this.eventHandlerRegistration.set(context.registerService(EventHandler.class, this, props));
// we need a resource change listener to invalidate the cache
if ( this.cache != null ) {
@@ -132,11 +132,11 @@
listenerPaths[i] = p.getPath();
}
- final Dictionary<String, Object> listenerProps = new Hashtable<>();
+ final Dictionary<String, Object> listenerProps = new Hashtable<>(); // NOSONAR
listenerProps.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Servlet Resolver Resource Listener");
listenerProps.put(Constants.SERVICE_VENDOR,"The Apache Software Foundation");
listenerProps.put(ResourceChangeListener.PATHS, listenerPaths);
- this.resourceListenerRegistration = context.registerService(ResourceChangeListener.class, this, listenerProps);
+ this.resourceListenerRegistration.set(context.registerService(ResourceChangeListener.class, this, listenerProps));
}
updateScriptEngineExtensions();
@@ -144,7 +144,7 @@
@Modified
protected void modified(final BundleContext context,
- final ResolverConfig config) throws LoginException {
+ final ResolverConfig config) {
this.deactivate();
this.activate(context, config);
}
@@ -157,21 +157,24 @@
this.cache = null;
// unregister mbean
- if ( this.mbeanRegistration != null ) {
- this.mbeanRegistration.unregister();
- this.mbeanRegistration = null;
+ ServiceRegistration<SlingServletResolverCacheMBean> mbRegistration = this.mbeanRegistration.get();
+ if ( mbRegistration != null ) {
+ mbRegistration.unregister();
+ this.mbeanRegistration.set(null);
}
// unregister event handler
- if (this.eventHandlerRegistration != null) {
- this.eventHandlerRegistration.unregister();
- this.eventHandlerRegistration = null;
+ ServiceRegistration<EventHandler> ehRegistration = this.eventHandlerRegistration.get();
+ if (ehRegistration != null) {
+ ehRegistration.unregister();
+ this.eventHandlerRegistration.set(null);
}
// unregister event handler
- if (this.resourceListenerRegistration != null) {
- this.resourceListenerRegistration.unregister();
- this.resourceListenerRegistration = null;
+ ServiceRegistration<ResourceChangeListener> rlRegistration = this.resourceListenerRegistration.get();
+ if (rlRegistration != null) {
+ rlRegistration.unregister();
+ this.resourceListenerRegistration.set(null);
}
}
@@ -180,18 +183,18 @@
* @return The list of script engine extensions
*/
public List<String> getScriptEngineExtensions() {
- return this.scriptEnginesExtensions;
+ return this.scriptEnginesExtensions.get();
}
private void updateScriptEngineExtensions() {
final ScriptEngineManager localScriptEngineManager = scriptEngineManager;
// use local variable to avoid racing with deactivate
if ( localScriptEngineManager != null ) {
- final List<String> scriptEnginesExtensions = new ArrayList<>();
+ final List<String> newScriptEnginesExtensions = new ArrayList<>();
for (ScriptEngineFactory factory : localScriptEngineManager.getEngineFactories()) {
- scriptEnginesExtensions.addAll(factory.getExtensions());
+ newScriptEnginesExtensions.addAll(factory.getExtensions());
}
- this.scriptEnginesExtensions = Collections.unmodifiableList(scriptEnginesExtensions);
+ this.scriptEnginesExtensions.set(Collections.unmodifiableList(newScriptEnginesExtensions));
}
}
@@ -210,7 +213,7 @@
public void flushCache() {
// use local variable to avoid racing with deactivate
- final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+ final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
if ( localCache != null ) {
localCache.clear();
this.logCacheSizeWarning = true;
@@ -236,7 +239,7 @@
@Override
public int getCacheSize() {
// use local variable to avoid racing with deactivate
- final Map<AbstractResourceCollector, Servlet> localCache = cache;
+ final Map<AbstractResourceCollector, Servlet> localCache = cache.get();
return localCache != null ? localCache.size() : 0;
}
@@ -253,7 +256,7 @@
}
public Servlet get(final AbstractResourceCollector context) {
- final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+ final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
if ( localCache != null ) {
return localCache.get(context);
}
@@ -261,7 +264,7 @@
}
public void put(final AbstractResourceCollector context, final Servlet candidate) {
- final Map<AbstractResourceCollector, Servlet> localCache = this.cache;
+ final Map<AbstractResourceCollector, Servlet> localCache = this.cache.get();
if ( localCache != null ) {
if ( localCache.size() < this.cacheSize ) {
localCache.put(context, candidate);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
index df8ccb4..8f2dcf9 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
@@ -35,6 +35,7 @@
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.SyntheticResource;
import org.apache.sling.spi.resource.provider.ResolveContext;
+import org.apache.sling.spi.resource.provider.ResourceContext;
import org.apache.sling.spi.resource.provider.ResourceProvider;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
@@ -52,7 +53,7 @@
index(localTree, localProvs, Arrays.asList(registrations.get(registrations.size() - 1)));
}
- synchronized boolean remove(ServletResourceProvider provider, ServiceReference<?> reference) {
+ synchronized boolean remove(ServletResourceProvider provider) {
boolean found = false;
for (Iterator<Pair<ServletResourceProvider, ServiceReference<?>>> regIter = registrations.iterator(); regIter.hasNext(); ) {
Pair<ServletResourceProvider, ServiceReference<?>> reg = regIter.next();
@@ -87,17 +88,16 @@
private void index(ConcurrentHashMap<String, Set<String>> tree, ConcurrentHashMap<String, Pair<ServletResourceProvider, ServiceReference<?>>> providers, List<Pair<ServletResourceProvider, ServiceReference<?>>> registrations) {
for (Pair<ServletResourceProvider, ServiceReference<?>> reference : registrations) {
for (String path : reference.getLeft().getServletPaths()) {
- String current = "";
+ StringBuilder currentBuilder = new StringBuilder();
for (String part : path.split("/")) {
- Set<String> childs = tree.get(current);
- if (childs == null) {
- childs = Collections.synchronizedSet(new LinkedHashSet<>());
- tree.put(current, childs);
- }
- current += "/" + part;
- current = current.trim().replace("//", "/");
+ Set<String> childs = tree.computeIfAbsent(currentBuilder.toString(), k -> Collections.synchronizedSet(new LinkedHashSet<>()));
+ currentBuilder.append("/").append(part);
+ String cleanedCurrent = currentBuilder.toString().trim().replace("//", "/");
+ // replace the buffer with the cleaned string
+ currentBuilder.setLength(0);
+ currentBuilder.append(cleanedCurrent);
- childs.add(current);
+ childs.add(currentBuilder.toString());
}
Pair<ServletResourceProvider, ServiceReference<?>> old = providers.get(path);
@@ -126,11 +126,12 @@
}
}
- public Resource getResource(ResolveContext resolveContext, String path) {
+ @SuppressWarnings("unchecked")
+ public Resource getResource(@SuppressWarnings("rawtypes") ResolveContext resolveContext, String path) {
Resource wrapped = null;
- final ResourceProvider parentProvider = resolveContext.getParentResourceProvider();
+ final ResourceProvider<?> parentProvider = resolveContext.getParentResourceProvider();
if (parentProvider != null) {
- wrapped = parentProvider.getResource(resolveContext.getParentResolveContext(), path, null, null);
+ wrapped = parentProvider.getResource(resolveContext.getParentResolveContext(), path, ResourceContext.EMPTY_CONTEXT, null);
}
Resource result;
Pair<ServletResourceProvider, ServiceReference<?>> provider = providers.get().get(path);
@@ -157,10 +158,11 @@
return result;
}
- public Iterator<Resource> listChildren(final ResolveContext ctx, final Resource parent) {
+ @SuppressWarnings("unchecked")
+ public Iterator<Resource> listChildren(@SuppressWarnings("rawtypes") final ResolveContext ctx, final Resource parent) {
Map<String, Resource> result = new LinkedHashMap<>();
- final ResourceProvider parentProvider = ctx.getParentResourceProvider();
+ final ResourceProvider<?> parentProvider = ctx.getParentResourceProvider();
if (parentProvider != null) {
for (Iterator<Resource> iter = parentProvider.listChildren(ctx.getParentResolveContext(), parent); iter != null && iter.hasNext(); ) {
Resource resource = iter.next();
@@ -181,9 +183,9 @@
((ServletResource) resource).setWrappedResource(wrapped);
}
}
- }
- else if (!result.containsKey(path)) {
- result.put(path, new SyntheticResource(ctx.getResourceResolver(), path, ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
+ } else {
+ result.computeIfAbsent(path, key -> new SyntheticResource(ctx.getResourceResolver(), key,
+ ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
}
}
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
index 873d670..f7c9ba0 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
@@ -181,8 +181,8 @@
final String name = getName(reference);
// check for Sling properties in the service registration
- final ServletResourceProvider provider = servletResourceProviderFactory.create(reference, servlet);
- if (provider == null) {
+ final ServletResourceProvider srProvider = servletResourceProviderFactory.create(reference, servlet);
+ if (srProvider == null) {
// this is expected if the servlet is not destined for Sling
return false;
}
@@ -194,7 +194,7 @@
} catch (final ServletException ce) {
logger.error("bindServlet: Servlet " + ServletResourceProviderFactory.getServiceReferenceInfo(reference) + " failed to initialize", ce);
return false;
- } catch (final Throwable t) {
+ } catch (final Throwable t) { // NOSONAR
logger.error("bindServlet: Unexpected problem initializing servlet " + ServletResourceProviderFactory.getServiceReferenceInfo(reference), t);
return false;
}
@@ -207,14 +207,14 @@
final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
try {
if (this.provider != null) {
- this.provider.add(provider, reference);
+ this.provider.add(srProvider, reference);
resolutionCaches.values().forEach(ResolutionCache::flushCache);
}
else {
- for (final String root : provider.getServletPaths()) {
+ for (final String root : srProvider.getServletPaths()) {
@SuppressWarnings("unchecked") final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) bundleContext.registerService(
ResourceProvider.class.getName(),
- provider,
+ srProvider,
createServiceProperties(reference, root));
regs.add(reg);
}
@@ -225,10 +225,10 @@
}
if ( registered ) {
if ( logger.isDebugEnabled() ) {
- logger.debug("Registered {}", provider);
+ logger.debug("Registered {}", srProvider);
}
synchronized (this.servletsByReference) {
- servletsByReference.put(reference, new ServletReg(servlet, regs, provider));
+ servletsByReference.put(reference, new ServletReg(servlet, regs, srProvider));
}
}
}
@@ -243,7 +243,7 @@
private Dictionary<String, Object> createServiceProperties(final ServiceReference<Servlet> reference,
final String root) {
- final Dictionary<String, Object> params = new Hashtable<>();
+ final Dictionary<String, Object> params = new Hashtable<>(); // NOSONAR
params.put(ResourceProvider.PROPERTY_ROOT, root);
params.put(Constants.SERVICE_DESCRIPTION,
"ServletResourceProvider for Servlet at " + root);
@@ -277,17 +277,16 @@
// this might happen on shutdown
}
}
- if (registration.provider != null && provider != null) {
- if (provider.remove(registration.provider, reference)) {
- resolutionCaches.values().forEach(ResolutionCache::flushCache);
- }
+ if (registration.provider != null && provider != null &&
+ provider.remove(registration.provider)) {
+ resolutionCaches.values().forEach(ResolutionCache::flushCache);
}
final String name = RequestUtil.getServletName(registration.servlet);
logger.debug("unbindServlet: Servlet {} removed", name);
try {
registration.servlet.destroy();
- } catch (Throwable t) {
+ } catch (Throwable t) { // NOSONAR
logger.error("unbindServlet: Unexpected problem destroying servlet " + name, t);
}
}
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
index 19884d5..5d61cd1 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
@@ -21,6 +21,7 @@
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import javax.servlet.Servlet;
@@ -49,7 +50,7 @@
private final ResourceMetadata metadata;
- private volatile Resource wrapped;
+ private AtomicReference<Resource> wrapped = new AtomicReference<>();
public ServletResource(ResourceResolver resourceResolver, Servlet servlet, String path) {
this(resourceResolver, servlet, path, null);
@@ -70,7 +71,7 @@
void setWrappedResource(Resource wrapped) {
if (wrapped != null && !RESOURCE_TYPE_NON_EXISTING.equals(wrapped.getResourceType())) {
- this.wrapped = wrapped;
+ this.wrapped.set(wrapped);
}
}
@@ -117,24 +118,24 @@
@Override
@SuppressWarnings("unchecked")
- public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
- Resource wrapped = this.wrapped;
+ public <T> T adaptTo(Class<T> type) {
+ Resource wrappedResource = this.wrapped.get();
if (type == Servlet.class && servlet != null) {
- return (AdapterType) servlet; // unchecked cast
+ return (T) servlet; // unchecked cast
}
if (type == InputStream.class && servlet instanceof BundledScriptServlet) {
InputStream result = ((BundledScriptServlet) servlet).getInputStream();
if (result != null) {
- return (AdapterType) result;
+ return (T) result;
}
}
if (type == BundledRenderUnit.class && servlet instanceof BundledScriptServlet) {
- return (AdapterType) ((BundledScriptServlet) servlet).getBundledRenderUnit();
+ return (T) ((BundledScriptServlet) servlet).getBundledRenderUnit();
}
- if (wrapped != null) {
- AdapterType result = wrapped.adaptTo(type);
+ if (wrappedResource != null) {
+ T result = wrappedResource.adaptTo(type);
if (result != null) {
return result;
}
@@ -149,7 +150,7 @@
props.put("servletClass", this.servlet.getClass().getName());
}
- return (AdapterType) new ValueMapDecorator(props); // unchecked cast
+ return (T) new ValueMapDecorator(props); // unchecked cast
}
return super.adaptTo(type);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
index a7881d4..169066f 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
@@ -372,7 +372,6 @@
}
sb.append("component=");
sb.append(componentName);
- needsComma = true;
}
sb.append(")");
}
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
index 0e4bd23..c802238 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/PathBasedServletAcceptorTest.java
@@ -92,6 +92,7 @@
void assertAccept(boolean expected) {
// Stub the ServiceReference with our service properties
+ @SuppressWarnings("unchecked")
final ServiceReference<Servlet> reference = mock(ServiceReference.class);
final String [] keys = Collections.list(serviceProperties.keys()).toArray(STRING_ARRAY);
when(reference.getPropertyKeys()).thenReturn(keys);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
index 1448856..2d3713f 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/ScriptResourceTest.java
@@ -18,6 +18,11 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.servlets.resolver.internal;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
import javax.servlet.Servlet;
import org.apache.sling.api.adapter.AdapterManager;
@@ -29,12 +34,6 @@
import org.apache.sling.servlets.resolver.internal.resource.ServletResource;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
public class ScriptResourceTest {
@Test
@@ -55,7 +54,7 @@
ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
AdapterManager adapterManager = mock(AdapterManager.class);
- when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+ when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
SlingAdaptable.setAdapterManager(adapterManager);
Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -81,7 +80,7 @@
ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
AdapterManager adapterManager = mock(AdapterManager.class);
- when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+ when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
SlingAdaptable.setAdapterManager(adapterManager);
Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -107,7 +106,7 @@
ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
AdapterManager adapterManager = mock(AdapterManager.class);
- when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(mock(Servlet.class));
+ when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(mock(Servlet.class));
SlingAdaptable.setAdapterManager(adapterManager);
Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -131,7 +130,7 @@
ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
AdapterManager adapterManager = mock(AdapterManager.class);
- when(adapterManager.getAdapter(eq(scriptResource), eq(Servlet.class))).thenReturn(servlet);
+ when(adapterManager.getAdapter(scriptResource, Servlet.class)).thenReturn(servlet);
SlingAdaptable.setAdapterManager(adapterManager);
Servlet adaptedServlet = scriptResource.adaptTo(Servlet.class);
@@ -155,7 +154,7 @@
ScriptResource scriptResource = new ScriptResource(resource, () -> perThreadRR, sharedRR);
AdapterManager adapterManager = mock(AdapterManager.class);
- when(adapterManager.getAdapter(eq(scriptResource), eq(SlingScript.class))).thenReturn(script);
+ when(adapterManager.getAdapter(scriptResource, SlingScript.class)).thenReturn(script);
SlingAdaptable.setAdapterManager(adapterManager);
SlingScript adaptedScript = scriptResource.adaptTo(SlingScript.class);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
index aab277b..31bc1e6 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/SecureRequestsOptingServletTest.java
@@ -18,8 +18,8 @@
*/
package org.apache.sling.servlets.resolver.internal;
-import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
import java.util.ArrayList;
import java.util.List;
@@ -34,7 +34,6 @@
import org.apache.sling.api.servlets.ServletResolverConstants;
import org.apache.sling.commons.testing.osgi.MockServiceReference;
import org.apache.sling.commons.testing.sling.MockResource;
-import org.apache.sling.commons.testing.sling.MockResourceResolver;
import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
import org.apache.sling.servlets.resolver.internal.resource.MockServletResource;
import org.junit.Test;
@@ -90,8 +89,8 @@
insecureRequest.setResourceResolver(mockResourceResolver);
insecureRequest.setSecure(false);
Servlet result = servletResolver.resolveServlet(insecureRequest);
- assertTrue("Expecting a different servlet than our own",
- result.getClass() != SecureRequestsOptingServlet.class);
+ assertNotSame("Expecting a different servlet than our own",
+ result.getClass(), SecureRequestsOptingServlet.class);
}
@SuppressWarnings("serial")
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
index 1b2f8ee..1795134 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledHooksTest.java
@@ -18,6 +18,9 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.servlets.resolver.internal.bundle;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -25,7 +28,6 @@
import java.util.List;
import java.util.Map;
-import org.apache.sling.servlets.resolver.internal.bundle.BundledHooks;
import org.junit.Assert;
import org.junit.Test;
import org.osgi.framework.Bundle;
@@ -33,8 +35,6 @@
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.hooks.service.ListenerHook;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
public class BundledHooksTest {
@Test
@@ -75,6 +75,7 @@
Assert.assertEquals(1, services.size());
}
+ @SuppressWarnings("unchecked")
@Test
public void testEventHookFiltersOther() {
BundledHooks hooks = new BundledHooks();
@@ -83,6 +84,7 @@
BundleContext context = mock(BundleContext.class);
Bundle bundle = mock(Bundle.class);
+ @SuppressWarnings("rawtypes")
ServiceReference ref = mock(ServiceReference.class);
when(event.getServiceReference()).thenReturn(ref);
@@ -101,6 +103,7 @@
Assert.assertTrue(listeners.isEmpty());
}
+ @SuppressWarnings("unchecked")
@Test
public void testEventHookDoesNotFilterResolver() {
BundledHooks hooks = new BundledHooks();
@@ -109,6 +112,7 @@
BundleContext context = mock(BundleContext.class);
Bundle bundle = mock(Bundle.class);
+ @SuppressWarnings("rawtypes")
ServiceReference ref = mock(ServiceReference.class);
when(event.getServiceReference()).thenReturn(ref);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
index 198d04c..13e19c8 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/bundle/BundledScriptTrackerTest.java
@@ -18,21 +18,20 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
package org.apache.sling.servlets.resolver.internal.bundle;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Servlet;
-import org.apache.sling.servlets.resolver.internal.bundle.BundledScriptTracker;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.ServiceRegistration;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
public class BundledScriptTrackerTest {
@Test
@@ -40,6 +39,7 @@
BundledScriptTracker tracker = new BundledScriptTracker();
tracker.activate(mock(BundleContext.class));
List<ServiceRegistration<Servlet>> registrations = new ArrayList<>();
+ @SuppressWarnings("unchecked")
ServiceRegistration<Servlet> registration = mock(ServiceRegistration.class);
registrations.add(registration);
tracker.removedBundle(mock(Bundle.class), mock(BundleEvent.class), registrations);
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
index 317f0ce..faf664c 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollectorTest.java
@@ -19,7 +19,6 @@
package org.apache.sling.servlets.resolver.internal.helper;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -177,7 +176,9 @@
int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
- effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+ effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+ private static final long serialVersionUID = -2278401285444759128L;
+ {
add("esp");
add("js");
add("jsp");
@@ -208,7 +209,9 @@
int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
- effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+ effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+ private static final long serialVersionUID = 4918721764309621104L;
+ {
add("esp");
add("js");
}});
@@ -237,7 +240,9 @@
int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
- effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+ effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+ private static final long serialVersionUID = 1527098044127506711L;
+ {
add("esp");
add("js");
}});
@@ -384,7 +389,9 @@
int[] baseIdxs = { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0 , 0 , 1, 0};
int[] indices = {12, 13, 11, 10, 9, 3, 4, 1, 2, 0};
- effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){{
+ effectiveTest(names, baseIdxs, indices, new ArrayList<String>(){
+ private static final long serialVersionUID = 3909592432283252117L;
+ {
add("esp");
add("js");
add("jsp");
@@ -416,7 +423,7 @@
if (scriptEngineExtensions != null) {
res = lu.getServlets(request.getResourceResolver(), scriptEngineExtensions);
} else {
- res = lu.getServlets(request.getResourceResolver(), Collections.EMPTY_LIST);
+ res = lu.getServlets(request.getResourceResolver(), Collections.emptyList());
}
Iterator<Resource> rIter = res.iterator();
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
index 81a7f23..674b41e 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelection2Test.java
@@ -80,7 +80,7 @@
ResourceResolver.PROPERTY_RESOURCE_TYPE, "test");
// /content/test.html (sling:resourceType=test) --> /apps/test/test.html
- assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
+ assertScript(contentResource, "GET", null, "html", Collections.emptyList(),
"/apps/test/test.html",
"/libs/test/test.jsp"
);
@@ -96,7 +96,7 @@
JcrConstants.JCR_PRIMARYTYPE, JcrConstants.NT_UNSTRUCTURED,
ResourceResolver.PROPERTY_RESOURCE_TYPE, "test2");
// /content/test.html (sling:resourceType=test2) --> /apps/test2/test2.jsp
- assertScript(contentResource, "GET", null, "html", Collections.EMPTY_LIST,
+ assertScript(contentResource, "GET", null, "html", Collections.emptyList(),
"/apps/test2/test2.jsp",
"/apps/test/test.html",
"/libs/test/test.jsp"
@@ -147,7 +147,7 @@
);
// /content/test.sel.html (sling:resourceType=test2) --> /apps/test/sel.html
- assertScript(contentResource, "GET", "sel", "html", Collections.EMPTY_LIST,
+ assertScript(contentResource, "GET", "sel", "html", Collections.emptyList(),
"/apps/test/sel.html",
"/libs/test/sel.jsp",
"/apps/test2/test2.jsp",
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
index d084127..6017c9d 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/ScriptSelectionTest.java
@@ -70,7 +70,7 @@
// Create mock request and get scripts from ResourceCollector
final MockSlingHttpServletRequest req = makeRequest(method, selectors, extension);
final ResourceCollector u = ResourceCollector.create(req, null, new String[] {"html"});
- final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.EMPTY_LIST);
+ final Collection<Resource> s = u.getServlets(req.getResourceResolver(), Collections.emptyList());
if(expectedScript == null) {
assertFalse("No script must be found", s.iterator().hasNext());
diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
index db50e84..d40928f 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/internal/helper/WeightedResourceTest.java
@@ -18,6 +18,8 @@
*/
package org.apache.sling.servlets.resolver.internal.helper;
+import static org.junit.Assert.assertNotEquals;
+
import junit.framework.TestCase;
public class WeightedResourceTest extends TestCase {
@@ -27,13 +29,13 @@
WeightedResource lr2 = new WeightedResource(0, null, 0, WeightedResource.WEIGHT_NONE);
// expect same objects to be equal
- assertTrue(lr1.equals(lr1));
+ assertEquals(lr1, lr1);
// expect different instances to not be equal
- assertFalse(lr1.equals(lr2));
- assertFalse(lr2.equals(lr1));
- assertFalse(lr1.equals(null));
- assertFalse(lr2.equals(null));
+ assertNotEquals(lr1, lr2);
+ assertNotEquals(lr2, lr1);
+ assertNotNull(lr1);
+ assertNotNull(lr2);
}
public void testCompareToSelectors() {
diff --git a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
index 13d8f30..1c477ad 100644
--- a/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
+++ b/src/test/java/org/apache/sling/servlets/resolver/it/ServletResolverTestSupport.java
@@ -57,6 +57,7 @@
@Inject
protected BundleContext bundleContext;
+ @SuppressWarnings("unused")
@Inject
private SlingRequestProcessor slingRequestProcessor;