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/