Author: ruchithf
Date: Thu Feb 14 22:22:45 2008
New Revision: 627957

URL: http://svn.apache.org/viewvc?rev=627957&view=rev
Log:
Applied Saliya's patch to WSCOMMONS-230

Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMAttribute.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/ds/InputStreamDataSource.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/xpath/DocumentNavigator.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMAttribute.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMAttribute.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMAttribute.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMAttribute.java
 Thu Feb 14 22:22:45 2008
@@ -46,4 +46,10 @@
 
     /** Returns the OMFactory that created this object */
     OMFactory getOMFactory();
+
+    /**
+     * Returns the owner element of this attribute
+     * @return OMElement - The owner element
+     */
+    OMElement getOwner();
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/ds/InputStreamDataSource.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/ds/InputStreamDataSource.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/ds/InputStreamDataSource.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/ds/InputStreamDataSource.java
 Thu Feb 14 22:22:45 2008
@@ -131,7 +131,7 @@
         try {
             serialize(baos, format);
         } catch (XMLStreamException e) {
-            new OMException(e);
+            throw new OMException(e);
         }
         return baos.toByteArray();
     }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/xpath/DocumentNavigator.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/xpath/DocumentNavigator.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/xpath/DocumentNavigator.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/xpath/DocumentNavigator.java
 Thu Feb 14 22:22:45 2008
@@ -762,6 +762,18 @@
         public OMFactory getOMFactory() {
             return this.factory;
         }
+
+        /**
+         * Returns the owner element of this attribute
+         * 
+         * @return OMElement If the parent <code>OMContainer</code> is an
+         * instanceof <code>OMElement</code> we return that element else
+         * we return null. To get the <code>OMContainer</code> itself use
+         * the <code>getParent()</code> method.
+         */
+        public OMElement getOwner() {
+            return (parent instanceof OMElement) ? (OMElement)parent : null;
+        }
     }
 }
 

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/AttrImpl.java
 Thu Feb 14 22:22:45 2008
@@ -18,13 +18,8 @@
  */
 package org.apache.axiom.om.impl.dom;
 
-import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMConstants;
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMNamespace;
-import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.*;
+import org.apache.axiom.om.xpath.DocumentNavigator;
 import org.w3c.dom.Attr;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Element;
@@ -398,6 +393,77 @@
         return (this.namespace == null) ? this.attrName : this.namespace
                 .getPrefix()
                 + ":" + this.attrName;
+    }
+
+    /**
+     * Returns the owner element of this attribute
+     * @return OMElement - if the parent OMContainer is an instanceof OMElement
+     * we return that OMElement else return null. To get the OMContainer 
itself use
+     * getParent() method.
+     */
+    public OMElement getOwner() {
+        return (parent instanceof OMElement) ? (OMElement)parent : null;
+    }
+
+    /**
+     * 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) {
+        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()) &&
+                    attrName.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 (attrName.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)) &&
+                        (attrName.equals(other.getLocalName())) &&
+                        (attrValue == null ? other.getValue() == null :
+                                
attrValue.toString().equals(other.getValue())));
+            }
+        }
+        return false;
+    }
+
+    public int hashCode() {
+        return attrName.hashCode() ^ (attrValue != null ? 
attrValue.toString().hashCode() : 0) ^
+                (namespace != null ? namespace.hashCode() : 0);
     }
 
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMAttributeImpl.java
 Thu Feb 14 22:22:45 2008
@@ -22,6 +22,7 @@
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.om.OMElement;
 
 import javax.xml.namespace.QName;
 
@@ -39,6 +40,9 @@
     /** <code>OMFactory</code> that created this <code>OMAttribute</code> */
     private OMFactory factory;
 
+    // Keep track of the owner of the attribute
+    protected OMElement owner;
+
     /**
      * Constructor OMAttributeImpl.
      *
@@ -131,6 +135,49 @@
 
     public OMFactory getOMFactory() {
         return this.factory;
+    }
+
+    /**
+     * Returns the owner element of this attribute
+     * @return OMElement - the owner element
+     */
+    public OMElement getOwner() {
+        return owner;
+    }
+
+    /**
+     * 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;
+        //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() {
+        return localName.hashCode() ^ (value != null ? value.hashCode() : 0) ^
+                (namespace != null ? namespace.hashCode() : 0);
     }
 
 }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java?rev=627957&r1=627956&r2=627957&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 Thu Feb 14 22:22:45 2008
@@ -518,9 +518,25 @@
      * Inserts an attribute to this element. Implementor can decide as to 
insert this in the front
      * or at the end of set of attributes.
      *
-     * @return Returns attribute.
+     * <p>The owner of the attribute is set to be the particular 
<code>OMElement</code>.
+     * If the attribute already has an owner then the attribute is cloned 
(i.e. its name,
+     * value and namespace are copied to a new attribute) and the new 
attribute is added
+     * to the element. It's owner is then set to be the particular 
<code>OMElement</code>.
+     * 
+     * @return The attribute that was added to the element. Note: The added 
attribute
+     * may not be the same instance that was given to add. This can happen if 
the given
+     * attribute already has an owner. In such case the returned attribute and 
the given
+     * attribute are <i>equal</i> but not the same instance.
+     *
+     * @see OMAttributeImpl#equals(Object)
      */
-    public OMAttribute addAttribute(OMAttribute attr) {
+    public OMAttribute addAttribute(OMAttribute attr){
+        // If the attribute already has an owner element then clone the 
attribute
+        if (attr.getOwner() !=null){
+            attr = new OMAttributeImpl(
+                    attr.getLocalName(), attr.getNamespace(), 
attr.getAttributeValue(), attr.getOMFactory());
+        }
+
         if (attributes == null) {
             this.attributes = new LinkedHashMap(5);
         }
@@ -533,6 +549,8 @@
             this.declareNamespace(nsURI, nsPrefix);
         }
 
+        // Set the owner element of the attribute
+        ((OMAttributeImpl)attr).owner = this;
         attributes.put(attr.getQName(), attr);
         return attr;
     }
@@ -540,14 +558,33 @@
     /** Method removeAttribute. */
     public void removeAttribute(OMAttribute attr) {
         if (attributes != null) {
+            // Remove the owner from this attribute
+            ((OMAttributeImpl)attr).owner = null;
             attributes.remove(attr.getQName());
         }
     }
 
     /**
-     * Method addAttribute.
      *
-     * @return Returns OMAttribute.
+     * Creates an <code>OMAttributeImpl</code> instance out of the given 
arguments and
+     * inserts that attribute to this element. Implementor can decide as to 
insert this
+     * in the front or at the end of set of attributes.
+     *
+     * <p>The owner of the attribute is set to be the particular 
<code>OMElement</code>.
+     * If the attribute already has an owner then the attribute is cloned 
(i.e. its name,
+     * value and namespace are copied to a new attribute) and the new 
attribute is added
+     * to the element. It's owner is then set to be the particular 
<code>OMElement</code>.
+     *
+     * @param attributeName The name of the attribute
+     * @param value The value of the attribute
+     * @param ns The namespace of the attribute
+     *
+     * @return The attribute that was added to the element. Note: The added 
attribute
+     * may not be the same instance that was given to add. This can happen if 
the given
+     * attribute already has an owner. In such case the returned attribute and 
the given
+     * attribute are <i>equal</i> but not the same instance.
+     *
+     * @see OMAttributeImpl#equals(Object)
      */
     public OMAttribute addAttribute(String attributeName, String value,
                                     OMNamespace ns) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to