[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