You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ju...@apache.org on 2010/06/04 21:51:47 UTC
svn commit: r951545 - in /sling/trunk/bundles/jcr/resource/src:
main/java/org/apache/sling/jcr/resource/internal/
main/java/org/apache/sling/jcr/resource/internal/helper/jcr/
test/java/org/apache/sling/jcr/resource/internal/
Author: justin
Date: Fri Jun 4 19:51:47 2010
New Revision: 951545
URL: http://svn.apache.org/viewvc?rev=951545&view=rev
Log:
SLING-1546 - disabling multi workspace stuff by default more thoroughly
Modified:
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/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceResolverTest.java
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=951545&r1=951544&r2=951545&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 Jun 4 19:51:47 2010
@@ -107,14 +107,18 @@ public class JcrResourceResolver
/** a resolver with the workspace which was specifically requested via a request attribute. */
private ResourceResolver requestBoundResolver;
+ private final boolean useMultiWorkspaces;
+
public JcrResourceResolver(final JcrResourceProviderEntry rootProvider,
final JcrResourceResolverFactoryImpl factory,
final boolean isAdmin,
- final Map<String, Object> originalAuthInfo) {
+ final Map<String, Object> originalAuthInfo,
+ boolean useMultiWorkspaces) {
this.rootProvider = rootProvider;
this.factory = factory;
this.isAdmin = isAdmin;
this.originalAuthInfo = originalAuthInfo;
+ this.useMultiWorkspaces = useMultiWorkspaces;
}
/**
@@ -175,33 +179,36 @@ public class JcrResourceResolver
// check for special namespace prefix treatment
absPath = unmangleNamespaces(absPath);
- // 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);
- requestBoundResolver = wsResolver;
- return wsResolver.resolve(request, absPath);
- } catch (LoginException e) {
- // requested a resource in a workspace I don't have access to.
- // we treat this as a not found resource
- LOGGER.debug(
- "resolve: Path {} does not resolve, returning NonExistingResource",
- absPath);
+ String workspaceName = null;
+ if (useMultiWorkspaces) {
+ // check for workspace info
+ 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);
+ requestBoundResolver = wsResolver;
+ return wsResolver.resolve(request, absPath);
+ } catch (LoginException e) {
+ // requested a resource in a workspace I don't have access to.
+ // we treat this as a not found resource
+ LOGGER.debug(
+ "resolve: Path {} does not resolve, returning NonExistingResource",
+ absPath);
- final Resource res = new NonExistingResource(this, absPath);
- // SLING-864: if the path contains a dot we assume this to be
- // the start for any selectors, extension, suffix, which may be
- // used for further request processing.
- int index = absPath.indexOf('.');
- if (index != -1) {
- res.getResourceMetadata().setResolutionPathInfo(absPath.substring(index));
+ final Resource res = new NonExistingResource(this, absPath);
+ // SLING-864: if the path contains a dot we assume this to be
+ // the start for any selectors, extension, suffix, which may be
+ // used for further request processing.
+ int index = absPath.indexOf('.');
+ if (index != -1) {
+ res.getResourceMetadata().setResolutionPathInfo(absPath.substring(index));
+ }
+ return this.factory.getResourceDecoratorTracker().decorate(res, workspaceName, request);
}
- return this.factory.getResourceDecoratorTracker().decorate(res, workspaceName, request);
- }
+ }
}
// Assume http://localhost:80 if request is null
String[] realPathList = { absPath };
@@ -528,19 +535,21 @@ public class JcrResourceResolver
public Resource getResource(String path) {
checkClosed();
- final int wsSepPos = path.indexOf(":/");
- if (wsSepPos != -1) {
- final String workspaceName = path.substring(0, wsSepPos);
- if (workspaceName.equals(getSession().getWorkspace().getName())) {
- path = path.substring(wsSepPos + 1);
- } else {
- try {
- ResourceResolver wsResolver = getResolverForWorkspace(workspaceName);
- return wsResolver.getResource(path.substring(wsSepPos + 1));
- } catch (LoginException e) {
- // requested a resource in a workspace I don't have access to.
- // we treat this as a not found resource
- return null;
+ if (useMultiWorkspaces) {
+ final int wsSepPos = path.indexOf(":/");
+ if (wsSepPos != -1) {
+ final String workspaceName = path.substring(0, wsSepPos);
+ if (workspaceName.equals(getSession().getWorkspace().getName())) {
+ path = path.substring(wsSepPos + 1);
+ } else {
+ try {
+ ResourceResolver wsResolver = getResolverForWorkspace(workspaceName);
+ return wsResolver.getResource(path.substring(wsSepPos + 1));
+ } catch (LoginException e) {
+ // requested a resource in a workspace I don't have access to.
+ // we treat this as a not found resource
+ return null;
+ }
}
}
}
@@ -601,17 +610,23 @@ public class JcrResourceResolver
if (wsSepPos != -1) {
final String workspaceName = path.substring(0, wsSepPos);
if (!workspaceName.equals(getSession().getWorkspace().getName())) {
- try {
- ResourceResolver wsResolver = getResolverForWorkspace(workspaceName);
- return wsResolver.listChildren(parent);
- } catch (LoginException e) {
- // requested a resource in a workspace I don't have access to.
- // we treat this as a not found resource
+ if (useMultiWorkspaces) {
+ try {
+ ResourceResolver wsResolver = getResolverForWorkspace(workspaceName);
+ return wsResolver.listChildren(parent);
+ } catch (LoginException e) {
+ // requested a resource in a workspace I don't have access to.
+ // we treat this as a not found resource
+ return Collections.EMPTY_LIST.iterator();
+ }
+ } else {
+ // this is illegal
return Collections.EMPTY_LIST.iterator();
}
}
}
+
String workspacePrefix = null;
if ( !getSession().getWorkspace().getName().equals(this.factory.getDefaultWorkspaceName()) ) {
workspacePrefix = getSession().getWorkspace().getName();
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=951545&r1=951544&r2=951545&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 Jun 4 19:51:47 2010
@@ -208,6 +208,8 @@ public class JcrResourceResolverFactoryI
// whether to mangle paths with namespaces or not
private boolean mangleNamespacePrefixes;
+ private boolean useMultiWorkspaces;
+
/** The resource listeners for the observation events. */
private Set<JcrResourceListener> resourceListeners;
@@ -390,8 +392,8 @@ public class JcrResourceResolverFactoryI
this.resourceListeners.add(new JcrResourceListener(null, this, "/", "/", this.eventAdminTracker));
// check if multi workspace support is enabled
- final boolean useMultiWorkspaces = OsgiUtil.toBoolean(properties.get(PROP_MULTIWORKSPACE), DEFAULT_MULTIWORKSPACE);
- if (useMultiWorkspaces) {
+ this.useMultiWorkspaces = OsgiUtil.toBoolean(properties.get(PROP_MULTIWORKSPACE), DEFAULT_MULTIWORKSPACE);
+ if (this.useMultiWorkspaces) {
final String[] listenerWorkspaces = getAllWorkspaces();
for (final String wspName : listenerWorkspaces) {
if (!wspName.equals(this.repository.getDefaultWorkspace())) {
@@ -489,10 +491,9 @@ public class JcrResourceResolverFactoryI
final boolean isAdmin,
final Map<String, Object> authenticationInfo) {
final JcrResourceProviderEntry sessionRoot = new JcrResourceProviderEntry(
- session, rootProviderEntry,
- this.getDynamicClassLoader());
+ session, rootProviderEntry, this.getDynamicClassLoader(), useMultiWorkspaces);
- return new JcrResourceResolver(sessionRoot, this, isAdmin, authenticationInfo);
+ return new JcrResourceResolver(sessionRoot, this, isAdmin, authenticationInfo, useMultiWorkspaces);
}
/**
Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java?rev=951545&r1=951544&r2=951545&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProvider.java Fri Jun 4 19:51:47 2010
@@ -48,11 +48,14 @@ public class JcrResourceProvider impleme
private final Session session;
private final ClassLoader dynamicClassLoader;
+ private final boolean useMultiWorkspaces;
public JcrResourceProvider(final Session session,
- final ClassLoader dynamicClassLoader) {
+ final ClassLoader dynamicClassLoader,
+ boolean useMultiWorkspaces) {
this.session = session;
this.dynamicClassLoader = dynamicClassLoader;
+ this.useMultiWorkspaces = useMultiWorkspaces;
}
// ---------- ResourceProvider interface ----------------------------------
@@ -128,18 +131,19 @@ public class JcrResourceProvider impleme
*/
private JcrItemResource createResource(ResourceResolver resourceResolver,
String path) throws RepositoryException {
- final int wsSepPos = path.indexOf(":/");
- if (wsSepPos != -1) {
- final String workspaceName = path.substring(0, wsSepPos);
- final String expectedWorkspaceName = getSession().getWorkspace().getName();
- if (workspaceName.equals(expectedWorkspaceName)) {
- path = path.substring(wsSepPos + 1);
- } else {
- throw new RepositoryException("Unexpected workspace name. Expected " +
- expectedWorkspaceName + ". Actual " + workspaceName);
+ if (useMultiWorkspaces) {
+ final int wsSepPos = path.indexOf(":/");
+ if (wsSepPos != -1) {
+ final String workspaceName = path.substring(0, wsSepPos);
+ final String expectedWorkspaceName = getSession().getWorkspace().getName();
+ if (workspaceName.equals(expectedWorkspaceName)) {
+ path = path.substring(wsSepPos + 1);
+ } else {
+ throw new RepositoryException("Unexpected workspace name. Expected " +
+ expectedWorkspaceName + ". Actual " + workspaceName);
+ }
+ }
}
- }
-
if (itemExists(path)) {
Item item = getSession().getItem(path);
Modified: sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java?rev=951545&r1=951544&r2=951545&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java (original)
+++ sling/trunk/bundles/jcr/resource/src/main/java/org/apache/sling/jcr/resource/internal/helper/jcr/JcrResourceProviderEntry.java Fri Jun 4 19:51:47 2010
@@ -40,9 +40,10 @@ public class JcrResourceProviderEntry ex
public JcrResourceProviderEntry(Session session,
ResourceProviderEntry delegatee,
- final ClassLoader dynamicClassLoader) {
+ final ClassLoader dynamicClassLoader,
+ boolean useMultiWorkspaces) {
super("/", new ResourceProvider[] { new JcrResourceProvider(session,
- dynamicClassLoader) });
+ dynamicClassLoader, useMultiWorkspaces) });
this.delegatee = delegatee;
this.session = session;
Modified: sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java?rev=951545&r1=951544&r2=951545&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java (original)
+++ sling/trunk/bundles/jcr/resource/src/test/java/org/apache/sling/jcr/resource/internal/JcrResourceListenerTest.java Fri Jun 4 19:51:47 2010
@@ -126,6 +126,7 @@ public class JcrResourceListenerTest ext
JcrResourceResolverFactoryImpl factory = new JcrResourceResolverFactoryImpl();
PrivateAccessor.setField(factory, "repository", getRepository());
+ PrivateAccessor.setField(factory, "useMultiWorkspaces", Boolean.TRUE);
final EventAdmin mockEA = new EventAdmin() {
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=951545&r1=951544&r2=951545&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 Jun 4 19:51:47 2010
@@ -36,6 +36,8 @@ import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
+import junitx.util.PrivateAccessor;
+
import org.apache.sling.api.SlingConstants;
import org.apache.sling.api.resource.NonExistingResource;
import org.apache.sling.api.resource.Resource;
@@ -63,6 +65,8 @@ public class JcrResourceResolverTest ext
private ResourceResolver resResolver;
+ private ResourceResolver mwResResolver;
+
private MapEntries mapEntries;
private Session ws2Session;
@@ -137,6 +141,9 @@ public class JcrResourceResolverTest ext
resResolver = resFac.getResourceResolver(session);
+ PrivateAccessor.setField(resFac, "useMultiWorkspaces", Boolean.TRUE);
+ mwResResolver = resFac.getResourceResolver(session);
+
try {
getSession().getWorkspace().createWorkspace("ws2");
} catch (Exception e) {
@@ -254,7 +261,12 @@ public class JcrResourceResolverTest ext
public void testGetResourceFromWs2ViaDefaultResolver() throws Exception {
// existing resource
- Resource res = resResolver.getResource("ws2:" + rootPath);
+ String ws2Path = "ws2:" + rootPath;
+ Resource res = resResolver.getResource(ws2Path);
+ assertNull(res);
+
+ res = mwResResolver.getResource(ws2Path);
+
assertNotNull(res);
assertEquals("ws2:" + rootPath, res.getPath());
assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
@@ -311,27 +323,52 @@ public class JcrResourceResolverTest ext
}
public void testResolveResourceWithWS2() throws Exception {
+ // before resolution, all resolvers adapt to sessions in the
+ // default workspace
+ assertEquals("default", resResolver.adaptTo(Session.class).getWorkspace().getName());
+ assertEquals("default", mwResResolver.adaptTo(Session.class).getWorkspace().getName());
+
// 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());
+
+ // because multi-workspace is disabled, this should return the resource from the
+ // default workspace
+ assertEquals(rootPath, res.getPath());
+ assertEquals("default", res.adaptTo(Node.class).getSession().getWorkspace().getName());
+
+ // and the request-bound session still isn't set
+ assertEquals("default", resResolver.adaptTo(Session.class).getWorkspace().getName());
+
+ // now for the multi-workspace enabled resolver
+ Resource ws2Res = mwResResolver.resolve(request, rootPath);
+
+ // now the request-bound session is set
+ assertEquals("ws2", mwResResolver.adaptTo(Session.class).getWorkspace().getName());
+
+ assertEquals("ws2:" + rootPath, ws2Res.getPath());
assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
- res.getResourceType());
+ ws2Res.getResourceType());
- assertNotNull(res.adaptTo(Node.class));
- assertTrue(rootWs2Node.isSame(res.adaptTo(Node.class)));
+ assertNotNull(ws2Res.adaptTo(Node.class));
+ assertTrue(rootWs2Node.isSame(ws2Res.adaptTo(Node.class)));
+
+ // shouldn't be able to resolve non-default workspace
+ // children from a non-multiworkspace resolver
+ Iterator<Resource> children = resResolver.listChildren(ws2Res);
+ assertFalse(children.hasNext());
- // should be able to list children
- Iterator<Resource> children = resResolver.listChildren(res);
+ // should also be able to list children from the mw
+ children = mwResResolver.listChildren(ws2Res);
assertTrue(children.hasNext());
Resource child = children.next();
assertNotNull(child);
assertEquals("ws2:" + rootPath + "/child1", child.getPath());
// should be able to list children of a child
- Iterator<Resource> children2 = resResolver.listChildren(child);
+ Iterator<Resource>children2 = mwResResolver.listChildren(child);
assertTrue(children2.hasNext());
Resource child2 = children2.next();
assertNotNull(child2);
@@ -340,7 +377,7 @@ public class JcrResourceResolverTest ext
// should also be able to list children of a synthetic resource
SyntheticResource synth = new SyntheticResource(null, "ws2:" +
rootPath+"/child1", "res/synth");
- children2 = resResolver.listChildren(synth);
+ children2 = mwResResolver.listChildren(synth);
assertTrue(children2.hasNext());
child2 = children2.next();
assertNotNull(child2);
@@ -350,7 +387,7 @@ public class JcrResourceResolverTest ext
String path = rootPath + "/missing";
request = new ResourceResolverTestRequest(path);
request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
- res = resResolver.resolve(request, path);
+ res = mwResResolver.resolve(request, path);
assertNotNull(res);
assertEquals("ws2:" + path, res.getPath());
assertEquals(Resource.RESOURCE_TYPE_NON_EXISTING, res.getResourceType());
@@ -361,7 +398,7 @@ public class JcrResourceResolverTest ext
path = rootPath + ".print.a4.html";
request = new ResourceResolverTestRequest(path);
request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
- res = resResolver.resolve(request, path);
+ res = mwResResolver.resolve(request, path);
assertNotNull(res);
assertEquals("ws2:" + rootPath, res.getPath());
assertEquals(rootWs2Node.getPrimaryNodeType().getName(),
@@ -374,7 +411,7 @@ public class JcrResourceResolverTest ext
path = rootPath + System.currentTimeMillis();
request = new ResourceResolverTestRequest(path);
request.setAttribute(ResourceResolver.REQUEST_ATTR_WORKSPACE_INFO, "ws2");
- res = resResolver.resolve(request, path);
+ res = mwResResolver.resolve(request, path);
assertNotNull(res);
assertTrue(ResourceUtil.isNonExistingResource(res));
assertEquals("ws2:" + path, res.getPath());