You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by Guillaume Nodet <gn...@apache.org> on 2018/04/24 08:18:41 UTC

Re: svn commit: r1829893 - in /felix/trunk/utils/src: main/java/org/apache/felix/utils/resource/ test/java/org/apache/felix/utils/resource/

Fwiw, I've slightly modified your commit to leverage the internal
SimpleFilter of the RequirementImpl.

2018-04-23 17:01 GMT+02:00 <da...@apache.org>:

> 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