/**
* 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.Collections;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.command.CopyCommand;
import org.eclipse.emf.edit.command.InitializeCopyCommand;
import org.eclipse.emf.mapping.domain.MappingDomain;
/**
* This command overrides the InitializeCopyCommand for cross-domain copies.
* This implementation is a no-op unless the objects are suitable ECore classes,
* in which case it copies the name and possibly the eType.
* Application specific subclasses should override execute() to complete the initialization, if necessary.
*/
public class InitializeCopyOverrideCommand extends AbstractCommand
{
/**
* This keeps track of the mapping domain in which the command operates.
*/
protected MappingDomain mappingDomain;
/**
* This is command we're overriding
*/
protected InitializeCopyCommand initializeCommand;
/**
* This creates a command instance that initializes a copied object
*/
public InitializeCopyOverrideCommand(MappingDomain domain, InitializeCopyCommand initializeCommand)
{
super(initializeCommand.doGetLabel(), initializeCommand.doGetDescription());
this.mappingDomain = domain;
this.initializeCommand = initializeCommand;
}
@Override
protected boolean prepare()
{
return true;
}
public void execute()
{
EObject owner = initializeCommand.getOwner();
EObject copy = initializeCommand.getCopy();
CopyCommand.Helper copyHelper = initializeCommand.getCopyHelper();
/*
if (owner.refMetaObject() == copy.refMetaObject())
{
initializeCommand.doExecute();
return;
}
*/
// Copy the children references
//
Collection<Object> copyChildren = new ArrayList<Object>();
for (Object copyChildObject : mappingDomain.getChildren(owner))
{
if (copyChildObject instanceof EObject)
{
EObject copyChild = copyHelper.getCopy((EObject)copyChildObject);
if (copyChild != null)
{
copyChildren.add(copyChild);
}
}
}
if (!copyChildren.isEmpty()) {
Command addCommand = AddCommand.create(mappingDomain, copy, null, copyChildren);
if (addCommand.canExecute())
{
addCommand.execute(); // this will create the mapping as well
}
else
{
addCommand.dispose();
return;
}
}
// Copy the name
//
String ownerName = mappingDomain.getName(owner);
if (ownerName != null)
{
mappingDomain.setName(copy, mappingDomain.getOutputName(ownerName));
}
// Copy the type
//
Object ownerType = mappingDomain.getTypeClassifier(owner);
if (ownerType != null)
{
Object copyType = mappingDomain.getOutputTypeClassifier(ownerType);
if (copyType != null)
{
mappingDomain.setTypeClassifier(copy, copyType);
}
}
}
@Override
public void undo()
{
// no-op
}
public void redo()
{
// no-op
}
@Override
public Collection<?> getResult()
{
return Collections.singleton(initializeCommand.getCopy());
}
@Override
public Collection<?> getAffectedObjects()
{
return Collections.singleton(initializeCommand.getCopy());
}
/**
* 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: " + initializeCommand.getOwner() + ")");
result.append(" (copy: " + initializeCommand.getCopy() + ")");
return result.toString();
}
}