blob: d26a188d05ee6aa148f443ebcbdae8cc8e9bd567 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axiom.om;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import org.w3c.dom.EntityReference;
import org.w3c.dom.Node;
import org.xml.sax.ContentHandler;
import org.xml.sax.ext.LexicalHandler;
/**
* Represents an unexpanded entity reference in an XML document.
* <p>
* Different XML APIs and object models handle entity references fairly differently:
* <ul>
* <li>In DOM, the way entity references in an XML document are processed depends on the setting for
* {@link DocumentBuilderFactory#setExpandEntityReferences(boolean) expandEntityReferences}. If this
* property is set to <code>true</code> (default), then the parser will expand entity references and
* the resulting DOM tree simply contains the nodes resulting from this expansion. If this property
* is set to <code>false</code>, then the parser will still expand entity references, but the
* resulting DOM tree will contain {@link EntityReference} nodes, the children of which represent
* the nodes resulting from this expansion. Note that since an entity declaration may contain
* markup, the children of an {@link EntityReference} node may have a type other than
* {@link Node#TEXT_NODE}. Application code not interested in entity references will generally set
* {@link DocumentBuilderFactory#setExpandEntityReferences(boolean) expandEntityReferences} to
* <code>true</code> in order to avoid the additional programming logic required to process
* {@link EntityReference} nodes.
* <li>In SAX, the parser will always expand entity references and report the events resulting from
* this expansion to the {@link ContentHandler}. In addition to that, if a {@link LexicalHandler} is
* registered, then the parser will report the start and end of the expansion using
* {@link LexicalHandler#startEntity(String)} and {@link LexicalHandler#endEntity(String)}. This
* means that the processing of entity references in SAX is similar to DOM with
* {@link DocumentBuilderFactory#setExpandEntityReferences(boolean) expandEntityReferences} set to
* <code>false</code>. Note that in SAX there is no corresponding configuration property. This makes
* sense because an application not interested in entity references can simply ignore the
* {@link LexicalHandler#startEntity(String)} and {@link LexicalHandler#endEntity(String)} events or
* not register a {@link LexicalHandler} at all.
* <li>In StAX, the way entity references are processed depends on the setting for the
* {@link XMLInputFactory#IS_REPLACING_ENTITY_REFERENCES} property. If this property is set to true
* (default), then the parser will expand entity references and report only the events resulting
* from that expansion. If the property is set to false, then the parser no longer expands entity
* references. Instead, it will report each entity reference using a single
* {@link XMLStreamConstants#ENTITY_REFERENCE} event. {@link XMLStreamReader#getText()} can then be
* used to get the replacement value for the entity. Note that this replacement value may contain
* unparsed markup. One can see that the way StAX reports entity references is significantly
* different than DOM or SAX.
* </ul>
* Axiom models entity references in the same way as StAX: the node corresponding to an (unexpanded)
* entity reference only stores the name of the entity as well as the replacement value.
*/
public interface OMEntityReference extends OMNode {
/**
* Get the name of the referenced entity.
*
* @return the name of the entity
*/
String getName();
/**
* Get the replacement value for this entity reference. Note that the replacement value is a
* simple string and may therefore contain unparsed markup.
*
* @return the replacement value, or <code>null</code> if the replacement value is not available
*/
String getReplacementText();
}