From 17cfedeb022d033d48f05c9ef1bdf0ce6ccc2e52 Mon Sep 17 00:00:00 2001 From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr> Date: Wed, 19 May 2010 14:46:05 +0000 Subject: [PATCH] Update on AVATAR translation to TIF --- src/translator/TClass.java | 6 +- src/ui/AvatarDesignPanelTranslator.java | 1094 +++++------------ src/ui/TDiagramPanel.java | 15 + src/ui/TGComponent.java | 11 + src/ui/avatarbd/AvatarBDPortConnector.java | 1 - src/ui/avatarsmd/AvatarSMDConnector.java | 34 +- src/ui/avatarsmd/AvatarSMDState.java | 4 + src/ui/avatarsmd/AvatarSMDTransitionInfo.java | 24 + 8 files changed, 372 insertions(+), 817 deletions(-) diff --git a/src/translator/TClass.java b/src/translator/TClass.java index 463131e53c..532d63c0a7 100755 --- a/src/translator/TClass.java +++ b/src/translator/TClass.java @@ -96,11 +96,15 @@ public class TClass { } public Gate addNewGateIfApplicable(String name) { + return addNewGateIfApplicable(name, false); + } + + public Gate addNewGateIfApplicable(String name, boolean _internal) { Gate g = getGateByName(name); if (g != null) { return g; } - g = new Gate(name, Gate.GATE, false); + g = new Gate(name, Gate.GATE, _internal); addGate(g); return g; } diff --git a/src/ui/AvatarDesignPanelTranslator.java b/src/ui/AvatarDesignPanelTranslator.java index 8e26cc59ca..3333bbcb75 100644 --- a/src/ui/AvatarDesignPanelTranslator.java +++ b/src/ui/AvatarDesignPanelTranslator.java @@ -190,6 +190,8 @@ public class AvatarDesignPanelTranslator { String name = block.getBlockName(); TDiagramPanel tdp; + int size = checkingErrors.size(); + if (asmdp == null) { return; } @@ -224,12 +226,12 @@ public class AvatarDesignPanelTranslator { LinkedList list = asmdp.getComponentList(); Iterator iterator = list.listIterator(); TGComponent tgc; - TGComponent tss = null; + AvatarSMDStartState tss = null; int cptStart = 0; while(iterator.hasNext()) { tgc = (TGComponent)(iterator.next()); if (tgc instanceof AvatarSMDStartState){ - tss = tgc; + tss = (AvatarSMDStartState)tgc; cptStart ++; } } @@ -275,870 +277,334 @@ public class AvatarDesignPanelTranslator { t.setActivityDiagram(ad); - panels.add(tdp); - activities.add(ad); - } - - // Checks whether all states with internal state machines have at most one start state - private TGComponent checkForStartStateOfCompositeStates(AvatarSMDPanel _panel) { - TGComponent tgc; - ListIterator iterator = _panel.getComponentList().listIterator(); + // First pass: creating TIF components, but no interconnection between them + ADParallel adpar; + iterator = asmdp.getAllComponentList().listIterator(); + ADActionStateWithGate adag; + Gate g; + ADJunction adj; + ADChoice adch; + + AvatarSMDReceiveSignal asmdrs; + AvatarSMDSendSignal asmdss; + while(iterator.hasNext()) { tgc = (TGComponent)(iterator.next()); - if (tgc instanceof AvatarSMDState) { - tgc = (((AvatarSMDState)(tgc)).checkForStartStateOfCompositeStates()); - if (tgc != null) { - return tgc; - } - } - } - return null; - } - - - - /*private void addTDataAttributes(TAttribute a, TClass t, ClassDiagramPanelInterface tdp, TURTLEModeling tm) { - //System.out.println("Find data: " + a.getId() + " getTypeOther=" + a.getTypeOther()); - if (tdp instanceof TClassDiagramPanel) { - TCDTData tdata = ((TClassDiagramPanel)tdp).findTData(a.getTypeOther()); - if (tdata == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Unknown type: " + a.getTypeOther()); - ce.setTClass(t); - ce.setTDiagramPanel((TDiagramPanel)tdp); - addCheckingError(ce); - return ; - } - Vector v = tdata.getAttributes(); - TAttribute b; Param p; - for(int i=0; i<v.size(); i++) { - b = (TAttribute)(v.elementAt(i)); - if (b.getType() == TAttribute.NATURAL) { - p = new Param(a.getId() + "__" + b.getId(), Param.NAT, b.getInitialValue()); - p.setAccess(a.getAccessString()); - t.addParameter(p); + // Parallel + if (tgc instanceof AvatarSMDParallel) { + adpar = new ADParallel(); + listE.addCor(adpar, tgc); + ad.add(adpar); + + // Receive signal + } else if (tgc instanceof AvatarSMDReceiveSignal) { + asmdrs = (AvatarSMDReceiveSignal)tgc; + g = t.getGateByName(asmdrs.getSignalName()); + if (g == null) { + CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Unknown signal: " + asmdrs.getSignalName()); + ce.setTClass(t); + ce.setTDiagramPanel(tdp); + ce.setTGComponent(tgc); + addCheckingError(ce); + } else { + adag = new ADActionStateWithGate(g); + adag.setActionValue(makeTIFAction(asmdrs.getValue(), "?")); + listE.addCor(adag, tgc); + ad.add(adag); } - if (b.getType() == TAttribute.BOOLEAN) { - p = new Param(a.getId() + "__" + b.getId(), Param.BOOL, b.getInitialValue()); - p.setAccess(a.getAccessString()); - t.addParameter(p); + + // Send signal + } else if (tgc instanceof AvatarSMDSendSignal) { + asmdss = (AvatarSMDSendSignal)tgc; + g = t.getGateByName(asmdss.getSignalName()); + if (g == null) { + CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Unknown signal: " + asmdss.getSignalName()); + ce.setTClass(t); + ce.setTDiagramPanel(tdp); + ce.setTGComponent(tgc); + addCheckingError(ce); + } else { + adag = new ADActionStateWithGate(g); + adag.setActionValue(makeTIFAction(asmdss.getValue(), "!")); + listE.addCor(adag, tgc); + ad.add(adag); } - if (b.getType() == TAttribute.QUEUE_NAT) { - p = new Param(a.getId() + "__" + b.getId(), Param.QUEUE_NAT, b.getInitialValue()); - p.setAccess(a.getAccessString()); - t.addParameter(p); - } + // State + } else if (tgc instanceof AvatarSMDState) { + // First case: no internal + // One junction followed by one choice + // The junction remains the reference + adj = new ADJunction(); + listE.addCor(adj, tgc); + ad.add(adj); + adch = new ADChoice(); + ad.add(adch); + adj.addNext(adch); + + // Start state + } else if (tgc instanceof AvatarSMDStartState) { + // they are ignored + /*if (tgc != tss) { + adj = new ADJunction(); + listE.addCor(adj, tgc); + ad.add(adj); + }*/ + + // Stop state + } else if (tgc instanceof AvatarSMDStopState) { + adstop = new ADStop(); + listE.addCor(adstop, tgc); + ad.add(adstop); } } - } - - private void buildActivityDiagram(TClass t) { - int j; - //TActivityDiagramPanel tadp; - ActivityDiagramPanelInterface adpi; - TDiagramPanel tdp; - //t.printParams(); - - // find the panel of this TClass - TClassInterface tci = (TClassInterface)(listE.getTG(t)); - - String name = tci.getClassName(); - int index_name = name.indexOf(':'); - // instance - if (index_name != -1) { - name = name.substring(index_name+2, name.length()); - } - - adpi = tci.getBehaviourDiagramPanel(); - if (adpi == null) { + if (checkingErrors.size() != size) { return; } - tdp = (TDiagramPanel)adpi; - - int indexTdp = panels.indexOf(tdp); - if (indexTdp > -1) { - System.out.println("Found similar activity diagram for " + t.getName()); - t.setActivityDiagram(activities.get(indexTdp).duplicate(t)); - - //System.out.println("AD of " + t.getName() + "="); - //t.getActivityDiagram().print(); - - // Must fill correspondances! - - ADComponent ad0, ad1; - TGComponent tgcad; - for(int adi=0; adi<t.getActivityDiagram().size(); adi++) { - ad0 = (ADComponent)(t.getActivityDiagram().get(adi)); - ad1 = (ADComponent)(activities.get(indexTdp).get(adi)); - tgcad = listE.getTG(ad1); - if (tgcad != null ){ - //System.out.println("Adding correspondance for " + ad0); - listE.addCor(ad0, tgcad); - } - } - - return; - } + // Second pass: connectors between components + iterator = asmdp.getAllComponentList().listIterator(); + AvatarSMDConnector asmdco; + TGComponent tgc1, tgc2; + Object o; + boolean first; - // search for start state - LinkedList list = adpi.getComponentList(); - Iterator iterator = list.listIterator(); - TGComponent tgc; - TGComponent tss = null; - int cptStart = 0; while(iterator.hasNext()) { tgc = (TGComponent)(iterator.next()); - if (tgc instanceof TADStartState){ - tss = tgc; - cptStart ++; - } else if (tgc instanceof TOSADStartState) { - tss = tgc; - cptStart ++; + if (tgc instanceof AvatarSMDConnector) { + asmdco = (AvatarSMDConnector)tgc; + tgc1 = tdp.getComponentToWhichBelongs(asmdco.getTGConnectingPointP1()); + tgc2 = tdp.getComponentToWhichBelongs(asmdco.getTGConnectingPointP2()); + if ((tgc1 == null) || (tgc2 == null)) { + TraceManager.addDev("tgcs null in Avatar translation"); + } else { + // First case: not quiting a composite state + first = true; + if (tgc1 instanceof AvatarSMDState) { + if (((AvatarSMDState)tgc1).isACompositeState()) { + first = false; + } + } + if (first) { + connect(asmdco, tgc1, tgc2, tss, ad, t, tdp); + } else { + // Second case: not yet implemented... + } + } } } - if (tss == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "No start state in the activity diagram of " + name); - ce.setTClass(t); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - return; - } - - if (cptStart > 1) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "More than one start state in the activity diagram of " + name); - ce.setTClass(t); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - return; - } - - TADActionState tadas; - - ADStart ads; - //ADActionState ada; - ADActionStateWithGate adag; - ADActionStateWithParam adap; - ADActionStateWithMultipleParam adamp; + panels.add(tdp); + activities.add(ad); + } + + private void connect(AvatarSMDConnector _asmdco, TGComponent _tgc1, TGComponent _tgc2, AvatarSMDStartState _tss, ActivityDiagram _ad, TClass _t, TDiagramPanel _tdp) { + ADComponent adc1, adc2; + ADComponent adc; + String s1, s2; ADChoice adch; - ADDelay add; - ADJunction adj; - ADLatency adl; - ADParallel adp; - ADSequence adseq; - ADPreempt adpre; - ADStop adst; ADTimeInterval adti; - ADTLO adtlo; - ADTimeCapture adtc; - String s, s1; + ADDelay addelay; + boolean hasChoice = false; + Vector<String> v; Gate g; Param p; + ADActionStateWithGate adag; + ADActionStateWithParam adap; - int nbActions; - String sTmp; - - int startIndex = listE.getSize(); - - // Creation of the activity diagram - ads = new ADStart(); - listE.addCor(ads, tss); - ActivityDiagram ad = new ActivityDiagram(ads); - t.setActivityDiagram(ad); + // Search for the two elements to connect + if (_tgc1 instanceof AvatarSMDStartState) { + if (_tgc1 != _tss) { + _tgc1 = _tgc1.getFather(); // Shall be a state! + } + } - panels.add(tdp); - activities.add(ad); + // Search for the two related TIF Components + adc1 = listE.getADComponent(_tgc1); + adc2 = listE.getADComponent(_tgc2); - //System.out.println("Making activity diagram of " + t.getName()); - // Creation of other elements - iterator = list.listIterator(); - while(iterator.hasNext()) { - tgc = (TGComponent)(iterator.next()); + if ((adc1 == null) || (adc2 == null)) { + TraceManager.addDev("adcs null in Avatar translation"); + } else { + adc = adc1; - if (tgc instanceof TADActionState) { - tadas = (TADActionState)tgc; - s = ((TADActionState)tgc).getAction(); - s = s.trim(); - //remove ';' if last character - if (s.substring(s.length()-1, s.length()).compareTo(";") == 0) { - s = s.substring(0, s.length()-1); - } - nbActions = Conversion.nbChar(s, ';') + 1; - //System.out.println("Nb Actions in state: " + nbActions); - - s = TURTLEModeling.manageDataStructures(t, s); - - g = t.getGateFromActionState(s); - p = t.getParamFromActionState(s); - if ((g != null) && (nbActions == 1)){ - //System.out.println("Action state with gate found " + g.getName() + " value:" + t.getActionValueFromActionState(s)); - adag = new ADActionStateWithGate(g); - ad.addElement(adag); - s1 = t.getActionValueFromActionState(s); - //System.out.println("s1=" + s1); - //System.out.println("Adding type"); - s1 = TURTLEModeling.manageGateDataStructures(t, s1); - - //System.out.println("hi"); - if (s1 == null) { - //System.out.println("ho"); - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Invalid expression: " + t.getActionValueFromActionState(s)); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - //return; - } else { - tadas.setStateAction(ErrorHighlight.GATE); - s1 = TURTLEModeling.addTypeToDataReceiving(t, s1); - - adag.setActionValue(s1); - //System.out.println("Adding correspondance tgc=" + tgc + "adag=" + adag); - listE.addCor(adag, tgc); - listB.addCor(adag, tgc); - } - } else if ((p != null) && (nbActions == 1)){ - //System.out.println("Action state with param found " + p.getName() + " value:" + t.getExprValueFromActionState(s)); - if (t.getExprValueFromActionState(s).trim().startsWith("=")) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, s + " should not start with a '=='"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - } - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, t.getExprValueFromActionState(s))); - listE.addCor(adap, tgc); - listB.addCor(adap, tgc); - tadas.setStateAction(ErrorHighlight.ATTRIBUTE); - - } else if ((p != null) && (nbActions > 1)){ - //System.out.println("Action state with multi param found " + p.getName() + " value:" + t.getExprValueFromActionState(s)); - // Checking params - CheckingError ce; - Vector v; - for(j=0; j<nbActions; j++) { - sTmp = TURTLEModeling.manageDataStructures(t,((TADActionState)(tgc)).getAction(j)); - if (sTmp == null) { - ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Action state (0) (" + s + "): \"" + s + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - } - - p = t.getParamFromActionState(sTmp); - if (p == null) { - ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Action state (1) (" + s + "): \"" + sTmp + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - } - } - - - tadas.setStateAction(ErrorHighlight.ATTRIBUTE); - ADComponent adtmp = null; - for(j=0; j<nbActions; j++) { - sTmp = TURTLEModeling.manageDataStructures(t,((TADActionState)(tgc)).getAction(j)); - p = t.getParamFromActionState(sTmp); - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - if (adtmp != null) { - adtmp.addNext(adap); - } else { - listB.addCor(adap, tgc); - } - adtmp = adap; - adap.setActionValue(t.getExprValueFromActionState(sTmp)); - } - - listE.addCor(adtmp, tgc); - - } else { - // Is it of kind: tdata = tdata'? - int index = s.indexOf("="); - if (index > -1) { - String name0 = s.substring(0,index).trim(); - String name1 = s.substring(index+1,s.length()).trim(); - Vector attributes = tci.getAttributes(); - int index0 = -1; - int index1 = -1; - TAttribute ta, ta0 = null, ta1 = null; - - for(j=0; j<attributes.size(); j++) { - ta = (TAttribute)(attributes.get(j)); - if (ta.getId().compareTo(name0) == 0) { - index0 = j; - ta0 = ta; - } - if (ta.getId().compareTo(name1) == 0) { - index1 = j; - ta1 = ta; - } - } - - if (((index0 != -1) && (index1 != -1)) && (ta0.getTypeOther().compareTo(ta1.getTypeOther()) == 0)) { - // Expand the equality! - tadas.setStateAction(ErrorHighlight.ATTRIBUTE); - - String nameTmp; - Vector v0 = t.getParamStartingWith(ta0.getId()+ "__"); - ADComponent adtmp = null; - - for(j=0; j<v0.size(); j++) { - p = (Param)(v0.get(j)); - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - if (adtmp != null) { - adtmp.addNext(adap); - } else { - listB.addCor(adap, tgc); - } - adtmp = adap; - nameTmp = p.getName(); - nameTmp = nameTmp.substring(nameTmp.indexOf("__"), nameTmp.length()); - adap.setActionValue(name1 + nameTmp); - } - - listE.addCor(adtmp, tgc); - } else { - //System.out.println("Unknown param 0 or 1"); - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Action state (2) (" + s + "): \"" + s + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - } - - } else { - //System.out.println("Unknown param"); - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Action state (2) (" + s + "): \"" + s + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - tadas.setStateAction(ErrorHighlight.UNKNOWN_AS); - } - //System.out.println("Bad action state found " + s); + if (_tgc1 instanceof AvatarSMDState) { + adc1 = adc1.getNext(0); // shall be a choice! + } + + // Guard + if (adc1 instanceof ADChoice) { + adch = (ADChoice)adc1; + s1 = _asmdco.getGuard(); + if (s1 == null) { + s1 = "[ ]"; } - - } else if (tgc instanceof TADTimeCapture) { - p = t.getParamByName(tgc.getValue().trim()); - if (p != null){ - System.out.println("Time capture with param " + p.getName()); - adtc = new ADTimeCapture(p); - ad.addElement(adtc); - ((TADTimeCapture)tgc).setStateAction(ErrorHighlight.ATTRIBUTE); + adch.addGuard(s1); + hasChoice = true; + } + + // Delay + s1 = _asmdco.getTotalMinDelay(); + s2 = _asmdco.getTotalMaxDelay(); + if (s1.length() > 0) { + if (s2.length() > 0) { + adti = new ADTimeInterval(); + adti.setValue(s1, s2); + _ad.add(adti); + listE.addCor(adti, _asmdco); + adc.addNext(adti); + adc = adti; } else { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Unknown variable: " + tgc.getValue()); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ((TADTimeCapture)tgc).setStateAction(ErrorHighlight.UNKNOWN_AS); + addelay = new ADDelay(); + addelay.setValue(s1); + _ad.add(addelay); + listE.addCor(addelay, _asmdco); + adc.addNext(addelay); + adc = addelay; } - - // Get element from Array - } else if (tgc instanceof TADArrayGetState) { - TADArrayGetState ags = (TADArrayGetState)tgc; - sTmp = ags.getIndex(); - try { - nbActions = Integer.decode(sTmp).intValue(); - - p = t.getParamByName(ags.getVariable()); - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ags.getVariable() + ": unknown variable"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ags.setStateAction(ErrorHighlight.UNKNOWN); - } else { - adap = new ADActionStateWithParam(p); - p = t.getParamByName(ags.getArray() + "__" + nbActions); - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ags.getArray() + "[" + ags.getIndex() + "]: unknown array or wrong index"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ags.setStateAction(ErrorHighlight.UNKNOWN); - } else { - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, ags.getArray() + "__" + nbActions)); - listE.addCor(adap, tgc); - listB.addCor(adap, tgc); - ags.setStateAction(ErrorHighlight.OK); - } - } - } catch (Exception e) { - // Index is not an absolute value - System.out.println("Index is not an absolute value"); - Gate error = t.addNewGateIfApplicable("arrayOverflow"); - - ADChoice choice1 = new ADChoice(); - ADJunction junc = new ADJunction(); - ADStop stop1 = new ADStop(); - ADActionStateWithGate adag1 = new ADActionStateWithGate(error); - - ad.addElement(choice1); - ad.addElement(junc); - ad.addElement(stop1); - ad.addElement(adag1); - - String basicGuard = "(" + ags.getIndex() + ")"; - - p = t.getParamByName(ags.getArray() + "__size"); - - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ags.getArray() + "[" + ags.getIndex() + "]: unknown array or wrong index"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ags.setStateAction(ErrorHighlight.UNKNOWN); - } else { - int size = 2; - try { - size = Integer.decode(p.getValue()).intValue(); - } catch (Exception e0) { - } - - p = t.getParamByName(ags.getVariable()); - - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ags.getVariable() + ": unknown variable"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ags.setStateAction(ErrorHighlight.UNKNOWN); - } else { - for(int i=0; i<size; i++) { - //System.out.println("Adding guard: [" + basicGuard + "== " + i + "]"); - choice1.addGuard("[" + basicGuard + " == " + i + "]"); - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, ags.getArray() + "__" + i)); - choice1.addNext(adap); - adap.addNext(junc); - ags.setStateAction(ErrorHighlight.OK); - } - - choice1.addGuard("[" + basicGuard + "> (" + ags.getArray() + "__size - 1)]"); - choice1.addNext(adag1); - adag1.addNext(stop1); - - listE.addCor(junc, tgc); - listB.addCor(choice1, tgc); - - } + } + + // Actions + v = _asmdco.getActions(); + if (v.size() == 0) { + if (hasChoice) { + // Must make an action to make the choice deterministic, except if the next component is an action! + if (!((_tgc2 instanceof AvatarSMDReceiveSignal) || (_tgc2 instanceof AvatarSMDSendSignal))) { + adc = makeChoiceAction(_ad, _t, adc, _asmdco); + TraceManager.addDev("Adding artifical action for choice to be deterministic"); } } - - } else if (tgc instanceof TADArraySetState) { - TADArraySetState ass = (TADArraySetState)tgc; - sTmp = ass.getIndex(); - try { - nbActions = Integer.decode(sTmp).intValue(); - p = t.getParamByName(ass.getArray() + "__" + nbActions); - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ass.getArray() + "[" + ass.getIndex() + "]: unknown array or wrong index"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ass.setStateAction(ErrorHighlight.UNKNOWN); - } else { - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, ass.getExpr())); - listE.addCor(adap, tgc); - listB.addCor(adap, tgc); - ass.setStateAction(ErrorHighlight.OK); - } - - } catch (Exception e) { - // Index is not an absolute value - //System.out.println("Set: Index is not an absolute value"); - Gate error = t.addNewGateIfApplicable("arrayOverflow"); - - ADChoice choice1 = new ADChoice(); - ADJunction junc = new ADJunction(); - ADStop stop1 = new ADStop(); - ADActionStateWithGate adag1 = new ADActionStateWithGate(error); - - ad.addElement(choice1); - ad.addElement(junc); - ad.addElement(stop1); - ad.addElement(adag1); - - String basicGuard = "(" + ass.getIndex() + ")"; - - p = t.getParamByName(ass.getArray() + "__size"); - - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ass.getArray() + "[" + ass.getIndex() + "]: unknown array or wrong index"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ass.setStateAction(ErrorHighlight.UNKNOWN); - } else { - int size = 2; - try { - size = Integer.decode(p.getValue()).intValue(); - } catch (Exception e0) { + } else { + // has actions! + if (!isActionOnGate(_t, v.get(0))) { + if (hasChoice) { + // Must make an action to make the choice deterministic, except if the next component is an action! + if (!((_tgc2 instanceof AvatarSMDReceiveSignal) || (_tgc2 instanceof AvatarSMDSendSignal))) { + adc = makeChoiceAction(_ad, _t, adc, _asmdco); + TraceManager.addDev("Adding artifical action for choice to be deterministic"); } - - for(int i=0; i<size; i++) { - //System.out.println("Adding guard: [" + basicGuard + "== " + i + "]"); - p = t.getParamByName(ass.getArray() + "__" + i); - adap = null; - if (p == null) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Array setting: " + ass.getArray() + "[" + ass.getIndex() + "]: unknown array or wrong index"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ass.setStateAction(ErrorHighlight.UNKNOWN); - } else { - choice1.addGuard("[" + basicGuard + " == " + i + "]"); - adap = new ADActionStateWithParam(p); - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, ass.getExpr())); - choice1.addNext(adap); - adap.addNext(junc); - ass.setStateAction(ErrorHighlight.OK); - } - - choice1.addGuard("[" + basicGuard + "> (" + ass.getArray() + "__size - 1)]"); - choice1.addNext(adag1); - adag1.addNext(stop1); - - listE.addCor(junc, tgc); - listE.addCor(choice1, tgc); - if (adap != null) { - listE.addCor(adap, tgc); - } - listE.addCor(stop1, tgc); - listE.addCor(adag1, tgc); - listB.addCor(choice1, tgc); - - } - } + } } - } else if (tgc instanceof TADChoice) { - adch = new ADChoice(); - ad.addElement(adch); - listE.addCor(adch, tgc); - } else if (tgc instanceof TADDeterministicDelay) { - add = new ADDelay(); - ad.addElement(add); - add.setValue(TURTLEModeling.manageGateDataStructures(t, ((TADDeterministicDelay)tgc).getDelayValue())); - listE.addCor(add, tgc); - } else if (tgc instanceof TADJunction) { - adj = new ADJunction(); - ad.addElement(adj); - listE.addCor(adj, tgc); - } else if (tgc instanceof TADNonDeterministicDelay) { - adl = new ADLatency(); - ad.addElement(adl); - adl.setValue(TURTLEModeling.manageGateDataStructures(t, ((TADNonDeterministicDelay)tgc).getLatencyValue())); - listE.addCor(adl, tgc); - } else if (tgc instanceof TADParallel) { - adp = new ADParallel(); - ad.addElement(adp); - adp.setValueGate(((TADParallel)tgc).getValueGate()); - listE.addCor(adp, tgc); - } else if (tgc instanceof TADSequence) { - adseq = new ADSequence(); - ad.addElement(adseq); - listE.addCor(adseq, tgc); - } else if (tgc instanceof TADPreemption) { - adpre = new ADPreempt(); - ad.addElement(adpre); - listE.addCor(adpre, tgc); - } else if (tgc instanceof TADStopState) { - adst = new ADStop(); - ad.addElement(adst); - listE.addCor(adst, tgc); - } else if (tgc instanceof TADTimeInterval) { - adti = new ADTimeInterval(); - ad.addElement(adti); - adti.setValue(TURTLEModeling.manageGateDataStructures(t, ((TADTimeInterval)tgc).getMinDelayValue()), TURTLEModeling.manageGateDataStructures(t, ((TADTimeInterval)tgc).getMaxDelayValue())); - listE.addCor(adti, tgc); - } else if (tgc instanceof TADTimeLimitedOffer) { - s = ((TADTimeLimitedOffer)tgc).getAction(); - g = t.getGateFromActionState(s); - if (g != null) { - adtlo = new ADTLO(g); - ad.addElement(adtlo); - adtlo.setLatency("0"); - s1 = t.getActionValueFromActionState(s); - //System.out.println("Adding type"); - s1 = TURTLEModeling.manageGateDataStructures(t, s1); - s1 = TURTLEModeling.addTypeToDataReceiving(t, s1); - //System.out.println("Adding type done"); - adtlo.setAction(s1); - adtlo.setDelay(TURTLEModeling.manageGateDataStructures(t, ((TADTimeLimitedOffer)tgc).getDelay())); - listE.addCor(adtlo, tgc); - ((TADTimeLimitedOffer)tgc).setStateAction(ErrorHighlight.GATE); - } else { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Time-limited offer (" + s + ", " + ((TADTimeLimitedOffer)tgc).getDelay() + "): \"" + s + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ((TADTimeLimitedOffer)tgc).setStateAction(ErrorHighlight.UNKNOWN_AS); - //System.out.println("Bad time limited offer found " + s); - } - } else if (tgc instanceof TADTimeLimitedOfferWithLatency) { - s = ((TADTimeLimitedOfferWithLatency)tgc).getAction(); - g = t.getGateFromActionState(s); - if (g != null) { - adtlo = new ADTLO(g); - ad.addElement(adtlo); - adtlo.setLatency(TURTLEModeling.manageGateDataStructures(t, ((TADTimeLimitedOfferWithLatency)tgc).getLatency())); - s1 = t.getActionValueFromActionState(s); - //System.out.println("Adding type"); - s1 = TURTLEModeling.manageGateDataStructures(t, s1); - s1 = TURTLEModeling.addTypeToDataReceiving(t, s1); - //System.out.println("Adding type done"); - adtlo.setAction(s1); - adtlo.setDelay(TURTLEModeling.manageGateDataStructures(t, ((TADTimeLimitedOfferWithLatency)tgc).getDelay())); - listE.addCor(adtlo, tgc); - ((TADTimeLimitedOfferWithLatency)tgc).setStateAction(ErrorHighlight.GATE); - } else { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Time-limited offer (" + s + ", " + ((TADTimeLimitedOfferWithLatency)tgc).getLatency() + ", " + ((TADTimeLimitedOfferWithLatency)tgc).getDelay() + "): \"" + s + "\" is not a correct expression"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - ((TADTimeLimitedOfferWithLatency)tgc).setStateAction(ErrorHighlight.UNKNOWN_AS); - //System.out.println("Bad time limited offer found " + s); - } - - // TURTLE-OS AD - } else if (tgc instanceof TOSADTimeInterval) { - adti = new ADTimeInterval(); - ad.addElement(adti); - adti.setValue(TURTLEModeling.manageGateDataStructures(t, ((TOSADTimeInterval)tgc).getMinDelayValue()), TURTLEModeling.manageGateDataStructures(t, ((TOSADTimeInterval)tgc).getMaxDelayValue())); - listE.addCor(adti, tgc); - } else if (tgc instanceof TOSADIntTimeInterval) { - adti = new ADTimeInterval(); - ad.addElement(adti); - adti.setValue(TURTLEModeling.manageGateDataStructures(t, ((TOSADIntTimeInterval)tgc).getMinDelayValue()), TURTLEModeling.manageGateDataStructures(t, ((TOSADIntTimeInterval)tgc).getMaxDelayValue())); - listE.addCor(adti, tgc); - } else if (tgc instanceof TOSADStopState) { - adst = new ADStop(); - ad.addElement(adst); - listE.addCor(adst, tgc); - } else if (tgc instanceof TOSADJunction) { - adj = new ADJunction(); - ad.addElement(adj); - listE.addCor(adj, tgc); - } else if (tgc instanceof TOSADChoice) { - adch = new ADChoice(); - ad.addElement(adch); - listE.addCor(adch, tgc); - } if (tgc instanceof TOSADActionState) { - s = ((TOSADActionState)tgc).getAction(); - s = s.trim(); - //remove ';' if last character - if (s.substring(s.length()-1, s.length()).compareTo(";") == 0) { - s = s.substring(0, s.length()-1); - } - nbActions = Conversion.nbChar(s, ';') + 1; - - if (nbActions>1) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, s + " should not start with a '=='"); - ce.setTClass(t); - ce.setTGComponent(tgc); - ce.setTDiagramPanel(tdp); - addCheckingError(ce); - } else { - //s = TURTLEModeling.manageDataStructures(t, s); - g = t.getGateFromActionState(s); - p = t.getParamFromActionState(s); - - if (p != null) { + for (String action: v) { + g = getGateFromActionState(_t, action); + p = getParamFromActionState(_t, action); + if (g != null) { + adag = new ADActionStateWithGate(g); + _ad.addElement(adag); + adag.setActionValue(makeTIFAction(action, "!")); + listE.addCor(adag, _asmdco); + adc.addNext(adag); + adc = adag; + } else if (p != null) { adap = new ADActionStateWithParam(p); - ad.addElement(adap); - adap.setActionValue(TURTLEModeling.manageDataStructures(t, t.getExprValueFromActionState(s))); - listE.addCor(adap, tgc); + _ad.addElement(adap); + adap.setActionValue(makeTIFActionOnParam(action)); + listE.addCor(adap, _asmdco); + adc.addNext(adap); + adc = adap; } else { - adag = new ADActionStateWithGate(g); - ad.addElement(adag); - listE.addCor(adag, tgc); - adag.setActionValue(s); + CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed action: " + action); + ce.setTClass(_t); + ce.setTDiagramPanel(_tdp); + ce.setTGComponent(_asmdco); + addCheckingError(ce); + return; } } - //System.out.println("Nb Actions in state: " + nbActions); } + + adc.addNext(adc2); } - TGConnectingPoint p1, p2; - //TGConnectorFullArrow tgco; - TGComponent tgc1, tgc2, tgc3; - ADComponent ad1, ad2; + } + + private boolean isActionOnGate(TClass _t, String _s) { + Gate g = getGateFromActionState(_t, _s); + return (g != null); + } + + private Gate getGateFromActionState(TClass _t, String _action) { + String action = _action; + int index0 = action.indexOf("("); + if (index0 != -1) { + action = _action.substring(0, index0); + } - // Managing Java code - iterator = list.listIterator(); - while(iterator.hasNext()) { - tgc = (TGComponent)(iterator.next()); - if (tgc instanceof PreJavaCode) { - ad1 = listE.getADComponentByIndex(tgc, tdp.count); - if (ad1 != null) { - ad1.setPreJavaCode(tgc.getPreJavaCode()); - } - } - if (tgc instanceof PostJavaCode) { - ad1 = listE.getADComponentByIndex(tgc, tdp.count); - if (ad1 != null) { - ad1.setPostJavaCode(tgc.getPostJavaCode()); - } - } + return _t.getGateByName(action); + } + + private Param getParamFromActionState(TClass _t, String _action) { + String action = _action; + int index0 = action.indexOf("("); + if (index0 != -1) { + action = _action.substring(0, index0); } - // Connecting elements - TGConnectorBetweenElementsInterface tgcbei; - iterator = list.listIterator(); - while(iterator.hasNext()) { - tgc = (TGComponent)(iterator.next()); - if (tgc instanceof TGConnectorBetweenElementsInterface) { - tgcbei = (TGConnectorBetweenElementsInterface)tgc; - p1 = tgcbei.getTGConnectingPointP1(); - p2 = tgcbei.getTGConnectingPointP2(); - - // identification of connected components - tgc1 = null; tgc2 = null; - for(j=0; j<list.size(); j++) { - tgc3 = (TGComponent)(list.get(j)); - if (tgc3.belongsToMe(p1)) { - tgc1 = tgc3; - } - if (tgc3.belongsToMe(p2)) { - tgc2 = tgc3; - } - } - - // connecting turtle modeling components - if ((tgc1 != null) && (tgc2 != null)) { - //ADComponent ad1, ad2; - - //System.out.println("tgc1 = " + tgc1.getValue() + " tgc2= "+ tgc2.getValue()); - - ad1 = listE.getADComponentByIndex(tgc1, tdp.count); - if ((tgc2 instanceof TADArrayGetState) || (tgc2 instanceof TADArraySetState) || (tgc2 instanceof TADActionState)) { - ad2 = listB.getADComponent(tgc2); - } else { - ad2 = listE.getADComponentByIndex(tgc2, tdp.count); - } - - //System.out.println("ad1 = " + ad1 + " ad2= "+ ad2); - - if ((ad1 == null) || (ad2 == null)) { - //System.out.println("Correspondance issue"); - } - int index = 0; - if ((ad1 != null ) && (ad2 != null)) { - if ((tgc1 instanceof TADTimeLimitedOffer) || (tgc1 instanceof TADTimeLimitedOfferWithLatency)) { - index = tgc1.indexOf(p1) - 1; - ad1.addNextAtIndex(ad2, index); - } else if (tgc1 instanceof TADChoice) { - TADChoice tadch = (TADChoice)tgc1; - index = tgc1.indexOf(p1) - 1; - String myguard = TURTLEModeling.manageGateDataStructures(t, tadch.getGuard(index)); - String tmp = Conversion.replaceAllChar(myguard, '[', ""); - tmp = Conversion.replaceAllChar(tmp, ']', "").trim(); - if (tmp.compareTo("else") == 0) { - // Must calculate guard - String realGuard = ""; - int cpt = 0; - for(int k=0; k<tadch.getNbInternalTGComponent(); k++) { - if (k != index) { - if (cpt == 0) { - tmp = TURTLEModeling.manageGateDataStructures(t, tadch.getGuard(k)); - tmp = Conversion.replaceAllChar(tmp, '[', ""); - tmp = Conversion.replaceAllChar(tmp, ']', "").trim(); - if (tmp.length() > 0) { - realGuard = tmp; - cpt ++; - } - } else { - tmp = TURTLEModeling.manageGateDataStructures(t, tadch.getGuard(k)); - tmp = Conversion.replaceAllChar(tmp, '[', ""); - tmp = Conversion.replaceAllChar(tmp, ']', "").trim(); - if (tmp.length() > 0) { - realGuard = "(" + realGuard + ") and (" + tmp + ")"; - cpt ++; - } - } - } - //System.out.println("Real guard=" + realGuard + "k=" + k + " index=" + index); - } - - if (realGuard.length() == 0) { - myguard = "[ ]"; - } else { - myguard = "[not(" + realGuard + ")]"; - } - System.out.println("My guard=" + myguard); - } - ((ADChoice)ad1).addGuard(myguard); - ad1.addNext(ad2); - } else if ((tgc1 instanceof TADSequence) ||(tgc1 instanceof TADPreemption)){ - index = tgc1.indexOf(p1) - 1; - ad1.addNextAtIndex(ad2, index); - } else if (tgc1 instanceof TOSADChoice) { - TOSADChoice tadch = (TOSADChoice)tgc1; - index = tgc1.indexOf(p1) - 1; - ((ADChoice)ad1).addGuard(TURTLEModeling.manageGateDataStructures(t, tadch.getGuard(index))); - ad1.addNext(ad2); - } else { - ad1.addNextAtIndex(ad2, index); - //System.out.println("Adding connector from " + ad1 + " to " + ad2); - } - } - } - } + return _t.getParamByName(action); + } + + private ADComponent makeChoiceAction(ActivityDiagram _ad, TClass _t, ADComponent _adc, TGComponent _asmdco) { + Gate g = _t.addNewGateIfApplicable("choice__", true); + ADActionStateWithGate adag = new ADActionStateWithGate(g); + adag.setActionValue(""); + _ad.add(adag); + _adc.addNext(adag); + listE.addCor(adag, _asmdco); + return adag; + } + + private String makeTIFActionOnParam(String _s) { + String ret = _s.trim(); + int index0 = ret.indexOf("="); + if (index0 == -1) { + return ret; } - // Increasing count of this panel - tdp.count ++; - // Remove all elements not reachable from start state - int sizeb = ad.size(); + return ret.substring(index0+1, ret.length()).trim(); - System.out.println("Removing non reachable elements in t:" + t.getName()); - ad.removeAllNonReferencedElts(); + } + + private String makeTIFAction(String _s, String _replace) { + String ret = _s.trim(); + int index0 = ret.indexOf("("); + if (index0 == -1) { + return ""; + } - int sizea = ad.size(); - if (sizeb > sizea) { - CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, "Non reachable elements have been removed in " + t.getName()); - ce.setTClass(t); - ce.setTGComponent(null); - ce.setTDiagramPanel(tdp); - addWarning(ce); - //System.out.println("Non reachable elements have been removed in " + t.getName()); + int index1 = ret.indexOf(")"); + if (index1 == -1) { + return ""; } - //ad.replaceAllADActionStatewithMultipleParam(listE); - }*/ + ret = ret.substring(index0, index1); + + ret = Conversion.replaceAllString(ret, "(", _replace); + ret = Conversion.replaceAllString(ret, ",", _replace); + ret = Conversion.replaceAllString(ret, " ", ""); + + return ret; + } + + // Checks whether all states with internal state machines have at most one start state + private TGComponent checkForStartStateOfCompositeStates(AvatarSMDPanel _panel) { + TGComponent tgc; + ListIterator iterator = _panel.getComponentList().listIterator(); + while(iterator.hasNext()) { + tgc = (TGComponent)(iterator.next()); + if (tgc instanceof AvatarSMDState) { + tgc = (((AvatarSMDState)(tgc)).checkForStartStateOfCompositeStates()); + if (tgc != null) { + return tgc; + } + } + } + return null; + } public void createRelationsBetweenTClasses(TURTLEModeling tm, LinkedList<AvatarBDBlock> blocks, String preName) { diff --git a/src/ui/TDiagramPanel.java b/src/ui/TDiagramPanel.java index 70f3cd5ae0..7883f14c00 100755 --- a/src/ui/TDiagramPanel.java +++ b/src/ui/TDiagramPanel.java @@ -921,6 +921,21 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree { public LinkedList getComponentList() { return componentList; } + + public LinkedList getAllComponentList() { + TGComponent tgc; + + LinkedList ll = new LinkedList(); + ll.addAll(componentList); + + ListIterator iterator = componentList.listIterator(); + while(iterator.hasNext()) { + tgc = (TGComponent)(iterator.next()); + ll.addAll(tgc.getRecursiveAllInternalComponent()); + } + + return ll; + } // Adding connector diff --git a/src/ui/TGComponent.java b/src/ui/TGComponent.java index 749d5e6ac3..b226b35363 100755 --- a/src/ui/TGComponent.java +++ b/src/ui/TGComponent.java @@ -51,6 +51,8 @@ import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; +import java.util.*; + import org.w3c.dom.*; import myutil.*; @@ -953,6 +955,15 @@ public abstract class TGComponent implements CDElement, GenericTree { return tgcomponent[index]; } + + public LinkedList getRecursiveAllInternalComponent() { + LinkedList ll = new LinkedList(); + for(int i=0; i<nbInternalTGComponent; i++) { + ll.add(tgcomponent[i]); + ll.addAll(tgcomponent[i].getRecursiveAllInternalComponent()); + } + return ll; + } public TGComponent getIfId(int checkId) { diff --git a/src/ui/avatarbd/AvatarBDPortConnector.java b/src/ui/avatarbd/AvatarBDPortConnector.java index d70be0b0f4..6bc702215a 100644 --- a/src/ui/avatarbd/AvatarBDPortConnector.java +++ b/src/ui/avatarbd/AvatarBDPortConnector.java @@ -497,6 +497,5 @@ public class AvatarBDPortConnector extends TGConnector implements ScalableTGCom return _s.substring(0, index).trim(); } - } diff --git a/src/ui/avatarsmd/AvatarSMDConnector.java b/src/ui/avatarsmd/AvatarSMDConnector.java index 042f09e233..451711c594 100644 --- a/src/ui/avatarsmd/AvatarSMDConnector.java +++ b/src/ui/avatarsmd/AvatarSMDConnector.java @@ -56,7 +56,7 @@ import ui.*; public class AvatarSMDConnector extends TGConnector { protected int arrowLength = 10; - protected AvatarSMDTransitionInfo myTransitionInfo; + //protected AvatarSMDTransitionInfo myTransitionInfo; public AvatarSMDConnector(int _x, int _y, int _minX, int _minY, int _maxX, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp, TGConnectingPoint _p1, TGConnectingPoint _p2, Vector _listPoint) { super(_x, _y, _minX, _minY, _maxX, _maxY, _pos, _father, _tdp, _p1, _p2, _listPoint); @@ -121,6 +121,38 @@ public class AvatarSMDConnector extends TGConnector { public int getType() { return TGComponentManager.AVATARSMD_CONNECTOR; } + + public String getGuard() { + return ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getGuard(); + } + + public String getTotalMinDelay() { + String s1 = ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getAfterMinDelay(); + String s2 = ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getComputeMinDelay(); + return addedDelays(s1, s2); + } + + public String getTotalMaxDelay() { + String s1 = ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getAfterMaxDelay(); + String s2 = ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getComputeMaxDelay(); + return addedDelays(s1, s2); + } + + public String addedDelays(String s1, String s2) { + if (s1.trim().length() == 0) { + return s2.trim(); + } else { + if (s2.trim().length() == 0) { + return s1; + } else { + return "(" + s1 + ") + (" + s2 + ")"; + } + } + } + + public Vector<String> getActions() { + return ((AvatarSMDTransitionInfo)getInternalTGComponent(0)).getActions(); + } } diff --git a/src/ui/avatarsmd/AvatarSMDState.java b/src/ui/avatarsmd/AvatarSMDState.java index 35cde49339..45e1fe65ef 100644 --- a/src/ui/avatarsmd/AvatarSMDState.java +++ b/src/ui/avatarsmd/AvatarSMDState.java @@ -435,5 +435,9 @@ public class AvatarSMDState extends TGCScalableWithInternalComponent implements return null; } + public boolean isACompositeState() { + return (nbInternalTGComponent > 0); + } + } diff --git a/src/ui/avatarsmd/AvatarSMDTransitionInfo.java b/src/ui/avatarsmd/AvatarSMDTransitionInfo.java index 39aff40b22..349482b970 100755 --- a/src/ui/avatarsmd/AvatarSMDTransitionInfo.java +++ b/src/ui/avatarsmd/AvatarSMDTransitionInfo.java @@ -324,4 +324,28 @@ public class AvatarSMDTransitionInfo extends TGCWithoutInternalComponent { throw new MalformedModelingException(); } } + + public String getGuard() { + return guard; + } + + public String getAfterMinDelay() { + return afterMin; + } + + public String getAfterMaxDelay() { + return afterMax; + } + + public String getComputeMinDelay() { + return computeMin; + } + + public String getComputeMaxDelay() { + return computeMax; + } + + public Vector<String> getActions() { + return listOfActions; + } } \ No newline at end of file -- GitLab