Using the test program included below I get a ClassCastException at line 1176 
of the
DeferredDocumentImpl class. This looks like it should work to me, but I haven't 
dug
into it very deeply. I am using JDK1.2.2 with the latest CVS download of Xerces 
(at least
as of 4:00 PM CST 12/30/1999.) I will debug as much as I can over the weekend, 
but
if someone has already solved this I would appreciate an email.
 
The test files are included below. You will probably have to fix up the 
pathname to the
XML file in the Java class' init() method and the pathname of the DTD in the 
XML file.
This worked until I added a call to configDoc.getIdentifier(String) in the 
processChild()
method.
 
Chuck Simpson
<mailto:[EMAIL PROTECTED]>
 
 
INCLUDED JAVA TEST FILE
 
/*
 * TestXml.java
 *
 * Created on December 28, 1999, 5:47 PM
 */
 
import java.io.*;
import java.net.*;
import java.beans.*;
import java.beans.beancontext.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.security.acl.NotOwnerException;
import org.apache.xerces.parsers.*;
import org.apache.xerces.dom.*;
import org.xml.sax.*;
 

/**
 *
 * @author  chuckls
 * @version
 */
public class TestXml extends Object {
 
  // Configuration specification parsing related variables
  private InputStream configStream;
  private InputSource configSource;
  private DOMParser configParser;
  private DocumentImpl configDoc;
  private NodeImpl node;
  private NodeImpl rootnode;
  private int level = 0;
 
  /** Creates new TestXml */
  public TestXml() {
  }
 
