Author: sseifert
Date: Mon May 18 20:17:35 2015
New Revision: 1680086

URL: http://svn.apache.org/r1680086
Log:
convert non-primitive value map objects to strings

Added:
    
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProviderTest.java
      - copied, changed from r1680074, 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java
Removed:
    
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java
Modified:
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml
    
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
    
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
    
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java

Modified: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml?rev=1680086&r1=1680085&r2=1680086&view=diff
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml (original)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/pom.xml Mon May 18 
20:17:35 2015
@@ -38,6 +38,10 @@
         
<developerConnection>scm:svn:https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/nosql-generic</developerConnection>
         
<url>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/nosql-generic</url>
     </scm>
+    
+    <properties>
+        <sling.java.version>7</sling.java.version>
+    </properties>
 
     <build>
         <plugins>
@@ -86,6 +90,12 @@
             <artifactId>servlet-api</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+            <scope>provided</scope>
+        </dependency>
 
         <dependency>
             <groupId>junit</groupId>

Modified: 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java?rev=1680086&r1=1680085&r2=1680086&view=diff
==============================================================================
--- 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
 (original)
+++ 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResource.java
 Mon May 18 20:17:35 2015
@@ -20,7 +20,6 @@ package org.apache.sling.nosql.generic.r
 
 import java.util.Map;
 
-import org.apache.jackrabbit.JcrConstants;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.resource.AbstractResource;
 import org.apache.sling.api.resource.ModifiableValueMap;
