I've added https://issues.apache.org/jira/browse/FELIX-5838

Best regards,

David

On 20 April 2018 at 08:43, Carsten Ziegeler <[email protected]> wrote:

> 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