From d692a8c405fdc137cc020cc11c1d129020a0ad68 Mon Sep 17 00:00:00 2001
From: Jonas Blatt <jonasblatt@uni-koblenz.de>
Date: Sun, 20 Oct 2019 12:45:03 +0200
Subject: [PATCH] SessionScoped dmn table handling in frontend (refresh of page
 did not kill die current dmn)

---
 .../fgbks/dmn/frontend/DmnBean.java           | 18 ++++++
 .../fgbks/dmn/frontend/DmnSessionApi.java     | 34 ++++++++++
 .../META-INF/resources/js/dmnUpDownload.js    | 64 +++++++++++++++----
 .../META-INF/resources/js/dmnVerifier.js      |  2 +-
 .../META-INF/resources/js/dmnViewer.js        | 12 ++--
 5 files changed, 114 insertions(+), 16 deletions(-)
 create mode 100644 dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnBean.java
 create mode 100644 dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnSessionApi.java

diff --git a/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnBean.java b/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnBean.java
new file mode 100644
index 00000000..beb00ab8
--- /dev/null
+++ b/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnBean.java
@@ -0,0 +1,18 @@
+package de.unikoblenz.fgbks.dmn.frontend;
+
+import java.io.Serializable;
+import javax.enterprise.context.SessionScoped;
+
+@SessionScoped
+public class DmnBean implements Serializable {
+
+  protected String dmnXml;
+
+  public String getDmnXml() {
+    return dmnXml;
+  }
+
+  public void setDmnXml(String dmnXml) {
+    this.dmnXml = dmnXml;
+  }
+}
diff --git a/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnSessionApi.java b/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnSessionApi.java
new file mode 100644
index 00000000..3b316f58
--- /dev/null
+++ b/dmnverifierfrontend/src/main/java/de/unikoblenz/fgbks/dmn/frontend/DmnSessionApi.java
@@ -0,0 +1,34 @@
+package de.unikoblenz.fgbks.dmn.frontend;
+
+import javax.inject.Inject;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+@Path("/dmn")
+public class DmnSessionApi {
+
+  @Inject
+  DmnBean dmnBean;
+
+  @GET
+  @Path("/getdmn")
+  @Produces(MediaType.TEXT_XML)
+  public Response getSessionDmn() {
+    if (dmnBean.getDmnXml() == null) {
+      return Response.noContent().build();
+    }
+    return Response.ok(dmnBean.getDmnXml()).build();
+  }
+
+  @POST
+  @Path("/setdmn")
+  @Consumes(MediaType.TEXT_XML)
+  public void setSessionDmn(String dmnXml) {
+    dmnBean.setDmnXml(dmnXml);
+  }
+}
diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js
index 9bc2b55d..83295f03 100644
--- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js
+++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnUpDownload.js
@@ -1,7 +1,9 @@
-document.addEventListener("DOMContentLoaded", function () {
+$(document).ready(function () {
   $('#dmn-file-upload').on('change', loadDmnFromFile);
   $('#dmn-file-empty').on('click', loadEmptyFile);
-  $('#dmn-file-download').on('click', exportDiagram);
+  $('#dmn-file-download').on('click', download);
+  // try to load dmn from session
+  loadSessionDmn();
 });
 
 function loadDmnFromFile(evt) {
@@ -26,13 +28,53 @@ function loadEmptyFile() {
   });
 }
 
-function download(filename, dmnXml) {
-  let el = document.createElement('a');
-  el.setAttribute('href',
-      'data:text/xml;charset=utf-8,' + encodeURIComponent(dmnXml));
-  el.setAttribute('download', filename);
-  el.style.display = 'none';
-  document.body.appendChild(el);
-  el.click();
-  document.body.removeChild(el);
+function download() {
+  let dmnXml = exportDiagram();
+  console.log("xxx:" + dmnXml);
+  if (dmnXml !== undefined) {
+    let el = document.createElement('a');
+    el.setAttribute('href',
+        'data:text/xml;charset=utf-8,' + dmnXml);
+    el.setAttribute('download', "dmnTable.dmn");
+    el.style.display = 'none';
+    document.body.appendChild(el);
+    el.click();
+    document.body.removeChild(el);
+  }
+}
+
+let oSerializer = new XMLSerializer();
+
+function loadSessionDmn() {
+  $.ajax({
+    timeout: 1000,
+    url: "/dmn/getdmn",
+    type: 'GET',
+    contentType: 'text/xml',
+    error: function (err) {
+      // nothing
+      console.log(">-->--> loading session dmn failed. <--<--<");
+      // loading empty dmn
+      loadEmptyFile();
+    },
+    success: function (data) {
+      let sXML = oSerializer.serializeToString(data);
+      openDiagram(sXML);
+    }
+  });
+}
+
+function saveSessionDmn() {
+  let dmnXml = exportDiagram();
+  $.ajax({
+    timeout: 1000,
+    url: "/dmn/setdmn",
+    type: 'POST',
+    contentType: 'text/xml',
+    data: dmnXml,
+    error: function (err) {
+      // nothing
+      console.log(">-->--> saving session dmn failed. <--<--<");
+    }
+  });
 }
diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js
index 691014e0..bc7c9ac8 100644
--- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js
+++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnVerifier.js
@@ -47,7 +47,6 @@ function loadAvailableTypes() {
     timeout: 1000,
     url: dmnApi + 'verification/types',
     type: 'GET',
-    contentType: 'text/xml',
     error: function (err) {
       inactiveBackend = true;
       handleStatus();
@@ -117,6 +116,7 @@ function cleanDmnVerifierRoot() {
 
 function checkVerifications() {
   cleanDmnVerifierRoot();
+  saveSessionDmn();
   getVerifications();
 }
 
diff --git a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js
index 19788d5e..d5037a82 100644
--- a/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js
+++ b/dmnverifierfrontend/src/main/resources/META-INF/resources/js/dmnViewer.js
@@ -28,6 +28,8 @@ let dmnModeler = new DmnJS({
 });
 
 dmnModeler.on('views.changed', function (event) {
+  // save dmn in Session
+  saveSessionDmn();
   var {views, activeView} = event;
   // clear tabs
   $tabs.empty();
@@ -48,14 +50,16 @@ dmnModeler.on('views.changed', function (event) {
  * Save diagram contents and print them to the console.
  */
 function exportDiagram() {
-  dmnModeler.saveXML({format: true}, function (err, xml) {
+  let retXml = undefined;
+  dmnModeler.saveXML({format: false}, function (err, xml) {
     if (err) {
-      return console.log('could not save DMN 1.1 diagram');
+      console.log('could not export DMN 1.1 diagram');
     } else {
-      console.log('saving dmn..');
+      console.log('exporting DMN 1.1 diagram..');
+      retXml = xml;
     }
-    download("dmnTable.dmn", xml);
   });
+  return retXml;
 }
 
 /**
-- 
GitLab