elena 2003/01/16 14:53:45
Modified: java/src/org/apache/xerces/dom AttrImpl.java AttrNSImpl.java
DeferredAttrImpl.java DeferredAttrNSImpl.java
DeferredDocumentImpl.java
DeferredElementNSImpl.java DeferredNode.java
ElementImpl.java ElementNSImpl.java NodeImpl.java
java/src/org/apache/xerces/impl/dv/xs XSSimpleTypeDecl.java
java/src/org/apache/xerces/impl/xs/opti AttrImpl.java
DefaultElement.java
java/src/org/apache/xerces/parsers AbstractDOMParser.java
Added: java/src/org/apache/xerces/dom3 TypeInfo.java
Log:
Implement DOM L3 TypeInfo.
Clean up a bit DOMParser -- it used to create notation declarations from external
DTD...
Revision Changes Path
1.49 +37 -2 xml-xerces/java/src/org/apache/xerces/dom/AttrImpl.java
Index: AttrImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/AttrImpl.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- AttrImpl.java 31 Dec 2002 01:16:06 -0000 1.48
+++ AttrImpl.java 16 Jan 2003 22:53:44 -0000 1.49
@@ -61,6 +61,7 @@
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
+import org.apache.xerces.dom3.TypeInfo;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Element;
@@ -149,7 +150,7 @@
*/
public class AttrImpl
extends NodeImpl
- implements Attr {
+ implements Attr, TypeInfo{
//
// Constants
@@ -167,6 +168,9 @@
/** Attribute name. */
protected String name;
+
+ /** Type information */
+ Object type;
protected static TextImpl textNode = null;
@@ -305,6 +309,28 @@
public void setNodeValue(String value) throws DOMException {
setValue(value);
}
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeName()
+ */
+ public String getTypeName() {
+ return (String)type;
+ }
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeNamespace()
+ */
+ public String getTypeNamespace() {
+ return null;
+ }
+
+ /**
+ * Method getSchemaTypeInfo.
+ * @return TypeInfo
+ */
+ public TypeInfo getSchemaTypeInfo(){
+ return this;
+ }
/**
* In Attribute objects, NodeValue is considered a synonym for
@@ -564,6 +590,14 @@
isSpecified(arg);
} // setSpecified(boolean)
+
+ /**
+ * NON-DOM: used by the parser
+ * @param type
+ */
+ public void setType (Object type){
+ this.type = type;
+ }
//
// Object methods
@@ -1178,5 +1212,6 @@
needsSyncChildren(false);
} // readObject(ObjectInputStream)
+
} // class AttrImpl
1.33 +28 -1 xml-xerces/java/src/org/apache/xerces/dom/AttrNSImpl.java
Index: AttrNSImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/AttrNSImpl.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- AttrNSImpl.java 2 Nov 2002 01:02:23 -0000 1.32
+++ AttrNSImpl.java 16 Jan 2003 22:53:44 -0000 1.33
@@ -58,6 +58,7 @@
package org.apache.xerces.dom;
import org.w3c.dom.DOMException;
+import org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl;
import org.apache.xerces.xni.NamespaceContext;
/**
@@ -324,5 +325,31 @@
synchronizeData();
}
return localName;
+ }
+
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeName()
+ */
+ public String getTypeName() {
+ if (type !=null){
+ if (type instanceof XSSimpleTypeDecl){
+ return ((XSSimpleTypeDecl)type).getName();
+ }
+ return (String)type;
+ }
+ return null;
+ }
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeNamespace()
+ */
+ public String getTypeNamespace() {
+ if (type !=null){
+ if (type instanceof XSSimpleTypeDecl){
+ return ((XSSimpleTypeDecl)type).getNamespace();
+ }
+ }
+ return null;
}
}
1.19 +4 -2 xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrImpl.java
Index: DeferredAttrImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrImpl.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- DeferredAttrImpl.java 12 Apr 2002 15:43:48 -0000 1.18
+++ DeferredAttrImpl.java 16 Jan 2003 22:53:44 -0000 1.19
@@ -161,8 +161,10 @@
name = ownerDocument.getNodeName(fNodeIndex);
int extra = ownerDocument.getNodeExtra(fNodeIndex);
isSpecified((extra & SPECIFIED) != 0);
- isIdAttribute((extra & IDATTRIBUTE) != 0);
+ isIdAttribute((extra & ID) != 0);
+ int extraNode = ownerDocument.getLastChild(fNodeIndex);
+ type = ownerDocument.getTypeInfo(extraNode);
} // synchronizeData()
/**
1.23 +5 -23
xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrNSImpl.java
Index: DeferredAttrNSImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredAttrNSImpl.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- DeferredAttrNSImpl.java 9 Aug 2002 15:18:14 -0000 1.22
+++ DeferredAttrNSImpl.java 16 Jan 2003 22:53:44 -0000 1.23
@@ -133,39 +133,21 @@
// extract prefix and local part from QName
int index = name.indexOf(':');
- String prefix;
if (index < 0) {
- prefix = null;
localName = name;
}
else {
- prefix = name.substring(0, index);
localName = name.substring(index + 1);
}
int extra = ownerDocument.getNodeExtra(fNodeIndex);
isSpecified((extra & SPECIFIED) != 0);
- isIdAttribute((extra & IDATTRIBUTE) != 0);
+ isIdAttribute((extra & ID) != 0);
namespaceURI = ownerDocument.getNodeURI(fNodeIndex);
- // hide the fact that our parser uses an empty string for null
- if (namespaceURI != null && namespaceURI.length() == 0) {
- namespaceURI = null;
- }
- // DOM Level 2 wants all namespace declaration attributes
- // to be bound to "http://www.w3.org/2000/xmlns/"
- // So as long as the XML parser doesn't do it, it needs to
- // done here.
- if (namespaceURI == null) {
- if (prefix != null) {
- if (prefix.equals("xmlns")) {
- namespaceURI = "http://www.w3.org/2000/xmlns/";
- }
- } else if (name.equals("xmlns")) {
- namespaceURI = "http://www.w3.org/2000/xmlns/";
- }
- }
-
+
+ int extraNode = ownerDocument.getLastChild(fNodeIndex);
+ type = ownerDocument.getTypeInfo(extraNode);
} // synchronizeData()
/**
1.49 +136 -22
xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentImpl.java
Index: DeferredDocumentImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredDocumentImpl.java,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- DeferredDocumentImpl.java 8 Aug 2002 20:45:36 -0000 1.48
+++ DeferredDocumentImpl.java 16 Jan 2003 22:53:44 -0000 1.49
@@ -230,19 +230,10 @@
int chunk = nodeIndex >> CHUNK_SHIFT;
int index = nodeIndex & CHUNK_MASK;
- // added for DOM2: createDoctype factory method includes
- // name, publicID, systemID
-
- // create extra data node
- int extraDataIndex = createNode((short)0); // node type unimportant
- int echunk = extraDataIndex >> CHUNK_SHIFT;
- int eindex = extraDataIndex & CHUNK_MASK;
-
// save name, public id, system id
setChunkValue(fNodeName, rootElementName, chunk, index);
setChunkValue(fNodeValue, publicId, chunk, index);
setChunkValue(fNodeURI, systemId, chunk, index);
- setChunkIndex(fNodeExtra, extraDataIndex, chunk, index);
// return node index
return nodeIndex;
@@ -252,9 +243,12 @@
public void setInternalSubset(int doctypeIndex, String subset) {
int chunk = doctypeIndex >> CHUNK_SHIFT;
int index = doctypeIndex & CHUNK_MASK;
- int extraDataIndex = fNodeExtra[chunk][index];
+
+ // create extra data node to store internal subset
+ int extraDataIndex = createNode(Node.DOCUMENT_TYPE_NODE);
int echunk = extraDataIndex >> CHUNK_SHIFT;
int eindex = extraDataIndex & CHUNK_MASK;
+ setChunkIndex(fNodeExtra, extraDataIndex, chunk, index);
setChunkValue(fNodeValue, subset, echunk, eindex);
}
@@ -338,8 +332,7 @@
return null;
}
- // DOM Level 3
- // setting encoding and version
+ // DOM Level 3: setting encoding and version
public void setEntityInfo(int currentEntityDecl,
String version, String encoding){
int eNodeIndex = getNodeExtra(currentEntityDecl, false);
@@ -382,12 +375,30 @@
} // createDeferredEntityReference(String):int
- /** Creates an element node in the table. */
+
+ /** Creates an element node with a URI in the table and type information. */
+ public int createDeferredElement(String elementURI, String elementName,
+ Object type) {
+
+ // create node
+ int elementNodeIndex = createNode(Node.ELEMENT_NODE);
+ int elementChunk = elementNodeIndex >> CHUNK_SHIFT;
+ int elementIndex = elementNodeIndex & CHUNK_MASK;
+ setChunkValue(fNodeName, elementName, elementChunk, elementIndex);
+ setChunkValue(fNodeURI, elementURI, elementChunk, elementIndex);
+ setChunkValue(fNodeValue, type, elementChunk, elementIndex);
+
+ // return node index
+ return elementNodeIndex;
+
+ } // createDeferredElement(String,String):int
+
+ /** @deprecated. Creates an element node in the table. */
public int createDeferredElement(String elementName) {
return createDeferredElement(null, elementName);
}
- /** Creates an element node with a URI in the table. */
+ /** @deprecated. Creates an element node with a URI in the table. */
public int createDeferredElement(String elementURI, String elementName) {
// create node
@@ -401,8 +412,70 @@
return elementNodeIndex;
} // createDeferredElement(String,String):int
-
- /** Sets an attribute on an element node. */
+
+
+ /**
+ * This method is used by the DOMParser to create attributes.
+ * @param elementNodeIndex
+ * @param attrName
+ * @param attrURI
+ * @param attrValue
+ * @param specified
+ * @param id
+ * @param type
+ * @return int
+ */
+ public int setDeferredAttribute(int elementNodeIndex,
+ String attrName,
+ String attrURI,
+ String attrValue,
+ boolean specified,
+ boolean id,
+ Object type) {
+
+ // create attribute
+ int attrNodeIndex = createDeferredAttribute(attrName, attrURI,
attrValue, specified);
+ int attrChunk = attrNodeIndex >> CHUNK_SHIFT;
+ int attrIndex = attrNodeIndex & CHUNK_MASK;
+ // set attribute's parent to element
+ setChunkIndex(fNodeParent, elementNodeIndex, attrChunk, attrIndex);
+
+ int elementChunk = elementNodeIndex >> CHUNK_SHIFT;
+ int elementIndex = elementNodeIndex & CHUNK_MASK;
+
+ // get element's last attribute
+ int lastAttrNodeIndex = getChunkIndex(fNodeExtra, elementChunk,
elementIndex);
+ if (lastAttrNodeIndex != 0) {
+ int lastAttrChunk = lastAttrNodeIndex >> CHUNK_SHIFT;
+ int lastAttrIndex = lastAttrNodeIndex & CHUNK_MASK;
+ // add link from new attribute to last attribute
+ setChunkIndex(fNodePrevSib, lastAttrNodeIndex, attrChunk,
attrIndex);
+ }
+ // add link from element to new last attribute
+ setChunkIndex(fNodeExtra, attrNodeIndex, elementChunk, elementIndex);
+
+ int extra = getChunkIndex(fNodeExtra, attrChunk, attrIndex);
+ if (id) {
+ extra = extra | ID;
+ setChunkIndex(fNodeExtra, extra, attrChunk, attrIndex);
+ String value = getChunkValue(fNodeValue, attrChunk, attrIndex);
+ putIdentifier(value, elementNodeIndex);
+ }
+ // store type information
+ if (type != null) {
+ int extraDataIndex = createNode(DeferredNode.TYPE_NODE);
+ int echunk = extraDataIndex >> CHUNK_SHIFT;
+ int eindex = extraDataIndex & CHUNK_MASK;
+
+ setChunkIndex(fNodeLastChild, extraDataIndex, attrChunk,
attrIndex);
+ setChunkValue(fNodeValue, type, echunk, eindex);
+ }
+
+ // return node index
+ return attrNodeIndex;
+ }
+
+ /** @deprecated. Sets an attribute on an element node.*/
public int setDeferredAttribute(int elementNodeIndex,
String attrName, String attrURI,
String attrValue, boolean specified) {
@@ -461,7 +534,7 @@
} // createDeferredAttribute(String,String,String,boolean):int
- /** Creates an element definition in the table. */
+ /** Creates an element definition in the table.*/
public int createDeferredElementDefinition(String elementName) {
// create node
@@ -680,7 +753,7 @@
int chunk = attrIndex >> CHUNK_SHIFT;
int index = attrIndex & CHUNK_MASK;
int extra = getChunkIndex(fNodeExtra, chunk, index);
- extra = extra | IDATTRIBUTE;
+ extra = extra | ID;
setChunkIndex(fNodeExtra, extra, chunk, index);
String value = getChunkValue(fNodeValue, chunk, index);
@@ -694,7 +767,7 @@
int chunk = attrIndex >> CHUNK_SHIFT;
int index = attrIndex & CHUNK_MASK;
int extra = getChunkIndex(fNodeExtra, chunk, index);
- extra = extra | IDATTRIBUTE;
+ extra = extra | ID;
setChunkIndex(fNodeExtra, extra, chunk, index);
}
@@ -1176,6 +1249,32 @@
public String getNodeValue(int nodeIndex) {
return getNodeValue(nodeIndex, true);
}
+
+ /**
+ * Clears the type info that is stored in the fNodeValue array
+ * @param nodeIndex
+ * @return Object - type information for the attribute/element node
+ */
+ public Object getTypeInfo(int nodeIndex) {
+ if (nodeIndex == -1) {
+ return null;
+ }
+
+ int chunk = nodeIndex >> CHUNK_SHIFT;
+ int index = nodeIndex & CHUNK_MASK;
+
+
+ Object value = fNodeValue[chunk][index];
+ if (value != null) {
+ fNodeValue[chunk][index] = null;
+ RefCount c = (RefCount) fNodeValue[chunk][CHUNK_SIZE];
+ c.fCount--;
+ if (c.fCount == 0) {
+ fNodeValue[chunk] = null;
+ }
+ }
+ return value;
+ }
/**
* Returns the value of the given node.
@@ -1361,6 +1460,7 @@
case Node.ENTITY_REFERENCE_NODE: {
System.out.print("ERef"); break; }
case Node.TEXT_NODE: { System.out.print("Text"); break; }
case Node.ATTRIBUTE_NODE: { System.out.print("Attr");
break; }
+ case DeferredNode.TYPE_NODE: {
System.out.print("TypeInfo"); break; }
default: { System.out.print("?"+fNodeType[i][CHUNK_SIZE]); }
}
System.out.print('\t');
@@ -1413,12 +1513,13 @@
case Node.ENTITY_REFERENCE_NODE: { System.out.print("ERef");
break; }
case Node.TEXT_NODE: { System.out.print("Text"); break; }
case Node.ATTRIBUTE_NODE: { System.out.print("Attr"); break; }
+ case DeferredNode.TYPE_NODE: { System.out.print("TypeInfo");
break; }
default: { System.out.print("?"+getChunkIndex(fNodeType, chunk,
index)); }
}
System.out.print('\t');
System.out.print(getChunkValue(fNodeName, chunk, index));
System.out.print('\t');
- System.out.print(getChunkValue(fNodeValue, chunk, index));
+ System.out.print(getNodeValue(chunk, index));
System.out.print('\t');
System.out.print(getChunkValue(fNodeURI, chunk, index));
System.out.print('\t');
@@ -1772,7 +1873,6 @@
/** Creates a node of the specified type. */
protected int createNode(short nodeType) {
-
// ensure tables are large enough
int chunk = fNodeCount >> CHUNK_SHIFT;
int index = fNodeCount & CHUNK_MASK;
@@ -1907,6 +2007,20 @@
private final String getChunkValue(Object data[][], int chunk, int index) {
return data[chunk] != null ? (String) data[chunk][index] : null;
}
+ private final String getNodeValue(int chunk, int index) {
+ Object data = fNodeValue[chunk][index];
+ if (data == null){
+ return null;
+ }
+ else if (data instanceof String){
+ return (String)data;
+ }
+ else {
+ // type information
+ return data.toString();
+ }
+ }
+
/**
* Clears the specified value in the given data at the chunk and index.
1.16 +4 -6
xml-xerces/java/src/org/apache/xerces/dom/DeferredElementNSImpl.java
Index: DeferredElementNSImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredElementNSImpl.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- DeferredElementNSImpl.java 9 Aug 2002 15:18:14 -0000 1.15
+++ DeferredElementNSImpl.java 16 Jan 2003 22:53:44 -0000 1.16
@@ -66,6 +66,7 @@
package org.apache.xerces.dom;
+import org.apache.xerces.impl.xs.psvi.XSTypeDefinition;
import org.w3c.dom.NamedNodeMap;
/**
@@ -145,11 +146,8 @@
localName = name.substring(index + 1);
}
- namespaceURI = ownerDocument.getNodeURI(fNodeIndex);
- // hide the fact that our parser uses an empty string for null
- if (namespaceURI != null && namespaceURI.length() == 0) {
- namespaceURI = null;
- }
+ namespaceURI = ownerDocument.getNodeURI(fNodeIndex);
+ type = (XSTypeDefinition)ownerDocument.getTypeInfo(fNodeIndex);
// attributes
setupDefaultAttributes();
1.6 +4 -1 xml-xerces/java/src/org/apache/xerces/dom/DeferredNode.java
Index: DeferredNode.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DeferredNode.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- DeferredNode.java 29 Jan 2002 01:15:07 -0000 1.5
+++ DeferredNode.java 16 Jan 2003 22:53:44 -0000 1.6
@@ -66,6 +66,9 @@
*/
public interface DeferredNode extends Node {
+
+ public static final short TYPE_NODE = 20;
+
//
// DeferredNode methods
//
1.58 +24 -2 xml-xerces/java/src/org/apache/xerces/dom/ElementImpl.java
Index: ElementImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/ElementImpl.java,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -r1.57 -r1.58
--- ElementImpl.java 8 Jan 2003 21:42:04 -0000 1.57
+++ ElementImpl.java 16 Jan 2003 22:53:44 -0000 1.58
@@ -65,6 +65,7 @@
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
+import org.apache.xerces.dom3.TypeInfo;
import org.apache.xerces.util.URI;
/**
@@ -93,7 +94,7 @@
*/
public class ElementImpl
extends ParentNode
- implements Element {
+ implements Element, TypeInfo {
//
// Constants
@@ -994,7 +995,28 @@
ownerDocument.putIdentifier(at.getValue(), this);
}
}
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeName()
+ */
+ public String getTypeName() {
+ return null;
+ }
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeNamespace()
+ */
+ public String getTypeNamespace() {
+ return null;
+ }
+ /**
+ * Method getSchemaTypeInfo.
+ * @return TypeInfo
+ */
+ public TypeInfo getSchemaTypeInfo(){
+ return this;
+ }
//
// Public methods
1.29 +38 -4 xml-xerces/java/src/org/apache/xerces/dom/ElementNSImpl.java
Index: ElementNSImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/ElementNSImpl.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- ElementNSImpl.java 2 Nov 2002 01:02:23 -0000 1.28
+++ ElementNSImpl.java 16 Jan 2003 22:53:44 -0000 1.29
@@ -57,11 +57,11 @@
package org.apache.xerces.dom;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Attr;
-
+import org.apache.xerces.impl.xs.psvi.XSTypeDefinition;
import org.apache.xerces.util.URI;
import org.apache.xerces.xni.NamespaceContext;
+import org.w3c.dom.Attr;
+import org.w3c.dom.DOMException;
@@ -94,6 +94,9 @@
/** DOM2: localName. */
protected String localName;
+
+ /** DOM3: type information */
+ XSTypeDefinition type;
protected ElementNSImpl() {
super();
@@ -357,4 +360,35 @@
}
return baseURI;
}
+
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeName()
+ */
+ public String getTypeName() {
+ if (type !=null){
+ return type.getName();
+ }
+ return null;
+ }
+
+ /**
+ * @see org.apache.xerces.dom3.TypeInfo#getTypeNamespace()
+ */
+ public String getTypeNamespace() {
+ if (type !=null){
+ return type.getNamespace();
+ }
+ return null;
+ }
+
+
+ /**
+ * NON-DOM: setting type used by the DOM parser
+ * @see NodeImpl#setReadOnly
+ */
+ public void setType(XSTypeDefinition type) {
+ type = type;
+ }
+
}
1.61 +4 -4 xml-xerces/java/src/org/apache/xerces/dom/NodeImpl.java
Index: NodeImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/NodeImpl.java,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -r1.60 -r1.61
--- NodeImpl.java 20 Nov 2002 00:49:46 -0000 1.60
+++ NodeImpl.java 16 Jan 2003 22:53:44 -0000 1.61
@@ -190,7 +190,7 @@
protected final static short IGNORABLEWS = 0x1<<6;
protected final static short HASSTRING = 0x1<<7;
protected final static short UNNORMALIZED = 0x1<<8;
- protected final static short IDATTRIBUTE = 0x1<<9;
+ protected final static short ID = 0x1<<9;
//
// Constructors
@@ -1725,11 +1725,11 @@
}
final boolean isIdAttribute() {
- return (flags & IDATTRIBUTE) != 0;
+ return (flags & ID) != 0;
}
final void isIdAttribute(boolean value) {
- flags = (short) (value ? flags | IDATTRIBUTE : flags & ~IDATTRIBUTE);
+ flags = (short) (value ? flags | ID : flags & ~ID);
}
//
1.1 xml-xerces/java/src/org/apache/xerces/dom3/TypeInfo.java
Index: TypeInfo.java
===================================================================
/*
* Copyright (c) 2002 World Wide Web Consortium,
* (Massachusetts Institute of Technology, Institut National de
* Recherche en Informatique et en Automatique, Keio University). All
* Rights Reserved. This program is distributed under the W3C's Software
* Intellectual Property License. This program is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE.
* See W3C License http://www.w3.org/Consortium/Legal/ for more details.
*/
package org.apache.xerces.dom3;
/**
* The <code>TypeInfo</code> interface represent a type referenced from
* <code>Element</code> or <code>Attr</code> nodes, specified in the schemas
* associated with the document. The type is a pair of a namespace URI and
* name properties, and depends on the document's schema. should you be
* able to return <code>null</code> on <code>name</code>? for anonymous
* type? for undeclared elements/attributes? Can schemaType be
* <code>null</code>?
* <p> If the document's schema is an XML DTD [<a
href='http://www.w3.org/TR/2000/REC-xml-20001006'>XML 1.0</a>], the values are
computed as
* follows: If this type is referenced from an <code>Attr</code> node,
* <code>namespace</code> is <code>null</code> and <code>name</code>
* represents the [attribute type] property in the [<a
href='http://www.w3.org/TR/2001/REC-xml-infoset-20011024/'>XML Information set</a>].
If there is no
* declaration for the attribute, <code>name</code> is <code>null</code>.
* Unlike for XML Schema, the name contain the declared type, and does not
* relate to "validity". If this type is referenced from an
* <code>Element</code> node, the <code>namespace</code> and
* <code>name</code> are <code>null</code>.
* <p>
* If the document's schema is an XML Schema [XML Schema Part 1], the
* values are computed as follows (for definitions see Post-Schema
* Validation infoset):
* <p>If the [validity] property exists AND is "invalid" or "notKnown":
* the {target namespace} and {name} properties of the declared type
* if available, otherwise null.
* <p>Note: At the time of writing, the XML Schema specification does not
* require exposing the declared type. Thus, DOM implementations
* might choose not to provide type information if validity is not valid.
* <p>If the [validity] property exists and is "valid" the name and namespace
* computed as follows:
* <p>a) If [member type definition] exists, then expose the
* {target namespace} and {name} properties of the
* [member type definition] property;
* <p>b) If the [member type definition namespace] and the
* [member type definition name] exist, then expose these properties.
* <p>c) If the [type definition] property exists, then expose the {target
* namespace} and {name} properties of the [type definition] property;
* <p>d) If the [type definition namespace] and the [type definition name]
* exist, then expose these properties.
*
* <p> Note: At the time of writing, the XML Schema specification does not
* define how to expose annonimous types. If future specifications
* define how to expose annonimous types, DOM implementations can expose
* annonimous types via "name" and "namespace" parameters.
*
* Other schema languages are outside the scope of the
* W3C and therefore should define how to represent their type systems using
* <code>TypeInfo</code>.
* <p>See also the <a
href='http://www.w3.org/TR/2002/WD-DOM-Level-3-Core-20021022'>Document Object Model
(DOM) Level 3 Core Specification</a>.
* @since DOM Level 3
*/
public interface TypeInfo {
/**
* The name of a type declared for the associated element or attribute,
* or <code>null</code> if unknown. Implementations may also use
* <code>null</code> to represent XML Schema anonymous types. "name"
* seems too generic and may conflict. shoud we rename it?
*/
public String getTypeName();
/**
* The namespace of the type declared for the associated element or
* attribute or <code>null</code> if the element does not have
* declaration or if no namespace information is available.
* Implementations may also use <code>null</code> to represent XML
* Schema anonymous types. "namespace" seems too generic and may
* conflict. shoud we rename it?
*/
public String getTypeNamespace();
}
1.28 +11 -1
xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java
Index: XSSimpleTypeDecl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/dv/xs/XSSimpleTypeDecl.java,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- XSSimpleTypeDecl.java 14 Jan 2003 20:21:44 -0000 1.27
+++ XSSimpleTypeDecl.java 16 Jan 2003 22:53:45 -0000 1.28
@@ -2190,5 +2190,15 @@
// REVISIT: implement
return null;
}
+
+
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+
+ return this.fTargetNamespace+"," +this.fTypeName;
+ }
} // class XSSimpleTypeDecl
1.4 +10 -1 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/AttrImpl.java
Index: AttrImpl.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/AttrImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- AttrImpl.java 3 Jan 2003 00:18:21 -0000 1.3
+++ AttrImpl.java 16 Jan 2003 22:53:45 -0000 1.4
@@ -57,6 +57,7 @@
package org.apache.xerces.impl.xs.opti;
+import org.apache.xerces.dom3.TypeInfo;
import org.w3c.dom.Attr;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
@@ -127,6 +128,14 @@
*/
public boolean getIsId(){
return false;
+ }
+
+ /**
+ * Method getSchemaTypeInfo.
+ * @return TypeInfo
+ */
+ public TypeInfo getSchemaTypeInfo(){
+ return null;
}
}
1.5 +6 -1
xml-xerces/java/src/org/apache/xerces/impl/xs/opti/DefaultElement.java
Index: DefaultElement.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/DefaultElement.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- DefaultElement.java 8 Jan 2003 21:42:04 -0000 1.4
+++ DefaultElement.java 16 Jan 2003 22:53:45 -0000 1.5
@@ -57,6 +57,7 @@
package org.apache.xerces.impl.xs.opti;
+import org.apache.xerces.dom3.TypeInfo;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -129,6 +130,10 @@
public boolean hasAttributeNS(String namespaceURI, String localName) {
return false;
+ }
+
+ public TypeInfo getSchemaTypeInfo(){
+ return null;
}
1.80 +141 -73
xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java
Index: AbstractDOMParser.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/AbstractDOMParser.java,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -r1.79 -r1.80
--- AbstractDOMParser.java 8 Jan 2003 21:42:04 -0000 1.79
+++ AbstractDOMParser.java 16 Jan 2003 22:53:45 -0000 1.80
@@ -57,50 +57,45 @@
package org.apache.xerces.parsers;
+import java.util.Locale;
+import java.util.Stack;
+
import org.apache.xerces.dom.AttrImpl;
-import org.apache.xerces.dom.DeferredDocumentImpl;
import org.apache.xerces.dom.CoreDocumentImpl;
+import org.apache.xerces.dom.DeferredDocumentImpl;
import org.apache.xerces.dom.DocumentImpl;
import org.apache.xerces.dom.DocumentTypeImpl;
import org.apache.xerces.dom.ElementDefinitionImpl;
import org.apache.xerces.dom.ElementImpl;
+import org.apache.xerces.dom.ElementNSImpl;
import org.apache.xerces.dom.EntityImpl;
import org.apache.xerces.dom.EntityReferenceImpl;
import org.apache.xerces.dom.NodeImpl;
import org.apache.xerces.dom.NotationImpl;
-import org.apache.xerces.dom.ProcessingInstructionImpl;
import org.apache.xerces.dom.PSVIAttrNSImpl;
import org.apache.xerces.dom.PSVIElementNSImpl;
+import org.apache.xerces.dom.ProcessingInstructionImpl;
import org.apache.xerces.dom.TextImpl;
import org.apache.xerces.impl.Constants;
-import org.apache.xerces.util.ObjectFactory;
-import org.apache.xerces.util.XMLAttributesImpl;
-
-// id types
-import org.apache.xerces.xni.psvi.AttributePSVI;
import org.apache.xerces.impl.dv.XSSimpleType;
-
+import org.apache.xerces.impl.xs.psvi.XSTypeDefinition;
+import org.apache.xerces.util.ObjectFactory;
import org.apache.xerces.xni.Augmentations;
import org.apache.xerces.xni.NamespaceContext;
import org.apache.xerces.xni.QName;
import org.apache.xerces.xni.XMLAttributes;
-import org.apache.xerces.xni.XMLDocumentHandler;
-import org.apache.xerces.xni.XMLDTDHandler;
import org.apache.xerces.xni.XMLLocator;
import org.apache.xerces.xni.XMLResourceIdentifier;
import org.apache.xerces.xni.XMLString;
import org.apache.xerces.xni.XNIException;
import org.apache.xerces.xni.parser.XMLParserConfiguration;
-import org.apache.xerces.xni.parser.XMLConfigurationException;
import org.apache.xerces.xni.psvi.AttributePSVI;
import org.apache.xerces.xni.psvi.ElementPSVI;
-
import org.w3c.dom.Attr;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentType;
-import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Element;
import org.w3c.dom.EntityReference;
import org.w3c.dom.NamedNodeMap;
@@ -108,13 +103,9 @@
import org.w3c.dom.NodeList;
import org.w3c.dom.ProcessingInstruction;
import org.w3c.dom.Text;
-
import org.w3c.dom.ls.DOMBuilderFilter;
import org.w3c.dom.traversal.NodeFilter;
-import java.util.Locale;
-import java.util.Stack;
-
/**
* This is the base class of all DOM parsers. It implements the XNI
* callback methods to create the DOM tree. After a successful parse of
@@ -584,6 +575,9 @@
* @throws XNIException Thrown by handler to signal an error.
*/
public void textDecl(String version, String encoding, Augmentations augs)
throws XNIException {
+ if (fInDTD){
+ return;
+ }
if (!fDeferNodeExpansion) {
if (fCurrentEntityDecl != null && !fFilterReject) {
fCurrentEntityDecl.setEncoding(encoding);
@@ -926,11 +920,12 @@
Attr attr = createAttrNode(fAttrQName);
String attrValue = attributes.getValue(i);
- if (fStorePSVI) {
- AttributePSVI attrPSVI =
(AttributePSVI)attributes.getAugmentations(i).getItem(Constants.ATTRIBUTE_PSVI);
- if (attrPSVI != null)
- ((PSVIAttrNSImpl)attr).setPSVI(attrPSVI);
+
+ AttributePSVI attrPSVI =(AttributePSVI)
attributes.getAugmentations(i).getItem(Constants.ATTRIBUTE_PSVI);
+ if (fStorePSVI && attrPSVI != null){
+ ((PSVIAttrNSImpl) attr).setPSVI(attrPSVI);
}
+
attr.setValue(attrValue);
el.setAttributeNode(attr);
@@ -938,26 +933,60 @@
// the node value because that turns the "specified"
// flag to "true" which may overwrite a "false"
// value from the attribute list. -Ac
- if (fDocumentImpl != null) {
- AttrImpl attrImpl = (AttrImpl)attr;
- boolean specified = attributes.isSpecified(i);
- attrImpl.setSpecified(specified);
- // REVISIT: when DOM Level 3 becomes Rec this code
- // should not depend odn fDocumentImpl
- // Identifier registration
- if (attributes.getType(i).equals("ID")) {
- ((ElementImpl) el).setIdAttributeNode(attr, true);
- }
- else if (attributes instanceof XMLAttributesImpl) {
- XMLAttributesImpl attrs = (XMLAttributesImpl)attributes;
- if (attrs.getSchemaId(i))
- ((ElementImpl) el).setIdAttributeNode(attr, true);
+ if (fDocumentImpl != null) {
+ AttrImpl attrImpl = (AttrImpl) attr;
+ Object type = null;
+ boolean id = false;
+
+ // REVISIT: currently it is possible that
someone turns off
+ // namespaces and turns on xml schema
validation
+ // To avoid classcast exception in AttrImpl
check for namespaces
+ // however the correct solution should
probably disallow setting
+ // namespaces to false when schema processing
is turned on.
+ if (attrPSVI != null && fNamespaceAware) {
+ // XML Schema
+ type =
attrPSVI.getMemberTypeDefinition();
+ if (type == null) {
+ type =
attrPSVI.getTypeDefinition();
+ if (type != null) {
+ id = ((XSSimpleType)
type).isIDType();
+ attrImpl.setType(type);
+ }
+ }
+ else {
+ id = ((XSSimpleType)
type).isIDType();
+ attrImpl.setType(type);
+ }
+ }
+ else {
+ // DTD
+ type = attributes.getType(i);
+ attrImpl.setType(type);
+ id = (type.equals("ID")) ? true :
false;
+ }
+
+ if (id) {
+ ((ElementImpl)
el).setIdAttributeNode(attr, true);
+ }
+
+
attrImpl.setSpecified(attributes.isSpecified(i));
+ // REVISIT: Handle entities in attribute value.
+ }
+ }
+ setCharacterData(false);
+
+ if (augs != null) {
+ ElementPSVI elementPSVI =
(ElementPSVI)augs.getItem(Constants.ELEMENT_PSVI);
+ if (elementPSVI != null && fNamespaceAware) {
+ XSTypeDefinition type = elementPSVI.getMemberTypeDefinition();
+ if (type == null) {
+ type = elementPSVI.getTypeDefinition();
}
+ ((ElementNSImpl)el).setType(type);
}
- // REVISIT: Handle entities in attribute value.
}
- setCharacterData(false);
+
// filter nodes
if (fDOMFilter != null) {
short code = fDOMFilter.startElement(el);
@@ -983,29 +1012,63 @@
fCurrentNode = el;
}
else {
+ Object type = null;
+ if (augs != null) {
+ ElementPSVI elementPSVI =
(ElementPSVI)augs.getItem(Constants.ELEMENT_PSVI);
+ if (elementPSVI != null) {
+ type = elementPSVI.getMemberTypeDefinition();
+ if (type == null) {
+ type = elementPSVI.getTypeDefinition();
+ }
+ }
+ }
+
int el =
fDeferredDocumentImpl.createDeferredElement(fNamespaceAware ?
element.uri : null,
- element.rawname);
+ element.rawname,
+ type);
int attrCount = attributes.getLength();
for (int i = 0; i < attrCount; i++) {
- String attrValue = attributes.getValue(i);
+ // set type information
+ AttributePSVI attrPSVI =
(AttributePSVI)attributes.getAugmentations(i).getItem(Constants.ATTRIBUTE_PSVI);
+ boolean id = false;
+
+ // REVISIT: currently it is possible that someone turns off
+ // namespaces and turns on xml schema validation
+ // To avoid classcast exception in AttrImpl check for namespaces
+ // however the correct solution should probably disallow setting
+ // namespaces to false when schema processing is turned on.
+ if (attrPSVI != null && fNamespaceAware) {
+ // XML Schema
+ type = attrPSVI.getMemberTypeDefinition();
+ if (type == null) {
+ type = attrPSVI.getTypeDefinition();
+ if (type != null){
+ id = ((XSSimpleType)
type).isIDType();
+ }
+ }
+ else {
+ id = ((XSSimpleType) type).isIDType();
+ }
+ }
+ else {
+ // DTD
+ type = attributes.getType(i);
+ id = (type.equals("ID")) ? true : false;
+ }
- int attr = fDeferredDocumentImpl.setDeferredAttribute(el,
- attributes.getQName(i),
- attributes.getURI(i),
- attrValue,
- attributes.isSpecified(i));
- // Identifier registration
- if (attributes.getType(i).equals("ID")) {
- fDeferredDocumentImpl.setIdAttributeNode(el, attr);
- }
- else if (attributes instanceof XMLAttributesImpl) {
- XMLAttributesImpl attrs = (XMLAttributesImpl)attributes;
- if (attrs.getSchemaId(i))
- fDeferredDocumentImpl.setIdAttributeNode(el, attr);
- }
+ // create attribute
+ fDeferredDocumentImpl.setDeferredAttribute(
+ el,
+ attributes.getQName(i),
+ attributes.getURI(i),
+ attributes.getValue(i),
+ attributes.isSpecified(i),
+ id,
+ type);
}
+
fDeferredDocumentImpl.appendChild(fCurrentNodeIndex, el);
fCurrentNodeIndex = el;
}
@@ -2068,23 +2131,26 @@
// internal subset string
String publicId = identifier.getPublicId();
String literalSystemId = identifier.getLiteralSystemId();
- if (fInternalSubset != null && !fInDTDExternalSubset) {
- fInternalSubset.append("<!NOTATION ");
- fInternalSubset.append(name);
- if (publicId != null) {
- fInternalSubset.append(" PUBLIC '");
- fInternalSubset.append(publicId);
- if (literalSystemId != null) {
- fInternalSubset.append("' '");
- fInternalSubset.append(literalSystemId);
- }
- }
- else {
- fInternalSubset.append(" SYSTEM '");
- fInternalSubset.append(literalSystemId);
- }
- fInternalSubset.append("'>\n");
- }
+ if (fInDTD) {
+ if (fInternalSubset != null && !fInDTDExternalSubset) {
+ fInternalSubset.append("<!NOTATION ");
+ fInternalSubset.append(name);
+ if (publicId != null) {
+ fInternalSubset.append(" PUBLIC '");
+ fInternalSubset.append(publicId);
+ if (literalSystemId != null) {
+ fInternalSubset.append("' '");
+
fInternalSubset.append(literalSystemId);
+ }
+ }
+ else {
+ fInternalSubset.append(" SYSTEM '");
+ fInternalSubset.append(literalSystemId);
+ }
+ fInternalSubset.append("'>\n");
+ }
+ return;
+ }
// NOTE: We only know how to create these nodes for the Xerces
// DOM implementation because DOM Level 2 does not specify
@@ -2232,7 +2298,9 @@
}
fInternalSubset.append(">\n");
}
-
+ // REVISIT: This code applies to the support of domx/grammar-access
+ // feature in Xerces 1
+
// deferred expansion
if (fDeferredDocumentImpl != null) {
@@ -2308,7 +2376,7 @@
}
} // if NOT defer-node-expansion
-
+
} // attributeDecl(String,String,String,String[],String,XMLString, XMLString,
Augmentations)
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]