Author: dkulp Date: Tue Sep 7 16:09:41 2010 New Revision: 993413 URL: http://svn.apache.org/viewvc?rev=993413&view=rev Log: Merged revisions 993403 via svnmerge from https://svn.apache.org/repos/asf/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH
........ r993403 | dkulp | 2010-09-07 11:57:20 -0400 (Tue, 07 Sep 2010) | 2 lines [WSCOMMONS-537, WSCOMMONS-484] When running with DOM level 3 (and recent JDK), use the namespace/prefix lookup methods on the Element instead of doing the NodeNamespaceContext stuff. That performs better and uses less memory. On level2 and lower, use the old method. ........ Modified: webservices/commons/trunk/modules/XmlSchema/ (props changed) webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java Propchange: webservices/commons/trunk/modules/XmlSchema/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Sep 7 16:09:41 2010 @@ -1 +1 @@ -/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:763303 +/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:763303,993403 Propchange: webservices/commons/trunk/modules/XmlSchema/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Tue Sep 7 16:09:41 2010 @@ -1 +1 @@ -/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-741314,763303 +/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-741314,763303,993403 Modified: webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java URL: http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java?rev=993413&r1=993412&r2=993413&view=diff ============================================================================== --- webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java (original) +++ webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java Tue Sep 7 16:09:41 2010 @@ -19,7 +19,7 @@ package org.apache.ws.commons.schema.utils; -import java.lang.reflect.Method; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -28,39 +28,42 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Element; import org.w3c.dom.Node; import org.apache.ws.commons.schema.constants.Constants; + /** * Implementation of {...@link NamespaceContext}, which is based on a DOM node. */ -public final class NodeNamespaceContext implements NamespacePrefixList { - static Method getUserData; - static Method setUserData; - private static final String NODE_NAMSPACE_CONTEXT = NamespacePrefixList.class.getName(); - +public final class NodeNamespaceContext implements NamespacePrefixList, Serializable { + private static final boolean DOM_LEVEL_3; + private static final Collection<String> XML_NS_PREFIX_COLLECTION = Collections .singletonList(Constants.XML_NS_PREFIX); private static final Collection<String> XMLNS_ATTRIBUTE_COLLECTION = Collections .singletonList(Constants.XMLNS_ATTRIBUTE); - private final Map<String, String> declarations; + + private final Map<String, String> declarations; private String[] prefixes; + static { + boolean level3 = false; try { Class cls = Class.forName("org.w3c.dom.UserDataHandler", false, Node.class.getClassLoader()); - getUserData = Node.class.getMethod("getUserData", new Class[] { + Node.class.getMethod("getUserData", new Class[] { String.class }); - setUserData = Node.class.getMethod("setUserData", new Class[] { + Node.class.getMethod("setUserData", new Class[] { String.class, Object.class, cls }); + level3 = true; } catch (Throwable e) { - getUserData = null; - setUserData = null; + level3 = false; } + DOM_LEVEL_3 = level3; } /** @@ -70,51 +73,33 @@ public final class NodeNamespaceContext declarations = decls; } - public static NodeNamespaceContext getNamespaceContext(Node pNode) { - if (getUserData != null) { - try { - NodeNamespaceContext ctx = (NodeNamespaceContext)getUserData.invoke(pNode, new Object[] { - NODE_NAMSPACE_CONTEXT - }); - if (ctx == null) { - Map<String, String> declarations = new HashMap<String, String>(); - - Node parentNode = pNode.getParentNode(); - if (parentNode != null) { - NodeNamespaceContext parent = (NodeNamespaceContext) - getUserData.invoke(parentNode, - new Object[] {NODE_NAMSPACE_CONTEXT }); - if (parent == null) { - parent = getNamespaceContext(parentNode); - } - declarations.putAll(parent.declarations); - } - - NamedNodeMap map = pNode.getAttributes(); - if (map != null) { - for (int i = 0; i < map.getLength(); i++) { - Node attr = map.item(i); - final String uri = attr.getNamespaceURI(); - if (Constants.XMLNS_ATTRIBUTE_NS_URI.equals(uri)) { - String localName = attr.getLocalName(); - String prefix = Constants.XMLNS_ATTRIBUTE.equals(localName) - ? Constants.DEFAULT_NS_PREFIX : localName; - declarations.put(prefix, attr.getNodeValue()); - } - } - } - ctx = new NodeNamespaceContext(declarations); - setUserData.invoke(pNode, new Object[] { - NODE_NAMSPACE_CONTEXT, ctx, null - }); - } - return ctx; - } catch (Throwable t) { - // ignore. DOM level 2 implementation would not have the getUserData stuff. - // Thus, fall back to the old, slower method. - } + + public static String getNamespacePrefix(Element el, String ns) { + if (DOM_LEVEL_3) { + return getNamespacePrefixDomLevel3(el, ns); } + return getNamespaceContext(el).getPrefix(ns); + } + private static String getNamespacePrefixDomLevel3(Element el, String ns) { + return el.lookupPrefix(ns); + } + + + public static String getNamespaceURI(Element el, String pfx) { + if (DOM_LEVEL_3) { + return getNamespaceURIDomLevel3(el, pfx); + } + return getNamespaceContext(el).getNamespaceURI(pfx); + } + private static String getNamespaceURIDomLevel3(Element el, String pfx) { + if ("".equals(pfx)) { + pfx = null; + } + return el.lookupNamespaceURI(pfx); + } + + public static NodeNamespaceContext getNamespaceContext(Node pNode) { final Map<String, String> declarations = new HashMap<String, String>(); new PrefixCollector() { protected void declare(String pPrefix, String pNamespaceURI) {