    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
    022    /**
    023     * Represents a namespace node.
    024     *
    025     * @author Dmitri Plotnikov
    026     * @version $Revision: 652884 $ $Date: 2008-05-02 15:02:00 -0500 (Fri, 02 May 2008) $
    027     */
    028    public class JDOMNamespacePointer extends NodePointer {
    029        private String prefix;
    030        private String namespaceURI;
    031
    032        private static final long serialVersionUID = 7935311686545862379L;
    033
    034        /**
    035         * Create a new JDOMNamespacePointer.
    036         * @param parent parent pointer
    037         * @param prefix ns prefix
    038         */
    039        public JDOMNamespacePointer(NodePointer parent, String prefix) {
    040            super(parent);
    041            this.prefix = prefix;
    042        }
    043
    044        /**
    045         * Create a new JDOMNamespacePointer.
    046         * @param parent parent pointer
    047         * @param prefix ns prefix
    048         * @param namespaceURI ns URI
    049         */
    050        public JDOMNamespacePointer(
    051                NodePointer parent,
    052                String prefix,
    053                String namespaceURI) {
    054            super(parent);
    055            this.prefix = prefix;
    056            this.namespaceURI = namespaceURI;
    057        }
    058
    059        public QName getName() {
    060            return new QName(prefix);
    061        }
    062
    063        public Object getBaseValue() {
    064            return null;
    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 getNamespaceURI();
    077        }
    078
    079        public String getNamespaceURI() {
    080            if (namespaceURI == null) {
    081                namespaceURI = parent.getNamespaceURI(prefix);
    082            }
    083            return namespaceURI;
    084        }
    085
    086        public boolean isLeaf() {
    087            return true;
    088        }
    089
    090        /**
    091         * Throws UnsupportedOperationException.
    092         * @param value Object value to set
    093         */
    094        public void setValue(Object value) {
    095            throw new UnsupportedOperationException("Cannot modify a namespace");
    096        }
    097
    098        public String asPath() {
    099            StringBuffer buffer = new StringBuffer();
    100            if (parent != null) {
    101                buffer.append(parent.asPath());
    102                if (buffer.length() == 0
    103                    || buffer.charAt(buffer.length() - 1) != '/') {
    104                    buffer.append('/');
    105                }
    106            }
    107            buffer.append("namespace::");
    108            buffer.append(prefix);
    109            return buffer.toString();
    110        }
    111
    112        public int hashCode() {
    113            return prefix.hashCode();
    114        }
    115
    116        public boolean equals(Object object) {
    117            return object == this || object instanceof JDOMNamespacePointer && prefix.equals(((JDOMNamespacePointer) object).prefix);
    118        }
    119
    120        public int compareChildNodePointers(
    121            NodePointer pointer1,
    122            NodePointer pointer2) {
    123            // Won't happen - namespaces don't have children
    124            return 0;
    125        }
    126    }