# HG changeset patch
# User clanger
# Date 1484577870 -3600
# Node ID dd12865718f31f3a9f3fbb120adffb6f83eeafa8
# Parent cf6fa122e5cb1c4f0001b49c46441e3761c8868e
8169631: [JAXP] XALAN: transformation of XML via namespace-unaware SAX input yields a different result than namespace-unaware DOM input
Reviewed-by: joehw
diff -r cf6fa122e5cb -r dd12865718f3 jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java
--- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java Fri Jan 13 01:35:35 2017 +0000
+++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/trax/DOM2SAX.java Mon Jan 16 15:44:30 2017 +0100
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -17,20 +17,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/*
- * $Id: DOM2SAX.java,v 1.2.4.1 2005/09/06 11:52:46 pvedula Exp $
- */
-
package com.sun.org.apache.xalan.internal.xsltc.trax;
import com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl;
import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
-import java.util.Vector;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.xml.sax.ContentHandler;
@@ -58,7 +54,7 @@
private ContentHandler _sax = null;
private LexicalHandler _lex = null;
private SAXImpl _saxImpl = null;
- private Maptrue
if the attribute was specified;
* false
if it was defaulted.
*/
- public boolean isAttributeSpecified(int attributeHandle)
- {
-
+ public boolean isAttributeSpecified(int attributeHandle) {
// I'm not sure if I want to do anything with this...
- return true; // ??
+ return true; // ??
}
/**
@@ -701,9 +662,7 @@
*
* @return the system identifier String object, or null if there is none.
*/
- public String getDocumentTypeDeclarationSystemIdentifier()
- {
-
+ public String getDocumentTypeDeclarationSystemIdentifier() {
/** @todo: implement this com.sun.org.apache.xml.internal.dtm.DTMDefaultBase abstract method */
error(XMLMessages.createXMLMessage(XMLErrorResources.ER_METHOD_NOT_SUPPORTED, null));//"Not yet supported!");
@@ -717,14 +676,11 @@
* @param identity The node identity (index).
* @return identity+1, or DTM.NULL.
*/
- protected int getNextNodeIdentity(int identity)
- {
-
+ protected int getNextNodeIdentity(int identity) {
identity += 1;
- while (identity >= m_size)
- {
- if (null == m_incrementalSAXSource)
+ while (identity >= m_size) {
+ if (m_incrementalSAXSource == null)
return DTM.NULL;
nextNode();
@@ -739,10 +695,10 @@
* @param nodeHandle The node ID.
* @param ch A non-null reference to a ContentHandler.
*
- * @throws org.xml.sax.SAXException
+ * @throws SAXException
*/
- public void dispatchToEvents(int nodeHandle, org.xml.sax.ContentHandler ch)
- throws org.xml.sax.SAXException
+ public void dispatchToEvents(int nodeHandle, ContentHandler ch)
+ throws SAXException
{
DTMTreeWalker treeWalker = m_walker;
@@ -1087,28 +1043,22 @@
* @return String containing the URI of the Unparsed Entity, or an
* empty string if no such entity exists.
*/
- public String getUnparsedEntityURI(String name)
- {
-
+ public String getUnparsedEntityURI(String name) {
String url = "";
- if (null == m_entities)
+ if (null == m_entities) {
return url;
+ }
int n = m_entities.size();
- for (int i = 0; i < n; i += ENTITY_FIELDS_PER)
- {
- String ename = (String) m_entities.elementAt(i + ENTITY_FIELD_NAME);
+ for (int i = 0; i < n; i += ENTITY_FIELDS_PER) {
+ String ename = m_entities.get(i + ENTITY_FIELD_NAME);
- if (null != ename && ename.equals(name))
- {
- String nname = (String) m_entities.elementAt(i
- + ENTITY_FIELD_NOTATIONNAME);
+ if (null != ename && ename.equals(name)) {
+ String nname = m_entities.get(i + ENTITY_FIELD_NOTATIONNAME);
- if (null != nname)
- {
-
+ if (null != nname) {
// The draft says: "The XSLT processor may use the public
// identifier to generate a URI for the entity instead of the URI
// specified in the system identifier. If the XSLT processor does
@@ -1118,11 +1068,10 @@
// the resource containing the entity declaration as the base
// URI [RFC2396]."
// So I'm falling a bit short here.
- url = (String) m_entities.elementAt(i + ENTITY_FIELD_SYSTEMID);
+ url = m_entities.get(i + ENTITY_FIELD_SYSTEMID);
- if (null == url)
- {
- url = (String) m_entities.elementAt(i + ENTITY_FIELD_PUBLICID);
+ if (null == url) {
+ url = m_entities.get(i + ENTITY_FIELD_PUBLICID);
}
}
@@ -1400,26 +1349,18 @@
*
* @return The prefix if there is one, or null.
*/
- public String getPrefix(String qname, String uri)
- {
-
+ public String getPrefix(String qname, String uri) {
String prefix;
int uriIndex = -1;
- if (null != uri && uri.length() > 0)
- {
-
- do
- {
+ if (null != uri && uri.length() > 0) {
+ do {
uriIndex = m_prefixMappings.indexOf(uri, ++uriIndex);
- } while ( (uriIndex & 0x01) == 0);
+ } while ((uriIndex & 0x01) == 0);
- if (uriIndex >= 0)
- {
- prefix = (String) m_prefixMappings.elementAt(uriIndex - 1);
- }
- else if (null != qname)
- {
+ if (uriIndex >= 0) {
+ prefix = m_prefixMappings.elementAt(uriIndex - 1);
+ } else if (null != qname) {
int indexOfNSSep = qname.indexOf(':');
if (qname.equals("xmlns"))
@@ -1429,33 +1370,24 @@
else
prefix = (indexOfNSSep > 0)
? qname.substring(0, indexOfNSSep) : null;
- }
- else
- {
+ } else {
prefix = null;
}
- }
- else if (null != qname)
- {
+ } else if (null != qname) {
int indexOfNSSep = qname.indexOf(':');
- if (indexOfNSSep > 0)
- {
+ if (indexOfNSSep > 0) {
if (qname.startsWith("xmlns:"))
prefix = qname.substring(indexOfNSSep + 1);
else
prefix = qname.substring(0, indexOfNSSep);
- }
- else
- {
+ } else {
if (qname.equals("xmlns"))
prefix = "";
else
prefix = null;
}
- }
- else
- {
+ } else {
prefix = null;
}
@@ -1470,38 +1402,31 @@
*
* @return The prefix if there is one, or null.
*/
- public int getIdForNamespace(String uri)
- {
-
+ public int getIdForNamespace(String uri) {
return m_valuesOrPrefixes.stringToIndex(uri);
-
}
- /**
+ /**
* Get a prefix either from the qname or from the uri mapping, or just make
* one up!
*
* @return The prefix if there is one, or null.
*/
- public String getNamespaceURI(String prefix)
- {
-
+ public String getNamespaceURI(String prefix) {
String uri = "";
int prefixIndex = m_contextIndexes.peek() - 1 ;
- if(null == prefix)
+ if (null == prefix) {
prefix = "";
+ }
- do
- {
- prefixIndex = m_prefixMappings.indexOf(prefix, ++prefixIndex);
- } while ( (prefixIndex >= 0) && (prefixIndex & 0x01) == 0x01);
+ do {
+ prefixIndex = m_prefixMappings.indexOf(prefix, ++prefixIndex);
+ } while ((prefixIndex >= 0) && (prefixIndex & 0x01) == 0x01);
- if (prefixIndex > -1)
- {
- uri = (String) m_prefixMappings.elementAt(prefixIndex + 1);
- }
-
+ if (prefixIndex > -1) {
+ uri = m_prefixMappings.elementAt(prefixIndex + 1);
+ }
return uri;
}
@@ -1578,7 +1503,7 @@
* default behaviour.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.EntityResolver#resolveEntity
+ * @see EntityResolver#resolveEntity
*
* @throws SAXException
*/
@@ -1605,7 +1530,7 @@
* @param systemId The notation system identifier.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.DTDHandler#notationDecl
+ * @see DTDHandler#notationDecl
*
* @throws SAXException
*/
@@ -1630,41 +1555,35 @@
* @param notationName The name of the associated notation.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.DTDHandler#unparsedEntityDecl
+ * @see DTDHandler#unparsedEntityDecl
*
* @throws SAXException
*/
- public void unparsedEntityDecl(
- String name, String publicId, String systemId, String notationName)
- throws SAXException
+ public void unparsedEntityDecl(String name, String publicId, String systemId,
+ String notationName) throws SAXException
{
-
- if (null == m_entities)
- {
- m_entities = new Vector();
+ if (null == m_entities) {
+ m_entities = new ArrayList<>();
}
- try
- {
+ try {
systemId = SystemIDResolver.getAbsoluteURI(systemId,
getDocumentBaseURI());
- }
- catch (Exception e)
- {
- throw new org.xml.sax.SAXException(e);
+ } catch (Exception e) {
+ throw new SAXException(e);
}
// private static final int ENTITY_FIELD_PUBLICID = 0;
- m_entities.addElement(publicId);
+ m_entities.add(publicId);
// private static final int ENTITY_FIELD_SYSTEMID = 1;
- m_entities.addElement(systemId);
+ m_entities.add(systemId);
// private static final int ENTITY_FIELD_NOTATIONNAME = 2;
- m_entities.addElement(notationName);
+ m_entities.add(notationName);
// private static final int ENTITY_FIELD_NAME = 3;
- m_entities.addElement(name);
+ m_entities.add(name);
}
////////////////////////////////////////////////////////////////////
@@ -1679,8 +1598,8 @@
* with other document events.
Note that skipped entities will be reported through the - * {@link org.xml.sax.ContentHandler#skippedEntity skippedEntity} + * {@link ContentHandler#skippedEntity skippedEntity} * event, which is part of the ContentHandler interface.
* * @param name The name of the entity. If it is a parameter * entity, the name will begin with '%'. * @throws SAXException The application may raise an exception. * @see #endEntity - * @see org.xml.sax.ext.DeclHandler#internalEntityDecl - * @see org.xml.sax.ext.DeclHandler#externalEntityDecl + * @see DeclHandler#internalEntityDecl + * @see DeclHandler#externalEntityDecl */ public void startEntity(String name) throws SAXException { @@ -2419,7 +2327,7 @@ * Report the start of a CDATA section. * *The contents of the CDATA section will be reported through - * the regular {@link org.xml.sax.ContentHandler#characters + * the regular {@link ContentHandler#characters * characters} event.
* * @throws SAXException The application may raise an exception. diff -r cf6fa122e5cb -r dd12865718f3 jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java Fri Jan 13 01:35:35 2017 +0000 +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xml/internal/dtm/ref/sax2dtm/SAX2DTM2.java Mon Jan 16 15:44:30 2017 +0100 @@ -1,13 +1,13 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. */ /* - * Copyright 1999-2005 The Apache Software Foundation. - * - * Licensed 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 + * 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 * @@ -17,13 +17,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* - * $Id: SAX2DTM2.java,v 1.2.4.1 2005/09/15 08:15:12 suresh_emailid Exp $ - */ + package com.sun.org.apache.xml.internal.dtm.ref.sax2dtm; -import com.sun.org.apache.xml.internal.dtm.*; -import com.sun.org.apache.xml.internal.dtm.ref.*; +import com.sun.org.apache.xml.internal.dtm.DTM; +import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator; +import com.sun.org.apache.xml.internal.dtm.DTMException; +import com.sun.org.apache.xml.internal.dtm.DTMManager; +import com.sun.org.apache.xml.internal.dtm.DTMWSFilter; +import com.sun.org.apache.xml.internal.dtm.ref.DTMDefaultBase; +import com.sun.org.apache.xml.internal.dtm.ref.ExpandedNameTable; +import com.sun.org.apache.xml.internal.dtm.ref.ExtendedType; import com.sun.org.apache.xml.internal.utils.FastStringBuffer; import com.sun.org.apache.xml.internal.utils.XMLString; import com.sun.org.apache.xml.internal.utils.XMLStringDefault; @@ -31,11 +35,12 @@ import com.sun.org.apache.xml.internal.res.XMLMessages; import com.sun.org.apache.xml.internal.res.XMLErrorResources; import com.sun.org.apache.xml.internal.serializer.SerializationHandler; - +import com.sun.org.apache.xml.internal.utils.SuballocatedIntVector; +import java.util.ArrayList; import javax.xml.transform.Source; -import java.util.Vector; -import com.sun.org.apache.xml.internal.utils.SuballocatedIntVector; -import org.xml.sax.*; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; /** * SAX2DTM2 is an optimized version of SAX2DTM which is used in non-incremental situation. @@ -53,10 +58,6 @@ * The design of SAX2DTM2 may limit its extensibilty. If you have a reason to extend the * SAX2DTM model, please extend from SAX2DTM instead of this class. *- * TODO: This class is currently only used by XSLTC. We need to investigate the possibility - * of also using it in Xalan-J Interpretive. Xalan's performance is likely to get an instant - * boost if we use SAX2DTM2 instead of SAX2DTM in non-incremental case. - *
* %MK% The code in this class is critical to the XSLTC_DTM performance. Be very careful
* when making changes here!
*/
@@ -87,11 +88,10 @@
*/
public DTMAxisIterator setStartNode(int node)
{
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = (node == DTM.NULL) ? DTM.NULL
: _firstch2(makeNodeIdentity(node));
@@ -108,8 +108,7 @@
* @return The next node handle in the iteration, or END if no more
* are available.
*/
- public int next()
- {
+ public int next() {
if (_currentNode != NULL) {
int node = _currentNode;
_currentNode = _nextsib2(node);
@@ -139,13 +138,11 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
if (node != DTM.NULL)
@@ -229,8 +226,7 @@
*
* @param nodeType The extended type ID being requested.
*/
- public TypedChildrenIterator(int nodeType)
- {
+ public TypedChildrenIterator(int nodeType) {
_nodeType = nodeType;
}
@@ -242,17 +238,14 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
- _currentNode = (node == DTM.NULL)
- ? DTM.NULL
- : _firstch2(makeNodeIdentity(_startNode));
+ _currentNode = (node == DTM.NULL) ? DTM.NULL :
+ _firstch2(makeNodeIdentity(_startNode));
return resetPosition();
}
@@ -265,8 +258,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
int node = _currentNode;
if (node == DTM.NULL)
return DTM.NULL;
@@ -301,14 +293,12 @@
_currentNode = _nextsib2(node);
return returnNode(makeNodeHandle(node));
}
-
}
/**
* Return the node at the given position.
*/
- public int getNodeByPosition(int position)
- {
+ public int getNodeByPosition(int position) {
if (position <= 0)
return DTM.NULL;
@@ -327,8 +317,7 @@
node = _nextsib2(node);
}
return NULL;
- }
- else {
+ } else {
while (node != DTM.NULL) {
if (_exptype2(node) >= DTM.NTYPES) {
pos++;
@@ -415,13 +404,11 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = makeNodeIdentity(node);
@@ -436,8 +423,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
_currentNode = (_currentNode == DTM.NULL) ? DTM.NULL
: _nextsib2(_currentNode);
return returnNode(makeNodeHandle(_currentNode));
@@ -460,8 +446,7 @@
*
* @param type The extended type ID being requested.
*/
- public TypedFollowingSiblingIterator(int type)
- {
+ public TypedFollowingSiblingIterator(int type) {
_nodeType = type;
}
@@ -470,8 +455,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
if (_currentNode == DTM.NULL) {
return DTM.NULL;
}
@@ -481,8 +465,7 @@
if (nodeType != DTM.ELEMENT_NODE) {
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) != nodeType) {}
- }
- else {
+ } else {
while ((node = _nextsib2(node)) != DTM.NULL && _exptype2(node) < DTM.NTYPES) {}
}
@@ -498,8 +481,7 @@
/**
* Iterator that returns attribute nodes (of what nodes?)
*/
- public final class AttributeIterator extends InternalAxisIteratorBase
- {
+ public final class AttributeIterator extends InternalAxisIteratorBase {
// assumes caller will pass element nodes
@@ -511,13 +493,11 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
_currentNode = getFirstAttributeIdentity(makeNodeIdentity(node));
@@ -532,9 +512,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
+ public int next() {
final int node = _currentNode;
if (node != NULL) {
@@ -561,8 +539,7 @@
*
* @param nodeType The extended type ID that is requested.
*/
- public TypedAttributeIterator(int nodeType)
- {
+ public TypedAttributeIterator(int nodeType) {
_nodeType = nodeType;
}
@@ -576,14 +553,10 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
- if (_isRestartable)
- {
+ public DTMAxisIterator setStartNode(int node) {
+ if (_isRestartable) {
_startNode = node;
-
_currentNode = getTypedAttribute(node, _nodeType);
-
return resetPosition();
}
@@ -595,9 +568,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
+ public int next() {
final int node = _currentNode;
// singleton iterator, since there can only be one attribute of
@@ -624,8 +595,7 @@
*
* @return true.
*/
- public boolean isReverse()
- {
+ public boolean isReverse() {
return true;
}
@@ -637,30 +607,25 @@
*
* @return A DTMAxisIterator set to the start of the iteration.
*/
- public DTMAxisIterator setStartNode(int node)
- {
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ public DTMAxisIterator setStartNode(int node) {
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
- if (_isRestartable)
- {
+ if (_isRestartable) {
_startNode = node;
node = _startNodeID = makeNodeIdentity(node);
- if(node == NULL)
- {
+ if(node == NULL) {
_currentNode = node;
return resetPosition();
}
int type = _type2(node);
- if(ExpandedNameTable.ATTRIBUTE == type
- || ExpandedNameTable.NAMESPACE == type )
+ if (ExpandedNameTable.ATTRIBUTE == type ||
+ ExpandedNameTable.NAMESPACE == type)
{
_currentNode = node;
- }
- else
- {
+ } else {
// Be careful to handle the Document node properly
_currentNode = _parent2(node);
if(NULL!=_currentNode)
@@ -680,18 +645,12 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
-
- if (_currentNode == _startNodeID || _currentNode == DTM.NULL)
- {
+ public int next() {
+ if (_currentNode == _startNodeID || _currentNode == DTM.NULL) {
return NULL;
- }
- else
- {
+ } else {
final int node = _currentNode;
_currentNode = _nextsib2(node);
-
return returnNode(makeNodeHandle(node));
}
}
@@ -714,8 +673,7 @@
*
* @param type The extended type ID being requested.
*/
- public TypedPrecedingSiblingIterator(int type)
- {
+ public TypedPrecedingSiblingIterator(int type) {
_nodeType = type;
}
@@ -724,8 +682,7 @@
*
* @return The next node handle in the iteration, or END.
*/
- public int next()
- {
+ public int next() {
int node = _currentNode;
final int nodeType = _nodeType;
@@ -735,8 +692,7 @@
while (node != NULL && node != startNodeID && _exptype2(node) != nodeType) {
node = _nextsib2(node);
}
- }
- else {
+ } else {
while (node != NULL && node != startNodeID && _exptype2(node) < DTM.NTYPES) {
node = _nextsib2(node);
}
@@ -745,8 +701,7 @@
if (node == DTM.NULL || node == startNodeID) {
_currentNode = NULL;
return NULL;
- }
- else {
+ } else {
_currentNode = _nextsib2(node);
return returnNode(makeNodeHandle(node));
}
@@ -755,8 +710,7 @@
/**
* Return the index of the last node in this iterator.
*/
- public int getLast()
- {
+ public int getLast() {
if (_last != -1)
return _last;
@@ -774,8 +728,7 @@
}
node = _nextsib2(node);
}
- }
- else {
+ } else {
while (node != NULL && node != startNodeID) {
if (_exptype2(node) >= DTM.NTYPES) {
last++;
@@ -860,7 +813,7 @@
*/
public DTMAxisIterator setStartNode(int node)
{
-//%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
+ //%HZ%: Added reference to DTMDefaultBase.ROOTNODE back in, temporarily
if (node == DTMDefaultBase.ROOTNODE)
node = getDocument();
if (_isRestartable)
@@ -1799,9 +1752,7 @@
// %OPT% These values are unlikely to be equal. Storing
// them in a plain Vector is more efficient than storing in the
// DTMStringPool because we can save the cost for hash calculation.
- //
- // %REVISIT% Do we need a custom class (e.g. StringVector) here?
- protected Vector m_values;
+ protected ArrayList This one is only used by DOMAdapter.getExpandedTypeID(int), which
* is mostly called from the compiled translets.
*/
- public final int getExpandedTypeID2(int nodeHandle)
- {
+ public final int getExpandedTypeID2(int nodeHandle) {
int nodeID = makeNodeIdentity(nodeHandle);
- //return (nodeID != NULL) ? _exptype2(nodeID) : NULL;
-
if (nodeID != NULL) {
if (nodeID < m_blocksize)
return m_exptype_map0[nodeID];
@@ -2026,12 +1965,10 @@
* END of DTM base accessor interfaces
*************************************************************************/
-
/**
* Return the node type from the expanded type
*/
- public final int _exptype2Type(int exptype)
- {
+ public final int _exptype2Type(int exptype) {
if (NULL != exptype)
return m_extendedTypes[exptype].getNodeType();
else
@@ -2046,16 +1983,14 @@
*
* @return The prefix if there is one, or null.
*/
- public int getIdForNamespace(String uri)
- {
+ public int getIdForNamespace(String uri) {
int index = m_values.indexOf(uri);
- if (index < 0)
- {
- m_values.addElement(uri);
+ if (index < 0) {
+ m_values.add(uri);
return m_valueIndex++;
+ } else {
+ return index;
}
- else
- return index;
}
/**
@@ -2079,15 +2014,25 @@
* @param attributes The specified or defaulted attributes.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startElement
+ * @see ContentHandler#startElement
*/
- public void startElement(String uri, String localName, String qName, Attributes attributes)
- throws SAXException
+ public void startElement(String uri, String localName, String qName,
+ Attributes attributes) throws SAXException
{
-
charactersFlush();
- int exName = m_expandedNameTable.getExpandedTypeID(uri, localName, DTM.ELEMENT_NODE);
+ // in case URI and localName are empty, the input is not using the
+ // namespaces feature. Then we should take the part after the last
+ // colon of qName as localName (strip all namespace prefixes)
+ if ((uri == null || uri.isEmpty()) &&
+ (localName == null || localName.isEmpty()))
+ {
+ final int colon = qName.lastIndexOf(':');
+ localName = (colon > -1) ? qName.substring(colon + 1) : qName;
+ }
+
+ int exName = m_expandedNameTable.getExpandedTypeID(uri, localName,
+ DTM.ELEMENT_NODE);
int prefixIndex = (qName.length() != localName.length())
? m_valuesOrPrefixes.stringToIndex(qName) : 0;
@@ -2095,7 +2040,7 @@
int elemNode = addNode(DTM.ELEMENT_NODE, exName,
m_parents.peek(), m_previous, prefixIndex, true);
- if(m_indexing)
+ if (m_indexing)
indexNode(exName, elemNode);
m_parents.push(elemNode);
@@ -2104,31 +2049,31 @@
int nDecls = m_prefixMappings.size();
String prefix;
- if(!m_pastFirstElement)
- {
+ if (!m_pastFirstElement) {
// SPECIAL CASE: Implied declaration at root element
- prefix="xml";
+ prefix = "xml";
String declURL = "http://www.w3.org/XML/1998/namespace";
- exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
- m_values.addElement(declURL);
+ exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
+ DTM.NAMESPACE_NODE);
+ m_values.add(declURL);
int val = m_valueIndex++;
addNode(DTM.NAMESPACE_NODE, exName, elemNode,
DTM.NULL, val, false);
m_pastFirstElement=true;
}
- for (int i = startDecls; i < nDecls; i += 2)
- {
- prefix = (String) m_prefixMappings.elementAt(i);
+ for (int i = startDecls; i < nDecls; i += 2) {
+ prefix = m_prefixMappings.elementAt(i);
if (prefix == null)
continue;
- String declURL = (String) m_prefixMappings.elementAt(i + 1);
-
- exName = m_expandedNameTable.getExpandedTypeID(null, prefix, DTM.NAMESPACE_NODE);
-
- m_values.addElement(declURL);
+ String declURL = m_prefixMappings.elementAt(i + 1);
+
+ exName = m_expandedNameTable.getExpandedTypeID(null, prefix,
+ DTM.NAMESPACE_NODE);
+
+ m_values.add(declURL);
int val = m_valueIndex++;
addNode(DTM.NAMESPACE_NODE, exName, elemNode, DTM.NULL, val, false);
@@ -2136,28 +2081,37 @@
int n = attributes.getLength();
- for (int i = 0; i < n; i++)
- {
+ for (int i = 0; i < n; i++) {
String attrUri = attributes.getURI(i);
+ String attrLocalName = attributes.getLocalName(i);
String attrQName = attributes.getQName(i);
String valString = attributes.getValue(i);
+ // in case URI and localName are empty, the input is not using the
+ // namespaces feature. Then we should take the part after the last
+ // colon of qName as localName (strip all namespace prefixes)
+ // When the URI is empty but localName has colons then we can also
+ // assume non namespace aware and prefixes can be stripped
+ if (attrUri == null || attrUri.isEmpty()) {
+ if (attrLocalName == null || attrLocalName.isEmpty()) {
+ final int colon = attrQName.lastIndexOf(':');
+ attrLocalName = (colon > -1) ? attrQName.substring(colon + 1) : attrQName;
+ } else {
+ final int colon = attrLocalName.lastIndexOf(':');
+ attrLocalName = (colon > -1) ? attrLocalName.substring(colon + 1) : attrLocalName;
+ }
+ }
+
int nodeType;
-
- String attrLocalName = attributes.getLocalName(i);
-
- if ((null != attrQName)
- && (attrQName.equals("xmlns")
- || attrQName.startsWith("xmlns:")))
+ if ((null != attrQName) &&
+ (attrQName.equals("xmlns") || attrQName.startsWith("xmlns:")))
{
prefix = getPrefix(attrQName, attrUri);
if (declAlreadyDeclared(prefix))
continue; // go to the next attribute.
nodeType = DTM.NAMESPACE_NODE;
- }
- else
- {
+ } else {
nodeType = DTM.ATTRIBUTE_NODE;
if (m_buildIdIndex && attributes.getType(i).equalsIgnoreCase("ID"))
@@ -2166,36 +2120,31 @@
// Bit of a hack... if somehow valString is null, stringToIndex will
// return -1, which will make things very unhappy.
- if(null == valString)
+ if (null == valString)
valString = "";
- m_values.addElement(valString);
+ m_values.add(valString);
int val = m_valueIndex++;
- if (attrLocalName.length() != attrQName.length())
- {
-
+ if (attrLocalName.length() != attrQName.length()) {
prefixIndex = m_valuesOrPrefixes.stringToIndex(attrQName);
-
int dataIndex = m_data.size();
-
m_data.addElement(prefixIndex);
m_data.addElement(val);
-
val = -dataIndex;
}
- exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName, nodeType);
- addNode(nodeType, exName, elemNode, DTM.NULL, val,
- false);
+ exName = m_expandedNameTable.getExpandedTypeID(attrUri, attrLocalName,
+ nodeType);
+ addNode(nodeType, exName, elemNode, DTM.NULL, val, false);
}
- if (null != m_wsfilter)
- {
- short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode), this);
- boolean shouldStrip = (DTMWSFilter.INHERIT == wsv)
- ? getShouldStripWhitespace()
- : (DTMWSFilter.STRIP == wsv);
+ if (null != m_wsfilter) {
+ short wsv = m_wsfilter.getShouldStripSpace(makeNodeHandle(elemNode),
+ this);
+ boolean shouldStrip = (DTMWSFilter.INHERIT == wsv) ?
+ getShouldStripWhitespace() :
+ (DTMWSFilter.STRIP == wsv);
pushShouldStripWhitespace(shouldStrip);
}
@@ -2223,7 +2172,7 @@
* empty string if qualified names are not available.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endElement
+ * @see ContentHandler#endElement
*/
public void endElement(String uri, String localName, String qName)
throws SAXException
@@ -2257,9 +2206,7 @@
* @param length The number of characters to use from the array.
* @throws SAXException The application may raise an exception.
*/
- public void comment(char ch[], int start, int length) throws SAXException
- {
-
+ public void comment(char ch[], int start, int length) throws SAXException {
if (m_insideDTD) // ignore comments if we're inside the DTD
return;
@@ -2267,7 +2214,7 @@
// %OPT% Saving the comment string in a Vector has a lower cost than
// saving it in DTMStringPool.
- m_values.addElement(new String(ch, start, length));
+ m_values.add(new String(ch, start, length));
int dataIndex = m_valueIndex++;
m_previous = addNode(DTM.COMMENT_NODE, DTM.COMMENT_NODE,
@@ -2279,13 +2226,10 @@
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#startDocument
+ * @see ContentHandler#startDocument
*/
- public void startDocument() throws SAXException
- {
-
- int doc = addNode(DTM.DOCUMENT_NODE,
- DTM.DOCUMENT_NODE,
+ public void startDocument() throws SAXException {
+ int doc = addNode(DTM.DOCUMENT_NODE, DTM.DOCUMENT_NODE,
DTM.NULL, DTM.NULL, 0, true);
m_parents.push(doc);
@@ -2299,10 +2243,9 @@
*
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#endDocument
+ * @see ContentHandler#endDocument
*/
- public void endDocument() throws SAXException
- {
+ public void endDocument() throws SAXException {
super.endDocument();
// Add a NULL entry to the end of the node arrays as
@@ -2334,16 +2277,15 @@
* @return The index identity of the node that was added.
*/
protected final int addNode(int type, int expandedTypeID,
- int parentIndex, int previousSibling,
- int dataOrPrefix, boolean canHaveFirstChild)
+ int parentIndex, int previousSibling,
+ int dataOrPrefix, boolean canHaveFirstChild)
{
// Common to all nodes:
int nodeIndex = m_size++;
// Have we overflowed a DTM Identity's addressing range?
//if(m_dtmIdent.size() == (nodeIndex>>>DTMManager.IDENT_DTM_NODE_BITS))
- if (nodeIndex == m_maxNodeIndex)
- {
+ if (nodeIndex == m_maxNodeIndex) {
addNewDTMID(nodeIndex);
m_maxNodeIndex += (1 << DTMManager.IDENT_DTM_NODE_BITS);
}
@@ -2366,8 +2308,7 @@
// is called, to handle successive characters() events.
// Special handling by type: Declare namespaces, attach first child
- switch(type)
- {
+ switch(type) {
case DTM.NAMESPACE_NODE:
declareNamespaceInContext(parentIndex,nodeIndex);
break;
@@ -2376,8 +2317,7 @@
default:
if (DTM.NULL != previousSibling) {
m_nextsib.setElementAt(nodeIndex,previousSibling);
- }
- else if (DTM.NULL != parentIndex) {
+ } else if (DTM.NULL != parentIndex) {
m_firstch.setElementAt(nodeIndex,parentIndex);
}
break;
@@ -2390,16 +2330,12 @@
* Check whether accumulated text should be stripped; if not,
* append the appropriate flavor of text/cdata node.
*/
- protected final void charactersFlush()
- {
-
- if (m_textPendingStart >= 0) // -1 indicates no-text-in-progress
- {
+ protected final void charactersFlush() {
+ if (m_textPendingStart >= 0) { // -1 indicates no-text-in-progress
int length = m_chars.size() - m_textPendingStart;
boolean doStrip = false;
- if (getShouldStripWhitespace())
- {
+ if (getShouldStripWhitespace()) {
doStrip = m_chars.isWhitespace(m_textPendingStart, length);
}
@@ -2412,19 +2348,19 @@
// If the offset and length do not exceed the given limits
// (offset < 2^21 and length < 2^10), then save both the offset
// and length in a bitwise encoded value.
- if (length <= TEXT_LENGTH_MAX
- && m_textPendingStart <= TEXT_OFFSET_MAX) {
+ if (length <= TEXT_LENGTH_MAX &&
+ m_textPendingStart <= TEXT_OFFSET_MAX) {
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
- m_parents.peek(), m_previous,
- length + (m_textPendingStart << TEXT_LENGTH_BITS),
- false);
+ m_parents.peek(), m_previous,
+ length + (m_textPendingStart << TEXT_LENGTH_BITS),
+ false);
} else {
// Store offset and length in the m_data array if one exceeds
// the given limits. Use a negative dataIndex as an indication.
int dataIndex = m_data.size();
m_previous = addNode(m_coalescedTextType, DTM.TEXT_NODE,
- m_parents.peek(), m_previous, -dataIndex, false);
+ m_parents.peek(), m_previous, -dataIndex, false);
m_data.addElement(m_textPendingStart);
m_data.addElement(length);
@@ -2452,7 +2388,7 @@
* none is supplied.
* @throws SAXException Any SAX exception, possibly
* wrapping another exception.
- * @see org.xml.sax.ContentHandler#processingInstruction
+ * @see ContentHandler#processingInstruction
*/
public void processingInstruction(String target, String data)
throws SAXException
@@ -2467,7 +2403,7 @@
-dataIndex, false);
m_data.addElement(m_valuesOrPrefixes.stringToIndex(target));
- m_values.addElement(data);
+ m_values.add(data);
m_data.addElement(m_valueIndex++);
}
@@ -2865,9 +2801,9 @@
}
if (m_xstrf != null)
- return m_xstrf.newstr((String)m_values.elementAt(dataIndex));
+ return m_xstrf.newstr(m_values.get(dataIndex));
else
- return new XMLStringDefault((String)m_values.elementAt(dataIndex));
+ return new XMLStringDefault(m_values.get(dataIndex));
}
}
@@ -2966,7 +2902,7 @@
dataIndex = m_data.elementAt(dataIndex + 1);
}
- return (String)m_values.elementAt(dataIndex);
+ return m_values.get(dataIndex);
}
}
@@ -3106,7 +3042,7 @@
dataIndex = m_data.elementAt(dataIndex + 1);
}
- String str = (String)m_values.elementAt(dataIndex);
+ String str = m_values.get(dataIndex);
if(normalize)
FastStringBuffer.sendNormalizedSAXcharacters(str.toCharArray(),
@@ -3160,7 +3096,7 @@
dataIndex = m_data.elementAt(dataIndex + 1);
}
- return (String)m_values.elementAt(dataIndex);
+ return m_values.get(dataIndex);
}
}
@@ -3202,8 +3138,7 @@
if (uri.length() == 0) {
handler.startElement(name);
return name;
- }
- else {
+ } else {
int qnameIndex = m_dataOrQName.elementAt(nodeID);
if (qnameIndex == 0) {
@@ -3223,14 +3158,12 @@
String prefix;
if (prefixIndex > 0) {
prefix = qName.substring(0, prefixIndex);
- }
- else {
+ } else {
prefix = null;
}
handler.namespaceAfterStartElement(prefix, uri);
return qName;
}
-
}
/**
@@ -3285,7 +3218,7 @@
dataIndex = m_data.elementAt(dataIndex + 1);
}
- String nodeValue = (String)m_values.elementAt(dataIndex);
+ String nodeValue = m_values.get(dataIndex);
handler.namespaceAfterStartElement(nodeName, nodeValue);
@@ -3335,7 +3268,6 @@
}
-
/**
* Copy an Attribute node to a SerializationHandler
*
@@ -3347,14 +3279,6 @@
SerializationHandler handler)
throws SAXException
{
- /*
- final String uri = getNamespaceName(node);
- if (uri.length() != 0) {
- final String prefix = getPrefix(node);
- handler.namespaceAfterStartElement(prefix, uri);
- }
- handler.addAttribute(getNodeName(node), getNodeValue(node));
- */
final ExtendedType extType = m_extendedTypes[exptype];
final String uri = extType.getNamespace();
final String localName = extType.getLocalName();
@@ -3377,7 +3301,7 @@
}
String nodeName = (prefix != null) ? qname : localName;
- String nodeValue = (String)m_values.elementAt(valueIndex);
+ String nodeValue = m_values.get(valueIndex);
handler.addAttribute(uri, localName, nodeName, "CDATA", nodeValue);
}
diff -r cf6fa122e5cb -r dd12865718f3 jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java
--- a/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java Fri Jan 13 01:35:35 2017 +0000
+++ b/jaxp/test/javax/xml/jaxp/unittest/transform/TransformerTest.java Mon Jan 16 15:44:30 2017 +0100
@@ -37,6 +37,7 @@
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
@@ -74,11 +75,30 @@
* @run testng/othervm -DrunSecMngr=true transform.TransformerTest
* @run testng/othervm transform.TransformerTest
* @summary Transformer Tests
- * @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169772
+ * @bug 6272879 6305029 6505031 8150704 8162598 8169112 8169631 8169772
*/
@Listeners({jaxp.library.FilePolicy.class})
public class TransformerTest {
+ // some global constants
+ private static final String LINE_SEPARATOR =
+ getSystemProperty("line.separator");
+
+ private static final String NAMESPACES =
+ "http://xml.org/sax/features/namespaces";
+
+ private static final String NAMESPACE_PREFIXES =
+ "http://xml.org/sax/features/namespace-prefixes";
+
+ private static abstract class TestTemplate {
+ protected void printSnippet(String title, String snippet) {
+ StringBuilder div = new StringBuilder();
+ for (int i = 0; i < title.length(); i++)
+ div.append("=");
+ System.out.println(title + "\n" + div + "\n" + snippet + "\n");
+ }
+ }
+
/**
* Reads the contents of the given file into a string.
* WARNING: this method adds a final line feed even if the last line of the file doesn't contain one.
@@ -101,44 +121,7 @@
}
}
- /**
- * Utility method for testBug8162598().
- * Provides a convenient way to check/assert the expected namespaces
- * of a Node and its siblings.
- *
- * @param test
- * The node to check
- * @param nstest
- * Expected namespace of the node
- * @param nsb
- * Expected namespace of the first sibling
- * @param nsc
- * Expected namespace of the first sibling of the first sibling
- */
- private void checkNodeNS8162598(Node test, String nstest, String nsb, String nsc) {
- String testNodeName = test.getNodeName();
- if (nstest == null) {
- Assert.assertNull(test.getNamespaceURI(), "unexpected namespace for " + testNodeName);
- } else {
- Assert.assertEquals(test.getNamespaceURI(), nstest, "unexpected namespace for " + testNodeName);
- }
- Node b = test.getChildNodes().item(0);
- if (nsb == null) {
- Assert.assertNull(b.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b");
- } else {
- Assert.assertEquals(b.getNamespaceURI(), nsb, "unexpected namespace for " + testNodeName + "->b");
- }
- Node c = b.getChildNodes().item(0);
- if (nsc == null) {
- Assert.assertNull(c.getNamespaceURI(), "unexpected namespace for " + testNodeName + "->b->c");
- } else {
- Assert.assertEquals(c.getNamespaceURI(), nsc, "unexpected namespace for " + testNodeName + "->b->c");
- }
- }
-
private class XMLReaderFor6305029 implements XMLReader {
- private static final String NAMESPACES = "http://xml.org/sax/features/namespaces";
- private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
private boolean namespaces = true;
private boolean namespacePrefixes = false;
private EntityResolver resolver;
@@ -235,8 +218,6 @@
*/
@Test
public final void testBug6272879() throws IOException, TransformerException {
- final String LINE_SEPARATOR = getSystemProperty("line.separator");
-
final String xsl =
"" + LINE_SEPARATOR +
"DTM.NULL
*/
- public final int _firstch2(int identity)
- {
- //return m_firstch.elementAt(identity);
-
+ public final int _firstch2(int identity) {
if (identity < m_blocksize)
return m_firstch_map0[identity];
else
@@ -1969,10 +1916,7 @@
* @param identity A node identity, which must not be equal to
* DTM.NULL
*/
- public final int _parent2(int identity)
- {
- //return m_parent.elementAt(identity);
-
+ public final int _parent2(int identity) {
if (identity < m_blocksize)
return m_parent_map0[identity];
else
@@ -1985,9 +1929,7 @@
* @param identity A node identity, which must not be equal to
* DTM.NULL
*/
- public final int _type2(int identity)
- {
- //int eType = _exptype2(identity);
+ public final int _type2(int identity) {
int eType;
if (identity < m_blocksize)
eType = m_exptype_map0[identity];
@@ -2006,12 +1948,9 @@
*