Hi Guillaume,

The setResource() came from the implementation used by the Felix
BundleRepository, which I used as a starting point.
I'll have a look if we can remove it.

BTW +1 on a shareable Resource Implementation. There is one in the Felix
BundleRepository already which might be a starting point?

Best regards,

David

On 20 April 2018 at 08:01, Guillaume Nodet <[email protected]> wrote:

> I'm going to work on those classes too then, in order to reuse them instead
> of the one we have in Karaf. They are actually closer to the ones in the
> framework.  It also includes a CapabilitySet / SimpleFilter which speeds
> things a lot when using the resolver.
> One point though, I'm not sure I like the setResource(xx) on the Capability
> / Requirement, because there's a risk of running out of sync with
> Resource#getCapabilities / getRequirements.  So I wonder if a final
> Resource field would be more appropriate.
>
> I think a Resource implementation would be interesting too.
>
> 2018-04-20 8:34 GMT+02:00 <[email protected]>:
>
> > Author: davidb
> > Date: Fri Apr 20 06:34:25 2018
> > New Revision: 1829625
> >
> > URL: http://svn.apache.org/viewvc?rev=1829625&view=rev
> > Log:
> > Improvements to the OSGi Capability and Requirement implementations
> >
> > These come from the Apache Sling Whitenboard Feature Model project.
> Merged
> > with Felix Utils to increase sharing across projects.
> >
> > Added:
> >     felix/trunk/utils/src/main/java/org/apache/felix/utils/capabilities/
> > AbstractCapabilityRequirement.java
> > Modified:
> >     felix/trunk/utils/pom.xml
> >     felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/CapabilityImpl.java
> >     felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/RequirementImpl.java
> >     felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> > CapabilityImplTest.java
> >     felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> > RequirementImplTest.java
> >
> > Modified: felix/trunk/utils/pom.xml
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/pom.xml?rev=
> > 1829625&r1=1829624&r2=1829625&view=diff
> > ============================================================
> > ==================
> > --- felix/trunk/utils/pom.xml (original)
> > +++ felix/trunk/utils/pom.xml Fri Apr 20 06:34:25 2018
> > @@ -27,7 +27,7 @@
> >      <modelVersion>4.0.0</modelVersion>
> >      <name>Apache Felix Utils</name>
> >      <description>Utility classes for OSGi.</description>
> > -    <version>1.10.5-SNAPSHOT</version>
> > +    <version>1.11.0-SNAPSHOT</version>
> >      <artifactId>org.apache.felix.utils</artifactId>
> >
> >      <scm>
> >
> > Added: felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/AbstractCapabilityRequirement.java
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/
> > java/org/apache/felix/utils/capabilities/AbstractCapabilityRequirement.
> > java?rev=1829625&view=auto
> > ============================================================
> > ==================
> > --- felix/trunk/utils/src/main/java/org/apache/felix/utils/capabilities/
> > AbstractCapabilityRequirement.java (added)
> > +++ felix/trunk/utils/src/main/java/org/apache/felix/utils/capabilities/
> > AbstractCapabilityRequirement.java Fri Apr 20 06:34:25 2018
> > @@ -0,0 +1,135 @@
> > +/*
> > + * 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.capabilities;
> > +
> > +import org.osgi.resource.Resource;
> > +
> > +import java.util.Collections;
> > +import java.util.HashMap;
> > +import java.util.Map;
> > +
> > +abstract class AbstractCapabilityRequirement {
> > +
> > +    /** The namespace. Required. */
> > +    private final String namespace;
> > +
> > +    /** Optional resource. */
> > +    private volatile Resource resource;
> > +
> > +    /** Optional attributes. Never null. */
> > +    private final Map<String, Object> attributes;
> > +
> > +    /** Optional attributes. Never null. */
> > +    private final Map<String, String> directives;
> > +
> > +    AbstractCapabilityRequirement(final String ns, final Map<String,
> > Object> attrs, final Map<String, String> dirs, final Resource res) {
> > +        if ( ns == null ) {
> > +            throw new IllegalArgumentException("Namespace must not be
> > null.");
> > +        }
> > +        namespace = ns;
> > +        attributes = attrs == null
> > +                ? Collections.<String, Object>emptyMap()
> > +                : Collections.unmodifiableMap(new HashMap<String,
> > Object>(attrs));
> > +        directives = dirs == null
> > +                ? Collections.<String,String>emptyMap()
> > +                : Collections.unmodifiableMap(new
> > HashMap<String,String>(dirs));
> > +                resource = res;
> > +    }
> > +
> > +    /**
> > +     * Return the namespace.
> > +     * @return The namespace. This is never @{code null}.
> > +     */
> > +    public String getNamespace() {
> > +        return namespace;
> > +    }
> > +
> > +    /**
> > +     * Return the attributes.
> > +     * @return The attributes, might be empty.
> > +     */
> > +    public Map<String, Object> getAttributes() {
> > +        return attributes;
> > +    }
> > +
> > +    /**
> > +     * Return the directives.
> > +     * @return The directives, might be empty.
> > +     */
> > +    public Map<String, String> getDirectives() {
> > +        return directives;
> > +    }
> > +
> > +    /**
> > +     * Return the resource.
> > +     * @return The resource or @{code null}.
> > +     */
> > +    public Resource getResource() {
> > +        return resource;
> > +    }
> > +
> > +    /**
> > +     * Set the resource associated with this requirement.
> > +     *
> > +     * @param res The resource.
> > +     */
> > +    public void setResource(Resource res) {
> > +        resource = res;
> > +    }
> > +
> > +    @Override
> > +    public int hashCode() {
> > +        final int prime = 31;
> > +        int result = 1;
> > +        result = prime * result + attributes.hashCode();
> > +        result = prime * result + directives.hashCode();
> > +        result = prime * result + namespace.hashCode();
> > +
> > +        if (resource != null)
> > +            result = prime * result + resource.hashCode();
> > +
> > +        return result;
> > +    }
> > +
> > +    @Override
> > +    public boolean equals(Object obj) {
> > +        if (this == obj)
> > +            return true;
> > +        if (obj == null)
> > +            return false;
> > +        if (getClass() != obj.getClass())
> > +            return false;
> > +        AbstractCapabilityRequirement other = (
> AbstractCapabilityRequirement)
> > obj;
> > +        if (!namespace.equals(other.namespace))
> > +            return false;
> > +        if (!attributes.equals(other.attributes))
> > +            return false;
> > +        if (!directives.equals(other.directives))
> > +            return false;
> > +        if (resource == null) {
> > +            return other.resource == null;
> > +        } else {
> > +            return resource.equals(other.resource);
> > +        }
> > +    }
> > +
> > +    @Override
> > +    public String toString() {
> > +        return getClass().getSimpleName() + " [resource=" + resource +
> ",
> > namespace=" + namespace + ", attributes=" + attributes
> > +                + ", directives=" + directives + "]";
> > +    }
> > +}
> >
> > Modified: felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/CapabilityImpl.java
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/
> > java/org/apache/felix/utils/capabilities/CapabilityImpl.
> > java?rev=1829625&r1=1829624&r2=1829625&view=diff
> > ============================================================
> > ==================
> > --- felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/CapabilityImpl.java (original)
> > +++ felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/CapabilityImpl.java Fri Apr 20 06:34:25 2018
> > @@ -1,161 +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
> > + * 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
> > + * 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.
> > + * 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.capabilities;
> >
> >  import org.osgi.resource.Capability;
> >  import org.osgi.resource.Resource;
> >
> > -import java.util.Collections;
> >  import java.util.Map;
> >
> >  /**
> >   * Implementation of the OSGi Capability interface.
> >   */
> > -public class CapabilityImpl implements Capability
> > -{
> > -    private final String namespace;
> > -    private final Map<String, Object> attributes;
> > -    private final Map<String, String> directives;
> > -    private volatile Resource resource;
> > -
> > +public class CapabilityImpl extends AbstractCapabilityRequirement
> > implements Capability {
> >      /**
> > -     * Create a capability.
> > -     *
> > +     * Create a capability that is not associated with a resource.
> > +     * @param res The resource associated with the capability. May be
> > null.
> >       * @param ns The namespace of the capability.
> >       * @param attrs The attributes of the capability.
> >       * @param dirs The directives of the capability.
> >       */
> > -    public CapabilityImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs)
> > -    {
> > +    public CapabilityImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs) {
> >          this(ns, attrs, dirs, null);
> >      }
> >
> >      /**
> >       * Create a capability.
> > -     *
> >       * @param ns The namespace of the capability.
> >       * @param attrs The attributes of the capability.
> >       * @param dirs The directives of the capability.
> > -     * @param res The resource associated with the capability.
> > -     */
> > -    public CapabilityImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs, Resource res)
> > -    {
> > -        namespace = ns;
> > -        attributes = Collections.unmodifiableMap(attrs);
> > -        directives = Collections.unmodifiableMap(dirs);
> > -        resource = res;
> > -    }
> > -
> > -    /**
> > -     * Returns the namespace of this capability.
> > -     *
> > -     * @return The namespace of this capability.
> > -     */
> > -    public String getNamespace()
> > -    {
> > -        return namespace;
> > -    }
> > -
> > -    /**
> > -     * Returns the attributes of this capability.
> > -     *
> > -     * @return An unmodifiable map of attribute names to attribute
> values
> > for
> > -     *         this capability, or an empty map if this capability has
> no
> > -     *         attributes.
> > -     */
> > -    public Map<String, Object> getAttributes()
> > -    {
> > -        return attributes;
> > -    }
> > -
> > -    /**
> > -     * Returns the directives of this capability.
> > -     *
> > -     * @return An unmodifiable map of directive names to directive
> values
> > for
> > -     *         this capability, or an empty map if this capability has
> no
> > -     *         directives.
> > +     * @param res The resource associated with the capability. May be
> > null.
> >       */
> > -    public Map<String, String> getDirectives()
> > -    {
> > -        return directives;
> > +    public CapabilityImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs, Resource res) {
> > +        super(ns, attrs, dirs, res);
> >      }
> >
> >      /**
> > -     * Returns the resource declaring this capability.
> > -     *
> > -     * @return The resource declaring this capability.
> > +     * Create a capability based on an existing capability, providing
> the
> > resource.
> > +     * The namespace, attributes and directives are copied from the
> > provided capability.
> > +     * @param capability The capability to base the new requirement on.
> > +     * @param resource The resource to be associated with the capability
> >       */
> > -    public Resource getResource()
> > -    {
> > -        return resource;
> > -    }
> > -
> > -    /**
> > -     * Sets the resource associated with this capability.
> > -     *
> > -     * @param res The resource.
> > -     */
> > -    public void setResource(Resource res)
> > -    {
> > -        resource = res;
> > -    }
> > -
> > -    @Override
> > -    public int hashCode() {
> > -        final int prime = 31;
> > -        int result = 1;
> > -        result = prime * result + ((attributes == null) ? 0 :
> > attributes.hashCode());
> > -        result = prime * result + ((directives == null) ? 0 :
> > directives.hashCode());
> > -        result = prime * result + ((namespace == null) ? 0 :
> > namespace.hashCode());
> > -        result = prime * result + ((resource == null) ? 0 :
> > resource.hashCode());
> > -        return result;
> > -    }
> > -
> > -    @Override
> > -    public boolean equals(Object obj) {
> > -        if (this == obj)
> > -            return true;
> > -        if (obj == null)
> > -            return false;
> > -        if (getClass() != obj.getClass())
> > -            return false;
> > -        CapabilityImpl other = (CapabilityImpl) obj;
> > -        if (attributes == null) {
> > -            if (other.attributes != null)
> > -                return false;
> > -        } else if (!attributes.equals(other.attributes))
> > -            return false;
> > -        if (directives == null) {
> > -            if (other.directives != null)
> > -                return false;
> > -        } else if (!directives.equals(other.directives))
> > -            return false;
> > -        if (namespace == null) {
> > -            if (other.namespace != null)
> > -                return false;
> > -        } else if (!namespace.equals(other.namespace))
> > -            return false;
> > -        if (resource == null) {
> > -            if (other.resource != null)
> > -                return false;
> > -        } else if (!resource.equals(other.resource))
> > -            return false;
> > -        return true;
> > +    public CapabilityImpl(Resource resource, Capability capability) {
> > +        this(capability.getNamespace(), capability.getAttributes(),
> > capability.getDirectives(), resource);
> >      }
> >  }
> >
> > Modified: felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/RequirementImpl.java
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/main/
> > java/org/apache/felix/utils/capabilities/RequirementImpl.
> > java?rev=1829625&r1=1829624&r2=1829625&view=diff
> > ============================================================
> > ==================
> > --- felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/RequirementImpl.java (original)
> > +++ felix/trunk/utils/src/main/java/org/apache/felix/utils/
> > capabilities/RequirementImpl.java Fri Apr 20 06:34:25 2018
> > @@ -1,20 +1,18 @@
> >  /*
> > - * 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
> > + * 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
> > + * 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.
> > + * 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.capabilities;
> >
> > @@ -28,154 +26,51 @@ import java.util.Map;
> >  /**
> >   * Implementation of the OSGi Requirement interface.
> >   */
> > -public class RequirementImpl implements Requirement
> > -{
> > -    private final String namespace;
> > -    private final Map<String, Object> attributes;
> > -    private final Map<String, String> directives;
> > -    private volatile Resource resource;
> > -
> > +public class RequirementImpl extends AbstractCapabilityRequirement
> > implements Requirement {
> >      /**
> > -     * Create a requirement.
> > -     *
> > +     * Create a requirement that is not associated with a resource.
> > +     * @param res The resource associated with the requirement.
> >       * @param ns The namespace of the requirement.
> >       * @param attrs The attributes of the requirement.
> >       * @param dirs The directives of the requirement.
> >       */
> > -    public RequirementImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs)
> > -    {
> > +    public RequirementImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs) {
> >          this(ns, attrs, dirs, null);
> >      }
> >
> >      /**
> >       * Create a requirement.
> > -     *
> >       * @param ns The namespace of the requirement.
> >       * @param attrs The attributes of the requirement.
> >       * @param dirs The directives of the requirement.
> >       * @param res The resource associated with the requirement.
> >       */
> > -    public RequirementImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs, Resource res)
> > -    {
> > -        namespace = ns;
> > -        attributes = attrs;
> > -        directives = dirs;
> > -        resource = res;
> > -    }
> > -
> > -    /**
> > -     * Create a requirement with a namespace and a filter.
> > -     *
> > -     * This is a convenience method that creates a requirement with
> > -     * an empty attributes map and a single 'filter' directive.
> > -     * @param ns The namespace for the requirement.
> > -     * @param filter The filter.
> > -     */
> > -    public RequirementImpl(String ns, String filter)
> > -    {
> > -        this(ns, Collections.<String, Object>emptyMap(),
> > -            filter == null ? Collections.<String, String> emptyMap() :
> > -            Collections.singletonMap(Namespace.REQUIREMENT_FILTER_
> DIRECTIVE,
> > filter));
> > +    public RequirementImpl(String ns, Map<String, Object> attrs,
> > Map<String, String> dirs, Resource res) {
> > +        super(ns, attrs, dirs, res);
> >      }
> >
> >      /**
> > -     * Returns the namespace of this requirement.
> > -     *
> > -     * @return The namespace of this requirement.
> > +      * Create a requirement with a namespace and a filter.
> > +      *
> > +      * This is a convenience method that creates a requirement with
> > +      * an empty attributes map and a single 'filter' directive.
> > +      * @param ns The namespace for the requirement.
> > +      * @param filter The filter.
> > +      */
> > +     public RequirementImpl(String ns, String filter)
> > +     {
> > +         this(ns, Collections.<String, Object>emptyMap(),
> > +             filter == null ? Collections.<String, String> emptyMap() :
> > +             Collections.singletonMap(Namespace.REQUIREMENT_FILTER_
> DIRECTIVE,
> > filter));
> > +     }
> > +
> > +    /**
> > +     * Create a requirement based on an existing requirement, providing
> > the resource.
> > +     * The namespace, attributes and directives are copied from the
> > provided requirement.
> > +     * @param requirement The requirement to base the new requirement
> on.
> > +     * @param resource The resource to be associated with the
> requirement
> >       */
> > -    public String getNamespace()
> > -    {
> > -        return namespace;
> > -    }
> > -
> > -    /**
> > -     * Returns the attributes of this requirement.
> > -     *
> > -     * <p>
> > -     * Requirement attributes have no specified semantics and are
> > considered
> > -     * extra user defined information.
> > -     *
> > -     * @return An unmodifiable map of attribute names to attribute
> values
> > for
> > -     *         this requirement, or an empty map if this requirement has
> > no
> > -     *         attributes.
> > -     */
> > -    public Map<String, Object> getAttributes()
> > -    {
> > -        return Collections.unmodifiableMap(attributes);
> > -    }
> > -
> > -    /**
> > -     * Returns the directives of this requirement.
> > -     *
> > -     * @return An unmodifiable map of directive names to directive
> values
> > for
> > -     *         this requirement, or an empty map if this requirement has
> > no
> > -     *         directives.
> > -     */
> > -    public Map<String, String> getDirectives()
> > -    {
> > -        return Collections.unmodifiableMap(directives);
> > -    }
> > -
> > -    /**
> > -     * Returns the resource declaring this requirement.
> > -     *
> > -     * @return The resource declaring this requirement. This can be
> > {@code null}
> > -     *         if this requirement is synthesized.
> > -     */
> > -    public Resource getResource()
> > -    {
> > -        return resource;
> > -    }
> > -
> > -    /**
> > -     * Set the resource associated with this requirement.
> > -     *
> > -     * @param res The resource.
> > -     */
> > -    public void setResource(Resource res) {
> > -        resource = res;
> > -    }
> > -
> > -    @Override
> > -    public int hashCode() {
> > -        final int prime = 31;
> > -        int result = 1;
> > -        result = prime * result + ((attributes == null) ? 0 :
> > attributes.hashCode());
> > -        result = prime * result + ((directives == null) ? 0 :
> > directives.hashCode());
> > -        result = prime * result + ((namespace == null) ? 0 :
> > namespace.hashCode());
> > -        result = prime * result + ((resource == null) ? 0 :
> > resource.hashCode());
> > -        return result;
> > -    }
> > -
> > -    @Override
> > -    public boolean equals(Object obj) {
> > -        if (this == obj)
> > -            return true;
> > -        if (obj == null)
> > -            return false;
> > -        if (getClass() != obj.getClass())
> > -            return false;
> > -        RequirementImpl other = (RequirementImpl) obj;
> > -        if (attributes == null) {
> > -            if (other.attributes != null)
> > -                return false;
> > -        } else if (!attributes.equals(other.attributes))
> > -            return false;
> > -        if (directives == null) {
> > -            if (other.directives != null)
> > -                return false;
> > -        } else if (!directives.equals(other.directives))
> > -            return false;
> > -        if (namespace == null) {
> > -            if (other.namespace != null)
> > -                return false;
> > -        } else if (!namespace.equals(other.namespace))
> > -            return false;
> > -        if (resource == null) {
> > -            if (other.resource != null)
> > -                return false;
> > -        } else if (!resource.equals(other.resource))
> > -            return false;
> > -        return true;
> > +    public RequirementImpl(Resource resource, Requirement requirement) {
> > +        this(requirement.getNamespace(), requirement.getAttributes(),
> > requirement.getDirectives(), resource);
> >      }
> >  }
> >
> > Modified: felix/trunk/utils/src/test/java/org/apache/felix/utils/
> > capabilities/CapabilityImplTest.java
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/test/
> > java/org/apache/felix/utils/capabilities/CapabilityImplTest.java?rev=
> > 1829625&r1=1829624&r2=1829625&view=diff
> > ============================================================
> > ==================
> > --- felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> CapabilityImplTest.java
> > (original)
> > +++ felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> CapabilityImplTest.java
> > Fri Apr 20 06:34:25 2018
> > @@ -57,4 +57,18 @@ public class CapabilityImplTest extends
> >          assertFalse(c1.equals(c3));
> >          assertFalse(c1.hashCode() == c3.hashCode());
> >      }
> > +
> > +    public void testCopyCapability() {
> > +        CapabilityImpl c = new CapabilityImpl("x.y.z",
> > +                Collections.<String, Object>singletonMap("a", 123),
> > +                Collections.<String, String>singletonMap("x", "y"),
> > +                Mockito.mock(Resource.class));
> > +
> > +        Resource res2 = Mockito.mock(Resource.class);
> > +        CapabilityImpl c2 = new CapabilityImpl(res2, c);
> > +        assertFalse("Should not be equal, the resources are different",
> > c.equals(c2));
> > +
> > +        c.setResource(res2);
> > +        assertEquals(c, c2);
> > +    }
> >  }
> >
> > Modified: felix/trunk/utils/src/test/java/org/apache/felix/utils/
> > capabilities/RequirementImplTest.java
> > URL: http://svn.apache.org/viewvc/felix/trunk/utils/src/test/
> > java/org/apache/felix/utils/capabilities/RequirementImplTest.java?rev=
> > 1829625&r1=1829624&r2=1829625&view=diff
> > ============================================================
> > ==================
> > --- felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> RequirementImplTest.java
> > (original)
> > +++ felix/trunk/utils/src/test/java/org/apache/felix/utils/capabilities/
> RequirementImplTest.java
> > Fri Apr 20 06:34:25 2018
> > @@ -69,4 +69,18 @@ public class RequirementImplTest extends
> >          assertEquals(0, r2.getAttributes().size());
> >          assertEquals(0, r2.getDirectives().size());
> >      }
> > +
> > +    public void testCopyRequirement() {
> > +        RequirementImpl r = new RequirementImpl("x.y.z",
> > +                Collections.<String, Object>singletonMap("a", 123),
> > +                Collections.<String, String>singletonMap("x", "y"),
> > +                Mockito.mock(Resource.class));
> > +
> > +        Resource res2 = Mockito.mock(Resource.class);
> > +        RequirementImpl r2 = new RequirementImpl(res2, r);
> > +        assertFalse("Should not be equal, the resources are different",
> > r.equals(r2));
> > +
> > +        r.setResource(res2);
> > +        assertEquals(r, r2);
> > +    }
> >  }
> >
> >
> >
>
>
> --
> ------------------------
> Guillaume Nodet
>

Reply via email to