incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From enor...@apache.org
Subject svn commit: r982454 - in /sling/trunk: bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/
Date Thu, 05 Aug 2010 02:24:48 GMT
Author: enorman
Date: Thu Aug  5 02:24:48 2010
New Revision: 982454

URL: http://svn.apache.org/viewvc?rev=982454&view=rev
Log:
SLING-1091 POST to URL ending in /* with :name and no :nameHint should fail if named node
exists

Modified:
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCreateOperation.java
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ModifyOperation.java
    sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletCreateTest.java
    sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java

Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCreateOperation.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCreateOperation.java?rev=982454&r1=982453&r2=982454&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCreateOperation.java
(original)
+++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/AbstractCreateOperation.java
Thu Aug  5 02:24:48 2010
@@ -17,16 +17,6 @@
 
 package org.apache.sling.servlets.post.impl.operations;
 
-import org.apache.sling.api.SlingHttpServletRequest;
-import org.apache.sling.api.request.RequestParameter;
-import org.apache.sling.api.resource.ResourceUtil;
-import org.apache.sling.api.servlets.HtmlResponse;
-import org.apache.sling.servlets.post.AbstractSlingPostOperation;
-import org.apache.sling.servlets.post.Modification;
-import org.apache.sling.servlets.post.SlingPostConstants;
-import org.apache.sling.servlets.post.VersioningConfiguration;
-import org.apache.sling.servlets.post.impl.helper.RequestProperty;
-
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -40,8 +30,38 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.version.VersionException;
+import javax.servlet.ServletException;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.api.request.RequestParameterMap;
+import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.servlets.HtmlResponse;
+import org.apache.sling.servlets.post.AbstractSlingPostOperation;
+import org.apache.sling.servlets.post.Modification;
+import org.apache.sling.servlets.post.NodeNameGenerator;
+import org.apache.sling.servlets.post.SlingPostConstants;
+import org.apache.sling.servlets.post.VersioningConfiguration;
+import org.apache.sling.servlets.post.impl.helper.RequestProperty;
 
 abstract class AbstractCreateOperation extends AbstractSlingPostOperation {
+    /**
+     * The default node name generator
+     */
+    private final NodeNameGenerator defaultNodeNameGenerator;
+
+    /**
+     * utility class for generating node names
+     */
+    private NodeNameGenerator[] extraNodeNameGenerators;
+
+    public AbstractCreateOperation(NodeNameGenerator defaultNodeNameGenerator) {
+		this.defaultNodeNameGenerator = defaultNodeNameGenerator;
+	}
+
+	public void setExtraNodeNameGenerators(NodeNameGenerator[] extraNodeNameGenerators) {
+        this.extraNodeNameGenerators = extraNodeNameGenerators;
+    }
 
     /**
      * Create node(s) according to current request
@@ -430,4 +450,85 @@ abstract class AbstractCreateOperation e
     }
 
 
+    protected String generateName(SlingHttpServletRequest request, String basePath)
+    	throws RepositoryException {
+
+		// SLING-1091: If a :name parameter is supplied, the (first) value of this parameter is
used unmodified as the name 
+		//    for the new node. If the name is illegally formed with respect to JCR name requirements,
an exception will be 
+		//    thrown when trying to create the node. The assumption with the :name parameter is,
that the caller knows what 
+		//    he (or she) is supplying and should get the exact result if possible.        
+		RequestParameterMap parameters = request.getRequestParameterMap();
+		RequestParameter specialParam = parameters.getValue(SlingPostConstants.RP_NODE_NAME);
+		if ( specialParam != null ) {
+		    if ( specialParam.getString() != null && specialParam.getString().length()
> 0 ) {
+		        // If the path ends with a *, create a node under its parent, with
+		        // a generated node name
+		        basePath = basePath += "/" + specialParam.getString();
+		
+		        // if the resulting path already exists then report an error
+		        Session session = request.getResourceResolver().adaptTo(Session.class);
+	            String jcrPath = removeAndValidateWorkspace(basePath, session);
+	            if (session.itemExists(jcrPath)) {
+	    		    throw new RepositoryException(
+	    			        "Collision in node names for path=" + basePath);
+	            }
+		
+		        return basePath;
+		    }
+		}
+
+		// no :name value was supplied, so generate a name
+		boolean requirePrefix = requireItemPathPrefix(request);
+		
+		String generatedName = null;
+		if (extraNodeNameGenerators != null) {
+		    for (NodeNameGenerator generator : extraNodeNameGenerators) {
+		        generatedName = generator.getNodeName(request, basePath, requirePrefix, defaultNodeNameGenerator);
+		        if (generatedName != null) {
+		            break;
+		        }
+		    }
+		}
+		if (generatedName == null) {
+		    generatedName = defaultNodeNameGenerator.getNodeName(request, basePath, requirePrefix,
defaultNodeNameGenerator);
+		}
+		
+		// If the path ends with a *, create a node under its parent, with
+		// a generated node name
+		basePath += "/" + generatedName;
+		
+		basePath = ensureUniquePath(request, basePath);
+		
+		return basePath;
+    }
+
+    private String ensureUniquePath(SlingHttpServletRequest request, String basePath) throws
RepositoryException {
+		// if resulting path exists, add a suffix until it's not the case
+		// anymore
+		Session session = request.getResourceResolver().adaptTo(Session.class);
+		
+		String jcrPath = removeAndValidateWorkspace(basePath, session);
+		
+		// if resulting path exists, add a suffix until it's not the case
+		// anymore
+		if (session.itemExists(jcrPath)) {
+		    for (int idx = 0; idx < 1000; idx++) {
+		        String newPath = jcrPath + "_" + idx;
+		        if (!session.itemExists(newPath)) {
+		            basePath = basePath + "_" + idx;
+		            jcrPath = newPath;
+		            break;
+		        }
+		    }
+		}
+		
+		// if it still exists there are more than 1000 nodes ?
+		if (session.itemExists(jcrPath)) {
+		    throw new RepositoryException(
+		        "Collision in generated node names for path=" + basePath);
+		}
+		
+		return basePath;
+    }
+    
 }

Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java?rev=982454&r1=982453&r2=982454&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java
(original)
+++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java
Thu Aug  5 02:24:48 2010
@@ -48,34 +48,20 @@ import org.apache.sling.servlets.post.im
 public class ImportOperation extends AbstractCreateOperation {
 
     /**
-     * The default node name generator
-     */
-    private final NodeNameGenerator defaultNodeNameGenerator;
-
-    /**
-     * utility class for generating node names
-     */
-    private NodeNameGenerator[] extraNodeNameGenerators;
-
-    /**
      * Reference to the content importer service
      */
 	private ContentImporter contentImporter;
 
     public ImportOperation(NodeNameGenerator defaultNodeNameGenerator,
             ContentImporter contentImporter) {
-        this.defaultNodeNameGenerator = defaultNodeNameGenerator;
+    	super(defaultNodeNameGenerator);
         this.contentImporter = contentImporter;
     }
