diff --git a/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java b/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java index a1ca3ffab1f01b970d97d743a58ce89651e575d5..a040139cf05eb479090c0ca6e2e4d445bf118f63 100644 --- a/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java +++ b/plugins/org.etsi.mts.tdl.standalone/src/org/etsi/mts/tdl/standalone/Standalone.java @@ -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 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());