  public void init() {
    int length;
    try {
      configStream = new FileInputStream("test.xml");
      configSource = new InputSource(configStream);
      configParser = new DOMParser();
      configParser.parse(configSource);
      configDoc = (DocumentImpl)configParser.getDocument();
      node = (NodeImpl)configDoc.getChildNodes();
      System.out.println("Document has " + (length = node.getLength()) + " 
children");
      for( int i = 0; i < length; i++ ) {
        String t;
        if( "ELEMENT".equals(t = nodeType(node = (NodeImpl)configDoc.item(i))) )
          rootnode = node;
        System.out.println("Node " + i + "'s type is " + t);
      }
      processChild( rootnode );
      System.out.println("Parse completed");
    } catch(SAXException se) {
      System.out.println("SAXException: " + se);
    } catch(FileNotFoundException fnfe) {
      System.out.println("FileNotFoundException: " + fnfe);
    } catch(IOException ioe) {
      System.out.println("IOException: " + ioe);
    }
  }
 
  public String trim(String s) {
    if( s == null )
      return null;
    StringBuffer sb = new StringBuffer(s);
    char c;
    int offset = 0;
    while( sb.length() > offset
    && ((c = sb.charAt(offset)) == ' ' || c == '\t' || c == '\n' || c == '\r')) 
{
      offset++;
    }
    if( sb.length() > offset )
      return sb.substring(offset);
    return null;
  }
 
  public void processChild(NodeImpl current) {
    String indent = "";
    String val;
    NamedNodeMapImpl attrMap;
    for( int i = 0; i < level; i++ )
      indent += "  ";
    switch( current.getNodeType() ) {
      case NodeImpl.ATTRIBUTE_NODE:
        System.out.print(indent + "ATTRIBUTE:" + ((AttrImpl)current).getName());
        val = current.getNodeValue();
        if( val != null ) {
          System.out.println(" = " + val);
          if( "NAME".equals(((AttrImpl)current).getName()) && 
configDoc.getIdentifier(val) == null )
            System.out.println("Identifier for " + val + " not found");
        } else
          System.out.println("");
        break;
      case NodeImpl.CDATA_SECTION_NODE:
      case NodeImpl.COMMENT_NODE:
      case NodeImpl.DOCUMENT_FRAGMENT_NODE:
      case NodeImpl.DOCUMENT_NODE:
      case NodeImpl.DOCUMENT_TYPE_NODE:
        break;
      case NodeImpl.ELEMENT_NODE:
        System.out.print(indent + current.getNodeName());
        val = current.getNodeValue();
        if( val != null )
          System.out.println(" = " + val);
        else
          System.out.println("");
        // If this node has attributes
        if( (attrMap = (NamedNodeMapImpl)current.getAttributes()) != null ) {
          for( int i = attrMap.getLength(); --i >= 0; ) {
            level++;
            processChild((NodeImpl)attrMap.item(i));
            level--;
          }
        }
        if( current.hasChildNodes() ) {
          NodeImpl child = (NodeImpl)current.getFirstChild();
          do {
            level++;
            processChild(child);
            level--;
          } while( (child = (NodeImpl)child.getNextSibling()) != null );
        }
        break;
      case NodeImpl.ENTITY_NODE:
      case NodeImpl.ENTITY_REFERENCE_NODE:
      case NodeImpl.NOTATION_NODE:
      case NodeImpl.PROCESSING_INSTRUCTION_NODE:
      case NodeImpl.TEXT_NODE:
        val = trim(current.getNodeValue());
        if( val != null )
          System.out.println(indent + "Value = " + val);
        break;
    }
  }
   
  public String nodeType(NodeImpl current) {
    switch( current.getNodeType() ) {
      case NodeImpl.ATTRIBUTE_NODE:
        return "ATTRIBUTE";
      case NodeImpl.CDATA_SECTION_NODE:
        return "CDATA_SECTION";
      case NodeImpl.COMMENT_NODE:
        return "COMMENT";
      case NodeImpl.DOCUMENT_FRAGMENT_NODE:
        return "DOCUMENT_FRAGMENT";
      case NodeImpl.DOCUMENT_NODE:
        return "DOCUMENT";
      case NodeImpl.DOCUMENT_TYPE_NODE:
        return "DOCUMENT_TYPE";
      case NodeImpl.ELEMENT_NODE:
        return "ELEMENT";
      case NodeImpl.ENTITY_NODE:
        return "ENTITY";
      case NodeImpl.ENTITY_REFERENCE_NODE:
        return "ENTITY_REFERENCE";
      case NodeImpl.NOTATION_NODE:
        return "NOTATION";
      case NodeImpl.PROCESSING_INSTRUCTION_NODE:
        return "PROCESSING_INSTRUCTION";
      case NodeImpl.TEXT_NODE:
        return "TEXT";
    }
    return "";
  }
 
  /**
  * @param args the command line arguments
  */
  public static void main (String args[]) {
    TestXml test = new TestXml();
   
    System.out.println("Init started");
    test.init();
    System.out.println("Init complete");
  }
 
}
 
DTD FOR TESTFILE
<!ELEMENT CONFIGURATION (STRUCTURE, WIRING?)>

<!ELEMENT STRUCTURE (CONTAINER+, PROPERTY-SET?)>

<!ELEMENT CONTAINER ((CONTAINER|COMPONENT)*, (WIRING|PROPERTY-SET)*)>

<!ELEMENT COMPONENT (PROPERTY-SET|WIRING)*>

<!ELEMENT PROPERTY-SET (PROPERTY+)>

<!ELEMENT PROPERTY (PROPERTY-VALUE|LISTENER)+>

<!ELEMENT PROPERTY-VALUE EMPTY>

<!ELEMENT WIRING (EVENT+)>

<!ELEMENT EVENT (LISTENER|PROPERTY)+>

<!ELEMENT LISTENER EMPTY>

<!--

Attributes for all elements

-->

<!ATTLIST CONTAINER NAME ID #REQUIRED>

<!ATTLIST CONTAINER CLASSNAME NMTOKEN #REQUIRED>

<!ATTLIST CONTAINER SEQNO CDATA #IMPLIED>

<!ATTLIST COMPONENT NAME ID #REQUIRED>

<!ATTLIST COMPONENT CLASSNAME NMTOKEN #REQUIRED>

<!ATTLIST COMPONENT SEQNO CDATA #IMPLIED>

<!ATTLIST PROPERTY NAME NMTOKEN #REQUIRED>

<!ATTLIST PROPERTY TYPE NMTOKEN #REQUIRED>

<!ATTLIST PROPERTY-VALUE TYPE (STRING|INTEGER|DOUBLE|DATE|TIME|BOOLEAN) 
#REQUIRED>

<!ATTLIST PROPERTY-VALUE INDEX CDATA #IMPLIED>

<!ATTLIST PROPERTY-VALUE VALUE CDATA #REQUIRED>

<!ATTLIST LISTENER NAME IDREF #REQUIRED>

<!ENTITY % EVENT-TYPES "(PropertyChange|VetoableChange|BeanContextMembership|

BeanContextServiceAvailable|BeanContextServiceRevoked)">

