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 2011/11/26 22:40:21 UTC

svn commit: r1206611 - in /sling/trunk: bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ bundles/jcr/contentloader/src/test/java/org/apache/...

Author: enorman
Date: Sat Nov 26 21:40:18 2011
New Revision: 1206611

URL: http://svn.apache.org/viewvc?rev=1206611&view=rev
Log:
SLING-2108 PostServlet :import operation does not take autoCheckout into account

Modified:
    sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ContentImportListener.java
    sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java
    sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
    sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentImporter.java
    sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
    sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java
    sling/trunk/bundles/servlets/post/pom.xml
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/SlingPostConstants.java
    sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/impl/operations/ImportOperation.java
    sling/trunk/launchpad/integration-tests/pom.xml
    sling/trunk/launchpad/integration-tests/src/main/java/org/apache/sling/launchpad/webapp/integrationtest/servlets/post/PostServletImportTest.java
    sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json

Modified: sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ContentImportListener.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ContentImportListener.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ContentImportListener.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ContentImportListener.java Sat Nov 26 21:40:18 2011
@@ -64,4 +64,17 @@ public interface ContentImportListener {
      */
 	void onReorder(String orderedPath, String beforeSibbling);
 	
+    /**
+     * A versionable Node has been checked in. The source path provides the path of the 
+     * newly checked in Node.
+     * @since 2.1.4
+     */
+	void onCheckin(String srcPath);
+
+	/**
+     * A versionable Node has been checked out. The source path provides the path of the 
+     * newly checked out Node.
+     * @since 2.1.4
+     */
+	void onCheckout(String srcPath);
 }