-    
-	public void setContentImporter(ContentImporter importer) {
+
+    public void setContentImporter(ContentImporter importer) {
 		this.contentImporter = importer;
 	}
-
-    public void setExtraNodeNameGenerators(NodeNameGenerator[] extraNodeNameGenerators) {
-        this.extraNodeNameGenerators = extraNodeNameGenerators;
-    }
-	
+    
     @Override
     protected void doRun(SlingHttpServletRequest request, HtmlResponse response, final List<Modification>
changes)
     		throws RepositoryException {
@@ -85,7 +71,7 @@ public class ImportOperation extends Abs
                     "Missing content importer for import");
             return;
     	}
-	Map<String, RequestProperty> reqProperties = collectContent(request,
+    	Map<String, RequestProperty> reqProperties = collectContent(request,
              response);
      
         VersioningConfiguration versioningConfiguration = getVersioningConfiguration(request);
@@ -93,7 +79,6 @@ public class ImportOperation extends Abs
         // do not change order unless you have a very good reason.
         Session session = request.getResourceResolver().adaptTo(Session.class);
 
-    	
         processCreate(session, reqProperties, response, changes, versioningConfiguration);
         String path = response.getPath();
         Node node = null;
@@ -135,7 +120,8 @@ public class ImportOperation extends Abs
         //check if a name was posted to use as the name of the imported root node
         if (request.getParameter(SlingPostConstants.RP_NODE_NAME) != null || 
         		request.getParameter(SlingPostConstants.RP_NODE_NAME_HINT) != null) {
-   			String name = generateName(request, basePath);
+   			String nodePath = generateName(request, basePath);
+   			String name = nodePath.substring(nodePath.lastIndexOf('/') + 1);
    	        contentRootName = name + "." + contentType;
         } else {
         	//no name posted, so the import won't create a root node
@@ -226,54 +212,4 @@ public class ImportOperation extends Abs
         	throw new RepositoryException(e);
         }
     }
