for (Class eachClass : functionClasses) {
if(eachClass.isInterface() || Modifier.isAbstract(eachClass.getModifiers())) {
continue;
}
Function function = null;
try {
function = (Function)eachClass.newInstance();
} catch (Exception e) {
LOG.warn(eachClass + " cannot instantiate Function class because of " + e.getMessage());
continue;
}
String functionName = function.getClass().getAnnotation(Description.class).functionName();
String[] synonyms = function.getClass().getAnnotation(Description.class).synonyms();
String description = function.getClass().getAnnotation(Description.class).description();
String detail = function.getClass().getAnnotation(Description.class).detail();
String example = function.getClass().getAnnotation(Description.class).example();
Type returnType = function.getClass().getAnnotation(Description.class).returnType();
ParamTypes[] paramArray = function.getClass().getAnnotation(Description.class).paramTypes();
String[] allFunctionNames = null;
if(synonyms != null && synonyms.length > 0) {
allFunctionNames = new String[1 + synonyms.length];
allFunctionNames[0] = functionName;
System.arraycopy(synonyms, 0, allFunctionNames, 1, synonyms.length);
} else {
allFunctionNames = new String[]{functionName};
}
for(String eachFunctionName: allFunctionNames) {
for (ParamTypes params : paramArray) {
ParamOptionTypes[] paramOptionArray;
if(params.paramOptionTypes() == null ||
params.paramOptionTypes().getClass().getAnnotation(ParamTypes.class) == null) {
paramOptionArray = new ParamOptionTypes[0];
} else {
paramOptionArray = params.paramOptionTypes().getClass().getAnnotation(ParamTypes.class).paramOptionTypes();
}
Type[] paramTypes = params.paramTypes();
if (paramOptionArray.length > 0)
paramTypes = params.paramTypes().clone();
for (int i=0; i < paramOptionArray.length + 1; i++) {
FunctionDesc functionDesc = new FunctionDesc(eachFunctionName,
function.getClass(), function.getFunctionType(),
CatalogUtil.newSimpleDataType(returnType),
paramTypes.length == 0 ? CatalogUtil.newSimpleDataTypeArray() : CatalogUtil.newSimpleDataTypeArray(paramTypes));
functionDesc.setDescription(description);
functionDesc.setExample(example);