Capability and requirement must be immutable (according to the javadoc)
so a setResource sounds dangerous.

Could we maybe have a jira issue tracking the changes/additions to utils?

Regards

Carsten


David Bosschaert wrote
> 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
>>
> 
-- 
Carsten Ziegeler
Adobe Research Switzerland
[email protected]

Reply via email to