in runtime/src/main/java/com/google/cloud/verticals/foundations/dataharmonization/function/java/JavaFunction.java [156:242]
public static Signature generateSignature(
String packageName,
Method javaFunction,
List<Converter<?>> converters,
boolean firstArgIsRuntimeContext,
boolean inheritParentVars) {
// TODO(): Support void outputs.
if (!Data.class.isAssignableFrom(javaFunction.getReturnType())) {
throw new IllegalArgumentException(
String.format(
"Java Method %s's return type is of an unsupported type %s.",
javaFunction.getName(), javaFunction.getReturnType().getSimpleName()));
}
List<Class<? extends Data>> argTypes = new ArrayList<>(javaFunction.getParameterCount());
Parameter[] parameters = javaFunction.getParameters();
for (int i = 0; i < parameters.length; i++) {
if (firstArgIsRuntimeContext && i == 0) {
continue;
}
Parameter parameter = parameters[i];
Class<?> parameterType = parameter.getType();
if (parameter.isVarArgs()) {
parameterType = parameterType.getComponentType();
}
Class<? extends Data> dataType;
Converter<?> converter;
// TODO (): define asClass in Primitive to handle casting from primitives to java
// native data types. After that we only need noop converter.
if (String.class.equals(parameterType)) {
dataType = Primitive.class;
converter = new StringConverter();
} else if (Boolean.class.equals(parameterType)) {
dataType = Primitive.class;
converter = new BooleanConverter();
} else if (Double.class.equals(parameterType)) {
dataType = Primitive.class;
converter = new DoubleConverter();
} else if (Long.class.equals(parameterType)) {
dataType = Primitive.class;
converter = new LongConverter();
} else if (Integer.class.equals(parameterType)) {
dataType = Primitive.class;
converter = new IntegerConverter();
} else if (NullData.class.equals(parameterType)) {
dataType = NullData.class;
converter = new NullConverter();
} else if (Primitive.class.isAssignableFrom(parameterType)) {
dataType = parameterType.asSubclass(Primitive.class);
converter = new NoopConverter(dataType);
} else if (Container.class.isAssignableFrom(parameterType)) {
dataType = parameterType.asSubclass(Container.class);
converter = new NoopConverter(dataType);
} else if (Array.class.isAssignableFrom(parameterType)) {
dataType = parameterType.asSubclass(Array.class);
converter = new NoopConverter(dataType);
} else if (Dataset.class.isAssignableFrom(parameterType)) {
dataType = parameterType.asSubclass(Dataset.class);
converter = new NoopConverter(dataType);
} else if (Data.class.isAssignableFrom(parameterType)) {
dataType = parameterType.asSubclass(Data.class);
converter = new NoopConverter(dataType);
} else if (RuntimeContext.class.isAssignableFrom(parameterType)) {
throw new IllegalArgumentException(
String.format(
"Java Method %s's parameter is a %s parameter, but only the first parameter can be"
+ " a %s (and it cannot be variadic).",
javaFunction.getName(),
RuntimeContext.class.getSimpleName(),
RuntimeContext.class.getSimpleName()));
} else {
throw new IllegalArgumentException(
String.format(
"Java Method %s's parameter %s is of an unsupported type %s.",
javaFunction.getName(), parameter.getName(), parameterType.getSimpleName()));
}
argTypes.add(dataType);
converters.add(converter);
}
return new Signature(
packageName, javaFunction.getName(), argTypes, javaFunction.isVarArgs(), inheritParentVars);
}