[exo-jcr-commits] exo-jcr SVN: r4639 - in jcr/branches/1.12.x: exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command and 3 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Sun Jul 17 21:57:47 EDT 2011
Author: trang_vu
Date: 2011-07-17 21:57:47 -0400 (Sun, 17 Jul 2011)
New Revision: 4639
Added:
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1630/
Removed:
jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1630/
Modified:
jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java
jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java
jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1630/JCR-1630.patch
Log:
JCR-1630: update WebDavServiceImpl to escape characters while MOVE.
Problem description
* In jcr 1.10.12, it is impossible to copy or move a file when the destination path contains space characters (see JCR-1628).
This problem is not reproduced in jcr 1.12.9-GA, but for easy maintenance, the same fix is applied also to jcr 1.12.x.
Fix description
* Update WebDavServiceImpl. Destination header might contain unescaped characters. If Exception has come during URI building, try to escape characters and build URI again.
* Add unit tests in TestMove and TestCopy.
Modified: jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java 2011-07-15 12:22:58 UTC (rev 4638)
+++ jcr/branches/1.12.x/exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java 2011-07-18 01:57:47 UTC (rev 4639)
@@ -72,6 +72,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URI;
+import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
@@ -384,9 +385,12 @@
try
{
String serverURI = uriInfo.getBaseUriBuilder().path(getClass()).path(repoName).build().toString();
- URI dest = new URI(destinationHeader);
- URI base = new URI(serverURI);
+ // destinationHeader could begins from workspace name (passed from cms
+ // WebDAVServiceImpl) and doesn't contain neither host no repository name
+ URI dest = buildURI(destinationHeader);
+ URI base = buildURI(serverURI);
+
String destPath = dest.getPath();
int repoIndex = destPath.indexOf(repoName);
@@ -395,12 +399,12 @@
// or destination header is malformed
// we return BAD_GATEWAY(502) HTTP status
// more info here http://www.webdav.org/specs/rfc2518.html#METHOD_COPY
- if (!base.getHost().equals(dest.getHost()) || repoIndex == -1)
+ if (dest.getHost() != null && !base.getHost().equals(dest.getHost()))
{
return Response.status(HTTPStatus.BAD_GATEWAY).entity("Bad Gateway").build();
}
- destPath = normalizePath(dest.getPath().substring(repoIndex + repoName.length() + 1));
+ destPath = normalizePath(repoIndex == -1 ? destPath : destPath.substring(repoIndex + repoName.length() + 1));
String srcWorkspace = workspaceName(repoPath);
String srcNodePath = path(repoPath);
@@ -776,8 +780,10 @@
{
String serverURI = uriInfo.getBaseUriBuilder().path(getClass()).path(repoName).build().toString();
- URI dest = new URI(destinationHeader);
- URI base = new URI(serverURI);
+ // destinationHeader could begins from workspace name (passed from cms
+ // WebDAVServiceImpl) and doesn't contain neither host no repository name
+ URI dest = buildURI(destinationHeader);
+ URI base = buildURI(serverURI);
String destPath = dest.getPath();
int repoIndex = destPath.indexOf(repoName);
@@ -787,14 +793,12 @@
// or destination header is malformed
// we return BAD_GATEWAY(502) HTTP status
// more info here http://www.webdav.org/specs/rfc2518.html#METHOD_MOVE
- if (!base.getHost().equals(dest.getHost()) || repoIndex == -1)
-
- if (!destinationHeader.startsWith(serverURI))
+ if (dest.getHost() != null && !base.getHost().equals(dest.getHost()))
{
return Response.status(HTTPStatus.BAD_GATEWAY).entity("Bad Gateway").build();
}
- destPath = normalizePath(dest.getPath().substring(repoIndex + repoName.length() + 1));
+ destPath = normalizePath(repoIndex == -1 ? destPath : destPath.substring(repoIndex + repoName.length() + 1));
String destWorkspace = workspaceName(destPath);
String destNodePath = path(destPath);
@@ -1338,4 +1342,18 @@
return lockTokens;
}
+ /**
+ * Build URI from string.
+ */
+ private URI buildURI(String path) throws URISyntaxException
+ {
+ try
+ {
+ return new URI(path);
+ }
+ catch (URISyntaxException e)
+ {
+ return new URI(TextUtil.escape(path, '%', true));
+ }
+ }
}
Modified: jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java 2011-07-15 12:22:58 UTC (rev 4638)
+++ jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java 2011-07-18 01:57:47 UTC (rev 4639)
@@ -194,9 +194,130 @@
ContainerResponse response = service(WebDAVMethods.COPY, getPathWS() + filename, host, headers, null);
// check if operation completed successfully, we expect a new resource to be created
assertEquals(HTTPStatus.CREATED, response.getStatus());
+ }
+ public void testCopyDestinationHeaderBeginsFromWorkspaceName() throws Exception
+ {
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = TestUtils.getFileName();
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+
+ ContainerResponse response = service(WebDAVMethods.COPY, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+
+ Node nodeBase = session.getRootNode().getNode(TextUtil.relativizePath(filename));
+ assertTrue(nodeBase.hasNode("jcr:content"));
+
+ Node nodeBaseContent = nodeBase.getNode("jcr:content");
+ assertTrue(nodeBaseContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamBase = (ByteArrayInputStream)nodeBaseContent.getProperty("jcr:data").getStream();
+ String getContentBase = TestUtils.stream2string(streamBase, null);
+ assertEquals(content, getContentBase);
}
+ public void testCopyToFolderWithSpace() throws Exception
+ {
+ String folderNameWithSpace = "new folder - testCopyToFolderWithSpace";
+ session.getRootNode().addNode(folderNameWithSpace, "nt:folder");
+ session.save();
+
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = "/" + folderNameWithSpace + TestUtils.getFileName();
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+
+ ContainerResponse response = service(WebDAVMethods.COPY, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+
+ Node nodeBase = session.getRootNode().getNode(TextUtil.relativizePath(filename));
+ assertTrue(nodeBase.hasNode("jcr:content"));
+
+ Node nodeBaseContent = nodeBase.getNode("jcr:content");
+ assertTrue(nodeBaseContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamBase = (ByteArrayInputStream)nodeBaseContent.getProperty("jcr:data").getStream();
+ String getContentBase = TestUtils.stream2string(streamBase, null);
+ assertEquals(content, getContentBase);
+ }
+
+ public void testCopyToFolderWithSpaceUnescapedChars() throws Exception
+ {
+ String folderNameWithSpace = "new folder - testCopyToFolderWithSpaceUnescapedChars";
+ session.getRootNode().addNode(folderNameWithSpace, "nt:folder");
+ session.save();
+
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = TextUtil.unescape("/" + folderNameWithSpace + TestUtils.getFileName(), '%');
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+
+ ContainerResponse response = service(WebDAVMethods.COPY, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+
+ Node nodeBase = session.getRootNode().getNode(TextUtil.relativizePath(filename));
+ assertTrue(nodeBase.hasNode("jcr:content"));
+
+ Node nodeBaseContent = nodeBase.getNode("jcr:content");
+ assertTrue(nodeBaseContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamBase = (ByteArrayInputStream)nodeBaseContent.getProperty("jcr:data").getStream();
+ String getContentBase = TestUtils.stream2string(streamBase, null);
+ assertEquals(content, getContentBase);
+ }
+
@Override
protected String getRepositoryName()
{
Modified: jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java
===================================================================
--- jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java 2011-07-15 12:22:58 UTC (rev 4638)
+++ jcr/branches/1.12.x/exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java 2011-07-18 01:57:47 UTC (rev 4639)
@@ -182,6 +182,98 @@
}
+ public void testMoveHeaderBeginsFromWorkspaceName() throws Exception
+ {
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = TestUtils.getFileName();
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+ ContainerResponse response = service(WebDAVMethods.MOVE, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertFalse(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+ }
+
+ public void testMoveToFolderWithSpace() throws Exception
+ {
+ String folderNameWithSpace = "new folder - testMoveToFolderWithSpace";
+ session.getRootNode().addNode(folderNameWithSpace, "nt:folder");
+ session.save();
+
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = "/" + folderNameWithSpace + TestUtils.getFileName();
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+ ContainerResponse response = service(WebDAVMethods.MOVE, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertFalse(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+ }
+
+ public void testMoveToFolderWithSpaceUnescapedChars() throws Exception
+ {
+ String folderNameWithSpace = "new folder - testMoveToFolderWithSpaceUnescapedChars";
+ session.getRootNode().addNode(folderNameWithSpace, "nt:folder");
+ session.save();
+
+ String content = TestUtils.getFileContent();
+ String filename = TestUtils.getFileName();
+ InputStream inputStream = new ByteArrayInputStream(content.getBytes());
+ TestUtils.addContent(session, filename, inputStream, defaultFileNodeType, "");
+ String destFilename = TextUtil.unescape("/" + folderNameWithSpace + TestUtils.getFileName(), '%');
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+
+ headers.add(ExtHttpHeaders.DESTINATION, WORKSPACE + destFilename);
+ ContainerResponse response = service(WebDAVMethods.MOVE, getPathWS() + filename, host, headers, null);
+
+ assertEquals(HTTPStatus.CREATED, response.getStatus());
+ assertTrue(session.getRootNode().hasNode(TextUtil.relativizePath(destFilename)));
+
+ Node nodeDest = session.getRootNode().getNode(TextUtil.relativizePath(destFilename));
+ assertTrue(nodeDest.hasNode("jcr:content"));
+
+ Node nodeDestContent = nodeDest.getNode("jcr:content");
+ assertTrue(nodeDestContent.hasProperty("jcr:data"));
+
+ ByteArrayInputStream streamDest = (ByteArrayInputStream)nodeDestContent.getProperty("jcr:data").getStream();
+ String getContentDest = TestUtils.stream2string(streamDest, null);
+ assertEquals(content, getContentDest);
+ assertFalse(session.getRootNode().hasNode(TextUtil.relativizePath(filename)));
+ }
+
@Override
protected String getRepositoryName()
{
Modified: jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1630/JCR-1630.patch
===================================================================
--- jcr/branches/1.12.x/patch/1.12.9-GA/JCR-1630/JCR-1630.patch 2011-07-08 08:01:53 UTC (rev 4614)
+++ jcr/branches/1.12.x/patch/1.12.10-GA/JCR-1630/JCR-1630.patch 2011-07-18 01:57:47 UTC (rev 4639)
@@ -1,6 +1,6 @@
Index: exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java
===================================================================
---- exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java (revision 4383)
+--- exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java (revision 4614)
+++ exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestMove.java (working copy)
@@ -182,6 +182,98 @@
@@ -103,7 +103,7 @@
{
Index: exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java
===================================================================
---- exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java (revision 4383)
+--- exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java (revision 4614)
+++ exo.jcr.component.webdav/src/test/java/org/exoplatform/services/jcr/webdav/command/TestCopy.java (working copy)
@@ -194,9 +194,130 @@
ContainerResponse response = service(WebDAVMethods.COPY, getPathWS() + filename, host, headers, null);
@@ -238,7 +238,7 @@
{
Index: exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java
===================================================================
---- exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java (revision 4383)
+--- exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java (revision 4614)
+++ exo.jcr.component.webdav/src/main/java/org/exoplatform/services/jcr/webdav/WebDavServiceImpl.java (working copy)
@@ -72,6 +72,7 @@
import java.lang.annotation.Annotation;
@@ -308,7 +308,7 @@
String destWorkspace = workspaceName(destPath);
String destNodePath = path(destPath);
-@@ -1335,4 +1339,18 @@
+@@ -1338,4 +1342,18 @@
return lockTokens;
}
More information about the exo-jcr-commits
mailing list