1 /* 2 * reserved comment block 3 * DO NOT REMOVE OR ALTER! 4 */ 5 /* 6 * Licensed to the Apache Software Foundation (ASF) under one or more 7 * contributor license agreements. See the NOTICE file distributed with 8 * this work for additional information regarding copyright ownership. 9 * The ASF licenses this file to You under the Apache License, Version 2.0 10 * (the "License"); you may not use this file except in compliance with 11 * the License. You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 */ 21 22 package com.sun.org.apache.xerces.internal.dom; 23 24 import org.w3c.dom.Entity; 25 import org.w3c.dom.Node; 26 import org.w3c.dom.DOMException; 27 28 /** 29 * Entity nodes hold the reference data for an XML Entity -- either 30 * parsed or unparsed. The nodeName (inherited from Node) will contain 31 * the name (if any) of the Entity. Its data will be contained in the 32 * Entity's children, in exactly the structure which an 33 * EntityReference to this name will present within the document's 34 * body. 35 * <P> 36 * Note that this object models the actual entity, _not_ the entity 37 * declaration or the entity reference. 38 * <P> 39 * An XML processor may choose to completely expand entities before 40 * the structure model is passed to the DOM; in this case, there will 41 * be no EntityReferences in the DOM tree. 42 * <P> 43 * Quoting the 10/01 DOM Proposal, 44 * <BLOCKQUOTE> 45 * "The DOM Level 1 does not support editing Entity nodes; if a user 46 * wants to make changes to the contents of an Entity, every related 47 * EntityReference node has to be replaced in the structure model by 48 * a clone of the Entity's contents, and then the desired changes 49 * must be made to each of those clones instead. All the 50 * descendants of an Entity node are readonly." 51 * </BLOCKQUOTE> 52 * I'm interpreting this as: It is the parser's responsibilty to call 53 * the non-DOM operation setReadOnly(true,true) after it constructs 54 * the Entity. Since the DOM explicitly decided not to deal with this, 55 * _any_ answer will involve a non-DOM operation, and this is the 56 * simplest solution. 57 * 58 * @xerces.internal 59 * 60 * @author Elena Litani, IBM 61 * @since PR-DOM-Level-1-19980818. 62 */ 63 public class EntityImpl 64 extends ParentNode 65 implements Entity { 66 67 // 68 // Constants 69 // 70 71 /** Serialization version. */ 72 static final long serialVersionUID = -3575760943444303423L; 73 74 // 75 // Data 76 // 77 78 /** Entity name. */ 79 protected String name; 80 81 /** Public identifier. */ 82 protected String publicId; 83 84 /** System identifier. */ 85 protected String systemId; 86 87 /** Encoding */ 88 protected String encoding; 89 90 91 /** Input Encoding */ 92 protected String inputEncoding; 93 94 /** Version */ 95 protected String version; 96 97 98 /** Notation name. */ 99 protected String notationName; 100 101 /** base uri*/ 102 protected String baseURI; 103 104 // 105 // Constructors 106 // 107 108 /** Factory constructor. */ 109 public EntityImpl(CoreDocumentImpl ownerDoc, String name) { 110 super(ownerDoc); 111 this.name = name; 112 isReadOnly(true); 113 } 114 115 // 116 // Node methods 117 // 118 119 /** 120 * A short integer indicating what type of node this is. The named 121 * constants for this value are defined in the org.w3c.dom.Node interface. 122 */ 123 public short getNodeType() { 124 return Node.ENTITY_NODE; 125 } 126 127 /** 128 * Returns the entity name 129 */ 130 public String getNodeName() { 131 if (needsSyncData()) { 132 synchronizeData(); 133 } 134 return name; 135 } 136 /** 137 * Sets the node value. 138 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) 139 */ 140 public void setNodeValue(String x) 141 throws DOMException { 142 if (ownerDocument.errorChecking && isReadOnly()) { 143 String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null); 144 throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg); 145 } 146 } 147 /** 148 * The namespace prefix of this node 149 * @exception DOMException 150 * <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly. 151 */ 152 public void setPrefix(String prefix) 153 throws DOMException 154 { 155 if (ownerDocument.errorChecking && isReadOnly()) { 156 throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, 157 DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, 158 "NO_MODIFICATION_ALLOWED_ERR", null)); 159 } 160 } 161 /** Clone node. */ 162 public Node cloneNode(boolean deep) { 163 EntityImpl newentity = (EntityImpl)super.cloneNode(deep); 164 newentity.setReadOnly(true, deep); 165 return newentity; 166 } 167 168 // 169 // Entity methods 170 // 171 172 /** 173 * The public identifier associated with the entity. If not specified, 174 * this will be null. 175 */ 176 public String getPublicId() { 177 178 if (needsSyncData()) { 179 synchronizeData(); 180 } 181 return publicId; 182 183 } // getPublicId():String 184 185 /** 186 * The system identifier associated with the entity. If not specified, 187 * this will be null. 188 */ 189 public String getSystemId() { 190 191 if (needsSyncData()) { 192 synchronizeData(); 193 } 194 return systemId; 195 196 } // getSystemId():String 197 198 /** 199 * DOM Level 3 WD - experimental 200 * the version number of this entity, when it is an external parsed entity. 201 */ 202 public String getXmlVersion() { 203 204 if (needsSyncData()) { 205 synchronizeData(); 206 } 207 return version; 208 209 } // getVersion():String 210 211 212 /** 213 * DOM Level 3 WD - experimental 214 * the encoding of this entity, when it is an external parsed entity. 215 */ 216 public String getXmlEncoding() { 217 218 if (needsSyncData()) { 219 synchronizeData(); 220 } 221 222 return encoding; 223 224 } // getVersion():String 225 226 227 228 229 230 /** 231 * Unparsed entities -- which contain non-XML data -- have a 232 * "notation name" which tells applications how to deal with them. 233 * Parsed entities, which <em>are</em> in XML format, don't need this and 234 * set it to null. 235 */ 236 public String getNotationName() { 237 238 if (needsSyncData()) { 239 synchronizeData(); 240 } 241 return notationName; 242 243 } // getNotationName():String 244 245 // 246 // Public methods 247 // 248 249 /** 250 * DOM Level 2: The public identifier associated with the entity. If not specified, 251 * this will be null. */ 252 public void setPublicId(String id) { 253 254 if (needsSyncData()) { 255 synchronizeData(); 256 } 257 publicId = id; 258 259 } // setPublicId(String) 260 261 /** 262 * NON-DOM 263 * encoding - An attribute specifying, as part of the text declaration, 264 * the encoding of this entity, when it is an external parsed entity. 265 * This is null otherwise 266 * 267 */ 268 public void setXmlEncoding(String value) { 269 if (needsSyncData()) { 270 synchronizeData(); 271 } 272 encoding = value; 273 } // setEncoding (String) 274 275 276 /** 277 * An attribute specifying the encoding used for this entity at the tiome 278 * of parsing, when it is an external parsed entity. This is 279 * <code>null</code> if it an entity from the internal subset or if it 280 * is not known.. 281 * @since DOM Level 3 282 */ 283 public String getInputEncoding(){ 284 if (needsSyncData()) { 285 synchronizeData(); 286 } 287 return inputEncoding; 288 } 289 290 /** 291 * NON-DOM, used to set the input encoding. 292 */ 293 public void setInputEncoding(String inputEncoding){ 294 if (needsSyncData()) { 295 synchronizeData(); 296 } 297 this.inputEncoding = inputEncoding; 298 } 299 300 /** 301 * NON-DOM 302 * version - An attribute specifying, as part of the text declaration, 303 * the version number of this entity, when it is an external parsed entity. 304 * This is null otherwise 305 */ 306 public void setXmlVersion(String value) { 307 if (needsSyncData()) { 308 synchronizeData(); 309 } 310 version = value; 311 } // setVersion (String) 312 313 314 /** 315 * DOM Level 2: The system identifier associated with the entity. If not 316 * specified, this will be null. 317 */ 318 public void setSystemId(String id) { 319 if (needsSyncData()) { 320 synchronizeData(); 321 } 322 systemId = id; 323 324 } // setSystemId(String) 325 326 /** 327 * DOM Level 2: Unparsed entities -- which contain non-XML data -- have a 328 * "notation name" which tells applications how to deal with them. 329 * Parsed entities, which <em>are</em> in XML format, don't need this and 330 * set it to null. 331 */ 332 public void setNotationName(String name) { 333 if (needsSyncData()) { 334 synchronizeData(); 335 } 336 notationName = name; 337 338 } // setNotationName(String) 339 340 341 342 /** 343 * Returns the absolute base URI of this node or null if the implementation 344 * wasn't able to obtain an absolute URI. Note: If the URI is malformed, a 345 * null is returned. 346 * 347 * @return The absolute base URI of this node or null. 348 * @since DOM Level 3 349 */ 350 public String getBaseURI() { 351 352 if (needsSyncData()) { 353 synchronizeData(); 354 } 355 return (baseURI!=null)?baseURI:((CoreDocumentImpl)getOwnerDocument()).getBaseURI(); 356 } 357 358 /** NON-DOM: set base uri*/ 359 public void setBaseURI(String uri){ 360 if (needsSyncData()) { 361 synchronizeData(); 362 } 363 baseURI = uri; 364 } 365 366 367 368 } // class EntityImpl