You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by Justin Edelson <ju...@gmail.com> on 2010/05/21 16:20:54 UTC

Re: svn commit: r946896 - in /sling/trunk/bundles: api/src/main/java/org/apache/sling/api/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/ jcr/resource/src/test/java/org/...

Carsten-
Are you also planning on modifying commons.auth?

This isn't quite working the way I expected, but if you're mid-commit, I
can wait.

I did find one serious bug with the existing multi-workspace support
which I'm reporting now.

Justin


On 5/21/10 2:29 AM, cziegeler@apache.org wrote:
> Author: cziegeler
> Date: Fri May 21 06:29:10 2010
> New Revision: 946896
> 
> URL: http://svn.apache.org/viewvc?rev=946896&view=rev
> Log:
> SLING-1447 : support for resource paths containing workspace name
> 
> Modified:
>     sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
>     sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceConstants.java
>     sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
>     sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java
>     sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
>     sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java
> 
> Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java (original)
> +++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceResolver.java Fri May 21 06:29:10 2010
> @@ -71,6 +71,13 @@ import org.apache.sling.api.adapter.Adap
>   */
>  public interface ResourceResolver extends Adaptable {
>  
> +    /** A request attribute containing the workspace to use for
> +     * {@link #resolve(HttpServletRequest)} and {@link #resolve(HttpServletRequest, String)}
> +     * if not the default workspace should be used to resolve the resource.
> +     * @since 2.1
> +     */
> +    String REQUEST_ATTR_WORKSPACE_INFO = ResourceResolver.class.getName() + "/use.workspace";
> +
>      /**
>       * Resolves the resource from the given <code>absPath</code> optionally
>       * taking <code>HttpServletRequest</code> into account, such as the value of
> @@ -83,6 +90,9 @@ public interface ResourceResolver extend
>       * the host header or request parameters into account to resolve the
>       * resource.
>       *
> +     * If the {@link #REQUEST_ATTR_WORKSPACE_INFO} attribute is set, the
> +     * given workspace is used to resolve the resource.
> +     *
>       * @param request The http servlet request object providing more hints at
>       *            how to resolve the <code>absPath</code>. This parameter may be
>       *            <code>null</code> in which case the implementation should use
> @@ -137,6 +147,9 @@ public interface ResourceResolver extend
>       * <code>absPath</code> argument is the result of calling the
>       * <code>getPathInfo()</code> on the <code>request</code> object.
>       *
> +     * If the {@link #REQUEST_ATTR_WORKSPACE_INFO} attribute is set, the
> +     * given workspace is used to resolve the resource.
> +     *
>       * @param request The http servlet request object used to resolve the
>       *            resource for. This must not be <code>null</code>.
>       * @return The {@link Resource} addressed by
> 
> Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceConstants.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceConstants.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceConstants.java (original)
> +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/JcrResourceConstants.java Fri May 21 06:29:10 2010
> @@ -52,11 +52,4 @@ public class JcrResourceConstants {
>       * the primary node type is used as the resource super type.
>       */
>      public static final String SLING_RESOURCE_SUPER_TYPE_PROPERTY = "sling:resourceSuperType";
> -
> -    /**
> -     * The name of the authentication info property containing the workspace name.
> -     *
> -     * @since 2.0.8
> -     */
> -    public static final String AUTH_INFO_WORKSPACE = "user.jcr.workspace";
>  }
> 
> Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java (original)
> +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceListener.java Fri May 21 06:29:10 2010
> @@ -38,7 +38,6 @@ import org.apache.sling.api.resource.Res
>  import org.apache.sling.api.resource.ResourceResolver;
>  import org.apache.sling.api.resource.ResourceResolverFactory;
>  import org.apache.sling.api.resource.ResourceUtil;
> -import org.apache.sling.jcr.resource.JcrResourceConstants;
>  import org.osgi.service.event.EventAdmin;
>  import org.osgi.util.tracker.ServiceTracker;
>  import org.slf4j.Logger;
> @@ -90,7 +89,7 @@ public class JcrResourceListener impleme
>          this.workspaceName = workspaceName;
>          final Map<String,Object> authInfo = new HashMap<String,Object>();
>          if ( workspaceName != null ) {
> -            authInfo.put(JcrResourceConstants.AUTH_INFO_WORKSPACE, workspaceName);
> +            authInfo.put(JcrResourceResolverFactoryImpl.AUTH_INFO_WORKSPACE, workspaceName);
>          }
>          this.resolver = factory.getAdministrativeResourceResolver(authInfo);
>          this.session = resolver.adaptTo(Session.class);
> 
> Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java (original)
> +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolver.java Fri May 21 06:29:10 2010
> @@ -18,6 +18,7 @@
>   */
>  package org.apache.sling.jcr.resource.internal;
>  
> +import java.util.Arrays;
>  import java.util.HashMap;
>  import java.util.Iterator;
>  import java.util.LinkedList;
> @@ -44,7 +45,6 @@ import org.apache.sling.api.resource.Res
>  import org.apache.sling.api.resource.ResourceResolver;
>  import org.apache.sling.api.resource.ResourceUtil;
>  import org.apache.sling.api.resource.ValueMap;
> -import org.apache.sling.jcr.resource.JcrResourceConstants;
>  import org.apache.sling.jcr.resource.JcrResourceUtil;
>  import org.apache.sling.jcr.resource.internal.helper.MapEntry;
>  import org.apache.sling.jcr.resource.internal.helper.RedirectResource;
> @@ -161,6 +161,20 @@ public class JcrResourceResolver
>      public Resource resolve(HttpServletRequest request, String absPath) {
>          checkClosed();
>  
> +        // check for workspace info
> +        final String workspaceName = (request == null ? null :
> +            (String)request.getAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO));
> +        if ( workspaceName != null && !workspaceName.equals(getSession().getWorkspace().getName())) {
> +            LOGGER.debug("Delegating resolving to resolver for workspace {}", workspaceName);
> +            try {
> +                final ResourceResolver wsResolver = getResolverForWorkspace(workspaceName);
> +                return wsResolver.resolve(request, absPath);
> +            } catch (LoginException e) {
> +                // requested a resource in a workspace I don't have access to.
> +                // TODO
> +            }
> +
> +        }
>          // make sure abspath is not null and is absolute
>          if (absPath == null) {
>              absPath = "/";
> @@ -193,10 +207,11 @@ public class JcrResourceResolver
>              for (MapEntry mapEntry : this.factory.getMapEntries().getResolveMaps()) {
>                  mappedPath = mapEntry.replace(requestPath);
>                  if (mappedPath != null) {
> -                    LOGGER.debug(
> -                        "resolve: MapEntry {} matches, mapped path is {}",
> -                        mapEntry, mappedPath);
> -
> +                    if ( LOGGER.isDebugEnabled() ) {
> +                        LOGGER.debug(
> +                            "resolve: MapEntry {} matches, mapped path is {}",
> +                            mapEntry, Arrays.toString(mappedPath));
> +                    }
>                      if (mapEntry.isInternal()) {
>                          // internal redirect
>                          LOGGER.debug("resolve: Redirecting internally");
> @@ -207,7 +222,7 @@ public class JcrResourceResolver
>                      LOGGER.debug("resolve: Returning external redirect");
>                      return this.factory.getResourceDecoratorTracker().decorate(
>                              new RedirectResource(this, absPath, mappedPath[0],
> -                                   mapEntry.getStatus()), null,
> +                                   mapEntry.getStatus()), workspaceName,
>                               request);
>                  }
>              }
> @@ -255,7 +270,6 @@ public class JcrResourceResolver
>  
>              // first check whether the requested resource is a StarResource
>              if (StarResource.appliesTo(realPath)) {
> -
>                  LOGGER.debug("resolve: Mapped path {} is a Star Resource",
>                      realPath);
>                  res = new StarResource(this, ensureAbsPath(realPath));
> @@ -285,7 +299,7 @@ public class JcrResourceResolver
>  
>          // if no resource has been found, use a NonExistingResource
>          if (res == null) {
> -            final String resourcePath = ensureAbsPath(realPathList[0]);
> +            String resourcePath = ensureAbsPath(realPathList[0]);
>              LOGGER.debug(
>                  "resolve: Path {} does not resolve, returning NonExistingResource at {}",
>                     absPath, resourcePath);
> @@ -302,7 +316,7 @@ public class JcrResourceResolver
>              LOGGER.debug("resolve: Path {} resolves to Resource {}", absPath, res);
>          }
>  
> -        return this.factory.getResourceDecoratorTracker().decorate(res, null, request);
> +        return this.factory.getResourceDecoratorTracker().decorate(res, workspaceName, request);
>      }
>  
>      /**
> @@ -690,7 +704,7 @@ public class JcrResourceResolver
>          if (wsResolver == null) {
>              final Map<String,Object> newAuthInfo =
>                  originalAuthInfo == null ? new HashMap<String, Object>() : new HashMap<String,Object>(originalAuthInfo);
> -            newAuthInfo.put(JcrResourceConstants.AUTH_INFO_WORKSPACE, workspaceName);
> +            newAuthInfo.put(JcrResourceResolverFactoryImpl.AUTH_INFO_WORKSPACE, workspaceName);
>              if (isAdmin) {
>                  wsResolver = factory.getAdministrativeResourceResolver(newAuthInfo);
>              } else {
> 
> Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java (original)
> +++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverFactoryImpl.java Fri May 21 06:29:10 2010
> @@ -42,7 +42,6 @@ import org.apache.sling.api.resource.Res
>  import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
>  import org.apache.sling.commons.osgi.OsgiUtil;
>  import org.apache.sling.jcr.api.SlingRepository;
> -import org.apache.sling.jcr.resource.JcrResourceConstants;
>  import org.apache.sling.jcr.resource.JcrResourceResolverFactory;
>  import org.apache.sling.jcr.resource.internal.helper.MapEntries;
>  import org.apache.sling.jcr.resource.internal.helper.Mapping;
> @@ -86,6 +85,14 @@ import org.slf4j.LoggerFactory;
>  public class JcrResourceResolverFactoryImpl implements
>          JcrResourceResolverFactory, ResourceResolverFactory {
>  
> +
> +    /**
> +     * The name of the authentication info property containing the workspace name.
> +     * This is only used internally and should never be used from anyone outside
> +     * this bundle as we might change this mechanism.
> +     */
> +    static final String AUTH_INFO_WORKSPACE = "internal.user.jcr.workspace";
> +
>      public final static class ResourcePattern {
>          public final Pattern pattern;
>  
> @@ -548,7 +555,7 @@ public class JcrResourceResolverFactoryI
>       */
>      private String getWorkspace(final Map<String, Object> authenticationInfo) {
>          if ( authenticationInfo != null ) {
> -            return (String) authenticationInfo.get(JcrResourceConstants.AUTH_INFO_WORKSPACE);
> +            return (String) authenticationInfo.get(AUTH_INFO_WORKSPACE);
>          }
>          return null;
>      }
> 
> Modified: sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java
> URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java?rev=946896&r1=946895&r2=946896&view=diff
> ==============================================================================
> --- sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java (original)
> +++ sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java Fri May 21 06:29:10 2010
> @@ -21,8 +21,8 @@ package org.apache.sling.jcr.resource.in
>  import java.io.BufferedReader;
>  import java.lang.reflect.Field;
>  import java.security.Principal;
> -import java.util.Collections;
>  import java.util.Enumeration;
> +import java.util.HashMap;
>  import java.util.Locale;
>  import java.util.Map;
>  
> @@ -65,8 +65,6 @@ public class JcrResourceResolverTest ext
>  
>      private Session ws2Session;
>  
> -    private ResourceResolver ws2Resolver;
> -
>      private Node rootWs2Node;
>  
>      protected void setUp() throws Exception {
> @@ -149,10 +147,6 @@ public class JcrResourceResolverTest ext
>  
>          rootWs2Node = ws2Session.getRootNode().addNode(rootPath.substring(1), "nt:unstructured");
>          ws2Session.save();
> -
> -        ws2Resolver = resFac.getAdministrativeResourceResolver(Collections.singletonMap(JcrResourceConstants.AUTH_INFO_WORKSPACE, (Object) "ws2"));
> -
> -
>      }
>  
>      @Override
> @@ -175,8 +169,7 @@ public class JcrResourceResolverTest ext
>  
>          session.save();
>          ws2Session.save();
> -
> -        ws2Resolver.close();
> +        ws2Session.logout();
>  
>          super.tearDown();
>      }
> @@ -255,23 +248,6 @@ public class JcrResourceResolverTest ext
>          assertNull(res);
>      }
>  
> -    public void testGetResourceFromWs2ViaWs2Resolver() throws Exception {
> -        // existing resource
> -        Resource res = ws2Resolver.getResource("ws2:" + rootPath);
> -        assertNotNull(res);
> -        assertEquals("ws2:" + rootPath, res.getPath());
> -        assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
> -            res.getResourceType());
> -
> -        assertNotNull(res.adaptTo(Node.class));
> -        assertTrue(rootWs2Node.isSame(res.adaptTo(Node.class)));
> -
> -        // missing resource
> -        String path = "ws2:" + rootPath + "/missing";
> -        res = resResolver.getResource(path);
> -        assertNull(res);
> -    }
> -
>      public void testGetResourceFromWs2ViaDefaultResolver() throws Exception {
>          // existing resource
>          Resource res = resResolver.getResource("ws2:" + rootPath);
> @@ -330,6 +306,54 @@ public class JcrResourceResolverTest ext
>          assertEquals(Resource.RESOURCE_TYPE_NON_EXISTING, res.getResourceType());
>      }
>  
> +    public void testResolveResourceWithWS2() throws Exception {
> +        // existing resource
> +        HttpServletRequest request = new ResourceResolverTestRequest(rootPath);
> +        request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
> +        Resource res = resResolver.resolve(request, rootPath);
> +        assertNotNull(res);
> +        assertEquals("ws2:" + rootPath, res.getPath());
> +        assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
> +            res.getResourceType());
> +
> +        assertNotNull(res.adaptTo(Node.class));
> +        assertTrue(rootWs2Node.isSame(res.adaptTo(Node.class)));
> +
> +        // missing resource below root should resolve "missing resource"
> +        String path = rootPath + "/missing";
> +        request = new ResourceResolverTestRequest(path);
> +        request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
> +        res = resResolver.resolve(request, path);
> +        assertNotNull(res);
> +        assertEquals("ws2:" + path, res.getPath());
> +        assertEquals(Resource.RESOURCE_TYPE_NON_EXISTING, res.getResourceType());
> +
> +        assertNull(res.adaptTo(Node.class));
> +
> +        // root with selectors/ext should resolve root
> +        path = rootPath + ".print.a4.html";
> +        request = new ResourceResolverTestRequest(path);
> +        request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
> +        res = resResolver.resolve(request, path);
> +        assertNotNull(res);
> +        assertEquals("ws2:" + rootPath, res.getPath());
> +        assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
> +            res.getResourceType());
> +
> +        assertNotNull(res.adaptTo(Node.class));
> +        assertTrue(rootWs2Node.isSame(res.adaptTo(Node.class)));
> +
> +        // missing resource should return NON_EXISTING Resource
> +        path = rootPath + System.currentTimeMillis();
> +        request = new ResourceResolverTestRequest(path);
> +        request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
> +        res = resResolver.resolve(request, path);
> +        assertNotNull(res);
> +        assertTrue(ResourceUtil.isNonExistingResource(res));
> +        assertEquals("ws2:" + path, res.getPath());
> +        assertEquals(Resource.RESOURCE_TYPE_NON_EXISTING, res.getResourceType());
> +    }
> +
>      public void testResolveResourceExternalRedirect() throws Exception {
>          HttpServletRequest request = new ResourceResolverTestRequest("https",
>              null, -1, rootPath);
> @@ -1570,6 +1594,8 @@ public class JcrResourceResolverTest ext
>  
>          private final int port;
>  
> +        private final Map<String, Object> attrs = new HashMap<String, Object>();
> +
>          private String contextPath;
>  
>          ResourceResolverTestRequest(String pathInfo) {
> @@ -1603,7 +1629,7 @@ public class JcrResourceResolverTest ext
>          }
>  
>          public Object getAttribute(String name) {
> -            return null;
> +            return attrs.get(name);
>          }
>  
>          public Enumeration<?> getAttributeNames() {
> @@ -1714,6 +1740,7 @@ public class JcrResourceResolverTest ext
>          }
>  
>          public void setAttribute(String name, Object o) {
> +            attrs.put(name, o);
>          }
>  
>          public void setCharacterEncoding(String env) {
> 
> 


Re: svn commit: r946896 - in /sling/trunk/bundles: api/src/main/java/org/apache/sling/api/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/ jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/ jcr/resource/src/test/java/org/...

Posted by Carsten Ziegeler <cz...@apache.org>.
Justin Edelson  wrote
> Carsten-
> Are you also planning on modifying commons.auth?
> 
> This isn't quite working the way I expected, but if you're mid-commit, I
> can wait.
> 
> I did find one serious bug with the existing multi-workspace support
> which I'm reporting now.
> 
Hi Justin,

yes, I planned to modify commons.auth as well and also the script
resolver. But it seems that I won't have enough time for this in the
next days :(

If you find any problems in the jcr resource module, just le me know; I
think I'm finished with that :)
(Just noticed that you already fixed one thing :) )

Regards
Carsten
-- 
Carsten Ziegeler
cziegeler@apache.org