in src/org/apache/xerces/parsers/AbstractDOMParser.java [1511:1679]
public void endGeneralEntity (String name, Augmentations augs) throws XNIException {
if (DEBUG_EVENTS) {
System.out.println ("==>endGeneralEntity: ("+name+")");
}
if (!fDeferNodeExpansion) {
if (fFilterReject) {
return;
}
setCharacterData (true);
if (fDocumentType != null) {
// get current entity declaration
NamedNodeMap entities = fDocumentType.getEntities ();
fCurrentEntityDecl = (EntityImpl) entities.getNamedItem (name);
if (fCurrentEntityDecl != null) {
if (fCurrentEntityDecl != null && fCurrentEntityDecl.getFirstChild () == null) {
fCurrentEntityDecl.setReadOnly (false, true);
Node child = fCurrentNode.getFirstChild ();
while (child != null) {
Node copy = child.cloneNode (true);
fCurrentEntityDecl.appendChild (copy);
child = child.getNextSibling ();
}
fCurrentEntityDecl.setReadOnly (true, true);
//entities.setNamedItem(fCurrentEntityDecl);
}
fCurrentEntityDecl = null;
}
}
fInEntityRef = false;
boolean removeEntityRef = false;
if (fCreateEntityRefNodes) {
if (fDocumentImpl != null) {
// Make entity ref node read only
((NodeImpl)fCurrentNode).setReadOnly (true, true);
}
if (fDOMFilter !=null &&
(fDOMFilter.getWhatToShow () & NodeFilter.SHOW_ENTITY_REFERENCE)!= 0) {
short code = fDOMFilter.acceptNode (fCurrentNode);
switch (code) {
case LSParserFilter.FILTER_INTERRUPT:{
throw Abort.INSTANCE;
}
case LSParserFilter.FILTER_REJECT:{
Node parent = fCurrentNode.getParentNode ();
parent.removeChild (fCurrentNode);
fCurrentNode = parent;
return;
}
case LSParserFilter.FILTER_SKIP: {
// make sure we don't loose chars if next event is characters()
fFirstChunk = true;
removeEntityRef = true;
break;
}
default: {
fCurrentNode = fCurrentNode.getParentNode ();
}
}
} else {
fCurrentNode = fCurrentNode.getParentNode ();
}
}
if (!fCreateEntityRefNodes || removeEntityRef) {
// move entity reference children to the list of
// siblings of its parent and remove entity reference
NodeList children = fCurrentNode.getChildNodes ();
Node parent = fCurrentNode.getParentNode ();
int length = children.getLength ();
if (length > 0) {
// get previous sibling of the entity reference
Node node = fCurrentNode.getPreviousSibling ();
// normalize text nodes
Node child = children.item (0);
if (node != null && node.getNodeType () == Node.TEXT_NODE &&
child.getNodeType () == Node.TEXT_NODE) {
((Text)node).appendData (child.getNodeValue ());
fCurrentNode.removeChild (child);
} else {
node = parent.insertBefore (child, fCurrentNode);
handleBaseURI (node);
}
for (int i=1;i <length;i++) {
node = parent.insertBefore (children.item (0), fCurrentNode);
handleBaseURI (node);
}
} // length > 0
parent.removeChild (fCurrentNode);
fCurrentNode = parent;
}
}
else {
if (fDocumentTypeIndex != -1) {
// find corresponding Entity decl
int node = fDeferredDocumentImpl.getLastChild (fDocumentTypeIndex, false);
while (node != -1) {
short nodeType = fDeferredDocumentImpl.getNodeType (node, false);
if (nodeType == Node.ENTITY_NODE) {
String nodeName =
fDeferredDocumentImpl.getNodeName (node, false);
if (nodeName.equals (name)) {
fDeferredEntityDecl = node;
break;
}
}
node = fDeferredDocumentImpl.getRealPrevSibling (node, false);
}
}
if (fDeferredEntityDecl != -1 &&
fDeferredDocumentImpl.getLastChild (fDeferredEntityDecl, false) == -1) {
// entity definition exists and it does not have any children
int prevIndex = -1;
int childIndex = fDeferredDocumentImpl.getLastChild (fCurrentNodeIndex, false);
while (childIndex != -1) {
int cloneIndex = fDeferredDocumentImpl.cloneNode (childIndex, true);
fDeferredDocumentImpl.insertBefore (fDeferredEntityDecl, cloneIndex, prevIndex);
prevIndex = cloneIndex;
childIndex = fDeferredDocumentImpl.getRealPrevSibling (childIndex, false);
}
}
if (fCreateEntityRefNodes) {
fCurrentNodeIndex =
fDeferredDocumentImpl.getParentNode (fCurrentNodeIndex,
false);
} else { //!fCreateEntityRefNodes
// move children of entity ref before the entity ref.
// remove entity ref.
// holds a child of entity ref
int childIndex = fDeferredDocumentImpl.getLastChild (fCurrentNodeIndex, false);
int parentIndex =
fDeferredDocumentImpl.getParentNode (fCurrentNodeIndex,
false);
int prevIndex = fCurrentNodeIndex;
int lastChild = childIndex;
int sibling = -1;
while (childIndex != -1) {
handleBaseURI (childIndex);
sibling = fDeferredDocumentImpl.getRealPrevSibling (childIndex, false);
fDeferredDocumentImpl.insertBefore (parentIndex, childIndex, prevIndex);
prevIndex = childIndex;
childIndex = sibling;
}
if(lastChild != -1)
fDeferredDocumentImpl.setAsLastChild (parentIndex, lastChild);
else{
sibling = fDeferredDocumentImpl.getRealPrevSibling (prevIndex, false);
fDeferredDocumentImpl.setAsLastChild (parentIndex, sibling);
}
fCurrentNodeIndex = parentIndex;
}
fDeferredEntityDecl = -1;
}
} // endGeneralEntity(String, Augmentations)