private static Map<String, DoFnSignature.FieldAccessDeclaration> analyzeFieldAccessDeclaration( ErrorReporter errors, Class<?> fnClazz) { Map<String, FieldAccessDeclaration> fieldAccessDeclarations = new HashMap<>(); for (Field field : declaredFieldsWithAnnotation(DoFn.FieldAccess.class, fnClazz, DoFn.class)) { field.setAccessible(true); DoFn.FieldAccess fieldAccessAnnotation = field.getAnnotation(DoFn.FieldAccess.class); if (!Modifier.isFinal(field.getModifiers())) { errors.throwIllegalArgument( "Non-final field %s annotated with %s. Field access declarations must be final.", field.toString(), DoFn.FieldAccess.class.getSimpleName()); continue; } Class<?> fieldAccessRawType = field.getType(); if (!fieldAccessRawType.equals(FieldAccessDescriptor.class)) { errors.throwIllegalArgument( "Field %s annotated with %s, but the value was not of type %s", field.toString(), DoFn.FieldAccess.class.getSimpleName(), FieldAccessDescriptor.class.getSimpleName()); } fieldAccessDeclarations.put( fieldAccessAnnotation.value(), FieldAccessDeclaration.create(fieldAccessAnnotation.value(), field)); } return fieldAccessDeclarations; }
public void addFieldAccessDeclaration(FieldAccessDeclaration decl) { fieldAccessDeclarations.put(decl.id(), decl); }
checkArgument( fieldAccessDeclaration != null, "No FieldAccessDeclaration defined with id", id); checkArgument(fieldAccessDeclaration.field().getType().equals(FieldAccessDescriptor.class)); try { fieldAccessDescriptor = (FieldAccessDescriptor) fieldAccessDeclaration.field().get(fn); } catch (IllegalAccessException e) { throw new RuntimeException(e);
checkArgument( fieldAccessDeclaration != null, "No FieldAccessDeclaration defined with id", id); checkArgument(fieldAccessDeclaration.field().getType().equals(FieldAccessDescriptor.class)); try { fieldAccessDescriptor = (FieldAccessDescriptor) fieldAccessDeclaration.field().get(fn); } catch (IllegalAccessException e) { throw new RuntimeException(e);
@Test public void testFieldAccess() throws IllegalAccessException { FieldAccessDescriptor descriptor = FieldAccessDescriptor.withFieldNames("foo", "bar"); DoFn<String, String> doFn = new DoFn<String, String>() { @FieldAccess("foo") final FieldAccessDescriptor fieldAccess = descriptor; @ProcessElement public void process(@FieldAccess("foo") Row row) {} }; DoFnSignature sig = DoFnSignatures.getSignature(doFn.getClass()); assertThat(sig.fieldAccessDeclarations().get("foo"), notNullValue()); Field field = sig.fieldAccessDeclarations().get("foo").field(); assertThat(field.getName(), equalTo("fieldAccess")); assertThat(field.get(doFn), equalTo(descriptor)); assertThat(sig.processElement().getRowParameter(), notNullValue()); }