blob: aae0e180c01b968b519c87b21630742387737758 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.process.command;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.edit.LibraryEditResources;
import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.edit.util.ActivityHandler;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;
/**
* @author Phong Nguyen Le - Jul 6, 2006
* @since 1.0
*/
public class LocallyReplaceAndDeepCopyCommand extends ReplaceActivityCommand {
/**
* @param wrapper
*/
public LocallyReplaceAndDeepCopyCommand(BreakdownElementWrapperItemProvider wrapper) {
super(wrapper);
setLabel(LibraryEditResources.localReplacementAndDeepCopy_text);
}
/* (non-Javadoc)
* @see org.eclipse.epf.library.edit.process.command.ReplaceActivityCommand#doVary()
*/
protected void doVary() {
// deep copy the activity
//
Activity activity = (Activity) TngUtil.unwrap(wrapper);
if(!UserInteractionHelper.confirmDeepCopy(Collections.singletonList(activity))) {
return;
}
Process targetProcess = (Process) wrapper.getTopItem();
MethodConfiguration deepCopyConfig = null;
try {
deepCopyConfig = UserInteractionHelper.chooseDeepCopyConfiguration(targetProcess, wrapper.getAdapterFactory());
}
catch(OperationCanceledException e) {
return;
}
ActivityHandler activityHandler = new ActivityHandler();
activityHandler.setDeepCopyConfig(deepCopyConfig);
activityHandler.setTargetProcess(targetProcess);
activityHandler.deepCopy(activity);
Activity copy = (Activity) activityHandler.getActivities().get(0);
super.doVary();
// replace the local replacement with deep copy
//
int pos = createdActivities.size() - 1;
Activity localReplacement = (Activity) createdActivities.get(pos);
for (Iterator iter = localReplacement.getOppositeFeatures().iterator(); iter.hasNext();) {
OppositeFeature oppositeFeature = (OppositeFeature) iter.next();
Object value = localReplacement.getOppositeFeatureValue(oppositeFeature);
if(value != null) {
EStructuralFeature feature = oppositeFeature.getTargetFeature();
if(oppositeFeature.isMany()) {
for (Iterator iterator = new ArrayList(((Collection)value)).iterator(); iterator
.hasNext();) {
EObject o = (EObject) iterator.next();
if(feature.isMany()) {
List list = (List) o.eGet(feature);
list.remove(localReplacement);
list.add(copy);
}
else {
o.eSet(feature, copy);
}
}
}
else {
EObject o = (EObject) value;
if(feature.isMany()) {
List list = (List) o.eGet(feature);
list.remove(localReplacement);
list.add(copy);
}
else {
o.eSet(feature, copy);
}
}
}
}
createdActivities.set(pos, copy);
copy.setVariabilityBasedOnElement(localReplacement.getVariabilityBasedOnElement());
copy.setVariabilityType(localReplacement.getVariabilityType());
copy.setPresentedAfter(localReplacement.getPresentedAfter());
copy.setPresentedBefore(localReplacement.getPresentedBefore());
Activity superAct = localReplacement.getSuperActivities();
int id = superAct.getBreakdownElements().indexOf(localReplacement);
superAct.getBreakdownElements().set(id, copy);
// add copy package to the package of super activity
//
((ProcessPackage)superAct.eContainer()).getChildPackages().add(copy.eContainer());
}
}