public Procedure(String schema, String name, List<Argument> arguments, MethodHandle methodHandle)
{
this.schema = checkNotNullOrEmpty(schema, "schema").toLowerCase(ENGLISH);
this.name = checkNotNullOrEmpty(name, "name").toLowerCase(ENGLISH);
this.arguments = unmodifiableList(new ArrayList<>(arguments));
this.methodHandle = requireNonNull(methodHandle, "methodHandle is null");
Set<String> names = new HashSet<>();
for (Argument argument : arguments) {
checkArgument(names.add(argument.getName()), "Duplicate argument name: " + argument.getName());
}
checkArgument(!methodHandle.isVarargsCollector(), "Method must have fixed arity");
checkArgument(methodHandle.type().returnType() == void.class, "Method must return void");
long parameterCount = methodHandle.type().parameterList().stream()
.filter(type -> !ConnectorSession.class.isAssignableFrom(type))
.count();
checkArgument(parameterCount == arguments.size(), "Method parameter count must match arguments");
}