Modified: sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java Sat Nov 26 21:40:18 2011
@@ -46,6 +46,16 @@ public abstract class ImportOptions {
 	public abstract boolean isCheckin();
 
 	/**
+	 * Specifies whether versionable nodes is automatically checked out when
+	 * necessary.
+	 * @return true to checkout the versionable nodes, false otherwise
+     * @since 2.1.4
+	 */
+	public boolean isAutoCheckout() {
+		return true;
+	}
+
+	/**
 	 * Check if the import provider for the given file extension should
 	 * be ignored.
 	 * 

Modified: sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java Sat Nov 26 21:40:18 2011
@@ -50,6 +50,7 @@ import java.util.Map.Entry;
 import java.util.regex.Pattern;
 
 import javax.jcr.Item;
+import javax.jcr.ItemNotFoundException;
 import javax.jcr.Node;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
@@ -251,6 +252,7 @@ public class DefaultContentCreator imple
         if ( !isParentImport || this.parentNodeStack.size() > 1 ) {
             // if node already exists but should be overwritten, delete it
             if (!this.ignoreOverwriteFlag && this.configuration.isOverwrite() && parentNode.hasNode(name)) {
+            	checkoutIfNecessary(parentNode);
                 parentNode.getNode(name).remove();
             }
 
@@ -263,6 +265,7 @@ public class DefaultContentCreator imple
             } else if (primaryNodeType == null) {
 
                 // no explicit node type, use repository default
+            	checkoutIfNecessary(parentNode);
                 node = parentNode.addNode(name);
                 addNodeToCreatedList(node);
                 if ( this.importListener != null ) {
@@ -271,6 +274,7 @@ public class DefaultContentCreator imple
             } else {
 
                 // explicit primary node type
+            	checkoutIfNecessary(parentNode);
                 node = parentNode.addNode(name, primaryNodeType);
                 addNodeToCreatedList(node);
                 if ( this.importListener != null ) {
@@ -319,6 +323,7 @@ public class DefaultContentCreator imple
             String propPath = node.getPath() + "/" + name;
             String uuid = getUUID(node.getSession(), propPath, getAbsPath(node, value));
             if (uuid != null) {
+                checkoutIfNecessary(node);
                 node.setProperty(name, uuid, propertyType);
                 
                 if ( this.importListener != null ) {
@@ -337,6 +342,7 @@ public class DefaultContentCreator imple
                 }
             }
         } else if ( propertyType == PropertyType.DATE ) {
+            checkoutIfNecessary(node);
             try {
               node.setProperty(name, parseDateString(value) );
             }
@@ -348,6 +354,7 @@ public class DefaultContentCreator imple
             	this.importListener.onCreate(node.getProperty(name).getPath());
             }
         } else {
+            checkoutIfNecessary(node);
             if (propertyType == PropertyType.UNDEFINED) {
                 node.setProperty(name, value);
             } else {
@@ -383,6 +390,7 @@ public class DefaultContentCreator imple
                 if (uuids[i] == null) hasAll = false;
             }
 
+            checkoutIfNecessary(node);
             node.setProperty(name, uuids, propertyType);
             if ( this.importListener != null ) {
             	this.importListener.onCreate(node.getProperty(name).getPath());
@@ -392,6 +400,7 @@ public class DefaultContentCreator imple
                 delayedMultipleReferences.put(propPath, uuidOrPaths);
             }
         } else if ( propertyType == PropertyType.DATE ) {
+            checkoutIfNecessary(node);
             try {
               // This modification is to remove the colon in the JSON Timezone
               ValueFactory valueFactory = node.getSession().getValueFactory();
@@ -412,6 +421,7 @@ public class DefaultContentCreator imple
             	this.importListener.onCreate(node.getProperty(name).getPath());
             }
         } else {
+            checkoutIfNecessary(node);
             if (propertyType == PropertyType.UNDEFINED) {
                 node.setProperty(name, values);
             } else {
@@ -536,6 +546,7 @@ public class DefaultContentCreator imple
             String name = getName(property);
             Node parentNode = getParentNode(session, property);
             if (parentNode != null) {
+                checkoutIfNecessary(parentNode);
                 if (parentNode.hasProperty(name) && parentNode.getProperty(name).getDefinition().isMultiple()) {
                     boolean hasAll = true;
                     String[] uuidOrPaths = delayedMultipleReferences.get(property);
@@ -640,6 +651,7 @@ public class DefaultContentCreator imple
         }
         if ( value == null ) {
             if ( node.hasProperty(name) ) {
+            	checkoutIfNecessary(node);
             	String propPath = node.getProperty(name).getPath();
                 node.getProperty(name).remove();
                 if ( this.importListener != null ) {
@@ -647,6 +659,7 @@ public class DefaultContentCreator imple
                 }
             }
         } else {
+        	checkoutIfNecessary(node);
             final Value jcrValue = this.createValue(node.getSession().getValueFactory(), value);
             node.setProperty(name, jcrValue);
             if ( this.importListener != null ) {
@@ -665,6 +678,7 @@ public class DefaultContentCreator imple
         }
         if ( values == null || values.length == 0 ) {
             if ( node.hasProperty(name) ) {
+            	checkoutIfNecessary(node);
             	String propPath = node.getProperty(name).getPath();
                 node.getProperty(name).remove();
                 if ( this.importListener != null ) {
@@ -672,6 +686,7 @@ public class DefaultContentCreator imple
                 }
             }
         } else {
+        	checkoutIfNecessary(node);
             final Value[] jcrValues = new Value[values.length];
             for(int i = 0; i < values.length; i++) {
                 jcrValues[i] = this.createValue(node.getSession().getValueFactory(), values[i]);
@@ -752,6 +767,7 @@ public class DefaultContentCreator imple
                 if ( newNodeType == null ) {
                     return false;
                 }
+            	checkoutIfNecessary(node);
                 final Node n = node.addNode(token, newNodeType);
                 addNodeToCreatedList(n);
                 if ( this.importListener != null ) {
@@ -925,4 +941,46 @@ public class DefaultContentCreator imple
         }
         return res.toString();
     }
+    
+
+    /**
+     * Find an ancestor that is versionable
+     */
+    protected Node findVersionableAncestor(Node node) throws RepositoryException {
+    	if (node == null) {
+    		return null;
+    	} else  if (isVersionable(node)) {
+            return node;
+        } else {
+            try {
+                node = node.getParent();
+                return findVersionableAncestor(node);
+            } catch (ItemNotFoundException e) {
+                // top-level
+                return null;
+            }
+        }
+    }
+
+    protected boolean isVersionable(Node node) throws RepositoryException {
+        return node.isNodeType("mix:versionable");
+    }
+
+    /**
+     * Checkout the node if needed
+     */
+    protected void checkoutIfNecessary(Node node) throws RepositoryException {
+        if (this.configuration.isAutoCheckout()) {
+            Node versionableNode = findVersionableAncestor(node);
+            if (versionableNode != null) {
+                if (!versionableNode.isCheckedOut()) {
+                    versionableNode.checkout();
+                    if ( this.importListener != null ) {
+                    	this.importListener.onCheckout(versionableNode.getPath());
+                    }
+                }
+            }
+        }
+    }
+    
 }

