You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2013/03/28 17:22:04 UTC
svn commit: r1462201 - in /jackrabbit/branches/2.4: ./
jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
Author: reschke
Date: Thu Mar 28 16:22:04 2013
New Revision: 1462201
URL: http://svn.apache.org/r1462201
Log:
JCR-3554: RepositoryService.getReferences needs to deal with absolute paths in hrefs (ported to 2.4)
Modified:
jackrabbit/branches/2.4/ (props changed)
jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
Propchange: jackrabbit/branches/2.4/
------------------------------------------------------------------------------
Merged /jackrabbit/trunk:r1462153
Modified: jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=1462201&r1=1462200&r2=1462201&view=diff
==============================================================================
--- jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Thu Mar 28 16:22:04 2013
@@ -22,6 +22,7 @@ import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
+import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -361,6 +362,20 @@ public class RepositoryServiceImpl imple
}
}
+ /**
+ * Resolve the given URI against a base URI (usually the request URI of an HTTP request)
+ */
+ private static String resolve(String baseUri, String relUri) throws RepositoryException {
+ try {
+ java.net.URI base = new java.net.URI(baseUri);
+ java.net.URI rel = new java.net.URI(relUri);
+ return base.resolve(rel).toString();
+ }
+ catch (URISyntaxException ex) {
+ throw new RepositoryException(ex);
+ }
+ }
+
private static void checkSubscription(Subscription subscription) throws RepositoryException {
if (!(subscription instanceof EventSubscriptionImpl)) {
throw new RepositoryException("Unknown Subscription implementation.");
@@ -434,11 +449,15 @@ public class RepositoryServiceImpl imple
}
private static boolean isSameResource(String requestURI, MultiStatusResponse response) {
- String href = response.getHref();
- if (href.endsWith("/") && !requestURI.endsWith("/")) {
- href = href.substring(0, href.length() - 1);
+ try {
+ String href = resolve(requestURI, response.getHref());
+ if (href.endsWith("/") && !requestURI.endsWith("/")) {
+ href = href.substring(0, href.length() - 1);
+ }
+ return requestURI.equals(href);
+ } catch (RepositoryException e) {
+ return false;
}
- return requestURI.equals(href);
}
private String saveGetIdString(ItemId id, SessionInfo sessionInfo) {
@@ -554,7 +573,7 @@ public class RepositoryServiceImpl imple
return parentUri + Text.escape(resolver.getJCRName(childName));
}
- private NodeId getParentId(DavPropertySet propSet, SessionInfo sessionInfo)
+ private NodeId getParentId(String baseUri, DavPropertySet propSet, SessionInfo sessionInfo)
throws RepositoryException {
NodeId parentId = null;
DavProperty<?> p = propSet.get(JcrRemotingConstants.JCR_PARENT_LN, ItemResourceConstants.NAMESPACE);
@@ -562,7 +581,7 @@ public class RepositoryServiceImpl imple
HrefProperty parentProp = new HrefProperty(p);
String parentHref = parentProp.getHrefs().get(0);
if (parentHref != null && parentHref.length() > 0) {
- parentId = uriResolver.getNodeId(parentHref, sessionInfo);
+ parentId = uriResolver.getNodeId(resolve(baseUri, parentHref), sessionInfo);
}
}
return parentId;
@@ -1016,9 +1035,9 @@ public class RepositoryServiceImpl imple
}
NamePathResolver resolver = getNamePathResolver(sessionInfo);
- NodeId parentId = getParentId(propSet, sessionInfo);
+ NodeId parentId = getParentId(uri, propSet, sessionInfo);
- NodeInfoImpl nInfo = buildNodeInfo(nodeResponse, parentId, propSet, sessionInfo, resolver);
+ NodeInfoImpl nInfo = buildNodeInfo(uri, nodeResponse, parentId, propSet, sessionInfo, resolver);
for (MultiStatusResponse resp : childResponses) {
DavPropertySet childProps = resp.getProperties(DavServletResponse.SC_OK);
@@ -1068,11 +1087,11 @@ public class RepositoryServiceImpl imple
}
}
- private NodeInfoImpl buildNodeInfo(MultiStatusResponse nodeResponse,
+ private NodeInfoImpl buildNodeInfo(String baseUri, MultiStatusResponse nodeResponse,
NodeId parentId, DavPropertySet propSet,
SessionInfo sessionInfo,
NamePathResolver resolver) throws NameException, RepositoryException {
- NodeId id = uriResolver.buildNodeId(parentId, nodeResponse, sessionInfo.getWorkspaceName(), getNamePathResolver(sessionInfo));
+ NodeId id = uriResolver.buildNodeId(parentId, baseUri, nodeResponse, sessionInfo.getWorkspaceName(), getNamePathResolver(sessionInfo));
NodeInfoImpl nInfo = new NodeInfoImpl(id, propSet, resolver);
DavProperty p = propSet.get(JcrRemotingConstants.JCR_REFERENCES_LN, ItemResourceConstants.NAMESPACE);
if (p != null) {
@@ -1185,12 +1204,9 @@ public class RepositoryServiceImpl imple
public Iterator<PropertyId> getReferences(SessionInfo sessionInfo, NodeId nodeId, Name propertyName, boolean weakReferences) throws ItemNotFoundException, RepositoryException {
// set of properties to be retrieved
DavPropertyNameSet nameSet = new DavPropertyNameSet();
- if (weakReferences) {
- nameSet.add(JcrRemotingConstants.JCR_WEAK_REFERENCES_LN, ItemResourceConstants.NAMESPACE);
- } else {
- nameSet.add(JcrRemotingConstants.JCR_REFERENCES_LN, ItemResourceConstants.NAMESPACE);
- }
-
+ String refType = weakReferences ? JcrRemotingConstants.JCR_WEAK_REFERENCES_LN : JcrRemotingConstants.JCR_REFERENCES_LN;
+ nameSet.add(refType, ItemResourceConstants.NAMESPACE);
+
DavMethodBase method = null;
try {
String uri = getItemUri(nodeId, sessionInfo);
@@ -1207,18 +1223,13 @@ public class RepositoryServiceImpl imple
for (MultiStatusResponse resp : responses) {
if (isSameResource(uri, resp)) {
DavPropertySet props = resp.getProperties(DavServletResponse.SC_OK);
- DavProperty<?> p;
- if (weakReferences) {
- p = props.get(JcrRemotingConstants.JCR_WEAK_REFERENCES_LN, ItemResourceConstants.NAMESPACE);
- } else {
- p = props.get(JcrRemotingConstants.JCR_REFERENCES_LN, ItemResourceConstants.NAMESPACE);
- }
+ DavProperty<?> p = props.get(refType, ItemResourceConstants.NAMESPACE);
if (p != null) {
refIds = new ArrayList<PropertyId>();
HrefProperty hp = new HrefProperty(p);
for (String propHref : hp.getHrefs()) {
- PropertyId propId = uriResolver.getPropertyId(propHref, sessionInfo);
+ PropertyId propId = uriResolver.getPropertyId(resolve(uri, propHref), sessionInfo);
if (propertyName == null || propertyName.equals(propId.getName())) {
refIds.add(propId);
}
@@ -1511,7 +1522,7 @@ public class RepositoryServiceImpl imple
if (ps.contains(DavPropertyName.LOCKDISCOVERY)) {
DavProperty<?> p = ps.get(DavPropertyName.LOCKDISCOVERY);
LockDiscovery ld = LockDiscovery.createFromXml(p.toXml(DomUtil.createDocument()));
- NodeId parentId = getParentId(ps, sessionInfo);
+ NodeId parentId = getParentId(uri, ps, sessionInfo);
return retrieveLockInfo(ld, sessionInfo, nodeId, parentId);
} else {
// no lock present
Modified: jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?rev=1462201&r1=1462200&r2=1462201&view=diff
==============================================================================
--- jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original)
+++ jackrabbit/branches/2.4/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Thu Mar 28 16:22:04 2013
@@ -137,8 +137,6 @@ class URIResolverImpl implements URIReso
throw new RepositoryException(e.getMessage());
} catch (DavException e) {
throw ExceptionConverter.generate(e);
- } catch (URISyntaxException e) {
- throw new RepositoryException(e.getMessage());
} finally {
if (rm != null) {
rm.releaseConnection();
@@ -168,16 +166,21 @@ class URIResolverImpl implements URIReso
/**
* Resolve the given href obtained from multistatus against base URI
*/
- private static String resolve(String wspUri, String href) throws URISyntaxException {
- java.net.URI base = new java.net.URI(wspUri);
- java.net.URI rel = new java.net.URI(href);
- return base.resolve(rel).toASCIIString();
+ private static String resolve(String wspUri, String href) throws RepositoryException {
+ try {
+ java.net.URI base = new java.net.URI(wspUri);
+ java.net.URI rel = new java.net.URI(href);
+ return base.resolve(rel).toString();
+ }
+ catch (URISyntaxException ex) {
+ throw new RepositoryException(ex);
+ }
}
- NodeId buildNodeId(NodeId parentId, MultiStatusResponse response,
+ protected NodeId buildNodeId(NodeId parentId, String baseUri, MultiStatusResponse response,
String workspaceName, NamePathResolver resolver) throws RepositoryException {
IdURICache cache = getCache(workspaceName);
-
+
NodeId nodeId;
DavPropertySet propSet = response.getProperties(DavServletResponse.SC_OK);
@@ -194,7 +197,7 @@ class URIResolverImpl implements URIReso
}
}
// cache
- cache.add(response.getHref(), nodeId);
+ cache.add(resolve(baseUri, response.getHref()), nodeId);
return nodeId;
}
@@ -246,6 +249,7 @@ class URIResolverImpl implements URIReso
}
private NodeId getNodeId(String uri, SessionInfo sessionInfo, boolean nodeIsGone) throws RepositoryException {
+
IdURICache cache = getCache(sessionInfo.getWorkspaceName());
if (cache.containsUri(uri)) {
// id has been accessed before and is cached
@@ -281,7 +285,7 @@ class URIResolverImpl implements URIReso
if (responses.length != 1) {
throw new ItemNotFoundException("Unable to retrieve the node with id " + uri);
}
- return buildNodeId(parentId, responses[0], sessionInfo.getWorkspaceName(), service.getNamePathResolver(sessionInfo));
+ return buildNodeId(parentId, uri, responses[0], sessionInfo.getWorkspaceName(), service.getNamePathResolver(sessionInfo));
} catch (IOException e) {
throw new RepositoryException(e);