Return-Path: Delivered-To: apmail-sling-commits-archive@www.apache.org Received: (qmail 6934 invoked from network); 23 May 2010 13:36:09 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 23 May 2010 13:36:09 -0000 Received: (qmail 74124 invoked by uid 500); 23 May 2010 13:36:09 -0000 Delivered-To: apmail-sling-commits-archive@sling.apache.org Received: (qmail 74068 invoked by uid 500); 23 May 2010 13:36:08 -0000 Mailing-List: contact commits-help@sling.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@sling.apache.org Delivered-To: mailing list commits@sling.apache.org Received: (qmail 74061 invoked by uid 99); 23 May 2010 13:36:08 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 23 May 2010 13:36:08 +0000 X-ASF-Spam-Status: No, hits=-1446.5 required=10.0 tests=ALL_TRUSTED,AWL X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 23 May 2010 13:36:07 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id ED22B23889BF; Sun, 23 May 2010 13:35:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r947408 - in /sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal: ./ defaults/ helper/ Date: Sun, 23 May 2010 13:35:46 -0000 To: commits@sling.apache.org From: cziegeler@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100523133546.ED22B23889BF@eris.apache.org> Author: cziegeler Date: Sun May 23 13:35:46 2010 New Revision: 947408 URL: http://svn.apache.org/viewvc?rev=947408&view=rev Log: SLING-1446 : Scripts should be resolved against the current workspace Removed: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/WorkspaceResourceResolver.java 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/defaults/DefaultServlet.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.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=947408&r1=947407&r2=947408&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 Sun May 23 13:35:46 2010 @@ -164,10 +164,7 @@ public class SlingServletResolver implem /** @scr.reference */ private ResourceResolverFactory resourceResolverFactory; - /** The resource resolver used for script resolution. */ - private ConcurrentHashMap scriptResolvers; - - private WorkspaceResourceResolver defaultScriptResolver; + private ResourceResolver scriptResolver; private Map servletsByReference = new HashMap(); @@ -206,6 +203,12 @@ public class SlingServletResolver implem private boolean useDefaultWorkspace; /** + * The default workspace to use (might be null to use the default + * workspace). + */ + private String defaultWorkspaceName; + + /** * The allowed execution paths. */ private String[] executionPaths; @@ -234,16 +237,15 @@ public class SlingServletResolver implem final String wspName = getWorkspaceName(request); // First, we use a resource resolver using the same workspace as the // resource - WorkspaceResourceResolver scriptResolver = getScriptResolver(wspName); - servlet = resolveServlet(request, type, scriptResolver); + servlet = resolveServlet(request, type, scriptResolver, wspName); - if (servlet == null && this.useDefaultWorkspace - && !WorkspaceResourceResolver.isSameWorkspace(wspName, defaultScriptResolver.getWorkspaceName()) ) { - servlet = resolveServlet(request, type, defaultScriptResolver); + // now we try the default workspace + if (servlet == null && this.useDefaultWorkspace && wspName != null ) { + servlet = resolveServlet(request, type, scriptResolver, this.defaultWorkspaceName); } } else { - servlet = resolveServlet(request, type, defaultScriptResolver); + servlet = resolveServlet(request, type, scriptResolver, this.defaultWorkspaceName); } // last resort, use the core bundle default servlet @@ -284,7 +286,7 @@ public class SlingServletResolver implem log.debug("resolveServlet called for resource {} with script name {}", resource, scriptName); } - final Servlet servlet = resolveServlet(defaultScriptResolver, resource, scriptName); + final Servlet servlet = resolveServlet(scriptResolver, resource, scriptName); // log the servlet found if (log.isDebugEnabled()) { @@ -309,7 +311,7 @@ public class SlingServletResolver implem log.debug("resolveServlet called for for script name {}", scriptName); } - final Servlet servlet = resolveServlet(defaultScriptResolver, null, scriptName); + final Servlet servlet = resolveServlet(scriptResolver, null, scriptName); // log the servlet found if (log.isDebugEnabled()) { @@ -421,21 +423,21 @@ public class SlingServletResolver implem tracker.startTimer(timerName); try { - final WorkspaceResourceResolver scriptResolver = getScriptResolver(getWorkspaceName(request)); + final String wspName = getWorkspaceName(request); // find the error handler component Resource resource = getErrorResource(request); // find a servlet for the status as the method name ResourceCollector locationUtil = new ResourceCollector(String.valueOf(status), - ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName(), + ServletResolverConstants.ERROR_HANDLER_PATH, resource, wspName, this.executionPaths); Servlet servlet = getServlet(locationUtil, request, scriptResolver); // fall back to default servlet if none if (servlet == null) { servlet = getDefaultErrorServlet(request, scriptResolver, - resource); + resource, wspName); } // set the message properties @@ -475,7 +477,7 @@ public class SlingServletResolver implem tracker.startTimer(timerName); try { - final WorkspaceResourceResolver scriptResolver = getScriptResolver(getWorkspaceName(request)); + final String wspName = getWorkspaceName(request); // find the error handler component Servlet servlet = null; @@ -485,7 +487,7 @@ public class SlingServletResolver implem while (servlet == null && tClass != Object.class) { // find a servlet for the simple class name as the method name ResourceCollector locationUtil = new ResourceCollector(tClass.getSimpleName(), - ServletResolverConstants.ERROR_HANDLER_PATH, resource, scriptResolver.getWorkspaceName(), + ServletResolverConstants.ERROR_HANDLER_PATH, resource, wspName, this.executionPaths); servlet = getServlet(locationUtil, request, scriptResolver); @@ -495,7 +497,7 @@ public class SlingServletResolver implem if (servlet == null) { servlet = getDefaultErrorServlet(request, scriptResolver, - resource); + resource, wspName); } // set the message properties @@ -536,17 +538,23 @@ public class SlingServletResolver implem /** * Resolve an appropriate servlet for a given request and resource type - * using the provided ResourceResolver. + * using the provided ResourceResolver and workspace */ - private Servlet resolveServlet(final SlingHttpServletRequest request, final String type, - final WorkspaceResourceResolver resolver) { + private Servlet resolveServlet(final SlingHttpServletRequest request, + final String type, + final ResourceResolver resolver, + final String workspaceName) { Servlet servlet = null; // first check whether the type of a resource is the absolute // path of a servlet (or script) if (type.charAt(0) == '/') { if ( this.isPathAllowed(type) ) { - final Resource res = resolver.getResource(type); + String path = type; + if ( workspaceName != null ) { + path = workspaceName + ':' + type; + } + final Resource res = resolver.getResource(path); if (res != null) { servlet = res.adaptTo(Servlet.class); } @@ -558,7 +566,7 @@ public class SlingServletResolver implem } if ( servlet == null ) { // the resource type is not absolute, so lets go for the deep search - final ResourceCollector locationUtil = ResourceCollector.create(request, resolver.getWorkspaceName(), this.executionPaths); + final ResourceCollector locationUtil = ResourceCollector.create(request, workspaceName, this.executionPaths); servlet = getServlet(locationUtil, request, resolver); if (log.isDebugEnabled()) { @@ -594,7 +602,9 @@ public class SlingServletResolver implem final ResourceResolver scriptResolver) { final Servlet scriptServlet = (this.cache != null ? this.cache.get(locationUtil) : null); if (scriptServlet != null) { - log.debug("Using cached servlet {}", scriptServlet.getClass().getName()); + if ( log.isDebugEnabled() ) { + log.debug("Using cached servlet {}", RequestUtil.getServletName(scriptServlet)); + } return scriptServlet; } @@ -679,15 +689,16 @@ public class SlingServletResolver implem */ private Servlet getDefaultErrorServlet( final SlingHttpServletRequest request, - final WorkspaceResourceResolver scriptResolver, - final Resource resource) { + final ResourceResolver scriptResolver, + final Resource resource, + final String workspaceName) { // find a default error handler according to the resource type // tree of the given resource final ResourceCollector locationUtil = new ResourceCollector( ServletResolverConstants.DEFAULT_ERROR_HANDLER_NAME, ServletResolverConstants.ERROR_HANDLER_PATH, resource, - scriptResolver.getWorkspaceName(), + workspaceName, this.executionPaths); final Servlet servlet = getServlet(locationUtil, request, scriptResolver); @@ -739,51 +750,24 @@ public class SlingServletResolver implem * Package scoped to help with testing. */ String getWorkspaceName(SlingHttpServletRequest request) { - return WorkspaceResourceResolver.getWorkspaceName(request.getResourceResolver()); - } - - /** - * Get a resource resolver for the given workspace. - * If the login to the given workspace does not work, we return the default resource resolver! - * @param wspName The workspace name or null for the default workspace - * @return A resource resolver - */ - private WorkspaceResourceResolver getScriptResolver(String wspName) { - if (wspName == null || wspName.equals(defaultScriptResolver.getWorkspaceName())) { - return defaultScriptResolver; - } - - WorkspaceResourceResolver scriptResolver = scriptResolvers.get(wspName); - if (scriptResolver != null) { - return scriptResolver; - } - - try { - scriptResolver = new WorkspaceResourceResolver(this.resourceResolverFactory.getResourceResolver(createAuthenticationInfo(wspName))); - WorkspaceResourceResolver resolverFromMap = scriptResolvers.putIfAbsent(wspName, scriptResolver); - if (resolverFromMap != null) { - // another resolver was bound while this resolver was being created - // abandon ship - scriptResolver.close(); - scriptResolver = resolverFromMap; - } - } catch (LoginException le) { - log.warn("Unable to login into workspace " + wspName + " : " + le.getMessage(), le); - scriptResolver = defaultScriptResolver; + if ( this.useRequestWorkspace ) { + final String path = request.getResource().getPath(); + final int pos = path.indexOf(":/"); + if ( pos == -1 ) { + return null; // default workspace + } + return path.substring(0, pos); } - return scriptResolver; + return null; } - private Map createAuthenticationInfo(String wspName) { + private Map createAuthenticationInfo() { final Map authInfo = new HashMap(); // if a script user is configured we use this user to read the scripts final String scriptUser = OsgiUtil.toString(context.getProperties().get(PROP_SCRIPT_USER), null); if (scriptUser != null && scriptUser.length() > 0) { authInfo.put(ResourceResolverFactory.SUDO_USER_ID, scriptUser); } - if ( wspName != null ) { - authInfo.put("user.jcr.workspace", wspName); - } return authInfo; } @@ -813,18 +797,17 @@ public class SlingServletResolver implem this.useDefaultWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_DEFAULT_WORKSPACE), DEFAULT_USE_DEFAULT_WORKSPACE); this.useRequestWorkspace = OsgiUtil.toBoolean(properties.get(PROP_USE_REQUEST_WORKSPACE), DEFAULT_USE_REQUEST_WORKSPACE); - this.scriptResolvers = new ConcurrentHashMap(); - String defaultWorkspaceProp = (String) properties.get(PROP_DEFAULT_SCRIPT_WORKSPACE); if ( defaultWorkspaceProp != null && defaultWorkspaceProp.trim().length() == 0 ) { defaultWorkspaceProp = null; } + this.defaultWorkspaceName = defaultWorkspaceProp; - this.defaultScriptResolver = new WorkspaceResourceResolver( - resourceResolverFactory.getAdministrativeResourceResolver(this.createAuthenticationInfo(defaultWorkspaceProp))); + this.scriptResolver = + resourceResolverFactory.getAdministrativeResourceResolver(this.createAuthenticationInfo()); servletResourceProviderFactory = new ServletResourceProviderFactory(servletRoot, - this.defaultScriptResolver.getSearchPath()); + this.scriptResolver.getSearchPath()); } createAllServlets(refs); @@ -890,17 +873,9 @@ public class SlingServletResolver implem } } - // close sessions - if (this.scriptResolvers != null ) { - for (final ResourceResolver resolver : this.scriptResolvers.values()) { - resolver.close(); - } - this.scriptResolvers = null; - } - - if (this.defaultScriptResolver != null) { - this.defaultScriptResolver.close(); - this.defaultScriptResolver = null; + if (this.scriptResolver != null) { + this.scriptResolver.close(); + this.scriptResolver = null; } this.context = null; @@ -1039,7 +1014,7 @@ public class SlingServletResolver implem if (path.contains(":")) { path = path.substring(path.indexOf(":") + 1); } - final String[] searchPaths = this.defaultScriptResolver.getSearchPath(); + final String[] searchPaths = this.scriptResolver.getSearchPath(); int index = 0; while (!flushCache && index < searchPaths.length) { if (path.startsWith(searchPaths[index])) { Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultServlet.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultServlet.java?rev=947408&r1=947407&r2=947408&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultServlet.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/defaults/DefaultServlet.java Sun May 23 13:35:46 2010 @@ -36,6 +36,8 @@ import org.apache.sling.api.servlets.Sli */ public class DefaultServlet extends SlingSafeMethodsServlet { + private static final long serialVersionUID = 3806788918045433043L; + @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException { Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java?rev=947408&r1=947407&r2=947408&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/AbstractResourceCollector.java Sun May 23 13:35:46 2010 @@ -51,9 +51,13 @@ public abstract class AbstractResourceCo protected final String[] executionPaths; + protected final String workspaceName; + + public AbstractResourceCollector(final String baseResourceType, final String resourceType, final String resourceSuperType, + final String workspaceName, final String extension, final String[] executionPaths) { this.baseResourceType = baseResourceType; @@ -61,6 +65,7 @@ public abstract class AbstractResourceCo this.resourceSuperType = resourceSuperType; this.extension = extension; this.executionPaths = executionPaths; + this.workspaceName = workspaceName; } public final Collection getServlets(ResourceResolver resolver) { @@ -126,6 +131,9 @@ public abstract class AbstractResourceCo */ protected final Resource getResource(final ResourceResolver resolver, String path) { + if ( this.workspaceName != null ) { + path = workspaceName + ':' + path; + } Resource res = resolver.getResource(path); if (res == null) { @@ -151,7 +159,8 @@ public abstract class AbstractResourceCo if ( stringEquals(resourceType, o.resourceType) && stringEquals(resourceSuperType, o.resourceSuperType) && stringEquals(extension, o.extension) - && stringEquals(baseResourceType, o.baseResourceType)) { + && stringEquals(baseResourceType, o.baseResourceType) + && stringEquals(workspaceName, o.workspaceName)) { return true; } return false; Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java?rev=947408&r1=947407&r2=947408&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/NamedScriptResourceCollector.java Sun May 23 13:35:46 2010 @@ -74,7 +74,7 @@ public class NamedScriptResourceCollecto final String scriptName, final String extension, final String[] executionPaths) { - super(baseResourceType, resourceType, resourceSuperType, extension, executionPaths); + super(baseResourceType, resourceType, resourceSuperType, null, extension, executionPaths); this.scriptName = scriptName; // create the hash code once final String key = baseResourceType + ':' + this.scriptName + ':' + Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java?rev=947408&r1=947407&r2=947408&view=diff ============================================================================== --- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java (original) +++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java Sun May 23 13:35:46 2010 @@ -62,8 +62,6 @@ public class ResourceCollector extends A // request is GET or HEAD and extension is html private final boolean isHtml; - private final String workspaceName; - /** * Creates a ResourceCollector for the given * request. If the request is a GET or HEAD request, a @@ -105,6 +103,7 @@ public class ResourceCollector extends A super((baseResourceType != null ? baseResourceType : ServletResolverConstants.DEFAULT_SERVLET_NAME), resource.getResourceType(), resource.getResourceSuperType(), + workspaceName, null, executionPaths); this.methodName = methodName; @@ -113,7 +112,6 @@ public class ResourceCollector extends A this.isGet = false; this.isHtml = false; - this.workspaceName = workspaceName; // create the hash code once final String key = methodName + ':' + baseResourceType + ':' + extension + "::" + (this.resourceType == null ? "" : this.resourceType)+ ':' + (this.resourceSuperType == null ? "" : this.resourceSuperType) + @@ -140,6 +138,7 @@ public class ResourceCollector extends A super(ServletResolverConstants.DEFAULT_SERVLET_NAME, request.getResource().getResourceType(), request.getResource().getResourceSuperType(), + workspaceName, request.getRequestPathInfo().getExtension(), executionPaths); this.methodName = request.getMethod(); @@ -152,7 +151,6 @@ public class ResourceCollector extends A isGet = "GET".equals(methodName) || "HEAD".equals(methodName); isHtml = isGet && "html".equals(extension); - this.workspaceName = workspaceName; // create the hash code once final String key = methodName + ':' + baseResourceType + ':' + extension + ':' + requestpaInfo.getSelectorString() + ':' + (this.resourceType == null ? "" : this.resourceType)+ ':' + (this.resourceSuperType == null ? "" : this.resourceSuperType) + @@ -161,9 +159,9 @@ public class ResourceCollector extends A } protected void getWeightedResources(final Set resources, - Resource location) { + final Resource location) { - ResourceResolver resolver = location.getResourceResolver(); + final ResourceResolver resolver = location.getResourceResolver(); Resource current = location; String parentName = ResourceUtil.getName(current); @@ -252,9 +250,9 @@ public class ResourceCollector extends A String path = location.getPath() + ServletResourceProviderFactory.SERVLET_PATH_EXTENSION; if ( this.isPathAllowed(path) ) { - location = location.getResourceResolver().getResource(path); - if (location != null) { - addWeightedResource(resources, location, 0, + current = location.getResourceResolver().getResource(path); + if (current != null) { + addWeightedResource(resources, current, 0, WeightedResource.WEIGHT_LAST_RESSORT); } } @@ -273,8 +271,7 @@ public class ResourceCollector extends A if ( isGet == o.isGet && isHtml == o.isHtml && numRequestSelectors == o.numRequestSelectors - && stringEquals(methodName, o.methodName) - && stringEquals(workspaceName, o.workspaceName)) { + && stringEquals(methodName, o.methodName)) { // now compare selectors for(int i=0;i