You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2010/02/23 22:01:48 UTC
svn commit: r915518 - in /jackrabbit/trunk:
jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/
jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/
jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/
Author: angela
Date: Tue Feb 23 21:01:47 2010
New Revision: 915518
URL: http://svn.apache.org/viewvc?rev=915518&view=rev
Log:
JCR-2472: Accessing moved referenceble nodes results in PathNotFoundException
Modified:
jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/MoveTest.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java
Modified: jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/MoveTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/MoveTest.java?rev=915518&r1=915517&r2=915518&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/MoveTest.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr2spi/src/test/java/org/apache/jackrabbit/jcr2spi/MoveTest.java Tue Feb 23 21:01:47 2010
@@ -24,11 +24,16 @@
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.Workspace;
import org.apache.jackrabbit.test.NotExecutableException;
+import org.apache.jackrabbit.commons.JcrUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.ByteArrayInputStream;
+
/**
* <code>MoveTest</code>...
*/
@@ -265,4 +270,43 @@
doMove(moveNode.getPath(), destProperty.getPath());
}
}
+
+
+ public void testMoveFile() throws RepositoryException, NotExecutableException {
+ // create a new file
+ String parentPath;
+ String filePath;
+ try {
+ Node parent = testRootNode.addNode("parent");
+ Node n = JcrUtils.putFile(parent, "file", "text/plain", new ByteArrayInputStream("data".getBytes()));
+ parentPath = parent.getPath();
+ filePath = n.getPath();
+ superuser.save();
+ } catch (RepositoryException e) {
+ throw new NotExecutableException();
+ }
+
+ Session s = getHelper().getSuperuserSession();
+ try {
+ Node n1 = s.getNode(filePath);
+ Node n2 = n1.getNode("jcr:content");
+ n2.setProperty("jcr:data", new java.io.ByteArrayInputStream("data2".getBytes()));
+ n2.save();
+
+ String destPath = parentPath + "1";
+ if (isSessionMove()) {
+ s.move(parentPath, destPath);
+ s.save();
+ } else {
+ s.getWorkspace().move(parentPath, destPath);
+ }
+ Node n3 = s.getNode(destPath + "/file");
+ Node n4 = n3.getNode("jcr:content");
+ n4.refresh(false);
+ // call must succeed (see JCR-2472)
+ Node n5 = n3.getNode("jcr:content");
+ } finally {
+ s.logout();
+ }
+ }
}
\ No newline at end of file
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java?rev=915518&r1=915517&r2=915518&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/IdURICache.java Tue Feb 23 21:01:47 2010
@@ -82,6 +82,11 @@
log.debug("Removed: ItemId = " + itemId + " URI = " + uri);
}
+ public void clear() {
+ idToUriCache.clear();
+ uriToIdCache.clear();
+ }
+
private static String getCleanUri(String uri) {
if (uri.endsWith("/")) {
return uri.substring(0, uri.length() - 1);
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java?rev=915518&r1=915517&r2=915518&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/RepositoryServiceImpl.java Tue Feb 23 21:01:47 2010
@@ -390,6 +390,16 @@
return uriResolver.getItemUri(itemId, sessionInfo.getWorkspaceName(), sessionInfo);
}
+ /**
+ * Clear all URI mappings. This is required after hierarchy operations such
+ * as e.g. MOVE.
+ *
+ * @param sessionInfo
+ */
+ protected void clearItemUriCache(SessionInfo sessionInfo) {
+ uriResolver.clearCacheEntries(sessionInfo);
+ }
+
private String getItemUri(NodeId parentId, Name childName,
SessionInfo sessionInfo) throws RepositoryException {
String parentUri = uriResolver.getItemUri(parentId, sessionInfo.getWorkspaceName(), sessionInfo);
@@ -1272,6 +1282,8 @@
String destUri = getItemUri(destParentNodeId, destName, sessionInfo);
MoveMethod method = new MoveMethod(uri, destUri, true);
execute(method, sessionInfo);
+ // need to clear the cache as the move may have affected nodes with uuid.
+ clearItemUriCache(sessionInfo);
}
/**
@@ -2230,6 +2242,7 @@
private String batchId;
private boolean isConsumed = false;
+ private boolean clear = false;
private BatchImpl(ItemId targetId, SessionInfo sessionInfo) throws RepositoryException {
this.targetId = targetId;
@@ -2281,6 +2294,9 @@
if (sessionInfo instanceof SessionInfoImpl) {
((SessionInfoImpl) sessionInfo).setLastBatchId(batchId);
}
+ if (clear) {
+ clearItemUriCache(sessionInfo);
+ }
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
@@ -2564,6 +2580,7 @@
MoveMethod method = new MoveMethod(uri, destUri, true);
methods.add(method);
+ clear = true;
}
}
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java?rev=915518&r1=915517&r2=915518&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2dav/URIResolverImpl.java Tue Feb 23 21:01:47 2010
@@ -215,6 +215,11 @@
}
}
+ void clearCacheEntries(SessionInfo sessionInfo) {
+ IdURICache cache = getCache(sessionInfo.getWorkspaceName());
+ cache.clear();
+ }
+
private static boolean isSameURI(String uri1, String uri2) {
return getCleanURI(uri1).equals(getCleanURI(uri2));
Modified: jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java?rev=915518&r1=915517&r2=915518&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-spi2dav/src/main/java/org/apache/jackrabbit/spi2davex/RepositoryServiceImpl.java Tue Feb 23 21:01:47 2010
@@ -418,6 +418,9 @@
private PostMethod method; // TODO: use PATCH request instead.
private boolean isConsumed;
+ // flag to determine if the uri-lookup needs to be cleared... e.g.
+ // after a move operation.
+ private boolean clear;
private BatchImpl(ItemId targetId, SessionInfo sessionInfo) {
this.targetId = targetId;
@@ -458,6 +461,9 @@
try {
client.executeMethod(method);
method.checkSuccess();
+ if (clear) {
+ RepositoryServiceImpl.super.clearItemUriCache(sessionInfo);
+ }
} catch (IOException e) {
throw new RepositoryException(e);
} catch (DavException e) {
@@ -625,6 +631,8 @@
String destJcrPath = getNamePathResolver(sessionInfo).getJCRPath(destPath);
appendDiff(SYMBOL_MOVE, srcPath, destJcrPath);
+
+ clear = true;
}
/**