Commit 34bca6cc authored by Martti Käärik's avatar Martti Käärik
Browse files

First draft of Complete OCL constraint generation.

parent 664dcc1f
Loading
Loading
Loading
Loading
+85 −2
Original line number Diff line number Diff line
@@ -14,25 +14,55 @@ public class ConstraintExporter {

	private String generatedConstraints = "";
	
	private OutputFormat format;
	
	enum OutputFormat {
		EVL,
		OCL
	}

	public static void main(String[] args) {

		OutputFormat format = OutputFormat.EVL;
		String filename = "resources/es_20311901v010501p.docx";
		filename = "resources/es_20311904v010401p.docx";
		
		for (int i = 0; i < args.length; i++) {
			if (args[i].equalsIgnoreCase("--format"))
				if (args.length > i + 1) {
					if (args[i + 1].equalsIgnoreCase("ocl"))
						format = OutputFormat.OCL;
				}
			if (args[i].equalsIgnoreCase("--in"))
				if (args.length > i + 1) {
					filename = args[i + 1];
				}
		}
		
		Document doc = DocumentHandler.loadDocument(new File(filename).getAbsolutePath());
		ConstraintExporter exporter = new ConstraintExporter();
		exporter.format = format;
		String title = doc.getTitle();
		title = title.replaceAll(" ", "-");
		String targetPath = "resources/generated/tdl-generated-"+title+".evl";
		String targetPath = "resources/generated/tdl-generated-"+title+(format == OutputFormat.EVL ? ".evl" : ".ocl");
		exporter.exportConstraints(doc, targetPath);
	}
	
	public void exportConstraints(Document doc, String generatedConstraintsPath) {
		generatedConstraints = "";
		String imports = "import \"../library/common.eol\";\n"
		String imports = "";
		if (this.format == OutputFormat.OCL)
			imports = "import 'tdl.ecore'\n\n"
					+ "package tdl\n\n";
		else
			imports = "import \"../library/common.eol\";\n"
				+ "import \"../library/helper.eol\";\n"
				+ "import \"../library/debug.eol\";\n"
				+ "\n";
		generatedConstraints+=imports;
		processDocumentModel(doc);
		if (this.format == OutputFormat.OCL)
			generatedConstraints+= "\n" + "endpackage" + "\n";
		Path gcp = Path.of(generatedConstraintsPath);
		try {
			Files.write(gcp, Arrays.asList(generatedConstraints.split("\n")), StandardOpenOption.CREATE);
@@ -68,6 +98,13 @@ public class ConstraintExporter {


	private String getConstraint(Content cx) {
		if (this.format == OutputFormat.OCL)
			return getOclConstraint(cx);
		else
			return getEvlConstraint(cx);
	}
	
	private String getEvlConstraint(Content cx) {
		String content = "context "
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
@@ -117,4 +154,50 @@ public class ConstraintExporter {
		return content;
	}

	private String getOclConstraint(Content cx) {
		String content = "context "
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
				+"\n";
		boolean hasConstraints = false;
		for (Content cs : cx.getContent()) {
			var lines = Arrays.asList(cs.getText().split("\n"));
			var idIndex = 2;
			if (lines.size()>3) {
				var title = lines.get(0);
				var description = lines.get(1);
				if (!lines.get(2).trim().startsWith("inv:")) {
					if (lines.get(0).trim().startsWith("inv:")) {
						idIndex = 0;
						title = "";
						description = "";
					}
				}
				var id = lines.get(idIndex)
						.replaceAll("inv: ", "")
						.replaceAll(":", "")
						;
				var ocl = String.join("\n      ",lines.subList(idIndex+1, lines.size()))
//						.replaceAll("(import|function|guard)([\\W])", "`$1`$2")
						//.replaceAll("\\s+", " ")
						;
				
				if (ocl.trim().startsWith("This")) {
					ocl = "    true"+" --"+ocl.trim();
				}
				content+="  -- "+title+"\n";
				content+="  inv "+id + " ('" + description.replaceAll("\\'", "\\\\\\'") +"' + self.toString()):\n";
				content+="    "+ocl+"\n";
				content+="  \n\n";
				hasConstraints = true;
			} else {
				content+="  -- "+lines+"\n";
			}
		}
		if (!hasConstraints)
			return "";
		content+="\n"+"\n";
		return content;
	}

}