/******************************************************************************* * Copyright (c) 2007 Conselleria de Infraestructuras y Transporte, Generalitat * de la Comunitat Valenciana . 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: Gabriel Merin Cubero (Prodevelop) – Sequence Diagram Implementation * ******************************************************************************/ package org.eclipse.papyrus.diagram.sequence.edit.commands; import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest; import org.eclipse.gmf.runtime.notation.Diagram; import org.eclipse.uml2.uml.BehaviorExecutionSpecification; import org.eclipse.uml2.uml.CallEvent; import org.eclipse.uml2.uml.CreationEvent; import org.eclipse.uml2.uml.DestructionEvent; import org.eclipse.uml2.uml.Element; import org.eclipse.uml2.uml.Event; import org.eclipse.uml2.uml.Interaction; import org.eclipse.uml2.uml.Lifeline; import org.eclipse.uml2.uml.Message; import org.eclipse.uml2.uml.MessageOccurrenceSpecification; import org.eclipse.uml2.uml.MessageSort; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.SendOperationEvent; import org.eclipse.uml2.uml.SendSignalEvent; import org.eclipse.uml2.uml.SignalEvent; import org.eclipse.uml2.uml.UMLPackage; import org.eclipse.papyrus.diagram.common.util.MultiDiagramUtil; import org.eclipse.papyrus.diagram.common.actions.LabelHelper; /** * @generated */ public class MessageTypeLinkCreateCommandCommon extends CreateElementCommand { /** * @generated */ public MessageTypeLinkCreateCommandCommon(CreateRelationshipRequest req) { super(req); } private Package getPackageFromInteraction(Interaction myContainer) { Package interactionPackage = myContainer.getPackage(); while (interactionPackage == null) { if (myContainer.getPackage() == null && myContainer.getEnclosingInteraction() != null) return getPackageFromInteraction(myContainer .getEnclosingInteraction()); else return null; } return interactionPackage; } /** * Main method * * @param myContainer * @param mySource * @param myTarget * @param newMessage * @generated NOT */ protected void doDefaultMessageInitialize(Interaction myContainer, Element mySource, Element myTarget, Message newMessage) { // Events Event sourceEvent = null; Event targetEvent = null; // Package where the interaction is contained. Remeber that an // interaction may be contained withind another interaction. Package interactionPackage = getPackageFromInteraction(myContainer); switch (newMessage.getMessageSort().getValue()) { case MessageSort.SYNCH_CALL: case MessageSort.ASYNCH_CALL: // Create the SendOperationEvent sourceEvent = (SendOperationEvent) interactionPackage .createPackagedElement("SendOperationEvent", UMLPackage.eINSTANCE.getSendOperationEvent()); LabelHelper.INSTANCE.initName(interactionPackage, sourceEvent); // Create the CallEvent targetEvent = (CallEvent) interactionPackage.createPackagedElement( "CallEvent", UMLPackage.eINSTANCE.getCallEvent()); LabelHelper.INSTANCE.initName(interactionPackage, targetEvent); break; case MessageSort.REPLY: sourceEvent = null; targetEvent = null; break; case MessageSort.ASYNCH_SIGNAL: // Create the SendSignalEvent sourceEvent = (SendSignalEvent) interactionPackage .createPackagedElement("SendSignalEvent", UMLPackage.eINSTANCE.getSendSignalEvent()); LabelHelper.INSTANCE.initName(interactionPackage, sourceEvent); // create the SignalEvent (equal to RecieveSignalEvent) targetEvent = (SignalEvent) interactionPackage .createPackagedElement("SignalEvent", UMLPackage.eINSTANCE .getSignalEvent()); LabelHelper.INSTANCE.initName(interactionPackage, targetEvent); break; case MessageSort.DELETE_MESSAGE: // create the SignalEvent (equal to RecieveSignalEvent) targetEvent = (DestructionEvent) interactionPackage .createPackagedElement("DestructionEvent", UMLPackage.eINSTANCE.getDestructionEvent()); LabelHelper.INSTANCE.initName(interactionPackage, targetEvent); break; case MessageSort.CREATE_MESSAGE: // Create the CreationEvent targetEvent = (CreationEvent) interactionPackage .createPackagedElement("CreationEvent", UMLPackage.eINSTANCE.getCreationEvent()); LabelHelper.INSTANCE.initName(interactionPackage, targetEvent); break; } // Create the 2 MessageOcurrenceSpecification MessageOccurrenceSpecification msgSend = (MessageOccurrenceSpecification) myContainer .createFragment("MessageOccurrenceSpecification", UMLPackage.eINSTANCE .getMessageOccurrenceSpecification()); LabelHelper.INSTANCE.initName(myContainer, msgSend); MessageOccurrenceSpecification msgReceive = (MessageOccurrenceSpecification) myContainer .createFragment("MessageOccurrenceSpecification", UMLPackage.eINSTANCE .getMessageOccurrenceSpecification()); LabelHelper.INSTANCE.initName(myContainer, msgReceive); // Initialization of the Message newMessage.setSendEvent(msgSend); newMessage.setReceiveEvent(msgReceive); // Initialization of the MessageOccurrenceSpecifications // msgSend if (sourceEvent != null) msgSend.setEvent(sourceEvent); msgSend.setMessage(newMessage); // Initialize the covered reference Lifeline lifeLine = null; if (mySource instanceof BehaviorExecutionSpecification) { BehaviorExecutionSpecification bes = (BehaviorExecutionSpecification) mySource; if (bes.getCovereds().size() > 0) { lifeLine = bes.getCovereds().get(0); msgSend.getCovereds().add(lifeLine); } } else { lifeLine = (Lifeline) mySource; msgSend.getCovereds().add(lifeLine); } // msgReceive if (targetEvent != null) msgReceive.setEvent(targetEvent); msgReceive.setMessage(newMessage); // Initialize the covered reference lifeLine = null; if (myTarget instanceof BehaviorExecutionSpecification) { BehaviorExecutionSpecification bes = (BehaviorExecutionSpecification) myTarget; if (bes.getCovereds().size() > 0) { lifeLine = bes.getCovereds().get(0); msgReceive.getCovereds().add(lifeLine); } } else { lifeLine = (Lifeline) myTarget; msgReceive.getCovereds().add(lifeLine); } // NOT DONE HERE ANYMORE - Now is responsibility of MessageOrderCommand // Initialization of the BehaviorExecutionSpecifications // BehaviorExecutionSpecification bes; // if (mySource instanceof BehaviorExecutionSpecification) { // bes = (BehaviorExecutionSpecification) mySource; // if (bes.getStart() == null) // bes.setStart(msgSend); // // bes.setFinish(msgSend); // } // // if (myTarget instanceof BehaviorExecutionSpecification) { // bes = (BehaviorExecutionSpecification) myTarget; // if (bes.getStart() == null) // bes.setStart(msgReceive); // // bes.setFinish(msgReceive); // } } /** * @generated * * @author fjcano */ protected Diagram getDiagramFromRequest() { // used in doDefaultElementCreation() if (getRequest().getParameters().get( MultiDiagramUtil.BelongToDiagramSource) != null) { Object parameter = getRequest().getParameters().get( MultiDiagramUtil.BelongToDiagramSource); if (parameter instanceof Diagram) { return (Diagram) parameter; } } return null; } }