You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2007/11/27 16:15:35 UTC

svn commit: r598667 - in /incubator/sling/trunk/microsling/microsling-core/src: main/java/org/apache/sling/microsling/slingservlets/ test/java/org/apache/sling/microsling/integration/microjax/

Author: bdelacretaz
Date: Tue Nov 27 07:15:34 2007
New Revision: 598667

URL: http://svn.apache.org/viewvc?rev=598667&view=rev
Log:
SLING-92, MicrojaxAutoPropertiesTest added, tests automatic setting of values for the 'created, createdBy, lastModified, lastModifiedBy' properties for microjax POST requests, when such properties are provided with empty values

Added:
    incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java   (with props)
Modified:
    incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPostServlet.java
    incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPropertyValueSetter.java

Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPostServlet.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPostServlet.java?rev=598667&r1=598666&r2=598667&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPostServlet.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPostServlet.java Tue Nov 27 07:15:34 2007
@@ -185,9 +185,9 @@
             // request to create a new node at a specific path - use the supplied path as is
         }
         
-        Set<Node> changedNodes = new HashSet<Node>();
+        Set<Node> createdNodes = new HashSet<Node>();
         if(currentNode == null) {
-            currentNode = deepCreateNode(s, currentPath, changedNodes);
+            currentNode = deepCreateNode(s, currentPath, createdNodes);
         }
         currentPath = currentNode.getPath();
         
@@ -198,7 +198,7 @@
         }
         
         // walk the request parameters, create and save nodes and properties
-        setPropertiesFromRequest(currentNode, request, savePrefix, changedNodes);
+        setPropertiesFromRequest(currentNode, request, savePrefix, createdNodes);
         
         // sava data and find out where to redirect
         s.save();
@@ -225,10 +225,9 @@
 
     /** Set Node properties from current request 
      *  TODO should handle file uploads as well
-     *  @return the Set of changed Nodes, if any (empty Set if none)
      */
-    private Set<Node> setPropertiesFromRequest(Node n, SlingHttpServletRequest request, 
-            String savePrefix, Set<Node> changedNodes)
+    private void setPropertiesFromRequest(Node n, SlingHttpServletRequest request, 
+            String savePrefix, Set<Node> createdNodes)
             throws RepositoryException {
         
         for(Map.Entry<String, RequestParameter[]>  e : request.getRequestParameterMap().entrySet()) {
@@ -237,16 +236,14 @@
                 if(!name.startsWith(savePrefix)) continue;
                 name = name.substring(savePrefix.length());
             }
-            setProperty(n,request,name,e.getValue(),changedNodes);
+            setProperty(n,request,name,e.getValue(),createdNodes);
         }
-        
-        return changedNodes;
     }
     
     /** Set a single Property on node N 
      * @throws RepositoryException */
     private void setProperty(Node n, SlingHttpServletRequest request, String name, 
-            RequestParameter[] values, Set<Node> changedNodes) throws RepositoryException {
+            RequestParameter[] values, Set<Node> createdNodes) throws RepositoryException {
         
         // split the relative path identifying the property to be saved
         String proppath = name;
@@ -280,19 +277,17 @@
         final Session s = n.getSession();
         Node parent;
         if(name.startsWith("/")) {
-            parent = deepCreateNode(s, parentpath, changedNodes);
-            changedNodes.add(parent);
+            parent = deepCreateNode(s, parentpath, createdNodes);
             
         } else if (!parentpath.equals("")) {
             parent = (Node) s.getItem(path + "/" + parentpath);
         } else {
             parent = (Node) s.getItem(path);
         }
-        changedNodes.add(parent);
         
         // TODO String typehint = request.getParameter(proppath + "@TypeHint");
         final String typeHint = null;
-        final boolean nodeIsNew = changedNodes.contains(parent); 
+        final boolean nodeIsNew = createdNodes.contains(parent); 
         propertyValueSetter.setProperty(parent, propname, values, typeHint, nodeIsNew);
 }
 

Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPropertyValueSetter.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPropertyValueSetter.java?rev=598667&r1=598666&r2=598667&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPropertyValueSetter.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/slingservlets/MicrojaxPropertyValueSetter.java Tue Nov 27 07:15:34 2007
@@ -48,13 +48,16 @@
     void setProperty(Node parent, String name, RequestParameter[] values, String typehint, boolean nodeWasJustCreated)
             throws RepositoryException {
 
+        // set the same timestamp for all values, to ease testing
+        final Calendar now = Calendar.getInstance();
+        
         if (valueProvided(values)) {
             // if user provided a value, don't mess with it
             setPropertyAsIs(parent, name, values, typehint);
 
         } else if (CREATED_FIELD.equals(name)) {
             if (nodeWasJustCreated) {
-                setCurrentDate(parent, name);
+                setCurrentDate(parent, name, now);
             }
 
         } else if (CREATED_BY_FIELD.equals(name)) {
@@ -63,7 +66,7 @@
             }
 
         } else if (LAST_MODIFIED_FIELD.equals(name)) {
-            setCurrentDate(parent, name);
+            setCurrentDate(parent, name, now);
 
         } else if (LAST_MODIFIED_BY_FIELD.equals(name)) {
             setCurrentUser(parent, name);
@@ -75,9 +78,9 @@
     }
 
     /** set property to the current Date */
