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 >
