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.jdom;
018
019 import org.apache.commons.jxpath.ri.QName;
020 import org.apache.commons.jxpath.ri.model.NodePointer;
021 import org.apache.commons.jxpath.util.TypeUtils;
022 import 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 15:02:00 -0500 (Fri, 02 May 2008) $
029 */
030 public 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 }