[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