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 */
017package org.apache.commons.jxpath.ri.model.jdom;
018
019import org.apache.commons.jxpath.ri.QName;
020import org.apache.commons.jxpath.ri.model.NodePointer;
021import org.apache.commons.jxpath.util.TypeUtils;
022import org.jdom.Attribute;
023
024/**
025 * A Pointer that points to a DOM node.
026 *
027 * @author Dmitri Plotnikov
028 * @version $Revision: 652884 $ $Date: 2008-05-02 22:02:00 +0200 (Fr, 02 Mai 2008) $
029 */
030public class JDOMAttributePointer extends NodePointer {
031    private Attribute attr;
032
033    private static final long serialVersionUID = 8896050354479644028L;
034
035    /**
036     * Create a JDOMAttributePointer.
037     * @param parent NodePointer parent
038     * @param attr JDOM Attribute
039     */
040    public JDOMAttributePointer(NodePointer parent, Attribute attr) {
041        super(parent);
042        this.attr = attr;
043    }
044
045    public QName getName() {
046        return new QName(
047            JDOMNodePointer.getPrefix(attr),
048            JDOMNodePointer.getLocalName(attr));
049    }
050
051    public String getNamespaceURI() {
052        String uri = attr.getNamespaceURI();
053        if (uri != null && uri.equals("")) {
054            uri = null;
055        }
056        return uri;
057    }
058
059    public Object getValue() {
060        return attr.getValue();
061    }
062
063    public Object getBaseValue() {
064        return attr;
065    }
066
067    public boolean isCollection() {
068        return false;
069    }
070
071    public int getLength() {
072        return 1;
073    }
074
075    public Object getImmediateNode() {
076        return attr;
077    }
078
079    public boolean isActual() {
080        return true;
081    }
082
083    public boolean isLeaf() {
084        return true;
085    }
086
087    public void setValue(Object value) {
088        attr.setValue((String) TypeUtils.convert(value, String.class));
089    }
090
091    public void remove() {
092        attr.getParent().removeAttribute(attr);
093    }
094
095    public String asPath() {
096        StringBuffer buffer = new StringBuffer();
097        if (parent != null) {
098            buffer.append(parent.asPath());
099            if (buffer.length() == 0
100                || buffer.charAt(buffer.length() - 1) != '/') {
101                buffer.append('/');
102            }
103        }
104        buffer.append('@');
105        buffer.append(getName());
106        return buffer.toString();
107    }
108
109    public int hashCode() {
110        return System.identityHashCode(attr);
111    }
112
113    public boolean equals(Object object) {
114        return object == this || object instanceof JDOMAttributePointer
115                && ((JDOMAttributePointer) object).attr == attr;
116    }
117
118    public int compareChildNodePointers(
119            NodePointer pointer1,
120            NodePointer pointer2) {
121        // Won't happen - attributes don't have children
122        return 0;
123    }
124}