You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by bd...@apache.org on 2023/01/25 20:47:51 UTC

[directory-scimple] branch filter-traverse-maps created (now a1aa271f)

This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a change to branch filter-traverse-maps
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git


      at a1aa271f Allow for InMemoryScimFilterMatcher to traverse maps

This branch includes the following new commits:

     new a1aa271f Allow for InMemoryScimFilterMatcher to traverse maps

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[directory-scimple] 01/01: Allow for InMemoryScimFilterMatcher to traverse maps

Posted by bd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

bdemers pushed a commit to branch filter-traverse-maps
in repository https://gitbox.apache.org/repos/asf/directory-scimple.git

commit a1aa271f1cf10952669a223a0c04db089d5d98d3
Author: Brian Demers <bd...@apache.org>
AuthorDate: Wed Jan 25 15:42:14 2023 -0500

    Allow for InMemoryScimFilterMatcher to traverse maps
---
 .../scim/spec/filter/FilterExpressions.java         | 13 +++++++++++++
 .../scim/spec/filter/InMemoryScimFilterMatcher.java | 21 +++++++++++++--------
 .../spec/filter/attribute/AttributeReference.java   |  8 ++++++++
 3 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
index 5e47b100..32699031 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/FilterExpressions.java
@@ -3,6 +3,7 @@ package org.apache.directory.scim.spec.filter;
 import org.apache.directory.scim.spec.resources.ScimResource;
 import org.apache.directory.scim.spec.schema.Schema;
 
+import java.util.Map;
 import java.util.function.Predicate;
 
 
@@ -31,4 +32,16 @@ public final class FilterExpressions {
   public static Predicate<Object> inMemory(FilterExpression expression, Schema schema) {
     return InMemoryScimFilterMatcher.toPredicate(expression, schema);
   }
+
+  public static <R> Predicate<R> inMemoryMap(FilterExpression expression, Schema schema) {
+    return new InMemoryMapScimFilterMatcher<R>().apply(expression, schema);
+  }
+
+  static class InMemoryMapScimFilterMatcher<R> extends InMemoryScimFilterMatcher<R> {
+    @Override
+    public <A> A get(Schema.Attribute attribute, A actual) {
+      Map<String, Object> map = (Map<String, Object>) actual;
+      return (A) map.get(attribute.getName());
+    }
+  }
 }
diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
index 0200c961..5d8892d8 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/InMemoryScimFilterMatcher.java
@@ -30,7 +30,7 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.function.Predicate;
 
-final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Predicate<R>> {
+class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Predicate<R>> {
 
   private static final Logger log = LoggerFactory.getLogger(InMemoryScimFilterMatcher.class);
 
@@ -87,9 +87,11 @@ final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Pred
     return scimResource -> false;
   }
 
-  private static abstract class AbstractAttributePredicate<T extends FilterExpression, R> implements Predicate<R> {
+  public <A> A get(Schema.Attribute attribute, A actual) {
+    return attribute.getAccessor().get(actual);
+  }
 
-    private static final Logger log = LoggerFactory.getLogger(InMemoryScimFilterMatcher.class);
+  private abstract class AbstractAttributePredicate<T extends FilterExpression, R> implements Predicate<R> {
 
     final T expression;
 
@@ -115,13 +117,16 @@ final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Pred
 
           // now walk the attribute path again to get the accessor and value
           Schema.Attribute schemaAttribute = attributeContainer.getAttribute(attributeReference.getAttributeName());
-          actual = schemaAttribute.getAccessor().get(actual);
 
+          // check if the filter is nested such as: `emails[type eq "work"].value`
+          if (!(attributeReference.hasSubAttribute() && schemaAttribute.isMultiValued())) {
+            actual = get(schemaAttribute, actual);
+          }
           // if the attribute has a sub-level, continue on
           String subAttribute = attributeReference.getSubAttributeName();
           if (subAttribute != null) {
             schemaAttribute = schemaAttribute.getAttribute(subAttribute);
-            actual = schemaAttribute.getAccessor().get(actual);
+            actual = get(schemaAttribute, actual);
           }
           return test(schemaAttribute, actual);
         }
@@ -134,7 +139,7 @@ final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Pred
     }
   }
 
-  private static class ValuePathPredicate<R> extends AbstractAttributePredicate<ValuePathExpression, R> {
+  private class ValuePathPredicate<R> extends AbstractAttributePredicate<ValuePathExpression, R> {
 
     final private Predicate<Object> nestedPredicate;
 
@@ -154,7 +159,7 @@ final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Pred
     }
   }
 
-  private static class AttributeComparisonPredicate<R> extends AbstractAttributePredicate<AttributeComparisonExpression, R> {
+  private class AttributeComparisonPredicate<R> extends AbstractAttributePredicate<AttributeComparisonExpression, R> {
 
     private AttributeComparisonPredicate(AttributeComparisonExpression expression, AttributeContainer attributeContainer) {
       super(expression, attributeContainer, expression.getAttributePath());
@@ -247,7 +252,7 @@ final class InMemoryScimFilterMatcher<R> extends BaseFilterExpressionMapper<Pred
     }
   }
 
-  private static class AttributePresentPredicate<R> extends AbstractAttributePredicate<AttributePresentExpression, R> {
+  private class AttributePresentPredicate<R> extends AbstractAttributePredicate<AttributePresentExpression, R> {
     private AttributePresentPredicate(AttributePresentExpression expression, AttributeContainer attributeContainer) {
       super(expression, attributeContainer, expression.getAttributePath());
     }
diff --git a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
index ffe52adb..9cd29872 100644
--- a/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
+++ b/scim-spec/scim-spec-schema/src/main/java/org/apache/directory/scim/spec/filter/attribute/AttributeReference.java
@@ -114,6 +114,14 @@ public class AttributeReference implements Serializable {
     return attributeBase;
   }
 
+  public boolean hasSubAttribute() {
+    return subAttributeName != null;
+  }
+
+  public boolean hasUrn() {
+    return urn != null;
+  }
+
   public String toString() {
     return (this.urn != null ? this.urn + ":" : "") + this.attributeName + (this.subAttributeName != null ? "." + this.subAttributeName : "");
   }