From 3abd9f42dec54a98562a6ac1281d8389ee2a3d22 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 25 Nov 2019 10:57:28 +0100
Subject: [PATCH] main file for version 0.1

---
 build.gradle                                  |  6 +-
 .../java/de/tudresden/inf/st/e2j/Main.java    | 95 ++++++++++++++++++-
 2 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/build.gradle b/build.gradle
index 5baa6a6..cac319c 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,5 @@
 group 'de.tudresden.inf.st'
-version '1.0-SNAPSHOT'
+version '0.1'
 
 apply plugin: 'java'
 apply plugin: 'application'
@@ -65,6 +65,10 @@ jar {
                 'Main-Class': 'de.tudresden.inf.st.e2j.Main'
         )
     }
+
+    from {
+        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
+    }
 }
 
 task preprocess(type: JavaExec) {
diff --git a/src/main/java/de/tudresden/inf/st/e2j/Main.java b/src/main/java/de/tudresden/inf/st/e2j/Main.java
index a85a68f..11bdb72 100644
--- a/src/main/java/de/tudresden/inf/st/e2j/Main.java
+++ b/src/main/java/de/tudresden/inf/st/e2j/Main.java
@@ -1,9 +1,102 @@
 package de.tudresden.inf.st.e2j;
 
+import de.tudresden.inf.st.e2j.jastadd.model.EObject;
+import de.tudresden.inf.st.e2j.jastadd.model.EPackage;
+import de.tudresden.inf.st.e2j.jastadd.model.Grammar;
+import de.tudresden.inf.st.e2j.parser.EcoreParser;
+import de.tudresden.inf.st.e2j.parser.XMIParseException;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
 public class Main {
 
+  private static final String VERSION = "0.1";
+
   public static void main(String[] args) {
-    System.out.println("Hello, world!");
+
+    if (args.length != 2) {
+      printUsage();
+    } else {
+      transformFile(args[0], args[1]);
+    }
+
+  }
+
+  private static void transformFile(String sourceFileName, String targetFileName) {
+
+    List<EObject> ePackages = null;
+
+    EcoreParser parser = new EcoreParser();
+
+    // check if the input file exists
+    Path sourcePath = Paths.get(sourceFileName);
+    if (Files.notExists(sourcePath)) {
+      exitWithError("the source file does not exist.");
+    }
+    Path targetPath = Paths.get(targetFileName);
+    if (Files.exists(targetPath)) {
+      exitWithError("the target file already exists.");
+    }
+
+    try (InputStream stream = Files.newInputStream(sourcePath)) {
+      ePackages = parser.parse(stream);
+    } catch (IOException e) {
+      exitWithError("Unable to open or read source file.");
+    } catch(XMIParseException e) {
+      exitWithError("Parse error occurred: " + e.getMessage());
+    }
+
+    if (ePackages == null || ePackages.size() == 0) {
+      exitWithError("No ecore packages were parsed.");
+    }
+
+    StringBuilder b = new StringBuilder();
+
+    for (EObject eObject : ePackages) {
+      if (!(eObject instanceof EPackage)) {
+        exitWithError("One of the parsed top-level objects is no EPackage.");
+      }
+
+      EPackage ePackage = ((EPackage) eObject);
+
+      try {
+        Grammar grammar = ePackage.getGrammar();
+        grammar.print(b);
+      } catch (Exception e) {
+        exitWithError("Unable to transform Ecore package " + ePackage.getName() + " to grammar.");
+      }
+      b.append("\n\n");
+    }
+
+    if (!targetFileName.endsWith(".relast")) {
+      targetFileName += ".relast";
+    }
+
+    try (PrintWriter out = new PrintWriter(targetFileName, StandardCharsets.UTF_8.name())) {
+      out.print(b.toString());
+    } catch (FileNotFoundException | UnsupportedEncodingException e) {
+      exitWithError("Unable to write relast file");
+    }
+  }
+
+  private static void exitWithError(String message) {
+    System.err.println("ERROR: " + message);
+    System.err.println("exiting...");
+    System.exit(-1);
+  }
+
+  private static void printUsage() {
+    System.out.println("Ecore2Relast version " + VERSION + ": generate a relational JastAdd grammar from an ecore model");
+    System.out.println("Attention: this is a very early version that might contain bugs. please review the generated grammars.");
+    System.out.println("Limitations: Only essential structural parts of ecore models are transformed. Multiple inheritance is not supported.");
+    System.out.println("Usage:");
+    System.out.println("  -h, --help                    print this message");
+    System.out.println("  <input.ecore> <output.relast> transform the input ecore model into an equivalent grammar with the given name");
   }
 
 }
-- 
GitLab