package coding.coderising.litestruts;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;
/**
* @author jiaxun
*/
public class Struts {
public static View runAction(String actionName, Map<String, String> parameters) {
if (StringUtils.isEmpty(actionName)) return null;
DOMParser parser = new DOMParser();
Document document = parser.parse("src/coding/coderising/litestruts/struts.xml");
Element rootElement = document.getDocumentElement();
NodeList actionList = rootElement.getElementsByTagName("action");
if (actionList == null || actionList.getLength() == 0) return null;
for (int i = 0, len = actionList.getLength(); i < len; i++) {
Element element = (Element) actionList.item(i);
String name = element.getAttribute("name");
if (actionName.equals(name)) {
return handleAction((Element) actionList.item(i), parameters);
}
}
return null;
}
private static View handleAction(Element element, Map<String, String> parameters) {
String className = element.getAttribute("class");
try {
Class clazz = Class.forName(className);
Object object = clazz.newInstance();
for (Map.Entry<String, String> entry : parameters.entrySet()) {
String methodStr = "set" + entry.getKey().toUpperCase().substring(0, 1) +
entry.getKey().substring(1);
Method method = clazz.getMethod(methodStr, String.class);
method.invoke(object, entry.getValue());
}
Method execute = clazz.getMethod("execute");
String result = (String) execute.invoke(object);
Map<String, String> getParams = new HashMap<>();
Field[] fields = clazz.getDeclaredFields();
if (fields != null && fields.length > 0) {
for (int i = 0, len = fields.length; i < len; i++) {
PropertyDescriptor pd = new PropertyDescriptor(fields[i].getName(), clazz);
Method getMethod = pd.getReadMethod();
if (getMethod != null) {
getParams.put(fields[i].getName(), (String) getMethod.invoke(object));
}
}
}
NodeList nodeList = element.getElementsByTagName("result");
for (int i = 0; i < nodeList.getLength(); i++) {
Element resultElement = (Element) nodeList.item(i);
String name = resultElement.getAttribute("name");
if ("success".equals(name) && Constants.ACTION_SUCCESS.equals(result)) {
return createView(resultElement, getParams);
}
if ("failure".equals(name) && Constants.ACTION_FAILURE.equals(result)) {
return createView(resultElement, getParams);
}
if ("error".equals(name) && Constants.ACTION_ERROR.equals(result)) {
return createView(resultElement, getParams);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static View createView(Element element, Map<String, String> parameters) {
View view = new View();
view.setJsp(element.getTextContent());
view.setParameters(parameters);
return view;
}
}