You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by en...@apache.org on 2010/06/27 21:36:50 UTC

svn commit: r958411 [2/2] - in /sling/trunk: bundles/commons/testing/src/main/java/org/apache/sling/commons/testing/integration/ bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ bundles/jcr/contentloader/src/main/java/org/apa...

Added: 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=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java (added)
+++ sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java Sun Jun 27 19:36:49 2010
@@ -0,0 +1,544 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.launchpad.webapp.integrationtest.servlets.post;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+import org.apache.sling.commons.json.JSONArray;
+import org.apache.sling.commons.json.JSONException;
+import org.apache.sling.commons.json.JSONObject;
+import org.apache.sling.commons.testing.integration.HttpTestBase;
+import org.apache.sling.commons.testing.integration.NameValuePairList;
+import org.apache.sling.servlets.post.SlingPostConstants;
+
+/** Test content import via the MicrojaxPostServlet */
+public class PostServletImportTest extends HttpTestBase {
+
+    public static final String TEST_BASE_PATH = "/sling-import-tests";
+    static Random random = new Random();
+
+    File testFile;
+    
+    /* (non-Javadoc)
+	 * @see org.apache.sling.commons.testing.integration.HttpTestBase#tearDown()
+	 */
+	@Override
+	protected void tearDown() throws Exception {
+		if (testFile != null) {
+			//cleanup temp file
+			testFile.delete();
+		}
+		super.tearDown();
+	}
+
+	static String getStreamAsString(InputStream is) throws IOException {
+        final StringBuilder content = new StringBuilder();
+        final byte [] buffer = new byte[16384];
+        int n = 0;
+        while( (n = is.read(buffer, 0, buffer.length)) > 0) {
+            content.append(new String(buffer, 0, n));
+        }
+        return content.toString();
+    }
+    
+    private File getTestFile(InputStream inputStream) throws IOException {
+    	File tempFile = File.createTempFile("file-to-upload", null, new File("target"));
+    	FileOutputStream outputStream = new FileOutputStream(tempFile);
+    	byte[] bbuf = new byte[16384]; //16k
+    	int len;
+    	while ((len = inputStream.read(bbuf)) != -1) {
+    		outputStream.write(bbuf, 0, len);
+    	}
+    	outputStream.flush();
+    	outputStream.close();
+    	return tempFile;
+    }
+
+    protected void assertExpectedJSON(JSONObject expectedJson, JSONObject actualJson) throws JSONException {
+    	Iterator<String> keys = expectedJson.keys();
+    	while (keys.hasNext()) {
+    		String key = keys.next();
+    		
+    		Object object = expectedJson.get(key);
+    		Object object2 = actualJson.get(key);
+			if (object instanceof JSONObject) {
+				assertTrue(object instanceof JSONObject);
+    			assertExpectedJSON((JSONObject)object, (JSONObject)object2);
+			} else if (object instanceof JSONArray) {
+				//compare the array
+				assertTrue(object2 instanceof JSONArray);
+				JSONArray actualArray = (JSONArray)object2;
+				Set<Object> actualValuesSet = new HashSet<Object>();
+				for (int i=0; i < actualArray.length(); i++) {
+					actualValuesSet.add(actualArray.get(i));
+				}
+				
+				JSONArray expectedArray = (JSONArray)object;
+				for (int i=0; i < expectedArray.length(); i++) {
+					assertTrue(actualValuesSet.contains(expectedArray.get(i)));
+				}
+    		} else {
+    			assertEquals(object, object2);
+    		}
+    	}
+    }
+    
+    
+    /**
+     * Test import operation which replaces existing content
+     */
+    public void testImportReplace() 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);
+
+        //add node that will get replaced
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put("propTest", "propTestValue");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath + "/" + testNodeName, props);
+        
+        //import with the replace option to replace the existing node.
+        props.clear();
+        props.put(SlingPostConstants.RP_OPERATION,
+        		SlingPostConstants.OPERATION_IMPORT);
+        
+        props.put(SlingPostConstants.RP_NODE_NAME, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        props.put(SlingPostConstants.RP_REPLACE, "true");
+        String importedNodeUrl2 = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        //the new node should have the same path as the replaced node
+        assertEquals(importedNodeUrl, importedNodeUrl2);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl2 + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+		assertNull(jsonObj.optString("propTest", null)); //test property should be gone.
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    /**
+     * Test import operation which checks in versionable nodes.
+     */
+    public void testImportCheckinNodes() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport3.json"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        props.put(SlingPostConstants.RP_CHECKIN, "true");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert that the versionable node is checked in.
+		assertFalse(jsonObj.getBoolean("jcr:isCheckedOut"));
+		
+		
+		//now try with the checkin value set to false
+		testFile.delete();
+        props.clear();
+        props.put(SlingPostConstants.RP_OPERATION,
+        		SlingPostConstants.OPERATION_IMPORT);
+        
+        String testNodeName2 = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName2);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport3.json"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        props.put(SlingPostConstants.RP_CHECKIN, "false");
+        String importedNodeUrl2 = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content2 = getContent(importedNodeUrl2 + ".json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj2 = new JSONObject(content2);
+		assertNotNull(jsonObj2);
+
+		//assert that the versionable node is checked in.
+		assertTrue(jsonObj2.getBoolean("jcr:isCheckedOut"));
+    }
+    
+    /**
+     * Test import operation for a posted json file
+     */
+    public void testImportJSONFromFile() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    /**
+     * Test import operation for a posted json file without the optional name
+     */
+    public void testImportJSONFromFileWithoutOptionalName() 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);
+        
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport2.json"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        //make sure the name is what was inside the file.
+        assertTrue(importedNodeUrl.endsWith("/nodeName"));
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport2.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+    
+    /**
+     * Test import operation for a posted json string
+     */
+    public void testImportJSONFromRequestParam() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, 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 importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, props);
+
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    /**
+     * Test import operation for a posted json string without the optional name
+     */
+    public void testImportJSONFromRequestParamWithoutOptionalName() 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);
+        
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport2.json"));
+        props.put(SlingPostConstants.RP_CONTENT, jsonContent);
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "json");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, props);
+
+        //make sure the name is what was inside the file.
+        assertTrue(importedNodeUrl.endsWith("/nodeName"));
+
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+    
+    public void testImportXMLFromFile() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.xml"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "xml");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    public void testImportXMLFromFileWithoutOptionalName() 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);
+        
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport2.xml"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "xml");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        //make sure the name is what was inside the file.
+        assertTrue(importedNodeUrl.endsWith("/nodeName"));
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+    
+    public void testImportXMLFromRequestParam() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        String xmlContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.xml"));
+        props.put(SlingPostConstants.RP_CONTENT, xmlContent);
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "xml");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, props);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    public void testImportXMLFromRequestParamWithoutOptionalName() 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);
+        
+        String xmlContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport2.xml"));
+        props.put(SlingPostConstants.RP_CONTENT, xmlContent);
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "xml");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, props);
+        
+        //make sure the name is what was inside the file.
+        assertTrue(importedNodeUrl.endsWith("/nodeName"));
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+ 
+    
+    public void testImportZipFromFile() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.zip"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "zip");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimportzip.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+
+    public void testImportJarFromFile() 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);
+        
+        String testNodeName = "testNode_" + String.valueOf(random.nextInt());
+        props.put(SlingPostConstants.RP_NODE_NAME_HINT, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.jar"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "jar");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimportzip.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+ 
+    
+    public void testImportJCRXMLFromFile() 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);
+        
+        String testNodeName = "testnode_1287021810";
+        props.put(SlingPostConstants.RP_NODE_NAME, testNodeName);
+        testFile = getTestFile(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.jcr.xml"));
+        props.put(SlingPostConstants.RP_CONTENT_TYPE, "jcr.xml");
+        props.put(SlingPostConstants.RP_REDIRECT_TO, testPath + "/*");
+        String importedNodeUrl = testClient.createNode(HTTP_BASE_URL + testPath, new NameValuePairList(props), null, true,
+        		testFile, SlingPostConstants.RP_CONTENT_FILE, null);
+        
+        // assert content at new location
+        String content = getContent(importedNodeUrl + ".3.json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj = new JSONObject(content);
+		assertNotNull(jsonObj);
+
+		//assert the imported content is there.
+        String jsonContent = (String)getStreamAsString(getClass().getResourceAsStream("/integration-test/servlets/post/testimport.json"));
+		assertExpectedJSON(new JSONObject(jsonContent), jsonObj);
+    }
+    
+}
\ No newline at end of file

