Commit 75f6f8cb authored by Martti Käärik's avatar Martti Käärik
Browse files

Updates for TO constraint processing - reserved word escaping, extra imports and package name.

parent 24e0e5ec
Loading
Loading
Loading
Loading
+84 −82
Original line number Diff line number Diff line
@@ -20,8 +20,7 @@ public class ConstraintExporter {
	private OutputFormat format;

	enum OutputFormat {
		EVL,
		OCL
		EVL, OCL
	}

	public static void main(String[] args) {
@@ -29,6 +28,8 @@ public class ConstraintExporter {
		OutputFormat format = OutputFormat.EVL;
		String filename = "resources/es_20311901v010501p.docx";
		filename = "resources/es_20311904v010401p.docx";
		String[] extraImports = new String[0];
		String generatedPackage = "tdl";

		for (int i = 0; i < args.length; i++) {
			if (args[i].equalsIgnoreCase("--format"))
@@ -40,6 +41,14 @@ public class ConstraintExporter {
				if (args.length > i + 1) {
					filename = args[i + 1];
				}
			if (args[i].equalsIgnoreCase("--import"))
				if (args.length > i + 1) {
					extraImports = args[i + 1].split(",");
				}
			if (args[i].equalsIgnoreCase("--generated-package"))
				if (args.length > i + 1) {
					generatedPackage = args[i + 1];
				}
		}

		Document doc = DocumentHandler.loadDocument(new File(filename).getAbsolutePath());
@@ -47,36 +56,38 @@ public class ConstraintExporter {
		exporter.format = format;
		String title = doc.getTitle();
		title = title.replaceAll(" ", "-");
		String targetPath = "resources/generated/tdl-generated-"+title+(format == OutputFormat.EVL ? ".evl" : ".ocl");
		exporter.exportConstraints(doc, targetPath);
		String targetPath = "resources/generated/tdl-generated-" + title
				+ (format == OutputFormat.EVL ? ".evl" : ".ocl");
		exporter.exportConstraints(doc, generatedPackage, extraImports, targetPath);
	}

	public void exportConstraints(Document doc, String generatedConstraintsPath) {
	public void exportConstraints(Document doc, String generatedPackage, String[] extraImports, String generatedConstraintsPath) {
		generatedConstraints = "";
		String imports = "";
		if (this.format == OutputFormat.OCL)
			imports = "import 'http://www.etsi.org/spec/TDL/1.4.1'\n\n"
					+ "package tdl\n\n";
		else
			imports = "import \"../library/common.eol\";\n"
				+ "import \"../library/helper.eol\";\n"
				+ "import \"../library/debug.eol\";\n"
				+ "\n";
		if (this.format == OutputFormat.OCL) {
			imports = "import 'http://www.etsi.org/spec/TDL/1.4.1'\n";
			for (String imp : extraImports) {
				imports += "import '" + imp + "'\n";
			}
			imports += "\n";
			imports += "package " + generatedPackage + "\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.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
			Files.write(gcp, Arrays.asList(generatedConstraints.split("\n")), StandardOpenOption.WRITE,
					StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	private void processDocumentModel(Content c) {
		// DONE: Escape keywords
		// DONE: Export to file tdl-gen.evl (separate function)
@@ -100,7 +111,6 @@ public class ConstraintExporter {
		}
	}


	private String getConstraint(Content cx) {
		if (this.format == OutputFormat.OCL)
			return getOclConstraint(cx);
@@ -110,11 +120,9 @@ public class ConstraintExporter {

	Pattern letPattern = Pattern.compile("\\s*let(.+?)\\s*in\\s(.*)", Pattern.DOTALL);
	Pattern wsPattern = Pattern.compile("(\\s*)(.*)", Pattern.DOTALL);

	private String getEvlConstraint(Content cx) {
		String content = "context "
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
				+" {"+"\n";
		String content = "context " + cx.getParent().getText().replaceAll(".+\\s", "") + " {" + "\n";
		for (Content cs : cx.getContent()) {
			var lines = Arrays.asList(cs.getText().split("\n"));
			var idIndex = 2;
@@ -134,10 +142,7 @@ public class ConstraintExporter {
//								idIndex++;
//							}
				}
				var id = lines.get(idIndex)
						.replaceAll("inv: ", "")
						.replaceAll(":", "")
						;
				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+", " ")
@@ -173,8 +178,7 @@ public class ConstraintExporter {
				content += "  //" + title + "\n";
				content += "  constraint " + id + " {" + "\n";
				content += "    check" + (isStatementBlock ? " " : ": ") + ocl + "\n";
				content+="    message:   self.prefix() + \n"
						+"               \""+description+"\""+"\n";
				content += "    message:   self.prefix() + \n" + "               \"" + description + "\"" + "\n";
				content += "  }\n" + "\n";
			} else {
				content += "  //" + lines + "\n";
@@ -185,10 +189,7 @@ public class ConstraintExporter {
	}

	private String getOclConstraint(Content cx) {
		String content = "context "
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
				+"\n";
		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"));
@@ -203,10 +204,7 @@ public class ConstraintExporter {
						description = "";
					}
				}
				var id = lines.get(idIndex)
						.replaceAll("inv: ", "")
						.replaceAll(":", "")
						;
				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+", " ")
@@ -216,6 +214,10 @@ public class ConstraintExporter {
				if (ocl.trim().startsWith("This")) {
					ocl = "    true" + " --" + ocl.trim();
				}
				
				//Escape reserved words
				ocl = Pattern.compile("(?<=\\.)(body)(?=\\s|\\.|-|\\))").matcher(ocl).replaceAll("_'$1'");
				
				content += "  -- " + title + "\n";
				content += "  inv " + id + " ('" + description.replaceAll("\\'", "\\\\\\'") + "' + self.toString()):\n";
				content += "    " + ocl + "\n";