Author: veithen
Date: Tue Jun 16 21:46:34 2015
New Revision: 1685914
URL: http://svn.apache.org/r1685914
Log:
Remove equals and hashCode from OMAttribute implementations.
Rationale:
1. The fact that OMAttribute implementations support equals and hashCode is not
mentioned in the Javadoc of the public API.
2. The implementation uses the following condition:
return (namespace == null ? other.getNamespace() == null :
namespace.equals(other.getNamespace()) &&
localName.equals(other.getLocalName()) &&
(value == null ? other.getAttributeValue() == null :
value.equals(other.getAttributeValue())));
This is wrong. Since the ternary operator has lower precedence than &&, this
code will compare the local names and values only if the attribute has a
namespace. Sure enough the existing test case didn't test this code on
attributes without namespace. Since the code is so badly broken and nobody ever
complained, it is safe to assume that nobody actually relies on OMAttribute
implementing equals and hashCode.
3. It is hard to see what the use case for this feature would be.
Removed:
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/attribute/TestEqualsHashCode.java
Modified:
webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
Modified:
webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java?rev=1685914&r1=1685913&r2=1685914&view=diff
==============================================================================
---
webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
(original)
+++
webservices/axiom/trunk/implementations/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
Tue Jun 16 21:46:34 2015
@@ -260,73 +260,6 @@ public class AttrImpl extends RootNode i
+ ":" + localName;
}
- /**
- * An instance of <code>AttrImpl</code> can act as an
<code>OMAttribute</code> and as well as an
- * <code>org.w3c.dom.Attr</code>. So we first check if the object to
compare with (<code>obj</code>)
- * is of type <code>OMAttribute</code> (this includes instances of
<code>OMAttributeImpl</code> or
- * <code>AttrImpl</code> (instances of this class)). If so we check for
the equality
- * of namespaces first (note that if the namespace of this instance is
null then for the <code>obj</code>
- * to be equal its namespace must also be null). This condition solely
doesn't determine the equality.
- * So we check for the equality of names and values (note that the value
can also be null in which case
- * the same argument holds as that for the namespace) of the two
instances. If all three conditions are
- * met then we say the two instances are equal.
- *
- * <p>If <code>obj</code> is of type <code>org.w3c.dom.Attr</code> then we
perform the same equality check
- * as before. Note that, however, the implementation of the test for
equality in this case is little different
- * than before.
- *
- * <p>If <code>obj</code> is neither of type <code>OMAttribute</code> nor
of type <code>org.w3c.dom.Attr</code>
- * then we return false.
- *
- * @param obj The object to compare with this instance
- * @return True if the two objects are equal or else false. The equality
is checked as explained above.
- */
- public boolean equals(Object obj) {
- OMNamespace namespace = getNamespace();
- String localName = getLocalName();
- String attrValue = getValue();
- if (obj instanceof OMAttribute) { // Checks equality of an
OMAttributeImpl or an AttrImpl with this instance
- OMAttribute other = (OMAttribute) obj;
- return (namespace == null ? other.getNamespace() == null :
- namespace.equals(other.getNamespace()) &&
- localName.equals(other.getLocalName()) &&
- (attrValue == null ? other.getAttributeValue() == null :
-
attrValue.toString().equals(other.getAttributeValue())));
- } else if (obj instanceof Attr) {// Checks equality of an
org.w3c.dom.Attr with this instance
- Attr other = (Attr)obj;
- String otherNs = other.getNamespaceURI();
- if (namespace == null) { // I don't have a namespace
- if (otherNs != null) {
- return false; // I don't have a namespace and the other
has. So return false
- } else {
- // Both of us don't have namespaces. So check for name and
value equality only
- return (localName.equals(other.getLocalName()) &&
- (attrValue == null ? other.getValue() == null :
-
attrValue.toString().equals(other.getValue())));
- }
- } else { // Ok, now I've a namespace
- String ns = namespace.getNamespaceURI();
- String prefix = namespace.getPrefix();
- String otherPrefix = other.getPrefix();
- // First check for namespaceURI equality. Then check for
prefix equality.
- // Then check for name and value equality
- return (ns.equals(otherNs) && (prefix == null ? otherPrefix ==
null : prefix.equals(otherPrefix)) &&
- (localName.equals(other.getLocalName())) &&
- (attrValue == null ? other.getValue() == null :
-
attrValue.toString().equals(other.getValue())));
- }
- }
- return false;
- }
-
- public int hashCode() {
- OMNamespace namespace = getNamespace();
- String localName = getLocalName();
- String attrValue = getValue();
- return localName.hashCode() ^ (attrValue != null ?
attrValue.toString().hashCode() : 0) ^
- (namespace != null ? namespace.hashCode() : 0);
- }
-
ParentNode shallowClone(OMCloneOptions options, ParentNode targetParent,
boolean namespaceRepairing) {
// Note: targetParent is always null here
return new AttrImpl(getLocalName(), getNamespace(), type,
getOMFactory());
Modified:
webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java?rev=1685914&r1=1685913&r2=1685914&view=diff
==============================================================================
---
webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
(original)
+++
webservices/axiom/trunk/implementations/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
Tue Jun 16 21:46:34 2015
@@ -99,45 +99,6 @@ public class OMAttributeImpl extends OMI
return this.factory;
}
- /**
- * Checks for the equality of two <code>OMAttribute</code> instances. Thus
the object to compare
- * this with may be an instance of <code>OMAttributeImpl</code> (an
instance of this class) or
- * an instance of <code>AttrImpl</code>. The method returns false for any
object of type other
- * than <code>OMAttribute</code>.
- *
- * <p>We check for the equality of namespaces first (note that if the
namespace of this instance is null
- * then for the <code>obj</code> to be equal its namespace must also be
null). This condition solely
- * doesn't determine the equality. So we check for the equality of names
and values (note that the value
- * can also be null in which case the same argument holds as that for the
namespace) of the two instances.
- * If all three conditions are met then we say the two instances are equal.
- *
- * Note: We ignore the owner when checking for the equality. This is
simply because the owner is
- * introduced just to keep things simple for the programmer and not as
part of an attribute itself.
- *
- * @param obj The object to compare with this instance.
- * @return True if obj is equal to this or else false.
- */
- public boolean equals(Object obj) {
- if (! (obj instanceof OMAttribute)) return false;
- OMAttribute other = (OMAttribute)obj;
- OMNamespace namespace = getNamespace();
- String localName = getLocalName();
- //first check namespace then localName then value to improve
performance
- return (namespace == null ? other.getNamespace() == null :
- namespace.equals(other.getNamespace()) &&
- localName.equals(other.getLocalName()) &&
- (value == null ? other.getAttributeValue() == null :
- value.equals(other.getAttributeValue())));
-
- }
-
- public int hashCode() {
- OMNamespace namespace = getNamespace();
- String localName = getLocalName();
- return localName.hashCode() ^ (value != null ? value.hashCode() : 0) ^
- (namespace != null ? namespace.hashCode() : 0);
- }
-
public OMInformationItem clone(OMCloneOptions options) {
return new OMAttributeImpl(getLocalName(), getNamespace(), value,
factory);
}
Modified:
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java?rev=1685914&r1=1685913&r2=1685914&view=diff
==============================================================================
---
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
(original)
+++
webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/OMTestSuiteBuilder.java
Tue Jun 16 21:46:34 2015
@@ -67,7 +67,6 @@ public class OMTestSuiteBuilder extends
protected void addTests() {
addTest(new
org.apache.axiom.ts.om.attribute.TestDigestWithNamespace(metaFactory));
addTest(new
org.apache.axiom.ts.om.attribute.TestDigestWithoutNamespace(metaFactory));
- addTest(new
org.apache.axiom.ts.om.attribute.TestEqualsHashCode(metaFactory));
addTest(new
org.apache.axiom.ts.om.attribute.TestGetAttributeTypeDefault(metaFactory));
addTest(new
org.apache.axiom.ts.om.attribute.TestGetNamespaceNormalized(metaFactory));
addTest(new
org.apache.axiom.ts.om.attribute.TestGetNamespaceURIWithNamespace(metaFactory));