rdonkin 2005/01/20 15:09:45 Modified: betwixt/src/java/org/apache/commons/betwixt/schema ComplexType.java Element.java ElementReference.java GlobalComplexType.java GlobalElement.java LocalComplexType.java Schema.java betwixt/src/test/org/apache/commons/betwixt/schema TestSchemaGeneration.java betwixt/src/test/org/apache/commons/betwixt/xmlunit XmlTestCase.java Log: Fixed buggy behaviour when creating schema for beans with cyclic graphs. Unit tests contributed by Susan Liu. Issue#33168 Revision Changes Path 1.3 +20 -6 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/ComplexType.java Index: ComplexType.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/ComplexType.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ComplexType.java 16 Jun 2004 11:21:26 -0000 1.2 +++ ComplexType.java 20 Jan 2005 23:09:44 -0000 1.3 @@ -25,6 +25,9 @@ import org.apache.commons.betwixt.XMLBeanInfo; /** + * Models a <code>complexType</code>. + * Global (top level) complex types are represented by [EMAIL PROTECTED] GlobalComplexType}. + * Locally defined or referenced complex types are represented by [EMAIL PROTECTED] LocalComplexType}. * @author <a href='http://jakarta.apache.org/'>Jakarta Commons Team</a> * @version $Revision$ */ @@ -37,6 +40,17 @@ public ComplexType() {} public ComplexType(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException { + elementDescriptor = fillDescriptor(elementDescriptor, schema); + init(configuration, elementDescriptor, schema); + } + + /** + * @param elementDescriptor + * @param schema + * @return + * @throws IntrospectionException + */ + protected ElementDescriptor fillDescriptor(ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException { if (elementDescriptor.isHollow()) { // need to introspector for filled descriptor Class type = elementDescriptor.getSingularPropertyType(); @@ -46,7 +60,7 @@ XMLBeanInfo filledBeanInfo = schema.introspect(type); elementDescriptor = filledBeanInfo.getElementDescriptor(); } - init(configuration, elementDescriptor, schema); + return elementDescriptor; } protected void init(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException { @@ -79,7 +93,7 @@ * @return */ public List getElements() { - return elements; + return elements; } /** @@ -87,7 +101,7 @@ * @param element */ public void addElement(ElementReference element) { - elements.add(element); + elements.add(element); } /** @@ -104,7 +118,7 @@ * @return */ public List getAttributes() { - return attributes; + return attributes; } /** @@ -112,7 +126,7 @@ * @param attribute */ public void addAttribute(Attribute attribute) { - attributes.add(attribute); + attributes.add(attribute); } } 1.3 +2 -1 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/Element.java Index: Element.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/Element.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- Element.java 16 Jun 2004 11:21:26 -0000 1.2 +++ Element.java 20 Jan 2005 23:09:44 -0000 1.3 @@ -17,6 +17,7 @@ package org.apache.commons.betwixt.schema; /** + * Implmented by <code>element</code> definition. * @author <a href='http://jakarta.apache.org/'>Jakarta Commons Team</a> * @version $Revision$ */ 1.3 +2 -3 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/ElementReference.java Index: ElementReference.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/ElementReference.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ElementReference.java 16 Jun 2004 11:21:26 -0000 1.2 +++ ElementReference.java 20 Jan 2005 23:09:44 -0000 1.3 @@ -42,8 +42,7 @@ public ElementReference(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException { setName(elementDescriptor.getLocalName()); if (elementDescriptor.isHollow()) { - setComplexType( new GlobalComplexType(configuration, elementDescriptor, schema)); - schema.addComplexType(getComplexType()); + setComplexType( schema.addGlobalComplexType( configuration, elementDescriptor )); if (elementDescriptor.isCollective()) { maxOccurs = "unbounded"; } 1.4 +29 -3 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/GlobalComplexType.java Index: GlobalComplexType.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/GlobalComplexType.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- GlobalComplexType.java 4 Oct 2004 22:27:12 -0000 1.3 +++ GlobalComplexType.java 20 Jan 2005 23:09:44 -0000 1.4 @@ -43,10 +43,36 @@ } protected void init(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException { - setName(elementDescriptor.getPropertyType().getName()); - super.init(configuration, elementDescriptor, schema); + setName(nameFromDescriptor( elementDescriptor )); } + /** + * Fills the complex type description. + * @param configuration + * @param elementDescriptor + * @param schema + * @throws IntrospectionException + */ + protected void fill(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor, Schema schema) throws IntrospectionException + { + elementDescriptor = fillDescriptor(elementDescriptor, schema); + super.init(configuration, elementDescriptor, schema); + } + + private String nameFromDescriptor( ElementDescriptor elementDescriptor ) { + return elementDescriptor.getPropertyType().getName(); + } + + /** + * Does the given element descriptor match this complex type? + * @param elementDescriptor + * @return true if the descriptor matches + */ + public boolean matches(ElementDescriptor elementDescriptor) { + String nameFromDescriptor = nameFromDescriptor ( elementDescriptor ); + return nameFromDescriptor.equals(getName()); + } + /** * Gets the name of this type. * @return 1.3 +2 -2 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/GlobalElement.java Index: GlobalElement.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/GlobalElement.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- GlobalElement.java 16 Jun 2004 11:21:26 -0000 1.2 +++ GlobalElement.java 20 Jan 2005 23:09:44 -0000 1.3 @@ -19,7 +19,7 @@ /** - * Models the Element tag in the XML schema. + * Models a global definition of an <code>element</code>. * @author <a href='http://jakarta.apache.org/'>Jakarta Commons Team</a> * @version $Revision$ */ 1.4 +2 -1 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/LocalComplexType.java Index: LocalComplexType.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/LocalComplexType.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- LocalComplexType.java 4 Oct 2004 22:27:12 -0000 1.3 +++ LocalComplexType.java 20 Jan 2005 23:09:44 -0000 1.4 @@ -23,6 +23,7 @@ import org.apache.commons.betwixt.ElementDescriptor; /** + * Models a local <code>complexType</code> definition. * @author <a href='http://jakarta.apache.org/'>Jakarta Commons Team</a> * @version $Revision$ */ 1.4 +28 -4 jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/Schema.java Index: Schema.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/java/org/apache/commons/betwixt/schema/Schema.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- Schema.java 4 Oct 2004 22:27:12 -0000 1.3 +++ Schema.java 20 Jan 2005 23:09:44 -0000 1.4 @@ -120,10 +120,34 @@ elementDescriptor.getLocalName(), elementDescriptor.getPropertyType().getName()); addElement(element); - - GlobalComplexType type = new GlobalComplexType(configuration, elementDescriptor, this); - addComplexType(type); + addGlobalComplexType(configuration, elementDescriptor); } + + /** + * Adds a new global complex type definition matching the given element descriptor. + * If this element descriptor has already been mapped to a global type then + * that is returned. + * @param configuration <code>TranscriptionConfiguration</code>, not null + * @param elementDescriptor <code>ElementDescriptor</code>, not null + * @return <code>GlobalComplexType</code> + * @throws IntrospectionException + */ + public GlobalComplexType addGlobalComplexType(TranscriptionConfiguration configuration, ElementDescriptor elementDescriptor) throws IntrospectionException { + GlobalComplexType type = null; + for (Iterator it = complexTypes.iterator(); it.hasNext();) { + GlobalComplexType complexType = (GlobalComplexType) it.next(); + if (complexType.matches( elementDescriptor )) { + type = complexType; + break; + } + } + if (type == null) { + type = new GlobalComplexType(configuration, elementDescriptor, this); + addComplexType(type); + type.fill(configuration, elementDescriptor, this); + } + return type; + } public boolean equals(Object obj) { boolean result = false; 1.4 +53 -47 jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/schema/TestSchemaGeneration.java Index: TestSchemaGeneration.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/schema/TestSchemaGeneration.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- TestSchemaGeneration.java 4 Oct 2004 22:27:13 -0000 1.3 +++ TestSchemaGeneration.java 20 Jan 2005 23:09:44 -0000 1.4 @@ -131,21 +131,22 @@ String xsd = out.getBuffer().toString(); String expected ="<?xml version='1.0'?><xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" + - "<xsd:element name='OrderLineBean' type='org.apache.commons.betwixt.schema.OrderLineBean'/>" + - "<xsd:complexType name='org.apache.commons.betwixt.schema.ProductBean'>" + - "<xsd:sequence/>" + - "<xsd:attribute name='barcode' type='xsd:string'/>" + - "<xsd:attribute name='code' type='xsd:string'/>" + - "<xsd:attribute name='display-name' type='xsd:string'/>" + - "<xsd:attribute name='name' type='xsd:string'/>" + - "</xsd:complexType>" + - "<xsd:complexType name='org.apache.commons.betwixt.schema.OrderLineBean'>" + - "<xsd:sequence>" + - "<xsd:element name='product' type='org.apache.commons.betwixt.schema.ProductBean' minOccurs='0' maxOccurs='1'/>" + - "</xsd:sequence>" + - "<xsd:attribute name='quantity' type='xsd:string'/>" + - "</xsd:complexType>" + - "</xsd:schema>"; + "<xsd:element name='OrderLineBean' type='org.apache.commons.betwixt.schema.OrderLineBean'/>" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.OrderLineBean'>" + + "<xsd:sequence>" + + "<xsd:element name='product' type='org.apache.commons.betwixt.schema.ProductBean' minOccurs='0' maxOccurs='1'/>" + + "</xsd:sequence>" + + "<xsd:attribute name='quantity' type='xsd:string'/>" + + "</xsd:complexType>" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.ProductBean'>" + + "<xsd:sequence/>" + + "<xsd:attribute name='barcode' type='xsd:string'/>" + + "<xsd:attribute name='code' type='xsd:string'/>" + + "<xsd:attribute name='display-name' type='xsd:string'/>" + + "<xsd:attribute name='name' type='xsd:string'/>" + + "</xsd:complexType>" + + "</xsd:schema>"; + xmlAssertIsomorphicContent(parseString(expected), parseString(xsd), true); } @@ -168,37 +169,42 @@ String xsd = out.getBuffer().toString(); String expected = "<?xml version='1.0'?><xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" + - " <xsd:element name='order-bean' type='org.apache.commons.betwixt.schema.OrderBean'/>" + - " <xsd:complexType name='org.apache.commons.betwixt.schema.CustomerBean'>" + - " <xsd:sequence/>" + - " <xsd:attribute name='code' type='xsd:string'/>" + - " <xsd:attribute name='country' type='xsd:string'/>" + - " <xsd:attribute name='name' type='xsd:string'/>" + - " <xsd:attribute name='postcode' type='xsd:string'/>" + - " <xsd:attribute name='street' type='xsd:string'/>" + - " <xsd:attribute name='town' type='xsd:string'/>" + - " </xsd:complexType>" + - " <xsd:complexType name='org.apache.commons.betwixt.schema.ProductBean'>" + - " <xsd:sequence/>" + - " <xsd:attribute name='barcode' type='xsd:string'/>" + - " <xsd:attribute name='code' type='xsd:string'/>" + - " <xsd:attribute name='display-name' type='xsd:string'/>" + - " <xsd:attribute name='name' type='xsd:string'/>" + - " </xsd:complexType>" + - " <xsd:complexType name='org.apache.commons.betwixt.schema.OrderLineBean'>" + - " <xsd:sequence>" + - " <xsd:element name='product' type='org.apache.commons.betwixt.schema.ProductBean' minOccurs='0' maxOccurs='1'/>" + - " </xsd:sequence>" + - " <xsd:attribute name='quantity' type='xsd:string'/>" + - " </xsd:complexType>" + - " <xsd:complexType name='org.apache.commons.betwixt.schema.OrderBean'>" + - " <xsd:sequence>" + - " <xsd:element name='customer' type='org.apache.commons.betwixt.schema.CustomerBean' minOccurs='0' maxOccurs='1'/>" + - " <xsd:element name='line' type='org.apache.commons.betwixt.schema.OrderLineBean' minOccurs='0' maxOccurs='unbounded'/>" + - " </xsd:sequence>" + - " <xsd:attribute name='code' type='xsd:string'/>" + - " </xsd:complexType>" + - " </xsd:schema>"; + "<xsd:element name='order-bean' type='org.apache.commons.betwixt.schema.OrderBean'/>" + + "" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.OrderBean'>" + + " <xsd:sequence>" + + " <xsd:element name='customer' type='org.apache.commons.betwixt.schema.CustomerBean' minOccurs='0' maxOccurs='1'/>" + + " <xsd:element name='line' type='org.apache.commons.betwixt.schema.OrderLineBean' minOccurs='0' maxOccurs='unbounded'/>" + + " </xsd:sequence>" + + " <xsd:attribute name='code' type='xsd:string'/>" + + "</xsd:complexType>" + + "" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.CustomerBean'>" + + " <xsd:sequence/>" + + " <xsd:attribute name='code' type='xsd:string'/>" + + " <xsd:attribute name='country' type='xsd:string'/>" + + " <xsd:attribute name='name' type='xsd:string'/>" + + " <xsd:attribute name='postcode' type='xsd:string'/>" + + " <xsd:attribute name='street' type='xsd:string'/>" + + " <xsd:attribute name='town' type='xsd:string'/>" + + "</xsd:complexType>" + + "" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.OrderLineBean'>" + + " <xsd:sequence>" + + " <xsd:element name='product' type='org.apache.commons.betwixt.schema.ProductBean' minOccurs='0' maxOccurs='1'/>" + + " </xsd:sequence>" + + " <xsd:attribute name='quantity' type='xsd:string'/>" + + "</xsd:complexType>" + + "" + + "<xsd:complexType name='org.apache.commons.betwixt.schema.ProductBean'>" + + " <xsd:sequence/>" + + " <xsd:attribute name='barcode' type='xsd:string'/>" + + " <xsd:attribute name='code' type='xsd:string'/>" + + " <xsd:attribute name='display-name' type='xsd:string'/>" + + " <xsd:attribute name='name' type='xsd:string'/>" + + " </xsd:complexType>" + + "" + + "</xsd:schema>"; xmlAssertIsomorphicContent(parseString(xsd), parseString(expected)); } 1.14 +7 -0 jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/xmlunit/XmlTestCase.java Index: XmlTestCase.java =================================================================== RCS file: /home/cvs/jakarta-commons/betwixt/src/test/org/apache/commons/betwixt/xmlunit/XmlTestCase.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- XmlTestCase.java 13 Jun 2004 21:32:49 -0000 1.13 +++ XmlTestCase.java 20 Jan 2005 23:09:44 -0000 1.14 @@ -534,6 +534,13 @@ return result; } + + public void xmlAssertIsValid(String document, String schema) + throws ParserConfigurationException, IOException + { + xmlAssertIsValid(new InputSource(new StringReader(document)), new InputSource(new StringReader(schema))); + } + public void xmlAssertIsValid(InputSource documentSource, InputSource schemaSource) throws ParserConfigurationException, IOException {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]