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