/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jbpm.gd.jpdl.command; import org.eclipse.gef.commands.Command; import org.jbpm.gd.common.model.SemanticElement; import org.jbpm.gd.jpdl.model.AbstractNode; import org.jbpm.gd.jpdl.model.Action; import org.jbpm.gd.jpdl.model.Event; import org.jbpm.gd.jpdl.model.ProcessDefinition; import org.jbpm.gd.jpdl.model.Task; public class JpdlElementAddActionCommand extends Command { private SemanticElement target; private String eventType; private Event event; private Action action; public void setTarget(SemanticElement target) { this.target = target; } public void setActionId(String actionId) { this.eventType = getEventType(actionId); } public void execute() { if (action == null) { createAction(); } if (target instanceof Event) { addAction((Event)target); } else { addAction(target); } } public void undo() { if (target instanceof Event) { removeAction((Event)target); } else { removeAction(event); if (event.getActionElements().length == 0) { removeEvent(target); } } } private void createAction() { action = (Action)target.getFactory().createById("org.jbpm.gd.jpdl.action"); } private void createEvent() { event = (Event)target.getFactory().createById("org.jbpm.gd.jpdl.event"); event.setType(eventType); } private void addAction(Event event) { event.addActionElement(action); } private void removeAction(Event event) { event.removeActionElement(action); } private void removeEvent(SemanticElement element) { if (element instanceof ProcessDefinition) { ((ProcessDefinition)element).removeEvent(event); } else if (element instanceof AbstractNode) { ((AbstractNode)element).removeEvent(event); } else if (element instanceof Task) { ((Task)element).removeEvent(event); } } private void addAction(SemanticElement element) { if (event == null) { prepareEvent(element); } if (event.getActionElements().length == 0) { addEvent(element); } addAction(event); } private void addEvent(SemanticElement element) { if (element instanceof ProcessDefinition) { ((ProcessDefinition)element).addEvent(event); } else if (element instanceof AbstractNode) { ((AbstractNode)element).addEvent(event); } else if (element instanceof Task) { ((Task)element).addEvent(event); } } private Event[] getEvents(SemanticElement element) { if (element instanceof ProcessDefinition) { return ((ProcessDefinition)element).getEvents(); } else if (element instanceof AbstractNode) { return ((AbstractNode)element).getEvents(); } else if (element instanceof Task) { return ((Task)element).getEvents(); } else { return new Event[0]; } } private void prepareEvent(SemanticElement element) { Event[] events = getEvents(element); for (int i = 0; i < events.length; i++) { if (events[i].getType().equals(eventType)) { event = events[i]; } } if (event == null) { createEvent(); } } private String getEventType(String actionId) { if ("beforeSignal".equals(actionId)) return "before-signal"; if ("afterSignal".equals(actionId)) return "after-signal"; if ("nodeEnter".equals(actionId)) return "node-enter"; if ("nodeLeave".equals(actionId)) return "node-leave"; if ("processStart".equals(actionId)) return "process-start"; if ("processEnd".equals(actionId)) return "process-end"; return null; } }