Propchange: sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jar
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jar?rev=958411&view=auto
==============================================================================
Binary file - no diff available.

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jcr.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jcr.xml?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jcr.xml (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jcr.xml Sun Jun 27 19:36:49 2010
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sv:node sv:name="testnode_1287021810" xmlns:test1="http://sling.apache.org/test/one"
+	xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+	xmlns:test2="test2=http://sling.apache.org/test/two" xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions"
+	xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:fn="http://www.w3.org/2005/xpath-functions"
+	xmlns:ocm="http://jackrabbit.apache.org/ocm" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:sv="http://www.jcp.org/jcr/sv/1.0" xmlns:rep="internal"
+	xmlns:jcr="http://www.jcp.org/jcr/1.0">
+	<sv:property sv:name="jcr:primaryType" sv:type="Name">
+		<sv:value>nt:unstructured</sv:value>
+	</sv:property>
+	<sv:property sv:name="jcr:mixinTypes" sv:type="Name">
+		<sv:value>mix:referenceable</sv:value>
+	</sv:property>
+	<sv:property sv:name="jcr:uuid" sv:type="String">
+		<sv:value>b8318fed-6b96-46d9-baa0-72a313160d24</sv:value>
+	</sv:property>
+	<sv:property sv:name="propOne" sv:type="String">
+		<sv:value>propOneValue</sv:value>
+	</sv:property>
+	<sv:node sv:name="childOne">
+		<sv:property sv:name="jcr:primaryType" sv:type="Name">
+			<sv:value>nt:unstructured</sv:value>
+		</sv:property>
+		<sv:property sv:name="childPropOne" sv:type="Boolean">
+			<sv:value>true</sv:value>
+		</sv:property>
+	</sv:node>
+</sv:node>
\ No newline at end of file

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.jcr.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.json
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.json?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.json (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.json Sun Jun 27 19:36:49 2010
@@ -0,0 +1,10 @@
+{
+	"jcr:primaryType": "nt:unstructured",
+	"jcr:mixinTypes": [
+		"mix:referenceable"
+	],
+	"propOne" : "propOneValue",
+	"childOne" : {
+		"childPropOne" : true
+	}
+}
\ No newline at end of file

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.xml?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.xml (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.xml Sun Jun 27 19:36:49 2010
@@ -0,0 +1,24 @@
+<node xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0">
+    <primaryNodeType>nt:unstructured</primaryNodeType>
+    <mixinNodeTypes>
+        <mixinNodeType>mix:referenceable</mixinNodeType>
+    </mixinNodeTypes>
+    <properties>
+        <property>
+            <name>propOne</name>
+            <value>propOneValue</value>
+            <type>String</type>
+        </property>
+    </properties>
+    <!-- child nodes -->
+    <node>
+       	<name>childOne</name>
+	    <properties>
+	        <property>
+	            <name>childPropOne</name>
+	            <value>true</value>
+	            <type>Boolean</type>
+	        </property>
+	    </properties>
+	</node>
+</node>

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.zip
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.zip?rev=958411&view=auto
==============================================================================
Binary file - no diff available.

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport.zip
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.json
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.json?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.json (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.json Sun Jun 27 19:36:49 2010
@@ -0,0 +1,12 @@
+{
+    "name" : "nodeName",
+	"jcr:primaryType": "nt:unstructured",
+	"jcr:mixinTypes": [
+		"mix:referenceable"
+	],
+	"propOne" : "propOneValue",
+	
+	"childOne" : {
+		"childPropOne" : true
+	}
+}
\ No newline at end of file

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.xml?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.xml (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.xml Sun Jun 27 19:36:49 2010
@@ -0,0 +1,26 @@
+<node xmlns:nt="http://www.jcp.org/jcr/nt/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0">
+    <name>nodeName</name>
+    <primaryNodeType>nt:unstructured</primaryNodeType>
+    <mixinNodeTypes>
+        <mixinNodeType>mix:referenceable</mixinNodeType>
+    </mixinNodeTypes>
+    <properties>
+        <property>
+            <name>propOne</name>
+            <value>propOneValue</value>
+            <type>String</type>
+        </property>
+    </properties>
+    <!-- child nodes -->
+    <node>
+       	<name>childOne</name>
+	    <properties>
+	        <property>
+	            <name>childPropOne</name>
+	            <value>true</value>
+	            <type>Boolean</type>
+	        </property>
+	    </properties>
+	</node>
+</node>
+

Propchange: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport2.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json Sun Jun 27 19:36:49 2010
@@ -0,0 +1,7 @@
+{
+	"jcr:primaryType": "nt:unstructured",
+	"jcr:mixinTypes": [
+		"mix:referenceable",
+		"mix:versionable"
+	]
+}
\ No newline at end of file

Added: sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimportzip.json
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimportzip.json?rev=958411&view=auto
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimportzip.json (added)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimportzip.json Sun Jun 27 19:36:49 2010
@@ -0,0 +1,18 @@
+{
+	"jcr:createdBy":"admin",
+	"jcr:primaryType":"nt:folder",
+	"childOne":{
+		"jcr:createdBy":"admin",
+		"jcr:primaryType":"nt:folder",
+		"testfile.txt":{
+			"jcr:createdBy":"admin",
+			"jcr:primaryType":"nt:file",
+			"jcr:content":{
+				"jcr:lastModifiedBy":"admin",
+				":jcr:data":21,
+				"jcr:primaryType":"nt:resource",
+				"jcr:mimeType":"text/plain",
+			}
+		}
+	}
+}
\ No newline at end of file