Author: dkulp Date: Tue Sep 7 15:57:20 2010 New Revision: 993403 URL: http://svn.apache.org/viewvc?rev=993403&view=rev Log: [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/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java Modified: webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java URL: http://svn.apache.org/viewvc/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java?rev=993403&r1=993402&r2=993403&view=diff ============================================================================== --- webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java (original) +++ webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java Tue Sep 7 15:57:20 2010 @@ -191,8 +191,8 @@ public class SchemaBuilder { + "Please update the schema to the \"" + XmlSchema.SCHEMA_NS + "\" namespace"); } - for (; el != null; el = XDOMUtil.getNextSiblingElementNS(el, - XmlSchema.SCHEMA_NS)) { + for (; el != null; + el = XDOMUtil.getNextSiblingElementNS(el, XmlSchema.SCHEMA_NS)) { // String elPrefix = el.getPrefix() == null ? "" : el.getPrefix(); //if(elPrefix.equals(schema.schema_ns_prefix)) { @@ -257,7 +257,7 @@ public class SchemaBuilder { //add the extesibility components processExtensibilityComponents(schema, schemaEl); - + return schema; } @@ -433,9 +433,8 @@ public class SchemaBuilder { restrictionEl, XmlSchema.SCHEMA_NS, "simpleType"); if (restrictionEl.hasAttribute("base")) { - NamespaceContext ctx = NodeNamespaceContext.getNamespaceContext(restrictionEl); restriction.baseTypeName = getRefQName(restrictionEl - .getAttribute("base"), ctx); + .getAttribute("base"), restrictionEl); } else if (inlineSimpleType != null) { restriction.baseType = handleSimpleType(schema, @@ -562,17 +561,13 @@ public class SchemaBuilder { return simpleType; } - private QName getRefQName(String pName, Node pNode) { - return getRefQName(pName, NodeNamespaceContext.getNamespaceContext(pNode)); - } - - private QName getRefQName(String pName, NamespaceContext pContext) { + private QName getRefQName(String pName, Element pNode) { final int offset = pName.indexOf(':'); String uri; final String localName; final String prefix; if (offset == -1) { - uri = pContext.getNamespaceURI(Constants.DEFAULT_NS_PREFIX); + uri = NodeNamespaceContext.getNamespaceURI(pNode, Constants.DEFAULT_NS_PREFIX); if (Constants.NULL_NS_URI.equals(uri)) { return new QName(Constants.NULL_NS_URI, pName); } @@ -580,7 +575,7 @@ public class SchemaBuilder { prefix = Constants.DEFAULT_NS_PREFIX; } else { prefix = pName.substring(0, offset); - uri = pContext.getNamespaceURI(prefix); + uri = NodeNamespaceContext.getNamespaceURI(pNode, prefix); if (uri == null || Constants.NULL_NS_URI.equals(uri)) { if (schema.parent != null && schema.parent.getNamespaceContext() != null) { @@ -1297,7 +1292,6 @@ public class SchemaBuilder { NamedNodeMap attrNodes = attrEl.getAttributes(); Vector attrs = new Vector(); - NodeNamespaceContext ctx = null; for (int i = 0; i < attrNodes.getLength(); i++) { Attr att = (Attr) attrNodes.item(i); String attName = att.getName(); @@ -1312,10 +1306,7 @@ public class SchemaBuilder { if (value.indexOf(":") > -1) { // there is a possiblily of some namespace mapping String prefix = value.substring(0, value.indexOf(":")); - if (ctx == null) { - ctx = NodeNamespaceContext.getNamespaceContext(attrEl); - } - String namespace = ctx.getNamespaceURI(prefix); + String namespace = NodeNamespaceContext.getNamespaceURI(attrEl, prefix); if (!Constants.NULL_NS_URI.equals(namespace)) { Attr nsAttr = attrEl.getOwnerDocument() .createAttribute("xmlns:" + prefix); Modified: webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java URL: http://svn.apache.org/viewvc/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java?rev=993403&r1=993402&r2=993403&view=diff ============================================================================== --- webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java (original) +++ webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java Tue Sep 7 15:57:20 2010 @@ -21,33 +21,37 @@ package org.apache.ws.commons.schema.uti import org.apache.ws.commons.schema.constants.Constants; +import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import javax.xml.namespace.NamespaceContext; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; /** * Implementation of {...@link NamespaceContext}, which is based on a DOM node. */ -public class NodeNamespaceContext implements NamespacePrefixList { - private static final String NODE_NAMSPACE_CONTEXT = NamespacePrefixList.class.getName(); +public class NodeNamespaceContext implements NamespacePrefixList, Serializable { private static final Collection XML_NS_PREFIX_COLLECTION = Collections.singletonList(Constants.XML_NS_PREFIX); private static final Collection XMLNS_ATTRIBUTE_COLLECTION = Collections.singletonList(Constants.XMLNS_ATTRIBUTE); - static Method getUserData; - static Method setUserData; + static final boolean domLevel3; + static { + boolean level3 = false; try { Class cls = Class.forName("org.w3c.dom.UserDataHandler", false, Node.class.getClassLoader()); - getUserData = Node.class.getMethod("getUserData", new Class[]{String.class}); - setUserData = Node.class.getMethod("setUserData", new Class[]{String.class, Object.class, cls}); + Node.class.getMethod("getUserData", new Class[]{String.class}); + Node.class.getMethod("setUserData", new Class[]{String.class, Object.class, cls}); + level3 = true; } catch (Throwable e) { - getUserData = null; - setUserData = null; + level3 = false; } + domLevel3 = level3; } @@ -62,45 +66,31 @@ public class NodeNamespaceContext implem 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 declarations = new HashMap(); - - 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 (domLevel3) { + 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 (domLevel3) { + 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 declarations = new HashMap(); new PrefixCollector(){ protected void declare(String pPrefix, String pNamespaceURI) {