in src/main/java/com/uber/cadence/internal/sync/POJOActivityTaskHandler.java [67:112]
private void addActivityImplementation(
Object activity, BiFunction<Method, Object, ActivityTaskExecutor> newTaskExecutor) {
if (activity instanceof Class) {
throw new IllegalArgumentException("Activity object instance expected, not the class");
}
Class<?> cls = activity.getClass();
for (Method method : cls.getMethods()) {
if (method.getAnnotation(ActivityMethod.class) != null) {
throw new IllegalArgumentException(
"Found @ActivityMethod annotation on \""
+ method
+ "\" This annotation can be used only on the interface method it implements.");
}
if (method.getAnnotation(MethodRetry.class) != null) {
throw new IllegalArgumentException(
"Found @MethodRetry annotation on \""
+ method
+ "\" This annotation can be used only on the interface method it implements.");
}
}
TypeToken<?>.TypeSet interfaces = TypeToken.of(cls).getTypes().interfaces();
if (interfaces.isEmpty()) {
throw new IllegalArgumentException("Activity must implement at least one interface");
}
for (TypeToken<?> i : interfaces) {
if (i.getType().getTypeName().startsWith("org.mockito")) {
continue;
}
for (Method method : i.getRawType().getMethods()) {
ActivityMethod annotation = method.getAnnotation(ActivityMethod.class);
String activityType;
if (annotation != null && !annotation.name().isEmpty()) {
activityType = annotation.name();
} else {
activityType = InternalUtils.getSimpleName(method);
}
if (activities.containsKey(activityType)) {
throw new IllegalStateException(
activityType + " activity type is already registered with the worker");
}
ActivityTaskExecutor implementation = newTaskExecutor.apply(method, activity);
activities.put(activityType, implementation);
}
}
}