| /******************************************************************************* |
| * Copyright (c) 2005, 2012 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.ui.commands; |
| |
| import java.util.HashSet; |
| |
| import org.eclipse.bpel.model.Activity; |
| import org.eclipse.bpel.model.Condition; |
| import org.eclipse.bpel.model.Source; |
| import org.eclipse.bpel.model.Sources; |
| import org.eclipse.bpel.model.Target; |
| import org.eclipse.bpel.model.Targets; |
| import org.eclipse.bpel.ui.BPELUIPlugin; |
| import org.eclipse.bpel.ui.Messages; |
| import org.eclipse.bpel.ui.adapters.IContainer; |
| import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; |
| import org.eclipse.bpel.ui.util.BPELUtil; |
| import org.eclipse.bpel.ui.util.ModelHelper; |
| import org.eclipse.emf.ecore.EObject; |
| |
| |
| /** |
| * Replaces a child activity within its container with a new child actiivty. Tries to keep any common information |
| * between the old and the new child. |
| */ |
| public class ReplaceInContainerCommand extends AutoUndoCommand { |
| |
| //Parent container of the activity to be replaced |
| IContainer container; |
| |
| // These two flags record the command's state from the caller's point of view. |
| // TODO: do we still need these? follow example provided by DeleteChildCommand |
| protected boolean isExecuted, isUndone; |
| |
| private Object parent; |
| private Activity oldActivity, newActivity; |
| |
| // TODO: these should be typed for activities. |
| public ReplaceInContainerCommand(Object parent, Object oldElement, Object newElement) { |
| super(Messages.ReplaceInContainerCommand_Replace_1, (EObject)parent); |
| |
| //The container of the objects |
| this.parent = parent; |
| container = BPELUtil.adapt(parent, IContainer.class); |
| |
| this.oldActivity = (Activity)oldElement; |
| this.newActivity = (Activity)newElement; |
| } |
| |
| // TODO: is there any special reason we catch and ignore these exceptions? |
| // if so it should have comments explaining why |
| private void copyAttributes() { |
| |
| try { |
| newActivity.setName(oldActivity.getName()); |
| } catch (NullPointerException e) { |
| BPELUIPlugin.log(e); |
| // do nothing?? |
| } |
| |
| if (oldActivity.isSetSuppressJoinFailure()) { |
| newActivity.setSuppressJoinFailure(oldActivity.getSuppressJoinFailure()); |
| } |
| |
| newActivity.setDocumentationElement(oldActivity.getDocumentationElement()); |
| newActivity.setEnclosingDefinition(oldActivity.getEnclosingDefinition()); |
| |
| try { |
| ModelHelper.setCreateInstance(newActivity, ModelHelper.getCreateInstance(oldActivity)); |
| } catch (IllegalArgumentException e) { |
| // do nothing |
| } |
| } |
| |
| @Override |
| public void doExecute() { |
| if (!canExecute()) throw new IllegalStateException(); |
| isExecuted = true; |
| |
| // copy all common information from old element to the new |
| copyAttributes(); |
| |
| // Move any links from old to new |
| Sources s = oldActivity.getSources(); |
| if (s != null) { |
| Source[] sources = s.getChildren().toArray(new Source[0]); |
| for (int i = 0; i < sources.length; i++) { |
| sources[i].setActivity(newActivity); |
| } |
| } |
| Targets t = oldActivity.getTargets(); |
| if (t != null) { |
| Target[] targets = t.getChildren().toArray(new Target[0]); |
| for (int i = 0; i < targets.length; i++) { |
| targets[i].setActivity(newActivity); |
| } |
| Condition joinCondition = t.getJoinCondition(); |
| if (joinCondition != null) { |
| // There is already a targets in the destination, |
| // otherwise we wouldn't be in here. |
| newActivity.getTargets().setJoinCondition(joinCondition); |
| } |
| } |
| |
| //replace the old activity with the new activity |
| container.replaceChild(parent, oldActivity, newActivity); |
| |
| //Copy relevant extension information to the new element |
| if (ModelHelper.getExtension(oldActivity) != null) { |
| ModelHelper.setLocation(newActivity, ModelHelper.getLocation(oldActivity)); |
| ModelHelper.setSize(newActivity, ModelHelper.getSize(oldActivity)); |
| } |
| |
| // Figure out which model objects are being deleted. |
| HashSet deletingSet = new HashSet(); |
| ModelHelper.addSubtreeToCollection(oldActivity, deletingSet); |
| } |
| } |