<!ATTLIST EVENT TYPE %EVENT-TYPES; #REQUIRED>

XMLFILE FOR TESTFILE
 
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE CONFIGURATION SYSTEM "test.dtd">

<CONFIGURATION>

<STRUCTURE>

<CONTAINER NAME="con1" CLASSNAME="container" SEQNO="1">

<COMPONENT NAME="con1.com1" CLASSNAME="component" SEQNO="1">

<PROPERTY-SET>

<PROPERTY NAME="con1.com1.prop1" TYPE="String">

<PROPERTY-VALUE TYPE="STRING" VALUE="property1"/>

</PROPERTY>

</PROPERTY-SET>

</COMPONENT>

<COMPONENT NAME="con1.com2" CLASSNAME="component" SEQNO="2">

<PROPERTY-SET>

<PROPERTY NAME="con1.com2.prop1" TYPE="String">

<PROPERTY-VALUE TYPE="STRING" VALUE="property1"/>

</PROPERTY>

<PROPERTY NAME="con1.com2.prop2" TYPE="String">

<PROPERTY-VALUE TYPE="STRING" VALUE="property2"/>

</PROPERTY>

</PROPERTY-SET>

</COMPONENT>

</CONTAINER>

<CONTAINER NAME="con2" CLASSNAME="subcontainer" SEQNO="2">

<COMPONENT NAME="con2.com1" CLASSNAME="subcomponent" SEQNO="1">

<PROPERTY-SET>

<PROPERTY NAME="con2.com1.prop1" TYPE="Integer">

<PROPERTY-VALUE TYPE="INTEGER" VALUE="5"/>

</PROPERTY>

<PROPERTY NAME="con2.com1.prop2" TYPE="Double">

<PROPERTY-VALUE TYPE="DOUBLE" VALUE="12.3"/>

</PROPERTY>

</PROPERTY-SET>

<WIRING>

<EVENT TYPE="PropertyChange">

<PROPERTY NAME="con2.com1.prop1" TYPE="String">

<LISTENER NAME="con1.com1"/>

<LISTENER NAME="con2.com2"/>

</PROPERTY>

<LISTENER NAME="con1.com2"/>

</EVENT>

</WIRING>

</COMPONENT>

<COMPONENT NAME="con2.com2" CLASSNAME="subcomponent" SEQNO="2">

<PROPERTY-SET>

<PROPERTY NAME="con2.com2.prop1" TYPE="String">

<PROPERTY-VALUE TYPE="STRING" INDEX="0" VALUE="abc"/>

<PROPERTY-VALUE TYPE="STRING" INDEX="1" VALUE="def"/>

<PROPERTY-VALUE TYPE="STRING" INDEX="2" VALUE="ghi"/>

</PROPERTY>

</PROPERTY-SET>

</COMPONENT>

</CONTAINER>

</STRUCTURE>

</CONFIGURATION>

Reply via email to