-
-    
-    private String generateName(SlingHttpServletRequest request, String basePath)
-    		throws RepositoryException {
-    	boolean requirePrefix = requireItemPathPrefix(request);
-
-    	String generatedName = null;
-    	if (extraNodeNameGenerators != null) {
-    		for (NodeNameGenerator generator : extraNodeNameGenerators) {
-    			generatedName = generator.getNodeName(request, basePath, requirePrefix, defaultNodeNameGenerator);
-    			if (generatedName != null) {
-    				break;
-    			}
-    		}
-    	}
-    	if (generatedName == null) {
-    		generatedName = defaultNodeNameGenerator.getNodeName(request, basePath, requirePrefix,
defaultNodeNameGenerator);
-    	}
-
-    	// If the path ends with a *, create a node under its parent, with
-    	// a generated node name
-    	basePath += "/" + generatedName;
-
-    	// if resulting path exists, add a suffix until it's not the case
-    	// anymore
-    	Session session = request.getResourceResolver().adaptTo(Session.class);
-
-    	// if resulting path exists, add a suffix until it's not the case
-    	// anymore
-    	if (session.itemExists(basePath)) {
-    		for (int idx = 0; idx < 1000; idx++) {
-    			String newPath = basePath + "_" + idx;
-    			if (!session.itemExists(newPath)) {
-    				basePath = newPath;
-    				break;
-    			}
-    		}
-    	}
-
-    	// if it still exists there are more than 1000 nodes ?
-    	if (session.itemExists(basePath)) {
-    		throw new RepositoryException(
-    				"Collision in generated node names for path=" + basePath);
-    	}
-
-    	//the last segment is the name.
-    	String name = basePath.substring(basePath.lastIndexOf('/') + 1);
-		return name;
-    }
-
 }
\ No newline at end of file

Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ModifyOperation.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ModifyOperation.java?rev=982454&r1=982453&r2=982454&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ModifyOperation.java
(original)
+++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ModifyOperation.java
Thu Aug  5 02:24:48 2010
@@ -28,6 +28,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 
 import org.apache.sling.api.SlingException;
 import org.apache.sling.api.SlingHttpServletRequest;
@@ -36,10 +37,10 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.servlets.HtmlResponse;
 import org.apache.sling.servlets.post.Modification;
+import org.apache.sling.servlets.post.NodeNameGenerator;
 import org.apache.sling.servlets.post.SlingPostConstants;
 import org.apache.sling.servlets.post.VersioningConfiguration;
 import org.apache.sling.servlets.post.impl.helper.DateParser;
-import org.apache.sling.servlets.post.NodeNameGenerator;
 import org.apache.sling.servlets.post.impl.helper.ReferenceParser;
 import org.apache.sling.servlets.post.impl.helper.RequestProperty;
 import org.apache.sling.servlets.post.impl.helper.SlingFileUploadHandler;
