Commit 8fd7c347 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ standalone updates (basic parameterisation, diagram generation)

parent b11a8bda
Loading
Loading
Loading
Loading
Loading
+118 −5
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ import java.security.CodeSource;
import java.security.ProtectionDomain;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
@@ -18,6 +19,7 @@ import java.util.stream.Collectors;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.epsilon.evl.execute.UnsatisfiedConstraint;
@@ -26,10 +28,13 @@ import org.eclipse.ocl.pivot.utilities.OCL;
import org.eclipse.ocl.pivot.utilities.ParserException;
import org.eclipse.ocl.pivot.utilities.Query;
import org.eclipse.xtext.EcoreUtil2;
import org.etsi.mts.tdl.ComponentInstance;
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.StructuredDataType;
import org.etsi.mts.tdl.TestConfiguration;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.asn2tdl.ASN2TDLTranslator;
import org.etsi.mts.tdl.constraints.evl.Validator;
@@ -58,7 +63,7 @@ public class Standalone {
		validateOCL, validate, 
		translate, exportDoc, exportJSON,
		importOpenAPI, importASN1, importJSON,
		openAPIDoc,exportTTCN3
		openAPIDoc,exportTTCN3,generateDiagrams
	}
	
	public static void main(String[] args) throws Exception {
@@ -74,11 +79,35 @@ public class Standalone {
//		app.path = "examples/json/model.json";
		app.path = "examples/validation/Naming.tdltx";
		app.path = "examples/validation/Example.tdltx";
		
		if (args.length < 1) {
			System.out.println("Usage: standalone [path] [modes]\n"
					+"  path\tPath to the source(s) to process\n"
					+"  modes\tOne or more modes to apply\n"
					+"Modes supported: "+Arrays.asList(MODE.values()));
			return;
		}
		app.path = args[0];

		if (args.length == 2) {
			for (String a : args[1].split(",")) {
				try {
					app.modes.add(MODE.valueOf(MODE.class, a));
				} catch (Exception e) {
					System.err.println("ERROR: "+e.getLocalizedMessage());
				}
			}
		} else {
			System.err.println("ERROR: No mode selected!");
			return;
		}
		
		app.recursive = false;
		app.modes.add(MODE.list);
		app.modes.add(MODE.validate);
		app.modes.add(MODE.exportDoc);
		app.modes.add(MODE.exportTTCN3);
//		app.modes.add(MODE.list);
//		app.modes.add(MODE.validate);
//		app.modes.add(MODE.exportDoc);
		
//		app.modes.add(MODE.exportTTCN3);
//		targetExtension = "tdl";
//		app.modes.add(MODE.translate);
		
@@ -154,6 +183,12 @@ public class Standalone {
			app.processElements(path, asnExtension, app::importASN1);
		}

		if (app.selected(MODE.generateDiagrams)) {
			String path = pathOrDefault(app.path, "examples/validation/Example.tdltx");
			app.processElements(path, asnExtension, app::generateDiagrams);
		}

		
		if (app.selected(MODE.debug)) {
			//individual file without dependencies
			app.processElements("examples/basics/Sample.tdltx", app::listElements);
@@ -338,6 +373,84 @@ public class Standalone {
		}
	}

	private void generateDiagrams(String path) {
		Resource resource = TDLHelper.load(path);
		//export to external generator
		EObject model = resource.getContents().get(0);
		List<TestConfiguration> testConfigurations = EcoreUtil2.getAllContentsOfType(model, TestConfiguration.class);
		String d = "@startuml\n";
		for (TestConfiguration tc : testConfigurations) {
			d += "rectangle \"Test Configuration\\n"+tc.getName()+"\" {\n";
			for (var i : tc.getComponentInstance()) {
				if (i.getRole() == ComponentInstanceRole.TESTER) {
					d += processComponentInstance(i);
				}
			}
			for (var i : tc.getComponentInstance()) {
				if (i.getRole() == ComponentInstanceRole.SUT) {
					d += processComponentInstance(i);
				}
			}
			for (var i : tc.getConnection()) {
				var e0 = i.getEndPoint().get(0);
				var e1 = i.getEndPoint().get(1);
				if (e0.getComponent().getRole().equals(ComponentInstanceRole.SUT)) {
					var e = e1;
					e1 = e0;
					e0 = e;
				}
				String c = ""+e0.getComponent().getName()+"_"+e0.getGate().getName()+""
						+" <--> "
						+""+e1.getComponent().getName()+"_"+e1.getGate().getName()+""
						+"\n";
				d+=c;
			}
			d +="\n}\n";
		}
		d += "@enduml";
		System.out.println(d);
		try {
			//TODO: make configurable
			Files.writeString(Path.of(path+"-config.md"), d);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		/*
		 *  @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 String processComponentInstance(ComponentInstance i) {
		String c = "component \"<<"+i.getRole().getName()+">>\\n"+i.getName()+":"+i.getType().getName()+"\" { \n";
		String portType = "portout";
		if (i.getRole().equals(ComponentInstanceRole.SUT)) {
			portType = "portin";
		}
		for (var g : i.getType().getGateInstance()) {
			c+="  "+portType+" \""+g.getName()+":"+g.getType().getName()+"\" as "+i.getName()+"_"+g.getName()+"\n";
		}
		c+="\n}\n";
		return c;
	}

	
	private void importASN1(String path) {
		importData(path, new ASN2TDLTranslator());