@@ -42,10 +42,14 @@ public class ComplexCopier {
4242 * @param output field to write to
4343 */
4444 public static void copy (FieldReader input , FieldWriter output ) {
45- writeValue (input , output );
45+ writeValue (input , output , null );
4646 }
4747
48- private static void writeValue (FieldReader reader , FieldWriter writer ) {
48+ public static void copy (FieldReader input , FieldWriter output , ExtensionTypeWriterFactory extensionTypeWriterFactory ) {
49+ writeValue (input , output , extensionTypeWriterFactory );
50+ }
51+
52+ private static void writeValue (FieldReader reader , FieldWriter writer , ExtensionTypeWriterFactory extensionTypeWriterFactory ) {
4953 final MinorType mt = reader .getMinorType ();
5054
5155 switch (mt ) {
@@ -61,7 +65,7 @@ private static void writeValue(FieldReader reader, FieldWriter writer) {
6165 FieldReader childReader = reader .reader ();
6266 FieldWriter childWriter = getListWriterForReader (childReader , writer );
6367 if (childReader .isSet ()) {
64- writeValue (childReader , childWriter );
68+ writeValue (childReader , childWriter , extensionTypeWriterFactory );
6569 } else {
6670 childWriter .writeNull ();
6771 }
@@ -79,8 +83,8 @@ private static void writeValue(FieldReader reader, FieldWriter writer) {
7983 FieldReader structReader = reader .reader ();
8084 if (structReader .isSet ()) {
8185 writer .startEntry ();
82- writeValue (mapReader .key (), getMapWriterForReader (mapReader .key (), writer .key ()));
83- writeValue (mapReader .value (), getMapWriterForReader (mapReader .value (), writer .value ()));
86+ writeValue (mapReader .key (), getMapWriterForReader (mapReader .key (), writer .key ()), extensionTypeWriterFactory );
87+ writeValue (mapReader .value (), getMapWriterForReader (mapReader .value (), writer .value ()), extensionTypeWriterFactory );
8488 writer .endEntry ();
8589 } else {
8690 writer .writeNull ();
@@ -99,7 +103,7 @@ private static void writeValue(FieldReader reader, FieldWriter writer) {
99103 if (childReader .getMinorType () != Types .MinorType .NULL ) {
100104 FieldWriter childWriter = getStructWriterForReader (childReader , writer , name );
101105 if (childReader .isSet ()) {
102- writeValue (childReader , childWriter );
106+ writeValue (childReader , childWriter , extensionTypeWriterFactory );
103107 } else {
104108 childWriter .writeNull ();
105109 }
@@ -110,6 +114,20 @@ private static void writeValue(FieldReader reader, FieldWriter writer) {
110114 writer .writeNull ();
111115 }
112116 break ;
117+ case EXTENSIONTYPE :
118+ if (extensionTypeWriterFactory == null ) {
119+ throw new IllegalArgumentException ("Must provide ExtensionTypeWriterFactory" );
120+ }
121+ if (reader .isSet ()) {
122+ Object value = reader .readObject ();
123+ if (value != null ) {
124+ writer .addExtensionTypeWriterFactory (extensionTypeWriterFactory );
125+ writer .writeExtension (value );
126+ }
127+ } else {
128+ writer .writeNull ();
129+ }
130+ break ;
113131 <#list vv .types as type ><#list type .minor as minor ><#assign name = minor .class ?cap_first />
114132 <#assign fields = minor .fields !type .fields />
115133 <#assign uncappedName = name ?uncap_first />
@@ -162,6 +180,9 @@ private static FieldWriter getStructWriterForReader(FieldReader reader, StructWr
162180 return (FieldWriter) writer.map(name);
163181 case LISTVIEW:
164182 return (FieldWriter) writer.listView(name);
183+ case EXTENSIONTYPE:
184+ ExtensionWriter extensionWriter = writer.extension(name, reader.getField().getType());
185+ return (FieldWriter) extensionWriter;
165186 default:
166187 throw new UnsupportedOperationException(reader.getMinorType().toString());
167188 }
@@ -186,6 +207,9 @@ private static FieldWriter getListWriterForReader(FieldReader reader, ListWriter
186207 return (FieldWriter) writer.list();
187208 case LISTVIEW:
188209 return (FieldWriter) writer.listView();
210+ case EXTENSIONTYPE:
211+ ExtensionWriter extensionWriter = writer.extension(reader.getField().getType());
212+ return (FieldWriter) extensionWriter;
189213 default:
190214 throw new UnsupportedOperationException(reader.getMinorType().toString());
191215 }
@@ -211,6 +235,9 @@ private static FieldWriter getMapWriterForReader(FieldReader reader, MapWriter w
211235 return (FieldWriter) writer.listView();
212236 case MAP:
213237 return (FieldWriter) writer.map(false);
238+ case EXTENSIONTYPE:
239+ ExtensionWriter extensionWriter = writer.extension(reader.getField().getType());
240+ return (FieldWriter) extensionWriter;
214241 default:
215242 throw new UnsupportedOperationException(reader.getMinorType().toString());
216243 }
0 commit comments