Commit 6e400989 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+generate behaviour first steps

parent a4864e61
Loading
Loading
Loading
Loading
Loading
+118 −17
Original line number Diff line number Diff line
@@ -33,8 +33,17 @@ import org.etsi.mts.tdl.ComponentInstanceRole;
import org.etsi.mts.tdl.Extension;
import org.etsi.mts.tdl.GateType;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.Behaviour;
import org.etsi.mts.tdl.CompoundBehaviour;
import org.etsi.mts.tdl.BoundedLoopBehaviour;
import org.etsi.mts.tdl.AlternativeBehaviour;
import org.etsi.mts.tdl.ConditionalBehaviour;
import org.etsi.mts.tdl.ProcedureCall;
import org.etsi.mts.tdl.Interaction;
import org.etsi.mts.tdl.Message;
import org.etsi.mts.tdl.StructuredDataType;
import org.etsi.mts.tdl.TestConfiguration;
import org.etsi.mts.tdl.TestDescription;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.asn2tdl.ASN2TDLTranslator;
import org.etsi.mts.tdl.constraints.evl.Validator;
@@ -377,6 +386,32 @@ public class Standalone {
		Resource resource = TDLHelper.load(path);
		//export to external generator
		EObject model = resource.getContents().get(0);
		generateConfiguration(path, model);
        System.out.println();
        generateBehaviour(path, model);

		/*
		 *  @startuml
            component Tester {
            portout p1c
            portout p2c
            portout p3c
            }

            component SUT {
            portin p1d
            portin p2d
            portin p3d
            }
            p1c <--> p1d
            p2c <--> p2d
            p3c <--> p3d
            @enduml

		 */
	}

    private void generateConfiguration(String path, EObject model) {
        List<TestConfiguration> testConfigurations = EcoreUtil2.getAllContentsOfType(model, TestConfiguration.class);
		String d = "@startuml\n";
		for (TestConfiguration tc : testConfigurations) {
@@ -416,27 +451,93 @@ public class Standalone {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }

		/*
		 *  @startuml
            component Tester {
            portout p1c
            portout p2c
            portout p3c
    private void generateBehaviour(String path, EObject model) {
        List<TestDescription> testDescriptions = EcoreUtil2.getAllContentsOfType(model, TestDescription.class);

        
		for (TestDescription td : testDescriptions) {
            String d = "@startuml\n";
            d+="hide footbox\n";
            d+="title Foot Box removed\n";
            TestConfiguration tc = td.getTestConfiguration();
			for (var i : tc.getComponentInstance()) {
				if (i.getRole() == ComponentInstanceRole.TESTER) {
                    d+="participant "+tc.getName()+"_"+i.getName()+" [\n  == "
                    +i.getRole().toString()
                    +"\n  ----\n  \"\""
                    +i.getName()
                    +" : "
                    +i.getType().getName()
                    +"\"\"\n]\n\n";
				}
			}
			for (var i : tc.getComponentInstance()) {
				if (i.getRole() == ComponentInstanceRole.SUT) {
                    d+="participant "+tc.getName()+"_"+i.getName()+" [\n  == "
                    +i.getRole().toString()
                    +"\n  ----\n  \"\""
                    +i.getName()
                    +" : "
                    +i.getType().getName()
                    +"\"\"\n]\n\n";
				}
			}
            
            component SUT {
            portin p1d
            portin p2d
            portin p3d
            if (td.getBehaviourDescription()!= null) {
                var b = td.getBehaviourDescription().getBehaviour();
                try {
                    d += processBehaviour(castObject(b.getClass(), b));
                } catch (Exception e) {
                    System.out.println("Error: "+e.getMessage());
                }
            }
            p1c <--> p1d
            p2c <--> p2d
            p3c <--> p3d
            @enduml

		 */
            d += "@enduml";
            //TODO: need to split behaviours..
            System.out.println(d);
            try {
                //TODO: make configurable
                Files.writeString(Path.of(path+"-"+td.getName()+"-behaviour.md"), d);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
		}
    }

    private <T> T castObject(Class<T> clazz, Object object) {
        return (T) object;
    }

    private String processBehaviour(Behaviour b) {
        String d = "' Not supported yet: "+b.getClass().getName();
        System.out.println(d);
        return d+"\n";
    }

    private String processBehaviour(CompoundBehaviour b) {
        String d = "";
        for (var nested : b.getBlock().getBehaviour()) {
            d+=processBehaviour(castObject(nested.getClass(), nested));
        }
        //TODO: handle prefixes and indentation?
        return d;
    }

    private String processBehaviour(Message b) {
        var sc = b.getSourceGate().getComponent();
        var c = sc.container().getName()+"_"+sc.getName();
        var tc = b.getTarget().get(0).getTargetGate().getComponent();
        var t = tc.container().getName()+"_"+tc.getName();
        var a = b.getArgument();
        String d = "";
        //TODO: use node model untils to get text (needs processing)
        d += c+" -> "+t+" : "+b.toString()+"\n";
        return d;
    }


	private String processComponentInstance(ComponentInstance i) {
		String c = "component \"<<"+i.getRole().getName()+">>\\n"+i.getName()+":"+i.getType().getName()+"\" { \n";