You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2017/03/31 10:20:28 UTC
svn commit: r1789652 - in /sling/trunk/bundles/servlets/resolver/src:
main/java/org/apache/sling/servlets/resolver/internal/
main/java/org/apache/sling/servlets/resolver/internal/resource/
test/java/org/apache/sling/servlets/resolver/internal/ test/jav...
Author: cziegeler
Date: Fri Mar 31 10:20:28 2017
New Revision: 1789652
URL: http://svn.apache.org/viewvc?rev=1789652&view=rev
Log:
SLING-6762 : Use target filter for servlet references
Modified:
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java
Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Fri Mar 31 10:20:28 2017
@@ -184,10 +184,10 @@ public class SlingServletResolver
private final Map<ServiceReference<Servlet>, ServletReg> servletsByReference = new HashMap<>();
- private final List<ServiceReference<Servlet>> pendingServlets = new ArrayList<>();
+ private final List<PendingServlet> pendingServlets = new ArrayList<>();
- /** The component context. */
- private ComponentContext context;
+ /** The bundle context. */
+ private BundleContext context;
private ServletResourceProviderFactory servletResourceProviderFactory;
@@ -794,8 +794,8 @@ public class SlingServletResolver
* Activate this component.
*/
@Activate
- protected void activate(final ComponentContext context, final Config config) throws LoginException {
- final Collection<ServiceReference<Servlet>> refs;
+ protected void activate(final BundleContext context, final Config config) throws LoginException {
+ final Collection<PendingServlet> refs;
synchronized (this.pendingServlets) {
refs = new ArrayList<>(pendingServlets);
@@ -855,18 +855,18 @@ public class SlingServletResolver
props.put("service.description", "Apache Sling Servlet Resolver and Error Handler");
props.put("service.vendor","The Apache Software Foundation");
- this.eventHandlerReg = context.getBundleContext()
+ this.eventHandlerReg = context
.registerService(new String[] {ResourceChangeListener.class.getName(), EventHandler.class.getName()}, this, props);
- this.plugin = new ServletResolverWebConsolePlugin(context.getBundleContext());
+ this.plugin = new ServletResolverWebConsolePlugin(context);
if (this.cacheSize > 0) {
try {
Dictionary<String, String> mbeanProps = new Hashtable<>();
mbeanProps.put("jmx.objectname", "org.apache.sling:type=servletResolver,service=SlingServletResolverCache");
ServletResolverCacheMBeanImpl mbean = new ServletResolverCacheMBeanImpl();
- mbeanRegistration = context.getBundleContext().registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
+ mbeanRegistration = context.registerService(SlingServletResolverCacheMBean.class, mbean, mbeanProps);
} catch (Throwable t) {
LOGGER.debug("Unable to register mbean");
}
@@ -931,22 +931,22 @@ public class SlingServletResolver
@Reference(
name = REF_SERVLET,
- service = javax.servlet.Servlet.class,
+ service = Servlet.class,
cardinality = ReferenceCardinality.MULTIPLE,
policy = ReferencePolicy.DYNAMIC,
target="(|(" + ServletResolverConstants.SLING_SERVLET_PATHS + "=*)(" + ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES + "=*))")
- protected void bindServlet(final ServiceReference<Servlet> reference) {
+ protected void bindServlet(final Servlet servlet, final ServiceReference<Servlet> reference) {
boolean directCreate = true;
if (context == null) {
synchronized ( pendingServlets ) {
if (context == null) {
- pendingServlets.add(reference);
+ pendingServlets.add(new PendingServlet(servlet, reference));
directCreate = false;
}
}
}
if ( directCreate ) {
- createServlet(reference);
+ createServlet(servlet, reference);
}
}
@@ -959,41 +959,24 @@ public class SlingServletResolver
// ---------- Servlet Management -------------------------------------------
- private void createAllServlets(final Collection<ServiceReference<Servlet>> pendingServlets) {
- for (final ServiceReference<Servlet> serviceReference : pendingServlets) {
- createServlet(serviceReference);
+ private void createAllServlets(final Collection<PendingServlet> pendingServlets) {
+ for (final PendingServlet ps : pendingServlets) {
+ createServlet(ps.servlet, ps.reference);
}
}
- private boolean createServlet(final ServiceReference<Servlet> reference) {
+ private boolean createServlet(final Servlet servlet, final ServiceReference<Servlet> reference) {
// check for a name, this is required
final String name = getName(reference);
// check for Sling properties in the service registration
- final ServletResourceProvider provider = servletResourceProviderFactory.create(reference);
+ final ServletResourceProvider provider = servletResourceProviderFactory.create(reference, servlet);
if (provider == null) {
// this is expected if the servlet is not destined for Sling
return false;
}
- // only now try to access the servlet service, this may still fail
- Throwable exception = null;
- Servlet servlet = null;
- try {
- servlet = context.locateService(REF_SERVLET, reference);
- } catch (Throwable t) {
- exception = t;
- }
- if (servlet == null) {
- LOGGER.error("bindServlet: Servlet service not available from reference "
- + ServletResourceProviderFactory.getServiceReferenceInfo(reference), exception);
- return false;
- }
-
- // assign the servlet to the provider
- provider.setServlet(servlet);
-
// initialize now
try {
servlet.init(new SlingServletConfig(servletContext, reference, name));
@@ -1009,7 +992,7 @@ public class SlingServletResolver
final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
for(final String root : provider.getServletPaths()) {
@SuppressWarnings("unchecked")
- final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) context.getBundleContext().registerService(
+ final ServiceRegistration<ResourceProvider<Object>> reg = (ServiceRegistration<ResourceProvider<Object>>) context.registerService(
ResourceProvider.class.getName(),
provider,
createServiceProperties(reference, provider, root));
@@ -1056,7 +1039,11 @@ public class SlingServletResolver
if (registration != null) {
for(final ServiceRegistration<ResourceProvider<Object>> reg : registration.registrations) {
- reg.unregister();
+ try {
+ reg.unregister();
+ } catch ( final IllegalStateException ise) {
+ // this might happen on shutdown
+ }
}
final String name = RequestUtil.getServletName(registration.servlet);
LOGGER.debug("unbindServlet: Servlet {} removed", name);
@@ -1136,6 +1123,16 @@ public class SlingServletResolver
}
}
+ private static final class PendingServlet {
+ public final Servlet servlet;
+ public final ServiceReference<Servlet> reference;
+
+ public PendingServlet(final Servlet s, final ServiceReference<Servlet> ref) {
+ this.servlet = s;
+ this.reference = ref;
+ }
+ }
+
@SuppressWarnings("serial")
class ServletResolverWebConsolePlugin extends HttpServlet {
private static final String PARAMETER_URL = "url";
Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java Fri Mar 31 10:20:28 2017
@@ -35,18 +35,15 @@ public class ServletResourceProvider ext
private Set<String> resourcePaths;
- ServletResourceProvider(Set<String> resourcePaths) {
- this.resourcePaths = resourcePaths;
- }
-
- public void setServlet(Servlet servlet) {
+ ServletResourceProvider(final Servlet servlet, final Set<String> resourcePaths) {
this.servlet = servlet;
+ this.resourcePaths = resourcePaths;
}
@Override
public Resource getResource(final ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
// only return a resource if the servlet has been assigned
- if (servlet != null && resourcePaths.contains(path)) {
+ if (resourcePaths.contains(path)) {
return new ServletResource(ctx.getResourceResolver(), servlet, path);
}
Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java Fri Mar 31 10:20:28 2017
@@ -120,7 +120,7 @@ public class ServletResourceProviderFact
}
}
- public ServletResourceProvider create(ServiceReference<Servlet> ref) {
+ public ServletResourceProvider create(final ServiceReference<Servlet> ref, final Servlet servlet) {
Set<String> pathSet = new HashSet<>();
@@ -144,7 +144,7 @@ public class ServletResourceProviderFact
getServiceReferenceInfo(ref), pathSet);
}
- return new ServletResourceProvider(pathSet);
+ return new ServletResourceProvider(servlet, pathSet);
}
/**
Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java Fri Mar 31 10:20:28 2017
@@ -43,7 +43,6 @@ import org.apache.sling.api.servlets.Opt
import org.apache.sling.api.servlets.ServletResolverConstants;
import org.apache.sling.commons.testing.osgi.MockBundle;
import org.apache.sling.commons.testing.osgi.MockBundleContext;
-import org.apache.sling.commons.testing.osgi.MockComponentContext;
import org.apache.sling.commons.testing.osgi.MockServiceReference;
import org.apache.sling.commons.testing.sling.MockResource;
import org.apache.sling.commons.testing.sling.MockResourceResolver;
@@ -154,8 +153,6 @@ public class SlingServletResolverTest {
return null;
}
};
- MockComponentContext mockComponentContext = new MockComponentContext(
- bundleContext, SlingServletResolverTest.this.servlet);
MockServiceReference serviceReference = new MockServiceReference(bundle);
serviceReference.setProperty(Constants.SERVICE_ID, 1L);
serviceReference.setProperty(ServletResolverConstants.SLING_SERVLET_NAME,
@@ -165,10 +162,9 @@ public class SlingServletResolverTest {
serviceReference.setProperty(
ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
SERVLET_EXTENSION);
- mockComponentContext.locateService(SERVLET_NAME, serviceReference);
- servletResolver.bindServlet(serviceReference);
- servletResolver.activate(mockComponentContext, new SlingServletResolver.Config() {
+ servletResolver.bindServlet(SlingServletResolverTest.this.servlet, serviceReference);
+ servletResolver.activate(bundleContext, new SlingServletResolver.Config() {
@Override
public Class<? extends Annotation> annotationType() {
@@ -248,7 +244,7 @@ public class SlingServletResolverTest {
srpf.setAccessible(true);
ServletResourceProviderFactory factory = (ServletResourceProviderFactory) srpf.get(servletResolver);
- ServletResourceProvider servlet = factory.create(msr);
+ ServletResourceProvider servlet = factory.create(msr, null);
Method createServiceProperties = SlingServletResolver.class.getDeclaredMethod("createServiceProperties", ServiceReference.class, ServletResourceProvider.class, String.class);
createServiceProperties.setAccessible(true);
Modified: sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java?rev=1789652&r1=1789651&r2=1789652&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java Fri Mar 31 10:20:28 2017
@@ -56,9 +56,8 @@ public class ServletResourceProviderCrea
msr.setProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES,
RES_TYPE);
// msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);
@@ -84,9 +83,8 @@ public class ServletResourceProviderCrea
RES_TYPE);
msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "GET");
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);
@@ -111,9 +109,8 @@ public class ServletResourceProviderCrea
msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS,
new String[] { "GET", "POST", "PUT" });
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);
@@ -141,9 +138,8 @@ public class ServletResourceProviderCrea
RES_TYPE);
msr.setProperty(ServletResolverConstants.SLING_SERVLET_METHODS, "*");
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);
@@ -172,9 +168,8 @@ public class ServletResourceProviderCrea
msr.setProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
new String[] { "json" });
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);
@@ -201,9 +196,8 @@ public class ServletResourceProviderCrea
msr.setProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS,
new String[] { "json", "html" });
- ServletResourceProvider srp = factory.create(msr);
+ ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
assertNotNull(srp);
- srp.setServlet(TEST_SERVLET);
String[] paths = srp.getServletPaths();
assertNotNull(paths);