elena       2002/12/30 13:31:03

  Modified:    java/src/org/apache/xerces/dom CoreDocumentImpl.java
                        DOMConfigurationImpl.java DOMNormalizer.java
                        ElementImpl.java NamedNodeMapImpl.java
                        PSVIDocumentImpl.java ParentNode.java
               java/src/org/apache/xerces/impl/xs XMLSchemaValidator.java
               java/src/org/apache/xerces/parsers DOMBuilderImpl.java
  Log:
  Implement XML 1.0 attribute value normalization. Expose normalized values and 
default content via DOM Tree.
  Add implementation of discard-default-content.
  
  Revision  Changes    Path
  1.36      +2 -7      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.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- CoreDocumentImpl.java     11 Dec 2002 16:14:30 -0000      1.35
  +++ CoreDocumentImpl.java     30 Dec 2002 21:31:02 -0000      1.36
  @@ -975,12 +975,7 @@
               fConfiguration.reset();
           }
   
  -        try {
  -            domNormalizer.normalizeDocument(this, fConfiguration);
  -        }
  -        catch (RuntimeException e){
  -            // fatal error occured
  -        }
  +        domNormalizer.normalizeDocument(this, fConfiguration);
           isNormalized(true);
       }
   
  
  
  
  1.2       +31 -18    
