提交 e810dc5d 编写于 作者: X xuelei

8025026: Enhance canonicalization

Summary: Don't use cached null xmlns definition. Also reviewed by Alexander Fomin <alexander.fomin@oracle.com>
Reviewed-by: mullan, hawtin
上级 6676f10c
...@@ -382,7 +382,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase { ...@@ -382,7 +382,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
} else if (!isVisible(xmlns)) { } else if (!isVisible(xmlns)) {
//There is a definition but the xmlns is not selected by the xpath. //There is a definition but the xmlns is not selected by the xpath.
//then xmlns="" //then xmlns=""
n = ns.addMappingAndRender(XMLNS, "", nullNode); n = ns.addMappingAndRender(
XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
//output the xmlns def if needed. //output the xmlns def if needed.
if (n != null) { if (n != null) {
......
...@@ -327,7 +327,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase { ...@@ -327,7 +327,8 @@ public abstract class Canonicalizer20010315 extends CanonicalizerBase {
} else if (!isVisible(xmlns)) { } else if (!isVisible(xmlns)) {
//There is a definition but the xmlns is not selected by the xpath. //There is a definition but the xmlns is not selected by the xpath.
//then xmlns="" //then xmlns=""
n = ns.addMappingAndRender(XMLNS, "", nullNode); n = ns.addMappingAndRender(
XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
//output the xmlns def if needed. //output the xmlns def if needed.
if (n != null) { if (n != null) {
......
...@@ -292,7 +292,7 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase { ...@@ -292,7 +292,7 @@ public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
if (xmlns != null && !isVisible(xmlns)) { if (xmlns != null && !isVisible(xmlns)) {
// There is a definition but the xmlns is not selected by the // There is a definition but the xmlns is not selected by the
// xpath. then xmlns="" // xpath. then xmlns=""
ns.addMapping(XMLNS, "", nullNode); ns.addMapping(XMLNS, "", getNullNode(xmlns.getOwnerDocument()));
} }
String prefix = null; String prefix = null;
......
...@@ -34,8 +34,6 @@ import java.util.ListIterator; ...@@ -34,8 +34,6 @@ import java.util.ListIterator;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.ParserConfigurationException;
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException; import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
...@@ -49,6 +47,7 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils; ...@@ -49,6 +47,7 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr; import org.w3c.dom.Attr;
import org.w3c.dom.Comment; import org.w3c.dom.Comment;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap; import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node; import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction; import org.w3c.dom.ProcessingInstruction;
...@@ -64,7 +63,6 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -64,7 +63,6 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
public static final String XMLNS = "xmlns"; public static final String XMLNS = "xmlns";
protected static final AttrCompare COMPARE = new AttrCompare(); protected static final AttrCompare COMPARE = new AttrCompare();
protected static final Attr nullNode;
private static final byte[] END_PI = {'?','>'}; private static final byte[] END_PI = {'?','>'};
private static final byte[] BEGIN_PI = {'<','?'}; private static final byte[] BEGIN_PI = {'<','?'};
...@@ -84,21 +82,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -84,21 +82,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
protected static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT = 0; protected static final int NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT = 0;
protected static final int NODE_AFTER_DOCUMENT_ELEMENT = 1; protected static final int NODE_AFTER_DOCUMENT_ELEMENT = 1;
static {
// The null xmlns definition.
try {
DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
nullNode = documentBuilder.newDocument().createAttributeNS(Constants.NamespaceSpecNS, XMLNS);
nullNode.setValue("");
} catch (Exception e) {
throw new RuntimeException("Unable to create nullNode: " + e);
}
}
private List<NodeFilter> nodeFilter; private List<NodeFilter> nodeFilter;
private boolean includeComments; private boolean includeComments;
private Set<Node> xpathNodeSet; private Set<Node> xpathNodeSet;
/** /**
* The node to be skipped/excluded from the DOM tree * The node to be skipped/excluded from the DOM tree
* in subtree canonicalizations. * in subtree canonicalizations.
...@@ -106,6 +94,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -106,6 +94,11 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
private Node excludeNode; private Node excludeNode;
private OutputStream writer = new ByteArrayOutputStream(); private OutputStream writer = new ByteArrayOutputStream();
/**
* The null xmlns definition.
*/
private Attr nullNode;
/** /**
* Constructor CanonicalizerBase * Constructor CanonicalizerBase
* *
...@@ -641,8 +634,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -641,8 +634,9 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
parents.clear(); parents.clear();
Attr nsprefix; Attr nsprefix;
if (((nsprefix = ns.getMappingWithoutRendered(XMLNS)) != null) if (((nsprefix = ns.getMappingWithoutRendered(XMLNS)) != null)
&& "".equals(nsprefix.getValue())) { && "".equals(nsprefix.getValue())) {
ns.addMappingAndRender(XMLNS, "", nullNode); ns.addMappingAndRender(
XMLNS, "", getNullNode(nsprefix.getOwnerDocument()));
} }
} }
...@@ -879,4 +873,18 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi { ...@@ -879,4 +873,18 @@ public abstract class CanonicalizerBase extends CanonicalizerSpi {
} }
} }
// The null xmlns definition.
protected Attr getNullNode(Document ownerDocument) {
if (nullNode == null) {
try {
nullNode = ownerDocument.createAttributeNS(
Constants.NamespaceSpecNS, XMLNS);
nullNode.setValue("");
} catch (Exception e) {
throw new RuntimeException("Unable to create nullNode: " + e);
}
}
return nullNode;
}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册