You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gn...@apache.org on 2018/04/24 08:14:09 UTC

svn commit: r1829966 - in /felix/trunk/utils/src/main/java/org/apache/felix/utils/resource: CapabilitySet.java RequirementImpl.java

Author: gnodet
Date: Tue Apr 24 08:14:09 2018
New Revision: 1829966

URL: http://svn.apache.org/viewvc?rev=1829966&view=rev
Log:
[FELIX-5838] Make the filter usage a bit more coherent

There's no need to check for the capability / requirement namespace matching, as the requirement should always have it included in the filter already.

Modified:
    felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/CapabilitySet.java
    felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/RequirementImpl.java

Modified: felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/CapabilitySet.java
URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/CapabilitySet.java?rev=1829966&r1=1829965&r2=1829966&view=diff
==============================================================================
--- felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/CapabilitySet.java (original)
+++ felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/CapabilitySet.java Tue Apr 24 08:14:09 2018
@@ -32,6 +32,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 
@@ -203,14 +204,8 @@ public class CapabilitySet {
     }
 
     public static boolean matches(Capability capability, Requirement requirement) {
-        if (requirement.getNamespace().equals(capability.getNamespace())) {
-            String filter = requirement.getDirectives().get(Constants.FILTER_DIRECTIVE);
-            if (filter != null) {
-                return matches(capability, SimpleFilter.parse(filter));
-            }
-            return true;
-        }
-        return false;
+        return Objects.equals(capability.getNamespace(), requirement.getNamespace())
+                && matches(capability, RequirementImpl.getFilter(requirement));
     }
 
     public static boolean matches(Capability cap, SimpleFilter sf) {

Modified: felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/RequirementImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/RequirementImpl.java?rev=1829966&r1=1829965&r2=1829966&view=diff
==============================================================================
--- felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/RequirementImpl.java (original)
+++ felix/trunk/utils/src/main/java/org/apache/felix/utils/resource/RequirementImpl.java Tue Apr 24 08:14:09 2018
@@ -73,7 +73,11 @@ public class RequirementImpl extends Abs
 
     public RequirementImpl(Resource resource, String path, Map<String, String> dirs, Map<String, Object> attrs, SimpleFilter sf) {
         super(resource, path, dirs, attrs);
-        this.filter = sf != null ? sf : SimpleFilter.convert(attributes);
+        if (sf == null) {
+            this.filter = getFilter(directives, attributes);
+        } else {
+            this.filter = sf;
+        }
         // Find resolution import directives.
         this.optional = Constants.RESOLUTION_OPTIONAL.equals(directives.get(Constants.RESOLUTION_DIRECTIVE));
     }
@@ -91,7 +95,7 @@ public class RequirementImpl extends Abs
     }
 
     /**
-     * Utility method to check wether a requirment is optional. This method works with any
+     * Utility method to check whether a requirement is optional. This method works with any
      * object implementing the requirement interface.
      *
      * @param requirement A requirement
@@ -104,4 +108,29 @@ public class RequirementImpl extends Abs
 
         return Constants.RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(Constants.RESOLUTION_DIRECTIVE));
     }
+
+    /**
+     * Utility method to obtain a SimpleFilter from a given requirement.
+     * If the requirement contains a {@link Constants#FILTER_DIRECTIVE} directive,
+     * it will be used, else, the filter will be derived from the attributes.
+     *
+     * @param requirement A requirement
+     * @return a valid filter, never {@code null}.
+     */
+    public static SimpleFilter getFilter(Requirement requirement) {
+        if (requirement instanceof RequirementImpl) {
+            return ((RequirementImpl) requirement).getFilter();
+        }
+
+        return getFilter(requirement.getDirectives(), requirement.getAttributes());
+    }
+
+    private static SimpleFilter getFilter(Map<String, String> directives, Map<String, Object> attributes) {
+        String filter = directives.get(Constants.FILTER_DIRECTIVE);
+        if (filter != null) {
+            return SimpleFilter.parse(filter);
+        } else {
+            return SimpleFilter.convert(attributes);
+        }
+    }
 }