xml-xerces/java/src/org/apache/xerces/dom/DOMConfigurationImpl.java
  
  Index: DOMConfigurationImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMConfigurationImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- DOMConfigurationImpl.java 11 Dec 2002 16:14:30 -0000      1.1
  +++ DOMConfigurationImpl.java 30 Dec 2002 21:31:02 -0000      1.2
  @@ -125,7 +125,8 @@
       protected static final String NORMALIZE_DATA = 
           Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_NORMALIZED_VALUE;
           
  -    protected static final String PSVI = 
  +    /** sending psvi in the pipeline */
  +    protected static final String SEND_PSVI = 
           Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_AUGMENT_PSVI;
   
       
  @@ -185,6 +186,7 @@
       protected final static short SPLITCDATA          = 0x1<<5;
       protected final static short COMMENTS            = 0x1<<6;
       protected final static short VALIDATE            = 0x1<<7;
  +    protected final static short PSVI                = 0x1<<8;
   
       // components
   
  @@ -249,7 +251,9 @@
               XERCES_NAMESPACES,
               SCHEMA,
               DYNAMIC_VALIDATION,
  -            NORMALIZE_DATA
  +            NORMALIZE_DATA,
  +            SEND_PSVI,
  +            Constants.DOM_DISCARD_DEFAULT_CONTENT
           };
           addRecognizedFeatures(recognizedFeatures);
   
  @@ -257,8 +261,10 @@
           setFeature(XERCES_VALIDATION, false);
           setFeature(SCHEMA, false);
           setFeature(DYNAMIC_VALIDATION, false);
  -        setFeature(NORMALIZE_DATA, true);
  +        setFeature(NORMALIZE_DATA, false);
           setFeature(XERCES_NAMESPACES, true);
  +        setFeature(Constants.DOM_DISCARD_DEFAULT_CONTENT, true);
  +        setFeature(SEND_PSVI, true);
   
           // add default recognized properties
           final String[] recognizedProperties = {
  @@ -279,7 +285,6 @@
           features |= NAMESPACES;
           features |= ENTITIES;
           features |= COMMENTS;
  -        features |= DTNORMALIZATION;
           features |= CDATA;
           features |= DEFAULTS;
           features |= SPLITCDATA;
  @@ -549,24 +554,23 @@
   
               }
               else if (name.equals(Constants.DOM_DATATYPE_NORMALIZATION)) {
  -                // REVISIT: datatype-normalization only takes effect if validation 
is on
  +                setFeature(NORMALIZE_DATA, state);
                   features =
                       (short) (state ? features | DTNORMALIZATION : features & 
~DTNORMALIZATION);
   
               }
               else if (name.equals(Constants.DOM_NAMESPACES)) {
                   features = (short) (state ? features | NAMESPACES : features & 
~NAMESPACES);
  -
               }
               else if (name.equals(Constants.DOM_CDATA_SECTIONS)) {
                   features = (short) (state ? features | CDATA : features & ~CDATA);
  -
               }
               else if (name.equals(Constants.DOM_ENTITIES)) {
                   features = (short) (state ? features | ENTITIES : features & 
~ENTITIES);
   
               }
               else if (name.equals(Constants.DOM_DISCARD_DEFAULT_CONTENT)) {
  +                setFeature (Constants.DOM_DISCARD_DEFAULT_CONTENT, state);
                   features = (short) (state ? features | DEFAULTS : features & 
~DEFAULTS);
   
               }
  @@ -603,11 +607,11 @@
                   }
   
               }
  -            else if (name.equals(Constants.DOM_PSVI)){
  -                try {
  -                    setFeature(PSVI, state);
  -                }
  -                catch (XMLConfigurationException e){
  +            else if (name.equals(SEND_PSVI) ){
  +                // REVISIT: turning augmentation of PSVI is not support,
  +                // because in this case we won't be able to retrieve element
  +                // default value.
  +                if (!state) { // false is not supported
                       String msg =
                           DOMMessageFormatter.formatMessage(
                               DOMMessageFormatter.DOM_DOMAIN,
  @@ -616,6 +620,9 @@
                       throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
                   }
               }
  +            else if (name.equals(Constants.DOM_PSVI)){
  +                  features = (short) (state ? features | PSVI : features & ~PSVI);
  +            }
               else {
                   String msg =
                       DOMMessageFormatter.formatMessage(
  @@ -641,8 +648,7 @@
                               new Object[] { name });
                       throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
                   }
  -            }
  -        
  +            }       
               else if (name.equals(Constants.DOM_ENTITY_RESOLVER)) {
                   if (value instanceof DOMEntityResolver) {
                       try {
  @@ -819,6 +825,13 @@
                                || name.equals(Constants.DOM_VALIDATE_IF_SCHEMA)) {
                        return Boolean.FALSE;
                }
  +        else if (name.equals(SEND_PSVI)) {
  +            return Boolean.TRUE;
  +
  +        }
  +        else if (name.equals(Constants.DOM_PSVI)) {
  +            return (features & PSVI) != 0 ? Boolean.TRUE : Boolean.FALSE;
  +        }
                else if (
                        name.equals(Constants.DOM_NAMESPACE_DECLARATIONS)
                                || 
name.equals(Constants.DOM_WHITESPACE_IN_ELEMENT_CONTENT)) {
  @@ -883,9 +896,9 @@
                        }
                        return false;
                }
  -             else if (
  -                     name.equals(Constants.DOM_NAMESPACE_DECLARATIONS)
  -                             || 
name.equals(Constants.DOM_WHITESPACE_IN_ELEMENT_CONTENT)) {
  +             else if ( name.equals(Constants.DOM_NAMESPACE_DECLARATIONS)
  +                             || 
name.equals(Constants.DOM_WHITESPACE_IN_ELEMENT_CONTENT)
  +                || name.equals(SEND_PSVI)) {
                        return (state == Boolean.TRUE) ? true : false;
   
                }
  
  
  
  1.21      +232 -141  xml-xerces/java/src/org/apache/xerces/dom/DOMNormalizer.java
  
  Index: DOMNormalizer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/DOMNormalizer.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- DOMNormalizer.java        16 Dec 2002 01:26:19 -0000      1.20
  +++ DOMNormalizer.java        30 Dec 2002 21:31:02 -0000      1.21
  @@ -58,45 +58,35 @@
   package org.apache.xerces.dom;
   
   
  -import org.apache.xerces.dom3.DOMErrorHandler;
  -import org.apache.xerces.dom3.DOMError;
  +import java.util.Vector;
   
  +import org.apache.xerces.dom3.DOMError;
  +import org.apache.xerces.dom3.DOMErrorHandler;
   import org.apache.xerces.impl.Constants;
   import org.apache.xerces.impl.RevalidationHandler;
   import org.apache.xerces.util.AugmentationsImpl;
   import org.apache.xerces.util.NamespaceSupport;
   import org.apache.xerces.util.SymbolTable;
   import org.apache.xerces.util.XMLSymbols;
  -import org.apache.xerces.parsers.AbstractXMLDocumentParser;
  -
  -
   import org.apache.xerces.xni.Augmentations;
   import org.apache.xerces.xni.NamespaceContext;
   import org.apache.xerces.xni.QName;
  -import org.apache.xerces.xni.XMLDocumentHandler;
   import org.apache.xerces.xni.XMLAttributes;
  -import org.apache.xerces.xni.XMLResourceIdentifier;
  +import org.apache.xerces.xni.XMLDocumentHandler;
   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.grammars.XMLGrammarDescription;
   import org.apache.xerces.xni.parser.XMLComponent;
  -import org.apache.xerces.xni.parser.XMLComponentManager;
   import org.apache.xerces.xni.parser.XMLConfigurationException;
  -import org.apache.xerces.xni.parser.XMLErrorHandler;
   import org.apache.xerces.xni.parser.XMLDocumentSource;
  -import org.apache.xerces.xni.psvi.ElementPSVI;
   import org.apache.xerces.xni.psvi.AttributePSVI;
  -
  -import org.apache.xerces.xni.grammars.XMLGrammarDescription;
  -import org.apache.xerces.xni.grammars.XMLGrammarPool;
  -import org.apache.xerces.xni.grammars.Grammar;
  -
  -import org.w3c.dom.Node;
  -import org.w3c.dom.Element;
  +import org.apache.xerces.xni.psvi.ElementPSVI;
   import org.w3c.dom.Attr;
  -import org.w3c.dom.Document;
  +import org.w3c.dom.Element;
  +import org.w3c.dom.Node;
   import org.w3c.dom.Text;
  -import java.util.Vector;
   
   /**
    * This class adds implementation for normalizeDocument method.
  @@ -123,19 +113,14 @@
    * @author Elena Litani, IBM
    * @version $Id$
    */
  -public class DOMNormalizer implements XMLGrammarPool, XMLDocumentHandler {
  +public class DOMNormalizer implements XMLDocumentHandler {
   
   
       //
  -    // REVISIT:  
  -    // 1. Send all appropriate calls for entity reference content.
  -    // 2. If datatype-normalization feature is on:
  -    //   a) replace values of text nodes with normalized value:
  -    //     need to pass to documentHandler augmentations that will be filled in 
  -    //     during validation process.
  -    //   b) add element default content: retrieve from augementations (PSVI Element 
schemaDefault)
  -    //   c) replace values of attributes: the augmentations for attributes have the 
values.
  -    //
  +    // REVISIT: 
  +    // 1. For element content we need to perform "2.11 End-of-Line Handling",
  +    //    see normalizeAttributeValue, characterData()
  +    // 2. Send all appropriate calls for entity reference content (?).
   
       //
       // constants
  @@ -144,6 +129,8 @@
       protected final static boolean DEBUG_ND = false;
       /** Debug namespace fix up algorithm*/
       protected final static boolean DEBUG = false;
  +    /** Debug document handler events */
  +    protected final static boolean DEBUG_EVENTS = false;
   
       /** prefix added by namespace fixup algorithm should follow a pattern "NS" + 
index*/
       protected final static String PREFIX = "NS";
  @@ -191,6 +178,9 @@
       /** for setting the PSVI */
       protected Node fCurrentNode = null;
       private QName fAttrQName = new QName();
  +    
  +    // attribute value normalization
  +    final XMLString fNormalizedValue = new XMLString(new char[16], 0, 0);
   
       // 
       // Constructor
  @@ -225,40 +215,50 @@
                        fConfiguration.setFeature(DOMConfigurationImpl.SCHEMA, true);
                        // report fatal error on DOM Level 1 nodes
                        fNamespaceValidation = true;
  +            
                        // check if we need to fill in PSVI
  -                     try {
  -                             fPSVI = 
fConfiguration.getFeature(DOMConfigurationImpl.PSVI);
  -                     }
  -                     catch (XMLConfigurationException e) {
  -                             fPSVI = false;
  -                     }
  +            fPSVI = ((fConfiguration.features & DOMConfigurationImpl.PSVI) 
!=0)?true:false;
                        // REVISIT: pass namespace context to the XML Schema validator
                         ((XMLComponent) fValidationHandler).reset(fConfiguration);
                }
   
  -             fErrorHandler = 
(DOMErrorHandler)fConfiguration.getParameter("error-handler");
  +             fErrorHandler = (DOMErrorHandler) 
fConfiguration.getParameter("error-handler");
                if (fValidationHandler != null) {
                        fValidationHandler.setBaseURI(fDocument.fDocumentURI);
                        fValidationHandler.setDocumentHandler(this);
                        fValidationHandler.startDocument(null, fDocument.encoding, 
fNamespaceContext, null);
   
                }
  +             try {
  +                     Node kid, next;
  +                     for (kid = fDocument.getFirstChild(); kid != null; kid = next) 
{
  +                             next = kid.getNextSibling();
  +                             kid = normalizeNode(kid);
  +                             if (kid != null) { // don't advance
  +                                     next = kid;
  +                             }
  +                     }
   
  -             Node kid, next;
  -             for (kid = fDocument.getFirstChild(); kid != null; kid = next) {
  -                     next = kid.getNextSibling();
  -                     kid = normalizeNode(kid);
  -                     if (kid != null) { // don't advance
  -                             next = kid;
  +                     // release resources
  +                     if (fValidationHandler != null) {
  +                             fValidationHandler.endDocument(null);
  +                             // REVISIT: only validation against XML Schema occurs
  +                             CoreDOMImplementationImpl.singleton.releaseValidator(
  +                                     XMLGrammarDescription.XML_SCHEMA);
  +                             fValidationHandler = null;
                        }
                }
  -
  -             // release resources
  -             if (fValidationHandler != null) {
  -                     fValidationHandler.endDocument(null);
  -                     // REVISIT: only validation against XML Schema occurs
  -                     
CoreDOMImplementationImpl.singleton.releaseValidator(XMLGrammarDescription.XML_SCHEMA);
  -                     fValidationHandler = null;
  +             catch (RuntimeException e) {
  +                     // fatal error occured
  +                     modifyDOMError(
  +                             "Runtime exception: " + e.getMessage(),
  +                             DOMError.SEVERITY_FATAL_ERROR,
  +                             null);
  +
  +                     this.fErrorHandler.handleError(fDOMError);
  +                     if (true) {
  +                             e.printStackTrace();
  +                     }
                }
   
        }
  @@ -326,6 +326,8 @@
                               Attr attr = (Attr)attributes.item(i);
                               removeDefault(attr, attributes);
                               attr.normalize();
  +                            // XML 1.0 attribute value normalization
  +                            normalizeAttributeValue(attr.getValue(), attr);         
                   
                           }
                       }
                   }
  @@ -335,7 +337,6 @@
                       //         or rely on the PSVI information.
                       fAttrProxy.setAttributes(attributes, fDocument, elem);
                       updateQName(elem, fQName); // updates global qname
  -                    //
                       // set error node in the dom error wrapper
                       // so if error occurs we can report an error node
                       fConfiguration.fErrorHandlerWrapper.fCurrentNode = node;
  @@ -588,6 +589,8 @@
                               }
                           }
                       } else {
  +                        // XML 1.0 Attribute value normalization
  +                        value = normalizeAttributeValue(value, attr);
                           prefix = attr.getPrefix();
                           prefix = (prefix == null || 
                                     prefix.length() == 0) ? XMLSymbols.EMPTY_STRING 
:fSymbolTable.addSymbol(prefix);
  @@ -695,14 +698,13 @@
               // clone content of the attributes
               attributes.cloneMap(fAttributeList);
               for (int i = 0; i < fAttributeList.size(); i++) {
  -
                   Attr attr = (Attr) fAttributeList.elementAt(i);
  -                // normalize attribute value
  -                attr.normalize();
   
                   if (DEBUG) {
                       System.out.println("==>[ns-fixup] process attribute: 
"+attr.getNodeName());
                   }
  +                // normalize attribute value
  +                attr.normalize();                
                   value = attr.getValue();
                   name = attr.getNodeName();                
                   uri = attr.getNamespaceURI();
  @@ -734,6 +736,8 @@
                       if (removeDefault(attr, attributes)) {
                           continue;
                       }
  +                    // XML 1.0 Attribute value normalization
  +                    value = normalizeAttributeValue(value, attr);
   
   
                       uri = fSymbolTable.addSymbol(uri);
  @@ -786,7 +790,8 @@
   
                       // data
                       int colon = name.indexOf(':');
  -
  +                    // XML 1.0 Attribute value normalization
  +                    value = normalizeAttributeValue(value, attr);
                       if (colon > -1) {
                           // It is an error if document has DOM L1 nodes.
                           boolean continueProcess = true;
  @@ -884,6 +889,60 @@
           qname.rawname = fSymbolTable.addSymbol(node.getNodeName()); 
           qname.uri =  (namespace != null)?fSymbolTable.addSymbol(namespace):null;
       }
  +
  +     /**
  +      * Performs partial XML 1.0 attribute value normalization and replaces
  +     * attribute value if the value is changed after the normalization.
  +     * DOM defines that normalizeDocument acts as if the document was going 
  +     * through a save and load cycle, given that serializer will not escape
  +     * any '\n' or '\r' characters on load those will be normalized.
  +     * Thus during normalize document we need to do the following:
  +     * - perform "2.11 End-of-Line Handling"
  +     * - replace #xD, #xA, #x9 with #x20 (white space).
  +     * Note: This alg. won't attempt to resolve entity references or character 
entity 
  +     * references, since '&' will be escaped during serialization and during loading
  +     * this won't be recognized as entity reference, i.e. attribute value "&foo;" 
will 
  +     * be serialized as "&amp;foo;" and thus after loading will be "&foo;" again.
  +      * @param value current attribute value
  +      * @param attr current attribute
  +      * @return String the value (could be original if normalization did not change 
  +     * the string)
  +      */
  +    final String normalizeAttributeValue(String value, Attr attr) {
  +        if (!attr.getSpecified()){
  +            // specified attributes should already have a normalized form
  +            // since those were added by validator
  +            return value;
  +        }
  +        int end = value.length();
  +        // ensure capacity 
  +        if (fNormalizedValue.ch.length < end) {
  +            fNormalizedValue.ch = new char[end];
  +        }
  +        fNormalizedValue.length = 0;
  +        boolean normalized = false;
  +        for (int i = 0; i < end; i++) {
  +            char c = value.charAt(i);
  +            if (c==0x0009 || c==0x000A) {
  +               fNormalizedValue.ch[fNormalizedValue.length++] = ' '; 
  +               normalized = true;
  +            }
  +            else if(c==0x000D){
  +               normalized = true;
  +               fNormalizedValue.ch[fNormalizedValue.length++] = ' ';
  +               int next = i+1;
  +               if (next < end && value.charAt(next)==0x000A) i=next; // skip 
following xA
  +            }
  +            else {
  +                fNormalizedValue.ch[fNormalizedValue.length++] = c;
  +            }
  +        }
  +        if (normalized){
  +           value = fNormalizedValue.toString();
  +           attr.setValue(value);
  +        }
  +        return value;
  +    }
     
       protected final class XMLAttributesProxy 
       implements XMLAttributes {
  @@ -914,18 +973,37 @@
           }
   
   
  -        public int addAttribute(QName attrQName, String attrType, String attrValue){
  -            Attr attr = fDocument.createAttributeNS(attrQName.uri,
  -                                                    attrQName.rawname,
  -                                                    attrQName.localpart);
  -            attr.setValue(attrValue);
  -            if (fAttributes == null) {
  -                fAttributes = (AttributeMap)fElement.getAttributes();
  +             /**
  +         * This method adds default declarations
  +              * @see org.apache.xerces.xni.XMLAttributes#addAttribute(QName, 
String, String)
  +              */
  +             public int addAttribute(QName qname, String attrType, String 
attrValue) {
  +                     int index = fElement.getXercesAttribute(qname.uri, 
qname.localpart);
  +                     // add defaults to the tree
  +                     if (index < 0) {
  +                // the default attribute was removed by a user and needed to 
  +                // be added back
  +                             AttrImpl attr = (AttrImpl)
  +                                     ((CoreDocumentImpl) 
fElement.getOwnerDocument()).createAttributeNS(
  +                                             qname.uri,
  +                                             qname.rawname,
  +                                             qname.localpart);
  +                // REVISIT: the following should also update ID table
  +                             index = fElement.setXercesAttributeNode(attr);
  +                             attr.setNodeValue(attrValue);
  +                             fAugmentations.insertElementAt(new 
AugmentationsImpl(), index);
  +                attr.setSpecified(false);
  +                     }            
  +                     else {
  +                // default attribute is in the tree
  +                // we don't need to do anything since prefix was already fixed
  +                // at the namespace fixup time and value must be same value, 
otherwise
  +                // attribute will be treated as specified and we will never reach 
  +                // this method.
  +                
               }
  -            int index = fElement.setXercesAttributeNode(attr);
  -            fAugmentations.insertElementAt(new AugmentationsImpl(), index);
               return index;
  -        }
  +             }
   
   
           public void removeAllAttributes(){
  @@ -1008,12 +1086,22 @@
   
   
           public void setValue(int attrIndex, String attrValue){
  -            // REVISIT: implement
  +            // REVISIT: is this desired behaviour? 
  +            // The values are updated in the case datatype-normalization is turned 
on
  +            // in this case we need to make sure that specified attributes stay 
specified
  +            
  +            if (fAttributes != null){
  +                AttrImpl attr = (AttrImpl)fAttributes.getItem(attrIndex);
  +                boolean specified = attr.getSpecified();
  +                attr.setValue(attrValue);
  +                attr.setSpecified(specified);
  +            
  +            }
           }
   
   
           public String getValue(int index){
  -            return fAttributes.item(index).getNodeValue();
  +            return (fAttributes !=null)?fAttributes.item(index).getNodeValue():"";
   
           }
   
  @@ -1024,7 +1112,7 @@
           }
   
   
  -        public String getValue(String uri, String localName){            
  +        public String getValue(String uri, String localName){ 
               if (fAttributes != null) {
                   Node node =  fAttributes.getNamedItemNS(uri, localName);
                   return(node != null)? node.getNodeValue():null;
  @@ -1046,7 +1134,6 @@
   
   
           public void setSpecified(int attrIndex, boolean specified){
  -            // REVISIT: this will be called after add attributes is called
               AttrImpl attr = (AttrImpl)fAttributes.getItem(attrIndex);
               attr.setSpecified(specified);
           }
  @@ -1070,41 +1157,6 @@
           }
       }
   
  -
  -    //
  -    // XML GrammarPool methods
  -    //
  -
  -    // REVISIT: should DOMNormalizer implement grammar pool?
  -    public Grammar[] retrieveInitialGrammarSet(String grammarType){
  -        // REVISIT: should take into account grammarType
  -        return null;
  -
  -    }
  -
  -
  -    public void cacheGrammars(String grammarType, Grammar[] grammars){
  -        // REVISIT: implement
  -    }
  -
  -
  -    public Grammar retrieveGrammar(XMLGrammarDescription desc){
  -        return null;
  -    }
  -
  -    public void lockPool(){
  -        // REVISIT: implement
  -    }
  -
  -
  -    public void unlockPool(){
  -        // REVISIT: implement
  -    }
  -
  -    public void clear(){
  -        // REVISIT: implement
  -    }
  -
       // 
       // XMLDocumentHandler methods
       //
  @@ -1222,26 +1274,45 @@
        * @exception XNIException
        *                   Thrown by handler to signal an error.
        */
  -    public void startElement(QName element, XMLAttributes attributes, Augmentations 
augs)
  -        throws XNIException{
  -        if (fPSVI) {
  -            Element currentElement = (Element)fCurrentNode;
  -            int attrCount = attributes.getLength();
  -            for (int i = 0; i < attrCount; i++) {
  -                attributes.getName(i, fAttrQName);
  -                Attr attr = null;
  -                //REVISIT: schema elements must be namespace aware.
  -                //         DTD re-validation is not implemented yet..
  -                attr = 
currentElement.getAttributeNodeNS(fAttrQName.uri,fAttrQName.localpart);
  -
  -                AttributePSVI attrPSVI = 
(AttributePSVI)attributes.getAugmentations(i).getItem(Constants.ATTRIBUTE_PSVI);
  -                if (attrPSVI !=null) {
  -                     ((PSVIAttrNSImpl)attr).setPSVI(attrPSVI);
  -                }
  -            }
  -        }
  -    
  -    }
  +     public void startElement(QName element, XMLAttributes attributes, 
Augmentations augs)
  +             throws XNIException {
  +             //REVISIT: schema elements must be namespace aware.
  +             //         DTD re-validation is not implemented yet.. 
  +             Element currentElement = (Element) fCurrentNode;
  +             int attrCount = attributes.getLength();
  +        if (DEBUG_EVENTS) {
  +            System.out.println("==>startElement: " +element+
  +            " attrs.length="+attrCount);
  +        }
  +
  +             for (int i = 0; i < attrCount; i++) {
  +                     attributes.getName(i, fAttrQName);
  +                     Attr attr = null;
  +
  +                     attr = currentElement.getAttributeNodeNS(fAttrQName.uri, 
fAttrQName.localpart);
  +                     AttributePSVI attrPSVI =
  +                             (AttributePSVI) 
attributes.getAugmentations(i).getItem(Constants.ATTRIBUTE_PSVI);
  +
  +                     if (attrPSVI != null) {
  +                             if (fPSVI) {
  +                                     ((PSVIAttrNSImpl) attr).setPSVI(attrPSVI);
  +                             }
  +                             if ((fConfiguration.features & 
DOMConfigurationImpl.DTNORMALIZATION) != 0) {
  +                                     // datatype-normalization
  +                                     // NOTE: The specified value MUST be set after 
we set
  +                                     //       the node value because that turns the 
"specified"
  +                                     //       flag to "true" which may overwrite a 
"false"
  +                                     //       value from the attribute list.
  +                                     boolean specified = attr.getSpecified();
  +                                     
attr.setValue(attrPSVI.getSchemaNormalizedValue());
  +                                     if (!specified) {
  +                                             ((AttrImpl) 
attr).setSpecified(specified);
  +                                     }
  +                             }
  +                     }
  +             }
  +     }
  +
   
       /**
        * An empty element.
  @@ -1253,11 +1324,15 @@
        * @exception XNIException
        *                   Thrown by handler to signal an error.
        */
  -    public void emptyElement(QName element, XMLAttributes attributes, Augmentations 
augs)
  -        throws XNIException{
  -        startElement(element, attributes, augs);
  +     public void emptyElement(QName element, XMLAttributes attributes, 
Augmentations augs)
  +             throws XNIException {
  +        if (DEBUG_EVENTS) {
  +            System.out.println("==>emptyElement: " +element);
  +        }
  +
  +             startElement(element, attributes, augs);
           endElement(element, augs);
  -    }
  +     }
   
       /**
        * This method notifies the start of a general entity.
  @@ -1356,20 +1431,36 @@
        * @exception XNIException
        *                   Thrown by handler to signal an error.
        */
  -    public void endElement(QName element, Augmentations augs) throws XNIException{
  -        if (fPSVI) {
  +     public void endElement(QName element, Augmentations augs) throws XNIException 
{ 
  +        if (DEBUG_EVENTS) {
  +                     System.out.println("==>endElement: " + element);
  +             }
           
  -            ElementPSVI elementPSVI = 
(ElementPSVI)augs.getItem(Constants.ELEMENT_PSVI);
  -            if (elementPSVI != null) {
  -                
  -                ((PSVIElementNSImpl)fCurrentNode).setPSVI(elementPSVI);
  -                if (elementPSVI.getIsSchemaSpecified()) {
  -                    // default value from XML Schema.
  -                    fCurrentNode.setNodeValue(elementPSVI.getSchemaDefault());
  -                }
  -            }
  -        }
  -    }
  +             ElementPSVI elementPSVI = (ElementPSVI) 
augs.getItem(Constants.ELEMENT_PSVI);
  +             if (elementPSVI != null) {
  +                     ElementImpl elementNode = (ElementImpl) fCurrentNode;
  +                     if (fPSVI) {
  +                             ((PSVIElementNSImpl) 
fCurrentNode).setPSVI(elementPSVI);
  +                     }
  +                     if ((fConfiguration.features & DOMConfigurationImpl.DEFAULTS) 
== 0) {
  +                             String normalizedValue = 
elementPSVI.getSchemaNormalizedValue();
  +                             if ((fConfiguration.features & 
DOMConfigurationImpl.DTNORMALIZATION) != 0) {
  +                                     elementNode.setTextContent(normalizedValue);
  +                             }
  +                             else {
  +                                     // NOTE: this is a hack: it is possible that 
DOM had an empty element
  +                                     // and validator sent default value using 
characters(), which we don't 
  +                                     // implement. Thus, here we attempt to add the 
default value.
  +                                     String text = elementNode.getTextContent();
  +                                     if (text.length() == 0) {
  +                                             // default content could be provided
  +                                             // REVISIT: should setTextConent(null) 
be allowed?
  +                                             
elementNode.setTextContent(normalizedValue);
  +                                     }
  +                             }
  +                     }
  +             }
  +     }
   
       /**
        * The start of a CDATA section.
  
  
  
  1.55      +20 -1     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.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- ElementImpl.java  11 Dec 2002 14:19:13 -0000      1.54
  +++ ElementImpl.java  30 Dec 2002 21:31:02 -0000      1.55
  @@ -786,12 +786,31 @@
         */
       protected int setXercesAttributeNode (Attr attr){
   
  +        if (needsSyncData()) {
  +            synchronizeData();
  +        }
  +        
           if (attributes == null) {
               attributes = new AttributeMap(this, null);
           }
           return attributes.addItem(attr);
   
       }
  +    
  +    /**
  +      * NON-DOM: get inded of an attribute
  +      */
  +    protected int getXercesAttribute(String namespaceURI, String localName){
  +
  +        if (needsSyncData()) {
  +            synchronizeData();
  +        }
  +        if (attributes == null) {
  +            return -1;
  +        }
  +        return attributes.getNamedItemIndex(namespaceURI, localName);
  +
  +    } 
       
       /**
        * Introduced in DOM Level 2.
  
  
  
  1.34      +5 -1      xml-xerces/java/src/org/apache/xerces/dom/NamedNodeMapImpl.java
  
  Index: NamedNodeMapImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/NamedNodeMapImpl.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- NamedNodeMapImpl.java     19 Nov 2002 01:41:36 -0000      1.33
  +++ NamedNodeMapImpl.java     30 Dec 2002 21:31:02 -0000      1.34
  @@ -595,6 +595,10 @@
           
           return list;
       }
  +    
  +     protected int getNamedItemIndex(String namespaceURI, String localName) {
  +        return findNamePoint(namespaceURI, localName);
  +     }
   
       /**
         * NON-DOM remove all elements from this map
  
  
  
  1.3       +2 -8      xml-xerces/java/src/org/apache/xerces/dom/PSVIDocumentImpl.java
  
  Index: PSVIDocumentImpl.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/PSVIDocumentImpl.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PSVIDocumentImpl.java     11 Dec 2002 16:14:30 -0000      1.2
  +++ PSVIDocumentImpl.java     30 Dec 2002 21:31:02 -0000      1.3
  @@ -71,12 +71,7 @@
    * @version $Id$
    */
   public class PSVIDocumentImpl extends DocumentImpl {
  -    
  -    /** Recognized features. */
  -    private static final String[] RECOGNIZED_FEATURES = {
  -        DOMConfigurationImpl.PSVI
  -        };
  -
  +   
   
       /**
        * Create a document.
  @@ -132,7 +127,6 @@
        */
       public DOMConfiguration getConfig(){
           super.getConfig();
  -        fConfiguration.addRecognizedFeatures(RECOGNIZED_FEATURES);
           return fConfiguration;
       }
       
  
  
  
  1.38      +4 -2      xml-xerces/java/src/org/apache/xerces/dom/ParentNode.java
  
  Index: ParentNode.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/dom/ParentNode.java,v
  retrieving revision 1.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- ParentNode.java   19 Nov 2002 01:41:36 -0000      1.37
  +++ ParentNode.java   30 Dec 2002 21:31:02 -0000      1.38
  @@ -693,7 +693,9 @@
               removeChild(child);
           }
           // create a Text node to hold the given content
  -        appendChild(ownerDocument().createTextNode(textContent));
  +        if (textContent != null){
  +            appendChild(ownerDocument().createTextNode(textContent));
  +        }
       }
   
       //
  
  
  
  1.126     +15 -5     
xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java
  
  Index: XMLSchemaValidator.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/XMLSchemaValidator.java,v
  retrieving revision 1.125
  retrieving revision 1.126
  diff -u -r1.125 -r1.126
  --- XMLSchemaValidator.java   16 Dec 2002 01:26:20 -0000      1.125
  +++ XMLSchemaValidator.java   30 Dec 2002 21:31:03 -0000      1.126
  @@ -314,6 +314,8 @@
       // to indicate whether we are in the scope of entity reference or CData
       protected boolean fEntityRef = false;
       protected boolean fInCDATA = false;
  +    // DOM Level 3: discard default attributes (
  +    protected boolean fDiscardDefaults = false;
   
       // properties
   
  @@ -707,7 +709,7 @@
   
           // call handlers
           if (fDocumentHandler != null) {
  -            if (!fSchemaElementDefault || fDefaultValue == null) {
  +            if (fDiscardDefaults || !fSchemaElementDefault || fDefaultValue == 
null) {
                   fDocumentHandler.emptyElement(element, attributes, modifiedAugs);
               } else {
                   fDocumentHandler.startElement(element, attributes, modifiedAugs);
  @@ -1309,6 +1311,14 @@
               fSchemaType = null;
           }
           
  +        try {
  +            fDiscardDefaults = 
componentManager.getFeature(Constants.DOM_DISCARD_DEFAULT_CONTENT);       
  +        }
  +        catch (XMLConfigurationException e){
  +            fDiscardDefaults = false;
  +        }
  +        
  +        
           fEntityResolver = 
(XMLEntityResolver)componentManager.getProperty(ENTITY_MANAGER);
           fSchemaLoader.setEntityResolver(fEntityResolver);
   
  @@ -1993,7 +2003,7 @@
           processAttributes(element, attributes, attrGrp);
   
           // add default attributes
  -        if (attrGrp != null) {
  +        if (attrGrp != null && !fDiscardDefaults) {
               addDefaultAttributes(element, attributes, attrGrp);
           }
   
  @@ -2659,7 +2669,6 @@
                   reportSchemaError("cvc-complex-type.3.1", new 
Object[]{element.rawname, fTempQName.rawname, attrValue});
               }
           }
  -
           if (fAugPSVI) {
               // PSVI: attribute declaration
               attrPSVI.fDeclaration = currDecl;
  @@ -2744,10 +2753,11 @@
                       attrs.setSchemaId(attrIndex, schemaId);
                   }
   
  +                    
                   if (fAugPSVI) {
  +                    
                       // PSVI: attribute is "schema" specified
                       Augmentations augs = attributes.getAugmentations(attrIndex);
  -
                       AttributePSVImpl attrPSVI = new AttributePSVImpl();
                       augs.putItem(Constants.ATTRIBUTE_PSVI, attrPSVI);
   
  
  
  
  1.25      +6 -14     
xml-xerces/java/src/org/apache/xerces/parsers/DOMBuilderImpl.java
  
  Index: DOMBuilderImpl.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xerces/java/src/org/apache/xerces/parsers/DOMBuilderImpl.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- DOMBuilderImpl.java       11 Dec 2002 16:14:31 -0000      1.24
  +++ DOMBuilderImpl.java       30 Dec 2002 21:31:03 -0000      1.25
  @@ -188,7 +188,8 @@
               Constants.DOM_INFOSET,
               Constants.DOM_NAMESPACE_DECLARATIONS,
               Constants.DOM_SUPPORTED_MEDIATYPES_ONLY,
  -            Constants.DOM_CERTIFIED
  +            Constants.DOM_CERTIFIED,
  +            Constants.DOM_DISCARD_DEFAULT_CONTENT
           };
   
           fConfiguration.addRecognizedFeatures(domRecognizedFeatures);
  @@ -203,6 +204,7 @@
           fConfiguration.setFeature(Constants.DOM_INFOSET, false);
           fConfiguration.setFeature(Constants.DOM_NAMESPACE_DECLARATIONS, true);
           fConfiguration.setFeature(Constants.DOM_SUPPORTED_MEDIATYPES_ONLY, false);
  +        fConfiguration.setFeature(Constants.DOM_DISCARD_DEFAULT_CONTENT, true);
           
           // REVISIT: by default Xerces assumes that input is certified.
           //          default is different from the one specified in the DOM spec
  @@ -210,15 +212,6 @@
   
           // Xerces datatype-normalization feature is on by default
           fConfiguration.setFeature( NORMALIZE_DATA, false ); 
  -
  -
  -        // REVISIT: we need to be able to validate against XMLSchema ONLY if
  -        //          schemaType equal XML Schema namespace, even if
  -        //          DOCTYPE is present.
  -        //          This is similar to JAXP schemaLanguage property.         
  -
  -        
  -
       } // <init>(XMLParserConfiguration)
   
       /**
  @@ -693,9 +686,8 @@
                   DOMErrorImpl error = new DOMErrorImpl();
                   error.fException = e;
                   error.fMessage = e.getMessage();
  -                error.fSeverity = error.SEVERITY_ERROR;
  +                error.fSeverity = error.SEVERITY_FATAL_ERROR;
                   fErrorHandler.getErrorHandler().handleError(error);
  -
               }
               if (DEBUG) {            
                  e.printStackTrace();
  @@ -721,7 +713,7 @@
                   DOMErrorImpl error = new DOMErrorImpl();
                   error.fException = e;
                   error.fMessage = e.getMessage();
  -                error.fSeverity = error.SEVERITY_ERROR;
  +                error.fSeverity = error.SEVERITY_FATAL_ERROR;
                   fErrorHandler.getErrorHandler().handleError(error);
   
               }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to