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-query.git

commit 5fa3b5f0d5bc9a143f1b42dac42c95ec3f93e052
Author: Robert Munteanu <[email protected]>
AuthorDate: Thu Jan 22 10:18:01 2015 +0000

    SLING-4325 - SlingQuery doesn't compare multivalue properties
    
    Submitted by: Tomek Rękawek
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1653800 
13f79535-47bb-0310-9956-ffa450edef68
---
 .../query/resource/ResourcePropertyPredicate.java  | 16 +++++-
 .../apache/sling/query/AttributeOperatorTest.java  | 30 ++++++++++++
 ...ResourceMock.java => PropertyResourceMock.java} | 16 +++++-
 .../org/apache/sling/query/mock/ResourceMock.java  | 57 ++++++++++++++--------
 .../sling/query/mock/json/JsonToResource.java      | 44 +++++++++++------
 src/test/resources/sample_tree.json                |  4 +-
 6 files changed, 126 insertions(+), 41 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java 
b/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
index 25ba0ea..356c332 100644
--- 
a/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
+++ 
b/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
@@ -45,7 +45,21 @@ public class ResourcePropertyPredicate implements 
Predicate<Resource> {
                } else if (value == null) {
                        return true;
                } else {
+                       return isEqualToValue(property);
+               }
+       }
+
+       private boolean isEqualToValue(Resource property) {
+               final String[] multiProperty = property.adaptTo(String[].class);
+               if (multiProperty != null) {
+                       for (String p : multiProperty) {
+                               if (operator.accepts(p, value)) {
+                                       return true;
+                               }
+                       }
+                       return false;
+               } else {
                        return operator.accepts(property.adaptTo(String.class), 
value);
                }
        }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/org/apache/sling/query/AttributeOperatorTest.java 
b/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
index e1f0424..3140254 100644
--- a/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
+++ b/src/test/java/org/apache/sling/query/AttributeOperatorTest.java
@@ -37,6 +37,12 @@ public class AttributeOperatorTest {
        }
 
        @Test
