-
Ludovic Apvrille authoredLudovic Apvrille authored
MSCDrawer.java 29.79 KiB
/* Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille
*
* ludovic.apvrille AT enst.fr
*
* This software is a computer program whose purpose is to allow the
* edition of TURTLE analysis, design and deployment diagrams, to
* allow the generation of RT-LOTOS or Java code from this diagram,
* and at last to allow the analysis of formal validation traces
* obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
* from INRIA Rhone-Alpes.
*
* This software is governed by the CeCILL license under French law and
* abiding by the rules of distribution of free software. You can use,
* modify and/ or redistribute the software under the terms of the CeCILL
* license as circulated by CEA, CNRS and INRIA at the following URL
* "http://www.cecill.info".
*
* As a counterpart to the access to the source code and rights to copy,
* modify and redistribute granted by the license, users are provided only
* with a limited warranty and the software's author, the holder of the
* economic rights, and the successive licensors have only limited
* liability.
*
* In this respect, the user's attention is drawn to the risks associated
* with loading, using, modifying and/or developing or reproducing the
* software by the user in light of its specific status of free software,
* that may mean that it is complicated to manipulate, and that also
* therefore means that it is reserved for developers and experienced
* professionals having in-depth computer knowledge. Users are therefore
* encouraged to load and test the software's suitability as regards their
* requirements in conditions enabling the security of their systems and/or
* data to be ensured and, more generally, to use and operate it in the
* same conditions as regards security.
*
* The fact that you are presently reading this means that you have had
* knowledge of the CeCILL license and that you accept its terms.
*/
package ui;
import sddescription.*;
import ui.iod.InteractionOverviewDiagramPanel;
import ui.sd.SDInstance;
import ui.sd.SequenceDiagramPanel;
import ui.sd.TGConnectorMessageSD;
import java.awt.*;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Vector;
/**
* Class MSCDrawer
* Draw textual SD modeling
* Creation: 17/07/2009
* @version 1.0 17/07/2009
* @author Ludovic APVRILLE
* @see MainGUI
*/
public class MSCDrawer {
public final static int DEC = 50;
public final static int DEC_COMP = 30;
public final static int INIT_X = 100;
public final static int INIT_Y = 40;
private MainGUI mgui;
private HMSC hmsc;
private MSC msc;
private int indexAnalysis;
private AnalysisPanel ap;
private Vector<Instance> telements;
private Vector<TGComponent> gelements;
//private double radius;
//private double centerX;
//private double centerY;
public MSCDrawer(MainGUI _mgui) {
mgui = _mgui;
}
public void setMSC(MSC _msc) {
msc = _msc;
}
public void setHMSC(HMSC _hmsc) {
hmsc = _hmsc;
}
public boolean drawFromMSC(int _analysisNb) {
telements = new Vector<>();
gelements = new Vector<>();
try {
//makeDrawable();
//
addAnalysis(_analysisNb);
//
drawBasicHMSC();
makeMSC(hmsc, msc);
//
//drawActivityDiagrams();
//
//drawRelations();
//
} catch (MalformedSDException msde) {
return false;
}
return true;
}
private void addAnalysis(int _analysisNb) throws MalformedSDException {
indexAnalysis = mgui.createAnalysis("Analysis " + _analysisNb);
//
if (indexAnalysis < 0) {
throw new MalformedSDException("bad index");
}
try {
ap = (AnalysisPanel)(mgui.tabs.elementAt(indexAnalysis));
} catch (Exception e) {
throw new MalformedSDException("Analysis panel not found");
}
ap.iodp.setMinX(10);
ap.iodp.setMaxX(1900);
ap.iodp.setMinY(10);
ap.iodp.setMaxY(900);
}
private void drawBasicHMSC() throws MalformedSDException {
// Creating basicHMSC : one start node + reference to SD + stop node
// Creating tclass
int myX, myY;
myX = 400;
myY = 100;
TGComponent tgc1 = TGComponentManager.addComponent(myX, myY, TGComponentManager.IOD_START_STATE, ap.iodp);
myY += DEC;
TGComponent tgc2 = TGComponentManager.addComponent(myX, myY, TGComponentManager.IOD_REF_SD, ap.iodp);
tgc2.setValue(msc.getName());
myY += DEC;
TGComponent tgc3 = TGComponentManager.addComponent(myX, myY, TGComponentManager.IOD_STOP_STATE, ap.iodp);
ap.iodp.addBuiltComponent(tgc1);
ap.iodp.addBuiltComponent(tgc2);
ap.iodp.addBuiltComponent(tgc3);
// Links between tgc1, tgc2, tgc3
connectHMSC(tgc1, tgc2, ap.iodp);
connectHMSC(tgc2, tgc3, ap.iodp);
}
public TGConnector connectHMSC(TGComponent _tgc1, TGComponent _tgc2, InteractionOverviewDiagramPanel _iodp) throws MalformedSDException {
// Connect both points
TGConnectingPoint p1, p2;
p1 = _tgc1.findFirstFreeTGConnectingPoint(true, false);
p2 = _tgc2.findFirstFreeTGConnectingPoint(false, true);
if ((p1 == null) || (p2 == null)) {
throw new MalformedSDException("Could not find free connecting points");
}
p1.setFree(false);
p2.setFree(false);
TGConnector tgco = TGComponentManager.addConnector(p1.x, p1.y, TGComponentManager.CONNECTOR_INTERACTION, _iodp, p1, p2, new Vector<Point>());
ap.iodp.addBuiltComponent(tgco);
return tgco;
}
// Make the SD
public void makeMSC(HMSC _hmsc, MSC _msc) throws MalformedSDException {
SequenceDiagramPanel sdp;
ListIterator iterator;
Instance instance;
int myX = INIT_X;
int myY = INIT_Y;
TGComponent tgc;
ArrayList<SDInstance> ginstances;
SDInstance sdi;
//SDInstance sdi;
// Creates the panel
if (!ap.addSequenceDiagram(_msc.getName())) {
throw new MalformedSDException("Could not create the SD named " + _msc.getName());
}
try {
sdp = (SequenceDiagramPanel)(ap.panelAt(1));
} catch (Exception e) {
throw new MalformedSDException("Could not get the SD named " + _msc.getName());
}
// Put instances
ginstances = new ArrayList<SDInstance>();
iterator = _hmsc.getInstances().listIterator();
while(iterator.hasNext()) {
instance = (Instance)(iterator.next());
tgc = TGComponentManager.addComponent(myX, myY, TGComponentManager.SD_INSTANCE, sdp);
tgc.setValue(instance.getName());
sdp.addBuiltComponent(tgc);
ginstances.add((SDInstance)tgc);
telements.add(instance);
gelements.add(tgc);
myX += (5 * DEC);
}
// Put events on instances -> sending, receving are ignored for the moment
//ListIterator li2;
ListIterator li1 = msc.getEvts().listIterator();
Evt evt, evt1, evt2;
int indexInstance;
while(li1.hasNext()) {
evt = (Evt)(li1.next());
indexInstance = hmsc.getInstances().indexOf(evt.getInstance());
sdi = ginstances.get(indexInstance);
myX = INIT_X + (5*DEC) * indexInstance;
myY = INIT_Y + DEC_COMP + msc.getOrderOfEvt(evt) * (DEC_COMP);
tgc = null;
if (evt.getType() == Evt.VARIABLE_SET) {
tgc = TGComponentManager.addComponent(myX, myY, TGComponentManager.SD_ACTION_STATE, sdp);
tgc.setValue(evt.getActionId());
}
if (tgc != null) {
// Check first the size of the instance as well as the size of the panel
if (myY > (sdi.getY() + sdi.getHeight() + 20)) {
// Increase size of all instances
sdp.increaseInstanceSize(250);
}
// Add the component to the instance
sdi.addSwallowedTGComponent(tgc, myX, myY);
}
}
// Sending, receiving events
// For them, we parse links between events
li1 = msc.getLinksEvts().listIterator();
LinkEvts le;
TGConnectingPoint p1, p2;
TGConnectorMessageSD msg;
while(li1.hasNext()) {
le = (LinkEvts)(li1.next());
evt1 = le.evt1;
evt2 = le.evt2;
if (evt2.getType() == Evt.SEND_SYNC) {
evt = evt2;
evt2 = evt1;
evt1 = evt;
}
if ((evt1.getType() == Evt.SEND_SYNC) && (evt2.getType() == Evt.RECV_SYNC)) {
indexInstance = hmsc.getInstances().indexOf(evt1.getInstance());
sdi = ginstances.get(indexInstance);
myX = INIT_X + (5*DEC) * indexInstance;
myY = INIT_Y + DEC_COMP + msc.getOrderOfEvt(evt1) * (DEC_COMP);
p1 = sdi.closerFreeTGConnectingPoint(myX, myY);
indexInstance = hmsc.getInstances().indexOf(evt2.getInstance());
sdi = ginstances.get(indexInstance);
myX = INIT_X + (5*DEC) * indexInstance;
myY = INIT_Y + DEC_COMP + msc.getOrderOfEvt(evt2) * (DEC_COMP);
p2 = sdi.closerFreeTGConnectingPoint(myX, myY);
if ((p1 != null) && (p2 != null)) {
msg = (TGConnectorMessageSD)(TGComponentManager.addConnector(p1.x, p1.y, TGComponentManager.CONNECTOR_MESSAGE_SYNC_SD, sdp, p1, p2, new Vector<Point>()));
msg.setValue(evt1.getActionId());
sdp.addBuiltComponent(msg);
}
} else {
}
}
/*while(li1.hasNext()) {
instance = (Instance)(li1.next());
if (instance != null) {
li2 = _msc.getOrders();
while(li2.hasNext()) {
order = (Order)(li2.next());
}
}
}*/
}
/*private void drawTClasses() throws MalformedSDException {
TClass t;
int total = tm.classNb();
radius = 200 + 30 * total;
centerX = radius + 50;
centerY = radius + 50;
int maxX = 1900;
int maxY = 900;
while(maxX < (radius *2 + 200)) {
maxX = maxX + 500;
dp.tcdp.setMaxX(maxX);
}
while(maxY < (radius *2 + 200)) {
maxY = maxY + 500;
dp.tcdp.setMaxY(maxY);
}
dp.tcdp.updateSize();
for(int i=0; i<total; i++) {
drawTClass(tm.getTClassAtIndex(i), i, total);
}
}
private void drawTClass(TClass t, int index, int total) throws MalformedTURTLEModelingException {
// Calculate where the class should be added
// We use a circle to dipose classes
double angle = 2*Math.PI*index/total;
int myX = (int)(Math.cos(angle)*radius + centerX);
int myY = (int)(Math.sin(angle)*radius + centerY);
// Creating tclass
TGComponent tgc = TGComponentManager.addComponent(myX, myY, TGComponentManager.TCD_TCLASS, dp.tcdp);
TCDTClass tcd = (TCDTClass)tgc;
telements.add(t);
gelements.add(tgc);
// setting tclass properties
tgc.setValue(t.getName());
tgc.setValueWithChange(t.getName());
tcd.setStart(t.isActive());
// Adding tclass to the diagram
dp.tcdp.addBuiltComponent(tgc);
tcd.recalculateSize();
// Managing gates
addAttributes(t, tcd);
addGates(t, tcd);
tcd.checkSizeOfSons();
}
public void addAttributes(TClass t, TCDTClass tcd) throws MalformedTURTLEModelingException {
Vector params = t.getParamList();
Vector attributes = new Vector();
Param p;
TAttribute ta;
for(int i=0; i<params.size(); i++) {
p = (Param)(params.elementAt(i));
ta = null;
if (p.getType().compareTo(Param.NAT) ==0) {
ta = new TAttribute(TAttribute.PRIVATE, p.getName(), p.getValue(), TAttribute.NATURAL);
} else if (p.getType().compareTo(Param.BOOL) ==0) {
ta = new TAttribute(TAttribute.PRIVATE, p.getName(), p.getValue(), TAttribute.BOOLEAN);
} else if (p.getType().compareTo(Param.QUEUE_NAT) ==0) {
ta = new TAttribute(TAttribute.PRIVATE, p.getName(), p.getValue(), TAttribute.QUEUE_NAT);
} else {
throw new MalformedTURTLEModelingException("attribute of an unknown type");
}
if (ta != null) {
attributes.add(ta);
}
}
tcd.setAttributes(attributes);
}
public void addGates(TClass t, TCDTClass tcd) throws MalformedTURTLEModelingException {
Vector tmgates = t.getGateList();
Vector gates = new Vector();
Gate g;
TAttribute ta;
for(int i=0; i<tmgates.size(); i++) {
g = (Gate)(tmgates.elementAt(i));
ta = new TAttribute(TAttribute.PUBLIC, g.getName(), "", g.getType()+1);
gates.add(ta);
}
tcd.setGates(gates);
}
private void drawActivityDiagrams() throws MalformedTURTLEModelingException {
int total = tm.classNb();
for(int i=0; i<total; i++) {
drawActivityDiagram(tm.getTClassAtIndex(i));
}
}
private void drawActivityDiagram(TClass t) throws MalformedTURTLEModelingException {
ActivityDiagram ad = t.getActivityDiagram();
ADStart ads = ad.getStartState();
int index = mgui.tabs.indexOf(dp);
TActivityDiagramPanel tadp = mgui.getActivityDiagramPanel(index, t.getName());
tadp.removeAll();
makeADOf(ads, tadp, null, 0, 0);
tadp.makeGraphicalOptimizations();
}
private void makeADOf(ADComponent adc, TActivityDiagramPanel tadp, TGComponent previous, int indexNext, int totalNext) throws MalformedTURTLEModelingException {
// Check if component has already been computed
if (telements.contains(adc)) {
int index = telements.indexOf(adc);
TGComponent tgcc = (TGComponent)(gelements.elementAt(index));
// make link if required
if (!(tgcc instanceof TADStartState)) {
TGConnector tgco = connectAD(tgcc, previous, tadp, false, indexNext, totalNext);
tadp.addBuiltConnector(tgco);
}
return;
}
// make component from adc
//
TGComponent tgc = addToAD(adc, tadp);
if (tgc ==null) {
throw new MalformedTURTLEModelingException("null component");
}
// Adding component
tadp.addBuiltComponent(tgc);
telements.add(adc);
gelements.add(tgc);
// Linking component to the previous one
if (!(tgc instanceof TADStartState)) {
TGConnector tgco = connectAD(tgc, previous, tadp, true, indexNext, totalNext);
tadp.addBuiltConnector(tgco);
}
// Managing nexts of this component
ADComponent nextAdc;
for(int i=0; i<adc.getNbNext(); i++) {
makeADOf(adc.getNext(i), tadp, tgc, i, adc.getNbNext());
}
}
public TGComponent addToAD(ADComponent adc, TDiagramPanel tadp) throws MalformedTURTLEModelingException {
int i;
if (adc instanceof ADActionStateWithGate) {
ADActionStateWithGate adasw = (ADActionStateWithGate)adc;
TADActionState tadas = (TADActionState)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_ACTION_STATE, tadp));
//
try {
tadas.setValue(adasw.getGate().getName() + adasw.getLimitOnGate() + adasw.getActionValue());
} catch (Exception e) {
tadas.setValue("Unknown gate");
}
return tadas;
} else if(adc instanceof ADActionStateWithMultipleParam) {
ADActionStateWithMultipleParam adawp = ((ADActionStateWithMultipleParam)adc);
TADActionState tadas = (TADActionState)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_ACTION_STATE, tadp));
tadas.setValue(adawp.getActionValue());
return tadas;
} else if(adc instanceof ADActionStateWithParam) {
ADActionStateWithParam adawp = ((ADActionStateWithParam)adc);
TADActionState tadas = (TADActionState)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_ACTION_STATE, tadp));
try {
//
//
tadas.setValue(adawp.getParam().getName() + " = " + adawp.getActionValue());
} catch (Exception e) {
tadas.setValue("unknown = unknown");
}
return tadas;
} else if (adc instanceof ADChoice) {
TADChoice tadc = (TADChoice)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_CHOICE, tadp));
/*if (adc.getNbNext() > 3) {
}*/
/*for(i=0; i<3; i++) {
if (((ADChoice)(adc)).isGuarded(i)) {
tadc.setGuard(((ADChoice)adc).getGuard(i), i);
}
}
return tadc;
} else if (adc instanceof ADDelay) {
TADDeterministicDelay tadd = (TADDeterministicDelay)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_DETERMINISTIC_DELAY, tadp));
tadd.setDelayValue(((ADDelay)adc).getValue());
return tadd;
} else if (adc instanceof ADJunction) {
return TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_JUNCTION, tadp);
} else if (adc instanceof ADLatency) {
TADNonDeterministicDelay tadnd = (TADNonDeterministicDelay)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_NON_DETERMINISTIC_DELAY, tadp));
tadnd.setLatencyValue(((ADLatency)adc).getValue());
return tadnd;
} else if (adc instanceof ADParallel) {
TADParallel tadpl = (TADParallel)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_PARALLEL, tadp));
//
tadpl.setValueGate(((ADParallel)adc).getValueGate());
return tadpl;
} else if (adc instanceof ADPreempt) {
TADPreemption tadpr = (TADPreemption)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_PREEMPTION, tadp));
return tadpr;
} else if (adc instanceof ADSequence) {
TADSequence tadseq = (TADSequence)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_SEQUENCE, tadp));
return tadseq;
} else if (adc instanceof ADStart) {
TADStartState tadstart = (TADStartState)(TGComponentManager.addComponent(600, 75, TGComponentManager.TAD_START_STATE, tadp));
return tadstart;
} else if (adc instanceof ADStop) {
TADStopState tadstop = (TADStopState)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_STOP_STATE, tadp));
return tadstop;
} else if (adc instanceof ADTLO) {
TADTimeLimitedOfferWithLatency tadtlo = (TADTimeLimitedOfferWithLatency)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_TIME_LIMITED_OFFER_WITH_LATENCY, tadp));
tadtlo.setAction(((ADTLO)adc).getGate().getName() + ((ADTLO)adc).getAction());
tadtlo.setDelay(((ADTLO)adc).getDelay());
tadtlo.setLatency(((ADTLO)adc).getLatency());
return tadtlo;
} else if (adc instanceof ADTimeInterval) {
TADTimeInterval adti = (TADTimeInterval)(TGComponentManager.addComponent(10, 10, TGComponentManager.TAD_DELAY_NON_DETERMINISTIC_DELAY, tadp));
adti.setMinValue(((ADTimeInterval)adc).getMinValue());
adti.setMaxValue(((ADTimeInterval)adc).getMaxValue());
return adti;
}
throw new MalformedTURTLEModelingException("unknown component ->"+adc);
}
public TGConnector connectAD(TGComponent tgc, TGComponent previous, TActivityDiagramPanel tadp, boolean move, int indexNext, int totalNext) throws MalformedTURTLEModelingException {
boolean makeSquare = true;
int index = -1;
// Find TGconnectingPoints
//P1
TGConnectingPoint p1 = null;
if ((previous instanceof TADParallel) || (previous instanceof TADPreemption) || (previous instanceof TADSequence)) {
switch(totalNext) {
case 1:
index=7;
break;
case 2:
switch(indexNext) {
case 0:
index = 6;
break;
default:
index = 8;
break;
}
break;
case 3:
switch(indexNext) {
case 0:
index = 5;
break;
case 1:
index = 7;
break;
default:
index = 9;
break;
}
break;
default:
}
}
if ((index != -1) && ((previous instanceof TADPreemption) || (previous instanceof TADSequence))) {
index = index - 4;
}
if (index > -1 ) {
p1 = previous.tgconnectingPointAtIndex(index);
} else {
p1 = previous.findFirstFreeTGConnectingPoint(true, false);
}
if (p1 == null) {
throw new MalformedTURTLEModelingException("p1 connecting point not found");
}
TGConnectingPoint p2 = null;
if (tgc instanceof TADJunction) {
if (tgc.tgconnectingPointAtIndex(0).isFree()) {
p2 = tgc.findFirstFreeTGConnectingPoint(false, true);
} else {
p2 = tgc.closerFreeTGConnectingPoint(p1.getX(), p1.getY(), true);
}
} else {
p2 = tgc.findFirstFreeTGConnectingPoint(false, true);
}
if (p2 == null) {
throw new MalformedTURTLEModelingException("p2 connecting point not found on component:" + tgc);
}
// Move tgc component according to points
if (move) {
int decX = 0;
int decY = 5;
if (previous instanceof TADChoice) {
makeSquare = false;
if (p1 == previous.tgconnectingPointAtIndex(1)) {
decX = -90;
}
if (p1 == previous.tgconnectingPointAtIndex(2)) {
decX = 90;
}
decY = 20;
}
if (previous instanceof TADTimeLimitedOfferWithLatency) {
if (p1 == previous.tgconnectingPointAtIndex(2)) {
decX = 50;
}
}
if ((previous instanceof TADSequence) || (previous instanceof TADPreemption)) {
makeSquare = false;
if (p1 == previous.tgconnectingPointAtIndex(1)) {
decX = -80;
}
if (p1 == previous.tgconnectingPointAtIndex(2)) {
decX = -40;
}
if (p1 == previous.tgconnectingPointAtIndex(4)) {
decX = +40;
}
if (p1 == previous.tgconnectingPointAtIndex(5)) {
decX = +80;
}
decY = 20;
}
if (previous instanceof TADParallel) {
makeSquare = false;
if (p1 == previous.tgconnectingPointAtIndex(5)) {
decX = -100;
}
if (p1 == previous.tgconnectingPointAtIndex(6)) {
decX = -50;
}
if (p1 == previous.tgconnectingPointAtIndex(8)) {
decX = +50;
}
if (p1 == previous.tgconnectingPointAtIndex(9)) {
decX = +100;
}
decY = 20;
}
decX = Math.max(p1.getX() - p2.getX() + tgc.getX() + decX, tadp.getMinX());
decY = Math.max(p1.getY() - p2.getY() + tgc.getY() + decY, tadp.getMinY());
if (decX > tadp.getMaxX()) {
tadp.setMaxX(tadp.getMaxX() + 500);
tadp.updateSize();
}
if (decY > tadp.getMaxY()) {
//
tadp.setMaxY(tadp.getMaxY() + 500);
tadp.updateSize();
}
tgc.setMoveCd(decX, decY);
}
// Connect both points
p1.setFree(false);
p2.setFree(false);
TGConnector tgco = TGComponentManager.addConnector(p1.x, p1.y, TGComponentManager.CONNECTOR_AD_DIAGRAM, tadp, p1, p2, new Vector());
if (makeSquare) {
tgco.makeSquareWithoutMovingTGComponents();
}
return tgco;
}
private void drawRelations() throws MalformedTURTLEModelingException {
Relation r;
for(int i = 0; i < tm.relationNb(); i++) {
r = tm.getRelationAtIndex(i);
drawRelation(r);
}
}
private void drawRelation(Relation r) throws MalformedTURTLEModelingException {
// Identify invloved TClasses
int index1 = telements.indexOf(r.t1);
int index2 = telements.indexOf(r.t2);
if ((index1 <0) ||(index2 <0)) {
throw new MalformedTURTLEModelingException("relation with no tclasses");
}
try {
TCDTClass t1 = (TCDTClass)(gelements.elementAt(index1));
TCDTClass t2 = (TCDTClass)(gelements.elementAt(index2));
// Make connector
//
TGConnector tgco = makeAssociation(r, t1, t2);
tgco.makeSquareWithoutMovingTGComponents();
dp.tcdp.addBuiltConnector(tgco);
// Add relation semantics to connector (and gates if necessary)
TGComponent operator = makeSemantics(r, tgco, t1, t2);
if ((r.type == Relation.SYN) || (r.type == Relation.INV)) {
makeGates(operator, r, t1, t2);
}
} catch (Exception e) {
throw new MalformedTURTLEModelingException("error happened when making a relation");
}
}
private TGConnector makeAssociation(Relation r, TCDTClass t1, TCDTClass t2) throws MalformedTURTLEModelingException {
TGConnectingPoint p1 = t1.closerFreeTGConnectingPoint(t2.getX(), t2.getY());
TGConnectingPoint p2 = t2.closerFreeTGConnectingPoint(t1.getX(), t1.getY());
if ((p1 != null) && (p2 != null)) {
p1.setFree(false);
p2.setFree(false);
if ((r.type == Relation.PRE) || (r.type == Relation.SEQ) ||(r.type == Relation.INV)) {
return TGComponentManager.addConnector(p1.x, p1.y, TGComponentManager.CONNECTOR_ASSOCIATION_NAVIGATION, dp.tcdp, p1, p2, new Vector());
} else {
return TGComponentManager.addConnector(p1.x, p1.y, TGComponentManager.CONNECTOR_ASSOCIATION, dp.tcdp, p1, p2, new Vector());
}
}
return null;
}
private TGComponent makeSemantics(Relation r, TGConnector tgco, TCDTClass t1, TCDTClass t2) throws MalformedTURTLEModelingException {
// has at leat 3 tgconnecting points -> take the one in thne middle
TGConnectingPoint pt;
if (tgco.getNbConnectingPoint() < 1) {
throw new MalformedTURTLEModelingException("No connecting point");
}
pt = tgco.getTGConnectingPointAtIndex(Math.min(1, tgco.getNbConnectingPoint()-1));
TGComponent operator = null;
int type = 0;
// Add a operator corresponding to the relation semantics
switch(r.type) {
case Relation.PAR:
type = TGComponentManager.TCD_PARALLEL_OPERATOR;
break;
case Relation.SYN:
type = TGComponentManager.TCD_SYNCHRO_OPERATOR;
break;
case Relation.INV:
type = TGComponentManager.TCD_INVOCATION_OPERATOR;
break;
case Relation.SEQ:
type = TGComponentManager.TCD_SEQUENCE_OPERATOR;
break;
case Relation.PRE:
type = TGComponentManager.TCD_PREEMPTION_OPERATOR;
break;
default:
type = -1;
}
// Add operator if non null
if (type == -1) {
throw new MalformedTURTLEModelingException("Unknown relation type");
}
// Is the line horizontal or vertical?
boolean vertical = true ;
if (tgco.isPtOnVerticalSegment(pt)) {
vertical = false;
}
int myX, myY;
if (vertical) {
myX = pt.getX() - 50;
myY = pt.getY() - 100;
} else {
myX = pt.getX() + 75;
myY = pt.getY() - 12;
}
operator = TGComponentManager.addComponent(myX, myY, type, dp.tcdp);
telements.add(r);
gelements.add(operator);
dp.tcdp.addBuiltComponent(operator);
TGConnectingPoint pop;
if (vertical) {
pop = operator.getTGConnectingPointAtIndex(2);
} else {
pop = operator.getTGConnectingPointAtIndex(0);
}
// Connects the connector to the operator
pt.setFree(false);
pop.setFree(false);
TGConnector dashco = TGComponentManager.addConnector(pt.x, pt.y, TGComponentManager.CONNECTOR_ATTRIBUTE, dp.tcdp, pt, pop, new Vector());
//dashco.makeSquareWithoutMovingTGComponents();
dp.tcdp.addBuiltConnector(dashco);
if (operator instanceof TCDCompositionOperatorWithSynchro) {
((TCDCompositionOperatorWithSynchro)(operator)).structureChanged();
}
return operator;
}
// If invocation / synchro -> set synchronization gates
public void makeGates(TGComponent operator, Relation r, TCDTClass t1, TCDTClass t2) throws MalformedTURTLEModelingException {
Vector gates = null;
TTwoAttributes tt;
TAttribute ta1, ta2;
Gate g1, g2;
try {
gates = ((TCDCompositionOperatorWithSynchro)operator).getGates();
} catch (Exception e){
throw new MalformedTURTLEModelingException("Gates of synchro relation may not be set");
}
for(int i=0; i<r.gatesOfT1.size(); i++) {
g1 = (Gate)(r.gatesOfT1.elementAt(i));
g2 = (Gate)(r.gatesOfT2.elementAt(i));
ta1 = t1.getGateById(g1.getName());
ta2 = t2.getGateById(g2.getName());
tt = new TTwoAttributes(t1, t2, ta1, ta2);
gates.add(tt);
}
((TCDCompositionOperatorWithSynchro)operator).getSynchroGateList().makeValue();
}
public void makeDrawable() {
tm.unmergeChoices();
TClass t;
for(int i=0; i<tm.classNb(); i++) {
t = tm.getTClassAtIndex(i);
makeDrawable(t.getActivityDiagram(), false);
}
}
public int makeDrawable(ActivityDiagram ad, boolean debug) {
ADComponent adc, adc1;
ADJunction adj1, adj2 = null;
int i=0;
while(i<ad.size()) {
adc = (ADComponent)(ad.elementAt(i));
// Ensure that at most 3 elements lead to a junction -> if more, remove one
if (adc instanceof ADJunction) {
adj1 = (ADJunction)adc;
if (ad.getNbComponentLeadingTo(adj1) > 3) {
// Find an appropriate new junction
if (adj1.getNext(0) instanceof ADJunction) {
adj2 = (ADJunction)(adj1.getNext(0));
if (ad.getNbComponentLeadingTo(adj1) > 2) {
// No space left on that junction ...
// Create a new junction
adj2 = new ADJunction();
ad.add(adj2);
adj2.addNext(adj1.getNext(0));
adj1.removeAllNext();
adj1.addNext(adj2);
}
} else {
adj2 = new ADJunction();
ad.add(adj2);
adj2.addNext(adj1.getNext(0));
adj1.removeAllNext();
adj1.addNext(adj2);
}
adc1 = ad.getFirstComponentLeadingTo(adc);
adc1.updateNext(adj1, adj2);
return makeDrawable(ad, debug);
}
}
i++;
}
return 0;
}*/
}