From b994096b0c39233826a8bd1182b344e413da27e2 Mon Sep 17 00:00:00 2001
From: Mirco Nasuti <mirco.nasuti@chuv.ch>
Date: Wed, 13 Jan 2016 16:34:59 +0100
Subject: [PATCH] add variables from JSON and serve it (a bug seems to be
 remaining)

---
 src/main/java/org/hbp/mip/data/Database.java  | 88 ++++++++++++++-----
 src/main/java/org/hbp/mip/model/Article.java  |  2 +-
 src/main/java/org/hbp/mip/model/Variable.java |  4 +-
 3 files changed, 70 insertions(+), 24 deletions(-)

diff --git a/src/main/java/org/hbp/mip/data/Database.java b/src/main/java/org/hbp/mip/data/Database.java
index 3942c9cbe..897941873 100644
--- a/src/main/java/org/hbp/mip/data/Database.java
+++ b/src/main/java/org/hbp/mip/data/Database.java
@@ -1,13 +1,19 @@
 package org.hbp.mip.data;
 
 import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
 import org.hbp.mip.controllers.HibernateUtil;
 import org.hbp.mip.model.Group;
+import org.hbp.mip.model.Value;
+import org.hbp.mip.model.Variable;
 import org.hibernate.Session;
 
-import java.io.*;
+import java.io.IOException;
+import java.lang.reflect.Type;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * Created by mirco on 11.01.16.
@@ -19,17 +25,9 @@ public class Database {
 
     public static void loadGroups() {
         // Read data from file
-        String inputFile = GROUPS_SRC;
-        File f = new File(inputFile);
-        FileReader fr;
-        BufferedReader br;
         String data = "";
         try {
-            fr = new FileReader(f);
-            br = new BufferedReader(fr);
             data = new String(Files.readAllBytes(Paths.get(GROUPS_SRC)));
-            br.close();
-            fr.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
@@ -46,22 +44,70 @@ public class Database {
     }
 
     public static void loadVariables() {
+        // Read data from file
+        String data = "";
+        try {
+            data = new String(Files.readAllBytes(Paths.get(VARIABLES_SRC)));
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
 
-        String inputFile = VARIABLES_SRC;
+        // Parse JSON
+        Gson gson = new Gson();
+        Type listVariablesType = new TypeToken<LinkedList<Variable>>(){}.getType();
+        List<Variable> variables = gson.fromJson(data, listVariablesType);
 
-        File f = new File(inputFile);
-        FileReader fr;
-        BufferedReader br;
+        // Sync groups and values with DB
+        for(Variable v : variables)
+        {
+            Group g = v.getGroup();
+            if(g != null)
+            {
+                v.setGroup(readGroupFromDB(g.getCode()));
+            }
+            List<Value> newValues = new LinkedList<>();
+            for(Value val : v.getValues())
+            {
+                Value existingVal = readValueFromDB(val.getCode());
+                if(existingVal == null)
+                {
+                    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+                    session.beginTransaction();
+                    session.save(val);
+                    session.getTransaction().commit();
+                    existingVal = val;
+                }
+                newValues.add(existingVal);
+            }
+            v.setValues(newValues);
+        }
 
-        try {
-            fr = new FileReader(f);
-            br = new BufferedReader(fr);
+        // Insert into DB
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        variables.forEach(session::save);
+        session.getTransaction().commit();
+    }
 
-            br.close();
-            fr.close();
+    private static Group readGroupFromDB(String code)
+    {
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        org.hibernate.Query query = session.createQuery("from Group where code= :code");
+        query.setString("code", code);
+        Group group = (Group) query.uniqueResult();
+        session.getTransaction().commit();
+        return group;
+    }
 
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+    private static Value readValueFromDB(String code)
+    {
+        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
+        session.beginTransaction();
+        org.hibernate.Query query = session.createQuery("from Value where code= :code");
+        query.setString("code", code);
+        Value value = (Value) query.uniqueResult();
+        session.getTransaction().commit();
+        return value;
     }
 }
diff --git a/src/main/java/org/hbp/mip/model/Article.java b/src/main/java/org/hbp/mip/model/Article.java
index 49b8bb3bf..155623970 100644
--- a/src/main/java/org/hbp/mip/model/Article.java
+++ b/src/main/java/org/hbp/mip/model/Article.java
@@ -37,7 +37,7 @@ public class Article {
     private User createdBy = null;
     @ManyToOne
     private User updatedBy = null;
-    @ManyToMany(fetch = FetchType.EAGER)
+    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
     private List<Tag> tags = new LinkedList<Tag>();
 
     public Article() {
diff --git a/src/main/java/org/hbp/mip/model/Variable.java b/src/main/java/org/hbp/mip/model/Variable.java
index 267bedbcd..08c8d97ff 100644
--- a/src/main/java/org/hbp/mip/model/Variable.java
+++ b/src/main/java/org/hbp/mip/model/Variable.java
@@ -22,7 +22,7 @@ public class Variable {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id = null;
-    @ManyToOne
+    @ManyToOne(fetch = FetchType.EAGER)
     private Group group = null;
     @Column(unique = true)
     private String code = null;
@@ -32,7 +32,7 @@ public class Variable {
     private Boolean isVariable = null;
     private Boolean isGrouping = null;
     private Boolean isFilter = null;
-    @ManyToMany
+    @ManyToMany(fetch = FetchType.EAGER)
     private List<Value> values = new LinkedList<Value>();
 
     public Variable() {
-- 
GitLab