@@ -52,16 +53,6 @@ import org.apache.sling.servlets.post.im
  */
 public class ModifyOperation extends AbstractCreateOperation {
 
-    /**
-     * The default node name generator
-     */
-    private final NodeNameGenerator defaultNodeNameGenerator;
-
-    /**
-     * utility class for generating node names
-     */
-    private NodeNameGenerator[] extraNodeNameGenerators;
-
     private final DateParser dateParser;
 
     /**
@@ -71,15 +62,11 @@ public class ModifyOperation extends Abs
 
     public ModifyOperation(NodeNameGenerator defaultNodeNameGenerator,
             DateParser dateParser, ServletContext servletContext) {
-        this.defaultNodeNameGenerator = defaultNodeNameGenerator;
+    	super(defaultNodeNameGenerator);
         this.dateParser = dateParser;
         this.uploadHandler = new SlingFileUploadHandler(servletContext);
     }
 
-    public void setExtraNodeNameGenerators(NodeNameGenerator[] extraNodeNameGenerators) {
-        this.extraNodeNameGenerators = extraNodeNameGenerators;
-    }
-
     @Override
     protected void doRun(SlingHttpServletRequest request, HtmlResponse response, List<Modification>
changes)
             throws RepositoryException {
@@ -174,62 +161,6 @@ public class ModifyOperation extends Abs
         return path;
     }
 
-    private String generateName(SlingHttpServletRequest request, String basePath)
-            throws RepositoryException {
-        boolean requirePrefix = requireItemPathPrefix(request);
-
-        String generatedName = null;
-        if (extraNodeNameGenerators != null) {
-            for (NodeNameGenerator generator : extraNodeNameGenerators) {
-                generatedName = generator.getNodeName(request, basePath, requirePrefix, defaultNodeNameGenerator);
-                if (generatedName != null) {
-                    break;
-                }
-            }
-        }
-        if (generatedName == null) {
-            generatedName = defaultNodeNameGenerator.getNodeName(request, basePath, requirePrefix,
defaultNodeNameGenerator);
-        }
-
-        // If the path ends with a *, create a node under its parent, with
-        // a generated node name
-        basePath += "/" + generatedName;
-
-        basePath = ensureUniquePath(request, basePath);
-
-        return basePath;
-    }
-
-    private String ensureUniquePath(SlingHttpServletRequest request, String basePath) throws
RepositoryException {
-        // if resulting path exists, add a suffix until it's not the case
-        // anymore
-        Session session = request.getResourceResolver().adaptTo(Session.class);
-
-        String jcrPath = removeAndValidateWorkspace(basePath, session);
-
-        // if resulting path exists, add a suffix until it's not the case
-        // anymore
-        if (session.itemExists(jcrPath)) {
-            for (int idx = 0; idx < 1000; idx++) {
-                String newPath = jcrPath + "_" + idx;
-                if (!session.itemExists(newPath)) {
-                    basePath = basePath + "_" + idx;
-                    jcrPath = newPath;
-                    break;
-                }
-            }
-        }
-
-        // if it still exists there are more than 1000 nodes ?
-        if (session.itemExists(jcrPath)) {
-            throw new RepositoryException(
-                "Collision in generated node names for path=" + basePath);
-        }
-
-        return basePath;
-    }
-
-
     /**
      * Moves all repository content listed as repository move source in the
      * request properties to the locations indicated by the resource properties.

Modified: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletCreateTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletCreateTest.java?rev=982454&r1=982453&r2=982454&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletCreateTest.java
(original)
+++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletCreateTest.java
Thu Aug  5 02:24:48 2010
@@ -17,11 +17,14 @@
 package org.apache.sling.launchpad.webapp.integrationtest.servlets.post;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.httpclient.NameValuePair;
 import org.apache.sling.commons.testing.integration.HttpTestBase;
 import org.apache.sling.servlets.post.SlingPostConstants;
 
@@ -136,4 +139,60 @@ public class PostServletCreateTest exten
         assertJavascript("string", content, "out.println(typeof data.c)");
     }
 
- }
\ No newline at end of file
+    /**
+     * SLING-1091: test create node with an exact node name (no filtering) 
+     */
+    public void testCreateNodeWithExactName() throws IOException {
+    	Map<String,String> nodeProperties = new HashMap<String, String>();
+    	nodeProperties.put(SlingPostConstants.RP_NODE_NAME, "exactNodeName");
+        final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX,
nodeProperties);
+        assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK,
+                "POST must redirect to created resource (" + location + ")");
+        assertTrue("Node (" + location + ") must have exact name",
+                !location.endsWith("/*"));
+        assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl +
")",
+                location.contains(postUrl + "/"));
+        assertTrue("Node (" + location + ") must have exact name 'exactNodeName'",
+        		location.endsWith("/exactNodeName"));
+    }
+
+    /**
+     * SLING-1091: test error reporting when attempting to create a node with an 
+     * invalid exact node name. 
+     */
+    public void testCreateNodeWithInvalidExactName() throws IOException {
+		String location = postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX;
+		List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+		postParams.add(new NameValuePair(SlingPostConstants.RP_NODE_NAME, "exactNodeName*"));
+		//expect a 500 status since the name is invalid
+		assertPostStatus(location, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, postParams, null);
+    }
+
+    /**
+     * SLING-1091: test error reporting when attempting to create a node with an 
+     * already used node name. 
+     */
+    public void testCreateNodeWithAlreadyUsedExactName() throws IOException {
+        String testNodeName = "alreadyUsedExactNodeName";
+    	
+    	Map<String,String> nodeProperties = new HashMap<String, String>();
+    	nodeProperties.put(SlingPostConstants.RP_NODE_NAME, testNodeName);
+        final String location = testClient.createNode(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX,
nodeProperties);
+        assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK,
+                "POST must redirect to created resource (" + location + ")");
+        assertTrue("Node (" + location + ") must have exact name",
+                !location.endsWith("/*"));
+        assertTrue("Node (" + location + ") must created be under POST URL (" + postUrl +
")",
+                location.contains(postUrl + "/"));
+        assertTrue("Node (" + location + ") must have exact name '" + testNodeName + "'",
+        		location.endsWith("/" + testNodeName));
+
+        //try to create the same node again, since same name siblings are not allowed an
error should be
+        // thrown
+		List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+		postParams.add(new NameValuePair(SlingPostConstants.RP_NODE_NAME, testNodeName));
+		//expect a 500 status since the name is not unique
+		assertPostStatus(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
postParams, null);
+    }
+
+}
\ No newline at end of file

