    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.beans;
    018
    019    import java.util.Locale;
    020
    021    import org.apache.commons.jxpath.JXPathContext;
    022    import org.apache.commons.jxpath.ri.QName;
    023    import org.apache.commons.jxpath.ri.model.NodePointer;
    024
    025    /**
    026     * Pointer whose value is <code>null</code>.
    027     * @author Dmitri Plotnikov
    028     * @version $Revision: 652915 $ $Date: 2008-05-02 16:12:57 -0500 (Fri, 02 May 2008) $
    029     */
    030    public class NullPointer extends PropertyOwnerPointer {
    031        private QName name;
    032        private String id;
    033
    034        private static final long serialVersionUID = 2193425983220679887L;
    035
    036        /**
    037         * Create a new NullPointer.
    038         * @param name node name
    039         * @param locale Locale
    040         */
    041        public NullPointer(QName name, Locale locale) {
    042            super(null, locale);
    043            this.name = name;
    044        }
    045
    046        /**
    047         * Used for the root node.
    048         * @param parent parent pointer
    049         * @param name node name
    050         */
    051        public NullPointer(NodePointer parent, QName name) {
    052            super(parent);
    053            this.name = name;
    054        }
    055
    056        /**
    057         * Create a new NullPointer.
    058         * @param locale Locale
    059         * @param id String
    060         */
    061        public NullPointer(Locale locale, String id) {
    062            super(null, locale);
    063            this.id = id;
    064        }
    065
    066        public QName getName() {
    067            return name;
    068        }
    069
    070        public Object getBaseValue() {
    071            return null;
    072        }
    073
    074        public boolean isCollection() {
    075            return false;
    076        }
    077
    078        public boolean isLeaf() {
    079            return true;
    080        }
    081
    082        public boolean isActual() {
    083            return false;
    084        }
    085
    086        public PropertyPointer getPropertyPointer() {
    087            return new NullPropertyPointer(this);
    088        }
    089
    090        public NodePointer createPath(JXPathContext context, Object value) {
    091            if (parent != null) {
    092                return parent.createPath(context, value).getValuePointer();
    093            }
    094            throw new UnsupportedOperationException(
    095                "Cannot create the root object: " + asPath());
    096        }
    097
    098        public NodePointer createPath(JXPathContext context) {
    099            if (parent != null) {
    100                return parent.createPath(context).getValuePointer();
    101            }
    102            throw new UnsupportedOperationException(
    103                "Cannot create the root object: " + asPath());
    104        }
    105
    106        public NodePointer createChild(
    107            JXPathContext context,
    108            QName name,
    109            int index) {
    110            return createPath(context).createChild(context, name, index);
    111        }
    112
    113        public NodePointer createChild(
    114            JXPathContext context,
    115            QName name,
    116            int index,
    117            Object value) {
    118            return createPath(context).createChild(context, name, index, value);
    119        }
    120
    121        public int hashCode() {
    122            return name == null ? 0 : name.hashCode();
    123        }
    124
    125        public boolean equals(Object object) {
    126            if (object == this) {
    127                return true;
    128            }
    129
    130            if (!(object instanceof NullPointer)) {
    131                return false;
    132            }
    133
    134            NullPointer other = (NullPointer) object;
    135            return name == other.name || name != null && name.equals(other.name);
    136        }
    137
    138        public String asPath() {
    139            if (id != null) {
    140                return "id(" + id + ")";
    141            }
    142            return parent == null ? "null()" : super.asPath();
    143        }
    144
    145        public int getLength() {
    146            return 0;
    147        }
    148    }