/** * Copyright (c) 2002-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 - Initial API and implementation */ package org.eclipse.emf.mapping.command; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.ListIterator; import org.eclipse.emf.common.command.AbstractCommand; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.mapping.Mapping; import org.eclipse.emf.mapping.MappingPackage; import org.eclipse.emf.mapping.MappingRoot; import org.eclipse.emf.mapping.domain.MappingDomain; /** * This command overrides the RemoveCommand to additionally unmap the removed object(s). */ public class RemoveOverrideCommand extends AbstractCommand { /** * This keeps track of the mapping domain in which the command operates. */ protected MappingDomain mappingDomain; /** * This keeps track of the RemoveCommand we're overriding */ protected RemoveCommand removeCommand; /** * This keeps track of the remove mapping command(s) used to implement this command. */ protected Command mapCommand; /** * This creates a command instance that removes and then unmaps the removed object(s). */ public RemoveOverrideCommand(MappingDomain domain, RemoveCommand removeCommand) { super(removeCommand.doGetLabel(), removeCommand.doGetDescription()); this.mappingDomain = domain; this.removeCommand = removeCommand; } @Override protected boolean prepare() { return removeCommand.doCanExecute(); } public void execute() { MappingRoot mappingRoot = mappingDomain.getMappingRoot(); CompoundCommand subcommands = new CompoundCommand(); for (Object removal : removeCommand.getCollection()) { ArrayList<Command> commandList = new ArrayList<Command>(); for (Iterator<?> objects = mappingDomain.treeIterator(removal); objects.hasNext(); ) { Object object = objects.next(); for (Mapping mapping : mappingRoot.getMappings(object)) { Collection<?> outputs = mapping.getOutputs(); if (outputs.size() == 1 && outputs.iterator().next() == object) { commandList.add(RemoveMappingCommand.create(mappingDomain, mapping)); } else { //commandList.add(RemoveCommand.create(mappingDomain, mapping, mapping.ePackageMapping().getMapping_Outputs(), object)); commandList.add(RemoveCommand.create(mappingDomain, mapping, MappingPackage.eINSTANCE.getMapping_Outputs(), object)); } } } for (ListIterator<Command> commands = commandList.listIterator(commandList.size()); commands.hasPrevious(); ) { subcommands.appendAndExecute(commands.previous()); } } mapCommand = !subcommands.isEmpty() ? subcommands.unwrap() : null; removeCommand.doExecute(); } @Override public void undo() { removeCommand.doUndo(); if (mapCommand != null) { mapCommand.undo(); } } public void redo() { if (mapCommand != null) { mapCommand.redo(); } removeCommand.doRedo(); } @Override public void dispose() { if (mapCommand != null) { mapCommand.dispose(); } removeCommand.doDispose(); } @Override public Collection<?> getResult() { return removeCommand.doGetResult(); } @Override public Collection<?> getAffectedObjects() { return removeCommand.doGetAffectedObjects(); } /** * This gives an abbreviated name using this object's own class' name, without package qualification, * followed by a space separated list of <tt>field:value</tt> pairs. */ @Override public String toString() { StringBuffer result = new StringBuffer(super.toString()); result.append(" (mappingDomain: " + mappingDomain + ")"); result.append(" (mapCommand: " + mapCommand + ")"); return result.toString(); } }