GeethanadhP / xml-avro

Convert XSD -> AVSC and XML -> AVRO
Apache License 2.0
36 stars 26 forks source link

Bug in SchemaBuilder.processGroup() ? #7

Closed rcasey212 closed 5 years ago

rcasey212 commented 5 years ago

Hi @roycem90,

I have not yet dug into your code here to understand it fully, but I did find a bug.

In the SchemaBuilder class (in.dreamlabs.xmlavro.SchemaBuilder) ... in the processGroup function ... the match on group.GetCompositor has cases for only 2 of the 3 possible XSModelGroup enumerations. It appears that the case for "COMPOSITOR_ALL" is missing.

I say this only because I'm attempting to use this program and I get the following exception:

Exception in thread "main" scala.MatchError: 3 (of class java.lang.Short)
    at in.dreamlabs.xmlavro.SchemaBuilder.processGroup(SchemaBuilder.scala:129)
    at in.dreamlabs.xmlavro.SchemaBuilder.processParticle(SchemaBuilder.scala:229)
    at in.dreamlabs.xmlavro.SchemaBuilder.createFields(SchemaBuilder.scala:239)
    at in.dreamlabs.xmlavro.SchemaBuilder.createRecord(SchemaBuilder.scala:306)
    at in.dreamlabs.xmlavro.SchemaBuilder.$anonfun$processType$1(SchemaBuilder.scala:107)
    at scala.collection.MapLike.getOrElse(MapLike.scala:128)
    at scala.collection.MapLike.getOrElse$(MapLike.scala:126)
    at scala.collection.AbstractMap.getOrElse(Map.scala:59)
    at in.dreamlabs.xmlavro.SchemaBuilder.processType(SchemaBuilder.scala:107)
    at in.dreamlabs.xmlavro.SchemaBuilder.createField(SchemaBuilder.scala:278)
    at in.dreamlabs.xmlavro.SchemaBuilder.$anonfun$processGroupParticle$2(SchemaBuilder.scala:175)
    at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at in.dreamlabs.xmlavro.SchemaBuilder.processGroupParticle(SchemaBuilder.scala:168)
    at in.dreamlabs.xmlavro.SchemaBuilder.processGroup(SchemaBuilder.scala:151)
    at in.dreamlabs.xmlavro.SchemaBuilder.$anonfun$processGroupParticle$2(SchemaBuilder.scala:178)
    at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
    at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
    at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
    at in.dreamlabs.xmlavro.SchemaBuilder.processGroupParticle(SchemaBuilder.scala:168)
    at in.dreamlabs.xmlavro.SchemaBuilder.processGroup(SchemaBuilder.scala:151)
    at in.dreamlabs.xmlavro.SchemaBuilder.processParticle(SchemaBuilder.scala:229)
    at in.dreamlabs.xmlavro.SchemaBuilder.createFields(SchemaBuilder.scala:239)
    at in.dreamlabs.xmlavro.SchemaBuilder.createRecord(SchemaBuilder.scala:306)
    at in.dreamlabs.xmlavro.SchemaBuilder.$anonfun$processType$1(SchemaBuilder.scala:107)
    at scala.collection.MapLike.getOrElse(MapLike.scala:128)
    at scala.collection.MapLike.getOrElse$(MapLike.scala:126)
    at scala.collection.AbstractMap.getOrElse(Map.scala:59)
    at in.dreamlabs.xmlavro.SchemaBuilder.processType(SchemaBuilder.scala:107)
    at in.dreamlabs.xmlavro.SchemaBuilder.$anonfun$createSchema$2(SchemaBuilder.scala:66)
    at scala.collection.TraversableLike$WithFilter.$anonfun$foreach$1(TraversableLike.scala:789)
    at scala.collection.Iterator.foreach(Iterator.scala:929)
    at scala.collection.Iterator.foreach$(Iterator.scala:929)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1406)
    at scala.collection.IterableLike.foreach(IterableLike.scala:71)
    at scala.collection.IterableLike.foreach$(IterableLike.scala:70)
    at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
    at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:788)
    at in.dreamlabs.xmlavro.SchemaBuilder.createSchema(SchemaBuilder.scala:62)
    at in.dreamlabs.xmlavro.Converter.convertXSD(Converter.scala:25)
    at in.dreamlabs.xmlavro.Converter.<init>(Converter.scala:13)
    at in.dreamlabs.xmlavro.Converter$.apply(Converter.scala:52)
    at in.dreamlabs.xmlavro.Converter$.main(Converter.scala:49)
    at in.dreamlabs.xmlavro.Converter.main(Converter.scala)

Any help you can provide would be greatly appreciated. Thanks!

rcasey212 commented 5 years ago

Based on my limited understand of XSD, I believe that in this case, "xsd:all" can be handled in the same way as "xsd:sequence" as Avro schema are not concerned by the ordering of elements.

To get past this bug, I changed the line in SchemaBuilder.processGroup

case XSModelGroup.COMPOSITOR_SEQUENCE  =>

to the following:

case XSModelGroup.COMPOSITOR_SEQUENCE | XSModelGroup.COMPOSITOR_ALL =>

This handles both "xsd:all" and "xsd:sequence" in the same manner.

GeethanadhP commented 5 years ago

i remember fixing it couple of days ago, sorry i think i haven't merged it into master (thanks for reminding) :) i had a colleague send the same error

GeethanadhP commented 5 years ago

done updated the master branch :)