-
Ludovic Apvrille authoredLudovic Apvrille authored
GProactiveDesign.java 70.42 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 fr.inria.oasis.vercors.cttool.model.*;
import myutil.TraceManager;
import translator.*;
import ui.procsd.*;
import ui.prosmd.*;
import ui.prosmd.util.CorrespondanceSMDManager;
import java.util.*;
/**
* Class GProactiveDesign
* Translation of graphical proactive designs into TURTLE modeling
* Creation: 10/07/2006
*
* @author Ludovic APVRILLE
* @version 1.0 10/07/2006
*/
public class GProactiveDesign {
private TURTLEModeling tm;
private ProactiveDesignPanel pdp;
private List<ProCSDPort> portsList = new LinkedList<ProCSDPort>(); //list of ProCSDPort
private List<TGConnectorProCSD> connectorsList = new LinkedList<TGConnectorProCSD>(); //list of TGConnectorProCSD
private List<TGConnectorPortInterface> connectorsPortInterfacesList = new LinkedList<TGConnectorPortInterface>();
private List<ProCSDInterface> interfacesList = new LinkedList<ProCSDInterface>(); //list of ProCSDInterface
private List<ProCSDComponent> proCSDComponentsList = new LinkedList<ProCSDComponent>();
private List<CheckingError> checkingErrors = new LinkedList<CheckingError>();
// private CorrespondanceTGElement listE;
private CorrespondanceSMDManager corespManager;
private boolean buildErrors;
//Added by Solange ...and removed by Emil ..
// private ProCSDPort puerto, puerto2;
private Component mainModelComp;
public GProactiveDesign(ProactiveDesignPanel _pdp) {
pdp = _pdp;
init();
//TraceManager.addDev(mainModelComp.prettyPrint());
}
private void init() {
checkingErrors = new LinkedList<CheckingError>();
// listE = new CorrespondanceTGElement();
portsList = new LinkedList<ProCSDPort>(); //list of ProCSDPort
connectorsList = new LinkedList<TGConnectorProCSD>(); //list of TGConnectorProCSD
interfacesList = new LinkedList<ProCSDInterface>(); //list of ProCSDInterface
proCSDComponentsList = new LinkedList<ProCSDComponent>();
ProactiveCSDPanel csd = (ProactiveCSDPanel) (pdp.panels.elementAt(0));
List<TGComponent> list = csd.getComponentList();
boolean cyclefound = false;
for (int i = 0; i < list.size(); i++) {
TGComponent tmp = list.get(i);
// listElement(tmp);
if (!parseStructureAndFillUpLists(tmp)) cyclefound = true;
}
if (cyclefound)
addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Cycle found in component diagrams structure."));
updatePortsInformation();
// updateAllMembranes();
}
public void updateAllMembranes() {
this.pdp.updateAllMembranes();
}
private Component createModelComp(ProCSDComponent comp) {
String modelCompName = comp.getValue();
if (comp.getThisCompDesign() != null) {
comp = comp.getThisCompDesign();
// modelCompName+="_"+comp.getValue();
}
Component modelComp = new ComponentImpl(modelCompName, isPrimitive(comp));
//we add attributes
List<TAttribute> attribs = comp.getMyAttributes();
for (int at = 0; at < attribs.size(); at++) {
TAttribute a = attribs.get(at);
Attribute attrib = new fr.inria.oasis.vercors.cttool.model.AttributeImpl(a.getId(), a.getType(), a.getAccess(), a.getInitialValue());
modelComp.addAttribute(attrib);
}
//we add ports
//we do not set the ports bindings at this time as all ports in the model
//are not already
//created
Vector<ProCSDPort> portsList = comp.getPortsList();
for (int k = 0; k < portsList.size(); k++) {
ProCSDPort p = portsList.get(k);
Port modelPort = null;
if (p instanceof ProCSDInPort) {
modelPort = new InPort(p.getValue(), modelComp);
}
if (p instanceof ProCSDOutPort) {
modelPort = new OutPort(p.getValue(), modelComp);
}
if (p.getMyInterface() != null) {
ProCSDInterface proI = p.getMyInterface();
Interface modelI = new InterfaceImpl(proI.getValue(), proI.isMandatory());
List<TAttribute> proMsgs = proI.getMyMessages();
for (int i = 0; i < proMsgs.size(); i++) {
TAttribute a = proMsgs.get(i);
Message m = new MessageImpl(a.getId());
modelI.addMessage(m);
}
modelPort.setInterface(modelI);
}
modelComp.addPort(modelPort);
}
//we add the behaviour Panel
modelComp.setBehaviour(comp.getMySMD());
Vector<ProCSDComponent> subComps = comp.getComponentList();
for (int k = 0; k < subComps.size(); k++) {
ProCSDComponent subComp = subComps.get(k);
Component sc = createModelComp(subComp);
modelComp.addSubComponent(sc);
sc.setFather(modelComp);
}
return modelComp;
}
private Component initModel(ProactiveCSDPanel mainCsd) throws Exception {
Component mainAppComp = new ComponentImpl("Application");
List<TGComponent> comps = mainCsd.getComponentList();
for (int k = 0; k < comps.size(); k++) {
TGComponent t = comps.get(k);
if (t instanceof ProCSDComponent) {
ProCSDComponent comp = (ProCSDComponent) t;
Component modelComp = createModelComp(comp);
mainAppComp.addSubComponent(modelComp);
modelComp.setFather(mainAppComp);
}
}
mainAppComp = updatePortsBindingInModel(mainAppComp, mainCsd);
return mainAppComp;
}
/*
* if the father of this port is designed in other diagram,
* it returns the port in that diagram corresponding to this port
* if not it return this port
*/
private ProCSDPort getRealPort(ProCSDPort p) {
if (p == null) return null;
ProCSDComponent father = (ProCSDComponent) p.getFather();
ProCSDComponent fatherDesign = father.getThisCompDesign();
if (fatherDesign != null) {
return fatherDesign.getPortByName(p.getValue());
} else
return p;
}
private void updatePortsBindingInModel(Component modelComp, ProCSDComponent proComp) throws Exception {
//we consider pairs of (model Out Port, ProCSDOutPort)
Vector<ProCSDPort> ports = proComp.getPortsList();
for (int k = 0; k < ports.size(); k++) {
ProCSDPort p = ports.get(k);
if (p instanceof ProCSDOutPort) {
ProCSDOutPort proPort = (ProCSDOutPort) p;
Port modelPort = modelComp.getPortByName(proPort.getValue());
ProCSDPort proToPort = getRealPort(proPort.getToPort());
if (proToPort != null) {
Port modelToPort = null;
ProCSDComponent proToPortFather = (ProCSDComponent) proToPort.getFather();
Component modelToPortFather = null;
if (proToPortFather == proComp.getFather()) {
modelToPortFather = modelComp.getFather();
} else {
String modelToPortFatherName = proPort.getToPort().getFather().getValue();
// if (proToPortFather.getThisCompDesign()!=null)
// modelToPortFatherName+="_"+proToPortFather.getThisCompDesign().getValue();
modelToPortFather = modelComp.getFather().getSubComponentByName(modelToPortFatherName);
}
modelToPort = modelToPortFather.getPortByName(proToPort.getValue());
modelPort.setToPort(modelToPort);
modelToPort.setFromPort(modelPort);
}//if proToPort!=null
ProCSDPort proFromPort = getRealPort(proPort.getFromPort());
if (proFromPort != null) {
Port modelFromPort = null;
//ProCSDComponent proFromPortFather =(ProCSDComponent)proFromPort.getFather();
String modelFromPortFatherName = proPort.getFromPort().getFather().getValue();
if (proFromPort != proPort.getFromPort()) {
modelFromPortFatherName = proPort.getFromPort().getFather().getValue();
}
//if (proFromPortFather.getThisCompDesign()!=null)
// modelFromPortFatherName+="_"+proFromPortFather.getThisCompDesign().getValue();
Component modelFromPortFather = modelComp.getSubComponentByName(modelFromPortFatherName);
modelFromPort = modelFromPortFather.getPortByName(proFromPort.getValue());
modelPort.setFromPort(modelFromPort);
modelFromPort.setToPort(modelPort);
}//if proFromPort!=null
}//if p is ProCSDOutPort
else if (p instanceof ProCSDInPort) {
ProCSDInPort proPort = (ProCSDInPort) p;
Port modelPort = modelComp.getPortByName(proPort.getValue());
ProCSDPort proFromPort = getRealPort(proPort.getFromPort());
if (proFromPort != null) {
if (proFromPort instanceof ProCSDInPort) {
Port modelFromPort = null;
ProCSDComponent proFromPortFather = (ProCSDComponent) proFromPort.getFather();
Component modelFromPortFather = null;
if (proFromPortFather == proComp.getFather()) {
modelFromPortFather = modelComp.getFather();
} else {
String modelFromPortFatherName = proPort.getFromPort().getFather().getValue();
if (proFromPortFather.getThisCompDesign() != null)
modelFromPortFatherName = proFromPortFather.getThisCompDesign().getValue();
modelFromPortFather = modelComp.getFather().getSubComponentByName(modelFromPortFatherName);
}
modelFromPort = modelFromPortFather.getPortByName(proFromPort.getValue());
modelPort.setFromPort(modelFromPort);
modelFromPort.setToPort(modelPort);
}//if fromport=ProCSDInPort
}//if proFromPort!=null
}//if p instanceof ProCSDInport
}//for all ports
if (proComp.getThisCompDesign() != null)
proComp = proComp.getThisCompDesign();
Vector<ProCSDComponent> v = proComp.getComponentList();
for (int k = 0; k < v.size(); k++) {
ProCSDComponent proSubComp = v.get(k);
String proSubCompName = proSubComp.getValue();
//if (proSubComp.getThisCompDesign()!=null)
//proSubCompName+="_"+proSubComp.getThisCompDesign().getValue();
Component modelSubComp = modelComp.getSubComponentByName(proSubCompName);
updatePortsBindingInModel(modelSubComp, proSubComp);
}
}//method update ports bindings in model
private Component updatePortsBindingInModel(Component mainComp, ProactiveCSDPanel mainCsd) throws Exception {
//we consider pairs of components (Component c, ProCSDComponent pc) and update potrs bindings in
List<TGComponent> comps = mainCsd.getComponentList();
for (int k = 0; k < comps.size(); k++) {
TGComponent t = comps.get(k);
if (t instanceof ProCSDComponent) {
ProCSDComponent proComp = (ProCSDComponent) t;
String proCompName = proComp.getValue();
//if (proComp.getThisCompDesign()!=null)
// proCompName+="_"+proComp.getThisCompDesign().getValue();
Component modelComp = mainComp.getSubComponentByName(proCompName);
if (modelComp == null) {
TraceManager.addDev("This is a fatal problem.");
addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Fatal error in the model translator. Please excuse us for this problem. "));
}
updatePortsBindingInModel(modelComp, proComp);
}
}
return mainComp;
}
public TURTLEModeling generateTURTLEModeling() {
tm = new TURTLEModeling();
init();
if (checkingErrors.size() == 0)
try {
mainModelComp = initModel((ProactiveCSDPanel) (pdp.panels.elementAt(0)));
} catch (Exception e) {
TraceManager.addDev("This is probably just litle nice bug: Could not initializate model. Exception is: \n");
e.printStackTrace();
}
if (checkingErrors.size() != 0) return null;
addTClasses(tm, mainModelComp);
if (checkingErrors.size() == 0) addSynchronisations(tm, mainModelComp);
return tm;
}
public boolean checkSyntax() {
return checkingErrors.size() <= 0;
}
/*
* for each port :
* update the interface wich contains methods who pass through this port
* "push" the connection into the inside ports in order to have
* the connections between the primitives
*
*/
private void updatePortsInformation() {
for (int k = 0; k < connectorsList.size(); k++) {
TGConnectorProCSD c = connectorsList.get(k);
c.doPostLoading();
}
for (int k = 0; k < connectorsPortInterfacesList.size(); k++) {
TGConnectorPortInterface c = connectorsPortInterfacesList.get(k);
c.doPostLoading();
}
//ok
//we need to update the toPort and fromPort for the ports
//of the components who are designed in a diffrent diagram:
/* for (int k=0;k<portsList.size();k++)
{
ProCSDPort p=(ProCSDPort)portsList.get(k);
ProCSDComponent portFather=(ProCSDComponent)p.getFather();
ProCSDPort pOkBindings=portFather.getThisCompDesign().getPort(p.getValue());
if(pOkBindings!=null)
{
p.setToPort(pOkBindings.getToPort());
p.setFromPort(pOkBindings.getFromPort());
}
}
*/
//all this code is just used for compatibility with old CTTool versions.
//normaly we shouldn't do this
//at least I think...
//needs to be verified
//and verry well improved before
//all this very-badly-designed-software will be well packed
//and nicelly put into a trash bin
//Added by Solange
int isCompatible; //0: OK
//1: Port error
//2: compatibility error
ProCSDInterface myInterface = null;
TGConnectorAttribute myInterfaceConnector;
//first we consider all out ports
for (int i = 0; i < portsList.size(); i++) {
ProCSDPort op = portsList.get(i);
if (op.getType() == TGComponentManager.PROCSD_OUT_PORT) {
try {
myInterface = op.getMyInterface(interfacesList);
//Added by Solange
op.setMyInterface(myInterface);
// Added by Solange
myInterfaceConnector = op.getTGConnectorInterface();
// Added by Solange
myInterface.setMyConnector(myInterfaceConnector);
} catch (Exception e) {
if (op.getFather() == null) {
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Port " + op.getValue() + " doesn't belong to a component"));
return;
}
if (((ProCSDComponent) op.getFather()).getThisCompDesign() == null) {
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "No interface found corresponding to port " + op.getValue()));
return;
}
}
ProCSDPort toP = op.getToPort();
// if (toP==null) toP=getConnectedProCSDPort(op);
//if(toP==null) toP=getDelegateConnectorProCSDPort(op);
//Commented because is not always an error to be free, by Solange
/* if (toP==null)
{
addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: out connection not found for "+op.toString()+" in component "+op.getFather().getValue());
//TraceManager.addDev("Error: no connection found for "+op.toString());
return;
}*/
if (toP != null) {
op.setToPort(toP);
toP.setFromPort(op);
}
//Added by Solange
if (myInterface != null) {
isCompatible = op.Compatibility(op, myInterface, interfacesList);
//Added by Solange
switch (isCompatible) {
case 0:// TraceManager.addDev("Compatibility test Out port... OK");
break;
case 1:
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Port " + op.toString() + " not connected"));
break;
case 2:
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "No Interface Compatibility"));
break;
}
}
/* Delegate ports removed, by Solange
ProCSDPort dp = getConnectedDelegatePort(op);
if (dp!=null)
{ dp.setMyInterface(myInterface);
dp.setToPort(toP);
toP.setFromPort(dp);
ProCSDPort ddp=getFromInsideConnectedPort(dp);
while (ddp!=null)
{ ddp.setMyInterface(myInterface);
ddp.setToPort(toP);
toP.setFromPort(ddp);
ddp=getFromInsideConnectedPort(ddp);
}//while ddp!=null
}//if dp!=null
*/
}//if this port is an out port
}//for all ports (out)
//now we consider all in ports
for (int i = 0; i < portsList.size(); i++) {
ProCSDPort ip = portsList.get(i);
if (ip.getType() == TGComponentManager.PROCSD_IN_PORT) {
myInterface = ip.getMyInterface(interfacesList);
if (myInterface != null) {
//Added by Solange
ip.setMyInterface(myInterface);
// Added by Solange
myInterfaceConnector = ip.getTGConnectorInterface();
// Added by Solange
myInterface.setMyConnector(myInterfaceConnector);
//
}
ProCSDPort fromPort = ip.getFromPort();
//Added by Solange
// if(fromPort==null) fromPort=getDelegateConnectorProCSDPort(ip);
if (fromPort != null) {
ip.setFromPort(fromPort);
fromPort.setToPort(ip);
}
//Commented because is not always an error to be free, by Solange
/*if (fromPort==null)
{
addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: in connection not found for "+ip.toString()+" in component "+ip.getFather().getValue());
return;
}*/
//Added by Solange
isCompatible = ip.Compatibility(ip, myInterface, interfacesList);
//Added by Solange
switch (isCompatible) {
case 0: //TraceManager.addDev("Compatibility test In port... OK");
break;
case 1:
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Port " + ip.toString() + " not connected"));
break;
case 2:
this.addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "No Interface Compatibility"));
break;
}
/* Delegate ports removed, by Solange
ProCSDPort dp=getConnectedDelegatePort(ip);
if (dp!=null)
{ dp.setMyInterface(myInterface);
dp.setFromPort(fromPort);
fromPort.setToPort(dp);
ProCSDPort ddp=getToInsideConnectedPort(dp);
while (ddp!=null)
{ ddp.setMyInterface(myInterface);
ddp.setFromPort(fromPort);
fromPort.setToPort(ddp);
ddp=getToInsideConnectedPort(ddp);
}//while ddp!=null
}//dp!=null
*/
}// ip is an input port
} // for all ports in
}
private boolean isPrimitive(ProCSDComponent comp) {
List<TGComponent> l = getSubComponents(comp, TGComponentManager.PROCSD_COMPONENT);
if (l == null) return true;
return l.size() == 0;
}
/*
* get subcomponents of type given as parameter
* @param type The type id from TGComponentManager
* @param tgc A component
* @return selectedSubComps A LinkedList of subcomponents of the type
*/
private List<TGComponent> getSubComponents(TGComponent tgc, int type) {
if (!(tgc.getType() == TGComponentManager.PROCSD_COMPONENT)) return null;
List<TGComponent> subcompList = getSubComponents(tgc);
List<TGComponent> selectedSubComps = new LinkedList<TGComponent>();
for (int i = 0; i < subcompList.size(); i++) {
TGComponent tmp = subcompList.get(i);
if (tmp.getType() == type)
selectedSubComps.add(tmp);
}
return selectedSubComps;
}
/*
* get subcomponents of all types
* @param tgc A component
* @return subcompList A LinkedList of subcomponents
*/
private List<TGComponent> getSubComponents(TGComponent tgc) {
List<TGComponent> subcompList = new LinkedList<TGComponent>();
int nb = tgc.getNbInternalTGComponent();
for (int j = 0; j < nb; j++) {
TGComponent tmp = tgc.getInternalTGComponent(j);
subcompList.add(tmp);
}
return subcompList;
}
/*
* returns all ports of this component
* @param tgc A component
* @return portsList A LinkedList with ports of the component
*/
// private List<ProCSDPort> getPorts(TGComponent tgc)
// {
// if (!(tgc.getType()==TGComponentManager.PROCSD_COMPONENT)) return null;
// List<TGComponent> subcompList=getSubComponents(tgc);
// List<ProCSDPort> portsList=new LinkedList<ProCSDPort>();
// for (int i=0;i<subcompList.size();i++)
// {
// TGComponent tmp=subcompList.get(i);
// //Remove option delegate ports, by Solange
// if ((tmp.getType()==TGComponentManager.PROCSD_IN_PORT) || (tmp.getType()==TGComponentManager.PROCSD_OUT_PORT))// || ( tmp.getType()==TGComponentManager.PROCSD_DELEGATE_PORT))
// portsList.add( (ProCSDPort) tmp);
// }
// return portsList;
// }
/*
* gets the port connected to the port in parameter via a TGConnector ProCSD if there is one, null if not
* @param port A port
* @return p1 (or p2) The connected port, or null if not connected
*/
// private ProCSDPort getConnectedProCSDPort(ProCSDPort port)
// {
// //Remove option delegate ports, by Solange
// //if (port.getType()==TGComponentManager.PROCSD_DELEGATE_PORT) return null;
//
// //TraceManager.addDev("cherche un port pour le port " +port.getValue()); comented by Emil
//
// TGConnectorProCSD myConnector=port.getTGConnector();
//
// if (myConnector==null)
// {
// //Commented because is not always an error to be free, by Solange
// //addCheckingError(CheckingError.STRUCTURE_ERROR,"We didn't find any connector for the port " +port.getValue());
// return null;
// }
//
// // TraceManager.addDev("...... (ProCSDPort).. my connector is "+myConnector.toString());
//
// //ProCSDPort p1=myConnector.getMyPort1(portsList);
// ProCSDPort p1=myConnector.getMyPort1();
//
// /* if (p1!=null) TraceManager.addDev(p1.toString());
// else
// TraceManager.addDev("NULL!!!!!!!!!");
// */
//
// //TraceManager.addDev("......... my connector's Port1 is "+p1.toString());
//
// if ((p1!=null) && (!p1.equals(port))) return p1;
//
// ProCSDPort p2=myConnector.getMyPort2();
//
// if ((p2!=null) && (!p2.equals(port))) return p2;
//
// return null;
// }
//Added by Solange for the subcomponents
/*
* Method to find the port connected to a port when there are subcomponents involved
* @param port The port to be analyzed
* @return p1 (or p2) The port connected or null if not connected
*/
/*
public ProCSDPort getDelegateConnectorProCSDPort(ProCSDPort port)
{
TGConnectorDelegateProCSD myDelegateConnector=port.getTGConnectorDelegateIn();
if (myDelegateConnector==null)
myDelegateConnector=port.getTGConnectorDelegateOut();
if (myDelegateConnector==null)
{
// TraceManager.addDev("We didn't find any delegate connector for the port " +port.getValue());
return null;
}
ProCSDPort p1=myDelegateConnector.getMyPort1(portsList);
if ((p1!=null) && (!p1.equals(port))) return p1;
ProCSDPort p2=myDelegateConnector.getMyPort2(portsList);
if ((p2!=null) && (!p2.equals(port))) return p2;
return null;
}
*/
/*
* gets the delegate port connected to the port in parameter via a TGConnectorDelegateProCSD if there is one, null if not
* returns null for delegate ports
*
*/
//Delegate ports removes. Method is no t needed. By Solange
/*
private ProCSDPort getConnectedDelegatePort(ProCSDPort port)
{
if (port.getType()==TGComponentManager.PROCSD_DELEGATE_PORT) return null;
//TraceManager.addDev("cherche un port pour le port " +port.getValue());
TGConnectorDelegateProCSD myDelegateConnector=port.getTGConnectorDelegateIn();
if (myDelegateConnector==null)
myDelegateConnector=port.getTGConnectorDelegateOut();
if (myDelegateConnector==null)
{
//TraceManager.addDev("We didn't find any connector for the port " +port.getValue());
return null;
}
// TraceManager.addDev("...... (ProCSDPort).. my connector is "+myConnector.toString());
ProCSDPort p1=myDelegateConnector.getMyPort1(portsList);
//if (p1!=null) TraceManager.addDev(p1.toString());
//else
// TraceManager.addDev("NULL!!!!!!!!!");
//TraceManager.addDev("......... my connector's Port1 is "+p1.toString());
if ((p1!=null) && (!p1.equals(port))) return p1;
ProCSDPort p2=myDelegateConnector.getMyPort2(portsList);
if ((p2!=null) && (!p2.equals(port))) return p2;
return null;
}
*/
/* private ProCSDPort getToOutsideConnectedPort(ProCSDPort dp)
{
TGComponent father=dp.getFather().getFather();
if (father==null)
{
addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: forbiden delegate port at this level "+dp.getValue());
return null;
}
LinkedList fatherPorts=getPorts(father);
TGConnectorDelegateProCSD myDelegateConnectorOut=dp.getTGConnectorDelegateOut();
if (myDelegateConnectorOut==null) return null;
ProCSDPort p2=myDelegateConnectorOut.getMyPort2(fatherPorts);
if ((p2!=null) && (!p2.equals(dp))) return p2;
return null;
}
*/
/*
private ProCSDPort getFromOutsideConnectedPort(ProCSDPort dp)
{
TGComponent father=dp.getFather().getFather();
if (father==null)
{
addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: forbiden delegate port at this level "+dp.getValue());
return null;
}
LinkedList fatherPorts=getPorts(father);
TGConnectorDelegateProCSD myDelegateConnectorIn=dp.getTGConnectorDelegateIn();
if (myDelegateConnectorIn==null) return null;
ProCSDPort p2=myDelegateConnectorIn.getMyPort1(fatherPorts);
if ((p2!=null) && (!p2.equals(dp))) return p2;
return null;
}
*/
// private ProCSDPort getToInsideConnectedPort(ProCSDPort dp)
// {
// //we're looking for a port who's not a father port
// TGComponent father=dp.getFather().getFather();
// if (father==null)
// {
// addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: forbiden delegate port at this level "+dp.getValue());
// return null;
// }
// LinkedList fatherPorts=getPorts(father);
//
// TGConnectorDelegateProCSD myDelegateConnectorOut=dp.getTGConnectorDelegateOut();
// if (myDelegateConnectorOut==null) return null;
// ProCSDPort p2=myDelegateConnectorOut.getMyPort2(portsList);
//
// if ((p2!=null) && (!p2.equals(dp)) && !fatherPorts.contains(p2)) return p2;
//
// return null;
//
//
//
// }
// private ProCSDPort getFromInsideConnectedPort(ProCSDPort dp)
// {
//
//// we're looking for a port who's not a father's port
// TGComponent father=dp.getFather().getFather();
// if (father==null)
// {
// addCheckingError(CheckingError.STRUCTURE_ERROR,"Error: forbiden delegate port at this level "+dp.getValue());
//
// return null;
// }
// LinkedList fatherPorts=getPorts(father);
//
// TGConnectorDelegateProCSD myDelegateConnectorIn=dp.getTGConnectorDelegateIn();
// if (myDelegateConnectorIn==null) return null;
// ProCSDPort p1=myDelegateConnectorIn.getMyPort1(portsList);
//
// if ((p1!=null) && (!p1.equals(dp)) && !fatherPorts.contains(p1)) return p1;
//
// return null;
//
// }
/*
* we are dealing with a comp specification within a
* ProActiveCompSpecificationCSDPanel
*
*/
private boolean parseStructureAndFillUpListsForCompDefinition(TGComponent t) {
if (t.getType() == TGComponentManager.PROCSD_INTERFACE) {
interfacesList.add((ProCSDInterface) t);
}
if (t.getType() == TGComponentManager.CONNECTOR_PROCSD) {
connectorsList.add((TGConnectorProCSD) t);
}
if (t.getType() == TGComponentManager.CONNECTOR_PROCSD_PORT_INTERFACE) {
connectorsPortInterfacesList.add((TGConnectorPortInterface) t);
}
/*
//Delegate ports removed, by Solange
if ( (t.getType()==TGComponentManager.PROCSD_IN_PORT) || (t.getType()==TGComponentManager.PROCSD_OUT_PORT))// || (t.getType()==TGComponentManager.PROCSD_DELEGATE_PORT))
portsList.add(t);
*/
if ((t.getType() == TGComponentManager.PROCSD_COMPONENT))
// if (ProCSDComponentsList.contains(t))
// return false;
// else
{
proCSDComponentsList.add((ProCSDComponent) t);
int nb = t.getNbInternalTGComponent();
for (int j = 0; j < nb; j++) {
TGComponent tgc = t.getInternalTGComponent(j);
if (!parseStructureAndFillUpListsForCompDefinition(tgc)) return false;
}
if (((ProCSDComponent) t).getMyDesignPanel() != null) {
ProActiveCompSpecificationCSDPanel specPanel = ((ProCSDComponent) t).getMyDesignPanel();
for (int q = 0; q < specPanel.componentList.size(); q++) {
TGComponent component = specPanel.componentList.get(q);
if (!parseStructureAndFillUpListsForCompDefinition(component)) return false;
}
}
}
return true;
}
/*
* Add a component to the corresponding list according to his type (interface, connector, port, component)
* @param t The component
*/
private boolean parseStructureAndFillUpLists(TGComponent t) {
if (t.getType() == TGComponentManager.PROCSD_INTERFACE) {
interfacesList.add((ProCSDInterface) t);
}
if (t.getType() == TGComponentManager.CONNECTOR_PROCSD) {
connectorsList.add((TGConnectorProCSD) t);
}
if (t.getType() == TGComponentManager.CONNECTOR_PROCSD_PORT_INTERFACE) {
connectorsPortInterfacesList.add((TGConnectorPortInterface) t);
}
//Delegate ports removed, by Solange
if ((t.getType() == TGComponentManager.PROCSD_IN_PORT) || (t.getType() == TGComponentManager.PROCSD_OUT_PORT))// || (t.getType()==TGComponentManager.PROCSD_DELEGATE_PORT))
portsList.add((ProCSDPort) t);
if ((t.getType() == TGComponentManager.PROCSD_COMPONENT)) {
// if (ProCSDComponentsList.contains(t))
// {
// TraceManager.addDev("Cycle found.");
// return false;
// }
proCSDComponentsList.add((ProCSDComponent) t);
int nb = t.getNbInternalTGComponent();
for (int j = 0; j < nb; j++) {
TGComponent tgc = t.getInternalTGComponent(j);
parseStructureAndFillUpLists(tgc);
}
if (((ProCSDComponent) t).getMyDesignPanel() != null) {
ProActiveCompSpecificationCSDPanel specPanel = ((ProCSDComponent) t).getMyDesignPanel();
for (int q = 0; q < specPanel.componentList.size(); q++) {
TGComponent component = specPanel.componentList.get(q);
if (!parseStructureAndFillUpListsForCompDefinition(component))
return false;
}
}
}
return true;
}
/*
* Method implementing the algorithm used to create TClasses from a CTTool Component Model
* @param tm TurtleModeling to be updated with TClasses
* @param the main coponent of the aplication - the container of all components
*/
private void addTClasses(TURTLEModeling tm, Component appComp) {
Collection<Component> primitives = appComp.getAllPrimitives();
Iterator<Component> primitivesIterator = primitives.iterator();
while (primitivesIterator.hasNext()) {
Component comp = primitivesIterator.next();
TClass tclass = new TClass(comp.getPath().replaceAll("[.]", "_"), true);
// TraceManager.addDev("tClass created: "+comp.getValue());
Collection<Attribute> attribs = comp.getAttributes();
Iterator<Attribute> attribsIterator = attribs.iterator();
while (attribsIterator.hasNext()) {
Attribute modelAt = attribsIterator.next();
TAttribute a = new TAttribute(modelAt.getAccess(), modelAt.getName(), modelAt.getInitialValue(), modelAt.getType());
//if (a.getType() == TAttribute.NATURAL)
{
Param p = new Param(a.getId(), Param.NAT, a.getInitialValue());
p.setAccess(a.getAccessString());
tclass.addParameter(p);
}
}
Collection<Port> ports = comp.getPorts();
Iterator<Port> portsIterator = ports.iterator();
while (portsIterator.hasNext()) {
Port p = portsIterator.next();
Interface myInterface = p.getInterface();
if (myInterface == null) {
addCheckingError(CheckingError.STRUCTURE_ERROR, "No interface found for the port " + p.getName() + " in component " + p.getFather().getPath());
return;
}
Collection<Message> messages = myInterface.getMessages();
//LinkedList gates=myInterface.getMyMessages();
Iterator<Message> msgsIterator = messages.iterator();
while (msgsIterator.hasNext()) {
Message msg = msgsIterator.next();
//!!!! to see:
// the gate type
// internal gates
Gate gt = new Gate(p.getName() + "_" + msg.getName(), Gate.GATE, false);
tclass.addGate(gt);
}
}//for ports
tm.addTClass(tclass);
ProactiveSMDPanel psmdp = (ProactiveSMDPanel) comp.getBehaviour();
buildErrors = false;
buildActivityDiagram(tclass, psmdp, false, comp.getName() + "_SMD");
}//for all primitives
}
/*
* Method implementing the algorithm used to create TClasses from a ProCSDComponent
* @param tm TurtleModeling to be updated with TClasses
*/
// private void addTClasses(TURTLEModeling tm)
// {
// List<ProCSDComponent> primitives=getPrimitives();
// for (int i=0;i<primitives.size();i++)
// {
// ProCSDComponent comp= primitives.get(i);
// TClass tclass =new TClass(comp.getValue(),true);
// // TraceManager.addDev("tClass created: "+comp.getValue());
// List<TAttribute> attribs=comp.getMyAttributes();
//
// for (int at=0;at<attribs.size();at++)
// {
// TAttribute a= attribs.get(at);
// //if (a.getType() == TAttribute.NATURAL)
// {
// Param p = new Param(a.getId(), Param.NAT, a.getInitialValue());
// p.setAccess(a.getAccessString());
// tclass.addParameter(p);
// }
//
// }
// List<ProCSDPort> ports=getPorts(comp);
// for (int j=0;j<ports.size();j++)
// {
// ProCSDPort p= ports.get(j);
// ProCSDInterface myInterface=p.getMyInterface(interfacesList);
// if (myInterface==null)
// {
// addCheckingError(CheckingError.STRUCTURE_ERROR,"No interface found for the port " +p.getValue()+" in component "+p.getFather().getValue());
// return;
//
// }
// List<TAttribute> gates=myInterface.getMyMessages();
//
// for (int g=0;g<gates.size();g++)
// {
// TAttribute ta= gates.get(g);
// //!!!! to see:
// // the gate type
// // internal gates
// Gate gt=new Gate(p.getValue()+"_"+ta.getId(),Gate.GATE,false);
// tclass.addGate(gt);
// }
//
// }//for ports
// tm.addTClass(tclass);
// ProactiveSMDPanel psmdp=pdp.getSMDPanel(tclass.getName());
// buildErrors=false;
// buildActivityDiagram(tclass,psmdp,false,comp.getName()+"_SMD");
// }//for all primitives
// }
private boolean verifyAllParamsDefined(TClass t, String action, String machineName) {
String msgDescription = action;
int iSend = action.indexOf("!");
int iReceived = action.indexOf("?");
int end = action.length();
// boolean finished=false;
if (iSend == -1) iSend = end;
if (iReceived == -1) iReceived = end;
int i1 = Math.min(iSend, iReceived);
if (iSend == iReceived) return true;
while (!action.equals("")) {
// if (current==end) break;
//action=action.substring(current+1);
action = action.substring(i1 + 1);
//if (action.equals("")) return true;
end = action.length();
iSend = action.indexOf("!");
iReceived = action.indexOf("?");
if (iSend == -1) iSend = end;
if (iReceived == -1) iReceived = end;
int i2 = Math.min(iSend, iReceived);
String paramName = action.substring(0, i2);
//check if the param is a number. if not, check if it is defined as an attribute
try {
Integer.parseInt(paramName);
} catch (NumberFormatException ex) {
if (t.getParamByName(paramName) == null) {
this.addCheckingError(new CheckingError(CheckingError.BEHAVIOR_ERROR, "Error in state machine " + machineName + ". In message (" + msgDescription + ") parameter " + paramName + " not known."));
return false;
}
}
if (i2 == end) return true;
i1 = i2;
}
return false;
}
/*
* Big and ugly Method implementing the algorithm used to create Activity Diagram from a State Machine Diagram
* @param t TClass that owns the Activity Diagram
* @param psmdp Proactive State Machine Diagram to be converted
* @param isSubmachine Boolean value to see if it is a submachine
*/
private void buildActivityDiagram(TClass t, ProactiveSMDPanel psmdp, boolean isSubmachine, String machineCode) {
int subMachineIndex = 0;
if (!isSubmachine)
//listE=new CorrespondanceTGElement();
corespManager = new CorrespondanceSMDManager();
if (psmdp == null) {
CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "No state machine diagram found for primitive " + t.getName());
addCheckingError(ce);
return;
}
ActivityDiagram ad;
// TraceManager.addDev("building activity diagram for "+t.getName() + " from panel "+psmdp.getName());
String name = t.getName();
// DB Issue #17 Dead code
// if (psmdp == null) {
// return;
// }
List<TGComponent> list = psmdp.getComponentList();
Iterator<TGComponent> iterator = list.listIterator();
TGComponent tgc;
ProSMDStartState proStart = null;
int cptStart = 0;
// TraceManager.addDev(t.getName()+" smd elements: ");
while (iterator.hasNext()) {
tgc = iterator.next();
//TraceManager.addDev(tgc.getName()+":"+tgc.getValue());
if (tgc instanceof ProSMDStartState) {
proStart = (ProSMDStartState) tgc;
cptStart++;
}
//generating a unique code for each subMachine:
if (tgc instanceof ProSMDSubmachine) {
ProSMDSubmachine psm = (ProSMDSubmachine) tgc;
// psm.setCode(psmdp.getName()+subMachineIndex+psm.getValue());
psm.setCode(machineCode + subMachineIndex + psm.getValue());
subMachineIndex++;
}
}
if (proStart == null) {
UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "No start state in the state machine diagram of " + name);
ce.setTClass(t);
ce.setTDiagramPanel(psmdp);
addCheckingError(ce);
return;
}
if (cptStart > 1) {
UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "More than one start state in the activity diagram of " + name);
ce.setTClass(t);
ce.setTDiagramPanel(psmdp);
addCheckingError(ce);
return;
}
//we treat differently the start state if it's a sub machine:
//we put a junction for this start state and connect the connector to the submachine to this junction
if (!isSubmachine) {
ADStart ads = new ADStart();
//listE.addCorInPanel(ads, proStart,psmdp.name);
corespManager.addCorrespondance(ads, proStart, psmdp.getName(), machineCode);
ad = new ActivityDiagram(ads);
t.setActivityDiagram(ad);
} else
//we treat differently the start state if it's a sub machine:
//we put a junction for this start state and connect the connector to the submachine to this junction
{
ad = t.getActivityDiagram();
ADJunction adj = new ADJunction();
proStart.setValue(psmdp.getName() + "_start");
ad.addElement(adj);
//listE.addCorInPanel(adj, proStart,psmdp.name);
corespManager.addCorrespondance(adj, proStart, psmdp.getName(), machineCode);
}
iterator = list.listIterator();
while (iterator.hasNext()) {
tgc = iterator.next();
if (tgc instanceof ProSMDGetMsg) {
ProSMDGetMsg getMsg = (ProSMDGetMsg) tgc;
String action = getMsg.getAction();
//t.getParamFromActionState("");
String viaPort = getMsg.getViaPort();
Gate g = t.getGateFromActionState(viaPort + "_" + action);
// TraceManager.addDev("looking for gate "+viaPort+"_"+action+" in class" +t.getName());
if (g == null) {
CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, psmdp.getName() + " smd :" + action + " via port " + viaPort + " not found. Verify method name and port.");
//TraceManager.addDev("!!!!!!!!!!!!!!!!!1Error! no gate found");
addCheckingError(ce);
buildErrors = true;
return;
}
verifyAllParamsDefined(t, action, psmdp.getName());
// TraceManager.addDev("gate created: "+g.getName());
ADActionStateWithGate adag = new ADActionStateWithGate(g);
ad.addElement(adag);
String params = t.getActionValueFromActionState(action);
params = TURTLEModeling.manageGateDataStructures(t, params);
params = TURTLEModeling.addTypeToDataReceiving(t, params);
adag.setActionValue(params);
//listE.addCorInPanel(adag, tgc,psmdp.name);
corespManager.addCorrespondance(adag, tgc, psmdp.getName(), machineCode);
}//if prosmdGetMessage
else if (tgc instanceof ProSMDSendMsg) {
ProSMDSendMsg sendMsg = (ProSMDSendMsg) tgc;
String action = sendMsg.getAction();
String viaPort = sendMsg.getViaPort();
Gate g = t.getGateFromActionState(viaPort + "_" + action);
// TraceManager.addDev("looking for gate "+viaPort+"_"+action+" in class" +t.getName());
if (g == null) {
CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, psmdp.getName() + " smd :" + action + " via port " + viaPort + " not found. Verify method name and port.");
//TraceManager.addDev("!!!!!!!!!!!!!!!!!1Error! no gate found");
addCheckingError(ce);
buildErrors = true;
return;
}
verifyAllParamsDefined(t, action, psmdp.getName());
// TraceManager.addDev("gate created: "+g.getName());
ADActionStateWithGate adag = new ADActionStateWithGate(g);
ad.addElement(adag);
String params = t.getActionValueFromActionState(action);
params = TURTLEModeling.manageGateDataStructures(t, params);
params = TURTLEModeling.addTypeToDataReceiving(t, params);
adag.setActionValue(params);
// listE.addCorInPanel(adag, tgc,psmdp.name);
corespManager.addCorrespondance(adag, tgc, psmdp.getName(), machineCode);
}//if prosmdGetMessage
else if (tgc instanceof ProSMDAction) {
String s = ((ProSMDAction) tgc).getAction();
s = s.trim();
s = TURTLEModeling.manageDataStructures(t, s);
Param p = t.getParamFromActionState(s);
if (p == null) {
CheckingError ce = new CheckingError(CheckingError.BEHAVIOR_ERROR, psmdp.getName() + " smd : Error in action " + tgc.getValue());
//TraceManager.addDev("!!!!!!!!!!!!!!!!!1Error! no gate found");
addCheckingError(ce);
buildErrors = true;
return;
}
// TraceManager.addDev("Action state with param found " + p.getName() + " value:" + t.getExprValueFromActionState(s));
ADActionStateWithParam adap = new ADActionStateWithParam(p);
ad.addElement(adap);
adap.setActionValue(TURTLEModeling.manageDataStructures(t, t.getExprValueFromActionState(s)));
// TraceManager.addDev("action:"+adap.getParam()+"="+adap.getActionValue());
//listE.addCorInPanel(adap, tgc,psmdp.name);
corespManager.addCorrespondance(adap, tgc, psmdp.getName(), machineCode);
} else if (tgc instanceof ProSMDChoice) {
ADChoice adch = new ADChoice();
ad.addElement(adch);
//listE.addCorInPanel(adch, tgc,psmdp.name);
corespManager.addCorrespondance(adch, tgc, psmdp.getName(), machineCode);
} else if (tgc instanceof ProSMDJunction) {
ADJunction adj = new ADJunction();
ad.addElement(adj);
// listE.addCorInPanel(adj, tgc,psmdp.name);
corespManager.addCorrespondance(adj, tgc, psmdp.getName(), machineCode);
} else if (tgc instanceof ProSMDState) {
// TraceManager.addDev("state found :" +tgc.getValue());
// ADComponent adc=listE.getADComponentByName(tgc.getValue(),psmdp.name);
ADComponent adc = corespManager.getADComp((ProSMDState) tgc, psmdp.getName(), machineCode);
if (adc == null) {
ADJunction adj = new ADJunction();
ad.addElement(adj);
//listE.addCorInPanel(adj, tgc,psmdp.name);
corespManager.addCorrespondance(adj, tgc, psmdp.getName(), machineCode);
// TraceManager.addDev("first instance of :" +tgc.getValue());
} else {
if (!(adc instanceof ADJunction)) {
// TraceManager.addDev("Error (bug): to the state "+tgc.getValue()+" no coresponding junction founded. Please send your xml file to the producer of this software." );
addCheckingError(new CheckingError(CheckingError.BEHAVIOR_ERROR, "This error should never happen. This is a bug. Please send your model to the producer. Thank you"));
buildErrors = true;
return;
}
//listE.addCorInPanel((ADJunction)adc,tgc,psmdp.name);
corespManager.addCorrespondance(adc, tgc, psmdp.getName(), machineCode);
// TraceManager.addDev("other instance of :" +tgc.getValue());
}
}
//else if (tgc instanceof ProSMDParallel)
else if (tgc.getType() == TGComponentManager.TAD_PARALLEL)
//we translate a paralel operator as a non deterministic choice:
/* {
TraceManager.addDev("!!!!!!!!!!!!!!!!1Parallel found ");
ADParallel adp = new ADParallel();
ad.addElement(adp);
adp.setValueGate(((TADParallel)tgc).getValueGate());
listE.addCorInPanel(adp, tgc,psmdp.name);
} */ {
ADChoice adch = new ADChoice();
ad.addElement(adch);
//listE.addCorInPanel(adch, tgc,psmdp.name);
corespManager.addCorrespondance(adch, tgc, psmdp.getName(), machineCode);
} else if (tgc instanceof ProSMDStopState) {
if (!isSubmachine) {
ADStop adst = new ADStop();
ad.addElement(adst);
//listE.addCorInPanel(adst, tgc,psmdp.name);
corespManager.addCorrespondance(adst, tgc, psmdp.getName(), machineCode);
} else {
//for a submachine we put a junction for it's stop state
ADJunction adj = new ADJunction();
tgc.setValue(psmdp.getName() + "_stop");
ad.addElement(adj);
// listE.addCorInPanel(adj,tgc,psmdp.name);
corespManager.addCorrespondance(adj, tgc, psmdp.getName(), machineCode);
}
} else if (tgc instanceof ProSMDSubmachine) {
//TraceManager.addDev("Submachine found: " +tgc.getValue());
ProactiveSMDPanel subMachinePanel = pdp.getSMDPanel(tgc.getValue());
//TraceManager.addDev("Panel found: " +subMachinePanel.getName());
//recursive:
if (subMachinePanel == null) {
CheckingError ce = new CheckingError(CheckingError.STRUCTURE_ERROR, "StateMachine " + t.getName() + ": No state machine diagram found for submachine " + tgc.getValue());
addCheckingError(ce);
return;
}
buildActivityDiagram(t, subMachinePanel, true, ((ProSMDSubmachine) tgc).getCode());
if (buildErrors) return;
}
}//while hasnext - creating elements
// Connecting elements
iterator = list.listIterator();
while (iterator.hasNext()) {
tgc = iterator.next();
if (tgc instanceof TGConnectorProSMD) {
TGConnectorProSMD con = (TGConnectorProSMD) tgc;
TGConnectingPoint p1 = con.getTGConnectingPointP1();
TGConnectingPoint p2 = con.getTGConnectingPointP2();
// identification of connected components
TGComponent tgc1 = null;
TGComponent tgc2 = null;
for (int j = 0; j < list.size(); j++) {
TGComponent tmp = list.get(j);
if (tmp.belongsToMe(p1)) {
tgc1 = tmp;
}
if (tmp.belongsToMe(p2)) {
tgc2 = tmp;
}
}//for
// connecting turtle modeling components
if ((tgc1 != null) && (tgc2 != null)) {
//ADComponent ad1, ad2;
// TraceManager.addDev("tgc1: "+tgc1.toString()+"-----tgc2: "+tgc2.toString());
//ADComponent ad1 = listE.getADComponentInPanel(tgc1, psmdp.name);
// ADComponent ad2 = listE.getADComponentInPanel(tgc2, psmdp.name);
ADComponent ad1 = corespManager.getADComp(tgc1, psmdp.getName(), machineCode);
ADComponent ad2 = corespManager.getADComp(tgc2, psmdp.getName(), machineCode);
if (tgc2 instanceof ProSMDSubmachine) {
// TraceManager.addDev("connetor to a submachine. Looking for "+ tgc2.getValue()+"_start");
//ad2=listE.getADComponentByName(tgc2.getValue()+"_start",tgc2.getValue());
//should look for the start of the subMachine
TGComponent startTGComp = getStartComp((ProSMDSubmachine) tgc2);
if (startTGComp == null) {
addCheckingError(CheckingError.BEHAVIOR_ERROR, "No start state found in state machine " + tgc2.getValue());
return;
}
ad2 = corespManager.getADComp(startTGComp, tgc2.getValue(), ((ProSMDSubmachine) tgc2).getCode());
}
if (tgc1 instanceof ProSMDSubmachine) { //TraceManager.addDev("connetor from a submachine. Looking for "+ tgc2.getValue()+"_stop");
//ad1=listE.getADComponentByName(tgc1.getValue()+"_stop",tgc1.getValue());
TGComponent stopTGComp = getStopComp((ProSMDSubmachine) tgc1);
if (stopTGComp == null) {
addCheckingError(CheckingError.BEHAVIOR_ERROR, "No stop state found in state machine " + tgc1.getValue() + ". " + tgc2.toString() + " in panel " + psmdp.getName() + " is not reachable.");
return;
}
ad1 = corespManager.getADComp(stopTGComp, tgc1.getValue(), ((ProSMDSubmachine) tgc1).getCode());
}
if ((ad1 == null) || (ad2 == null)) {
TraceManager.addDev("Correspondance issue");
}
int index = 0;
if (tgc1 instanceof ProSMDChoice) {
ProSMDChoice tadch = (ProSMDChoice) tgc1;
index = tgc1.indexOf(p1) - 1;
((ADChoice) ad1).addGuard(TURTLEModeling.manageGateDataStructures(t, tadch.getGuard(index)));
ad1.addNext(ad2);
} else
ad1.addNextAtIndex(ad2, index);
}//if ((tgc1 != null) && (tgc2 != null))
}//if TGConnector
}//while - connecting elements
psmdp.count++;
}
private TGComponent getStartComp(ProSMDSubmachine subMachine) {
ProactiveSMDPanel subMachinePanel = pdp.getSMDPanel(subMachine.getValue());
List<TGComponent> list = subMachinePanel.getComponentList();
Iterator<TGComponent> iterator = list.listIterator();
TGComponent tgc;
ProSMDStartState proStart = null;
while (iterator.hasNext()) {
tgc = iterator.next();
if (tgc instanceof ProSMDStartState) {
proStart = (ProSMDStartState) tgc;
return proStart;
}//if
}//while
return null;
}
private TGComponent getStopComp(ProSMDSubmachine subMachine) {
ProactiveSMDPanel subMachinePanel = pdp.getSMDPanel(subMachine.getValue());
List<TGComponent> list = subMachinePanel.getComponentList();
Iterator<TGComponent> iterator = list.listIterator();
TGComponent tgc;
ProSMDStopState proStop = null;
while (iterator.hasNext()) {
tgc = iterator.next();
if (tgc instanceof ProSMDStopState) {
proStop = (ProSMDStopState) tgc;
return proStop;
}//if
}//while
return null;
}
/*
* Method used when converting from ProactiveDesign to TurtleModeling
* that implements the algorithm to see if creates a Synchronisation between
* Tclasses.
* @param tm TurtleModeling to be updated
*/
/*
private void addSynchronisationsOld(TURTLEModeling tm)
{
String gname1="", gname2="";
LinkedList primitives=getPrimitives();
for (int i=0;i<primitives.size();i++)
{
ProCSDComponent comp=(ProCSDComponent)primitives.get(i);
LinkedList ports=getPorts(comp);
for (int j=0;j<ports.size();j++)
{
ProCSDPort p=(ProCSDPort)ports.get(j);
ProCSDPort toP=p.getToPort();
ProCSDPort fromP=p.getFromPort();
//Added by Solange
TClass t1=tm.getTClassWithName(p.getFather().getValue());
//Added by Solange
puerto=p;
//Added by Solange
if (t1==null)
{
t1=searchInport(fromP);
//flag=1;
}
if (t1==null)
{
t1=searchOutport(toP);
//flag=2;
}
puerto2=puerto; //Added by Solange to save this value
// until here
ProCSDPort tmpP;
if (toP!=null) tmpP=toP;
else{
if(fromP!=null)
tmpP=fromP;
else
{
TraceManager.addDev("Port " + p.toString() + " is not connected");
break;
}
}
{//this port is an out one
//TraceManager.addDev("Synchronisation with -> "+toP.getFather().toString());
//TraceManager.addDev("Synchro gates :");
puerto=tmpP; //Added by Solange
TClass t2=tm.getTClassWithName(tmpP.getFather().getValue());
//Added by Solange this two if
if (t2==null)
{
t2=searchOutport(puerto.getToPort());
}
if (t2==null)
{
t2=searchInport(puerto.getFromPort());
}
//
ProCSDInterface myInterface=p.getMyInterface(interfacesList);
LinkedList gates=myInterface.getMyMessages();
for (int k=0;k<gates.size();k++)
{
TAttribute a = (TAttribute)(gates.get(k));
gname1=puerto2.getValue()+"_"+a.getId();
gname2=puerto.getValue()+"_"+a.getId();
//i want to see the value, by Solange
// Added by Solange to handle messages not received
if((t1!=null)&&(t2!=null))
{
Gate h=t1.getGateByName(gname1);
Gate y=t2.getGateByName(gname2);
tm.addSynchroRelation(t1,h,t2,y);
}
}
}
}
}//for all components
}
*/
/*
* Method used when converting from ProactiveDesign to TurtleModeling
* that implements the algorithm to see if creates a Synchronisation between
* Tclasses.
* @param tm TurtleModeling to be updated
*/
private void addSynchronisations(TURTLEModeling tm, Component appComp) {
String gname1 = "", gname2 = "";
Collection<Component> primitives = appComp.getAllPrimitives();
Iterator<Component> primitivesIterator = primitives.iterator();
while (primitivesIterator.hasNext()) {
Component comp = primitivesIterator.next();
Collection<Port> ports = comp.getPorts();
Iterator<Port> portsIterator = ports.iterator();
while (portsIterator.hasNext()) {
Port p = portsIterator.next();
Port toP = p.getLastToPort();
Port fromP = p.getLastFromPort();
TClass t1 = tm.getTClassWithName(p.getFather().getPath().replaceAll("[.]", "_"));
TClass t2 = null;
Port connectedPort = null;
if (toP != null)
connectedPort = toP;
else if (fromP != null)
connectedPort = fromP;
if (connectedPort == null) {
TraceManager.addDev("Problem in finding conection for " + p.toString());
//TODO add an error here
Interface myInterface = p.getInterface();
if ((myInterface != null) && (myInterface.isMandatory())) {
this.addCheckingError(CheckingError.STRUCTURE_ERROR, "No connection found for mandatory port " + p.getFather().getPath() + "->" + p.getName());
return;
}//if is mandatory
}//if connectedPort!=null
else {
t2 = tm.getTClassWithName(connectedPort.getFather().getPath().replaceAll("[.]", "_"));
Interface myInterface = p.getInterface();
Interface theOtherInterface = connectedPort.getInterface();
Iterator<Message> msgIt = myInterface.getMessages().iterator();
while (msgIt.hasNext()) {
Message m = msgIt.next();
if (theOtherInterface.getMessageByName(m.getName()) == null) {
addCheckingError(new CheckingError(CheckingError.STRUCTURE_ERROR, "Interfaces incompatible. Interface1:" + p.getFather().getPath() + "_" + p.getName() + "->" + myInterface.getName() + ". Interface2: " + connectedPort.getFather().getPath() + "_" + connectedPort.getName() + "->" + theOtherInterface.getName()));
}
gname1 = p.getName() + "_" + m.getName();
gname2 = connectedPort.getName() + "_" + m.getName();
//i want to see the value, by Solange
// Added by Solange to handle messages not received
if ((t1 != null) && (t2 != null)) {
Gate h = t1.getGateByName(gname1);
Gate y = t2.getGateByName(gname2);
tm.addSynchroRelation(t1, h, t2, y);
}
}
}//connectedPort!=null
}
}//for all components
}
/*
* Method used when converting from ProactiveDesign to TurtleModeling
* that implements the algorithm to see if creates a Synchronisation between
* Tclasses.
* @param tm TurtleModeling to be updated
*/
// private void addSynchronisations(TURTLEModeling tm) {
// String gname1="", gname2="";
// List<ProCSDComponent> primitives=getPrimitives();
// for (int i=0;i<primitives.size();i++)
// {
// ProCSDComponent comp= primitives.get(i);
// List<ProCSDPort> ports=getPorts(comp);
//
// for (int j=0;j<ports.size();j++)
// {
// ProCSDPort p=ports.get(j);
// ProCSDPort toP=p.getToFinalPort();
// ProCSDPort fromP=p.getFromFinalPort();
//
// //Added by Solange
// TClass t1=tm.getTClassWithName(p.getFather().getValue());
// //Added by Solange
// TClass t2=null;
// ProCSDPort connectedPort=null;
//
// if (toP!=null)
// {
// connectedPort=toP;
// }
// else if (fromP!=null)
// {
// connectedPort=fromP;
// }
// else
// {
// // TraceManager.addDev("Problem in finding conection for "+p.toString());
// addCheckingError(CheckingError.STRUCTURE_ERROR,"Problem in finding conection for "+p.toString()+" in component "+p.getFather().toString());
// //TODO add an error here
// }
// t2=tm.getTClassWithName(connectedPort.getFather().getValue());
// ProCSDInterface myInterface=p.getMyInterface();
// LinkedList gates=myInterface.getMyMessages();
// for (int k=0;k<gates.size();k++)
// {
// TAttribute a = (TAttribute)(gates.get(k));
// gname1=p.getValue()+"_"+a.getId();
// gname2=connectedPort.getValue()+"_"+a.getId();
// //i want to see the value, by Solange
// // Added by Solange to handle messages not received
// if((t1!=null)&&(t2!=null))
// {
// Gate h=t1.getGateByName(gname1);
// Gate y=t2.getGateByName(gname2);
// tm.addSynchroRelation(t1,h,t2,y);
// }
// }
// }
//
// }//for all components
// }
//Method created by Solange
// and removed by emil
/*
public TClass searchOutport(ProCSDPort p)
{
puerto=p; //Added by Solange
TClass t1=tm.getTClassWithName(p.getFather().getValue());
if(t1==null)
{
puerto=p.getToPort();
t1=searchOutport(puerto);
}
return(t1);
}
*/
//Method created by Solange
//and removed by emil
/*
public TClass searchInport(ProCSDPort p)
{
puerto=p;
TClass t1=tm.getTClassWithName(p.getFather().getValue());
if(t1==null)
{
puerto=p.getFromPort();
t1=searchInport(puerto);
}
return(t1);
}
*/
//
/*
private void listClasses(TURTLEModeling tm )
{
int nb=tm.classNb();
for (int i=0;i<nb;i++)
{
TClass t=tm.getTClassAtIndex(i);
TraceManager.addDev("TClass:"+ t.getName());
TraceManager.addDev("gates: ");
Vector gates=t.getGateList();
for (int j=0;j<gates.size();j++)
{
Gate g=(Gate)gates.elementAt(j);
TraceManager.addDev(g.toString());
}
}
TraceManager.addDev("--------Relations : ---------");
for (int r=0;r<tm.relationNb();r++)
{
Relation rel=tm.getRelationAtIndex(r);
rel.print();
}
}
*/
public List<CheckingError> getCheckingWarnings() {
return null;
}
public List<CheckingError> getCheckingErrors() {
return checkingErrors;
}
private void addCheckingError(CheckingError ce) {
checkingErrors.add(ce);
}
private void addCheckingError(int t, String s) {
checkingErrors.add(new CheckingError(t, s));
}
}