/*****************************************************************************
* Copyright (c) 2009 CEA
*
*
* 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:
* Atos Origin - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.sequence.edit.commands;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
import org.eclipse.papyrus.uml.diagram.sequence.edit.policies.UMLBaseItemSemanticEditPolicy;
import org.eclipse.papyrus.uml.diagram.sequence.util.CommandHelper;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Interaction;
import org.eclipse.uml2.uml.Message;
/**
* @generated
*/
public class Message2CreateCommand extends EditElementCommand {
/**
* Message for create link error
*/
private static final String CREATE_LINK_ERROR_MSG = "Invalid arguments in create link command"; //$NON-NLS-1$
/**
* Message for no container error
*/
private static final String NO_CONTAINER_ERROR_MSG = "There is now valid container for events"; //$NON-NLS-1$
/**
* @generated
*/
protected final EObject source;
/**
* @generated
*/
protected final EObject target;
/**
* @generated
*/
protected Interaction container;
/**
* @generated
*/
public Message2CreateCommand(CreateRelationshipRequest request, EObject source, EObject target) {
super(request.getLabel(), null, request);
this.source = source;
this.target = target;
container = deduceContainer(source, target);
}
/**
* Add a condition on the MOS container
*
* @generated NOT
*/
@Override
public boolean canExecute() {
if(source == null && target == null) {
return false;
}
if(source != null && false == source instanceof Element) {
return false;
}
if(target != null && false == target instanceof Element) {
return false;
}
if(getSource() == null) {
return true; // link creation is in progress; source is not defined yet
}
// target may be null here but it's possible to check constraint
if(getContainer() == null) {
return false;
}
if(getSource() != null && getTarget() != null) {
if(!CommandHelper.hasValidContainer(getRequest())) {
return false;
}
}
return UMLBaseItemSemanticEditPolicy.getLinkConstraints().canCreateMessage_4004(getContainer(), getSource(), getTarget());
}
/**
* added code to create the gate , message occurence and event when a Async message is created.
*
* @generated NOT
*/
@Override
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
if(!canExecute()) {
throw new ExecutionException(CREATE_LINK_ERROR_MSG);
}
Map<Object, Object> parameters = getRequest().getParameters();
/* apex improved start */
Message message = CommandHelper.apexDoCreateMessage(container, null, getSource(), getTarget(), parameters);
/* apex improved end */
/* apex replaced
Message message = CommandHelper.doCreateMessage(container, null, getSource(), getTarget(), parameters);
*/
if(message != null) {
doConfigure(message, monitor, info);
((CreateElementRequest)getRequest()).setNewElement(message);
return CommandResult.newOKCommandResult(message);
}
return CommandResult.newErrorCommandResult(NO_CONTAINER_ERROR_MSG);
}
/**
* @generated
*/
protected void doConfigure(Message newElement, IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
IElementType elementType = ((CreateElementRequest)getRequest()).getElementType();
ConfigureRequest configureRequest = new ConfigureRequest(getEditingDomain(), newElement, elementType);
configureRequest.setClientContext(((CreateElementRequest)getRequest()).getClientContext());
configureRequest.addParameters(getRequest().getParameters());
configureRequest.setParameter(CreateRelationshipRequest.SOURCE, getSource());
configureRequest.setParameter(CreateRelationshipRequest.TARGET, getTarget());
ICommand configureCommand = elementType.getEditCommand(configureRequest);
if(configureCommand != null && configureCommand.canExecute()) {
configureCommand.execute(monitor, info);
}
}
/**
* @generated
*/
@Override
protected void setElementToEdit(EObject element) {
throw new UnsupportedOperationException();
}
/**
* @generated
*/
protected Element getSource() {
return (Element)source;
}
/**
* @generated
*/
protected Element getTarget() {
return (Element)target;
}
/**
* @generated
*/
public Interaction getContainer() {
return container;
}
/**
* Default approach is to traverse ancestors of the source to find instance of container. Modify
* with appropriate logic.
*
* @generated
*/
protected Interaction deduceContainer(EObject source, EObject target) {
// Find container element for the new link.
// Climb up by containment hierarchy starting from the source
// and return the first element that is instance of the container class.
for(EObject element = source; element != null; element = element.eContainer()) {
if(element instanceof Interaction) {
return (Interaction)element;
}
}
return null;
}
}