/******************************************************************************* | |
* 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 2.0 | |
* which accompanies this distribution, and is available at | |
* https://www.eclipse.org/legal/epl-2.0/ | |
* | |
* SPDX-License-Identifier: EPL-2.0 | |
* | |
* 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); | |
} | |
} |