package org.eclipse.uml2.diagram.sequence.model.builder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDAbstractMessage;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDBackedByFragment;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDBracket;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDEntity;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDExecution;
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.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.SDModel;
import org.eclipse.uml2.diagram.sequence.model.sequenced.SDSimpleNode;
import org.eclipse.uml2.diagram.sequence.model.sequenced.util.SDSwitch;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Gate;
import org.eclipse.uml2.uml.Message;
public class SDModelHelper {
public static final SDGate findGate(SDModel model, Gate umlGate) {
for (SDGate next : model.getGates()) {
if (umlGate == next.getUmlGate()) {
return next;
}
}
return null;
}
public static final SDSwitch<Element> UML_ELEMENT_EXTRACTOR = new SDSwitch<Element>() {
@Override
public Element caseSDAbstractMessage(SDAbstractMessage object) {
return object.getUmlMessage();
}
@Override
public Element caseSDModel(SDModel object) {
return object.getUmlInteraction();
}
@Override
public Element caseSDGate(SDGate object) {
return object.getUmlGate();
}
@Override
public Element caseSDGateMessageEnd(SDGateMessageEnd object) {
return object.getUmlMessageEnd();
}
@Override
public Element caseSDLifeLine(SDLifeLine object) {
return object.getUmlLifeline();
}
@Override
public Element caseSDBackedByFragment(SDBackedByFragment object) {
return object.getUmlFragment();
}
};
public static class ChainedElementsCollector extends SDSwitch<Object> {
private final LinkedHashSet<Element> myOutput;
private final HashSet<SDEntity> myProcessedEntitiesGuard;
public ChainedElementsCollector() {
myOutput = new LinkedHashSet<Element>(10) {
private static final long serialVersionUID = 1512122997492710727L;
@Override
public boolean add(Element e) {
if (e == null) {
return false;
}
return super.add(e);
}
};
myProcessedEntitiesGuard = new HashSet<SDEntity>();
}
public void reset() {
myOutput.clear();
myProcessedEntitiesGuard.clear();
}
public List<Element> getCollectedElements() {
ArrayList<Element> result = new ArrayList<Element>(myOutput);
Collections.sort(result, MESSAGES_FIRST);
return result;
}
@Override
public Object doSwitch(EObject theEObject) {
if (theEObject == null) {
return null;
}
if (myProcessedEntitiesGuard.contains(theEObject)) {
return null;
}
if (false == theEObject instanceof SDEntity) {
return null;
}
myProcessedEntitiesGuard.add((SDEntity) theEObject);
Object result = super.doSwitch(theEObject);
return result;
}
@Override
public Object caseSDInvocation(SDInvocation invocation) {
myOutput.add(invocation.getUmlExecutionSpec());
myOutput.add(invocation.getUmlStart());
myOutput.add(invocation.getUmlFinish());
doSwitch(invocation.getOutgoingMessage());
return null;
}
@Override
public Object caseSDExecution(SDExecution object) {
myOutput.add(object.getUmlExecutionSpec());
myOutput.add(object.getUmlStart());
myOutput.add(object.getUmlFinish());
for (SDBracket next : object.getBrackets()) {
doSwitch(next);
}
return null;
}
@Override
public Object caseSDGateMessage(SDGateMessage object) {
myOutput.add(object.getUmlMessage());
doSwitch(object.getNormalEnd());
return null;
}
@Override
public Object caseSDMessage(SDMessage sdMessage) {
myOutput.add(sdMessage.getUmlMessage());
doSwitch(sdMessage.getSource());
doSwitch(sdMessage.getTarget());
return null;
}
@Override
public Object caseSDSimpleNode(SDSimpleNode object) {
myOutput.add(object.getUmlSimpleFragment());
return null;
}
private static final Comparator<Element> MESSAGES_FIRST = new Comparator<Element>() {
public int compare(Element o1, Element o2) {
boolean isMessage1 = o1 instanceof Message;
boolean isMessage2 = o2 instanceof Message;
if (isMessage1 == isMessage2) {
return 0;
}
return isMessage1 ? -1 : 1;
}
};
}
}