[jboss-svn-commits] JBoss Common SVN: r3543 - in jbossxb/trunk/src: main/java/org/jboss/xb/util and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Sep 28 11:54:19 EDT 2009
Author: alex.loubyansky at jboss.com
Date: 2009-09-28 11:54:18 -0400 (Mon, 28 Sep 2009)
New Revision: 3543
Added:
jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.java
jbossxb/trunk/src/test/resources/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.xsd
Modified:
jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
jbossxb/trunk/src/main/java/org/jboss/xb/util/DefaultSchemaBindingValidator.java
jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/BasicBindingValidatorUnitTestCase.java
Log:
JBXB-222, JBXB-223, JBXB-224
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2009-09-27 00:08:02 UTC (rev 3542)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/builder/JBossXBNoSchemaBuilder.java 2009-09-28 15:54:18 UTC (rev 3543)
@@ -1674,7 +1674,7 @@
elementBinding.setValueAdapter(valueAdapter);
// Bind it to the model
- ParticleBinding particle = new ParticleBinding(elementBinding, 0, 1, isCol);
+ ParticleBinding particle = new ParticleBinding(elementBinding, 0, 1, false);
if (required == false)
particle.setMinOccurs(0);
Modified: jbossxb/trunk/src/main/java/org/jboss/xb/util/DefaultSchemaBindingValidator.java
===================================================================
--- jbossxb/trunk/src/main/java/org/jboss/xb/util/DefaultSchemaBindingValidator.java 2009-09-27 00:08:02 UTC (rev 3542)
+++ jbossxb/trunk/src/main/java/org/jboss/xb/util/DefaultSchemaBindingValidator.java 2009-09-28 15:54:18 UTC (rev 3543)
@@ -223,14 +223,17 @@
public void validate(XSElementDeclaration xsElement, ElementBinding elementBinding)
{
QName xsQName = new QName(xsElement.getNamespace(), xsElement.getName());
- if(xsQName.equals(elementBinding.getQName()))
- handleError("Compared elements have difference names: XSD QName is " + xsQName + ", ElementBinding QName is " + elementBinding.getQName());
+ if(!xsQName.equals(elementBinding.getQName()))
+ handleError("Compared elements have different names: XSD QName is " + xsQName + ", ElementBinding QName is " + elementBinding.getQName());
log("element " + xsQName);
- if(validatedElements.contains(xsQName))
- return;
- validatedElements.add(xsQName);
+ if(xsElement.getScope() == XSConstants.SCOPE_GLOBAL)
+ {
+ if(validatedElements.contains(xsQName))
+ return;
+ validatedElements.add(xsQName);
+ }
validate(xsElement.getTypeDefinition(), elementBinding.getType());
}
@@ -248,11 +251,9 @@
return;
QName xsQName = new QName(xsType.getNamespace(), xsType.getName());
- if(!xsQName.equals(typeBinding.getQName()))
- handleError("Compared types have different names: XSD QName is " + xsQName + ", TypeBinding QName is " + typeBinding.getQName());
-
if(validatedTypes.contains(xsQName) || excludedTypes.contains(xsQName))
return;
+
validatedTypes.add(xsQName);
}
@@ -282,6 +283,20 @@
log("complex type " + xsQName);
+ if(typeBinding.isSimple() &&
+ typeBinding.getQName() != null &&
+ Constants.NS_XML_SCHEMA.equals(typeBinding.getQName().getNamespaceURI()))
+ {
+ // perhaps the complex xsd type is equivalent to the built-in simple type
+ if(xsType.getAttributeUses().getLength() == 0 &&
+ xsType.getAttributeWildcard() == null &&
+ xsType.getParticle() == null)
+ {
+ log(xsQName == null ? "Anonymous" : xsQName + " type is assumed to be equivalent to " + typeBinding.getQName());
+ return;
+ }
+ }
+
if(xsQName == null && typeBinding.getQName() != null ||
xsQName != null && !xsQName.equals(typeBinding.getQName()))
handleError("Compared complex types have different names: XSD QName is " + xsQName + ", TypeBindign QName is " + typeBinding.getQName());
@@ -336,6 +351,7 @@
handleError("ParticleBinding doesn't contain a TermBinding.");
short xsTermType = xsTerm.getType();
String termStr = null;
+ boolean maxOccursUnbounded = particleBinding.getMaxOccursUnbounded();
if(xsTermType == XSConstants.MODEL_GROUP)
{
termStr = "sequence";
@@ -359,7 +375,7 @@
handleError("TermBinding expected to be a " + termStr + " but was " + termBinding);
}
else
- validate(xsModelGroup, (ModelGroupBinding) termBinding);
+ validate(xsModelGroup, particleBinding);
}
else if(xsTermType == XSConstants.ELEMENT_DECLARATION)
{
@@ -371,28 +387,34 @@
{
// TODO sometimes XB wraps (maybe unnecessarily) repeatable elements into a sequence.
// the same xml structure can be described differently in xsd
- if (/*(xsParticle.getMaxOccursUnbounded() || xsParticle.getMaxOccurs() > 1) &&*/
- termBinding instanceof SequenceBinding)
+ // There is a weird array binding structure in XB
+ TermBinding t = termBinding;
+ while (/*(xsParticle.getMaxOccursUnbounded() || xsParticle.getMaxOccurs() > 1) &&*/
+ t instanceof SequenceBinding)
{
- SequenceBinding seq = (SequenceBinding) termBinding;
+ SequenceBinding seq = (SequenceBinding) t;
Collection<ParticleBinding> particles = seq.getParticles();
if(particles.size() == 1)
{
ParticleBinding particle = particles.iterator().next();
- if(particle.getTerm().isElement())
+ if(particle.getMaxOccursUnbounded())
+ maxOccursUnbounded = true;
+ t = particle.getTerm();
+ if(t.isElement())
{
particleBinding = particle;
- termBinding = particle.getTerm();
+ termBinding = t;
}
}
+ else
+ break;
}
if(!termBinding.isElement())
handleError("TermBinding expected to be element " + termStr + " but was " + termBinding);
}
- if(!xsElementName.equals(((ElementBinding)termBinding).getQName()))
- handleError("Compared elements have different names: XSD QName is " + xsElementName + ", ElementBinding QName is " + ((ElementBinding)termBinding).getQName());
+ validate(xsElement, (ElementBinding)termBinding);
}
else if(xsTermType == XSConstants.WILDCARD)
{
@@ -413,16 +435,17 @@
if(xsParticle.getMaxOccursUnbounded())
{
- if(!particleBinding.getMaxOccursUnbounded() && !(termBinding instanceof UnorderedSequenceBinding))
- handleError("XSD particle has maxOccurs unbounded but ParticleBinding of " + particleBinding.getTerm() + " does not.");
+ if(!maxOccursUnbounded && !(termBinding instanceof UnorderedSequenceBinding))
+ handleError("XSD particle of " + termStr + " has maxOccurs unbounded but ParticleBinding of " + particleBinding.getTerm() + " does not.");
}
else if(xsParticle.getMaxOccurs() != particleBinding.getMaxOccurs())
handleError("maxOccurs for particle of " + particleBinding.getTerm() + " don't match: XSD maxOccurs=" + xsParticle.getMaxOccurs() +
", ParticleBinding maxOccurs=" + particleBinding.getMaxOccurs());
}
- public void validate(XSModelGroup xsModelGroup, ModelGroupBinding modelGroupBinding)
+ public void validate(XSModelGroup xsModelGroup, ParticleBinding groupParticle)
{
+ ModelGroupBinding modelGroupBinding = (ModelGroupBinding) groupParticle.getTerm();
short xsCompositor = xsModelGroup.getCompositor();
boolean all = false;
if(xsCompositor == XSModelGroup.COMPOSITOR_SEQUENCE)
@@ -523,7 +546,7 @@
xsElementParticles = new HashMap<QName, XSParticle>();
flatten(xsModelGroup, xsElementParticles);
elementParticles = new HashMap<QName, ParticleBinding>();
- flatten(modelGroupBinding, elementParticles);
+ flatten(groupParticle, elementParticles);
if(xsElementParticles.size() != elementParticles.size())
{
@@ -651,13 +674,21 @@
}
}
- private void flatten(ModelGroupBinding group, Map<QName, ParticleBinding> elementParticles)
+ private void flatten(ParticleBinding groupParticle, Map<QName, ParticleBinding> elementParticles)
{
+ TermBinding groupTerm = groupParticle.getTerm();
+ if(!(groupTerm instanceof ModelGroupBinding))
+ throw new IllegalStateException("The term is expected to be a model group but was " + groupTerm);
+
+ ModelGroupBinding group = (ModelGroupBinding) groupTerm;
+ boolean forceUnbounded = groupParticle.getMaxOccursUnbounded() && group.getParticles().size() == 1;
Iterator<ParticleBinding> i = group.getParticles().iterator();
while(i.hasNext())
{
ParticleBinding particle = i.next();
TermBinding term = particle.getTerm();
+ if(forceUnbounded && !particle.getMaxOccursUnbounded())
+ particle = new ParticleBinding(term, particle.getMinOccurs(), particle.getMaxOccurs(), true);
if(term.isElement())
{
ElementBinding element = (ElementBinding) term;
@@ -668,7 +699,7 @@
else
{
ModelGroupBinding modelGroup = (ModelGroupBinding) term;
- flatten(modelGroup, elementParticles);
+ flatten(particle, elementParticles);
}
}
}
Modified: jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/BasicBindingValidatorUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/BasicBindingValidatorUnitTestCase.java 2009-09-27 00:08:02 UTC (rev 3542)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/BasicBindingValidatorUnitTestCase.java 2009-09-28 15:54:18 UTC (rev 3543)
@@ -241,7 +241,7 @@
}
};
- new AbstractErrorHandler("XSD particle has maxOccurs unbounded but ParticleBinding of wildcard processContents=lax does not.")
+ new AbstractErrorHandler("XSD particle of wildcard has maxOccurs unbounded but ParticleBinding of wildcard processContents=lax does not.")
{
public void handle(SchemaBindingValidator validator, SchemaBinding schema)
{
Added: jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.java
===================================================================
--- jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.java (rev 0)
+++ jbossxb/trunk/src/test/java/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.java 2009-09-28 15:54:18 UTC (rev 3543)
@@ -0,0 +1,54 @@
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2009, JBoss Inc., and individual contributors as indicated
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/
+package org.jboss.test.xb.validator.test;
+
+import org.jboss.test.xb.builder.AbstractBuilderTest;
+import org.jboss.test.xb.validator.support.ValidatorTestRoot;
+import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
+import org.jboss.xb.builder.JBossXBBuilder;
+import org.jboss.xb.util.DefaultSchemaBindingValidator;
+import org.xml.sax.InputSource;
+
+/**
+ * A ImportedSchemaUnitTestCase.
+ *
+ * @author <a href="alex at jboss.com">Alexey Loubyansky</a>
+ * @version $Revision: 1.1 $
+ */
+public class ComplexTypeEquivalentToSimpleUnitTestCase extends AbstractBuilderTest
+{
+ public ComplexTypeEquivalentToSimpleUnitTestCase(String name)
+ {
+ super(name);
+ }
+
+ public void testMain() throws Exception
+ {
+ String xsd = findXML("ComplexTypeEquivalentToSimpleUnitTestCase.xsd");
+ InputSource xsdIs = new InputSource(xsd);
+
+ SchemaBinding schema = JBossXBBuilder.build(ValidatorTestRoot.class);
+
+ DefaultSchemaBindingValidator validator = new DefaultSchemaBindingValidator();
+ validator.validate(xsdIs, schema);
+ }
+}
Added: jbossxb/trunk/src/test/resources/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.xsd
===================================================================
--- jbossxb/trunk/src/test/resources/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.xsd (rev 0)
+++ jbossxb/trunk/src/test/resources/org/jboss/test/xb/validator/test/ComplexTypeEquivalentToSimpleUnitTestCase.xsd 2009-09-28 15:54:18 UTC (rev 3543)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<xsd:schema
+ targetNamespace="urn:jboss:xb:test"
+ xmlns="urn:jboss:xb:test"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+ <xsd:element name="root">
+ <xsd:complexType>
+ <xsd:sequence>
+
+ <xsd:element name="e1" type="interfaceType"/>
+ <xsd:element name="e2" type="xsd:string"/>
+
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="interfaceType">
+ <xsd:annotation>
+ <xsd:documentation>
+ <![CDATA[
+ The interface type represents an interface class.
+ ]]>
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string" />
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+</xsd:schema>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list