From 1fd6af362013617a21774fd52bf7757de9b49b7e Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Wed, 22 Feb 2023 15:24:54 -0800 Subject: [PATCH 01/20] add printSysml optional to instance model and a CLI option to get started --- src/main/java/org/clafer/cli/Main.java | 1 + src/main/java/org/clafer/cli/Normal.java | 47 +++++++++++-------- .../org/clafer/instance/InstanceModel.java | 15 ++++++ 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/main/java/org/clafer/cli/Main.java b/src/main/java/org/clafer/cli/Main.java index d2d54628..e7489c64 100644 --- a/src/main/java/org/clafer/cli/Main.java +++ b/src/main/java/org/clafer/cli/Main.java @@ -27,6 +27,7 @@ public static void main(String[] args) throws Exception { accepts( "noprint", "Don't print the instances to the console or a file"); accepts( "output", "Output instances to the given file." ).withRequiredArg().ofType( File.class ).describedAs( "text file" ); accepts( "prettify", "Use simple and pretty output format (not formal)." ); + accepts( "sysml", "Print the instances as SysMLv2" ); accepts( "repl", "Run in REPL (interactive) mode." ); accepts( "scope", "Override the default global scope value." ).withRequiredArg().ofType( Integer.class ); accepts( "search", "PreferSmallerInstances/PreferLargerInstances/Random" ).withRequiredArg().ofType( ClaferSearchStrategy.class ); diff --git a/src/main/java/org/clafer/cli/Normal.java b/src/main/java/org/clafer/cli/Normal.java index 5fafa896..376e70d7 100644 --- a/src/main/java/org/clafer/cli/Normal.java +++ b/src/main/java/org/clafer/cli/Normal.java @@ -39,6 +39,7 @@ public static void runNormal(JavascriptFile javascriptFile, OptionSet options, int index = 0; // instance id boolean prettify = options.has("prettify"); + boolean sysml = options.has("sysml"); boolean printOff = options.has("noprint"); boolean dataTackingOn = options.has("dataFile"); boolean timeOn = options.has("time"); @@ -71,28 +72,34 @@ public static void runNormal(JavascriptFile javascriptFile, OptionSet options, if (printOff) { ++index; } else { - outStream.println("=== Instance " + (++index) + " Begin ===\n"); - InstanceModel instance = solver.instance(); - if (prettify) - instance.print(outStream); - else - for (InstanceClafer c : instance.getTopClafers()) - Utils.printClafer(c, outStream); - outStream.println("\n--- Instance " + (index) + " End ---\n"); + if (sysml) { + InstanceModel instance = solver.instance(); + instance.printSysml(outStream); + } else { + outStream.println("=== Instance " + (++index) + " Begin ===\n"); + InstanceModel instance = solver.instance(); + if (prettify) + instance.print(outStream); + else + for (InstanceClafer c : instance.getTopClafers()) + Utils.printClafer(c, outStream); + outStream.println("\n--- Instance " + (index) + " End ---\n"); + } } } - if (timeOn) { - elapsedTime = (double) (System.nanoTime() - startTime) / 1000000000; - if (objectives.length == 0) - System.out.println("Generated " + index + " instance(s) within the scope in " + elapsedTime + " seconds\n"); - else - System.out.println("Generated " + (n == -1 ? "all " : "") + index + " optimal instance(s) within the scope in " + elapsedTime + " secondse\n"); - } else { - if (objectives.length == 0) - System.out.println("Generated " + index + " instance(s) within the scope\n"); - else - System.out.println("Generated " + (n == -1 ? "all " : "") + index + " optimal instance(s) within the scope\n"); + if (!sysml) { + if (timeOn) { + elapsedTime = (double) (System.nanoTime() - startTime) / 1000000000; + if (objectives.length == 0) + System.out.println("Generated " + index + " instance(s) within the scope in " + elapsedTime + " seconds\n"); + else + System.out.println("Generated " + (n == -1 ? "all " : "") + index + " optimal instance(s) within the scope in " + elapsedTime + " secondse\n"); + } else { + if (objectives.length == 0) + System.out.println("Generated " + index + " instance(s) within the scope\n"); + else + System.out.println("Generated " + (n == -1 ? "all " : "") + index + " optimal instance(s) within the scope\n"); + } } - } } diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index 906b00ef..2cc0fb18 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -49,6 +49,21 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { return typedTopClafer; } + /** + * Print solution as SysMLv2 + * + * This is the start of exploring an automated product derivation tool + * and the requirements around inferring a system model from clafer are + * still tbd + * @param out + * @throws IOException + */ + public void printSysml(Appendable out) throws IOException { + for (InstanceClafer top : topClafers) { + top.print(out); + } + } + /** * Print solution to stdout. * From 2fcd404f2540e189cc2acd3d3cde1af9671e523b Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Wed, 22 Feb 2023 16:42:32 -0800 Subject: [PATCH 02/20] start the sysml ast for compilation --- .../org/clafer/instance/InstanceModel.java | 6 +++++ .../java/org/sysml/SysmlBlockDefElement.java | 4 ++++ .../java/org/sysml/SysmlBlockVisibility.java | 14 +++++++++++ src/main/java/org/sysml/SysmlId.java | 10 ++++++++ src/main/java/org/sysml/SysmlPackage.java | 21 +++++++++++++++++ src/main/java/org/sysml/SysmlPartDef.java | 4 ++++ src/main/java/org/sysml/SysmlProperty.java | 23 +++++++++++++++++++ .../java/org/sysml/SysmlPropertyType.java | 19 +++++++++++++++ .../java/org/sysml/SysmlVisibilityOption.java | 8 +++++++ 9 files changed, 109 insertions(+) create mode 100644 src/main/java/org/sysml/SysmlBlockDefElement.java create mode 100644 src/main/java/org/sysml/SysmlBlockVisibility.java create mode 100644 src/main/java/org/sysml/SysmlId.java create mode 100644 src/main/java/org/sysml/SysmlPackage.java create mode 100644 src/main/java/org/sysml/SysmlPartDef.java create mode 100644 src/main/java/org/sysml/SysmlProperty.java create mode 100644 src/main/java/org/sysml/SysmlPropertyType.java create mode 100644 src/main/java/org/sysml/SysmlVisibilityOption.java diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index 2cc0fb18..11246dcf 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -6,6 +6,7 @@ import java.util.List; import org.clafer.ast.AstConcreteClafer; import org.clafer.common.Check; +import org.sysml.*; /** * @@ -59,6 +60,11 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { * @throws IOException */ public void printSysml(Appendable out) throws IOException { + ArrayList elems = new ArrayList(); + ArrayList elems_inner = new ArrayList(); + elems.add(new SysmlPackage("inner", elems_inner)); + elems.add(new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), "thing")); + SysmlPackage pack = new SysmlPackage("outer", elems); for (InstanceClafer top : topClafers) { top.print(out); } diff --git a/src/main/java/org/sysml/SysmlBlockDefElement.java b/src/main/java/org/sysml/SysmlBlockDefElement.java new file mode 100644 index 00000000..530db1ec --- /dev/null +++ b/src/main/java/org/sysml/SysmlBlockDefElement.java @@ -0,0 +1,4 @@ +package org.sysml; + +public interface SysmlBlockDefElement { +} diff --git a/src/main/java/org/sysml/SysmlBlockVisibility.java b/src/main/java/org/sysml/SysmlBlockVisibility.java new file mode 100644 index 00000000..19f3d68a --- /dev/null +++ b/src/main/java/org/sysml/SysmlBlockVisibility.java @@ -0,0 +1,14 @@ +package org.sysml; + +/** + * Sysml Block Visibility + * ::= | ‘#’ | ‘~’ + */ +public class SysmlBlockVisibility { + public final SysmlVisibilityOption option; + + public SysmlBlockVisibility(SysmlVisibilityOption visOpt) { + this.option = visOpt; + } + +} diff --git a/src/main/java/org/sysml/SysmlId.java b/src/main/java/org/sysml/SysmlId.java new file mode 100644 index 00000000..01d6a621 --- /dev/null +++ b/src/main/java/org/sysml/SysmlId.java @@ -0,0 +1,10 @@ +package org.sysml; + +public interface SysmlId { + /** + * SysML + * + * @return the name of the identifier + */ + String getName(); +} diff --git a/src/main/java/org/sysml/SysmlPackage.java b/src/main/java/org/sysml/SysmlPackage.java new file mode 100644 index 00000000..453036e6 --- /dev/null +++ b/src/main/java/org/sysml/SysmlPackage.java @@ -0,0 +1,21 @@ +package org.sysml; + + +import java.util.ArrayList; + +/** + * TODO: build out the DiagramElement taxonomy better + */ +public class SysmlPackage implements SysmlId, SysmlBlockDefElement { + private final ArrayList elements; + private final String name; + + public SysmlPackage(String name, ArrayList elements){ + this.elements = elements; + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/org/sysml/SysmlPartDef.java b/src/main/java/org/sysml/SysmlPartDef.java new file mode 100644 index 00000000..64be4ea2 --- /dev/null +++ b/src/main/java/org/sysml/SysmlPartDef.java @@ -0,0 +1,4 @@ +package org.sysml; + +public class SysmlPartDef { +} diff --git a/src/main/java/org/sysml/SysmlProperty.java b/src/main/java/org/sysml/SysmlProperty.java new file mode 100644 index 00000000..9ee87b3f --- /dev/null +++ b/src/main/java/org/sysml/SysmlProperty.java @@ -0,0 +1,23 @@ +package org.sysml; + +import org.clafer.common.Check; + +/** + * SysML Property + * + * ::= [] [‘/’] [] + * + * TODO: do the declaration + */ +public class SysmlProperty implements SysmlId, SysmlBlockDefElement { + + private final String name; + + public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ + this.name = Check.notNull(name); + } + @Override + public String getName() { + return name; + } +} diff --git a/src/main/java/org/sysml/SysmlPropertyType.java b/src/main/java/org/sysml/SysmlPropertyType.java new file mode 100644 index 00000000..08210295 --- /dev/null +++ b/src/main/java/org/sysml/SysmlPropertyType.java @@ -0,0 +1,19 @@ +package org.sysml; + +/** + * Sysml Property Keyword + * ::= ‘part’ | ‘reference’ | ‘value’ | + * + * TODO: accoutn for special cases + */ +public class SysmlPropertyType implements SysmlId { + private final String name; + public SysmlPropertyType(String name){ + this.name = name; + } + + @Override + public String getName() { + return name; + } +} diff --git a/src/main/java/org/sysml/SysmlVisibilityOption.java b/src/main/java/org/sysml/SysmlVisibilityOption.java new file mode 100644 index 00000000..e4f794ba --- /dev/null +++ b/src/main/java/org/sysml/SysmlVisibilityOption.java @@ -0,0 +1,8 @@ +package org.sysml; + +public enum SysmlVisibilityOption { + PLUS, // namespace-visibility + MINUS, // namespace-visibility + NUMBER, + TILDE +} From 4eb4c88e5b70104d36deebc4651e498298c000ea Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Wed, 22 Feb 2023 18:01:07 -0800 Subject: [PATCH 03/20] add visitor for pretty printer --- .../org/clafer/instance/InstanceModel.java | 9 ++- .../java/org/sysml/SysmlBlockDefElement.java | 2 +- src/main/java/org/sysml/SysmlExpr.java | 16 +++++ src/main/java/org/sysml/SysmlExprVisitor.java | 11 ++++ src/main/java/org/sysml/SysmlPackage.java | 13 +++- src/main/java/org/sysml/SysmlProperty.java | 13 +++- .../java/org/sysml/pprinter/SysmlPrinter.java | 63 +++++++++++++++++++ 7 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/sysml/SysmlExpr.java create mode 100644 src/main/java/org/sysml/SysmlExprVisitor.java create mode 100644 src/main/java/org/sysml/pprinter/SysmlPrinter.java diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index 11246dcf..2927fee2 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -7,6 +7,7 @@ import org.clafer.ast.AstConcreteClafer; import org.clafer.common.Check; import org.sysml.*; +import org.sysml.pprinter.SysmlPrinter; /** * @@ -65,9 +66,11 @@ public void printSysml(Appendable out) throws IOException { elems.add(new SysmlPackage("inner", elems_inner)); elems.add(new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), "thing")); SysmlPackage pack = new SysmlPackage("outer", elems); - for (InstanceClafer top : topClafers) { - top.print(out); - } + SysmlPrinter pprinter = new SysmlPrinter(out); + pprinter.visit(pack, ""); + //for (InstanceClafer top : topClafers) { + // top.printSysml(out); + //} } /** diff --git a/src/main/java/org/sysml/SysmlBlockDefElement.java b/src/main/java/org/sysml/SysmlBlockDefElement.java index 530db1ec..051d65b8 100644 --- a/src/main/java/org/sysml/SysmlBlockDefElement.java +++ b/src/main/java/org/sysml/SysmlBlockDefElement.java @@ -1,4 +1,4 @@ package org.sysml; -public interface SysmlBlockDefElement { +public interface SysmlBlockDefElement extends SysmlExpr { } diff --git a/src/main/java/org/sysml/SysmlExpr.java b/src/main/java/org/sysml/SysmlExpr.java new file mode 100644 index 00000000..0d0047e8 --- /dev/null +++ b/src/main/java/org/sysml/SysmlExpr.java @@ -0,0 +1,16 @@ +package org.sysml; + +import java.io.IOException; + +public interface SysmlExpr { + /** + * Dynamic dispatch on the visitor. + * + * @param the parameter type + * @param the return type + * @param visitor the visitor + * @param a the parameter + * @return the return value + */ + B accept(SysmlExprVisitor visitor, A a) throws IOException; +} diff --git a/src/main/java/org/sysml/SysmlExprVisitor.java b/src/main/java/org/sysml/SysmlExprVisitor.java new file mode 100644 index 00000000..f09eae85 --- /dev/null +++ b/src/main/java/org/sysml/SysmlExprVisitor.java @@ -0,0 +1,11 @@ +package org.sysml; + +import org.clafer.ast.AstThis; + +import java.io.IOException; + +public interface SysmlExprVisitor { + B visit(SysmlPackage ast, A a) throws IOException; + + B visit(SysmlProperty ast, A a); +} diff --git a/src/main/java/org/sysml/SysmlPackage.java b/src/main/java/org/sysml/SysmlPackage.java index 453036e6..e074c02e 100644 --- a/src/main/java/org/sysml/SysmlPackage.java +++ b/src/main/java/org/sysml/SysmlPackage.java @@ -1,12 +1,14 @@ package org.sysml; + +import java.io.IOException; import java.util.ArrayList; /** * TODO: build out the DiagramElement taxonomy better */ -public class SysmlPackage implements SysmlId, SysmlBlockDefElement { +public class SysmlPackage implements SysmlId, SysmlBlockDefElement, SysmlExpr { private final ArrayList elements; private final String name; @@ -18,4 +20,13 @@ public SysmlPackage(String name, ArrayList elements){ public String getName() { return name; } + + public ArrayList getElements(){ + return elements; + } + + @Override + public B accept(SysmlExprVisitor visitor, A a) throws IOException { + return visitor.visit(this, a); + } } diff --git a/src/main/java/org/sysml/SysmlProperty.java b/src/main/java/org/sysml/SysmlProperty.java index 9ee87b3f..2681f6f0 100644 --- a/src/main/java/org/sysml/SysmlProperty.java +++ b/src/main/java/org/sysml/SysmlProperty.java @@ -9,15 +9,26 @@ * * TODO: do the declaration */ -public class SysmlProperty implements SysmlId, SysmlBlockDefElement { +public class SysmlProperty implements SysmlId, SysmlBlockDefElement, SysmlExpr { private final String name; + private final SysmlPropertyType prop; public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ this.name = Check.notNull(name); + this.prop = propType; } @Override public String getName() { return name; } + + public SysmlPropertyType getPropertyType(){ + return prop; + } + + @Override + public B accept(SysmlExprVisitor visitor, A a) { + return visitor.visit(this, a); + } } diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java new file mode 100644 index 00000000..8877582d --- /dev/null +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -0,0 +1,63 @@ +package org.sysml.pprinter; + +import org.sysml.SysmlBlockDefElement; +import org.sysml.SysmlExprVisitor; +import org.sysml.SysmlPackage; +import org.sysml.SysmlProperty; + +import java.io.IOException; +import java.lang.Void; + +public class SysmlPrinter implements SysmlExprVisitor { + + private final String indent_base; + private final Appendable out; + + public SysmlPrinter(Appendable out) { + this.out = out; + this.indent_base = " "; + } + + + public void print(String indent, SysmlPackage spackage, Appendable out) throws IOException { + out.append(indent).append("package ").append(spackage.getName()).append(" {").append("\n"); + for (SysmlBlockDefElement elem : spackage.getElements()) { + print(indent + indent_base, elem, out); + out.append('\n'); + } + out.append(indent).append("}"); + } + + public void print(String indent, SysmlBlockDefElement sprop, Appendable out) throws IOException { + } + + @Override + public Void visit(SysmlProperty ast, String indent) { + try { + this.out + .append(indent) + .append(ast.getPropertyType().getName()) + .append(" ") + .append(ast.getName()) + .append(";\n") + ; + } catch (IOException ignored) { + + } + return null; + } + + @Override + public Void visit(SysmlPackage ast, String indent) { + try { + this.out.append(indent).append("package ").append(ast.getName()).append(" {").append("\n"); + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); + } + this.out.append(indent).append("}\n"); + } catch (IOException ignored) { + + } + return null; + } +} From aaf29a863ef2aed3c8d5423702f59fe3f46b8458 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Thu, 23 Feb 2023 10:19:35 -0800 Subject: [PATCH 04/20] pprint sysml example --- .../org/clafer/instance/InstanceModel.java | 26 ++++++++++++------- .../java/org/sysml/SysmlBlockDefElement.java | 2 +- src/main/java/org/sysml/SysmlPackage.java | 8 +++--- src/main/java/org/sysml/SysmlProperty.java | 17 +++++++++++- .../java/org/sysml/pprinter/SysmlPrinter.java | 10 ++++++- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index 2927fee2..ebbcf093 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; + +import org.clafer.ast.AstClafer; import org.clafer.ast.AstConcreteClafer; import org.clafer.common.Check; import org.sysml.*; @@ -51,6 +53,15 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { return typedTopClafer; } + private SysmlProperty compileInstance(InstanceClafer model) { + String propertyName = model.getType().getName(); + ArrayList children = new ArrayList(); + for (InstanceClafer child : model.getChildren()) { + children.add(compileInstance(child)); + } + return new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), propertyName, children.toArray(new SysmlBlockDefElement[children.size()])); + } + /** * Print solution as SysMLv2 * @@ -61,16 +72,11 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { * @throws IOException */ public void printSysml(Appendable out) throws IOException { - ArrayList elems = new ArrayList(); - ArrayList elems_inner = new ArrayList(); - elems.add(new SysmlPackage("inner", elems_inner)); - elems.add(new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), "thing")); - SysmlPackage pack = new SysmlPackage("outer", elems); - SysmlPrinter pprinter = new SysmlPrinter(out); - pprinter.visit(pack, ""); - //for (InstanceClafer top : topClafers) { - // top.printSysml(out); - //} + for (InstanceClafer top : topClafers) { + SysmlPrinter pprinter = new SysmlPrinter(out); + SysmlProperty model = compileInstance(top); + pprinter.visit(model, ""); + } } /** diff --git a/src/main/java/org/sysml/SysmlBlockDefElement.java b/src/main/java/org/sysml/SysmlBlockDefElement.java index 051d65b8..c5696595 100644 --- a/src/main/java/org/sysml/SysmlBlockDefElement.java +++ b/src/main/java/org/sysml/SysmlBlockDefElement.java @@ -1,4 +1,4 @@ package org.sysml; -public interface SysmlBlockDefElement extends SysmlExpr { +public interface SysmlBlockDefElement extends SysmlExpr, SysmlId { } diff --git a/src/main/java/org/sysml/SysmlPackage.java b/src/main/java/org/sysml/SysmlPackage.java index e074c02e..ab76f75a 100644 --- a/src/main/java/org/sysml/SysmlPackage.java +++ b/src/main/java/org/sysml/SysmlPackage.java @@ -8,11 +8,11 @@ /** * TODO: build out the DiagramElement taxonomy better */ -public class SysmlPackage implements SysmlId, SysmlBlockDefElement, SysmlExpr { - private final ArrayList elements; +public class SysmlPackage implements SysmlBlockDefElement { + private final SysmlBlockDefElement[] elements; private final String name; - public SysmlPackage(String name, ArrayList elements){ + public SysmlPackage(String name, SysmlBlockDefElement[] elements){ this.elements = elements; this.name = name; } @@ -21,7 +21,7 @@ public String getName() { return name; } - public ArrayList getElements(){ + public SysmlBlockDefElement[] getElements(){ return elements; } diff --git a/src/main/java/org/sysml/SysmlProperty.java b/src/main/java/org/sysml/SysmlProperty.java index 2681f6f0..d54ebcd4 100644 --- a/src/main/java/org/sysml/SysmlProperty.java +++ b/src/main/java/org/sysml/SysmlProperty.java @@ -2,6 +2,8 @@ import org.clafer.common.Check; +import java.util.ArrayList; + /** * SysML Property * @@ -9,14 +11,23 @@ * * TODO: do the declaration */ -public class SysmlProperty implements SysmlId, SysmlBlockDefElement, SysmlExpr { +public class SysmlProperty implements SysmlBlockDefElement { private final String name; private final SysmlPropertyType prop; + private final SysmlBlockDefElement[] elements; + + public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name, SysmlBlockDefElement[] elements){ + this.name = Check.notNull(name); + this.prop = propType; + this.elements = elements; + } + public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ this.name = Check.notNull(name); this.prop = propType; + this.elements = new SysmlBlockDefElement[0]; } @Override public String getName() { @@ -27,6 +38,10 @@ public SysmlPropertyType getPropertyType(){ return prop; } + public SysmlBlockDefElement[] getElements() { + return elements; + } + @Override public B accept(SysmlExprVisitor visitor, A a) { return visitor.visit(this, a); diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 8877582d..42d91462 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -39,8 +39,16 @@ public Void visit(SysmlProperty ast, String indent) { .append(ast.getPropertyType().getName()) .append(" ") .append(ast.getName()) - .append(";\n") ; + if (ast.getElements().length > 0) { + this.out.append("{\n"); + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); + } + this.out.append(indent).append("}\n"); + } else { + this.out.append(";\n"); + } } catch (IOException ignored) { } From 3d1870d7d721c02b314af567f9d84c8161507515 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Thu, 23 Feb 2023 10:31:09 -0800 Subject: [PATCH 05/20] restructure for instance compiler, add ast package --- .../org/clafer/instance/InstanceModel.java | 16 ++++------------ .../sysml/{ => ast}/SysmlBlockDefElement.java | 2 +- .../sysml/{ => ast}/SysmlBlockVisibility.java | 2 +- .../java/org/sysml/{ => ast}/SysmlExpr.java | 2 +- .../org/sysml/{ => ast}/SysmlExprVisitor.java | 4 +--- src/main/java/org/sysml/{ => ast}/SysmlId.java | 2 +- .../java/org/sysml/{ => ast}/SysmlPackage.java | 3 +-- .../java/org/sysml/{ => ast}/SysmlPartDef.java | 2 +- .../org/sysml/{ => ast}/SysmlProperty.java | 4 +--- .../org/sysml/{ => ast}/SysmlPropertyType.java | 2 +- .../sysml/{ => ast}/SysmlVisibilityOption.java | 2 +- .../sysml/compiler/InstanceSysmlCompiler.java | 18 ++++++++++++++++++ .../java/org/sysml/pprinter/SysmlPrinter.java | 8 ++++---- 13 files changed, 36 insertions(+), 31 deletions(-) rename src/main/java/org/sysml/{ => ast}/SysmlBlockDefElement.java (75%) rename src/main/java/org/sysml/{ => ast}/SysmlBlockVisibility.java (92%) rename src/main/java/org/sysml/{ => ast}/SysmlExpr.java (94%) rename src/main/java/org/sysml/{ => ast}/SysmlExprVisitor.java (76%) rename src/main/java/org/sysml/{ => ast}/SysmlId.java (86%) rename src/main/java/org/sysml/{ => ast}/SysmlPackage.java (93%) rename src/main/java/org/sysml/{ => ast}/SysmlPartDef.java (57%) rename src/main/java/org/sysml/{ => ast}/SysmlProperty.java (96%) rename src/main/java/org/sysml/{ => ast}/SysmlPropertyType.java (94%) rename src/main/java/org/sysml/{ => ast}/SysmlVisibilityOption.java (84%) create mode 100644 src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index ebbcf093..be0aebb3 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -5,10 +5,10 @@ import java.util.Arrays; import java.util.List; -import org.clafer.ast.AstClafer; import org.clafer.ast.AstConcreteClafer; import org.clafer.common.Check; -import org.sysml.*; +import org.sysml.ast.SysmlProperty; +import org.sysml.compiler.InstanceSysmlCompiler; import org.sysml.pprinter.SysmlPrinter; /** @@ -53,15 +53,6 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { return typedTopClafer; } - private SysmlProperty compileInstance(InstanceClafer model) { - String propertyName = model.getType().getName(); - ArrayList children = new ArrayList(); - for (InstanceClafer child : model.getChildren()) { - children.add(compileInstance(child)); - } - return new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), propertyName, children.toArray(new SysmlBlockDefElement[children.size()])); - } - /** * Print solution as SysMLv2 * @@ -74,7 +65,8 @@ private SysmlProperty compileInstance(InstanceClafer model) { public void printSysml(Appendable out) throws IOException { for (InstanceClafer top : topClafers) { SysmlPrinter pprinter = new SysmlPrinter(out); - SysmlProperty model = compileInstance(top); + InstanceSysmlCompiler compiler = new InstanceSysmlCompiler(); + SysmlProperty model = compiler.compile(top); pprinter.visit(model, ""); } } diff --git a/src/main/java/org/sysml/SysmlBlockDefElement.java b/src/main/java/org/sysml/ast/SysmlBlockDefElement.java similarity index 75% rename from src/main/java/org/sysml/SysmlBlockDefElement.java rename to src/main/java/org/sysml/ast/SysmlBlockDefElement.java index c5696595..6707f189 100644 --- a/src/main/java/org/sysml/SysmlBlockDefElement.java +++ b/src/main/java/org/sysml/ast/SysmlBlockDefElement.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; public interface SysmlBlockDefElement extends SysmlExpr, SysmlId { } diff --git a/src/main/java/org/sysml/SysmlBlockVisibility.java b/src/main/java/org/sysml/ast/SysmlBlockVisibility.java similarity index 92% rename from src/main/java/org/sysml/SysmlBlockVisibility.java rename to src/main/java/org/sysml/ast/SysmlBlockVisibility.java index 19f3d68a..bacb52ed 100644 --- a/src/main/java/org/sysml/SysmlBlockVisibility.java +++ b/src/main/java/org/sysml/ast/SysmlBlockVisibility.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; /** * Sysml Block Visibility diff --git a/src/main/java/org/sysml/SysmlExpr.java b/src/main/java/org/sysml/ast/SysmlExpr.java similarity index 94% rename from src/main/java/org/sysml/SysmlExpr.java rename to src/main/java/org/sysml/ast/SysmlExpr.java index 0d0047e8..2e64882c 100644 --- a/src/main/java/org/sysml/SysmlExpr.java +++ b/src/main/java/org/sysml/ast/SysmlExpr.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; import java.io.IOException; diff --git a/src/main/java/org/sysml/SysmlExprVisitor.java b/src/main/java/org/sysml/ast/SysmlExprVisitor.java similarity index 76% rename from src/main/java/org/sysml/SysmlExprVisitor.java rename to src/main/java/org/sysml/ast/SysmlExprVisitor.java index f09eae85..eeb71e3e 100644 --- a/src/main/java/org/sysml/SysmlExprVisitor.java +++ b/src/main/java/org/sysml/ast/SysmlExprVisitor.java @@ -1,6 +1,4 @@ -package org.sysml; - -import org.clafer.ast.AstThis; +package org.sysml.ast; import java.io.IOException; diff --git a/src/main/java/org/sysml/SysmlId.java b/src/main/java/org/sysml/ast/SysmlId.java similarity index 86% rename from src/main/java/org/sysml/SysmlId.java rename to src/main/java/org/sysml/ast/SysmlId.java index 01d6a621..816d7dad 100644 --- a/src/main/java/org/sysml/SysmlId.java +++ b/src/main/java/org/sysml/ast/SysmlId.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; public interface SysmlId { /** diff --git a/src/main/java/org/sysml/SysmlPackage.java b/src/main/java/org/sysml/ast/SysmlPackage.java similarity index 93% rename from src/main/java/org/sysml/SysmlPackage.java rename to src/main/java/org/sysml/ast/SysmlPackage.java index ab76f75a..d3e478ba 100644 --- a/src/main/java/org/sysml/SysmlPackage.java +++ b/src/main/java/org/sysml/ast/SysmlPackage.java @@ -1,9 +1,8 @@ -package org.sysml; +package org.sysml.ast; import java.io.IOException; -import java.util.ArrayList; /** * TODO: build out the DiagramElement taxonomy better diff --git a/src/main/java/org/sysml/SysmlPartDef.java b/src/main/java/org/sysml/ast/SysmlPartDef.java similarity index 57% rename from src/main/java/org/sysml/SysmlPartDef.java rename to src/main/java/org/sysml/ast/SysmlPartDef.java index 64be4ea2..29793a97 100644 --- a/src/main/java/org/sysml/SysmlPartDef.java +++ b/src/main/java/org/sysml/ast/SysmlPartDef.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; public class SysmlPartDef { } diff --git a/src/main/java/org/sysml/SysmlProperty.java b/src/main/java/org/sysml/ast/SysmlProperty.java similarity index 96% rename from src/main/java/org/sysml/SysmlProperty.java rename to src/main/java/org/sysml/ast/SysmlProperty.java index d54ebcd4..7086a7fb 100644 --- a/src/main/java/org/sysml/SysmlProperty.java +++ b/src/main/java/org/sysml/ast/SysmlProperty.java @@ -1,9 +1,7 @@ -package org.sysml; +package org.sysml.ast; import org.clafer.common.Check; -import java.util.ArrayList; - /** * SysML Property * diff --git a/src/main/java/org/sysml/SysmlPropertyType.java b/src/main/java/org/sysml/ast/SysmlPropertyType.java similarity index 94% rename from src/main/java/org/sysml/SysmlPropertyType.java rename to src/main/java/org/sysml/ast/SysmlPropertyType.java index 08210295..837ef6b0 100644 --- a/src/main/java/org/sysml/SysmlPropertyType.java +++ b/src/main/java/org/sysml/ast/SysmlPropertyType.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; /** * Sysml Property Keyword diff --git a/src/main/java/org/sysml/SysmlVisibilityOption.java b/src/main/java/org/sysml/ast/SysmlVisibilityOption.java similarity index 84% rename from src/main/java/org/sysml/SysmlVisibilityOption.java rename to src/main/java/org/sysml/ast/SysmlVisibilityOption.java index e4f794ba..524c3e68 100644 --- a/src/main/java/org/sysml/SysmlVisibilityOption.java +++ b/src/main/java/org/sysml/ast/SysmlVisibilityOption.java @@ -1,4 +1,4 @@ -package org.sysml; +package org.sysml.ast; public enum SysmlVisibilityOption { PLUS, // namespace-visibility diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java new file mode 100644 index 00000000..d6d9952d --- /dev/null +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -0,0 +1,18 @@ +package org.sysml.compiler; + +import org.clafer.instance.InstanceClafer; +import org.sysml.ast.*; + +import java.util.ArrayList; + +public class InstanceSysmlCompiler { + public SysmlProperty compile(InstanceClafer model) { + String propertyName = model.getType().getName(); + ArrayList children = new ArrayList(); + for (InstanceClafer child : model.getChildren()) { + children.add(compile(child)); + } + return new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), propertyName, children.toArray(new SysmlBlockDefElement[children.size()])); + } + +} diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 42d91462..3fc8b848 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -1,9 +1,9 @@ package org.sysml.pprinter; -import org.sysml.SysmlBlockDefElement; -import org.sysml.SysmlExprVisitor; -import org.sysml.SysmlPackage; -import org.sysml.SysmlProperty; +import org.sysml.ast.SysmlBlockDefElement; +import org.sysml.ast.SysmlExprVisitor; +import org.sysml.ast.SysmlPackage; +import org.sysml.ast.SysmlProperty; import java.io.IOException; import java.lang.Void; From 34e9de6d2007a0a38a556a4e2eca56ab039ccd9a Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Mon, 27 Feb 2023 17:28:08 -0800 Subject: [PATCH 06/20] change compiler to use multiplicity, part def --- .../org/clafer/instance/InstanceModel.java | 4 +- .../java/org/sysml/ast/SysmlProperty.java | 19 +++- .../sysml/compiler/InstanceSysmlCompiler.java | 87 ++++++++++++++++++- .../java/org/sysml/pprinter/SysmlPrinter.java | 8 +- 4 files changed, 111 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index be0aebb3..95020a24 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -63,10 +63,12 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { * @throws IOException */ public void printSysml(Appendable out) throws IOException { + + for (InstanceClafer top : topClafers) { SysmlPrinter pprinter = new SysmlPrinter(out); InstanceSysmlCompiler compiler = new InstanceSysmlCompiler(); - SysmlProperty model = compiler.compile(top); + SysmlProperty model = compiler.compile(top, top); pprinter.visit(model, ""); } } diff --git a/src/main/java/org/sysml/ast/SysmlProperty.java b/src/main/java/org/sysml/ast/SysmlProperty.java index 7086a7fb..abdb738e 100644 --- a/src/main/java/org/sysml/ast/SysmlProperty.java +++ b/src/main/java/org/sysml/ast/SysmlProperty.java @@ -12,21 +12,30 @@ public class SysmlProperty implements SysmlBlockDefElement { private final String name; + private final SysmlPropertyType prop; private final SysmlBlockDefElement[] elements; + private final String[] superTypes; + + private int multiplicity; - public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name, SysmlBlockDefElement[] elements){ + public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name, SysmlBlockDefElement[] elements, String[] superTypes, int multiplicity){ this.name = Check.notNull(name); this.prop = propType; this.elements = elements; + this.superTypes = superTypes; + this.multiplicity = multiplicity; } public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ this.name = Check.notNull(name); this.prop = propType; this.elements = new SysmlBlockDefElement[0]; + this.superTypes = new String[0]; + this.multiplicity = 1; } + @Override public String getName() { return name; @@ -40,6 +49,14 @@ public SysmlBlockDefElement[] getElements() { return elements; } + public String[] getSupers(){ + return superTypes; + } + + public int getMultiplicity(){ + return multiplicity; + } + @Override public B accept(SysmlExprVisitor visitor, A a) { return visitor.visit(this, a); diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java index d6d9952d..bf5994c4 100644 --- a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -1,18 +1,97 @@ package org.sysml.compiler; +import org.clafer.ast.AstClafer; +import org.clafer.ast.AstRef; import org.clafer.instance.InstanceClafer; import org.sysml.ast.*; +import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class InstanceSysmlCompiler { - public SysmlProperty compile(InstanceClafer model) { - String propertyName = model.getType().getName(); + + private ArrayList processedClafers; + + public InstanceSysmlCompiler(){ + this.processedClafers = new ArrayList(); + } + + public String getPropertyId(String name){ + if (name.startsWith("c0_")){ + return name.substring(3); + } else { + return name; + } + } + + int getMultiplicity(InstanceClafer model, AstClafer clafer){ + int count = 0; + if (model.getType().getName().equals(clafer.getName())){ + count++; + } + for (InstanceClafer child : model.getChildren()) { + count += getMultiplicity(child, clafer); + } + return count; + } + + ArrayList _getSuperClafers(AstClafer clafer, ArrayList hier){ + if (clafer.getSuperClafer() == null) { + return hier; + } else { + hier.add(getPropertyId(clafer.getSuperClafer().getName())); + return _getSuperClafers(clafer.getSuperClafer(), hier); + } + } + + public String[] getSuperClafers(AstClafer clafer){ + ArrayList clafers = _getSuperClafers(clafer, new ArrayList()); + String[] clafers_arr = new String[clafers.size()]; + return clafers.toArray(clafers_arr); + } + + public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) { + String propertyName = getPropertyId(model.getType().getName()); + String[] superClafers = getSuperClafers(model.getType()); + List hierarchy = Arrays.asList(superClafers); ArrayList children = new ArrayList(); for (InstanceClafer child : model.getChildren()) { - children.add(compile(child)); + if (!processedClafers.contains(child.getType().getName())) { + SysmlProperty cchild = compile(child, topLevelModel); + if (!cchild.getPropertyType().getName().equals("")) { + children.add(compile(child, topLevelModel)); + } else { + SysmlBlockDefElement[] schildren = cchild.getElements(); + children.addAll(new ArrayList(Arrays.asList(schildren))); + } + } + } + + //Object ref = model.getType().getRef(); + //if (ref instanceof AstRef){ + // System.out.println(((AstRef) ref).getTargetType().getName()); + //} + + String propName = ""; + String[] superTypes = new String[0]; + if (hierarchy.contains("Part")) { + propName = "part"; + superTypes = Arrays.copyOfRange(superClafers, 0, superClafers.length-2); + } else { + propName = ""; } - return new SysmlProperty(new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType("part"), propertyName, children.toArray(new SysmlBlockDefElement[children.size()])); + int multiplicity = getMultiplicity(topLevelModel, model.getType()); + processedClafers.add(model.getType().getName()); + return new SysmlProperty( + new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), + new SysmlPropertyType(propName), + propertyName, + children.toArray(new SysmlBlockDefElement[children.size()]), + superTypes, + multiplicity + ); } } diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 3fc8b848..66ac3d04 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -40,8 +40,14 @@ public Void visit(SysmlProperty ast, String indent) { .append(" ") .append(ast.getName()) ; + if (ast.getMultiplicity() > 1) { + this.out.append("[").append(String.valueOf(ast.getMultiplicity())).append("]"); + } + for (String s: ast.getSupers()){ + this.out.append(" :> ").append(s); + } if (ast.getElements().length > 0) { - this.out.append("{\n"); + this.out.append(" {\n"); for (SysmlBlockDefElement elem : ast.getElements()) { elem.accept(this, indent + indent_base); } From e527bbdea5db89ad082c75cdca13c50b58641b06 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Mon, 27 Feb 2023 18:39:08 -0800 Subject: [PATCH 07/20] add SysmlAnnotation and pretty print annotations from the CLaferInstance --- .../java/org/sysml/ast/SysmlAnnotation.java | 29 +++++++++++++ .../java/org/sysml/ast/SysmlExprVisitor.java | 2 + .../java/org/sysml/ast/SysmlProperty.java | 20 ++++++++- .../sysml/compiler/InstanceSysmlCompiler.java | 41 +++++++++++++------ .../java/org/sysml/pprinter/SysmlPrinter.java | 15 ++++--- 5 files changed, 89 insertions(+), 18 deletions(-) create mode 100644 src/main/java/org/sysml/ast/SysmlAnnotation.java diff --git a/src/main/java/org/sysml/ast/SysmlAnnotation.java b/src/main/java/org/sysml/ast/SysmlAnnotation.java new file mode 100644 index 00000000..74ef24d1 --- /dev/null +++ b/src/main/java/org/sysml/ast/SysmlAnnotation.java @@ -0,0 +1,29 @@ +package org.sysml.ast; + +import org.clafer.common.Check; + +import java.io.IOException; + +public class SysmlAnnotation implements SysmlExpr, SysmlId { + private String name; + + private Object ref; + + public SysmlAnnotation(String name, Object ref) { + this.name = name; + this.ref = ref; + } + + @Override + public String getName() { + return name; + } + + public String getRef() { + return ref.toString(); + } + @Override + public B accept(SysmlExprVisitor visitor, A a) throws IOException { + return visitor.visit(this, a); + } +} diff --git a/src/main/java/org/sysml/ast/SysmlExprVisitor.java b/src/main/java/org/sysml/ast/SysmlExprVisitor.java index eeb71e3e..78af8c5e 100644 --- a/src/main/java/org/sysml/ast/SysmlExprVisitor.java +++ b/src/main/java/org/sysml/ast/SysmlExprVisitor.java @@ -6,4 +6,6 @@ public interface SysmlExprVisitor { B visit(SysmlPackage ast, A a) throws IOException; B visit(SysmlProperty ast, A a); + + B visit(SysmlAnnotation ast, A a) throws IOException; } diff --git a/src/main/java/org/sysml/ast/SysmlProperty.java b/src/main/java/org/sysml/ast/SysmlProperty.java index abdb738e..3604e516 100644 --- a/src/main/java/org/sysml/ast/SysmlProperty.java +++ b/src/main/java/org/sysml/ast/SysmlProperty.java @@ -16,16 +16,29 @@ public class SysmlProperty implements SysmlBlockDefElement { private final SysmlPropertyType prop; private final SysmlBlockDefElement[] elements; + + private final SysmlAnnotation[] annotations; private final String[] superTypes; private int multiplicity; - public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name, SysmlBlockDefElement[] elements, String[] superTypes, int multiplicity){ + + + public SysmlProperty( + SysmlBlockVisibility blockVis, + SysmlPropertyType propType, + String name, + SysmlBlockDefElement[] elements, + SysmlAnnotation[] annotations, + String[] superTypes, + int multiplicity + ){ this.name = Check.notNull(name); this.prop = propType; this.elements = elements; this.superTypes = superTypes; this.multiplicity = multiplicity; + this.annotations = annotations; } public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ @@ -33,6 +46,7 @@ public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, this.prop = propType; this.elements = new SysmlBlockDefElement[0]; this.superTypes = new String[0]; + this.annotations = new SysmlAnnotation[0]; this.multiplicity = 1; } @@ -57,6 +71,10 @@ public int getMultiplicity(){ return multiplicity; } + public SysmlAnnotation[] getAnnotations(){ + return annotations; + } + @Override public B accept(SysmlExprVisitor visitor, A a) { return visitor.visit(this, a); diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java index bf5994c4..8ca2a658 100644 --- a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -5,7 +5,6 @@ import org.clafer.instance.InstanceClafer; import org.sysml.ast.*; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -53,15 +52,20 @@ public String[] getSuperClafers(AstClafer clafer){ } public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) { + // collect the identifier String propertyName = getPropertyId(model.getType().getName()); + + // get its supers String[] superClafers = getSuperClafers(model.getType()); List hierarchy = Arrays.asList(superClafers); + + // process the children ArrayList children = new ArrayList(); for (InstanceClafer child : model.getChildren()) { if (!processedClafers.contains(child.getType().getName())) { SysmlProperty cchild = compile(child, topLevelModel); - if (!cchild.getPropertyType().getName().equals("")) { - children.add(compile(child, topLevelModel)); + if (!cchild.getPropertyType().getName().equals("unk")) { + children.add(cchild); } else { SysmlBlockDefElement[] schildren = cchild.getElements(); children.addAll(new ArrayList(Arrays.asList(schildren))); @@ -69,26 +73,39 @@ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) } } - //Object ref = model.getType().getRef(); - //if (ref instanceof AstRef){ - // System.out.println(((AstRef) ref).getTargetType().getName()); - //} - + // get the property name String propName = ""; String[] superTypes = new String[0]; - if (hierarchy.contains("Part")) { - propName = "part"; - superTypes = Arrays.copyOfRange(superClafers, 0, superClafers.length-2); + if (hierarchy.contains("SysmlProperty")) { + propName = ((String) hierarchy.get(hierarchy.indexOf("SysmlProperty") - 1)).toLowerCase(); + superTypes = Arrays.copyOfRange(superClafers, 0, hierarchy.indexOf("SysmlProperty")-1); } else { - propName = ""; + propName = "unk"; } + + // get the clafer multiplicity and mark as processed int multiplicity = getMultiplicity(topLevelModel, model.getType()); processedClafers.add(model.getType().getName()); + + // collect the annotations + ArrayList annots = new ArrayList(); + for (InstanceClafer child : model.getChildren()) { + Object ref = child.getType().getRef(); + if (ref != null) { + AstRef aref = (AstRef) ref; + String aname = getPropertyId(aref.getSourceType().getName()); + Object refv = child.getRef(); + annots.add(new SysmlAnnotation(aname, refv)); + } + } + + // build a property object return new SysmlProperty( new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), new SysmlPropertyType(propName), propertyName, children.toArray(new SysmlBlockDefElement[children.size()]), + annots.toArray(new SysmlAnnotation[annots.size()]), superTypes, multiplicity ); diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 66ac3d04..0699058a 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -1,9 +1,6 @@ package org.sysml.pprinter; -import org.sysml.ast.SysmlBlockDefElement; -import org.sysml.ast.SysmlExprVisitor; -import org.sysml.ast.SysmlPackage; -import org.sysml.ast.SysmlProperty; +import org.sysml.ast.*; import java.io.IOException; import java.lang.Void; @@ -31,6 +28,11 @@ public void print(String indent, SysmlPackage spackage, Appendable out) throws I public void print(String indent, SysmlBlockDefElement sprop, Appendable out) throws IOException { } + public Void visit(SysmlAnnotation ast, String indent) throws IOException { + this.out.append(indent).append(":>> ").append(ast.getName()).append(" = ").append(ast.getRef()).append(";\n"); + return null; + } + @Override public Void visit(SysmlProperty ast, String indent) { try { @@ -46,8 +48,11 @@ public Void visit(SysmlProperty ast, String indent) { for (String s: ast.getSupers()){ this.out.append(" :> ").append(s); } - if (ast.getElements().length > 0) { + if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { this.out.append(" {\n"); + for (SysmlAnnotation annot: ast.getAnnotations()){ + annot.accept(this, indent + indent_base); + } for (SysmlBlockDefElement elem : ast.getElements()) { elem.accept(this, indent + indent_base); } From 9d872f859702ef5514083399db5696c67bf3c508 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 09:39:33 -0800 Subject: [PATCH 08/20] add a Clafer AST -> Sysml compiler --- src/main/java/org/clafer/cli/Normal.java | 18 +++- .../org/clafer/instance/InstanceModel.java | 4 +- ...smlAnnotation.java => SysmlAttribute.java} | 6 +- .../java/org/sysml/ast/SysmlExprVisitor.java | 4 +- src/main/java/org/sysml/ast/SysmlPartDef.java | 4 - .../java/org/sysml/ast/SysmlProperty.java | 8 +- .../java/org/sysml/ast/SysmlPropertyDef.java | 63 ++++++++++++++ .../org/sysml/compiler/AstSysmlCompiler.java | 84 +++++++++++++++++++ .../sysml/compiler/InstanceSysmlCompiler.java | 6 +- .../java/org/sysml/pprinter/SysmlPrinter.java | 37 +++++++- 10 files changed, 212 insertions(+), 22 deletions(-) rename src/main/java/org/sysml/ast/{SysmlAnnotation.java => SysmlAttribute.java} (75%) delete mode 100644 src/main/java/org/sysml/ast/SysmlPartDef.java create mode 100644 src/main/java/org/sysml/ast/SysmlPropertyDef.java create mode 100644 src/main/java/org/sysml/compiler/AstSysmlCompiler.java diff --git a/src/main/java/org/clafer/cli/Normal.java b/src/main/java/org/clafer/cli/Normal.java index 376e70d7..50778f46 100644 --- a/src/main/java/org/clafer/cli/Normal.java +++ b/src/main/java/org/clafer/cli/Normal.java @@ -12,6 +12,11 @@ import org.clafer.javascript.JavascriptFile; import org.clafer.objective.Objective; import org.clafer.scope.Scope; +import org.clafer.ast.AstModel; +import org.sysml.ast.SysmlProperty; +import org.sysml.ast.SysmlPropertyDef; +import org.sysml.compiler.AstSysmlCompiler; +import org.sysml.pprinter.SysmlPrinter; public class Normal { @@ -73,8 +78,19 @@ public static void runNormal(JavascriptFile javascriptFile, OptionSet options, ++index; } else { if (sysml) { + outStream.append("package Architecture {\n"); + outStream.append(" import ScalarValues::*;\n"); + AstModel top = javascriptFile.getModel(); + SysmlPrinter pprinter = new SysmlPrinter(outStream); + AstSysmlCompiler compiler = new AstSysmlCompiler(); + SysmlPropertyDef[] models = compiler.compile(top, top); + for (SysmlPropertyDef model: models){ + pprinter.visit(model, " "); + } + InstanceModel instance = solver.instance(); - instance.printSysml(outStream); + instance.printSysml(outStream, " "); + outStream.append("}\n"); } else { outStream.println("=== Instance " + (++index) + " Begin ===\n"); InstanceModel instance = solver.instance(); diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index 95020a24..a8ca3ccd 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -62,14 +62,14 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { * @param out * @throws IOException */ - public void printSysml(Appendable out) throws IOException { + public void printSysml(Appendable out, String indent) throws IOException { for (InstanceClafer top : topClafers) { SysmlPrinter pprinter = new SysmlPrinter(out); InstanceSysmlCompiler compiler = new InstanceSysmlCompiler(); SysmlProperty model = compiler.compile(top, top); - pprinter.visit(model, ""); + pprinter.visit(model, indent); } } diff --git a/src/main/java/org/sysml/ast/SysmlAnnotation.java b/src/main/java/org/sysml/ast/SysmlAttribute.java similarity index 75% rename from src/main/java/org/sysml/ast/SysmlAnnotation.java rename to src/main/java/org/sysml/ast/SysmlAttribute.java index 74ef24d1..3d6a7f0f 100644 --- a/src/main/java/org/sysml/ast/SysmlAnnotation.java +++ b/src/main/java/org/sysml/ast/SysmlAttribute.java @@ -1,15 +1,13 @@ package org.sysml.ast; -import org.clafer.common.Check; - import java.io.IOException; -public class SysmlAnnotation implements SysmlExpr, SysmlId { +public class SysmlAttribute implements SysmlExpr, SysmlId { private String name; private Object ref; - public SysmlAnnotation(String name, Object ref) { + public SysmlAttribute(String name, Object ref) { this.name = name; this.ref = ref; } diff --git a/src/main/java/org/sysml/ast/SysmlExprVisitor.java b/src/main/java/org/sysml/ast/SysmlExprVisitor.java index 78af8c5e..f6e8cf3b 100644 --- a/src/main/java/org/sysml/ast/SysmlExprVisitor.java +++ b/src/main/java/org/sysml/ast/SysmlExprVisitor.java @@ -7,5 +7,7 @@ public interface SysmlExprVisitor { B visit(SysmlProperty ast, A a); - B visit(SysmlAnnotation ast, A a) throws IOException; + B visit(SysmlAttribute ast, A a) throws IOException; + + B visit(SysmlPropertyDef sysmlPropertyDef, A a); } diff --git a/src/main/java/org/sysml/ast/SysmlPartDef.java b/src/main/java/org/sysml/ast/SysmlPartDef.java deleted file mode 100644 index 29793a97..00000000 --- a/src/main/java/org/sysml/ast/SysmlPartDef.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.sysml.ast; - -public class SysmlPartDef { -} diff --git a/src/main/java/org/sysml/ast/SysmlProperty.java b/src/main/java/org/sysml/ast/SysmlProperty.java index 3604e516..8011d590 100644 --- a/src/main/java/org/sysml/ast/SysmlProperty.java +++ b/src/main/java/org/sysml/ast/SysmlProperty.java @@ -17,7 +17,7 @@ public class SysmlProperty implements SysmlBlockDefElement { private final SysmlBlockDefElement[] elements; - private final SysmlAnnotation[] annotations; + private final SysmlAttribute[] annotations; private final String[] superTypes; private int multiplicity; @@ -29,7 +29,7 @@ public SysmlProperty( SysmlPropertyType propType, String name, SysmlBlockDefElement[] elements, - SysmlAnnotation[] annotations, + SysmlAttribute[] annotations, String[] superTypes, int multiplicity ){ @@ -46,7 +46,7 @@ public SysmlProperty(SysmlBlockVisibility blockVis, SysmlPropertyType propType, this.prop = propType; this.elements = new SysmlBlockDefElement[0]; this.superTypes = new String[0]; - this.annotations = new SysmlAnnotation[0]; + this.annotations = new SysmlAttribute[0]; this.multiplicity = 1; } @@ -71,7 +71,7 @@ public int getMultiplicity(){ return multiplicity; } - public SysmlAnnotation[] getAnnotations(){ + public SysmlAttribute[] getAnnotations(){ return annotations; } diff --git a/src/main/java/org/sysml/ast/SysmlPropertyDef.java b/src/main/java/org/sysml/ast/SysmlPropertyDef.java new file mode 100644 index 00000000..4589bb12 --- /dev/null +++ b/src/main/java/org/sysml/ast/SysmlPropertyDef.java @@ -0,0 +1,63 @@ +package org.sysml.ast; + +import org.clafer.common.Check; + +public class SysmlPropertyDef implements SysmlBlockDefElement { + private final String name; + + private final SysmlPropertyType prop; + + private final SysmlBlockDefElement[] elements; + + private final SysmlAttribute[] annotations; + private final String[] superTypes; + + public SysmlPropertyDef( + SysmlBlockVisibility blockVis, + SysmlPropertyType propType, + String name, + SysmlBlockDefElement[] elements, + SysmlAttribute[] annotations, + String[] superTypes + ){ + this.name = Check.notNull(name); + this.prop = propType; + this.elements = elements; + this.superTypes = superTypes; + this.annotations = annotations; + } + + public SysmlPropertyDef(SysmlBlockVisibility blockVis, SysmlPropertyType propType, String name){ + this.name = Check.notNull(name); + this.prop = propType; + this.elements = new SysmlBlockDefElement[0]; + this.superTypes = new String[0]; + this.annotations = new SysmlAttribute[0]; + } + + @Override + public String getName() { + return name; + } + + public SysmlPropertyType getPropertyType(){ + return prop; + } + + public SysmlBlockDefElement[] getElements() { + return elements; + } + + public String[] getSupers(){ + return superTypes; + } + + public SysmlAttribute[] getAnnotations(){ + return annotations; + } + + @Override + public B accept(SysmlExprVisitor visitor, A a) { + return visitor.visit(this, a); + } +} diff --git a/src/main/java/org/sysml/compiler/AstSysmlCompiler.java b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java new file mode 100644 index 00000000..58de7113 --- /dev/null +++ b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java @@ -0,0 +1,84 @@ +package org.sysml.compiler; + +import org.clafer.ast.AstAbstractClafer; +import org.clafer.ast.AstClafer; +import org.clafer.ast.AstModel; +import org.clafer.ast.AstRef; +import org.clafer.instance.InstanceClafer; +import org.sysml.ast.*; + +import java.util.*; + +public class AstSysmlCompiler { + private Map typeMap; + + public AstSysmlCompiler(){ + this.typeMap = new HashMap<>(); + this.typeMap.put("int", "Integer"); + this.typeMap.put("real", "Real"); + this.typeMap.put("double", "Real"); + this.typeMap.put("string", "String"); + } + + public String getPropertyId(String name){ + if (name.startsWith("c0_")){ + return name.substring(3); + } else { + return name; + } + } + + public String[] getSuperClafers(AstClafer model){ + Object spr = model.getSuperClafer(); + if (spr == null){ + return new String[0]; + } else { + String[] rem = getSuperClafers((AstClafer) spr); + String[] sprs = Arrays.copyOf(rem, rem.length + 1); + sprs[0] = getPropertyId(((AstClafer) spr).getName()); + System.arraycopy(rem, 0, sprs, 1, rem.length); + return sprs; + } + } + public SysmlPropertyDef[] compile(AstModel model, AstModel topLevelModel) { + ArrayList propDefs = new ArrayList(); + + for (AstAbstractClafer child: model.getAbstractRoot().getAbstractChildren()){ + String name = getPropertyId(child.getName()); + + ArrayList attrs = new ArrayList(); + for (AstClafer sub: child.getChildren()) { + Object sref = sub.getRef(); + if (sref instanceof AstRef){ + AstRef ref = (AstRef) sref; + Object tgt = typeMap.get(ref.getTargetType().toString()); + String propName = getPropertyId(ref.getSourceType().getName()); + attrs.add(new SysmlAttribute(propName, tgt)); + } + } + + String[] superClafers = getSuperClafers(child); + List hierarchy = Arrays.asList(superClafers); + if (hierarchy.size() < 3){ + continue; + } + + String[] superTypes = new String[0]; + if (hierarchy.contains("SysmlProperty")) { + superTypes = Arrays.copyOfRange(superClafers, 0, hierarchy.indexOf("SysmlProperty")-1); + } + + propDefs.add(new SysmlPropertyDef( + new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), + new SysmlPropertyType("part"), + name, + new SysmlBlockDefElement[0], + attrs.toArray(new SysmlAttribute[attrs.size()]), + superTypes + )); + + } + + return propDefs.toArray(new SysmlPropertyDef[propDefs.size()]); + } +} diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java index 8ca2a658..91970f13 100644 --- a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -88,14 +88,14 @@ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) processedClafers.add(model.getType().getName()); // collect the annotations - ArrayList annots = new ArrayList(); + ArrayList annots = new ArrayList(); for (InstanceClafer child : model.getChildren()) { Object ref = child.getType().getRef(); if (ref != null) { AstRef aref = (AstRef) ref; String aname = getPropertyId(aref.getSourceType().getName()); Object refv = child.getRef(); - annots.add(new SysmlAnnotation(aname, refv)); + annots.add(new SysmlAttribute(aname, refv)); } } @@ -105,7 +105,7 @@ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) new SysmlPropertyType(propName), propertyName, children.toArray(new SysmlBlockDefElement[children.size()]), - annots.toArray(new SysmlAnnotation[annots.size()]), + annots.toArray(new SysmlAttribute[annots.size()]), superTypes, multiplicity ); diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 0699058a..7f4c2aed 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -28,7 +28,7 @@ public void print(String indent, SysmlPackage spackage, Appendable out) throws I public void print(String indent, SysmlBlockDefElement sprop, Appendable out) throws IOException { } - public Void visit(SysmlAnnotation ast, String indent) throws IOException { + public Void visit(SysmlAttribute ast, String indent) throws IOException { this.out.append(indent).append(":>> ").append(ast.getName()).append(" = ").append(ast.getRef()).append(";\n"); return null; } @@ -46,11 +46,11 @@ public Void visit(SysmlProperty ast, String indent) { this.out.append("[").append(String.valueOf(ast.getMultiplicity())).append("]"); } for (String s: ast.getSupers()){ - this.out.append(" :> ").append(s); + this.out.append(" : ").append(s); } if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { this.out.append(" {\n"); - for (SysmlAnnotation annot: ast.getAnnotations()){ + for (SysmlAttribute annot: ast.getAnnotations()){ annot.accept(this, indent + indent_base); } for (SysmlBlockDefElement elem : ast.getElements()) { @@ -66,6 +66,37 @@ public Void visit(SysmlProperty ast, String indent) { return null; } + @Override + public Void visit(SysmlPropertyDef ast, String indent) { + try { + this.out + .append(indent) + .append(ast.getPropertyType().getName()) + .append(" def ") + .append(ast.getName()) + ; + for (String s: ast.getSupers()){ + this.out.append(" :> ").append(s); + } + if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { + this.out.append(" {\n"); + for (SysmlAttribute annot: ast.getAnnotations()){ + this.out.append(indent + indent_base).append("attribute ").append(annot.getName()).append(": ").append(annot.getRef()).append(";\n"); + ///annot.accept(this, indent + indent_base); + } + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); + } + this.out.append(indent).append("}\n"); + } else { + this.out.append(";\n"); + } + } catch (IOException ignored) { + + } + return null; + } + @Override public Void visit(SysmlPackage ast, String indent) { try { From 83531fa9f70caf95bdb60d3c494a6382b68bf972 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 10:39:04 -0800 Subject: [PATCH 09/20] allow Instance compiler to return null if no Sysml concepts are referenced, make a SysmlCompilerUtils for shared code between the Sysml compilers --- .../org/clafer/instance/InstanceModel.java | 6 ++- .../org/sysml/compiler/AstSysmlCompiler.java | 14 ++--- .../sysml/compiler/InstanceSysmlCompiler.java | 53 ++++++++++--------- .../sysml/compiler/SysmlCompilerUtils.java | 19 +++++++ 4 files changed, 53 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/sysml/compiler/SysmlCompilerUtils.java diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index a8ca3ccd..f2c44a21 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -68,8 +68,10 @@ public void printSysml(Appendable out, String indent) throws IOException { for (InstanceClafer top : topClafers) { SysmlPrinter pprinter = new SysmlPrinter(out); InstanceSysmlCompiler compiler = new InstanceSysmlCompiler(); - SysmlProperty model = compiler.compile(top, top); - pprinter.visit(model, indent); + // model can be null as the clafer model might not reference sysml concepts + Object _model = compiler.compile(top, top); + if (_model != null) + pprinter.visit((SysmlProperty) _model, indent); } } diff --git a/src/main/java/org/sysml/compiler/AstSysmlCompiler.java b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java index 58de7113..1ba73850 100644 --- a/src/main/java/org/sysml/compiler/AstSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java @@ -20,14 +20,6 @@ public AstSysmlCompiler(){ this.typeMap.put("string", "String"); } - public String getPropertyId(String name){ - if (name.startsWith("c0_")){ - return name.substring(3); - } else { - return name; - } - } - public String[] getSuperClafers(AstClafer model){ Object spr = model.getSuperClafer(); if (spr == null){ @@ -35,7 +27,7 @@ public String[] getSuperClafers(AstClafer model){ } else { String[] rem = getSuperClafers((AstClafer) spr); String[] sprs = Arrays.copyOf(rem, rem.length + 1); - sprs[0] = getPropertyId(((AstClafer) spr).getName()); + sprs[0] = SysmlCompilerUtils.getPropertyId(((AstClafer) spr).getName()); System.arraycopy(rem, 0, sprs, 1, rem.length); return sprs; } @@ -44,7 +36,7 @@ public SysmlPropertyDef[] compile(AstModel model, AstModel topLevelModel) { ArrayList propDefs = new ArrayList(); for (AstAbstractClafer child: model.getAbstractRoot().getAbstractChildren()){ - String name = getPropertyId(child.getName()); + String name = SysmlCompilerUtils.getPropertyId(child.getName()); ArrayList attrs = new ArrayList(); for (AstClafer sub: child.getChildren()) { @@ -52,7 +44,7 @@ public SysmlPropertyDef[] compile(AstModel model, AstModel topLevelModel) { if (sref instanceof AstRef){ AstRef ref = (AstRef) sref; Object tgt = typeMap.get(ref.getTargetType().toString()); - String propName = getPropertyId(ref.getSourceType().getName()); + String propName = SysmlCompilerUtils.getPropertyId(ref.getSourceType().getName()); attrs.add(new SysmlAttribute(propName, tgt)); } } diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java index 91970f13..9c09f2cc 100644 --- a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -8,6 +8,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class InstanceSysmlCompiler { @@ -17,14 +19,6 @@ public InstanceSysmlCompiler(){ this.processedClafers = new ArrayList(); } - public String getPropertyId(String name){ - if (name.startsWith("c0_")){ - return name.substring(3); - } else { - return name; - } - } - int getMultiplicity(InstanceClafer model, AstClafer clafer){ int count = 0; if (model.getType().getName().equals(clafer.getName())){ @@ -40,7 +34,7 @@ ArrayList _getSuperClafers(AstClafer clafer, ArrayList hier){ if (clafer.getSuperClafer() == null) { return hier; } else { - hier.add(getPropertyId(clafer.getSuperClafer().getName())); + hier.add(SysmlCompilerUtils.getPropertyId(clafer.getSuperClafer().getName())); return _getSuperClafers(clafer.getSuperClafer(), hier); } } @@ -53,7 +47,7 @@ public String[] getSuperClafers(AstClafer clafer){ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) { // collect the identifier - String propertyName = getPropertyId(model.getType().getName()); + String propertyName =SysmlCompilerUtils.getPropertyId(model.getType().getName()); // get its supers String[] superClafers = getSuperClafers(model.getType()); @@ -63,12 +57,15 @@ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) ArrayList children = new ArrayList(); for (InstanceClafer child : model.getChildren()) { if (!processedClafers.contains(child.getType().getName())) { - SysmlProperty cchild = compile(child, topLevelModel); - if (!cchild.getPropertyType().getName().equals("unk")) { - children.add(cchild); - } else { - SysmlBlockDefElement[] schildren = cchild.getElements(); - children.addAll(new ArrayList(Arrays.asList(schildren))); + Object _cchild = compile(child, topLevelModel); + if (_cchild != null) { + SysmlProperty cchild = (SysmlProperty) _cchild; + if (!cchild.getPropertyType().getName().equals("unk")) { + children.add(cchild); + } else { + SysmlBlockDefElement[] schildren = cchild.getElements(); + children.addAll(new ArrayList(Arrays.asList(schildren))); + } } } } @@ -93,22 +90,26 @@ public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) Object ref = child.getType().getRef(); if (ref != null) { AstRef aref = (AstRef) ref; - String aname = getPropertyId(aref.getSourceType().getName()); + String aname = SysmlCompilerUtils.getPropertyId(aref.getSourceType().getName()); Object refv = child.getRef(); annots.add(new SysmlAttribute(aname, refv)); } } // build a property object - return new SysmlProperty( - new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), - new SysmlPropertyType(propName), - propertyName, - children.toArray(new SysmlBlockDefElement[children.size()]), - annots.toArray(new SysmlAttribute[annots.size()]), - superTypes, - multiplicity - ); + if (propName.equals("unk") && children.size() == 0){ + return null; + } else { + return new SysmlProperty( + new SysmlBlockVisibility(SysmlVisibilityOption.PLUS), + new SysmlPropertyType(propName), + propertyName, + children.toArray(new SysmlBlockDefElement[children.size()]), + annots.toArray(new SysmlAttribute[annots.size()]), + superTypes, + multiplicity + ); + } } } diff --git a/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java b/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java new file mode 100644 index 00000000..dd803cff --- /dev/null +++ b/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java @@ -0,0 +1,19 @@ +package org.sysml.compiler; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SysmlCompilerUtils { + public static String getPropertyId(String name){ + Pattern pattern = Pattern.compile("(c[0-9]+_).*", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(name); + boolean matchFound = matcher.find(); + //matcher.group() + if (matchFound){ + return name.substring(matcher.group(1).length()); + } else { + return name; + } + } + +} From 8c878d67b6272d3536b26b018a9c03e00b1ae73e Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 10:42:18 -0800 Subject: [PATCH 10/20] hoist getSuperClafers to the compiler utils --- .../org/sysml/compiler/AstSysmlCompiler.java | 14 +------------- .../sysml/compiler/InstanceSysmlCompiler.java | 17 +---------------- .../org/sysml/compiler/SysmlCompilerUtils.java | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/sysml/compiler/AstSysmlCompiler.java b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java index 1ba73850..3ecfdb39 100644 --- a/src/main/java/org/sysml/compiler/AstSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/AstSysmlCompiler.java @@ -20,18 +20,6 @@ public AstSysmlCompiler(){ this.typeMap.put("string", "String"); } - public String[] getSuperClafers(AstClafer model){ - Object spr = model.getSuperClafer(); - if (spr == null){ - return new String[0]; - } else { - String[] rem = getSuperClafers((AstClafer) spr); - String[] sprs = Arrays.copyOf(rem, rem.length + 1); - sprs[0] = SysmlCompilerUtils.getPropertyId(((AstClafer) spr).getName()); - System.arraycopy(rem, 0, sprs, 1, rem.length); - return sprs; - } - } public SysmlPropertyDef[] compile(AstModel model, AstModel topLevelModel) { ArrayList propDefs = new ArrayList(); @@ -49,7 +37,7 @@ public SysmlPropertyDef[] compile(AstModel model, AstModel topLevelModel) { } } - String[] superClafers = getSuperClafers(child); + String[] superClafers = SysmlCompilerUtils.getSuperClafers(child); List hierarchy = Arrays.asList(superClafers); if (hierarchy.size() < 3){ continue; diff --git a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java index 9c09f2cc..dafd3ce6 100644 --- a/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java +++ b/src/main/java/org/sysml/compiler/InstanceSysmlCompiler.java @@ -30,27 +30,12 @@ int getMultiplicity(InstanceClafer model, AstClafer clafer){ return count; } - ArrayList _getSuperClafers(AstClafer clafer, ArrayList hier){ - if (clafer.getSuperClafer() == null) { - return hier; - } else { - hier.add(SysmlCompilerUtils.getPropertyId(clafer.getSuperClafer().getName())); - return _getSuperClafers(clafer.getSuperClafer(), hier); - } - } - - public String[] getSuperClafers(AstClafer clafer){ - ArrayList clafers = _getSuperClafers(clafer, new ArrayList()); - String[] clafers_arr = new String[clafers.size()]; - return clafers.toArray(clafers_arr); - } - public SysmlProperty compile(InstanceClafer model, InstanceClafer topLevelModel) { // collect the identifier String propertyName =SysmlCompilerUtils.getPropertyId(model.getType().getName()); // get its supers - String[] superClafers = getSuperClafers(model.getType()); + String[] superClafers = SysmlCompilerUtils.getSuperClafers(model.getType()); List hierarchy = Arrays.asList(superClafers); // process the children diff --git a/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java b/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java index dd803cff..40afe812 100644 --- a/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java +++ b/src/main/java/org/sysml/compiler/SysmlCompilerUtils.java @@ -1,5 +1,8 @@ package org.sysml.compiler; +import org.clafer.ast.AstClafer; + +import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,4 +19,16 @@ public static String getPropertyId(String name){ } } + public static String[] getSuperClafers(AstClafer model){ + Object spr = model.getSuperClafer(); + if (spr == null){ + return new String[0]; + } else { + String[] rem = getSuperClafers((AstClafer) spr); + String[] sprs = Arrays.copyOf(rem, rem.length + 1); + sprs[0] = SysmlCompilerUtils.getPropertyId(((AstClafer) spr).getName()); + System.arraycopy(rem, 0, sprs, 1, rem.length); + return sprs; + } + } } From d02d62df12cef2cf6e7966c298d05b80f64d2848 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 16:53:09 -0800 Subject: [PATCH 11/20] address emptyblocktag --- src/main/java/org/clafer/instance/InstanceModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/clafer/instance/InstanceModel.java b/src/main/java/org/clafer/instance/InstanceModel.java index f2c44a21..fd97bcad 100644 --- a/src/main/java/org/clafer/instance/InstanceModel.java +++ b/src/main/java/org/clafer/instance/InstanceModel.java @@ -59,8 +59,8 @@ public InstanceClafer getTopClafer(AstConcreteClafer type) { * This is the start of exploring an automated product derivation tool * and the requirements around inferring a system model from clafer are * still tbd - * @param out - * @throws IOException + * + * */ public void printSysml(Appendable out, String indent) throws IOException { From 9c97f20d31e4a5182887ae7285353dc59b510e14 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 16:54:51 -0800 Subject: [PATCH 12/20] remove the bad exception handling --- src/main/java/org/sysml/pprinter/SysmlPrinter.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 7f4c2aed..31fbdffe 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -98,16 +98,12 @@ public Void visit(SysmlPropertyDef ast, String indent) { } @Override - public Void visit(SysmlPackage ast, String indent) { - try { - this.out.append(indent).append("package ").append(ast.getName()).append(" {").append("\n"); - for (SysmlBlockDefElement elem : ast.getElements()) { - elem.accept(this, indent + indent_base); - } - this.out.append(indent).append("}\n"); - } catch (IOException ignored) { - + public Void visit(SysmlPackage ast, String indent) throws IOException { + this.out.append(indent).append("package ").append(ast.getName()).append(" {").append("\n"); + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); } + this.out.append(indent).append("}\n"); return null; } } From 95b84d774f5dcdb3a7be71fe56612aca37a36ee3 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 16:57:31 -0800 Subject: [PATCH 13/20] allow visit to throw IOException --- .../java/org/sysml/ast/SysmlExprVisitor.java | 2 +- .../java/org/sysml/ast/SysmlProperty.java | 4 +- .../java/org/sysml/pprinter/SysmlPrinter.java | 49 +++++++++---------- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/sysml/ast/SysmlExprVisitor.java b/src/main/java/org/sysml/ast/SysmlExprVisitor.java index f6e8cf3b..30320a6b 100644 --- a/src/main/java/org/sysml/ast/SysmlExprVisitor.java +++ b/src/main/java/org/sysml/ast/SysmlExprVisitor.java @@ -5,7 +5,7 @@ public interface SysmlExprVisitor { B visit(SysmlPackage ast, A a) throws IOException; - B visit(SysmlProperty ast, A a); + B visit(SysmlProperty ast, A a) throws IOException; B visit(SysmlAttribute ast, A a) throws IOException; diff --git a/src/main/java/org/sysml/ast/SysmlProperty.java b/src/main/java/org/sysml/ast/SysmlProperty.java index 8011d590..5f8f9747 100644 --- a/src/main/java/org/sysml/ast/SysmlProperty.java +++ b/src/main/java/org/sysml/ast/SysmlProperty.java @@ -2,6 +2,8 @@ import org.clafer.common.Check; +import java.io.IOException; + /** * SysML Property * @@ -76,7 +78,7 @@ public SysmlAttribute[] getAnnotations(){ } @Override - public B accept(SysmlExprVisitor visitor, A a) { + public B accept(SysmlExprVisitor visitor, A a) throws IOException { return visitor.visit(this, a); } } diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 31fbdffe..1d662ad4 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -34,35 +34,32 @@ public Void visit(SysmlAttribute ast, String indent) throws IOException { } @Override - public Void visit(SysmlProperty ast, String indent) { - try { - this.out - .append(indent) - .append(ast.getPropertyType().getName()) - .append(" ") - .append(ast.getName()) - ; - if (ast.getMultiplicity() > 1) { - this.out.append("[").append(String.valueOf(ast.getMultiplicity())).append("]"); + public Void visit(SysmlProperty ast, String indent) throws IOException { + this.out + .append(indent) + .append(ast.getPropertyType().getName()) + .append(" ") + .append(ast.getName()) + ; + if (ast.getMultiplicity() > 1) { + this.out.append("[").append(String.valueOf(ast.getMultiplicity())).append("]"); + } + for (String s: ast.getSupers()){ + this.out.append(" : ").append(s); + } + if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { + this.out.append(" {\n"); + for (SysmlAttribute annot: ast.getAnnotations()){ + annot.accept(this, indent + indent_base); } - for (String s: ast.getSupers()){ - this.out.append(" : ").append(s); + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); } - if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { - this.out.append(" {\n"); - for (SysmlAttribute annot: ast.getAnnotations()){ - annot.accept(this, indent + indent_base); - } - for (SysmlBlockDefElement elem : ast.getElements()) { - elem.accept(this, indent + indent_base); - } - this.out.append(indent).append("}\n"); - } else { - this.out.append(";\n"); - } - } catch (IOException ignored) { - + this.out.append(indent).append("}\n"); + } else { + this.out.append(";\n"); } + return null; } From 3d8f35210dcc2174c3f362a85a5e78042a685913 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:14:36 -0800 Subject: [PATCH 14/20] add maven CI/CD --- .github/workflows/maven.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/maven.yml diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 00000000..2e6ecf07 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,30 @@ +name: Maven CI + +on: + push: + branches: [ $default-branch ] + pull_request: + branches: [ $default-branch ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: '8' + distribution: 'temurin' + - name: Set up Maven + uses: stCarolas/setup-maven@v4.5 + with: + maven-version: 3.8.2 + - name: Build with Maven + run: mvn -B package --file pom.xml + + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 From a48271d0a13fcbd5dd96fb4894780e4bc577556c Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:19:59 -0800 Subject: [PATCH 15/20] fix unhandled exception catching and null dereference issue --- .../ast/analysis/PartialIntAnalyzer.java | 4 ++ .../java/org/sysml/ast/SysmlExprVisitor.java | 2 +- .../java/org/sysml/ast/SysmlPropertyDef.java | 4 +- .../java/org/sysml/pprinter/SysmlPrinter.java | 44 +++++++++---------- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/clafer/ast/analysis/PartialIntAnalyzer.java b/src/main/java/org/clafer/ast/analysis/PartialIntAnalyzer.java index 877cc0a6..2ae4c3e4 100644 --- a/src/main/java/org/clafer/ast/analysis/PartialIntAnalyzer.java +++ b/src/main/java/org/clafer/ast/analysis/PartialIntAnalyzer.java @@ -184,6 +184,10 @@ private Map partialInts(Oracle oracle) { AstRef ref = AstUtil.getInheritedRef(clafer); if (ref != null) { Path[][] paths = pathsToClafers.get(clafer); + // NULL_DEREFERENCE + if (paths == null){ + return partialInts; + } Domain[] domains = new Domain[paths.length]; for (int i = 0; i < paths.length; i++) { Domain domain = Domains.EmptyDomain; diff --git a/src/main/java/org/sysml/ast/SysmlExprVisitor.java b/src/main/java/org/sysml/ast/SysmlExprVisitor.java index 30320a6b..7cb6f748 100644 --- a/src/main/java/org/sysml/ast/SysmlExprVisitor.java +++ b/src/main/java/org/sysml/ast/SysmlExprVisitor.java @@ -9,5 +9,5 @@ public interface SysmlExprVisitor { B visit(SysmlAttribute ast, A a) throws IOException; - B visit(SysmlPropertyDef sysmlPropertyDef, A a); + B visit(SysmlPropertyDef sysmlPropertyDef, A a) throws IOException; } diff --git a/src/main/java/org/sysml/ast/SysmlPropertyDef.java b/src/main/java/org/sysml/ast/SysmlPropertyDef.java index 4589bb12..dd61de05 100644 --- a/src/main/java/org/sysml/ast/SysmlPropertyDef.java +++ b/src/main/java/org/sysml/ast/SysmlPropertyDef.java @@ -2,6 +2,8 @@ import org.clafer.common.Check; +import java.io.IOException; + public class SysmlPropertyDef implements SysmlBlockDefElement { private final String name; @@ -57,7 +59,7 @@ public SysmlAttribute[] getAnnotations(){ } @Override - public B accept(SysmlExprVisitor visitor, A a) { + public B accept(SysmlExprVisitor visitor, A a) throws IOException { return visitor.visit(this, a); } } diff --git a/src/main/java/org/sysml/pprinter/SysmlPrinter.java b/src/main/java/org/sysml/pprinter/SysmlPrinter.java index 1d662ad4..459419b7 100644 --- a/src/main/java/org/sysml/pprinter/SysmlPrinter.java +++ b/src/main/java/org/sysml/pprinter/SysmlPrinter.java @@ -64,32 +64,28 @@ public Void visit(SysmlProperty ast, String indent) throws IOException { } @Override - public Void visit(SysmlPropertyDef ast, String indent) { - try { - this.out - .append(indent) - .append(ast.getPropertyType().getName()) - .append(" def ") - .append(ast.getName()) - ; - for (String s: ast.getSupers()){ - this.out.append(" :> ").append(s); + public Void visit(SysmlPropertyDef ast, String indent) throws IOException { + this.out + .append(indent) + .append(ast.getPropertyType().getName()) + .append(" def ") + .append(ast.getName()) + ; + for (String s: ast.getSupers()){ + this.out.append(" :> ").append(s); + } + if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { + this.out.append(" {\n"); + for (SysmlAttribute annot: ast.getAnnotations()){ + this.out.append(indent + indent_base).append("attribute ").append(annot.getName()).append(": ").append(annot.getRef()).append(";\n"); + ///annot.accept(this, indent + indent_base); } - if (ast.getElements().length > 0 || ast.getAnnotations().length > 0) { - this.out.append(" {\n"); - for (SysmlAttribute annot: ast.getAnnotations()){ - this.out.append(indent + indent_base).append("attribute ").append(annot.getName()).append(": ").append(annot.getRef()).append(";\n"); - ///annot.accept(this, indent + indent_base); - } - for (SysmlBlockDefElement elem : ast.getElements()) { - elem.accept(this, indent + indent_base); - } - this.out.append(indent).append("}\n"); - } else { - this.out.append(";\n"); + for (SysmlBlockDefElement elem : ast.getElements()) { + elem.accept(this, indent + indent_base); } - } catch (IOException ignored) { - + this.out.append(indent).append("}\n"); + } else { + this.out.append(";\n"); } return null; } From 487755b0b89c29e7698231476855b114107b6129 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:26:08 -0800 Subject: [PATCH 16/20] remove travis CI/CD --- .travis.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 334c5e23..00000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: java -sudo: false - -jdk: - - oraclejdk8 - -install: - - cd $HOME - - git clone --depth=50 https://github.com/chocoteam/choco3.git chocoteam/choco3 - - cd chocoteam/choco3 - - mvn install -DskipTests - - rm -rf $HOME/chocoteam/choco3 - -before_script: cd $TRAVIS_BUILD_DIR - -script: mvn test -DargLine="-Xmx1024m" From e79d0db9667c149691c2a103e88cdfffcecbd0de Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:27:30 -0800 Subject: [PATCH 17/20] run maven CI/CD on push --- .github/workflows/maven.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 2e6ecf07..52a31242 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,10 +1,6 @@ name: Maven CI -on: - push: - branches: [ $default-branch ] - pull_request: - branches: [ $default-branch ] +on: [push] jobs: build: From f739f184daf37a96fc34ee319a5fce522f5d4d4b Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:32:54 -0800 Subject: [PATCH 18/20] bump Maven Dependency Tree Dependency Submission action --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 52a31242..a2453ff7 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -23,4 +23,4 @@ jobs: # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + uses: advanced-security/maven-dependency-submission-action@v3.0.0 From f54dd1701fc12d0a7184e461d9bb24e8f0f1c16f Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:36:55 -0800 Subject: [PATCH 19/20] remove dependency graph upload for now --- .github/workflows/maven.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index a2453ff7..48d5ff56 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -21,6 +21,3 @@ jobs: - name: Build with Maven run: mvn -B package --file pom.xml - # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@v3.0.0 From 29bd949082fc774bafe813cdfeec837dbb225e87 Mon Sep 17 00:00:00 2001 From: Ethan Lew Date: Tue, 28 Feb 2023 17:42:10 -0800 Subject: [PATCH 20/20] update CI/CD badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 137c3003..d2fec28f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://secure.travis-ci.org/gsdlab/chocosolver.svg)](http://travis-ci.org/gsdlab/chocosolver) +[![Build Status](https://github.com/EthanJamesLew/chocosolver-sysml/actions/workflows/maven.yml/badge.svg)](https://github.com/EthanJamesLew/chocosolver-sysml/actions/workflows/maven.yml) # chocosolver