@@ -53,7 +52,7 @@ public class NoSqlResource extends Abstr
     }
 
     public String getResourceType() {
-        return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, 
JcrConstants.NT_UNSTRUCTURED);
+        return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, 
"nt:unstructured");
     }
 
     public String getResourceSuperType() {

Modified: 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java?rev=1680086&r1=1680085&r2=1680086&view=diff
==============================================================================
--- 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
 (original)
+++ 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProvider.java
 Mon May 18 20:17:35 2015
@@ -31,7 +31,6 @@ import java.util.regex.Pattern;
 
 import javax.servlet.http.HttpServletRequest;
 
-import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.resource.ModifyingResourceProvider;
 import org.apache.sling.api.resource.PersistenceException;
@@ -112,7 +111,7 @@ public class NoSqlResourceProvider imple
 
     private boolean isDeleted(String path) {
         for (String deletedPath : deletedResources) {
-            return StringUtils.equals(path, deletedPath) || 
StringUtils.startsWith(path, deletedPath + "/");
+            return path.equals(deletedPath) || path.equals(deletedPath + "/");
         }
         return false;
     }

Modified: 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java?rev=1680086&r1=1680085&r2=1680086&view=diff
==============================================================================
--- 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
 (original)
+++ 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
 Mon May 18 20:17:35 2015
@@ -21,20 +21,30 @@ package org.apache.sling.nosql.generic.r
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
+import javax.xml.bind.DatatypeConverter;
+
 import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.util.ISO8601;
 import org.apache.sling.api.resource.ModifiableValueMap;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.wrappers.ValueMapDecorator;
 
+/**
+ * Enhances ValueMap that adds special support for deep path access.
+ * Additionally date and binary types are converted to string and back when 
reading.
+ * Besides this only primitive types String, Integer, Long, Double, Boolean 
and arrays of them are supported.
+ */
 class NoSqlValueMap extends ValueMapDecorator implements ModifiableValueMap {
-
+    
     private final Resource resource;
     
     public NoSqlValueMap(Resource resource) {
@@ -42,7 +52,7 @@ class NoSqlValueMap extends ValueMapDeco
     }
 
     public NoSqlValueMap(Resource resource, Map<String,Object> map) {
-        super(convertForWrite(map));
+        super(convertForWriteAll(map));
         this.resource = resource;
     }
 
@@ -62,22 +72,26 @@ class NoSqlValueMap extends ValueMapDeco
         }
         
         if (type == Calendar.class) {
-            // Support conversion of String to Calendar if value conforms to 
ISO8601 date format
-            Object value = get(name);
-            if (value instanceof String) {
-                return (T)ISO8601.parse((String)value);
-            }
-        }
-        else if (type == Date.class) {
-            // Support conversion from Calendar to Date
-            Calendar calendar = get(name, Calendar.class);
-            if (calendar != null) {
-                return (T)calendar.getTime();
+            Date date = get(name, Date.class);
+            if (date != null) {
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(date);
+                return (T)calendar;
             }
             else {
                 return null;
             }
         }
+        else if (type == Date.class) {
+            Object value = get(name);
+            if (value instanceof String) {
+                try {
+                    return (T)getISO8601Format().parse((String)value);
+                } catch (ParseException e) {
+                    return null;
+                }
+            }
+        }
         else if (type == InputStream.class) {
             // Support conversion from byte array to InputStream
             byte[] data = get(name, byte[].class);
@@ -88,6 +102,13 @@ class NoSqlValueMap extends ValueMapDeco
                 return null;
             }
         }
+        else if (type == byte[].class) {
+            // Support conversion from base64 string to byte array
+            Object value = get(name);
+            if (value instanceof String) {
+                return (T)DatatypeConverter.parseBase64Binary((String)value);
+            }
+        }
         else if ( type == null ) {
             return (T) super.get(name);
         }
@@ -102,28 +123,47 @@ class NoSqlValueMap extends ValueMapDeco
     @SuppressWarnings("unchecked")
     @Override
     public void putAll(Map<? extends String, ?> map) {
-        super.putAll((Map<? extends String, ?>)convertForWrite(map));
+        super.putAll((Map<? extends String, ?>)convertForWriteAll((Map<String, 
Object>)map));
     }
     
     private static Object convertForWrite(Object value) {
+        if (value instanceof Calendar) {
+            value = getISO8601Format().format(((Calendar)value).getTime());
+        }
         if (value instanceof Date) {
-            // Store Date values as Calendar values 
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime((Date)value);
-            value = calendar;
+            value = getISO8601Format().format((Date)value);
         }
         else if (value instanceof InputStream) {
             // Store InputStream values as byte array
             try {
-                value = IOUtils.toByteArray((InputStream)value);
+                value = 
convertForWrite(IOUtils.toByteArray((InputStream)value));
             } catch (IOException ex) {
                 throw new RuntimeException("Unable to convert input stream to 
byte array.");
             }
         }
+        else if (value instanceof byte[]) {
+            value = DatatypeConverter.printBase64Binary((byte[])value);
+        }
+        else if (value != null && !isValidPrimitveType(value.getClass())) {
+            throw new IllegalArgumentException("Data type not supported for 
NoSqlValueMap: " + value.getClass());
+        }
         return value;
     }
     
-    private static Map<String, Object> convertForWrite(Map<String, Object> 
map) {
+    static boolean isValidPrimitveType(Class clazz) {
+        if (clazz.isArray()) {
+            return isValidPrimitveType(clazz.getComponentType());
+        }
+        else {
+            return clazz == String.class
+                    || clazz == Integer.class
+                    || clazz == Long.class
+                    || clazz == Double.class
+                    || clazz == Boolean.class;
+        }
+    }
+    
+    private static Map<String, Object> convertForWriteAll(Map<String, Object> 
map) {
         Map<String,Object> newMap = new HashMap<String, Object>();
         for (Map.Entry<String, Object> entry : map.entrySet()) {
             newMap.put(entry.getKey(), convertForWrite(entry.getValue()));
@@ -131,4 +171,8 @@ class NoSqlValueMap extends ValueMapDeco
         return newMap;
     }
 
+    private static DateFormat getISO8601Format() {
+        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
+    }
+
 }

Copied: 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProviderTest.java
 (from r1680074, 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java)
URL: 
http://svn.apache.org/viewvc/sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProviderTest.java?p2=sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProviderTest.java&p1=sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java&r1=1680074&r2=1680086&rev=1680086&view=diff
==============================================================================
--- 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java
 (original)
+++ 
sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/test/java/org/apache/sling/nosql/generic/resource/impl/NoSqlResourceProviderTest.java
 Mon May 18 20:17:35 2015
@@ -16,11 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.nosql.generic.resource;
+package org.apache.sling.nosql.generic.resource.impl;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -204,6 +205,17 @@ public class NoSqlResourceProviderTest {
     }
 
     @Test
+    public void testValueMapTypes() throws IOException {
+        Resource resource1 = 
this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1");
+
+        // ensure that value map has only supported primitive types (all other 
supported types converted to string)
+        ValueMap valueMap = resource1.getValueMap();
+        for (Map.Entry<String, Object> entry : valueMap.entrySet()) {
+            
assertTrue(NoSqlValueMap.isValidPrimitveType(entry.getValue().getClass()));
+        }
+    }
+
+    @Test
     public void testPrimaryTypeResourceType() throws PersistenceException {
         Resource resource = 
this.resourceResolver.getResource(getTestRootResource().getPath());
         assertEquals(JcrConstants.NT_UNSTRUCTURED, resource.getResourceType());


Reply via email to