You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2003/07/03 17:15:58 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xs/opti DefaultText.java TextImpl.java ElementImpl.java SchemaDOM.java SchemaDOMParser.java
neilg 2003/07/03 08:15:58
Modified: java/src/org/apache/xerces/impl/xs/opti ElementImpl.java
SchemaDOM.java SchemaDOMParser.java
Added: java/src/org/apache/xerces/impl/xs/opti DefaultText.java
TextImpl.java
Log:
add representations of annotations as Text-node children to the first child of an annotation element. The complete annotation is stored as a string, with all in-scope namespaces from ancestor elements. This allows for minimal schema-correctness checking in the schema-parsing code, while giving the annotation implementation full access to a representation of what was included in the schema
Revision Changes Path
1.4 +2 -2 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/ElementImpl.java
Index: ElementImpl.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/ElementImpl.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ElementImpl.java 8 May 2003 20:11:56 -0000 1.3
+++ ElementImpl.java 3 Jul 2003 15:15:58 -0000 1.4
@@ -267,4 +267,4 @@
return column;
}
-}
\ No newline at end of file
+}
1.4 +158 -23 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOM.java
Index: SchemaDOM.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOM.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SchemaDOM.java 8 May 2003 20:11:57 -0000 1.3
+++ SchemaDOM.java 3 Jul 2003 15:15:58 -0000 1.4
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001, 2002 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -57,16 +57,19 @@
package org.apache.xerces.impl.xs.opti;
-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.XMLString;
-import org.apache.xerces.xni.XNIException;
+import org.apache.xerces.util.XMLSymbols;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
+import java.util.Vector;
+import java.util.Enumeration;
+
/**
* @author Rahul Srivastava, Sun Microsystems Inc.
* @author Sandy Gao, IBM
@@ -78,35 +81,38 @@
static final int relationsRowResizeFactor = 15;
static final int relationsColResizeFactor = 10;
- ElementImpl[][] relations;
+ NodeImpl[][] relations;
+ // parent must be an element in this scheme
ElementImpl parent;
int currLoc;
int nextFreeLoc;
boolean hidden;
+ // for annotation support:
+ StringBuffer fAnnotationBuffer = null;
public SchemaDOM() {
reset();
}
- public void startElement(QName element, XMLAttributes attributes, Augmentations augs,
- int line, int column) throws XNIException {
+ public void startElement(QName element, XMLAttributes attributes,
+ int line, int column) {
ElementImpl node = new ElementImpl(line, column);
- processElement(element, attributes, augs, node);
+ processElement(element, attributes, node);
// now the current node added, becomes the parent
parent = node;
}
- public void emptyElement(QName element, XMLAttributes attributes, Augmentations augs,
- int line, int column) throws XNIException {
+ public void emptyElement(QName element, XMLAttributes attributes,
+ int line, int column) {
ElementImpl node = new ElementImpl(line, column);
- processElement(element, attributes, augs, node);
+ processElement(element, attributes, node);
}
- private void processElement(QName element, XMLAttributes attributes, Augmentations augs, ElementImpl node) throws XNIException {
+ private void processElement(QName element, XMLAttributes attributes, ElementImpl node) {
// populate node
node.prefix = element.prefix;
@@ -160,30 +166,92 @@
}
- public void endElement(QName element, Augmentations augs) throws XNIException {
+ public void endElement() {
// the parent of current parent node becomes the parent
// for the next node.
currLoc = parent.row;
- parent = relations[currLoc][0];
+ parent = (ElementImpl)relations[currLoc][0];
}
+ // note that this will only be called within appinfo/documentation
+ void comment(XMLString text) {
+ fAnnotationBuffer.append("<!--").append(text.toString()).append("-->");
+ }
+
+ // note that this will only be called within appinfo/documentation
+ void processingInstruction(String target, String data) {
+ fAnnotationBuffer.append("<?").append(target).append(" ").append(data).append("?>");
+ }
- public void characters(XMLString text, Augmentations augs) throws XNIException {
- // REVISIT: Make a text node.
+ // note that this will only be called within appinfo/documentation
+ void characters(XMLString text ) {
+ // need to handle &s and <s
+ for(int i=text.offset; i<text.offset+text.length; i++ ) {
+ if(text.ch[i] == '&') {
+ fAnnotationBuffer.append("&");
+ } else if (text.ch[i] == '<') {
+ fAnnotationBuffer.append("<");
+ } else {
+ fAnnotationBuffer.append(text.ch[i]);
+ }
+ }
+ }
+
+ void endAnnotationElement(QName elemName, boolean complete) {
+ if(complete) {
+ fAnnotationBuffer.append("\n</").append(elemName.rawname).append(">");
+ // note that this is always called after endElement on <annotation>'s
+ // child and before endElement on annotation.
+ // hence, we must make this the child of the current
+ // parent's only child.
+ ElementImpl child = (ElementImpl)relations[currLoc][1];
+
+ // check if array needs to be resized
+ if (nextFreeLoc == relations.length) {
+ resizeRelations();
+ }
+ int newRow = child.parentRow = nextFreeLoc++;
+
+ // now find the place to insert this node
+ boolean foundPlace = false;
+ int i = 1;
+ for (; i<relations[newRow].length; i++) {
+ if (relations[newRow][i] == null) {
+ foundPlace = true;
+ break;
+ }
+ }
+
+ if (!foundPlace) {
+ resizeRelations(newRow);
+ }
+ relations[newRow][i] = new TextImpl(fAnnotationBuffer, this, newRow, i);
+ // apparently, there is no sensible way of resetting
+ // these things
+ fAnnotationBuffer = null;
+ } else //capturing character calls
+ fAnnotationBuffer.append("</").append(elemName.rawname).append(">");
+ }
+
+ void startAnnotationCDATA() {
+ fAnnotationBuffer.append("<![CDATA[");
}
+ void endAnnotationCDATA() {
+ fAnnotationBuffer.append("]]>");
+ }
private void resizeRelations() {
- ElementImpl[][] temp = new ElementImpl[relations.length+relationsRowResizeFactor][];
+ NodeImpl[][] temp = new NodeImpl[relations.length+relationsRowResizeFactor][];
System.arraycopy(relations, 0, temp, 0, relations.length);
for (int i = relations.length ; i < temp.length ; i++) {
- temp[i] = new ElementImpl[relationsColResizeFactor];
+ temp[i] = new NodeImpl[relationsColResizeFactor];
}
relations = temp;
}
private void resizeRelations(int i) {
- ElementImpl[] temp = new ElementImpl[relations[i].length+relationsColResizeFactor];
+ NodeImpl[] temp = new NodeImpl[relations[i].length+relationsColResizeFactor];
System.arraycopy(relations[i], 0, temp, 0, relations[i].length);
relations[i] = temp;
}
@@ -191,13 +259,18 @@
public void reset() {
- relations = new ElementImpl[relationsRowResizeFactor][];
+ // help out the garbage collector
+ if(relations != null)
+ for(int i=0; i<relations.length; i++)
+ for(int j=0; j<relations[i].length; j++)
+ relations[i][j] = null;
+ relations = new NodeImpl[relationsRowResizeFactor][];
parent = new ElementImpl(0, 0);
parent.rawname = "DOCUMENT_NODE";
currLoc = 0;
nextFreeLoc = 1;
for (int i=0; i<relationsRowResizeFactor; i++) {
- relations[i] = new ElementImpl[relationsColResizeFactor];
+ relations[i] = new NodeImpl[relationsColResizeFactor];
}
relations[currLoc][0] = parent;
}
@@ -256,7 +329,69 @@
// org.w3c.dom methods
public Element getDocumentElement() {
- return relations[0][1];
+ // this returns a parent node, known to be an ElementImpl
+ return (ElementImpl)relations[0][1];
}
-}
\ No newline at end of file
+ // commence the serialization of an annotation
+ void startAnnotation(QName elemName, XMLAttributes attributes,
+ NamespaceContext namespaceContext) {
+ if(fAnnotationBuffer == null) fAnnotationBuffer = new StringBuffer(256);
+ fAnnotationBuffer.append("<").append(elemName.rawname).append(" ");
+
+ // attributes are a bit of a pain. To get this right, we have to keep track
+ // of the namespaces we've seen declared, then examine the namespace context
+ // for other namespaces so that we can also include them.
+ // optimized for simplicity and the case that not many
+ // namespaces are declared on this annotation...
+ Vector namespaces = new Vector();
+ for(int i=0; i<attributes.getLength(); i++) {
+ String aValue = attributes.getValue(i);
+ String aPrefix = attributes.getPrefix(i);
+ // if it's xmlns, must be a namespace decl
+ namespaces.addElement(aValue);
+ fAnnotationBuffer.append(attributes.getQName(i)).append("=\"").append(aValue).append("\" ");
+ }
+ // now we have to look through currently in-scope namespaces to see what
+ // wasn't declared here
+ Enumeration currPrefixes = namespaceContext.getAllPrefixes();
+ while(currPrefixes.hasMoreElements()) {
+ String prefix = (String)currPrefixes.nextElement();
+ String uri = namespaceContext.getURI(prefix);
+ if(!namespaces.contains(uri)) {
+ // have to declare this one
+ if(prefix == XMLSymbols.EMPTY_STRING)
+ fAnnotationBuffer.append("xmlns").append("=\"").append(uri).append("\" ");
+ else
+ fAnnotationBuffer.append("xmlns:").append(prefix).append("=\"").append(uri).append("\" ");
+ }
+ }
+ fAnnotationBuffer.append(">\n");
+ }
+ void startAnnotationElement(QName elemName, XMLAttributes attributes) {
+ fAnnotationBuffer.append("<").append(elemName.rawname).append(" ");
+ for(int i=0; i<attributes.getLength(); i++) {
+ String aValue = attributes.getValue(i);
+ fAnnotationBuffer.append(" ").append(attributes.getQName(i)).append("=\"").append(processAttValue(aValue)).append("\" ");
+ }
+ fAnnotationBuffer.append(">");
+ }
+
+ private static String processAttValue(String original) {
+ // normally, nothing will happen
+ StringBuffer newVal = new StringBuffer(original.length());
+ for(int i=0; i<original.length(); i++) {
+ char currChar = original.charAt(i);
+ if(currChar == '"') {
+ newVal.append(""");
+ } else if (currChar == '>') {
+ newVal.append(">");
+ } else if (currChar == '&') {
+ newVal.append("&");
+ } else {
+ newVal.append(currChar);
+ }
+ }
+ return newVal.toString();
+ }
+}
1.4 +150 -27 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOMParser.java
Index: SchemaDOMParser.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/opti/SchemaDOMParser.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SchemaDOMParser.java 8 May 2003 20:11:57 -0000 1.3
+++ SchemaDOMParser.java 3 Jul 2003 15:15:58 -0000 1.4
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001, 2002 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -92,6 +92,10 @@
// the locator containing line/column information
protected XMLLocator fLocator;
+ // namespace context, needed for producing
+ // representations of annotations
+ protected NamespaceContext fNamespaceContext = null;
+
SchemaDOM schemaDOM;
XMLParserConfiguration config;
@@ -106,10 +110,12 @@
this.config = config;
}
-
+ // where an annotation element itself begins
+ // -1 means not in an annotation's scope
+ private int fAnnotationDepth = -1;
// Where xs:appinfo or xs:documentation starts;
// -1 means not in the scope of either of the two elements.
- private int fAnnotationDepth = -1;
+ private int fInnerAnnotationDepth = -1;
// The current element depth
private int fDepth = -1;
// Use to report the error when characters are not allowed.
@@ -124,7 +130,8 @@
NamespaceContext namespaceContext, Augmentations augs)
throws XNIException {
fLocator = locator;
- } // startDocument(XMLLocator,String,Augmentations)
+ fNamespaceContext = namespaceContext;
+ } // startDocument(XMLLocator,String,NamespaceContext, Augmentations)
/**
* The end of the document.
@@ -133,12 +140,52 @@
* @throws XNIException Thrown by handler to signal an error.
*/
public void endDocument(Augmentations augs) throws XNIException {
- // To debug the DOM created uncomment the line below
- // schemaDOM.printDOM();
+ // To debug the DOM created uncomment the line below
+ // schemaDOM.printDOM();
} // endDocument()
/**
+ * A comment.
+ *
+ * @param text The text in the comment.
+ * @param augs Additional information that may include infoset augmentations
+ *
+ * @exception XNIException
+ * Thrown by application to signal an error.
+ */
+ public void comment(XMLString text, Augmentations augs) throws XNIException {
+ if(fAnnotationDepth > -1) {
+ schemaDOM.comment(text);
+ }
+ }
+
+ /**
+ * A processing instruction. Processing instructions consist of a
+ * target name and, optionally, text data. The data is only meaningful
+ * to the application.
+ * <p>
+ * Typically, a processing instruction's data will contain a series
+ * of pseudo-attributes. These pseudo-attributes follow the form of
+ * element attributes but are <strong>not</strong> parsed or presented
+ * to the application as anything other than text. The application is
+ * responsible for parsing the data.
+ *
+ * @param target The target.
+ * @param data The data or null if none specified.
+ * @param augs Additional information that may include infoset augmentations
+ *
+ * @exception XNIException
+ * Thrown by handler to signal an error.
+ */
+ public void processingInstruction(String target, XMLString data, Augmentations augs)
+ throws XNIException {
+ if(fAnnotationDepth > -1) {
+ schemaDOM.processingInstruction(target, data.toString());
+ }
+ }
+
+ /**
* Character content.
*
* @param text The content.
@@ -149,7 +196,7 @@
*/
public void characters(XMLString text, Augmentations augs) throws XNIException {
// when it's not within xs:appinfo or xs:documentation
- if (fAnnotationDepth == -1) {
+ if (fInnerAnnotationDepth == -1 ) {
for (int i=text.offset; i<text.offset+text.length; i++) {
// and there is a non-whitespace character
if (!XMLChar.isSpace(text.ch[i])) {
@@ -182,7 +229,7 @@
// when it's within either of the 2 elements, characters are allowed
// and we need to store them.
else {
- schemaDOM.characters(text, augs);
+ schemaDOM.characters(text);
}
}
@@ -201,21 +248,29 @@
public void startElement(QName element, XMLAttributes attributes, Augmentations augs)
throws XNIException {
- schemaDOM.startElement(element, attributes, augs,
- fLocator.getLineNumber(),
- fLocator.getColumnNumber());
-
fDepth++;
- // if it's not within either element, check whether it's one of them
- // if so, record the current depth, so that any element with larger
- // depth is allowed to have character data.
+ // while it is true that non-whitespace character data
+ // may only occur in appInfo or documentation
+ // elements, it's certainly legal for comments and PI's to
+ // occur as children of annotation; we need
+ // to account for these here.
if (fAnnotationDepth == -1) {
if (element.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA &&
- (element.localpart == SchemaSymbols.ELT_APPINFO ||
- element.localpart == SchemaSymbols.ELT_DOCUMENTATION)) {
+ element.localpart == SchemaSymbols.ELT_ANNOTATION) {
fAnnotationDepth = fDepth;
- }
+ schemaDOM.startAnnotation(element, attributes, fNamespaceContext);
+ }
+ } else if(fDepth == fAnnotationDepth+1) {
+ fInnerAnnotationDepth = fDepth;
+ schemaDOM.startAnnotationElement(element, attributes);
+ } else {
+ schemaDOM.startAnnotationElement(element, attributes);
+ // avoid falling through; don't call startElement in this case
+ return;
}
+ schemaDOM.startElement(element, attributes,
+ fLocator.getLineNumber(),
+ fLocator.getColumnNumber());
}
@@ -233,7 +288,18 @@
public void emptyElement(QName element, XMLAttributes attributes, Augmentations augs)
throws XNIException {
- schemaDOM.emptyElement(element, attributes, augs,
+ if (fAnnotationDepth == -1) {
+ // this is messed up, but a case to consider:
+ if (element.uri == SchemaSymbols.URI_SCHEMAFORSCHEMA &&
+ element.localpart == SchemaSymbols.ELT_ANNOTATION) {
+ schemaDOM.startAnnotation(element, attributes, fNamespaceContext);
+ schemaDOM.endAnnotationElement(element, true);
+ }
+ } else {
+ schemaDOM.startAnnotationElement(element, attributes);
+ schemaDOM.endAnnotationElement(element, false);
+ }
+ schemaDOM.emptyElement(element, attributes,
fLocator.getLineNumber(),
fLocator.getColumnNumber());
@@ -251,15 +317,72 @@
*/
public void endElement(QName element, Augmentations augs) throws XNIException {
- schemaDOM.endElement(element, augs);
- // when we reach the endElement of xs:appinfo or xs:documentation,
- // change fAnnotationDepth to -1
- if (fAnnotationDepth == fDepth)
- fAnnotationDepth = -1;
- fDepth--;
+ // when we reach the endElement of xs:appinfo or xs:documentation,
+ // change fInnerAnnotationDepth to -1
+ if(fAnnotationDepth > -1) {
+ if (fInnerAnnotationDepth == fDepth) {
+ fInnerAnnotationDepth = -1;
+ schemaDOM.endAnnotationElement(element, false);
+ schemaDOM.endElement();
+ } else if (fAnnotationDepth == fDepth) {
+ fAnnotationDepth = -1;
+ schemaDOM.endAnnotationElement(element, true);
+ schemaDOM.endElement();
+ } else { // inside a child of annotation
+ schemaDOM.endAnnotationElement(element, false);
+ }
+ } else { // not in an annotation at all
+ schemaDOM.endElement();
+ }
+ fDepth--;
}
+ /**
+ * Ignorable whitespace. For this method to be called, the document
+ * source must have some way of determining that the text containing
+ * only whitespace characters should be considered ignorable. For
+ * example, the validator can determine if a length of whitespace
+ * characters in the document are ignorable based on the element
+ * content model.
+ *
+ * @param text The ignorable whitespace.
+ * @param augs Additional information that may include infoset augmentations
+ *
+ * @exception XNIException
+ * Thrown by handler to signal an error.
+ */
+ public void ignorableWhitespace(XMLString text, Augmentations augs) throws XNIException {
+ // unlikely to be called, but you never know...
+ if (fAnnotationDepth != -1 ) {
+ schemaDOM.characters(text);
+ }
+ }
+
+ /**
+ * The start of a CDATA section.
+ *
+ * @param augs Additional information that may include infoset augmentations
+ *
+ * @exception XNIException
+ * Thrown by handler to signal an error.
+ */
+ public void startCDATA(Augmentations augs) throws XNIException {
+ schemaDOM.startAnnotationCDATA();
+ }
+
+ /**
+ * The end of a CDATA section.
+ *
+ * @param augs Additional information that may include infoset augmentations
+ *
+ * @exception XNIException
+ * Thrown by handler to signal an error.
+ */
+ public void endCDATA(Augmentations augs) throws XNIException {
+ schemaDOM.endAnnotationCDATA();
+ }
+
//
// other methods
@@ -272,4 +395,4 @@
return schemaDOM;
}
-}
\ No newline at end of file
+}
1.1 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/DefaultText.java
Index: DefaultText.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.xerces.impl.xs.opti;
import org.w3c.dom.Text;
import org.w3c.dom.DOMException;
/*
* @author Neil Graham, IBM
* @version $Id: DefaultText.java,v 1.1 2003/07/03 15:15:58 neilg Exp $
*/
/**
* The <code>Text</code> interface inherits from <code>CharacterData</code>
* and represents the textual content (termed character data in XML) of an
* <code>Element</code> or <code>Attr</code>. If there is no markup inside
* an element's content, the text is contained in a single object
* implementing the <code>Text</code> interface that is the only child of
* the element. If there is markup, it is parsed into the information items
* (elements, comments, etc.) and <code>Text</code> nodes that form the list
* of children of the element.
* <p>When a document is first made available via the DOM, there is only one
* <code>Text</code> node for each block of text. Users may create adjacent
* <code>Text</code> nodes that represent the contents of a given element
* without any intervening markup, but should be aware that there is no way
* to represent the separations between these nodes in XML or HTML, so they
* will not (in general) persist between DOM editing sessions. The
* <code>normalize()</code> method on <code>Node</code> merges any such
* adjacent <code>Text</code> objects into a single node for each block of
* text.
* <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113'>Document Object Model (DOM) Level 2 Core Specification</a>.
*
* This is an empty implementation.
*/
public class DefaultText extends NodeImpl implements Text {
// CharacterData methods
/**
* The character data of the node that implements this interface. The DOM
* implementation may not put arbitrary limits on the amount of data
* that may be stored in a <code>CharacterData</code> node. However,
* implementation limits may mean that the entirety of a node's data may
* not fit into a single <code>DOMString</code>. In such cases, the user
* may call <code>substringData</code> to retrieve the data in
* appropriately sized pieces.
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
* @exception DOMException
* DOMSTRING_SIZE_ERR: Raised when it would return more characters than
* fit in a <code>DOMString</code> variable on the implementation
* platform.
*/
public String getData()
throws DOMException {
return null;
}
/**
* The character data of the node that implements this interface. The DOM
* implementation may not put arbitrary limits on the amount of data
* that may be stored in a <code>CharacterData</code> node. However,
* implementation limits may mean that the entirety of a node's data may
* not fit into a single <code>DOMString</code>. In such cases, the user
* may call <code>substringData</code> to retrieve the data in
* appropriately sized pieces.
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
* @exception DOMException
* DOMSTRING_SIZE_ERR: Raised when it would return more characters than
* fit in a <code>DOMString</code> variable on the implementation
* platform.
*/
public void setData(String data)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
/**
* The number of 16-bit units that are available through <code>data</code>
* and the <code>substringData</code> method below. This may have the
* value zero, i.e., <code>CharacterData</code> nodes may be empty.
*/
public int getLength() {
return 0;
}
/**
* Extracts a range of data from the node.
* @param offset Start offset of substring to extract.
* @param count The number of 16-bit units to extract.
* @return The specified substring. If the sum of <code>offset</code> and
* <code>count</code> exceeds the <code>length</code>, then all 16-bit
* units to the end of the data are returned.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
* negative or greater than the number of 16-bit units in
* <code>data</code>, or if the specified <code>count</code> is
* negative.
* <br>DOMSTRING_SIZE_ERR: Raised if the specified range of text does
* not fit into a <code>DOMString</code>.
*/
public String substringData(int offset,
int count)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
/**
* Append the string to the end of the character data of the node. Upon
* success, <code>data</code> provides access to the concatenation of
* <code>data</code> and the <code>DOMString</code> specified.
* @param arg The <code>DOMString</code> to append.
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*/
public void appendData(String arg)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
/**
* Insert a string at the specified 16-bit unit offset.
* @param offset The character offset at which to insert.
* @param arg The <code>DOMString</code> to insert.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
* negative or greater than the number of 16-bit units in
* <code>data</code>.
* <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*/
public void insertData(int offset,
String arg)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
/**
* Remove a range of 16-bit units from the node. Upon success,
* <code>data</code> and <code>length</code> reflect the change.
* @param offset The offset from which to start removing.
* @param count The number of 16-bit units to delete. If the sum of
* <code>offset</code> and <code>count</code> exceeds
* <code>length</code> then all 16-bit units from <code>offset</code>
* to the end of the data are deleted.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
* negative or greater than the number of 16-bit units in
* <code>data</code>, or if the specified <code>count</code> is
* negative.
* <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*/
public void deleteData(int offset,
int count)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
/**
* Replace the characters starting at the specified 16-bit unit offset
* with the specified string.
* @param offset The offset from which to start replacing.
* @param count The number of 16-bit units to replace. If the sum of
* <code>offset</code> and <code>count</code> exceeds
* <code>length</code>, then all 16-bit units to the end of the data
* are replaced; (i.e., the effect is the same as a <code>remove</code>
* method call with the same range, followed by an <code>append</code>
* method invocation).
* @param arg The <code>DOMString</code> with which the range must be
* replaced.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
* negative or greater than the number of 16-bit units in
* <code>data</code>, or if the specified <code>count</code> is
* negative.
* <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*/
public void replaceData(int offset,
int count,
String arg)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
// Text node methods
/**
* Breaks this node into two nodes at the specified <code>offset</code>,
* keeping both in the tree as siblings. After being split, this node
* will contain all the content up to the <code>offset</code> point. A
* new node of the same type, which contains all the content at and
* after the <code>offset</code> point, is returned. If the original
* node had a parent node, the new node is inserted as the next sibling
* of the original node. When the <code>offset</code> is equal to the
* length of this node, the new node has no data.
* @param offset The 16-bit unit offset at which to split, starting from
* <code>0</code>.
* @return The new node, of the same type as this node.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified offset is negative or greater
* than the number of 16-bit units in <code>data</code>.
* <br>NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
*/
public Text splitText(int offset)
throws DOMException {
throw new DOMException(DOMException.NOT_SUPPORTED_ERR, "Method not supported");
}
}
1.1 xml-xerces/java/src/org/apache/xerces/impl/xs/opti/TextImpl.java
Index: TextImpl.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Xerces" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation and was
* originally based on software copyright (c) 2001, International
* Business Machines, Inc., http://www.apache.org. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.xerces.impl.xs.opti;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
/*
* @author Neil Graham, IBM
* @version $Id: TextImpl.java,v 1.1 2003/07/03 15:15:58 neilg Exp $
*/
public class TextImpl extends DefaultText {
// Data
String fData = null;
SchemaDOM fSchemaDOM = null;
int fRow;
int fCol;
public TextImpl(StringBuffer str, SchemaDOM sDOM, int row, int col) {
fData = str.toString();
fSchemaDOM = sDOM;
fRow = row;
fCol = col;
rawname = prefix = localpart = uri = null;
nodeType = Node.TEXT_NODE;
}
//
// org.w3c.dom.Node methods
//
public Node getParentNode() {
return fSchemaDOM.relations[fRow][0];
}
public Node getPreviousSibling() {
if (fCol == 1) {
return null;
}
return fSchemaDOM.relations[fRow][fCol-1];
}
public Node getNextSibling() {
if (fCol == fSchemaDOM.relations[fRow].length-1) {
return null;
}
return fSchemaDOM.relations[fRow][fCol+1];
}
// CharacterData methods
/**
* The character data of the node that implements this interface. The DOM
* implementation may not put arbitrary limits on the amount of data
* that may be stored in a <code>CharacterData</code> node. However,
* implementation limits may mean that the entirety of a node's data may
* not fit into a single <code>DOMString</code>. In such cases, the user
* may call <code>substringData</code> to retrieve the data in
* appropriately sized pieces.
* @exception DOMException
* NO_MODIFICATION_ALLOWED_ERR: Raised when the node is readonly.
* @exception DOMException
* DOMSTRING_SIZE_ERR: Raised when it would return more characters than
* fit in a <code>DOMString</code> variable on the implementation
* platform.
*/
public String getData()
throws DOMException {
return fData;
}
/**
* The number of 16-bit units that are available through <code>data</code>
* and the <code>substringData</code> method below. This may have the
* value zero, i.e., <code>CharacterData</code> nodes may be empty.
*/
public int getLength() {
if(fData == null) return 0;
return fData.length();;
}
/**
* Extracts a range of data from the node.
* @param offset Start offset of substring to extract.
* @param count The number of 16-bit units to extract.
* @return The specified substring. If the sum of <code>offset</code> and
* <code>count</code> exceeds the <code>length</code>, then all 16-bit
* units to the end of the data are returned.
* @exception DOMException
* INDEX_SIZE_ERR: Raised if the specified <code>offset</code> is
* negative or greater than the number of 16-bit units in
* <code>data</code>, or if the specified <code>count</code> is
* negative.
* <br>DOMSTRING_SIZE_ERR: Raised if the specified range of text does
* not fit into a <code>DOMString</code>.
*/
public String substringData(int offset,
int count)
throws DOMException {
if(fData == null) return null;
if(count < 0 || offset < 0 || offset > fData.length())
throw new DOMException(DOMException.INDEX_SIZE_ERR, "parameter error");
if(offset+count >= fData.length())
return fData.substring(offset);
return fData.substring(offset, offset+count);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org