Modified: sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentImporter.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentImporter.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentImporter.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentImporter.java Sat Nov 26 21:40:18 2011
@@ -117,6 +117,9 @@ public class DefaultContentImporter exte
         // finally checkin versionable nodes
         for (final Node versionable : contentCreator.getVersionables()) {
             versionable.checkin();
+            if ( importListener != null ) {
+            	importListener.onCheckin(versionable.getPath());
+            }
         }
     }
 

Modified: sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java Sat Nov 26 21:40:18 2011
@@ -68,6 +68,12 @@ public class PathEntry extends ImportOpt
     public static final String CHECKIN_DIRECTIVE = "checkin";
 
     /**
+     * The autoCheckout directive specifying whether versionable nodes should be
+     * checked out when necessary
+     */
+    public static final String AUTOCHECKOUT_DIRECTIVE = "autoCheckout";
+
+    /**
      * The ignore import providers directive specifying whether the available {@link ImportProvider}s
      * should be used during content loading. This is a string value that defaults to the empty
      * string..
@@ -90,6 +96,9 @@ public class PathEntry extends ImportOpt
     /** Should versionable nodes be checked in? */
     private final boolean checkin;
 
+    /** Should versionable nodes be auto checked out when necessary? */
+    private final boolean autoCheckout;
+    
     /** Which import providers should be ignored? @since 2.0.4 */
     private final List<String> ignoreImportProviders;
 
@@ -172,6 +181,14 @@ public class PathEntry extends ImportOpt
             this.checkin = false;
         }
 
+        // autoCheckout directive
+        final String autoCheckoutValue = entry.getDirectiveValue(AUTOCHECKOUT_DIRECTIVE);
+        if (autoCheckoutValue != null) {
+            this.autoCheckout = Boolean.valueOf(autoCheckoutValue);
+        } else {
+            this.autoCheckout = true;
+        }
+
         // expand directive
         this.ignoreImportProviders = new ArrayList<String>();
         final String expandValue = entry.getDirectiveValue(IGNORE_IMPORT_PROVIDERS_DIRECTIVE);
@@ -224,8 +241,16 @@ public class PathEntry extends ImportOpt
     public boolean isCheckin() {
         return this.checkin;
     }
