Hi, Here is a condensed example of a problem I just came across
@Test
void testNamespaceBleed() throws Exception {
Schema schema = SchemaBuilder.record("test").fields()
.name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
.name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
.endRecord();
String schemaString = schema.toString(true);
Schema schema2 = new Schema.Parser().parse(schemaString);
Assert.assertEquals(schema, schema2); // one would hope this were true
}
Basically the use case (which may not be very common) is with the first
(namespaced) schema in a record without a namespace being an enum. Because the
serialization of the enum schema does not save and restore the namespace, it
becomes the default namespace (for serialization) of other fields that follow
in the same record (so field2 is written without a namespace since it is in the
default namespace, but when the schema is deserialized the same bug does not
occur and so it appears a "Humbug" rather than "com.foo.Humbug")
Note, the following (and of course most others) all work
@Test
void testNoNamespaceBleed() throws Exception {
// works because the enclosing record has a namespace
Schema schema =
SchemaBuilder.record("test").namespace("com.foo").fields()
.name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
.name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
.endRecord();
String schemaString = schema.toString(true);
Schema schema2 = new Schema.Parser().parse(schemaString);
Assert.assertEquals(schema,schema2);
// works because the enclosing record has a namespace (even though
different)
schema = SchemaBuilder.record("test").namespace("com.bar").fields()
.name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
.name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
.endRecord();
schemaString = schema.toString(true);
schema2 = new Schema.Parser().parse(schemaString);
Assert.assertEquals(schema,schema2);
// works because the enum and the field are in different namespaces
schema = SchemaBuilder.record("test").fields()
.name("field1").type().enumeration("Bar").namespace("com.bar").symbols("x").noDefault()
.name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
.endRecord();
schemaString = schema.toString(true);
schema2 = new Schema.Parser().parse(schemaString);
Assert.assertEquals(schema,schema2);
}
I can open an issue, I just wanted to check with the list first that this is
not intended behavior (which seems unlikely) - I assume this issue affects
fixed schemas too, but I haven't checked
Thanks,
Graham
smime.p7s
Description: S/MIME cryptographic signature
