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 }