/** * Translates a Java DoFn parameter to a proto representation. * * <p>Returns {@code null} rather than crashing for parameters that are not yet supported, to * allow legacy Java-based runners to perform a proto round-trip and afterwards use {@link * DoFnSignatures} to analyze. * * <p>The proto definition for parameters is provisional and those parameters that are not needed * for portability will be removed from the enum. */ // Using nullability instead of optional because of shading public static @Nullable RunnerApi.Parameter translateParameter(Parameter parameter) { return parameter.match( new Cases.WithDefault</* @Nullable in Java 8 */ RunnerApi.Parameter>() { @Override public RunnerApi.Parameter dispatch(WindowParameter p) { return RunnerApi.Parameter.newBuilder().setType(Type.Enum.WINDOW).build(); } @Override public RunnerApi.Parameter dispatch(RestrictionTrackerParameter p) { return RunnerApi.Parameter.newBuilder().setType(Type.Enum.RESTRICTION_TRACKER).build(); } @Override // Java 7 + findbugs limitation. The return type is nullable. protected @Nullable RunnerApi.Parameter dispatchDefault(Parameter p) { return null; } }); }
return Parameter.rowParameter(null); } else { methodErrors.checkArgument( paramT.equals(inputT), "@Element argument must have type %s", inputT); return Parameter.elementParameter(paramT); rawType.equals(Instant.class), "@Timestamp argument must have type org.joda.time.Instant."); return Parameter.timestampParameter(); } else if (rawType.equals(TimeDomain.class)) { return Parameter.timeDomainParameter(); } else if (rawType.equals(PaneInfo.class)) { return Parameter.paneInfoParameter(); } else if (rawType.equals(DoFn.ProcessContext.class)) { paramErrors.checkArgument( "ProcessContext argument must have type %s", formatType(expectedProcessContextT)); return Parameter.processContext(); } else if (rawType.equals(DoFn.OnTimerContext.class)) { paramErrors.checkArgument( "OnTimerContext argument must have type %s", formatType(expectedOnTimerContextT)); return Parameter.onTimerContext(); } else if (BoundedWindow.class.isAssignableFrom(rawType)) { methodErrors.checkArgument( "Multiple %s parameters",
static StackManipulation getExtraContextParameter( DoFnSignature.Parameter parameter, final StackManipulation pushDelegate) { return parameter.match( new Cases<StackManipulation>() {
DoFnSignature signature = DoFnSignatures.signatureForDoFn(origFn); for (DoFnSignature.Parameter param : signature.processElement().extraParameters()) { param.match( new DoFnSignature.Parameter.Cases.WithDefault<Void>() { @Override
.extraParameters() .get(1) .match( new Parameter.Cases.WithDefault<Void>() { @Override
@Test public void testSimpleTimerWithContext() throws Exception { DoFnSignature sig = DoFnSignatures.getSignature( new DoFn<KV<String, Integer>, Long>() { @TimerId("foo") private final TimerSpec bizzle = TimerSpecs.timer(TimeDomain.EVENT_TIME); @ProcessElement public void foo(ProcessContext context) {} @OnTimer("foo") public void onFoo(OnTimerContext c) {} }.getClass()); assertThat(sig.timerDeclarations().size(), equalTo(1)); DoFnSignature.TimerDeclaration decl = sig.timerDeclarations().get("foo"); assertThat(decl.id(), equalTo("foo")); assertThat(decl.field().getName(), equalTo("bizzle")); assertThat( sig.onTimerMethods().get("foo").extraParameters().get(0), equalTo((Parameter) Parameter.onTimerContext())); }