While they should be similar to the framework one, I saw two differences in
the CapabilitySet: the framework implementation is thread safe, while the
one I added is not (I don't recall if I removed it for perfs or if it was
added later in the framework though).  Also, the framework one is using
BundleCapability / BundleRequirement while the other one uses the
Capability / Requirement interfaces.
But there's definitely some overlap.
The header parsing could be reused too.

2018-04-20 10:56 GMT+02:00 Karl Pauls <[email protected]>:

> On Fri, Apr 20, 2018 at 9:01 AM, 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.
>
> I was hoping we could maybe reuse them in the framework as well.
>
> regards,
>
> Karl
>
> > 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
>
>
>
> --
> Karl Pauls
> [email protected]
>



-- 
------------------------
Guillaume Nodet

Reply via email to