Modified: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java?rev=982454&r1=982453&r2=982454&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java
(original)
+++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java
Thu Aug  5 02:24:48 2010
@@ -20,13 +20,18 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
 
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.httpclient.NameValuePair;
 import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
@@ -541,4 +546,94 @@ public class PostServletImportTest exten
 		assertExpectedJSON(new JSONObject(expectedJsonContent), jsonObj);
     }
     
+    
+    
+
+    protected String importNodeWithExactName(String testNodeName) throws IOException, JSONException
{
+        final String testPath = TEST_BASE_PATH;
+        Map<String, String> props = new HashMap<String, String>();
+        String testNode = testClient.createNode(HTTP_BASE_URL + testPath, props);
+        urlsToDelete.add(testNode);
+
+        props.clear();
+        props.put(SlingPostConstants.RP_OPERATION,
+        		SlingPostConstants.OPERATION_IMPORT);
+        
+        props.put(SlingPostConstants.RP_NODE_NAME, testNodeName);
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+        props.put(SlingPostConstants.RP_CONTENT, jsonContent);
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String location = testClient.createNode(HTTP_BASE_URL + testPath, props);
+
+        // assert content at new location
+        String content = getContent(location + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String expectedJsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/importresults.json"));
+		assertExpectedJSON(new JSONObject(expectedJsonContent), jsonObj);
+
+    	assertHttpStatus(location + DEFAULT_EXT, HttpServletResponse.SC_OK,
+                "POST must redirect to created resource (" + location + ")");
+        assertTrue("Node (" + location + ") must have exact name",
+                !location.endsWith("/*"));
+        assertTrue("Node (" + location + ") must created be under POST URL (" + testNode
+ ")",
+                location.contains(testNode + "/"));
+        assertTrue("Node (" + location + ") must have exact name '" + testNodeName + "'",
+        		location.endsWith("/" + testNodeName));
+
+		return location;
+    }
+    
+    /**
+     * SLING-1091: test create node with an exact node name (no filtering) 
+     */
+    public void testImportNodeWithExactName() throws IOException, JSONException {
+    	importNodeWithExactName("exactNodeName");
+    }
+
+    /**
+     * SLING-1091: test error reporting when attempting to create a node with an 
+     * invalid exact node name. 
+     */
+    public void testImportNodeWithInvalidExactName() throws IOException {
+        final String testPath = TEST_BASE_PATH;
+        Map<String, String> props = new HashMap<String, String>();
+        String testNode = testClient.createNode(HTTP_BASE_URL + testPath, props);
+        urlsToDelete.add(testNode);
+
+		List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+		postParams.add(new NameValuePair(SlingPostConstants.RP_OPERATION, SlingPostConstants.OPERATION_IMPORT));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_NODE_NAME, "exactNodeName*"));
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT, jsonContent));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT_TYPE, "json"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*"));
+
+        //expect a 500 status since the name is invalid
+        String location = HTTP_BASE_URL + testPath;
+		assertPostStatus(location, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, postParams, null);
+    }
+
+    /**
+     * SLING-1091: test error reporting when attempting to import a node with an 
+     * already used node name. 
+     */
+    public void testImportNodeWithAlreadyUsedExactName() throws IOException, JSONException
{
+    	String testNodeName = "alreadyUsedExactNodeName";
+    	String location = importNodeWithExactName(testNodeName);
+
+    	
+        //try to create the same node again, since same name siblings are not allowed an
error should be
+        // thrown
+		List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+		postParams.add(new NameValuePair(SlingPostConstants.RP_NODE_NAME, testNodeName));
+		//expect a 500 status since the name is not unique
+		String postUrl = location.substring(0, location.lastIndexOf('/'));
+		assertPostStatus(postUrl + SlingPostConstants.DEFAULT_CREATE_SUFFIX, HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
postParams, null);
+    }
+    
 }



Mime
View raw message