-
+    
     /* (non-Javadoc)
+	 * @see org.apache.sling.jcr.contentloader.ImportOptions#isAutoCheckout()
+	 */
+	@Override
+	public boolean isAutoCheckout() {
+		return this.autoCheckout;
+	}
+
+	/* (non-Javadoc)
 	 * @see org.apache.sling.jcr.contentloader.internal.ImportOptions#isIgnoredImportProvider(java.lang.String)
 	 */
     public boolean isIgnoredImportProvider(String extension) {

Modified: sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java (original)
+++ sling/trunk/bundles/jcr/contentloader/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java Sat Nov 26 21:40:18 2011
@@ -36,7 +36,12 @@ public class DefaultContentCreatorTest {
                 return false;
             }
 
-            @Override
+			@Override
+			public boolean isAutoCheckout() {
+				return true;
+			}
+
+			@Override
             public boolean isIgnoredImportProvider(String extension) {
                 return false;
             }
@@ -53,6 +58,8 @@ public class DefaultContentCreatorTest {
         
         contentCreator.prepareParsing(parentNode, null);
         this.mockery.checking(new Expectations() {{
+        	allowing(parentNode).isNodeType("mix:versionable"); will(returnValue(Boolean.FALSE));
+        	allowing(parentNode).getParent(); will(returnValue(null));
             oneOf (parentNode).hasProperty("foo"); will(returnValue(Boolean.TRUE));
             oneOf (parentNode).setProperty(with(equal("foo")), with(equal("bar")));
         }});
@@ -71,6 +78,11 @@ public class DefaultContentCreatorTest {
             }
 
             @Override
+			public boolean isAutoCheckout() {
+				return true;
+			}
+
+            @Override
             public boolean isIgnoredImportProvider(String extension) {
                 return false;
             }

Modified: sling/trunk/bundles/servlets/post/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/pom.xml?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/pom.xml (original)
+++ sling/trunk/bundles/servlets/post/pom.xml Sat Nov 26 21:40:18 2011
@@ -140,7 +140,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.jcr.contentloader</artifactId>
-            <version>2.1.0</version>
+            <version>2.1.3-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>

Modified: sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/SlingPostConstants.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/SlingPostConstants.java?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/SlingPostConstants.java (original)
+++ sling/trunk/bundles/servlets/post/src/main/java/org/apache/sling/servlets/post/SlingPostConstants.java Sat Nov 26 21:40:18 2011
@@ -466,6 +466,14 @@ public interface SlingPostConstants {
     public static final String RP_CHECKIN = RP_PREFIX + "checkin";
 
     /**
+     * Name of the request parameter indicating whether versionable nodes should
+     * be checked in during an {@link SlingPostConstants#OPERATION_IMPORT} operation.
+     * 
+     * @since 2.1.2
+     */
+    public static final String RP_AUTO_CHECKOUT = RP_PREFIX + "autoCheckout";
+
+    /**
      * Name of the request attribute (not parameter) indicating that a post operation
      * should not invoke session.save() upon completion.
      * 

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=1206611&r1=1206610&r2=1206611&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 Sat Nov 26 21:40:18 2011
@@ -113,6 +113,7 @@ public class ImportOperation extends Abs
         final boolean replace = "true".equalsIgnoreCase(getRequestParamAsString(request, SlingPostConstants.RP_REPLACE));
         final boolean replaceProperties = "true".equalsIgnoreCase(getRequestParamAsString(request, SlingPostConstants.RP_REPLACE_PROPERTIES));
         final boolean checkin = "true".equalsIgnoreCase(getRequestParamAsString(request, SlingPostConstants.RP_CHECKIN));
+        final boolean autoCheckout = "true".equalsIgnoreCase(getRequestParamAsString(request, SlingPostConstants.RP_AUTO_CHECKOUT));
 
         String basePath = getItemPath(request);
         basePath = removeAndValidateWorkspace(basePath, request.getResourceResolver().adaptTo(Session.class));
@@ -176,7 +177,12 @@ public class ImportOperation extends Abs
                                 return checkin;
                             }
 
-                            @Override
+							@Override
+							public boolean isAutoCheckout() {
+								return autoCheckout;
+							}
+
+							@Override
                             public boolean isIgnoredImportProvider(
                                     String extension) {
                                 // this probably isn't important in this context.
@@ -219,7 +225,14 @@ public class ImportOperation extends Abs
                             }
 
                             public void onCopy(String srcPath, String destPath) {
-                                changes.add(Modification.onMoved(srcPath, destPath));
+                                changes.add(Modification.onCopied(srcPath, destPath));
+                            }
+
+                            public void onCheckin(String srcPath) {
+                                changes.add(Modification.onCheckin(srcPath));
+                            }
+                            public void onCheckout(String srcPath) {
+                                changes.add(Modification.onCheckout(srcPath));
                             }
                         });
             }

Modified: sling/trunk/launchpad/integration-tests/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/integration-tests/pom.xml?rev=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/pom.xml (original)
+++ sling/trunk/launchpad/integration-tests/pom.xml Sat Nov 26 21:40:18 2011
@@ -137,7 +137,7 @@
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.servlets.post</artifactId>
-      <version>2.1.0</version>
+      <version>2.1.1-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>

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=1206611&r1=1206610&r2=1206611&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 Sat Nov 26 21:40:18 2011
@@ -32,6 +32,7 @@ import java.util.Set;
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.commons.httpclient.HttpMethod;
 import org.apache.commons.httpclient.NameValuePair;
 import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
@@ -282,6 +283,81 @@ public class PostServletImportTest exten
     }
 
     /**
+     * SLING-2108 Test import operation which auto checks out versionable nodes.
+     */
+    public void testImportAutoCheckoutNodes() 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);
+
+        //1. first create some content to update.
+        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, SERVLET_CONTEXT + 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"));
+
+
+		//2. try an update with the :autoCheckout value set to false
+        List<NameValuePair> postParams = new ArrayList<NameValuePair>();
+        postParams.add(new NameValuePair(SlingPostConstants.RP_OPERATION,
+        						SlingPostConstants.OPERATION_IMPORT));
+        postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT_TYPE, "json"));
+        postParams.add(new NameValuePair(SlingPostConstants.RP_CHECKIN, "true"));
+        postParams.add(new NameValuePair(SlingPostConstants.RP_REPLACE_PROPERTIES, "true"));
+        postParams.add(new NameValuePair(SlingPostConstants.RP_AUTO_CHECKOUT, "false"));
+        postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT, "{ \"abc\": \"def2\" }"));
+        assertPostStatus(importedNodeUrl, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, postParams, "Expected error from VersionException");
+
+		//3. now try an update with the :autoCheckout value set to true
+        postParams.clear();
+        postParams.add(new NameValuePair(SlingPostConstants.RP_OPERATION,
+				SlingPostConstants.OPERATION_IMPORT));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT_TYPE, "json"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_CHECKIN, "true"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_REPLACE_PROPERTIES, "true"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_AUTO_CHECKOUT, "true"));
+		postParams.add(new NameValuePair(SlingPostConstants.RP_CONTENT, "{ \"abc\": \"def2\" }"));
+		postParams.add(new NameValuePair(":http-equiv-accept", "application/json,*/*;q=0.9"));
+        HttpMethod post = assertPostStatus(importedNodeUrl, HttpServletResponse.SC_CREATED, postParams, "Expected 201 status");
+        
+        String responseBodyAsString = post.getResponseBodyAsString();
+		JSONObject responseJSON = new JSONObject(responseBodyAsString);
+        JSONArray changes = responseJSON.getJSONArray("changes");
+        JSONObject checkoutChange = changes.getJSONObject(0);
+        assertEquals("checkout", checkoutChange.getString("type"));
+		
+        // assert content at new location
+        String content2 = getContent(importedNodeUrl + ".json", CONTENT_TYPE_JSON);
+
+		JSONObject jsonObj2 = new JSONObject(content2);
+		assertNotNull(jsonObj2);
+		
+		//make sure it was really updated
+		assertEquals("def2", jsonObj2.getString("abc"));
+		
+		//assert that the versionable node is checked back in.
+		assertFalse(jsonObj.getBoolean("jcr:isCheckedOut"));		
+    }
+    
+    /**
      * Test import operation for a posted json file
      */
     public void testImportJSONFromFile() throws IOException, JSONException {

Modified: 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=1206611&r1=1206610&r2=1206611&view=diff
==============================================================================
--- sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json (original)
+++ sling/trunk/launchpad/integration-tests/src/main/resources/integration-test/servlets/post/testimport3.json Sat Nov 26 21:40:18 2011
@@ -3,5 +3,6 @@
 	"jcr:mixinTypes": [
 		"mix:referenceable",
 		"mix:versionable"
-	]
+	],
+	"abc": "def"
 }
\ No newline at end of file