diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/ArrayVisitor.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/ArrayVisitor.java index 81ae18830..b70c6c7d7 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/ArrayVisitor.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/ArrayVisitor.java @@ -19,16 +19,16 @@ public class ArrayVisitor implements SchemaBuilder { protected final JavaType _type; - - protected final DefinedSchemas _schemas; + + protected final VisitorFormatWrapperImpl _visitorWrapper; protected Schema _elementSchema; - - public ArrayVisitor(SerializerProvider p, JavaType type, DefinedSchemas schemas) + + public ArrayVisitor(SerializerProvider p, JavaType type, VisitorFormatWrapperImpl visitorWrapper) { super(p); _type = type; - _schemas = schemas; + _visitorWrapper = visitorWrapper; } @Override @@ -53,7 +53,7 @@ public Schema builtAvroSchema() { public void itemsFormat(JsonFormatVisitable visitable, JavaType type) throws JsonMappingException { - VisitorFormatWrapperImpl wrapper = new VisitorFormatWrapperImpl(_schemas, getProvider()); + VisitorFormatWrapperImpl wrapper = _visitorWrapper.createChildWrapper(); visitable.acceptJsonFormatVisitor(wrapper, type); _elementSchema = wrapper.getAvroSchema(); } diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/MapVisitor.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/MapVisitor.java index 7a657043c..a99348a15 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/MapVisitor.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/MapVisitor.java @@ -14,17 +14,17 @@ public class MapVisitor extends JsonMapFormatVisitor.Base { protected final JavaType _type; - protected final DefinedSchemas _schemas; - + protected final VisitorFormatWrapperImpl _visitorWrapper; + protected Schema _valueSchema; protected JavaType _keyType; - public MapVisitor(SerializerProvider p, JavaType type, DefinedSchemas schemas) + public MapVisitor(SerializerProvider p, JavaType type, VisitorFormatWrapperImpl visitorWrapper) { super(p); _type = type; - _schemas = schemas; + _visitorWrapper = visitorWrapper; } @Override @@ -57,8 +57,8 @@ public void keyFormat(JsonFormatVisitable handler, JavaType keyType) public void valueFormat(JsonFormatVisitable handler, JavaType valueType) throws JsonMappingException { - VisitorFormatWrapperImpl wrapper = new VisitorFormatWrapperImpl(_schemas, getProvider()); - handler.acceptJsonFormatVisitor(wrapper, valueType); - _valueSchema = wrapper.getAvroSchema(); + VisitorFormatWrapperImpl visitorWrapper = _visitorWrapper.createChildWrapper(); + handler.acceptJsonFormatVisitor(visitorWrapper, valueType); + _valueSchema = visitorWrapper.getAvroSchema(); } } diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/RecordVisitor.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/RecordVisitor.java index b355f549d..8efffc080 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/RecordVisitor.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/RecordVisitor.java @@ -23,7 +23,7 @@ public class RecordVisitor { protected final JavaType _type; - protected final DefinedSchemas _schemas; + protected final VisitorFormatWrapperImpl _visitorWrapper; /** * Tracks if the schema for this record has been overridden (by an annotation or other means), and calls to the {@code property} and @@ -35,11 +35,11 @@ public class RecordVisitor protected List _fields = new ArrayList(); - public RecordVisitor(SerializerProvider p, JavaType type, DefinedSchemas schemas) + public RecordVisitor(SerializerProvider p, JavaType type, VisitorFormatWrapperImpl visitorWrapper) { super(p); _type = type; - _schemas = schemas; + _visitorWrapper = visitorWrapper; // Check if the schema for this record is overridden BeanDescription bean = getProvider().getConfig().introspectDirectClassAnnotations(_type); List subTypes = getProvider().getAnnotationIntrospector().findSubtypes(bean.getClassInfo()); @@ -52,7 +52,7 @@ public RecordVisitor(SerializerProvider p, JavaType type, DefinedSchemas schemas try { for (NamedType subType : subTypes) { JsonSerializer ser = getProvider().findValueSerializer(subType.getType()); - VisitorFormatWrapperImpl visitor = new VisitorFormatWrapperImpl(_schemas, getProvider()); + VisitorFormatWrapperImpl visitor = _visitorWrapper.createChildWrapper(); ser.acceptJsonFormatVisitor(visitor, getProvider().getTypeFactory().constructType(subType.getType())); unionSchemas.add(visitor.getAvroSchema()); } @@ -69,7 +69,7 @@ public RecordVisitor(SerializerProvider p, JavaType type, DefinedSchemas schemas _avroSchema.addProp(meta.key(), meta.value()); } } - schemas.addSchema(type, _avroSchema); + _visitorWrapper.getSchemas().addSchema(type, _avroSchema); } @Override @@ -103,9 +103,9 @@ public void property(String name, JsonFormatVisitable handler, if (_overridden) { return; } - VisitorFormatWrapperImpl wrapper = new VisitorFormatWrapperImpl(_schemas, getProvider()); - handler.acceptJsonFormatVisitor(wrapper, type); - Schema schema = wrapper.getAvroSchema(); + VisitorFormatWrapperImpl visitorWrapper = _visitorWrapper.createChildWrapper(); + handler.acceptJsonFormatVisitor(visitorWrapper, type); + Schema schema = visitorWrapper.getAvroSchema(); _fields.add(new Schema.Field(name, schema, null, (Object) null)); } @@ -124,9 +124,9 @@ public void optionalProperty(String name, JsonFormatVisitable handler, if (_overridden) { return; } - VisitorFormatWrapperImpl wrapper = new VisitorFormatWrapperImpl(_schemas, getProvider()); - handler.acceptJsonFormatVisitor(wrapper, type); - Schema schema = wrapper.getAvroSchema(); + VisitorFormatWrapperImpl visitorWrapper = _visitorWrapper.createChildWrapper(); + handler.acceptJsonFormatVisitor(visitorWrapper, type); + Schema schema = visitorWrapper.getAvroSchema(); if (!type.isPrimitive()) { schema = AvroSchemaHelper.unionWithNull(schema); } @@ -170,9 +170,9 @@ protected Schema.Field schemaFieldForWriter(BeanProperty prop, boolean optional) } ser = prov.findValueSerializer(prop.getType(), prop); } - VisitorFormatWrapperImpl visitor = new VisitorFormatWrapperImpl(_schemas, prov); - ser.acceptJsonFormatVisitor(visitor, prop.getType()); - writerSchema = visitor.getAvroSchema(); + VisitorFormatWrapperImpl visitorWrapper = _visitorWrapper.createChildWrapper(); + ser.acceptJsonFormatVisitor(visitorWrapper, prop.getType()); + writerSchema = visitorWrapper.getAvroSchema(); } /* 23-Nov-2012, tatu: Actually let's also assume that primitive type values diff --git a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/VisitorFormatWrapperImpl.java b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/VisitorFormatWrapperImpl.java index be2d8c164..4b8badb86 100644 --- a/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/VisitorFormatWrapperImpl.java +++ b/avro/src/main/java/com/fasterxml/jackson/dataformat/avro/schema/VisitorFormatWrapperImpl.java @@ -49,6 +49,10 @@ public VisitorFormatWrapperImpl(DefinedSchemas schemas, SerializerProvider p) { _provider = p; } + protected VisitorFormatWrapperImpl createChildWrapper() { + return new VisitorFormatWrapperImpl(_schemas, _provider); + } + @Override public SerializerProvider getProvider() { return _provider; @@ -60,6 +64,10 @@ public void setProvider(SerializerProvider provider) { _provider = provider; } + protected DefinedSchemas getSchemas() { + return _schemas; + } + /* /********************************************************************** /* Extended API @@ -95,14 +103,14 @@ public JsonObjectFormatVisitor expectObjectFormat(JavaType type) { _valueSchema = s; return null; } - RecordVisitor v = new RecordVisitor(_provider, type, _schemas); + RecordVisitor v = new RecordVisitor(_provider, type, this); _builder = v; return v; } @Override public JsonMapFormatVisitor expectMapFormat(JavaType mapType) { - MapVisitor v = new MapVisitor(_provider, mapType, _schemas); + MapVisitor v = new MapVisitor(_provider, mapType, this); _builder = v; return v; } @@ -122,7 +130,7 @@ public Schema builtAvroSchema() { return null; } } - ArrayVisitor v = new ArrayVisitor(_provider, convertedType, _schemas); + ArrayVisitor v = new ArrayVisitor(_provider, convertedType, this); _builder = v; return v; }