package org.eclipse.uml2.diagram.timing.edit.policies.create;
import org.eclipse.uml2.diagram.timing.model.timingd.DBlock;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegment;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegmentElement;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegmentEnd;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegmentStart;
import org.eclipse.uml2.diagram.timing.model.timingd.DStateSwitch;
import org.eclipse.uml2.diagram.timing.model.timingd.DTick;
import org.eclipse.uml2.diagram.timing.model.timingd.DValueLine;
import org.eclipse.uml2.diagram.timing.model.timingd.TimingDFactory;
import org.eclipse.uml2.uml.Interaction;
public class SemanticHelper {
public static DStateSwitch createSemanticSwitch(DSegmentEnd from, DSegmentStart to){
DSegment fromSegment = from.getSegment();
DSegment toSegment = to.getSegment();
DValueLine fromState = fromSegment.getState();
DValueLine toState = toSegment.getState();
DBlock block = fromState.getBlock();
if (block != toState.getBlock()){
throw new IllegalStateException("Switch can't cross the block boundaries: from: " + from + ", to: " + to);
}
DStateSwitch newSwitch = TimingDFactory.eINSTANCE.createDStateSwitch();
reconnectSource(newSwitch, from);
reconnectTarget(newSwitch, to);
block.getSwitches().add(newSwitch);
return newSwitch;
}
public static void reconnectSource(DStateSwitch stateSwitch, DSegmentEnd newSource){
DSegmentEnd currentSource = stateSwitch.getFromSegmentEnd();
if (currentSource != null && currentSource.equals(newSource)){
return;
}
stateSwitch.setFromSegmentEnd(newSource);
stateSwitch.setFromSegment(newSource.getSegment());
stateSwitch.setFromValueLine(newSource.getSegment().getState());
}
public static void reconnectTarget(DStateSwitch stateSwitch, DSegmentStart newTarget){
DSegmentStart currentTarget = stateSwitch.getToSegmentStart();
if (currentTarget != null && currentTarget.equals(newTarget)){
return;
}
stateSwitch.setToSegmentStart(newTarget);
stateSwitch.setToSegment(newTarget.getSegment());
stateSwitch.setToValueLine(newTarget.getSegment().getState());
}
public static void attachTickToCircle(DTick tick, DSegmentElement circle){
tick.setSubject(circle);
tick.setOccurrence(circle == null ? null : circle.getOccurrence());
}
public static String newStateInvariantName(Interaction interaction){
int size = interaction.getFragments().size();
return "Fragment" + String.valueOf(size + 1);
}
}