public static Signature generateSignature()

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);
  }