package struts;
import org.dom4j.Element;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
/**
* Created by william on 2017/3/4.
*/
public class Struts {
public static View runAction(String actionName, Map<String, String> parameters) {
Element root = StrutsUtils.getRoot("struts/struts.xml");
View view = new View();
if (root != null) {
Element selectedEle = (Element) root.selectSingleNode("//action[@name='" + actionName + "']");
if (selectedEle != null) {
Class clazz = genClass(selectedEle.attributeValue("class"));
Object target = setValue(parameters, clazz);
String result;
try {
result = (String) clazz.getMethod("execute").invoke(target);
} catch (Exception e) {
throw new RuntimeException("invoke execute have some error", e);
}
Map<String, Object> response = getValue(clazz, target);
view.setParameters(response);
Element selectedResult = (Element) root.selectSingleNode("//action[@name='" + actionName + "']//result[@name='" + result + "']");
view.setJsp(selectedResult == null ? null : selectedResult.getText());
}
}
return view;
}
private static Class genClass(String className) {
Class clazz = null;
try {
clazz = Class.forName(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return clazz;
}
private static Object setValue(Map<String, String> parameters, Class clazz) {
try {
Object target = clazz.newInstance();
if (!StrutsUtils.isEmpty(parameters)) {
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String key = entry.getKey();
if (!StrutsUtils.isEmpty(key)) {
String setterName = new StringBuilder("set").append(key.substring(0, 1).toUpperCase()).append(key.substring(1)).toString();
clazz.getMethod(setterName, String.class).invoke(target, entry.getValue());
}
}
}
return target;
} catch (Exception e) {
throw new RuntimeException("create class instance have some error ", e);
}
}
private static Map<String, Object> getValue(Class clazz, Object target) {
Map<String, Object> resultsMap = new HashMap<String, Object>();
Method[] methods = clazz.getMethods();
for (Method method : methods) {
String fieldName = method.getName();
if (fieldName.startsWith("get") && !fieldName.equals("getClass")) {
try {
Object value = method.invoke(target);
resultsMap.put(new StringBuilder(fieldName.substring(3, 4)).append(fieldName.substring(4)).toString(), value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return resultsMap;
}
}