use of org.talend.sdk.component.api.input.Emitter in project component-runtime by Talend.
the class ModelVisitorTest method visit.
private List<String> visit(final Class<?> type) {
final ModelVisitor visitor = new ModelVisitor();
final List<String> tracker = new ArrayList<>();
Stream.of(type.getClasses()).sorted(Comparator.comparing(Class::getName)).forEach(nested -> visitor.visit(nested, new ModelListener() {
@Override
public void onPartitionMapper(final Class<?> type, final PartitionMapper partitionMapper) {
tracker.add("@PartitionMapper(" + type.getName() + ")");
}
@Override
public void onEmitter(final Class<?> type, final Emitter emitter) {
tracker.add("@Emitter(" + type.getName() + ")");
}
@Override
public void onProcessor(final Class<?> type, final Processor processor) {
tracker.add("@Processor(" + type.getName() + ")");
}
}, true));
return tracker;
}
use of org.talend.sdk.component.api.input.Emitter in project component-runtime by Talend.
the class ModelVisitor method validatePartitionMapper.
private void validatePartitionMapper(final Class<?> type) {
if (Stream.of(type.getMethods()).filter(m -> getPartitionMapperMethods().anyMatch(m::isAnnotationPresent)).flatMap(m -> getPartitionMapperMethods().filter(m::isAnnotationPresent)).distinct().count() != 3) {
throw new IllegalArgumentException(type + " partition mapper must have exactly one @Assessor, one @Split and one @Emitter methods");
}
//
// now validate the 2 methods of the mapper
//
Stream.of(type.getMethods()).filter(m -> m.isAnnotationPresent(Assessor.class)).forEach(m -> {
if (m.getParameterCount() > 0) {
throw new IllegalArgumentException(m + " must not have any parameter");
}
});
Stream.of(type.getMethods()).filter(m -> m.isAnnotationPresent(Split.class)).forEach(m -> {
// we must do that validation
if (Stream.of(m.getParameters()).filter(p -> !p.isAnnotationPresent(PartitionSize.class) || (p.getType() != long.class && p.getType() != int.class)).count() > 0) {
throw new IllegalArgumentException(m + " must not have any parameter without @PartitionSize");
}
final Type splitReturnType = m.getGenericReturnType();
if (!ParameterizedType.class.isInstance(splitReturnType)) {
throw new IllegalArgumentException(m + " must return a Collection<" + type.getName() + ">");
}
final ParameterizedType splitPt = ParameterizedType.class.cast(splitReturnType);
if (!Class.class.isInstance(splitPt.getRawType()) || !Collection.class.isAssignableFrom(Class.class.cast(splitPt.getRawType()))) {
throw new IllegalArgumentException(m + " must return a List of partition mapper, found: " + splitPt);
}
final Type arg = splitPt.getActualTypeArguments().length != 1 ? null : splitPt.getActualTypeArguments()[0];
if (!Class.class.isInstance(arg) || !type.isAssignableFrom(Class.class.cast(arg))) {
throw new IllegalArgumentException(m + " must return a Collection<" + type.getName() + "> but found: " + arg);
}
});
Stream.of(type.getMethods()).filter(m -> m.isAnnotationPresent(Emitter.class)).forEach(m -> {
// already own all the config
if (m.getParameterCount() > 0) {
throw new IllegalArgumentException(m + " must not have any parameter");
}
});
}
Aggregations