This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-nosql-generic.git
commit 7a4f3ccd75dbf5096457fd3210a0184b9176d61b Author: Stefan Seifert <[email protected]> AuthorDate: Mon Sep 14 21:19:29 2015 +0000 SLING-5024 Sling NoSQL Resource Provider for MongoDB (based on nosql.generic) git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1703061 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 8 +- .../sling/nosql/generic/adapter/MapConverter.java | 87 ++++++++++++++++++++++ .../{NoSqlData.java => MultiValueMode.java} | 31 +++----- .../sling/nosql/generic/adapter/NoSqlData.java | 28 ++++++- .../nosql/generic/adapter/MapConverterTest.java | 79 ++++++++++++++++++++ 5 files changed, 209 insertions(+), 24 deletions(-) diff --git a/pom.xml b/pom.xml index a0fdc71..4e82433 100644 --- a/pom.xml +++ b/pom.xml @@ -88,6 +88,12 @@ <scope>provided</scope> </dependency> <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.3.2</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.compendium</artifactId> <scope>provided</scope> @@ -128,7 +134,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.testing.sling-mock</artifactId> - <version>1.3.0</version> + <version>1.5.0</version> <scope>test</scope> </dependency> <dependency> diff --git a/src/main/java/org/apache/sling/nosql/generic/adapter/MapConverter.java b/src/main/java/org/apache/sling/nosql/generic/adapter/MapConverter.java new file mode 100644 index 0000000..a04c8f6 --- /dev/null +++ b/src/main/java/org/apache/sling/nosql/generic/adapter/MapConverter.java @@ -0,0 +1,87 @@ +/* + * 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.adapter; + +import java.lang.reflect.Array; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.ArrayUtils; + +/** + * Transforms NoSqlData maps to a valid form for couchbase JSON document. + * All arrays have to be transformed to lists. + */ +final class MapConverter { + + private MapConverter() { + // static methods only + } + + /** + * @param map Map with multi-valued arrays + * @return Map with multi-valued lists + */ + public static Map<String, Object> mapArrayToList(Map<String, Object> map) { + for (Map.Entry<String, Object> entry : map.entrySet()) { + if (entry.getValue().getClass().isArray()) { + Class componentType = entry.getValue().getClass().getComponentType(); + if (componentType == int.class) { + entry.setValue(Arrays.asList(ArrayUtils.toObject((int[]) entry.getValue()))); + } + else if (componentType == long.class) { + entry.setValue(Arrays.asList(ArrayUtils.toObject((long[]) entry.getValue()))); + } + else if (componentType == double.class) { + entry.setValue(Arrays.asList(ArrayUtils.toObject((double[]) entry.getValue()))); + } + else if (componentType == boolean.class) { + entry.setValue(Arrays.asList(ArrayUtils.toObject((boolean[]) entry.getValue()))); + } + else { + entry.setValue(Arrays.asList((Object[]) entry.getValue())); + } + } + } + return map; + } + + /** + * @param map Map with multi-valued lists + * @return Map with multi-valued arrays + */ + @SuppressWarnings("unchecked") + public static Map<String, Object> mapListToArray(Map<String, Object> map) { + for (Map.Entry<String, Object> entry : map.entrySet()) { + if (entry.getValue() instanceof List) { + List list = (List) entry.getValue(); + if (list.size() == 0) { + entry.setValue(null); + } + else { + Class type = list.get(0).getClass(); + entry.setValue(list.toArray((Object[]) Array.newInstance(type, list.size()))); + } + } + } + return map; + } + +} diff --git a/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java b/src/main/java/org/apache/sling/nosql/generic/adapter/MultiValueMode.java similarity index 62% copy from src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java copy to src/main/java/org/apache/sling/nosql/generic/adapter/MultiValueMode.java index 2aef8b4..770c93a 100644 --- a/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java +++ b/src/main/java/org/apache/sling/nosql/generic/adapter/MultiValueMode.java @@ -18,30 +18,19 @@ */ package org.apache.sling.nosql.generic.adapter; -import java.util.Map; - -import aQute.bnd.annotation.ProviderType; - /** - * Wrapper for properties of a NoSQL document for a given path. + * Mode for multi-valued field data in {@link NoSqlData properties). */ -@ProviderType -public final class NoSqlData { - - private final String path; - private final Map<String,Object> properties; - - public NoSqlData(String path, Map<String, Object> properties) { - this.path = path; - this.properties = properties; - } +public enum MultiValueMode { - public String getPath() { - return path; - } + /** + * Return multi-valued field values as array (default). + */ + ARRAYS, - public Map<String, Object> getProperties() { - return properties; - } + /** + * Return multi-valued field values as lists. + */ + LISTS } diff --git a/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java b/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java index 2aef8b4..0b52038 100644 --- a/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java +++ b/src/main/java/org/apache/sling/nosql/generic/adapter/NoSqlData.java @@ -32,8 +32,21 @@ public final class NoSqlData { private final Map<String,Object> properties; public NoSqlData(String path, Map<String, Object> properties) { + this(path, properties, MultiValueMode.ARRAYS); + } + + public NoSqlData(String path, Map<String, Object> properties, MultiValueMode multiValueMode) { this.path = path; - this.properties = properties; + switch (multiValueMode) { + case ARRAYS: + this.properties = properties; + break; + case LISTS: + this.properties = MapConverter.mapListToArray(properties); + break; + default: + throw new IllegalArgumentException("Multi value mode not supported: " + multiValueMode); + } } public String getPath() { @@ -41,7 +54,18 @@ public final class NoSqlData { } public Map<String, Object> getProperties() { - return properties; + return getProperties(MultiValueMode.ARRAYS); + } + + public Map<String, Object> getProperties(MultiValueMode multiValueMode) { + switch (multiValueMode) { + case ARRAYS: + return properties; + case LISTS: + return MapConverter.mapArrayToList(properties); + default: + throw new IllegalArgumentException("Multi value mode not supported: " + multiValueMode); + } } } diff --git a/src/test/java/org/apache/sling/nosql/generic/adapter/MapConverterTest.java b/src/test/java/org/apache/sling/nosql/generic/adapter/MapConverterTest.java new file mode 100644 index 0000000..32aa7cd --- /dev/null +++ b/src/test/java/org/apache/sling/nosql/generic/adapter/MapConverterTest.java @@ -0,0 +1,79 @@ +/* + * 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.adapter; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Map; + +import org.apache.sling.nosql.generic.adapter.MapConverter; +import org.junit.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +public class MapConverterTest { + + @Test + public void testMapArrayToList() throws Exception { + Map<String, Object> result = MapConverter.mapArrayToList(Maps.newHashMap(ImmutableMap.<String, Object>builder() + .put("prop1", "value1") + .put("prop2", 2) + .put("stringArray", new String[] { "value1", "value2" }) + .put("integerArray", new Integer[] { 1, 2, 3 }) + .put("integerArray2", new int[] { 1, 2, 3 }) + .put("longArray", new long[] { 1L, 2L }) + .put("doubleArray", new double[] { 1.1d, 1.2d }) + .put("booleanArray", new boolean[] { true, false }) + .build())); + + assertEquals("prop1", "value1", result.get("prop1")); + assertEquals("prop2", 2, result.get("prop2")); + assertEquals("stringArray", ImmutableList.of("value1", "value2"), result.get("stringArray")); + assertEquals("integerArray", ImmutableList.of(1, 2, 3), result.get("integerArray")); + assertEquals("integerArray2", ImmutableList.of(1, 2, 3), result.get("integerArray2")); + assertEquals("longArray", ImmutableList.of(1L, 2L), result.get("longArray")); + assertEquals("doubleArray", ImmutableList.of(1.1d, 1.2d), result.get("doubleArray")); + assertEquals("booleanArray", ImmutableList.of(true, false), result.get("booleanArray")); + } + + @Test + public void testMapListToArray() throws Exception { + Map<String, Object> result = MapConverter.mapListToArray(Maps.newHashMap(ImmutableMap.<String, Object>builder() + .put("prop1", "value1") + .put("prop2", 2) + .put("stringArray", ImmutableList.of("value1", "value2")) + .put("integerArray", ImmutableList.of(1, 2, 3)) + .put("longArray", ImmutableList.of(1L, 2L)) + .put("doubleArray", ImmutableList.of(1.1d, 1.2d)) + .put("booleanArray", ImmutableList.of(true, false)) + .build())); + + assertEquals("prop1", "value1", result.get("prop1")); + assertEquals("prop2", 2, result.get("prop2")); + assertArrayEquals("stringArray", new String[] { "value1", "value2" }, (String[]) result.get("stringArray")); + assertArrayEquals("integerArray", new Integer[] { 1, 2, 3 }, (Integer[]) result.get("integerArray")); + assertArrayEquals("longArray", new Long[] { 1L, 2L }, (Long[]) result.get("longArray")); + assertArrayEquals("doubleArray", new Double[] { 1.1d, 1.2d }, (Double[]) result.get("doubleArray")); + assertArrayEquals("booleanArray", new Boolean[] { true, false }, (Boolean[]) result.get("booleanArray")); + } + +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
