You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlbeans-user@xml.apache.org by "Dunlop, Aaron" <aa...@transcore.com> on 2003/12/31 00:44:51 UTC

Type Substitution Issue

I'm working with a schema defining a type substitution group. When I parse a
document matching that schema, I can re-output it as XML appropriately. When
I try to manually create an equivalent instance, it serializes using the
abstract element name and specifying a type separately.

This test case exposes the difference. The complete schema is included at
the end of this posting.

    public void testDirectoryOperation() throws Exception
    {
        StringBuffer sb = new StringBuffer(256);
        sb.append("<sch:DirectoryRequest
xmlns:sch=\"http://www.tcore.com/schema\"
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
        sb.append("    <sch:lookupResource>\n");
        sb.append("      <resourceName>test.resource</resourceName>\n");
        sb.append("    </sch:lookupResource>\n");
        sb.append("    <sender>sender</sender>\n");
        sb.append("    <sendTo>sender</sendTo>\n");
        sb.append("</sch:DirectoryRequest>\n");
        
        // First, create a DirectoryRequestDocument instance by parsing a
String.
        com.tcore.schema.DirectoryRequestDocument xmlRequest =
com.tcore.schema.DirectoryRequestDocument.Factory.parse(sb.toString());
        assertTrue(xmlRequest.validate());

        // Now, create what should be an equivalent DirectoryRequestDocument
instance manually.
        com.tcore.schema.DirectoryRequestDocument xmlRequest2 =
com.tcore.schema.DirectoryRequestDocument.Factory.newInstance();
 
xmlRequest2.setDirectoryRequest(com.tcore.schema.DirectoryRequestDocument.Di
rectoryRequest.Factory.newInstance());
        xmlRequest2.getDirectoryRequest().setSender("sender");
        xmlRequest2.getDirectoryRequest().setSendTo("sender");
        com.tcore.schema.LookupResource lookupResource =
com.tcore.schema.LookupResource.Factory.newInstance();
        lookupResource.setResourceName("test.resource");
 
xmlRequest2.getDirectoryRequest().setDirectoryOperation(lookupResource);
        
        // The two instances should be equivalent
        assertEquals(xmlRequest.toString(), xmlRequest2.toString());

        // Now try validating the instance we created manually.
        XmlOptions validateOptions = new XmlOptions();
        ArrayList errorList = new ArrayList();
        validateOptions.setErrorListener(errorList);

        if (!xmlRequest2.validate(validateOptions))
        {
            StringBuffer errors = new StringBuffer(256);

            for (int i = 0; i < errorList.size(); i++)
            {
                errors.append(((XmlError) errorList.get(i)).getMessage() +
"\n");
            }

            fail(errors.toString());
        }
    }

The test results in the following output (formatted slightly for
readability)

junit.framework.ComparisonFailure: 

  expected:
  <...lookupResource>
    <resourceName>test.resource</resourceName>
  </sch:lookupResource...>

  but was:

  <...directoryOperation xsi:type="sch:LookupResource">
    <resourceName>test.resource</resourceName>
  </sch:directoryOperation...>
...

Additionally, if I skip the 'assertEquals' call, validating xmlRequest2
fails with the following error:

junit.framework.AssertionFailedError: Element
'directoryOperation@http://www.tcore.com/schema' is abstract and cannot be
used in an instance.

For some reason the instance I created manually serializes into an invalid
document. Any idea what I'm doing wrong?

Thanks in advance,

Aaron Dunlop

----------------------------------------------Schema------------------------
-----------------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.tcore.com/schema"
    xmlns:tcore="http://www.tcore.com/schema"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:import schemaLocation="ControlMessages.xsd"
namespace="http://www.tcore.com/schema"/>

  <xs:complexType name="Resource">
    <xs:annotation/>
    <xs:sequence>
      <xs:element name="resourceName" type="xs:string"/>

      <xs:element name="resourceType">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="hyperbus"/>
            <xs:enumeration value="service"/>
            <xs:enumeration value="adapter"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>

      <xs:element maxOccurs="unbounded" minOccurs="0"
          name="property" type="tcore:CsbData"/>
    </xs:sequence>
  </xs:complexType>
    
  <!-- 
	//======================================================
	// The base type for a directory operation
	//======================================================
	-->
  <xs:complexType name="DirectoryOperationType" abstract="true"/>
  <xs:element name="directoryOperation" type="tcore:DirectoryOperationType"
abstract="true"/>
  <!-- 
	//======================================================
	// And for a directory result
	//======================================================
	-->
  <xs:complexType name="DirectoryResultType" abstract="true"/>
  <xs:element name="directoryResult" type="tcore:DirectoryResultType"
abstract="true"/>

  <!-- 
	//======================================================
	// Operations and results
	//======================================================
	-->
  <xs:complexType name="RegisterResource">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryOperationType">
        <xs:sequence>
	      <xs:element name="resource" type="tcore:Resource"/>
	    </xs:sequence>
	  </xs:extension>
	</xs:complexContent>
  </xs:complexType>
  <xs:element name="registerResource" type="tcore:RegisterResource"
substitutionGroup="tcore:directoryOperation"/>

  <xs:complexType name="RegisterResourceResult">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryResultType">
        <xs:sequence>
          <xs:element name="success" type="xs:boolean"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="registerResourceResult"
type="tcore:RegisterResourceResult"
substitutionGroup="tcore:directoryResult"/>

  <xs:complexType name="UnregisterResource">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryOperationType">
        <xs:sequence>
          <xs:element name="resourceName" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="unregisterResource" type="tcore:UnregisterResource"
substitutionGroup="tcore:directoryOperation"/>

  <xs:complexType name="UnregisterResourceResult">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryResultType">
        <xs:sequence>
          <xs:element name="success" type="xs:boolean"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="unregisterResourceResult"
type="tcore:UnregisterResourceResult"
substitutionGroup="tcore:directoryResult"/>

  <xs:complexType name="LookupResource">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryOperationType">
        <xs:sequence>
          <xs:element name="resourceName" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="lookupResource" type="tcore:LookupResource"
substitutionGroup="tcore:directoryOperation"/>

  <xs:complexType name="LookupResourceResult">
    <xs:complexContent>
      <xs:extension base="tcore:DirectoryResultType">
        <xs:sequence>
          <xs:element name="resource" type="tcore:Resource"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="lookupResourceResult" type="tcore:LookupResourceResult"
substitutionGroup="tcore:directoryResult"/>
    
  <!-- 
	//======================================================
	// Request and Response
	//======================================================
	-->
  <xs:element name="DirectoryRequest">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tcore:directoryOperation"/>
        <xs:element name="sender" type="tcore:CsbID"/>
        <xs:element name="sendTo" type="tcore:CsbID"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="DirectoryResponse">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="tcore:directoryResult"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>


- ---------------------------------------------------------------------
To unsubscribe, e-mail:   xmlbeans-user-unsubscribe@xml.apache.org
For additional commands, e-mail: xmlbeans-user-help@xml.apache.org
Apache XMLBeans Project -- URL: http://xml.apache.org/xmlbeans/