Thanks Doug,

I will open an issue - yeah - i hadn't gotten around to looking at your source 
control, and because my codebase depended on new DatumReader factory methods in 
1.7.5. I couldn't quickly go back and see if this broke recently (and whether 
those two lines were added for some reason)

Graham

On Sep 17, 2013, at 12:20 PM, Doug Cutting <[email protected]> wrote:

> Graham,
> 
> This does indeed look like a bug that affects printing of both enum
> and fixed schemas that have a namespace when nested within a record
> with no namespace.  The fix seems as simple as the following:
> 
> --- Schema.java (revision 1522738)
> +++ Schema.java (working copy)
> @@ -458,8 +458,6 @@
>       if (space != null) {
>         if (!space.equals(names.space()))
>           gen.writeStringField("namespace", space);
> -        if (names.space() == null)                // default namespace
> -          names.space(space);
>       } else if (names.space() != null) {         // null within non-null
>         gen.writeStringField("namespace", "");
>       }
> 
> Please file an issue in Jira.
> 
> Thanks,
> 
> Doug
> 
> On Mon, Sep 16, 2013 at 6:58 PM, graham sanderson <[email protected]> wrote:
>> 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

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to