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());