blob: fa5bd81b2bf7d5cb633c72ba3531ab4ad8df6848 [file]
package org.casbin;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.casbin.jcasbin.main.EnforceResult;
import org.casbin.jcasbin.main.Enforcer;
import org.casbin.resp.ResponseBody;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.*;
public class CommandExecutor {
private NewEnforcer enforcer;
private String inputMethodName;
private String[] inputVal;
public CommandExecutor(NewEnforcer enforcer, String inputMethodName, String[] inputVal) {
this.enforcer = enforcer;
this.inputMethodName = inputMethodName;
this.inputVal = inputVal;
}
public String outputResult() throws InvocationTargetException, IllegalAccessException, JsonProcessingException {
Class<? extends Enforcer> clazz = enforcer.getClass();
Method[] methods = clazz.getMethods();
ResponseBody responseBody = new ResponseBody(null, null);
for (Method method : methods) {
String methodName = method.getName();
if(methodName.equals(inputMethodName)) {
Type[] genericParameterTypes = method.getGenericParameterTypes();
Object[] convertedParams = new Object[genericParameterTypes.length];
Class<?> returnType = method.getReturnType();
if(genericParameterTypes.length == 3 && genericParameterTypes[0] == String.class && genericParameterTypes[1].getTypeName().equals("java.util.List<java.lang.String>") && genericParameterTypes[2].getTypeName().equals("java.util.List<java.lang.String>")) {
convertedParams[0] = inputVal[0];
convertedParams[1] = Arrays.asList(inputVal[1].split(","));
convertedParams[2] = Arrays.asList(inputVal[2].split(","));
} else if(genericParameterTypes.length == 2 && genericParameterTypes[0].getTypeName().equals("java.util.List<java.lang.String>") && genericParameterTypes[1].getTypeName().equals("java.util.List<java.lang.String>")) {
convertedParams[0] = Arrays.asList(inputVal[0].split(","));
convertedParams[1] = Arrays.asList(inputVal[1].split(","));
} else {
for (int i = 0; i < genericParameterTypes.length; i++) {
if(genericParameterTypes[i] == int.class) {
convertedParams[i] = Integer.valueOf(inputVal[i]);
} else if(genericParameterTypes[i] == String.class) {
convertedParams[i] = inputVal[i];
} else if(genericParameterTypes[i] == Object[].class || genericParameterTypes[i] == String[].class) {
convertedParams[i] = Arrays.copyOfRange(inputVal, i, inputVal.length);
} else if (genericParameterTypes[i] == String[][].class) {
String[] arr = Arrays.copyOfRange(inputVal, i, inputVal.length);
String[][] res = new String[arr.length][];
for (int i1 = 0; i1 < res.length; i1++) {
res[i1] = arr[i1].split(",");
}
convertedParams[i] = res;
} else if (genericParameterTypes[i].getTypeName().equals("java.util.List<java.lang.String>")) {
String[] arr = Arrays.copyOfRange(inputVal, i, inputVal.length);
convertedParams[i] = Arrays.asList(arr);
} else if (genericParameterTypes[i].getTypeName().equals("java.util.List<java.util.List<java.lang.String>>")) {
List<List<String>> res = new ArrayList<>();
String[] arr = Arrays.copyOfRange(inputVal, i, inputVal.length);
for (String s : arr) {
List<String> ans = new ArrayList<>();
Collections.addAll(ans, s.split(","));
res.add(ans);
}
convertedParams[i] = res;
}
}
}
Object invoke = method.invoke(enforcer, convertedParams);
if(returnType == boolean.class) {
responseBody.setAllow((Boolean) invoke);
} else if (returnType == List.class) {
responseBody.setExplain((ArrayList<?>) invoke);
} else if (returnType == EnforceResult.class) {
responseBody.setAllow(((EnforceResult) invoke).isAllow());
responseBody.setExplain((ArrayList<?>) ((EnforceResult) invoke).getExplain());
}
enforcer.savePolicy();
break;
}
}
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(responseBody);
}
}