/** * 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.Collection; import java.util.Collections; import org.eclipse.emf.common.command.AbstractCommand; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.command.ChildrenToCopyProvider; import org.eclipse.emf.edit.command.CopyCommand; import org.eclipse.emf.edit.command.CreateCopyCommand; import org.eclipse.emf.mapping.MappedObjectState; import org.eclipse.emf.mapping.MappingRoot; import org.eclipse.emf.mapping.domain.MappingDomain; /** * This command overrides the CreateCopyCommand for cross-domain copies. */ public class CreateCopyOverrideCommand extends AbstractCommand implements ChildrenToCopyProvider { /** * This keeps track of the mapping domain in which the command operates. */ protected MappingDomain mappingDomain; /** * This is the object being copied. */ protected EObject owner; /** * This is the copy. */ protected EObject copy; /** * This is a map of objects to their copies */ protected CopyCommand.Helper copyHelper; /** * This creates a command instance that creates a copy of owner. */ public CreateCopyOverrideCommand(MappingDomain domain, CreateCopyCommand createCommand) { super(createCommand.doGetLabel(), createCommand.doGetDescription()); this.mappingDomain = domain; this.owner = createCommand.getOwner(); this.copyHelper = createCommand.getCopyHelper(); } @Override protected boolean prepare() { return true; } public void execute() { // Get the corresponding type. // EClass outputType = (EClass)mappingDomain.getOutputMetaObject(owner.eClass()); if (outputType != null) { // Create the copy from this corresponding type. // copy = outputType.getEPackage().getEFactoryInstance().create(outputType); copyHelper.put(owner, copy); MappingRoot mappingRoot = mappingDomain.getMappingRoot(); if (mappingRoot.isInputObject(owner)) { // This is done to ensure that this new copy is treated as an output by the domain. // The CreateMappingCommand will rely on this setting. // MappedObjectState mappedObjectState = mappingRoot.getMappedObjectState(copy); if (mappedObjectState != null) { mappedObjectState.setOriginatingInput(owner); } } } } @Override public void undo() { copyHelper.remove(owner); } public void redo() { copyHelper.put(owner, copy); } @Override public Collection<?> getResult() { return Collections.singleton(copy); } public Collection<?> getChildrenToCopy() { return mappingDomain.getChildren(owner); } /** * 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(" (owner: " + owner + ")"); result.append(" (copy: " + copy + ")"); result.append(" (copyHelper: " + copyHelper + ")"); return result.toString(); } }