| /******************************************************************************* |
| * 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.ArrayList; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| 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.common.util.TreeIterator; |
| import org.eclipse.emf.ecore.EObject; |
| |
| |
| |
| /** |
| * This command clears references from model objects outside deletedSet to any objects inside |
| * deletedSet. All objects reachable by eTreeIterator() from an object in the modelRootSet are |
| * considered. |
| * |
| * NOTE: This command clears non-containment references ONLY! |
| * |
| * This command is used in various cases where we delete model objects, to ensure that no dangling |
| * references are left behind. |
| */ |
| public class DeleteNonContainmentRefsCommand extends AutoUndoCommand { |
| |
| private Set<Object> fDeletingSet, fModelRootSet; |
| |
| /** |
| * @param deletingSet |
| * @param modelRootSet |
| */ |
| |
| public DeleteNonContainmentRefsCommand(Set<Object> deletingSet, Set<Object> modelRootSet) { |
| super(new ArrayList<Object>()); |
| |
| this.fDeletingSet = deletingSet; |
| this.fModelRootSet = modelRootSet; |
| for(Object n : modelRootSet) { |
| addModelRoot(n); |
| } |
| } |
| |
| /** |
| * @see org.eclipse.bpel.ui.commands.util.AutoUndoCommand#doExecute() |
| */ |
| @Override |
| public void doExecute() { |
| if (!canExecute()) { |
| throw new IllegalStateException(); |
| } |
| |
| // Build the set of "all model objects" and subtract. |
| HashSet<Object> notDeletingSet = new HashSet<Object>(); |
| for (Object root : fModelRootSet) { |
| for (TreeIterator it2 = ModelHelper.getAllContents(root); it2.hasNext(); ) { |
| notDeletingSet.add(it2.next()); |
| } |
| } |
| notDeletingSet.removeAll(fDeletingSet); |
| |
| // Now iterate over the not-deleted objects, and remove any references they |
| // have to the deleted objects. |
| for (Object next : notDeletingSet) { |
| BPELUtil.deleteNonContainmentRefs((EObject) next, fDeletingSet); |
| } |
| } |
| } |