package org.kisst.gft.action; import java.io.PrintWriter; import java.util.LinkedHashMap; import org.kisst.gft.admin.WritesHtml; import org.kisst.gft.task.Task; import org.kisst.gft.task.TaskDefinition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ActionList extends ActionExecutor implements Action, WritesHtml { final static Logger logger=LoggerFactory.getLogger(ActionList.class); private final LinkedHashMap<String,Action> actions=new LinkedHashMap<String,Action>(); private final TaskDefinition taskdef; public ActionList(ActionCreator creator, TaskDefinition taskdef, String[] parts) { super(taskdef.getProps()); this.taskdef=taskdef; for (String name: parts) { name=name.trim(); Action a=createAction(creator, name); if (a==null) throw new RuntimeException("Unknown action "+name); this.actions.put(name,a); } } public static Action createAction(ActionCreator creator, TaskDefinition taskdef, Class<?> defaultActionClass) { String actions=taskdef.getProps().getString("actions", null); if (actions==null) return creator.createAction(taskdef, defaultActionClass); String[] parts=actions.split(","); if (parts.length==1) { return creator.createAction(taskdef,parts[0].trim()); } else return new ActionList(creator, taskdef, parts); } @Override public boolean safeToRetry() { return false; } // TODO: @Override public void execute(Task task) { for (String name: actions.keySet()) { Action a=actions.get(name); execute(a,name,task); } } public boolean contains(Class<?> cls) { for (Action a: actions.values()) { if (cls.isAssignableFrom(a.getClass())) return true; } return false; } public Action createAction(ActionCreator creator, String name) { try { return creator.createAction(taskdef, name); } catch (RuntimeException e) { throw new RuntimeException("Error when creating action "+name+" in channel "+name,e); } } @Override public void writeHtml(PrintWriter out) { out.println("<h2>Actions</h2>"); out.println("<table>"); for (Action act: actions.values()) { out.println("<tr><td>"+act.toString()+"</td></tr>"); } out.println("</table>"); } }