-    private void setCurrentDate(Node parent, String name) throws RepositoryException {
+    private void setCurrentDate(Node parent, String name, Calendar now) throws RepositoryException {
         removePropertyIfExists(parent, name);
-        parent.setProperty(name, Calendar.getInstance());
+        parent.setProperty(name, now);
     }
 
     /** set property to the current User id */
@@ -127,7 +130,8 @@
         boolean result = false;
 
         for (RequestParameter p : values) {
-            if(p!=null && p.getString()!=null) {
+            final String val = p.getString();
+            if(val!=null && val.length() > 0) {
                 result = true;
                 break;
             }

Added: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java?rev=598667&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java Tue Nov 27 07:15:34 2007
@@ -0,0 +1,102 @@
+/*
+ * 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.microsling.integration.microjax;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.sling.microsling.integration.MicroslingHttpTestBase;
+
+/** {#link MicrojaxPropertyValueSetter} sets the value of some properties
+ *  automatically if they are empty. This is tested here with various cases.
+ */  
+
+public class MicrojaxAutoPropertiesTest extends MicroslingHttpTestBase {
+
+    public static final String TEST_BASE_PATH = "/microjax-tests";
+    private String postUrl;
+    
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        postUrl = HTTP_BASE_URL + TEST_BASE_PATH + "/" + System.currentTimeMillis();
+    }
+    
+   public void testPostPathIsUnique() throws IOException {
+        assertHttpStatus(postUrl, HttpServletResponse.SC_NOT_FOUND,
+                "Path must not exist before test: " + postUrl);
+    }
+
+    public void testCreatedAndModified() throws IOException {
+        final Map <String, String> props = new HashMap <String, String> ();
+        props.put("a","123");
+        
+        props.put("created","");
+        props.put("createdBy","");
+        props.put("lastModified","");
+        props.put("lastModifiedBy","");
+        
+        final String createdNodeUrl = testClient.createNode(postUrl + "/*", props);
+        String content = getContent(createdNodeUrl + ".json", CONTENT_TYPE_JSON);
+        
+        assertJavascript("123", content, "out.println(data.a)");
+        assertJavascript("admin", content, "out.println(data.createdBy)");
+        assertJavascript("admin", content, "out.println(data.lastModifiedBy)");
+        assertJavascript("true", content, "out.println(data.created.length > 0)");
+        assertJavascript("true", content, "out.println(data.lastModified.length > 0)");
+        assertJavascript("true", content, "out.println(data.lastModified == data.created)");
+
+        // update node and check that "last modified" has changed
+        try {
+            Thread.sleep(1000L);
+        } catch(InterruptedException ignored) {
+            // ignore
+        }
+        
+        testClient.createNode(createdNodeUrl, props);
+        content = getContent(createdNodeUrl + ".json", CONTENT_TYPE_JSON);
+        
+        assertJavascript("123", content, "out.println(data.a)");
+        assertJavascript("admin", content, "out.println(data.createdBy)");
+        assertJavascript("admin", content, "out.println(data.lastModifiedBy)");
+        assertJavascript("true", content, "out.println(data.created.length > 0)");
+        assertJavascript("true", content, "out.println(data.lastModified.length > 0)");
+        assertJavascript("true", content, "out.println(data.lastModified > data.created)");
+    }
+    
+    public void testWithSpecificValues() throws IOException {
+        final Map <String, String> props = new HashMap <String, String> ();
+        props.put("a","123");
+        
+        props.put("created","a");
+        props.put("createdBy","b");
+        props.put("lastModified","c");
+        props.put("lastModifiedBy","d");
+        
+        final String createdNodeUrl = testClient.createNode(postUrl + "/*", props);
+        final String content = getContent(createdNodeUrl + ".json", CONTENT_TYPE_JSON);
+        
+        assertJavascript("123", content, "out.println(data.a)");
+        assertJavascript("a", content, "out.println(data.created)");
+        assertJavascript("b", content, "out.println(data.createdBy)");
+        assertJavascript("c", content, "out.println(data.lastModified)");
+        assertJavascript("d", content, "out.println(data.lastModifiedBy)");
+    }
+}

Propchange: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/microjax/MicrojaxAutoPropertiesTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL