elena 2002/11/01 17:02:24 Modified: java/src/org/apache/xerces/dom AttrNSImpl.java CoreDOMImplementationImpl.java CoreDocumentImpl.java DOMImplementationImpl.java ElementImpl.java ElementNSImpl.java Log: DOM Implementation now checks if qualifiedName is malformed/invalid per Namespace in XML specification. (createElementNS/createAttributeNS/createDoctype) Revision Changes Path 1.32 +38 -47 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.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- AttrNSImpl.java 16 Aug 2002 19:28:37 -0000 1.31 +++ AttrNSImpl.java 2 Nov 2002 01:02:23 -0000 1.32 @@ -58,6 +58,7 @@ package org.apache.xerces.dom; import org.w3c.dom.DOMException; +import org.apache.xerces.xni.NamespaceContext; /** * AttrNSImpl inherits from AttrImpl and adds namespace support. @@ -108,53 +109,43 @@ setName(namespaceURI, qualifiedName); } - private void setName(String namespaceURI, String qualifiedName) - throws DOMException - { - int index = qualifiedName.indexOf(':'); - String prefix; - // DOM Level 3: namespace URI is never empty string. - this.namespaceURI = (namespaceURI !=null && - namespaceURI.length() == 0) ? null : namespaceURI; - + private void setName(String namespaceURI, String qname){ - if (index < 0) { - prefix = null; - localName = qualifiedName; - if (ownerDocument().errorChecking) { - if ( qualifiedName.equals("xmlns") && - (namespaceURI == null || !namespaceURI.equals(xmlnsURI)) || - (namespaceURI !=null && namespaceURI.equals(xmlnsURI) && !qualifiedName.equals("xmlns"))) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - } - } - else { - prefix = qualifiedName.substring(0, index); - localName = qualifiedName.substring(index+1); - - if (ownerDocument().errorChecking) { - if (this.namespaceURI == null - || (localName.length() == 0) - || (localName.indexOf(':') >= 0)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } else if (prefix.equals("xml")) { - if (!namespaceURI.equals(xmlURI)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - } else if (prefix.equals("xmlns") && !namespaceURI.equals(xmlnsURI) || - (!prefix.equals("xmlns") && namespaceURI != null && - namespaceURI.equals(xmlnsURI))) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } else if (index == 0) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - } + String prefix; + // DOM Level 3: namespace URI is never empty string. + this.namespaceURI = namespaceURI; + if (namespaceURI !=null) { + this.namespaceURI = (namespaceURI.length() == 0)? null + : namespaceURI.intern(); + + } + int colon1 = qname.indexOf(':'); + int colon2 = qname.lastIndexOf(':'); + ownerDocument().checkNamespaceWF(qname, colon1, colon2); + if (colon1 < 0) { + // there is no prefix + localName = qname; + ownerDocument().checkQName(null, localName); + if (ownerDocument().errorChecking) { + if (qname.equals("xmlns") + && (namespaceURI == null + || namespaceURI != NamespaceContext.XMLNS_URI) + || (namespaceURI == NamespaceContext.XMLNS_URI + && !qname.equals("xmlns"))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + } + } + else { + prefix = qname.substring(0, colon1); + localName = qname.substring(colon2+1); + ownerDocument().checkQName(prefix, localName); + ownerDocument().checkDOMNSErr(prefix, namespaceURI); } } 1.18 +275 -234 xml-xerces/java/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java Index: CoreDOMImplementationImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/CoreDOMImplementationImpl.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- CoreDOMImplementationImpl.java 10 Sep 2002 14:04:52 -0000 1.17 +++ CoreDOMImplementationImpl.java 2 Nov 2002 01:02:23 -0000 1.18 @@ -54,30 +54,23 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ - package org.apache.xerces.dom; - import org.w3c.dom.DOMException; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; - - // DOM L3 LS import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.DOMBuilder; import org.w3c.dom.ls.DOMWriter; import org.w3c.dom.ls.DOMInputSource; - - import org.apache.xerces.parsers.DOMBuilderImpl; +import org.apache.xerces.util.XMLChar; import org.apache.xml.serialize.DOMWriterImpl; - // DOM Revalidation import org.apache.xerces.impl.RevalidationHandler; import org.apache.xerces.util.ObjectFactory; - /** * The DOMImplementation class is description of a particular * implementation of the Document Object Model. As such its data is @@ -93,241 +86,289 @@ * @version $Id$ * @since PR-DOM-Level-1-19980818. */ -public class CoreDOMImplementationImpl -implements DOMImplementation, DOMImplementationLS { - - // - // Data - // - - - RevalidationHandler fDOMRevalidator = null; - - boolean free = true; - - // static - - /** Dom implementation singleton. */ - static CoreDOMImplementationImpl singleton = new CoreDOMImplementationImpl(); +public class CoreDOMImplementationImpl + implements DOMImplementation, DOMImplementationLS { + // + // Data + // + RevalidationHandler fDOMRevalidator = null; + boolean free = true; + // static + /** Dom implementation singleton. */ + static CoreDOMImplementationImpl singleton = + new CoreDOMImplementationImpl(); + // + // Public methods + // + /** NON-DOM: Obtain and return the single shared object */ + public static DOMImplementation getDOMImplementation() { + return singleton; + } + // + // DOMImplementation methods + // + /** + * Test if the DOM implementation supports a specific "feature" -- + * currently meaning language and level thereof. + * + * @param feature The package name of the feature to test. + * In Level 1, supported values are "HTML" and "XML" (case-insensitive). + * At this writing, org.apache.xerces.dom supports only XML. + * + * @param version The version number of the feature being tested. + * This is interpreted as "Version of the DOM API supported for the + * specified Feature", and in Level 1 should be "1.0" + * + * @returns true iff this implementation is compatable with the + * specified feature and version. + */ + public boolean hasFeature(String feature, String version) { + // Currently, we support only XML Level 1 version 1.0 + boolean anyVersion = version == null || version.length() == 0; + return ( + feature.equalsIgnoreCase("Core") + && (anyVersion || version.equals("1.0") || version.equals("2.0"))) + || (feature.equalsIgnoreCase("XML") + && (anyVersion || version.equals("1.0") || version.equals("2.0"))) + || (feature.equalsIgnoreCase("LS-Load") + && (anyVersion || version.equals("3.0"))); + } // hasFeature(String,String):boolean - - // - // Public methods - // - - /** NON-DOM: Obtain and return the single shared object */ - public static DOMImplementation getDOMImplementation() { - return singleton; - } - - - // - // DOMImplementation methods - // - - /** - * Test if the DOM implementation supports a specific "feature" -- - * currently meaning language and level thereof. - * - * @param feature The package name of the feature to test. - * In Level 1, supported values are "HTML" and "XML" (case-insensitive). - * At this writing, org.apache.xerces.dom supports only XML. - * - * @param version The version number of the feature being tested. - * This is interpreted as "Version of the DOM API supported for the - * specified Feature", and in Level 1 should be "1.0" - * - * @returns true iff this implementation is compatable with the - * specified feature and version. - */ - public boolean hasFeature(String feature, String version) { - - // Currently, we support only XML Level 1 version 1.0 - boolean anyVersion = version == null || version.length() == 0; - return - (feature.equalsIgnoreCase("Core") - && (anyVersion - || version.equals("1.0") - || version.equals("2.0"))) - || (feature.equalsIgnoreCase("XML") - && (anyVersion - || version.equals("1.0") - || version.equals("2.0"))) - || (feature.equalsIgnoreCase("LS-Load") - && (anyVersion - || version.equals("3.0"))); - - } // hasFeature(String,String):boolean - - - /** - * Introduced in DOM Level 2. <p> - * - * Creates an empty DocumentType node. - * - * @param qualifiedName The qualified name of the document type to be created. - * @param publicID The document type public identifier. - * @param systemID The document type system identifier. - * @since WD-DOM-Level-2-19990923 - */ - public DocumentType createDocumentType(String qualifiedName, - String publicID, - String systemID) - { - if (!CoreDocumentImpl.isXMLName(qualifiedName)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INVALID_CHARACTER_ERR", null); - throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); - } - int index = qualifiedName.indexOf(':'); - int lastIndex = qualifiedName.lastIndexOf(':'); + + /** + * Introduced in DOM Level 2. <p> + * + * Creates an empty DocumentType node. + * + * @param qualifiedName The qualified name of the document type to be created. + * @param publicID The document type public identifier. + * @param systemID The document type system identifier. + * @since WD-DOM-Level-2-19990923 + */ + public DocumentType createDocumentType( String qualifiedName, + String publicID, String systemID) { + // REVISIT: this might allow creation of invalid name for DOCTYPE + // xmlns prefix. + // also there is no way for a user to turn off error checking. + checkQName(qualifiedName); + return new DocumentTypeImpl(null, qualifiedName, publicID, systemID); + } + + final void checkQName(String qname){ + int index = qname.indexOf(':'); + int lastIndex = qname.lastIndexOf(':'); + int length = qname.length(); + // it is an error for NCName to have more than one ':' - if (index == 0 || index == qualifiedName.length() - 1 || lastIndex!=index) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); + // check if it is valid QName [Namespace in XML production 6] + if (index == 0 || index == length - 1 || lastIndex != index) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); throw new DOMException(DOMException.NAMESPACE_ERR, msg); } - return new DocumentTypeImpl(null, qualifiedName, publicID, systemID); - } - /** - * Introduced in DOM Level 2. <p> - * - * Creates an XML Document object of the specified type with its document - * element. - * - * @param namespaceURI The namespace URI of the document - * element to create, or null. - * @param qualifiedName The qualified name of the document - * element to create. - * @param doctype The type of document to be created or null.<p> - * - * When doctype is not null, its - * Node.ownerDocument attribute is set to - * the document being created. - * @return Document A new Document object. - * @throws DOMException WRONG_DOCUMENT_ERR: Raised if doctype has - * already been used with a different document. - * @since WD-DOM-Level-2-19990923 - */ - public Document createDocument(String namespaceURI, - String qualifiedName, - DocumentType doctype) - throws DOMException - { - if (doctype != null && doctype.getOwnerDocument() != null) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null); - throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, msg); - } - CoreDocumentImpl doc = new CoreDocumentImpl(doctype); - Element e = doc.createElementNS( namespaceURI, qualifiedName); - doc.appendChild(e); - return doc; - } - - - - /** - * DOM Level 3 WD - Experimental. - * This method makes available a <code>DOMImplementation</code>'s - * specialized interface (see ). - * @param feature The name of the feature requested (case-insensitive). - * @return Returns an alternate <code>DOMImplementation</code> which - * implements the specialized APIs of the specified feature, if any, - * or <code>null</code> if there is no alternate - * <code>DOMImplementation</code> object which implements interfaces - * associated with that feature. Any alternate - * <code>DOMImplementation</code> returned by this method must - * delegate to the primary core <code>DOMImplementation</code> and not - * return results inconsistent with the primary - * <code>DOMImplementation</code> - */ - public DOMImplementation getInterface(String feature){ - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_SUPPORTED_ERR", null); - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); - } - - // DOM L3 LS - /** - * DOM Level 3 WD - Experimental. - */ - public DOMBuilder createDOMBuilder(short mode, - String schemaType) - throws DOMException{ - if (mode == DOMImplementationLS.MODE_ASYNCHRONOUS) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NOT_SUPPORTED_ERR", null); - throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); - } - if (schemaType !=null && schemaType.equals("http://www.w3.org/TR/REC-xml")) { - return new DOMBuilderImpl("org.apache.xerces.parsers.DTDConfiguration", schemaType); - } else { - // create default parser configuration validating against XMLSchemas - return new DOMBuilderImpl("org.apache.xerces.parsers.StandardParserConfiguration", schemaType); - } - } - /** - * DOM Level 3 WD - Experimental. - */ - public DOMWriter createDOMWriter() { - return new DOMWriterImpl(true); - } - /** - * DOM Level 3 WD - Experimental. - */ - public DOMInputSource createDOMInputSource() { - return new DOMInputSourceImpl(); - } - - - - // - // Protected methods - // - /** NON-DOM */ - synchronized RevalidationHandler getValidator (String schemaType){ - // REVISIT: implement a pool of validators to avoid long - // waiting for several threads - // implement retrieving grammar based on schemaType - if (fDOMRevalidator == null) { - try { - // use context class loader. If it returns - // null, class.forName gets used. - fDOMRevalidator = (RevalidationHandler) - (ObjectFactory.newInstance("org.apache.xerces.impl.xs.XMLSchemaValidator", ObjectFactory.findClassLoader(), true)); - } catch (Exception e){ + int start = 0; + // Namespace in XML production [6] + if (index > 0) { + // check that prefix is NCName + if (!XMLChar.isNCNameStart(qname.charAt(start))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); } - } - while (!isFree()) { - try { - wait(); - } - catch (InterruptedException e){ - - try { - return (RevalidationHandler) - (ObjectFactory.newInstance("org.apache.xerces.impl.xs.XMLSchemaValidator", ObjectFactory.findClassLoader(), true)); - - } catch (Exception exception){ - return null; + for (int i = 1; i < index; i++) { + if (!XMLChar.isNCName(qname.charAt(i))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException( + DOMException.INVALID_CHARACTER_ERR, + msg); } - } + start = index + 1; } - free = false; - return fDOMRevalidator; - } - - /** NON-DOM */ - synchronized void releaseValidator(String schemaType){ - // REVISIT: implement releasing grammar base on the schema type - notifyAll(); - free = true; + // check local part + if (!XMLChar.isNCNameStart(qname.charAt(start))) { + // REVISIT: add qname parameter to the message + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); + } + for (int i = start + 1; i < length; i++) { + if (!XMLChar.isNCName(qname.charAt(i))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); + } + } } - - /** NON-DOM */ - final synchronized boolean isFree(){ - return free; - } - - + /** + * Introduced in DOM Level 2. <p> + * + * Creates an XML Document object of the specified type with its document + * element. + * + * @param namespaceURI The namespace URI of the document + * element to create, or null. + * @param qualifiedName The qualified name of the document + * element to create. + * @param doctype The type of document to be created or null.<p> + * + * When doctype is not null, its + * Node.ownerDocument attribute is set to + * the document being created. + * @return Document A new Document object. + * @throws DOMException WRONG_DOCUMENT_ERR: Raised if doctype has + * already been used with a different document. + * @since WD-DOM-Level-2-19990923 + */ + public Document createDocument( + String namespaceURI, + String qualifiedName, + DocumentType doctype) + throws DOMException { + if (doctype != null && doctype.getOwnerDocument() != null) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "WRONG_DOCUMENT_ERR", + null); + throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, msg); + } + CoreDocumentImpl doc = new CoreDocumentImpl(doctype); + Element e = doc.createElementNS(namespaceURI, qualifiedName); + doc.appendChild(e); + return doc; + } + /** + * DOM Level 3 WD - Experimental. + * This method makes available a <code>DOMImplementation</code>'s + * specialized interface (see ). + * @param feature The name of the feature requested (case-insensitive). + * @return Returns an alternate <code>DOMImplementation</code> which + * implements the specialized APIs of the specified feature, if any, + * or <code>null</code> if there is no alternate + * <code>DOMImplementation</code> object which implements interfaces + * associated with that feature. Any alternate + * <code>DOMImplementation</code> returned by this method must + * delegate to the primary core <code>DOMImplementation</code> and not + * return results inconsistent with the primary + * <code>DOMImplementation</code> + */ + public DOMImplementation getInterface(String feature) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NOT_SUPPORTED_ERR", + null); + throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); + } + // DOM L3 LS + /** + * DOM Level 3 WD - Experimental. + */ + public DOMBuilder createDOMBuilder(short mode, String schemaType) + throws DOMException { + if (mode == DOMImplementationLS.MODE_ASYNCHRONOUS) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NOT_SUPPORTED_ERR", + null); + throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg); + } + if (schemaType != null + && schemaType.equals("http://www.w3.org/TR/REC-xml")) { + return new DOMBuilderImpl( + "org.apache.xerces.parsers.DTDConfiguration", + schemaType); + } + else { + // create default parser configuration validating against XMLSchemas + return new DOMBuilderImpl( + "org.apache.xerces.parsers.StandardParserConfiguration", + schemaType); + } + } + /** + * DOM Level 3 WD - Experimental. + */ + public DOMWriter createDOMWriter() { + return new DOMWriterImpl(true); + } + /** + * DOM Level 3 WD - Experimental. + */ + public DOMInputSource createDOMInputSource() { + return new DOMInputSourceImpl(); + } + // + // Protected methods + // + /** NON-DOM */ + synchronized RevalidationHandler getValidator(String schemaType) { + // REVISIT: implement a pool of validators to avoid long + // waiting for several threads + // implement retrieving grammar based on schemaType + if (fDOMRevalidator == null) { + try { + // use context class loader. If it returns + // null, class.forName gets used. + fDOMRevalidator = + (RevalidationHandler) (ObjectFactory + .newInstance( + "org.apache.xerces.impl.xs.XMLSchemaValidator", + ObjectFactory.findClassLoader(), + true)); + } + catch (Exception e) {} + } + while (!isFree()) { + try { + wait(); + } + catch (InterruptedException e) { + try { + return (RevalidationHandler) + (ObjectFactory + .newInstance( + "org.apache.xerces.impl.xs.XMLSchemaValidator", + ObjectFactory.findClassLoader(), + true)); + } + catch (Exception exception) { + return null; + } + } + } + free = false; + return fDOMRevalidator; + } + /** NON-DOM */ + synchronized void releaseValidator(String schemaType) { + // REVISIT: implement releasing grammar base on the schema type + notifyAll(); + free = true; + } + /** NON-DOM */ + final synchronized boolean isFree() { + return free; + } } // class DOMImplementationImpl 1.34 +115 -5 xml-xerces/java/src/org/apache/xerces/dom/CoreDocumentImpl.java Index: CoreDocumentImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/CoreDocumentImpl.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- CoreDocumentImpl.java 24 Sep 2002 15:13:09 -0000 1.33 +++ CoreDocumentImpl.java 2 Nov 2002 01:02:23 -0000 1.34 @@ -98,6 +98,7 @@ import org.apache.xerces.util.SymbolTable; import org.apache.xerces.util.DOMErrorHandlerWrapper; import org.apache.xerces.util.ShadowedSymbolTable; +import org.apache.xerces.xni.NamespaceContext; import org.apache.xerces.xni.parser.XMLErrorHandler; import org.apache.xerces.xni.parser.XMLEntityResolver; import org.apache.xerces.xni.parser.XMLParserConfiguration; @@ -1985,10 +1986,6 @@ public Attr createAttributeNS(String namespaceURI, String qualifiedName) throws DOMException { - if (errorChecking && !isXMLName(qualifiedName)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INVALID_CHARACTER_ERR", null); - throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); - } return new AttrNSImpl(this, namespaceURI, qualifiedName); } @@ -2066,6 +2063,7 @@ } // isXMLName(String):boolean + // // Protected methods // @@ -2333,7 +2331,119 @@ fConfiguration.setProperty(DOMValidationConfiguration.GRAMMAR_POOL, grammarPool); } } + + protected final void checkNamespaceWF( String qname, int colon1, + int colon2) { + + if (!errorChecking) { + return; + } + // it is an error for NCName to have more than one ':' + // check if it is valid QName [Namespace in XML production 6] + if (colon1 == 0 || colon1 == qname.length() - 1 || colon2 != colon1) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + } + protected final void checkDOMNSErr(String prefix, + String namespace) { + + if (errorChecking) { + if (namespace == null) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + else if ( + prefix.equals("xml") + && namespace != NamespaceContext.XML_URI) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + else if ( + prefix.equals("xmlns") + && namespace != NamespaceContext.XMLNS_URI + || (!prefix.equals("xmlns") + && namespace == NamespaceContext.XMLNS_URI)) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + } + } + + /** + * * @param n * @param data */ + protected final void checkQName(String prefix, + String local){ + if (!errorChecking) { + return; + } + int length; + if (prefix != null) { + length=prefix.length(); + // check that prefix is NCName + if (!XMLChar.isNCNameStart(prefix.charAt(0))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); + } + for (int i = 1; i < length; i++) { + if (!XMLChar.isNCName(prefix.charAt(i))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException( + DOMException.INVALID_CHARACTER_ERR, + msg); + } + } + + } + length = local.length(); + // check local part + if (!XMLChar.isNCNameStart(local.charAt(0))) { + // REVISIT: add qname parameter to the message + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); + } + for (int i = 1; i < length; i++) { + if (!XMLChar.isNCName(local.charAt(i))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "INVALID_CHARACTER_ERR", + null); + throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); + } + } + } + + /** * NON-DOM: kept for backward compatibility * Store user data related to a given node 1.25 +2 -28 xml-xerces/java/src/org/apache/xerces/dom/DOMImplementationImpl.java Index: DOMImplementationImpl.java =================================================================== RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMImplementationImpl.java,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- DOMImplementationImpl.java 24 Jul 2002 19:08:41 -0000 1.24 +++ DOMImplementationImpl.java 2 Nov 2002 01:02:23 -0000 1.25 @@ -148,33 +148,7 @@ } // hasFeature(String,String):boolean - /** - * Introduced in DOM Level 2. <p> - * - * Creates an empty DocumentType node. - * - * @param qualifiedName The qualified name of the document type to be created. - * @param publicID The document type public identifier. - * @param systemID The document type system identifier. - * @since WD-DOM-Level-2-19990923 - */ - public DocumentType createDocumentType(String qualifiedName, - String publicID, - String systemID) - { - if (!CoreDocumentImpl.isXMLName(qualifiedName)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "INVALID_CHARACTER_ERR", null); - throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg); - } - int index = qualifiedName.indexOf(':'); - int lastIndex = qualifiedName.lastIndexOf(':'); - // it is an error for NCName to have more than one ':' - if (index == 0 || index == qualifiedName.length() - 1 || lastIndex!=index) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - return new DocumentTypeImpl(null, qualifiedName, publicID, systemID); - } + /** * Introduced in DOM Level 2. <p> * 1.52 +44 -36 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.51 retrieving revision 1.52 diff -u -r1.51 -r1.52 --- ElementImpl.java 30 Jul 2002 22:09:29 -0000 1.51 +++ ElementImpl.java 2 Nov 2002 01:02:23 -0000 1.52 @@ -623,41 +623,49 @@ * namespaceURI is null or an empty string. * @since WD-DOM-Level-2-19990923 */ - public void setAttributeNS(String namespaceURI, String qualifiedName, String value) { - - if (ownerDocument.errorChecking && isReadOnly()) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NO_MODIFICATION_ALLOWED_ERR", null); - throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, msg); - } - - if (needsSyncData()) { - synchronizeData(); - } - - int index = qualifiedName.indexOf(':'); - String prefix, localName; - if (index < 0) { - prefix = null; - localName = qualifiedName; - } - else { - prefix = qualifiedName.substring(0, index); - localName = qualifiedName.substring(index+1); - } - Attr newAttr = getAttributeNodeNS(namespaceURI, localName); - if (newAttr == null) { - newAttr = - getOwnerDocument().createAttributeNS(namespaceURI, qualifiedName); - - if (attributes == null) { - attributes = new AttributeMap(this, null); - } - newAttr.setNodeValue(value); - attributes.setNamedItemNS(newAttr); - } - else { - newAttr.setNodeValue(value); - } + public void setAttributeNS(String namespaceURI,String qualifiedName, + String value) { + if (ownerDocument.errorChecking && isReadOnly()) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NO_MODIFICATION_ALLOWED_ERR", + null); + throw new DOMException( + DOMException.NO_MODIFICATION_ALLOWED_ERR, + msg); + } + if (needsSyncData()) { + synchronizeData(); + } + int index = qualifiedName.indexOf(':'); + String prefix, localName; + if (index < 0) { + prefix = null; + localName = qualifiedName; + } + else { + prefix = qualifiedName.substring(0, index); + localName = qualifiedName.substring(index + 1); + } + Attr newAttr = getAttributeNodeNS(namespaceURI, localName); + if (newAttr == null) { + // REVISIT: this is not efficient, we are creating twice the same + // strings for prefix and localName. + newAttr = getOwnerDocument().createAttributeNS( + namespaceURI, + qualifiedName); + if (attributes == null) { + attributes = new AttributeMap(this, null); + } + newAttr.setNodeValue(value); + attributes.setNamedItemNS(newAttr); + } + else { + // change prefix and value + ((AttrNSImpl)newAttr).name= prefix+":"+localName; + newAttr.setNodeValue(value); + } } // setAttributeNS(String,String,String) 1.28 +37 -38 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.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- ElementNSImpl.java 9 Aug 2002 15:18:14 -0000 1.27 +++ ElementNSImpl.java 2 Nov 2002 01:02:23 -0000 1.28 @@ -61,6 +61,7 @@ import org.w3c.dom.Attr; import org.apache.xerces.util.URI; +import org.apache.xerces.xni.NamespaceContext; @@ -109,43 +110,41 @@ setName(namespaceURI, qualifiedName); } - private void setName(String namespaceURI, String qualifiedName) - throws DOMException - { - int index = qualifiedName.indexOf(':'); - String prefix; - - // DOM Level 3: namespace URI is never empty string. - this.namespaceURI = (namespaceURI !=null && - namespaceURI.length() == 0) ? null : namespaceURI; - - if (index < 0) { - prefix = null; - localName = qualifiedName; - } - else { - prefix = qualifiedName.substring(0, index); - localName = qualifiedName.substring(index+1); - - if (ownerDocument.errorChecking) { - if (this.namespaceURI == null - || (localName.length() == 0) - || (localName.indexOf(':') >= 0)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - else if (prefix.equals("xml")) { - if (!namespaceURI.equals(xmlURI)) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - } else if (index == 0) { - String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "NAMESPACE_ERR", null); - throw new DOMException(DOMException.NAMESPACE_ERR, msg); - } - } - } - } + private void setName(String namespaceURI, String qname) { + String prefix; + // DOM Level 3: namespace URI is never empty string. + this.namespaceURI = namespaceURI; + if (namespaceURI != null) { + this.namespaceURI = + (namespaceURI.length() == 0) ? null : namespaceURI.intern(); + } + int colon1 = qname.indexOf(':'); + int colon2 = qname.lastIndexOf(':'); + ownerDocument().checkNamespaceWF(qname, colon1, colon2); + if (colon1 < 0) { + // there is no prefix + localName = qname; + ownerDocument().checkQName(null, localName); + if (qname.equals("xmlns") + && (namespaceURI == null + || namespaceURI != NamespaceContext.XMLNS_URI) + || (namespaceURI == NamespaceContext.XMLNS_URI + && !qname.equals("xmlns"))) { + String msg = + DOMMessageFormatter.formatMessage( + DOMMessageFormatter.DOM_DOMAIN, + "NAMESPACE_ERR", + null); + throw new DOMException(DOMException.NAMESPACE_ERR, msg); + } + } + else { + prefix = qname.substring(0, colon1); + localName = qname.substring(colon2 + 1); + ownerDocument().checkQName(prefix, localName); + ownerDocument().checkDOMNSErr(prefix, namespaceURI); + } + } // when local name is known protected ElementNSImpl(CoreDocumentImpl ownerDocument,
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]