Fwiw, I've slightly modified your commit to leverage the internal SimpleFilter of the RequirementImpl.
2018-04-23 17:01 GMT+02:00 <[email protected]>: > Author: davidb > Date: Mon Apr 23 15:01:29 2018 > New Revision: 1829893 > > URL: http://svn.apache.org/viewvc?rev=1829893&view=rev > Log: > FELIX-5838 Add OSGi Resource implementations to Felix Utils > > Support matching Capabilities to Requirements and provide an API to check > wether a Requirement is optional. > > Added: > felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/CapabilitySetTest.java > 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 > felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/RequirementImplTest.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=1829893&r1=1829892&r2=1829893&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 > Mon Apr 23 15:01:29 2018 > @@ -16,6 +16,12 @@ > */ > package org.apache.felix.utils.resource; > > +import org.apache.felix.utils.version.VersionTable; > +import org.osgi.framework.Constants; > +import org.osgi.framework.Version; > +import org.osgi.resource.Capability; > +import org.osgi.resource.Requirement; > + > import java.lang.reflect.Array; > import java.lang.reflect.Constructor; > import java.util.ArrayList; > @@ -29,11 +35,6 @@ import java.util.Map.Entry; > import java.util.Set; > import java.util.TreeMap; > > -import org.apache.felix.utils.version.VersionTable; > -import org.osgi.framework.Constants; > -import org.osgi.framework.Version; > -import org.osgi.resource.Capability; > - > @SuppressWarnings("rawtypes") > public class CapabilitySet { > > @@ -201,6 +202,17 @@ public class CapabilitySet { > return matches; > } > > + 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; > + } > + > public static boolean matches(Capability cap, SimpleFilter sf) { > return matchesInternal(cap, sf) && matchMandatory(cap, 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=1829893&r1=1829892&r2=1829893&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 > Mon Apr 23 15:01:29 2018 > @@ -90,4 +90,18 @@ public class RequirementImpl extends Abs > return filter; > } > > + /** > + * Utility method to check wether a requirment is optional. This > method works with any > + * object implementing the requirement interface. > + * > + * @param requirement A requirement > + * @return {@code true} if the requirement it optional, {@code false} > otherwise. > + */ > + public static boolean isOptional(Requirement requirement) { > + if (requirement instanceof RequirementImpl) { > + return ((RequirementImpl) requirement).isOptional(); > + } > + > + return Constants.RESOLUTION_OPTIONAL.equals(requirement. > getDirectives().get(Constants.RESOLUTION_DIRECTIVE)); > + } > } > > Added: felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/CapabilitySetTest.java > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/test/ > java/org/apache/felix/utils/resource/CapabilitySetTest. > java?rev=1829893&view=auto > ============================================================ > ================== > --- felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/CapabilitySetTest.java (added) > +++ felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/CapabilitySetTest.java Mon Apr 23 15:01:29 2018 > @@ -0,0 +1,59 @@ > +/* > + * 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.felix.utils.resource; > + > +import junit.framework.TestCase; > + > +import org.osgi.resource.Capability; > + > +import java.util.Collections; > +import java.util.HashMap; > +import java.util.Map; > + > +public class CapabilitySetTest extends TestCase { > + public void testMatchesRequirement() { > + RequirementImpl r = new RequirementImpl(null, "foo", > + Collections.singletonMap("filter", "(a=b)"), null); > + > + Capability c1 = new CapabilityImpl(null, "foo", null, > + Collections.<String, Object>singletonMap("a", "b")); > + Capability c2 = new CapabilityImpl(null, "foox", null, > + Collections.<String, Object>singletonMap("a", "b")); > + Capability c3 = new CapabilityImpl(null, "bar", null, > + Collections.<String, Object>singletonMap("a", "b")); > + Capability c4 = new CapabilityImpl(null, "foo", null, > + Collections.<String, Object>singletonMap("a", "c")); > + assertTrue(CapabilitySet.matches(c1, r)); > + assertFalse(CapabilitySet.matches(c2, r)); > + assertFalse(CapabilitySet.matches(c3, r)); > + assertFalse(CapabilitySet.matches(c4, r)); > + > + RequirementImpl r2 = new RequirementImpl(null, "foo", null, null); > + assertTrue(CapabilitySet.matches(c1, r2)); > + assertFalse(CapabilitySet.matches(c2, r2)); > + assertFalse(CapabilitySet.matches(c3, r2)); > + assertTrue(CapabilitySet.matches(c4, r2)); > + > + Map<String, Object> m = new HashMap<>(); > + m.put("a", "b"); > + m.put("c", "d"); > + Capability c5 = new CapabilityImpl(null, "foo", null, m); > + assertTrue(CapabilitySet.matches(c5, r)); > + } > +} > > Modified: felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/RequirementImplTest.java > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/test/ > java/org/apache/felix/utils/resource/RequirementImplTest. > java?rev=1829893&r1=1829892&r2=1829893&view=diff > ============================================================ > ================== > --- felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/RequirementImplTest.java (original) > +++ felix/trunk/utils/src/test/java/org/apache/felix/utils/ > resource/RequirementImplTest.java Mon Apr 23 15:01:29 2018 > @@ -21,6 +21,8 @@ package org.apache.felix.utils.resource; > import junit.framework.TestCase; > > import org.mockito.Mockito; > +import org.osgi.framework.Constants; > +import org.osgi.resource.Requirement; > import org.osgi.resource.Resource; > > import java.util.Collections; > @@ -86,4 +88,20 @@ public class RequirementImplTest extends > RequirementImpl r3 = new RequirementImpl(res1, r); > assertEquals(r, r3); > } > + > + public void testOptional() { > + RequirementImpl r1 = new RequirementImpl(null, "foo", > Collections.singletonMap(Constants.RESOLUTION_DIRECTIVE, > Constants.RESOLUTION_OPTIONAL), null); > + assertTrue(r1.isOptional()); > + > + RequirementImpl r2 = new RequirementImpl(null, "bar", null, null); > + assertFalse(r2.isOptional()); > + > + assertTrue(RequirementImpl.isOptional(r1)); > + assertFalse(RequirementImpl.isOptional(r2)); > + > + Requirement r3 = Mockito.mock(Requirement.class); > + Mockito.when(r3.getDirectives()).thenReturn(Collections. > singletonMap(Constants.RESOLUTION_DIRECTIVE, > Constants.RESOLUTION_OPTIONAL)); > + assertTrue(RequirementImpl.isOptional(r3)); > + assertFalse(RequirementImpl.isOptional(Mockito.mock( > Requirement.class))); > + } > } > > > -- ------------------------ Guillaume Nodet
