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