Author: bimargulies
Date: Sat Nov 15 19:14:02 2008
New Revision: 717971
URL: http://svn.apache.org/viewvc?rev=717971&view=rev
Log:
Merged revisions 717963,717966-717968 via svnmerge from
https://svn.apache.org/repos/asf/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH
........
r717963 | bimargulies | 2008-11-15 21:27:24 -0500 (Sat, 15 Nov 2008) | 2 lines
WSCOMMONS-358 and WSCOMMONS-361.
........
r717966 | bimargulies | 2008-11-15 21:53:03 -0500 (Sat, 15 Nov 2008) | 2 lines
WSCOMMONS-355 (missing anyType and anySimpleType).
........
r717967 | bimargulies | 2008-11-15 21:57:25 -0500 (Sat, 15 Nov 2008) | 2 lines
WSCOMMONS-396
........
r717968 | bimargulies | 2008-11-15 22:01:29 -0500 (Sat, 15 Nov 2008) | 2 lines
WSCOMMONS-364.
........
Added:
webservices/commons/trunk/modules/XmlSchema/maint/
- copied from r717968,
webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/maint/
webservices/commons/trunk/modules/XmlSchema/maint/DoMerges.java
- copied unchanged from r717968,
webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH/maint/DoMerges.java
Modified:
webservices/commons/trunk/modules/XmlSchema/ (props changed)
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchema.java
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/utils/NodeNamespaceContext.java
Propchange: webservices/commons/trunk/modules/XmlSchema/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sat Nov 15 19:14:02 2008
@@ -1 +1 @@
-/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-714211
+/webservices/commons/branches/modules/XmlSchema/1_4_X_BRANCH:1-717970
Modified:
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java?rev=717971&r1=717970&r2=717971&view=diff
==============================================================================
---
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
(original)
+++
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/SchemaBuilder.java
Sat Nov 15 19:14:02 2008
@@ -128,7 +128,7 @@
*/
XmlSchema handleXmlSchemaElement(Element schemaEl, String uri) {
// get all the attributes along with the namespace declns
- schema.setNamespaceContext(new NodeNamespaceContext(schemaEl));
+
schema.setNamespaceContext(NodeNamespaceContext.getNamespaceContext(schemaEl));
setNamespaceAttributes(schema, schemaEl);
XmlSchemaCollection.SchemaKey schemaKey = new
XmlSchemaCollection.SchemaKey(
@@ -431,7 +431,7 @@
restrictionEl, XmlSchema.SCHEMA_NS,
"simpleType");
if (restrictionEl.hasAttribute("base")) {
- NamespaceContext ctx = new
NodeNamespaceContext(restrictionEl);
+ NamespaceContext ctx =
NodeNamespaceContext.getNamespaceContext(restrictionEl);
restriction.baseTypeName =
getRefQName(restrictionEl
.getAttribute("base"), ctx);
} else if (inlineSimpleType != null) {
@@ -558,7 +558,7 @@
}
private QName getRefQName(String pName, Node pNode) {
- return getRefQName(pName, new NodeNamespaceContext(pNode));
+ return getRefQName(pName,
NodeNamespaceContext.getNamespaceContext(pNode));
}
private QName getRefQName(String pName, NamespaceContext pContext) {
@@ -1311,7 +1311,7 @@
// there is a possiblily of some
namespace mapping
String prefix = value.substring(0,
value.indexOf(":"));
if (ctx == null) {
- ctx = new
NodeNamespaceContext(attrEl);
+ ctx =
NodeNamespaceContext.getNamespaceContext(attrEl);
}
String namespace =
ctx.getNamespaceURI(prefix);
if
(!Constants.NULL_NS_URI.equals(namespace)) {
@@ -1863,7 +1863,7 @@
//use the entity resolver provided if the schema location is
present null
if (schemaLocation != null && !"".equals(schemaLocation)) {
- InputSource source =
collection.schemaResolver.resolveEntity(
+ InputSource source =
collection.getSchemaResolver().resolveEntity(
targetNamespace, schemaLocation,
baseUri);
//the entity resolver was unable to resolve this!!
@@ -1956,12 +1956,10 @@
}
//process elements
- NodeList allChildren = parentElement.getChildNodes();
- for (int i = 0; i < allChildren.getLength(); i++) {
- if (allChildren.item(i).getNodeType() ==
Node.ELEMENT_NODE) {
-
- Element extElement = (Element)
allChildren.item(i);
-
+ Node child = parentElement.getFirstChild();
+ while (child != null) {
+ if (child.getNodeType() == Node.ELEMENT_NODE) {
+ Element extElement = (Element) child;
String namespaceURI =
extElement.getNamespaceURI();
String name = extElement.getLocalName();
@@ -1973,9 +1971,9 @@
QName qName = new
QName(namespaceURI, name);
extReg.deserializeExtension(schemaObject, qName,
extElement);
-
}
}
+ child = child.getNextSibling();
}
}
Modified:
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchema.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchema.java?rev=717971&r1=717970&r2=717971&view=diff
==============================================================================
---
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchema.java
(original)
+++
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchema.java
Sat Nov 15 19:14:02 2008
@@ -210,6 +210,45 @@
return element;
}
}
+
+ protected XmlSchemaAttribute getAttributeByName(QName name, boolean deep,
Stack schemaStack) {
+ if (schemaStack != null &&
schemaStack.contains(this)) {
+ // recursive schema - just
return null
+ return null;
+ } else {
+ XmlSchemaAttribute attribute =
(XmlSchemaAttribute) attributes
+ .getItem(name);
+ if (deep) {
+ if (attribute == null)
{
+ // search the
imports
+ for (Iterator
includedItems = includes.getIterator(); includedItems
+
.hasNext();) {
+
+
XmlSchema schema = getSchema(includedItems.next());
+
+ if
(schema != null) {
+ //
create an empty stack - push the current parent in
+ // and
+ // use
the protected method to process the schema
+ if
(schemaStack == null) {
+
schemaStack = new Stack();
+ }
+
schemaStack.push(this);
+
attribute = schema.getAttributeByName(name, deep,
+
schemaStack);
+ if
(attribute != null) {
+
return attribute;
+ }
+ }
+ }
+ } else {
+ return
attribute;
+ }
+ }
+
+ return attribute;
+ }
+ }
/**
* get an element by the name in the local schema
@@ -230,6 +269,15 @@
public XmlSchemaElement getElementByName(QName name) {
return this.getElementByName(name, true, null);
}
+
+ /**
+ * Look for a global attribute by its QName. Searches through all
schemas.
+ * @param name
+ * @return
+ */
+ public XmlSchemaAttribute getAttributeByName(QName name) {
+ return this.getAttributeByName(name, true, null);
+ }
/**
* protected method that allows safe (non-recursive schema loading)
Modified:
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
URL:
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java?rev=717971&r1=717970&r2=717971&view=diff
==============================================================================
---
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
(original)
+++
webservices/commons/trunk/modules/XmlSchema/src/main/java/org/apache/ws/commons/schema/XmlSchemaCollection.java
Sat Nov 15 19:14:02 2008
@@ -144,9 +144,9 @@
* An org.xml.sax.EntityResolver that is used to
* resolve the imports/includes
*/
- URIResolver schemaResolver = new DefaultURIResolver();
+ private URIResolver schemaResolver = new DefaultURIResolver();
- XmlSchema xsd = new XmlSchema(XmlSchema.SCHEMA_NS, this);
+ XmlSchema xsd = new XmlSchema(XmlSchema.SCHEMA_NS, this);
/**
* stack to track imports (to prevent recursion)
@@ -171,12 +171,27 @@
}
/**
+ * Retrieve the custom URI resolver, if any.
+ * @return the current resolver.
+ */
+ public URIResolver getSchemaResolver() {
+ return schemaResolver;
+ }
+
+ /**
* This section should comply to the XMLSchema specification; see
* <a
href="http://www.w3.org/TR/2004/PER-xmlschema-2-20040318/datatypes.html#built-in-datatypes">
*
http://www.w3.org/TR/2004/PER-xmlschema-2-20040318/datatypes.html#built-in-datatypes</a>.
* This needs to be inspected by another pair of eyes
*/
public void init() {
+
+ /*
+ * Defined in section 4.
+ */
+ addSimpleType(xsd, Constants.XSD_ANYSIMPLETYPE.getLocalPart());
+ addSimpleType(xsd, Constants.XSD_ANYTYPE.getLocalPart());
+
/*
Primitive types
@@ -506,6 +521,40 @@
}
return null;
}
+
+ /**
+ * Find a global attribute by QName in this collection of schemas.
+ * @param schemaAttributeName the name of the attribute.
+ * @return the attribute or null.
+ */
+ public XmlSchemaAttribute getAttributeByQName(QName schemaAttributeName) {
+ String uri = schemaAttributeName.getNamespaceURI();
+ for (Iterator iter = schemas.entrySet().iterator(); iter.hasNext();
) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
+ XmlSchemaAttribute attribute = ((XmlSchema)
entry.getValue()).getAttributeByName(schemaAttributeName);
+ if (attribute != null) {
+ return attribute;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the schema from this collection for a particular targetNamespace.
+ * @param uri target namespace URI.
+ * @return
+ */
+ public XmlSchema schemaForNamespace(String uri) {
+ for (Iterator iter = schemas.entrySet().iterator(); iter.hasNext();
) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ if (((SchemaKey) entry.getKey()).getNamespace().equals(uri)) {
+ return (XmlSchema) entry.getValue();
+ }
+ }
+ return null;
+ }
Map unresolvedTypes = new HashMap();
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=717971&r1=717970&r2=717971&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
Sat Nov 15 19:14:02 2008
@@ -20,42 +20,94 @@
package org.apache.ws.commons.schema.utils;
import org.apache.ws.commons.schema.constants.Constants;
+
+import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import javax.xml.namespace.NamespaceContext;
+
+import java.lang.reflect.Method;
import java.util.*;
/**
* Implementation of [EMAIL PROTECTED] NamespaceContext}, which is based on a
DOM node.
*/
public class NodeNamespaceContext implements NamespacePrefixList {
+ private static final String NODE_NAMSPACE_CONTEXT =
NamespacePrefixList.class.getName();
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);
- private Node node;
- private Map declarations;
+
+ static Method getUserData;
+ static Method setUserData;
+ static {
+ 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});
+ } catch (Throwable e) {
+ getUserData = null;
+ setUserData = null;
+ }
+ }
+
+
+
+ private final Map declarations;
private String[] prefixes;
/**
* Creates a new instance with the given nodes context.
*/
- public NodeNamespaceContext(Node pNode) {
- node = pNode;
+ private NodeNamespaceContext(Map decls) {
+ declarations = decls;
}
-
- private Map getDeclarations() {
- if (declarations == null) {
- declarations = new HashMap();
- //FIXME: Do we really need to add this mapping? shows up in the
serialized schema as xmlns=""
- //declarations.put(Constants.DEFAULT_NS_PREFIX,
Constants.NULL_NS_URI);
- new PrefixCollector(){
- protected void declare(String pPrefix, String pNamespaceURI) {
- declarations.put(pPrefix, pNamespaceURI);
+
+ 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});
}
- }.searchAllPrefixDeclarations(node);
- Collection keys = declarations.keySet();
- prefixes = (String[]) keys.toArray(new String[keys.size()]);
+ return ctx;
+ } catch (Throwable t) {
+ //ignore. DOM level 2 implementation would not have the
getUserData stuff.
+ //Thus, fall back to the old, slower method.
+ }
}
- return declarations;
+
+ final Map declarations = new HashMap();
+ new PrefixCollector(){
+ protected void declare(String pPrefix, String pNamespaceURI) {
+ declarations.put(pPrefix, pNamespaceURI);
+ }
+ }.searchAllPrefixDeclarations(pNode);
+ return new NodeNamespaceContext(declarations);
}
public String getNamespaceURI(String pPrefix) {
@@ -68,7 +120,7 @@
if (Constants.XMLNS_ATTRIBUTE.equals(pPrefix)) {
return Constants.XMLNS_ATTRIBUTE_NS_URI;
}
- final String uri = (String) getDeclarations().get(pPrefix);
+ final String uri = (String) declarations.get(pPrefix);
return uri == null ? Constants.NULL_NS_URI : uri;
}
@@ -82,8 +134,7 @@
if (Constants.XMLNS_ATTRIBUTE_NS_URI.equals(pNamespaceURI)) {
return Constants.XMLNS_ATTRIBUTE;
}
- Map decl = getDeclarations();
- for (Iterator iter = decl.entrySet().iterator(); iter.hasNext(); ) {
+ for (Iterator iter = declarations.entrySet().iterator();
iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
if (pNamespaceURI.equals(entry.getValue())) {
return (String) entry.getKey();
@@ -103,7 +154,7 @@
return XMLNS_ATTRIBUTE_COLLECTION.iterator();
}
final List list = new ArrayList();
- for (Iterator iter = getDeclarations().entrySet().iterator();
iter.hasNext(); ) {
+ for (Iterator iter = declarations.entrySet().iterator();
iter.hasNext(); ) {
Map.Entry entry = (Map.Entry) iter.next();
if (pNamespaceURI.equals(entry.getValue())) {
list.add(entry.getKey());
@@ -113,7 +164,10 @@
}
public String[] getDeclaredPrefixes() {
- getDeclarations(); // Make sure, that the prefixes array is valid
+ if (prefixes == null) {
+ Collection keys = declarations.keySet();
+ prefixes = (String[]) keys.toArray(new String[keys.size()]);
+ }
return prefixes;
}
}