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
018package org.apache.commons.jxpath.ri.model.jdom;
019
020import org.apache.commons.jxpath.ri.QName;
021import org.apache.commons.jxpath.ri.model.NodePointer;
022
023/**
024 * Represents a namespace node.
025 */
026public class JDOMNamespacePointer extends NodePointer {
027
028    private static final long serialVersionUID = 7935311686545862379L;
029
030    /** Namespace prefix. */
031    private final String prefix;
032
033    /** Namespace URI string. */
034    private String namespaceURI;
035
036    /**
037     * Constructs a new JDOMNamespacePointer.
038     *
039     * @param parent parent pointer
040     * @param prefix ns prefix
041     */
042    public JDOMNamespacePointer(final NodePointer parent, final String prefix) {
043        super(parent);
044        this.prefix = prefix;
045    }
046
047    /**
048     * Constructs a new JDOMNamespacePointer.
049     *
050     * @param parent       parent pointer
051     * @param prefix       ns prefix
052     * @param namespaceURI ns URI
053     */
054    public JDOMNamespacePointer(final NodePointer parent, final String prefix, final String namespaceURI) {
055        super(parent);
056        this.prefix = prefix;
057        this.namespaceURI = namespaceURI;
058    }
059
060    @Override
061    public String asPath() {
062        final StringBuilder buffer = new StringBuilder();
063        if (parent != null) {
064            buffer.append(parent.asPath());
065            if (buffer.length() == 0 || buffer.charAt(buffer.length() - 1) != '/') {
066                buffer.append('/');
067            }
068        }
069        buffer.append("namespace::");
070        buffer.append(prefix);
071        return buffer.toString();
072    }
073
074    @Override
075    public int compareChildNodePointers(final NodePointer pointer1, final NodePointer pointer2) {
076        // Won't happen - namespaces don't have children
077        return 0;
078    }
079
080    @Override
081    public boolean equals(final Object object) {
082        return object == this || object instanceof JDOMNamespacePointer && prefix.equals(((JDOMNamespacePointer) object).prefix);
083    }
084
085    @Override
086    public Object getBaseValue() {
087        return null;
088    }
089
090    @Override
091    public Object getImmediateNode() {
092        return getNamespaceURI();
093    }
094
095    @Override
096    public int getLength() {
097        return 1;
098    }
099
100    @Override
101    public QName getName() {
102        return new QName(prefix);
103    }
104
105    @Override
106    public String getNamespaceURI() {
107        if (namespaceURI == null) {
108            namespaceURI = parent.getNamespaceURI(prefix);
109        }
110        return namespaceURI;
111    }
112
113    @Override
114    public int hashCode() {
115        return prefix.hashCode();
116    }
117
118    @Override
119    public boolean isCollection() {
120        return false;
121    }
122
123    @Override
124    public boolean isLeaf() {
125        return true;
126    }
127
128    /**
129     * Throws UnsupportedOperationException.
130     *
131     * @param value Object value to set
132     */
133    @Override
134    public void setValue(final Object value) {
135        throw new UnsupportedOperationException("Cannot modify a namespace");
136    }
137}