    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements.  See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache License, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License.  You may obtain a copy of the License at
    008     *
    009     *     http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the License for the specific language governing permissions and
    015     * limitations under the License.
    016     */
    017    package org.apache.commons.jxpath.ri.model.dom;
    018
    019    import org.apache.commons.jxpath.ri.Compiler;
    020    import org.apache.commons.jxpath.ri.QName;
    021    import org.apache.commons.jxpath.ri.compiler.NodeTest;
    022    import org.apache.commons.jxpath.ri.compiler.NodeTypeTest;
    023    import org.apache.commons.jxpath.ri.model.NodePointer;
    024    import org.apache.commons.jxpath.util.TypeUtils;
    025    import org.w3c.dom.Attr;
    026
    027    /**
    028     * A Pointer that points to a DOM node. Because the underlying DOM Attr is not Serializable,
    029     * neither is this pointer class truly so.
    030     *
    031     * @author Dmitri Plotnikov
    032     * @version $Revision: 670727 $ $Date: 2008-06-23 15:10:38 -0500 (Mon, 23 Jun 2008) $
    033     */
    034    public class DOMAttributePointer extends NodePointer {
    035        private static final long serialVersionUID = 1115085175427555951L;
    036
    037        private Attr attr;
    038
    039        /**
    040         * Create a new DOMAttributePointer.
    041         * @param parent pointer
    042         * @param attr pointed
    043         */
    044        public DOMAttributePointer(NodePointer parent, Attr attr) {
    045            super(parent);
    046            this.attr = attr;
    047        }
    048
    049        public QName getName() {
    050            return new QName(
    051                DOMNodePointer.getPrefix(attr),
    052                DOMNodePointer.getLocalName(attr));
    053        }
    054
    055        public String getNamespaceURI() {
    056            String prefix = DOMNodePointer.getPrefix(attr);
    057            return prefix == null ? null : parent.getNamespaceURI(prefix);
    058        }
    059
    060        public Object getValue() {
    061            String value = attr.getValue();
    062            if (value == null || (value.equals("") && !attr.getSpecified())) {
    063                return null;
    064            }
    065            return value;
    066        }
    067
    068        public Object getBaseValue() {
    069            return attr;
    070        }
    071
    072        public boolean isCollection() {
    073            return false;
    074        }
    075
    076        public int getLength() {
    077            return 1;
    078        }
    079
    080        public Object getImmediateNode() {
    081            return attr;
    082        }
    083
    084        public boolean isActual() {
    085            return true;
    086        }
    087
    088        public boolean isLeaf() {
    089            return true;
    090        }
    091
    092        public boolean testNode(NodeTest nodeTest) {
    093            return nodeTest == null
    094                || ((nodeTest instanceof NodeTypeTest)
    095                    && ((NodeTypeTest) nodeTest).getNodeType() == Compiler.NODE_TYPE_NODE);
    096        }
    097
    098        /**
    099         * Sets the value of this attribute.
    100         * @param value to set
    101         */
    102        public void setValue(Object value) {
    103            attr.setValue((String) TypeUtils.convert(value, String.class));
    104        }
    105
    106        public void remove() {
    107            attr.getOwnerElement().removeAttributeNode(attr);
    108        }
    109
    110        public String asPath() {
    111            StringBuffer buffer = new StringBuffer();
    112            if (parent != null) {
    113                buffer.append(parent.asPath());
    114                if (buffer.length() == 0
    115                    || buffer.charAt(buffer.length() - 1) != '/') {
    116                    buffer.append('/');
    117                }
    118            }
    119            buffer.append('@');
    120            buffer.append(getName());
    121            return buffer.toString();
    122        }
    123
    124        public int hashCode() {
    125            return System.identityHashCode(attr);
    126        }
    127
    128        public boolean equals(Object object) {
    129            return object == this || object instanceof DOMAttributePointer
    130                    && attr == ((DOMAttributePointer) object).attr;
    131        }
    132
    133        public int compareChildNodePointers(NodePointer pointer1,
    134                NodePointer pointer2) {
    135            // Won't happen - attributes don't have children
    136            return 0;
    137        }
    138    }