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 Original line Diff line number Diff line
@@ -20,8 +20,7 @@ public class ConstraintExporter {
	private OutputFormat format;
	private OutputFormat format;


	enum OutputFormat {
	enum OutputFormat {
		EVL,
		EVL, OCL
		OCL
	}
	}


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


		for (int i = 0; i < args.length; i++) {
		for (int i = 0; i < args.length; i++) {
			if (args[i].equalsIgnoreCase("--format"))
			if (args[i].equalsIgnoreCase("--format"))
@@ -40,6 +41,14 @@ public class ConstraintExporter {
				if (args.length > i + 1) {
				if (args.length > i + 1) {
					filename = args[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());
		Document doc = DocumentHandler.loadDocument(new File(filename).getAbsolutePath());
@@ -47,36 +56,38 @@ public class ConstraintExporter {
		exporter.format = format;
		exporter.format = format;
		String title = doc.getTitle();
		String title = doc.getTitle();
		title = title.replaceAll(" ", "-");
		title = title.replaceAll(" ", "-");
		String targetPath = "resources/generated/tdl-generated-"+title+(format == OutputFormat.EVL ? ".evl" : ".ocl");
		String targetPath = "resources/generated/tdl-generated-" + title
		exporter.exportConstraints(doc, targetPath);
				+ (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 = "";
		generatedConstraints = "";
		String imports = "";
		String imports = "";
		if (this.format == OutputFormat.OCL)
		if (this.format == OutputFormat.OCL) {
			imports = "import 'http://www.etsi.org/spec/TDL/1.4.1'\n\n"
			imports = "import 'http://www.etsi.org/spec/TDL/1.4.1'\n";
					+ "package tdl\n\n";
			for (String imp : extraImports) {
		else
				imports += "import '" + imp + "'\n";
			imports = "import \"../library/common.eol\";\n"
			}
				+ "import \"../library/helper.eol\";\n"
			imports += "\n";
				+ "import \"../library/debug.eol\";\n"
			imports += "package " + generatedPackage + "\n\n";
				+ "\n";
		} else
			imports = "import \"../library/common.eol\";\n" + "import \"../library/helper.eol\";\n"
					+ "import \"../library/debug.eol\";\n" + "\n";
		generatedConstraints += imports;
		generatedConstraints += imports;
		processDocumentModel(doc);
		processDocumentModel(doc);
		if (this.format == OutputFormat.OCL)
		if (this.format == OutputFormat.OCL)
			generatedConstraints += "\n" + "endpackage" + "\n";
			generatedConstraints += "\n" + "endpackage" + "\n";
		Path gcp = Path.of(generatedConstraintsPath);
		Path gcp = Path.of(generatedConstraintsPath);
		try {
		try {
			Files.write(gcp, Arrays.asList(generatedConstraints.split("\n")),
			Files.write(gcp, Arrays.asList(generatedConstraints.split("\n")), StandardOpenOption.WRITE,
					StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
					StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
		} catch (IOException e) {
		} catch (IOException e) {
			// TODO Auto-generated catch block
			// TODO Auto-generated catch block
			e.printStackTrace();
			e.printStackTrace();
		}
		}
	}
	}


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



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


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

	private String getEvlConstraint(Content cx) {
	private String getEvlConstraint(Content cx) {
		String content = "context "
		String content = "context " + cx.getParent().getText().replaceAll(".+\\s", "") + " {" + "\n";
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
				+" {"+"\n";
		for (Content cs : cx.getContent()) {
		for (Content cs : cx.getContent()) {
			var lines = Arrays.asList(cs.getText().split("\n"));
			var lines = Arrays.asList(cs.getText().split("\n"));
			var idIndex = 2;
			var idIndex = 2;
@@ -134,10 +142,7 @@ public class ConstraintExporter {
//								idIndex++;
//								idIndex++;
//							}
//							}
				}
				}
				var id = lines.get(idIndex)
				var id = lines.get(idIndex).replaceAll("inv: ", "").replaceAll(":", "");
						.replaceAll("inv: ", "")
						.replaceAll(":", "")
						;
				var ocl = String.join("\n      ", lines.subList(idIndex + 1, lines.size()))
				var ocl = String.join("\n      ", lines.subList(idIndex + 1, lines.size()))
						.replaceAll("(import|function|guard)([\\W])", "`$1`$2")
						.replaceAll("(import|function|guard)([\\W])", "`$1`$2")
				// .replaceAll("\\s+", " ")
				// .replaceAll("\\s+", " ")
@@ -173,8 +178,7 @@ public class ConstraintExporter {
				content += "  //" + title + "\n";
				content += "  //" + title + "\n";
				content += "  constraint " + id + " {" + "\n";
				content += "  constraint " + id + " {" + "\n";
				content += "    check" + (isStatementBlock ? " " : ": ") + ocl + "\n";
				content += "    check" + (isStatementBlock ? " " : ": ") + ocl + "\n";
				content+="    message:   self.prefix() + \n"
				content += "    message:   self.prefix() + \n" + "               \"" + description + "\"" + "\n";
						+"               \""+description+"\""+"\n";
				content += "  }\n" + "\n";
				content += "  }\n" + "\n";
			} else {
			} else {
				content += "  //" + lines + "\n";
				content += "  //" + lines + "\n";
@@ -185,10 +189,7 @@ public class ConstraintExporter {
	}
	}


	private String getOclConstraint(Content cx) {
	private String getOclConstraint(Content cx) {
		String content = "context "
		String content = "context " + cx.getParent().getText().replaceAll(".+\\s", "") + "\n";
				+cx.getParent().getText()
					.replaceAll(".+\\s", "")
				+"\n";
		boolean hasConstraints = false;
		boolean hasConstraints = false;
		for (Content cs : cx.getContent()) {
		for (Content cs : cx.getContent()) {
			var lines = Arrays.asList(cs.getText().split("\n"));
			var lines = Arrays.asList(cs.getText().split("\n"));
@@ -203,10 +204,7 @@ public class ConstraintExporter {
						description = "";
						description = "";
					}
					}
				}
				}
				var id = lines.get(idIndex)
				var id = lines.get(idIndex).replaceAll("inv: ", "").replaceAll(":", "");
						.replaceAll("inv: ", "")
						.replaceAll(":", "")
						;
				var ocl = String.join("\n      ", lines.subList(idIndex + 1, lines.size()))
				var ocl = String.join("\n      ", lines.subList(idIndex + 1, lines.size()))
//						.replaceAll("(import|function|guard)([\\W])", "`$1`$2")
//						.replaceAll("(import|function|guard)([\\W])", "`$1`$2")
				// .replaceAll("\\s+", " ")
				// .replaceAll("\\s+", " ")
@@ -216,6 +214,10 @@ public class ConstraintExporter {
				if (ocl.trim().startsWith("This")) {
				if (ocl.trim().startsWith("This")) {
					ocl = "    true" + " --" + ocl.trim();
					ocl = "    true" + " --" + ocl.trim();
				}
				}
				
				//Escape reserved words
				ocl = Pattern.compile("(?<=\\.)(body)(?=\\s|\\.|-|\\))").matcher(ocl).replaceAll("_'$1'");
				
				content += "  -- " + title + "\n";
				content += "  -- " + title + "\n";
				content += "  inv " + id + " ('" + description.replaceAll("\\'", "\\\\\\'") + "' + self.toString()):\n";
				content += "  inv " + id + " ('" + description.replaceAll("\\'", "\\\\\\'") + "' + self.toString()):\n";
				content += "    " + ocl + "\n";
				content += "    " + ocl + "\n";