package org.eclipse.uml2.diagram.sequence.model.builder;
import java.util.HashMap;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDAbstractMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDBehaviorSpec;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDCombinedFragment;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDExecution;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDFactory;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDFrame;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDGate;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDGateMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDGateMessageEnd;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDInteractionOperand;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDInvocation;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDLifeLine;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDMountingRegion;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDSimpleNode;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDTrace;
import org.eclipse.uml2.uml.CombinedFragment;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.ExecutionSpecification;
import org.eclipse.uml2.uml.Gate;
import org.eclipse.uml2.uml.InteractionFragment;
import org.eclipse.uml2.uml.InteractionOperand;
import org.eclipse.uml2.uml.Lifeline;
import org.eclipse.uml2.uml.Message;
import org.eclipse.uml2.uml.OccurrenceSpecification;
public class SDBuilderTrace implements SDTrace {
private final HashMap<ExecutionSpecification, SDBehaviorSpec> myExecutionSpecs;
private final HashMap<Message, SDAbstractMessage> myMessages;
private final HashMap<Lifeline, SDLifeLine> myLifelines;
private final HashMap<InteractionFragment, SDFrame> myFrames;
public SDBuilderTrace(){
myExecutionSpecs = new HashMap<ExecutionSpecification, SDBehaviorSpec>();
myMessages = new HashMap<Message, SDAbstractMessage>();
myLifelines = new HashMap<Lifeline, SDLifeLine>();
myFrames = new HashMap<InteractionFragment, SDFrame>();
}
void clear(){
myExecutionSpecs.clear();
myMessages.clear();
myLifelines.clear();
}
public SDGate bindNewGate(Gate umlGate){
SDGate result = SDFactory.eINSTANCE.createSDGate();
result.setUmlGate(umlGate);
return result;
}
public SDGateMessageEnd bindGateMessageEnd(OccurrenceSpecification umlMessageEnd){
SDGateMessageEnd result = SDFactory.eINSTANCE.createSDGateMessageEnd();
result.setUmlMessageEnd(umlMessageEnd);
return result;
}
public SDGateMessage bindGateMessage(Message umlMessage){
SDGateMessage result = SDFactory.eINSTANCE.createSDGateMessage();
result.setUmlMessage(umlMessage);
return result;
}
public SDSimpleNode bindNewSimpleNode(InteractionFragment umlSimpleFragment){
SDSimpleNode result = SDFactory.eINSTANCE.createSDSimpleNode();
result.setUmlSimpleFragment(umlSimpleFragment);
return result;
}
public SDMountingRegion bindNewMountingRegion(SDFrame frame){
SDMountingRegion result = SDFactory.eINSTANCE.createSDMountingRegion();
result.setFrame(frame);
return result;
}
public SDLifeLine bindNewLifeline(Lifeline umlLifeline){
assert umlLifeline != null;
SDLifeLine result = SDFactory.eINSTANCE.createSDLifeLine();
result.setUmlLifeline(umlLifeline);
SDLifeLine oldOne = myLifelines.put(umlLifeline, result);
if (oldOne != null){
throw new SDBuilderInternalProblem("Only one SDLifeline is expected for :" + umlLifeline + ", old: " + oldOne);
}
return result;
}
public SDExecution bindNewExecution(ExecutionSpecification umlSpec){
SDExecution result = SDFactory.eINSTANCE.createSDExecution();
bind(umlSpec, result);
return result;
}
public SDInvocation bindNewInvocation(ExecutionSpecification umlSpec){
SDInvocation result = SDFactory.eINSTANCE.createSDInvocation();
bind(umlSpec, result);
return result;
}
public SDMessage bindNewMessage(Message umlMessage){
SDMessage result = SDFactory.eINSTANCE.createSDMessage();
bind(umlMessage, result);
return result;
}
public SDGateMessage bindNewGateMessage(Message umlMessage){
SDGateMessage result = SDFactory.eINSTANCE.createSDGateMessage();
bind(umlMessage, result);
return result;
}
public SDInteractionOperand bindNewInteractionOperand(InteractionOperand umlOperand){
SDInteractionOperand result = SDFactory.eINSTANCE.createSDInteractionOperand();
bindFrame(umlOperand, result);
result.setUmlInteractionOperand(umlOperand);
return result;
}
public SDCombinedFragment bindNewCombinedFragment(CombinedFragment umlCombined){
SDCombinedFragment result = SDFactory.eINSTANCE.createSDCombinedFragment();
bindFrame(umlCombined, result);
result.setUmlCombinedFragment(umlCombined);
return result;
}
private void bindFrame(InteractionFragment umlFrame, SDFrame sdFrame){
checkBindToNull(umlFrame, sdFrame);
SDFrame oldOne = myFrames.put(umlFrame, sdFrame);
if (oldOne != null){
throw new SDBuilderInternalProblem("Only one SDFrame is expected for :" + umlFrame + ", old: " + oldOne + ", new: " + sdFrame);
}
}
private void bind(Message umlMessage, SDAbstractMessage sdMessage){
checkBindToNull(umlMessage, sdMessage);
SDAbstractMessage oldOne = myMessages.put(umlMessage, sdMessage);
if (oldOne != null){
throw new SDBuilderInternalProblem("Only one SDMessage is expected for :" + umlMessage + ", old: " + oldOne + ", new: " + sdMessage);
}
sdMessage.setUmlMessage(umlMessage);
}
private void bind(ExecutionSpecification umlSpec, SDBehaviorSpec sdSpec){
if (umlSpec == null){
if (sdSpec instanceof SDExecution){
throw new SDBuilderInternalProblem("SDExecution should always be backed by uml ExecutionSpec: " + sdSpec);
}
//for invocations its probably ok
return;
}
checkBindToNull(umlSpec, sdSpec);
SDBehaviorSpec oldOne = myExecutionSpecs.put(umlSpec, sdSpec);
if (oldOne != null){
//rollback?
throw new SDBuilderInternalProblem("Only one SDBehaviorSpec is expected for :" + umlSpec + ", old: " + oldOne + ", new: " + sdSpec);
}
sdSpec.setUmlExecutionSpec(umlSpec);
}
public SDBehaviorSpec findBehaviorSpec(ExecutionSpecification umlSpec){
return myExecutionSpecs.get(umlSpec);
}
public SDAbstractMessage findMessage(Message umlMessage){
return myMessages.get(umlMessage);
}
public SDLifeLine findLifeLine(Lifeline umlLifeline){
return myLifelines.get(umlLifeline);
}
public SDCombinedFragment findCombinedFragment(CombinedFragment umlCombinedFragment) {
return (SDCombinedFragment) myFrames.get(umlCombinedFragment);
}
public SDInteractionOperand findInteractionOperand(InteractionOperand umlOperand) {
return (SDInteractionOperand)myFrames.get(umlOperand);
}
private static void checkBindToNull(Element umlElement, Object sdElement){
if (sdElement == null){
throw new SDBuilderInternalProblem("Can't bind to null: " + umlElement);
}
}
}