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 2009/06/24 18:29:15 UTC
svn commit: r788073 - in /sling/trunk/bundles/servlets/resolver: pom.xml
src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
Author: cziegeler
Date: Wed Jun 24 16:29:14 2009
New Revision: 788073
URL: http://svn.apache.org/viewvc?rev=788073&view=rev
Log:
SLING-1022 : Use admin session for script resolution
Modified:
sling/trunk/bundles/servlets/resolver/pom.xml
sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java
Modified: sling/trunk/bundles/servlets/resolver/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/pom.xml?rev=788073&r1=788072&r2=788073&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/pom.xml (original)
+++ sling/trunk/bundles/servlets/resolver/pom.xml Wed Jun 24 16:29:14 2009
@@ -99,6 +99,7 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
+ <!-- Testing -->
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.commons.testing</artifactId>
@@ -114,5 +115,9 @@
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.jmock</groupId>
+ <artifactId>jmock-junit4</artifactId>
+ </dependency>
</dependencies>
</project>
Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=788073&r1=788072&r2=788073&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Wed Jun 24 16:29:14 2009
@@ -33,6 +33,8 @@
import java.util.List;
import java.util.Map;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
@@ -55,6 +57,7 @@
import org.apache.sling.engine.RequestUtil;
import org.apache.sling.engine.servlets.AbstractServiceReferenceConfig;
import org.apache.sling.engine.servlets.ErrorHandler;
+import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;
import org.apache.sling.servlets.resolver.internal.defaults.DefaultErrorHandlerServlet;
import org.apache.sling.servlets.resolver.internal.defaults.DefaultServlet;
@@ -70,7 +73,12 @@
import org.slf4j.LoggerFactory;
/**
- * The <code>SlingServletResolver</code> TODO
+ * The <code>SlingServletResolver</code> has two functions:
+ * It resolves scripts by implementing the {@link SlingScriptResolver} interface
+ * and it resolves a servlet for a request by implementing the {@link ServletResolver}
+ * interface.
+ *
+ * The resolver uses an own session to find the scripts.
*
* @scr.component name="org.apache.sling.servlets.resolver.SlingServletResolver"
* label="%servletresolver.name"
@@ -104,10 +112,20 @@
/** @scr.reference */
private JcrResourceResolverFactory resourceResolverFactory;
+ /** @scr.reference */
+ private SlingRepository repository;
+
+ /** The session used for script resolution. */
+ private Session scriptSession;
+
+ /** The resource resolver used for script resolution. */
+ private ResourceResolver scriptResolver;
+
private Map<ServiceReference, ServiceRegistration> servletsByReference = new HashMap<ServiceReference, ServiceRegistration>();
private List<ServiceReference> pendingServlets = new ArrayList<ServiceReference>();
+ /** The component context. */
private ComponentContext context;
private ServletResourceProviderFactory servletResourceProviderFactory;
@@ -122,47 +140,50 @@
// ---------- ServletResolver interface -----------------------------------
+ /**
+ * @see org.apache.sling.api.servlets.ServletResolver#resolveServlet(org.apache.sling.api.SlingHttpServletRequest)
+ */
public Servlet resolveServlet(SlingHttpServletRequest request) {
- Resource resource = request.getResource();
+ final Resource resource = request.getResource();
// start tracking servlet resolution
- RequestProgressTracker tracker = request.getRequestProgressTracker();
- String timerName = "resolverServlet(" + resource + ")";
+ final RequestProgressTracker tracker = request.getRequestProgressTracker();
+ final String timerName = "resolveServlet(" + resource + ")";
tracker.startTimer(timerName);
Servlet servlet = null;
final String type = resource.getResourceType();
if(log.isDebugEnabled()) {
- log.debug("resolveServlet called for Resource {}", request.getResource());
+ log.debug("resolveServlet called for resource {}", resource);
}
// first check whether the type of a resource is the absolute
// path of a servlet (or script)
if (type.charAt(0) == '/') {
- Resource res = request.getResourceResolver().getResource(type);
+ final Resource res = this.scriptResolver.getResource(type);
if (res != null) {
servlet = res.adaptTo(Servlet.class);
}
- if(servlet!=null && log.isDebugEnabled()) {
+ if (servlet!=null && log.isDebugEnabled()) {
log.debug("Servlet {} found using absolute resource type {}", RequestUtil.getServletName(servlet), type);
}
}
// the resource type is not absolute, so lets go for the deep search
if (servlet == null) {
- ResourceCollector locationUtil = ResourceCollector.create(request);
- servlet = getServlet(locationUtil, request, resource.getResourceResolver());
+ final ResourceCollector locationUtil = ResourceCollector.create(request);
+ servlet = getServlet(locationUtil, request);
- if(log.isDebugEnabled()) {
- log.debug("getServlet returns Servlet {}", RequestUtil.getServletName(servlet));
+ if (log.isDebugEnabled()) {
+ log.debug("getServlet returns servlet {}", RequestUtil.getServletName(servlet));
}
}
// last resort, use the core bundle default servlet
if (servlet == null) {
if(log.isDebugEnabled()) {
- log.debug("No specific Servlet found, trying default");
+ log.debug("No specific servlet found, trying default");
}
servlet = getDefaultServlet();
}
@@ -170,20 +191,20 @@
// track servlet resolution termination
if (servlet == null) {
tracker.logTimer(timerName,
- "Servlet Resolution failed. See log for details");
+ "Servlet resolution failed. See log for details");
} else {
- tracker.logTimer(timerName, "Using Servlet {0}",
+ tracker.logTimer(timerName, "Using servlet {0}",
RequestUtil.getServletName(servlet));
}
// log the servlet found
if (log.isDebugEnabled()) {
if (servlet != null) {
- log.info("Servlet {} found for Resource={}",
- RequestUtil.getServletName(servlet), request.getResource());
+ log.info("Servlet {} found for resource={}",
+ RequestUtil.getServletName(servlet), resource);
} else {
- log.debug("No servlet found for Resource={}",
- request.getResource());
+ log.debug("No servlet found for resource={}",
+ resource);
}
}
@@ -262,7 +283,7 @@
String.valueOf(status),
ServletResolverConstants.ERROR_HANDLER_PATH,
resource);
- Servlet servlet = getServlet(locationUtil, request, resource.getResourceResolver());
+ Servlet servlet = getServlet(locationUtil, request);
// fall back to default servlet if none
if (servlet == null) {
@@ -324,7 +345,7 @@
tClass.getSimpleName(),
ServletResolverConstants.ERROR_HANDLER_PATH,
resource);
- servlet = getServlet(locationUtil, request, resource.getResourceResolver());
+ servlet = getServlet(locationUtil, request);
// go to the base class
tClass = tClass.getSuperclass();
@@ -396,15 +417,15 @@
* @return a servlet for handling the request or <code>null</code> if no
* such servlet willing to handle the request could be found.
*/
- private Servlet getServlet(ResourceCollector locationUtil,
- SlingHttpServletRequest request, ResourceResolver resolver) {
- final Collection<Resource> candidates = locationUtil.getServlets(resolver);
+ private Servlet getServlet(final ResourceCollector locationUtil,
+ final SlingHttpServletRequest request) {
+ final Collection<Resource> candidates = locationUtil.getServlets(this.scriptResolver);
- if(log.isDebugEnabled()) {
+ if (log.isDebugEnabled()) {
if(candidates.isEmpty()) {
- log.debug("No Servlet candidates found");
+ log.debug("No servlet candidates found");
} else {
- log.debug("Ordered list of Servlet candidates follows");
+ log.debug("Ordered list of servlet candidates follows");
for (Resource candidateResource : candidates) {
log.debug("Servlet candidate: {}", candidateResource.getPath());
}
@@ -414,7 +435,7 @@
boolean hasOptingServlet = false;
for (Resource candidateResource : candidates) {
if(log.isDebugEnabled()) {
- log.debug("Checking if candidate Resource {} adapts to Servlet and accepts request",
+ log.debug("Checking if candidate resource {} adapts to servlet and accepts request",
candidateResource.getPath());
}
Servlet candidate = candidateResource.adaptTo(Servlet.class);
@@ -433,7 +454,7 @@
}
} else {
if(log.isDebugEnabled()) {
- log.debug("Candidate {} does not adapt to a Servlet, ignored", candidateResource.getPath());
+ log.debug("Candidate {} does not adapt to a servlet, ignored", candidateResource.getPath());
}
}
}
@@ -455,7 +476,7 @@
"Sling Core Default Servlet"));
defaultServlet = servlet;
} catch (ServletException se) {
- log.error("Failed to initiliaze Servlet", se);
+ log.error("Failed to initialize default servlet", se);
}
}
@@ -477,7 +498,7 @@
"Sling Default Error Handler Servlet"));
defaultErrorServlet = servlet;
} catch (ServletException se) {
- log.error("Failed to initiliaze Servlet", se);
+ log.error("Failed to initialize error servlet", se);
}
}
@@ -522,6 +543,14 @@
servletRoot = DEFAULT_SERVLET_ROOT;
}
+ // create the script session
+ try {
+ this.scriptSession = this.repository.loginAdministrative(null);
+ } catch (RepositoryException e) {
+ throw new SlingException("Unable to create new admin session.", e);
+ }
+ this.scriptResolver = this.resourceResolverFactory.getResourceResolver(this.scriptSession);
+
Collection<ServiceReference> refs;
synchronized (this) {
@@ -549,6 +578,10 @@
// destroy all servlets
destroyAllServlets(refs);
+ if ( this.scriptSession != null ) {
+ this.scriptSession.logout();
+ this.scriptSession = null;
+ }
this.context = null;
this.servletResourceProviderFactory = null;
}
@@ -670,14 +703,4 @@
}
}
}
-
- protected void bindResourceResolverFactory(JcrResourceResolverFactory factory) {
- this.resourceResolverFactory = factory;
- }
-
- protected void unbindResourceResolverFactory(JcrResourceResolverFactory factory) {
- if ( this.resourceResolverFactory == factory) {
- this.resourceResolverFactory = null;
- }
- }
}
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=788073&r1=788072&r2=788073&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 Wed Jun 24 16:29:14 2009
@@ -18,6 +18,10 @@
*/
package org.apache.sling.servlets.resolver.internal;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
@@ -25,8 +29,6 @@
import javax.servlet.Servlet;
import javax.servlet.http.HttpServlet;
-import junit.framework.TestCase;
-
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
@@ -39,11 +41,23 @@
import org.apache.sling.commons.testing.sling.MockResourceResolver;
import org.apache.sling.commons.testing.sling.MockSlingHttpServletRequest;
import org.apache.sling.engine.EngineConstants;
+import org.apache.sling.jcr.api.SlingRepository;
import org.apache.sling.jcr.resource.JcrResourceResolverFactory;
import org.apache.sling.servlets.resolver.internal.resource.MockServletResource;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JMock;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
import org.osgi.framework.Constants;
-public class SlingServletResolverTest extends TestCase {
+@RunWith(JMock.class)
+public class SlingServletResolverTest {
+
+ protected final Mockery context = new JUnit4Mockery();
+
private Servlet servlet;
private SlingServletResolver servletResolver;
@@ -56,8 +70,7 @@
private MockResourceResolver mockResourceResolver;
- protected void setUp() throws Exception {
- super.setUp();
+ @Before public void setUp() throws Exception {
mockResourceResolver = new MockResourceResolver();
mockResourceResolver.setSearchPath("/");
@@ -70,7 +83,21 @@
servlet = new MockSlingRequestHandlerServlet();
servletResolver = new SlingServletResolver();
- servletResolver.bindResourceResolverFactory(factory);
+ // set resource resolver factory
+ final Field resolverField = servletResolver.getClass().getDeclaredField("resourceResolverFactory");
+ resolverField.setAccessible(true);
+ resolverField.set(servletResolver, factory);
+ // set sling repository
+ final SlingRepository repository = this.context.mock(SlingRepository.class);
+ final Session session = this.context.mock(Session.class);
+ this.context.checking(new Expectations() {{
+ allowing(repository).loginAdministrative(with(aNull(String.class)));
+ will(returnValue(session));
+ }});
+
+ final Field repositoryField = servletResolver.getClass().getDeclaredField("repository");
+ repositoryField.setAccessible(true);
+ repositoryField.set(servletResolver, repository);
MockBundle bundle = new MockBundle(1L);
MockComponentContext mockComponentContext = new MockComponentContext(
@@ -107,7 +134,7 @@
mockResourceResolver.addChildren(parent, childRes);
}
- public void testAcceptsRequest() {
+ @Test public void testAcceptsRequest() {
MockSlingHttpServletRequest secureRequest = new MockSlingHttpServletRequest(
SERVLET_PATH, null, SERVLET_EXTENSION, null, null);
secureRequest.setResourceResolver(mockResourceResolver);
@@ -116,7 +143,7 @@
assertEquals("Did not resolve to correct servlet", servlet, result);
}
- public void testIgnoreRequest() {
+ @Test public void testIgnoreRequest() {
MockSlingHttpServletRequest insecureRequest = new MockSlingHttpServletRequest(
SERVLET_PATH, null, SERVLET_EXTENSION, null, null);
insecureRequest.setResourceResolver(mockResourceResolver);