@Override @SuppressWarnings("unchecked") public T read(Row row, Schema sourceSchema) throws IOException { Preconditions.checkArgument(sourceSchema.getType() == Schema.Type.RECORD, "Source schema must be a record."); initializeRead(sourceSchema); try { Object record = create(type); for (Schema.Field sourceField : sourceSchema.getFields()) { String sourceFieldName = sourceField.getName(); Schema.Field targetField = schema.getField(sourceFieldName); if (targetField == null) { advanceField(); continue; } FieldAccessor fieldAccessor = getFieldAccessor(type, sourceFieldName); fieldAccessor.set(record, read(row, sourceField.getSchema(), targetField.getSchema(), TypeToken.of(fieldAccessor.getType()))); } return (T) record; } catch (Exception e) { throw propagate(e); } }
@Test public void testSetter() { TypeToken<Child> type = TypeToken.of(Child.class); FieldAccessorFactory factory = new ASMFieldAccessorFactory(); Child c = new Child(); c.integer = 10; c.str = "child value"; ((Parent<String>) c).value = "string value"; ((Parent<String>) c).b = true; Child c2 = new Child(); factory.getFieldAccessor(type, "integer").setInt(c2, c.integer); factory.getFieldAccessor(type, "str").set(c2, c.str); factory.getFieldAccessor(type, "value").set(c2, ((Parent) c).value); factory.getFieldAccessor(type, "b").setBoolean(c2, ((Parent) c).b); Assert.assertEquals(c.integer, c2.integer); Assert.assertSame(c.str, c2.str); Assert.assertSame(((Parent) c).value, ((Parent) c2).value); Assert.assertEquals(((Parent) c).b, ((Parent) c2).b); } }
@Test public void testGetter() { TypeToken<Child> type = TypeToken.of(Child.class); FieldAccessorFactory factory = new ASMFieldAccessorFactory(); FieldAccessor accessor = factory.getFieldAccessor(type, "integer"); Assert.assertSame(accessor, factory.getFieldAccessor(type, "integer")); Child c = new Child(); c.integer = 10; c.str = "child value"; ((Parent<String>) c).value = "string value"; ((Parent<String>) c).b = true; Assert.assertEquals(c.integer, accessor.getInt(c)); Assert.assertSame(c.str, factory.getFieldAccessor(type, "str").get(c)); Assert.assertSame(((Parent) c).value, factory.getFieldAccessor(type, "value").get(c)); Assert.assertEquals(((Parent) c).b, factory.getFieldAccessor(type, "b").get(c)); }
@Override @SuppressWarnings("unchecked") public T read(Row row, Schema sourceSchema) throws IOException { Preconditions.checkArgument(sourceSchema.getType() == Schema.Type.RECORD, "Source schema must be a record."); initializeRead(sourceSchema); try { Object record = create(type); for (Schema.Field sourceField : sourceSchema.getFields()) { String sourceFieldName = sourceField.getName(); Schema.Field targetField = schema.getField(sourceFieldName); if (targetField == null) { advanceField(); continue; } FieldAccessor fieldAccessor = getFieldAccessor(type, sourceFieldName); fieldAccessor.set(record, read(row, sourceField.getSchema(), targetField.getSchema(), TypeToken.of(fieldAccessor.getType()))); } return (T) record; } catch (Exception e) { throw propagate(e); } }
@Override protected Object readRecord(Decoder decoder, Schema sourceSchema, Schema targetSchema, TypeToken<?> targetTypeToken) throws IOException { try { Object record = create(targetTypeToken); for (Schema.Field sourceField : sourceSchema.getFields()) { Schema.Field targetField = targetSchema.getField(sourceField.getName()); if (targetField == null) { skip(decoder, sourceField.getSchema()); continue; } FieldAccessor fieldAccessor = getFieldAccessor(targetTypeToken, sourceField.getName()); fieldAccessor.set(record, read(decoder, sourceField.getSchema(), targetField.getSchema(), TypeToken.of(fieldAccessor.getType()))); } return record; } catch (Exception e) { throw propagate(e); } }
@Override protected Object readRecord(Decoder decoder, Schema sourceSchema, Schema targetSchema, TypeToken<?> targetTypeToken) throws IOException { try { Object record = create(targetTypeToken); for (Schema.Field sourceField : sourceSchema.getFields()) { Schema.Field targetField = targetSchema.getField(sourceField.getName()); if (targetField == null) { skip(decoder, sourceField.getSchema()); continue; } FieldAccessor fieldAccessor = getFieldAccessor(targetTypeToken, sourceField.getName()); fieldAccessor.set(record, read(decoder, sourceField.getSchema(), targetField.getSchema(), TypeToken.of(fieldAccessor.getType()))); } return record; } catch (Exception e) { throw propagate(e); } }