package io.selendroid.server.action; import io.selendroid.server.action.touch.TouchHandler; import io.selendroid.server.common.exceptions.UnsupportedOperationException; import io.selendroid.server.model.SelendroidDriver; import org.json.JSONException; import org.json.JSONObject; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; public abstract class ActionHandler { protected Map<String, Class<? extends Action>> actionMap = new HashMap<String, Class<? extends Action>>(); private static Map<String, ActionHandler> handlerMap = new HashMap<String, ActionHandler>(); static { handlerMap.put("touch", new TouchHandler()); } protected ActionHandler() { init(); } public abstract void init(); public void register(String actionName, Class<? extends Action> actionClass) { actionMap.put(actionName, actionClass); } public void handle(String actionName, SelendroidDriver driver, JSONObject properties, ActionContext context) throws JSONException { Class<? extends Action> actionClass = actionMap.get(actionName); try { Action action = actionClass .getDeclaredConstructor(SelendroidDriver.class) .newInstance(driver); action.perform(properties, context); } catch (IllegalAccessException e) { throw new UnsupportedOperationException("Action: " + actionName + " was not recognised."); } catch (IllegalArgumentException e) { throw new UnsupportedOperationException("Action: " + actionName + " was not recognised."); } catch (InstantiationException e) { throw new UnsupportedOperationException("Action: " + actionName + " was not recognised."); } catch (NoSuchMethodException e) { throw new UnsupportedOperationException("Action: " + actionName + " was not recognised."); } catch (InvocationTargetException e) { throw new UnsupportedOperationException("Action: " + actionName + " was not recognised."); } } public static ActionHandler getHandlerForInputDevice(String inputDevice) { ActionHandler handler = handlerMap.get(inputDevice); if (handler == null) { throw new UnsupportedOperationException("Unreognised input device: " + inputDevice); } return handler; } }