+       public void testEqualsWithMultivalue() {
+               SlingQuery query = 
$(tree).children("cq:PageContent[cq:allowedTemplates=other demo template]");
+               assertResourceSetEquals(query.iterator(), "jcr:content");
+       }
+
+       @Test
        public void testNotEquals() {
                SlingQuery query = 
$(tree).children("cq:PageContent[jcr:title=123]");
                assertEmptyIterator(query.iterator());
@@ -49,6 +55,12 @@ public class AttributeOperatorTest {
        }
 
        @Test
+       public void testContainsWithMultivalue() {
+               SlingQuery query = 
$(tree).children("cq:PageContent[cq:allowedTemplates*=her demo templa]");
+               assertResourceSetEquals(query.iterator(), "jcr:content");
+       }
+
+       @Test
        public void testNotContains() {
                SlingQuery query = 
$(tree).children("cq:PageContent[jcr:title*=123]");
                assertEmptyIterator(query.iterator());
@@ -61,6 +73,12 @@ public class AttributeOperatorTest {
        }
 
        @Test
+       public void testContainsWordWithMultivalue() {
+               SlingQuery query = 
$(tree).children("cq:PageContent[cq:allowedTemplates~=template]");
+               assertResourceSetEquals(query.iterator(), "jcr:content");
+       }
+
+       @Test
        public void testNotContainsWord() {
                SlingQuery query = 
$(tree).children("cq:PageContent[jcr:title~=mmons de]");
                assertEmptyIterator(query.iterator());
@@ -73,6 +91,12 @@ public class AttributeOperatorTest {
        }
 
        @Test
+       public void testEndsWithWithMultivalue() {
+               SlingQuery query = 
$(tree).children("cq:PageContent[cq:allowedTemplates$=demo template]");
+               assertResourceSetEquals(query.iterator(), "jcr:content");
+       }
+
+       @Test
        public void testNotEndsWith() {
                SlingQuery query = 
$(tree).children("cq:PageContent[jcr:title$=CQ]");
                assertEmptyIterator(query.iterator());
@@ -97,6 +121,12 @@ public class AttributeOperatorTest {
        }
 
        @Test
+       public void testStartsWithWithMultivalue() {
+               SlingQuery query = 
$(tree).children("cq:PageContent[cq:allowedTemplates^=other demo]");
+               assertResourceSetEquals(query.iterator(), "jcr:content");
+       }
+
+       @Test
        public void testNotStartsWith() {
                SlingQuery query = 
$(tree).children("cq:PageContent[jcr:title^=Commons]");
                assertEmptyIterator(query.iterator());
diff --git a/src/test/java/org/apache/sling/query/mock/StringResourceMock.java 
b/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
similarity index 83%
rename from src/test/java/org/apache/sling/query/mock/StringResourceMock.java
rename to src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
index 8407e78..55380c7 100644
--- a/src/test/java/org/apache/sling/query/mock/StringResourceMock.java
+++ b/src/test/java/org/apache/sling/query/mock/PropertyResourceMock.java
@@ -26,7 +26,7 @@ import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
 
-public class StringResourceMock implements Resource {
+public class PropertyResourceMock implements Resource {
 
        private final String name;
 
@@ -34,10 +34,20 @@ public class StringResourceMock implements Resource {
 
        private final String value;
 
-       public StringResourceMock(Resource parent, String name, String value) {
+       private final String[] values;
+
+       public PropertyResourceMock(Resource parent, String name, String value) 
{
                this.parent = parent;
                this.name = name;
                this.value = value;
+               this.values = null;
+       }
+
+       public PropertyResourceMock(Resource parent, String name, String[] 
values) {
+               this.parent = parent;
+               this.name = name;
+               this.value = null;
+               this.values = values;
        }
 
        @SuppressWarnings("unchecked")
@@ -45,6 +55,8 @@ public class StringResourceMock implements Resource {
        public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
                if (type.isAssignableFrom(String.class)) {
                        return (AdapterType) value;
+               } else if (type.isAssignableFrom(String[].class)) {
+                       return (AdapterType) (value == null ? values : new 
String[] { value });
                } else {
                        return null;
                }
diff --git a/src/test/java/org/apache/sling/query/mock/ResourceMock.java 
b/src/test/java/org/apache/sling/query/mock/ResourceMock.java
index 6d8c524..39d7804 100644
--- a/src/test/java/org/apache/sling/query/mock/ResourceMock.java
+++ b/src/test/java/org/apache/sling/query/mock/ResourceMock.java
@@ -19,9 +19,12 @@
 
 package org.apache.sling.query.mock;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.sling.api.resource.Resource;
@@ -34,19 +37,12 @@ public class ResourceMock implements Resource {
 
        private final Map<String, Resource> children;
 
-       private final Map<String, String> properties;
-
        private final Resource parent;
 
        public ResourceMock(Resource parent, String name) {
                this.name = name;
                this.parent = parent;
                this.children = new LinkedHashMap<String, Resource>();
-               this.properties = new LinkedHashMap<String, String>();
-       }
-
-       public void setProperty(String name, String value) {
-               properties.put(name, value);
        }
 
        public void addChild(Resource resource) {
@@ -65,7 +61,13 @@ public class ResourceMock implements Resource {
 
        @Override
        public Iterator<Resource> listChildren() {
-               return children.values().iterator();
+               List<Resource> nonProperties = new ArrayList<Resource>();
+               for (Resource r : children.values()) {
+                       if (!(r instanceof PropertyResourceMock)) {
+                               nonProperties.add(r);
+                       }
+               }
+               return nonProperties.iterator();
        }
 
        @Override
@@ -76,13 +78,10 @@ public class ResourceMock implements Resource {
                        if (children.containsKey(firstPart)) {
                                return children.get(firstPart).getChild(rest);
                        }
-               } else {
-                       if (children.containsKey(relPath)) {
-                               return children.get(relPath);
-                       } else if (properties.containsKey(relPath)) {
-                               return new StringResourceMock(this, relPath, 
properties.get(relPath));
-                       }
+               } else if (children.containsKey(relPath)) {
+                       return children.get(relPath);
                }
+
                return null;
        }
 
@@ -90,7 +89,18 @@ public class ResourceMock implements Resource {
        @Override
        public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
                if (type.isAssignableFrom(Map.class)) {
-                       return (AdapterType) properties;
+                       Map<String, Object> map = new LinkedHashMap<String, 
Object>();
+                       for (Entry<String, Resource> e : children.entrySet()) {
+                               Resource o = e.getValue();
+                               String[] stringArray = 
o.adaptTo(String[].class);
+                               String stringValue = o.adaptTo(String.class);
+                               if (stringValue != null) {
+                                       map.put(e.getKey(), stringValue);
+                               } else if (stringArray != null) {
+                                       map.put(e.getKey(), stringArray);
+                               }
+                       }
+                       return (AdapterType) map;
                } else {
                        return null;
                }
@@ -99,16 +109,16 @@ public class ResourceMock implements Resource {
        @Override
        public boolean isResourceType(String resourceType) {
                return StringUtils.isNotBlank(resourceType)
-                               && 
(resourceType.equals(properties.get("sling:resourceType")) || resourceType
-                                               
.equals(properties.get("jcr:primaryType")));
+                               && 
(resourceType.equals(getPropertyAsString("sling:resourceType")) || resourceType
+                                               
.equals(getPropertyAsString("jcr:primaryType")));
        }
 
        @Override
        public String getResourceType() {
-               if (properties.containsKey("sling:resourceType")) {
-                       return properties.get("sling:resourceType");
+               if (children.containsKey("sling:resourceType")) {
+                       return getPropertyAsString("sling:resourceType");
                } else {
-                       return properties.get("jcr:primaryType");
+                       return getPropertyAsString("jcr:primaryType");
                }
        }
 
@@ -141,4 +151,11 @@ public class ResourceMock implements Resource {
                return String.format("ResourceMock[%s]", name);
        }
 
+       private String getPropertyAsString(String name) {
+               if (children.containsKey(name)) {
+                       return children.get(name).adaptTo(String.class);
+               }
+               return null;
+       }
+
 }
diff --git a/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java 
b/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
index b7a30fc..3635ce1 100644
--- a/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
+++ b/src/test/java/org/apache/sling/query/mock/json/JsonToResource.java
@@ -21,16 +21,17 @@ package org.apache.sling.query.mock.json;
 
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.util.LinkedHashMap;
-import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.query.mock.ResourceMock;
+import org.apache.sling.query.mock.PropertyResourceMock;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.google.gson.JsonPrimitive;
 
 public final class JsonToResource {
        private JsonToResource() {
@@ -41,23 +42,34 @@ public final class JsonToResource {
                return parseResource(element.getAsJsonObject(), "/", null);
        }
 
-       private static Resource parseResource(JsonObject object, String name, 
Resource parent) {
-               Map<String, String> properties = new LinkedHashMap<String, 
String>();
-               Map<String, JsonObject> children = new LinkedHashMap<String, 
JsonObject>();
-               for (Entry<String, JsonElement> entry : object.entrySet()) {
-                       JsonElement value = entry.getValue();
-                       if (value.isJsonPrimitive()) {
-                               properties.put(entry.getKey(), 
value.getAsString());
-                       } else if (value.isJsonObject()) {
-                               children.put(entry.getKey(), 
value.getAsJsonObject());
-                       }
+       private static Resource parseResource(JsonElement object, String name, 
Resource parent) {
+               if (object.isJsonArray()) {
+                       return parseResource(object.getAsJsonArray(), name, 
parent);
+               } else if (object.isJsonPrimitive()) {
+                       return parseResource(object.getAsJsonPrimitive(), name, 
parent);
+               } else if (object.isJsonObject()) {
+                       return parseResource(object.getAsJsonObject(), name, 
parent);
+               } else {
+                       return null;
                }
+       }
 
-               ResourceMock resource = new ResourceMock(parent, name);
-               for (Entry<String, String> entry : properties.entrySet()) {
-                       resource.setProperty(entry.getKey(), entry.getValue());
+       private static Resource parseResource(JsonArray array, String name, 
Resource parent) {
+               final String[] values = new String[array.size()];
+               int i = 0;
+               for (JsonElement e : array) {
+                       values[i++] = e.getAsString();
                }
-               for (Entry<String, JsonObject> entry : children.entrySet()) {
+               return new PropertyResourceMock(parent, name, values);
+       }
+
+       private static Resource parseResource(JsonPrimitive primitive, String 
name, Resource parent) {
+               return new PropertyResourceMock(parent, name, 
primitive.getAsString());
+       }
+
+       private static Resource parseResource(JsonObject object, String name, 
Resource parent) {
+               ResourceMock resource = new ResourceMock(parent, name);
+               for (Entry<String, JsonElement> entry : object.entrySet()) {
                        resource.addChild(parseResource(entry.getValue(), 
entry.getKey(), resource));
                }
                return resource;
diff --git a/src/test/resources/sample_tree.json 
b/src/test/resources/sample_tree.json
index 03cab87..5009db9 100644
--- a/src/test/resources/sample_tree.json
+++ b/src/test/resources/sample_tree.json
@@ -6,8 +6,8 @@
     "redirectTarget": "/content/cqc-demo/home",
     "sling:resourceType": "demo/core/renderers/redirectRenderer",
     "cq:allowedTemplates": [
-      "/apps/demo/.*/templates(.*)?",
-      "/apps/cq-commons(.*)?"
+      "some demo template",
+      "other demo template"
     ],
     "jcr:title": "CQ Commons demo",
     "cq:designPath": "/etc/designs/demo",

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to