You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:55:25 UTC
[sling-org-apache-sling-models-impl] 12/16: SLING-3677 - converting
arrays to lists in ValueMapInjector. Thanks to Krystian Panek for the
patch!
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to annotated tag org.apache.sling.models.impl-1.0.6
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-models-impl.git
commit e95b12226206370f4666f0cca1d1ce2390f58aea
Author: Justin Edelson <ju...@apache.org>
AuthorDate: Tue Jun 24 18:56:45 2014 +0000
SLING-3677 - converting arrays to lists in ValueMapInjector. Thanks to Krystian Panek for the patch!
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/models/impl@1605153 13f79535-47bb-0310-9956-ffa450edef68
---
.../models/impl/injectors/ValueMapInjector.java | 23 ++++++++++++
.../models/impl/ResourceModelClassesTest.java | 21 +++++++++++
.../sling/models/testmodels/classes/ListModel.java | 41 ++++++++++++++++++++++
3 files changed, 85 insertions(+)
diff --git a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
index ee2d419..9c4a123 100644
--- a/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
+++ b/src/main/java/org/apache/sling/models/impl/injectors/ValueMapInjector.java
@@ -18,7 +18,11 @@ package org.apache.sling.models.impl.injectors;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Array;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
import org.apache.commons.lang.ClassUtils;
import org.apache.commons.lang.StringUtils;
@@ -83,6 +87,25 @@ public class ValueMapInjector implements Injector, InjectAnnotationProcessorFact
}
return null;
}
+ } else if (type instanceof ParameterizedType) {
+ // list support
+ ParameterizedType pType = (ParameterizedType) type;
+ if (pType.getActualTypeArguments().length != 1) {
+ return null;
+ }
+ Class<?> collectionType = (Class<?>) pType.getRawType();
+ if (!(collectionType.equals(Collection.class) || collectionType.equals(List.class))) {
+ return null;
+ }
+
+ Class<?> itemType = (Class<?>) pType.getActualTypeArguments()[0];
+ Object array = map.get(name, Array.newInstance(itemType, 0).getClass());
+ if (array == null) {
+ return null;
+
+ }
+
+ return Arrays.asList((Object[]) array);
} else {
log.debug("ValueMapInjector doesn't support non-class types {}", type);
return null;
diff --git a/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java b/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
index 52d41f8..3f020a9 100644
--- a/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
+++ b/src/test/java/org/apache/sling/models/impl/ResourceModelClassesTest.java
@@ -35,6 +35,7 @@ import org.apache.sling.models.testmodels.classes.ArrayWrappersModel;
import org.apache.sling.models.testmodels.classes.ChildModel;
import org.apache.sling.models.testmodels.classes.ChildResourceModel;
import org.apache.sling.models.testmodels.classes.ChildValueMapModel;
+import org.apache.sling.models.testmodels.classes.ListModel;
import org.apache.sling.models.testmodels.classes.ParentModel;
import org.apache.sling.models.testmodels.classes.ResourceModelWithRequiredField;
import org.apache.sling.models.testmodels.classes.ResourceModelWithRequiredFieldOptionalStrategy;
@@ -141,6 +142,26 @@ public class ResourceModelClassesTest {
}
@Test
+ public void testListModel() {
+ Map<String, Object> map = new HashMap<String, Object>();
+ map.put("intList", new Integer[] {1, 2, 9, 8});
+ map.put("stringList", new String[] {"hello", "world"});
+
+ ValueMap vm = new ValueMapDecorator(map);
+ Resource res = mock(Resource.class);
+ when(res.adaptTo(ValueMap.class)).thenReturn(vm);
+
+ ListModel model = factory.getAdapter(res, ListModel.class);
+ assertNotNull(model);
+
+ assertEquals(4, model.getIntList().size());
+ assertEquals(new Integer(2), model.getIntList().get(1));
+
+ assertEquals(2, model.getStringList().size());
+ assertEquals("hello", model.getStringList().get(0));
+ }
+
+ @Test
public void testRequiredPropertyModel() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("first", "first-value");
diff --git a/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java b/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java
new file mode 100644
index 0000000..b2ec3aa
--- /dev/null
+++ b/src/test/java/org/apache/sling/models/testmodels/classes/ListModel.java
@@ -0,0 +1,41 @@
+/*
+ * 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.models.testmodels.classes;
+
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.models.annotations.Model;
+
+import javax.inject.Inject;
+import java.util.List;
+
+@Model(adaptables = Resource.class)
+public class ListModel {
+
+ @Inject
+ private List<Integer> intList;
+
+ @Inject
+ private List<String> stringList;
+
+ public List<Integer> getIntList() {
+ return intList;
+ }
+
+ public List<String> getStringList() {
+ return stringList;
+ }
+}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.