You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2015/05/18 21:12:18 UTC

svn commit: r1680074 - in /sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src: main/java/org/apache/sling/nosql/generic/resource/impl/ test/java/org/apache/sling/nosql/generic/resource/

Author: sseifert
Date: Mon May 18 19:12:17 2015
New Revision: 1680074

URL: http://svn.apache.org/r1680074
Log:
fix unit tests

Added:
    sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java   (with props)
Modified:
    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/test/java/org/apache/sling/nosql/generic/resource/NoSqlResourceProviderTest.java

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=1680074&r1=1680073&r2=1680074&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 19:12:17 2015
@@ -20,14 +20,13 @@ 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;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ValueMap;
-import org.apache.sling.api.wrappers.ModifiableValueMapDecorator;
-import org.apache.sling.api.wrappers.ValueMapDecorator;
 import org.apache.sling.nosql.generic.adapter.NoSqlData;
 
 /**
@@ -54,7 +53,7 @@ public class NoSqlResource extends Abstr
     }
 
     public String getResourceType() {
-        return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, String.class);
+        return getValueMap().get(ResourceResolver.PROPERTY_RESOURCE_TYPE, JcrConstants.NT_UNSTRUCTURED);
     }
 
     public String getResourceSuperType() {
@@ -68,11 +67,8 @@ public class NoSqlResource extends Abstr
     @SuppressWarnings("unchecked")
     @Override
     public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-        if (type == ValueMap.class || type == Map.class) {
-            return (AdapterType)new ValueMapDecorator(data.getProperties());
-        }
-        if (type == ModifiableValueMap.class) {
-            return (AdapterType)new ModifiableValueMapDecorator(data.getProperties());
+        if (type == ValueMap.class || type == Map.class || type == ModifiableValueMap.class) {
+            return (AdapterType)new NoSqlValueMap(this, data.getProperties());
         }
         return super.adaptTo(type);
     }

Added: 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=1680074&view=auto
==============================================================================
--- sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java (added)
+++ sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java Mon May 18 19:12:17 2015
@@ -0,0 +1,134 @@
+/*
+ * 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.nosql.generic.resource.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+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;
+
+class NoSqlValueMap extends ValueMapDecorator implements ModifiableValueMap {
+
+    private final Resource resource;
+    
+    public NoSqlValueMap(Resource resource) {
+        this(resource, new HashMap<String, Object>());
+    }
+
+    public NoSqlValueMap(Resource resource, Map<String,Object> map) {
+        super(convertForWrite(map));
+        this.resource = resource;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T get(String name, Class<T> type) {
+        
+        // check for deep path access
+        int slashPos = name.lastIndexOf('/');
+        if (slashPos >= 0) {
+            String resourcePath = "./" + name.substring(0, slashPos);
+            String propertyName = name.substring(slashPos + 1);
+            Resource childResource = resource.getChild(resourcePath);
+            if (childResource!=null) {
+                return ResourceUtil.getValueMap(childResource).get(propertyName, type);
+            }
+        }
+        
+        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();
+            }
+            else {
+                return null;
+            }
+        }
+        else if (type == InputStream.class) {
+            // Support conversion from byte array to InputStream
+            byte[] data = get(name, byte[].class);
+            if (data != null) {
+                return (T)new ByteArrayInputStream(data);
+            }
+            else {
+                return null;
+            }
+        }
+        else if ( type == null ) {
+            return (T) super.get(name);
+        }
+        return super.get(name, type);
+    }
+    
+    @Override
+    public Object put(String key, Object value) {
+        return super.put(key, convertForWrite(value));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void putAll(Map<? extends String, ?> map) {
+        super.putAll((Map<? extends String, ?>)convertForWrite(map));
+    }
+    
+    private static Object convertForWrite(Object value) {
+        if (value instanceof Date) {
+            // Store Date values as Calendar values 
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime((Date)value);
+            value = calendar;
+        }
+        else if (value instanceof InputStream) {
+            // Store InputStream values as byte array
+            try {
+                value = IOUtils.toByteArray((InputStream)value);
+            } catch (IOException ex) {
+                throw new RuntimeException("Unable to convert input stream to byte array.");
+            }
+        }
+        return value;
+    }
+    
+    private static Map<String, Object> convertForWrite(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()));
+        }
+        return newMap;
+    }
+
+}

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Mon May 18 19:12:17 2015
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: sling/whiteboard/sseifert/SLING-4381_nosql/nosql-generic/src/main/java/org/apache/sling/nosql/generic/resource/impl/NoSqlValueMap.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 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/NoSqlResourceProviderTest.java?rev=1680074&r1=1680073&r2=1680074&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/NoSqlResourceProviderTest.java Mon May 18 19:12:17 2015
@@ -197,18 +197,10 @@ public class NoSqlResourceProviderTest {
     public void testBinaryData() throws IOException {
         Resource resource1 = this.resourceResolver.getResource(getTestRootResource().getPath() + "/node1");
 
-        Resource binaryPropResource = resource1.getChild("binaryProp");
-        InputStream is = binaryPropResource.adaptTo(InputStream.class);
+        InputStream is = ResourceUtil.getValueMap(resource1).get("binaryProp", InputStream.class);
         byte[] dataFromResource = IOUtils.toByteArray(is);
         is.close();
         assertArrayEquals(BINARY_VALUE, dataFromResource);
-
-        // read second time to ensure not the original input stream was returned
-        // and this time using another syntax
-        InputStream is2 = ResourceUtil.getValueMap(resource1).get("binaryProp", InputStream.class);
-        byte[] dataFromResource2 = IOUtils.toByteArray(is2);
-        is2.close();
-        assertArrayEquals(BINARY_VALUE, dataFromResource2);
     }
 
     @Test