org.apache.camel.support.component.ApiMethodImpl Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.support.component;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Delegate class for {@link ApiMethod}.
* This class is instantiated by Enumerations for Api Proxy types.
*
* For example:
*
*
* {@code
* public enum HelloWorldMethod implements ApiMethod {
* SAYHI(String.class, "sayHi", ApiMethodArg.from(String.class, "name");
*
* private ApiMethodImpl apiMethod;
*
* private HelloWorldMethods(Class resultType, String name, ApiMethodArg... args) throws IllegalArgumentException {
* this.apiMethod = new ApiMethod(HelloWorld.class, resultType, name, args);
* }
*
* // implement ApiMethod interface
* String getName() { return apiMethod.getName(); }
* Class getResultType() {return apiMethod.getResultType(); }
* List getArgNames() { return apiMethod.getArgNames(); }
* List> getArgTypes() {return apiMethod.getArgTypes(); }
* Method getMethod() { return apiMethod.getMethod(); }
* }
* }
*
*/
public final class ApiMethodImpl implements ApiMethod {
// name, result class, ordered argument names and classes, and Method to invoke
private final String name;
private final Class resultType;
private final List argNames;
private final List> argTypes;
private final Method method;
public ApiMethodImpl(Class proxyType, Class resultType, String name, ApiMethodArg... args) throws IllegalArgumentException {
this.name = name;
this.resultType = resultType;
final List tmpArgNames = new ArrayList<>(args.length);
final List> tmpArgTypes = new ArrayList<>(args.length);
for (ApiMethodArg arg : args) {
tmpArgTypes.add(arg.getType());
tmpArgNames.add(arg.getName());
}
this.argNames = Collections.unmodifiableList(tmpArgNames);
this.argTypes = Collections.unmodifiableList(tmpArgTypes);
// find method in Proxy type
try {
this.method = proxyType.getMethod(name, argTypes.toArray(new Class[args.length]));
} catch (NoSuchMethodException e) {
throw new IllegalArgumentException(
String.format("Missing method %s %s", name, argTypes.toString().replace('[', '(').replace(']', ')')),
e);
}
}
@Override
public String getName() {
return name;
}
@Override
public Class getResultType() {
return resultType;
}
@Override
public List getArgNames() {
return argNames;
}
@Override
public List> getArgTypes() {
return argTypes;
}
@Override
public Method getMethod() {
return method;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("{")
.append("name=").append(name)
.append(", resultType=").append(resultType)
.append(", argNames=").append(argNames)
.append(", argTypes=").append(argTypes)
.append("}");
return builder.toString();
}
}