in src/main/java/com/amazonaws/services/simpleworkflow/flow/pojo/POJOActivityImplementationFactory.java [222:299]
private void addActivities(Object implementation, Class<?> interfaze, Map<String, Method> methods,
ParentInterfaceOptions parentOptions, DataConverter converter, Set<ActivityType> addedTypes)
throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException {
Activities activitiesAnnotation = interfaze.getAnnotation(Activities.class);
for (Class<?> parent : interfaze.getInterfaces()) {
addActivities(implementation, parent, methods, parentOptions, converter, addedTypes);
}
if (activitiesAnnotation != null) {
String interfaceName = interfaze.getSimpleName();
if (!nullOrEmpty(activitiesAnnotation.activityNamePrefix())) {
parentOptions.setPrefix(activitiesAnnotation.activityNamePrefix());
}
if (!nullOrEmpty(activitiesAnnotation.version())) {
parentOptions.setVersion(activitiesAnnotation.version());
}
converter = (converter == null) ? createConverter(activitiesAnnotation.dataConverter()) : converter;
ActivityRegistrationOptions interfaceRegistrationOptionsAnnotation = interfaze.getAnnotation(ActivityRegistrationOptions.class);
SkipTypeRegistration interfaceSkipTypeRegistrationAnnotation = interfaze.getAnnotation(SkipTypeRegistration.class);
if (interfaceRegistrationOptionsAnnotation != null) {
if (interfaceSkipTypeRegistrationAnnotation != null) {
throw new IllegalArgumentException(
"@ActivityRegistrationOptions is not allowed for the interface annotated with @SkipTypeRegistration.");
}
parentOptions.setRegistrationOptions(interfaceRegistrationOptionsAnnotation);
}
else if (interfaceSkipTypeRegistrationAnnotation != null) {
parentOptions.setSkipRegistration(true);
}
for (Method method : interfaze.getMethods()) {
if (!method.getDeclaringClass().equals(interfaze)) {
continue;
}
Activity activityAnnotation = method.getAnnotation(Activity.class);
ActivityType activityType = getActivityType(interfaceName, method, activityAnnotation, parentOptions);
ActivityRegistrationOptions registrationOptionsAnnotation = method.getAnnotation(ActivityRegistrationOptions.class);
SkipTypeRegistration skipTypeRegistrationAnnotation = interfaze.getAnnotation(SkipTypeRegistration.class);
ActivityTypeRegistrationOptions registrationOptions = null;
if (skipTypeRegistrationAnnotation != null) {
if (registrationOptionsAnnotation != null) {
throw new IllegalArgumentException(
"@ActivityRegistrationOptions is not allowed for the method annotated with @SkipTypeRegistration: "
+ method);
}
}
else {
if (registrationOptionsAnnotation != null || parentOptions.getRegistrationOptions() != null) {
POJOActivityImplementation existingImplementation = implementationsMap.get(activityType);
if (existingImplementation != null && !addedTypes.contains(activityType)) {
String message = "Duplicate declaration for activity type=" + activityType.getName() + ", version="
+ activityType.getVersion() + ": " + existingImplementation.getMethod() + " and " + method;
throw new IllegalArgumentException(message);
}
registrationOptions = createRegistrationOptions(registrationOptionsAnnotation,
parentOptions.getRegistrationOptions());
}
else if (!parentOptions.isSkipRegistration()) {
throw new IllegalArgumentException(
"No @ActivityRegistrationOptions found either on interface or method for " + method);
}
}
//TODO: support methods defined in parents as well as overrides
if (!addedTypes.contains(activityType)) {
Method activityImplementationMethod = implementation.getClass().getMethod(method.getName(),
method.getParameterTypes());
ActivityTypeExecutionOptions executionOptions = createExecutionOptions(activityType,
activityImplementationMethod);
POJOActivityImplementation activityImplementation = new POJOActivityImplementation(implementation, method,
registrationOptions, executionOptions, converter);
activityTypesToRegister.add(activityType);
addedTypes.add(activityType);
implementationsMap.put(activityType, activityImplementation);
}
}
}
}