use of org.talend.sdk.component.api.input.PartitionSize 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