From 4ebbc932e137a0d5aa5437a68f519e650d0b0ecd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sven=20K=C3=A4stle?= <sven.kaestle@gmx.de>
Date: Tue, 14 Aug 2018 11:19:02 +0200
Subject: [PATCH] feat: Alter submission parts to use array as body

---
 .../unipotsdam/gf/interfaces/ISubmission.java |  10 ++
 .../controller/SubmissionController.java      | 121 ++++++++++++++++--
 .../submission/model/SubmissionPart.java      |  28 ++--
 .../model/SubmissionPartBodyElement.java      |  57 +++++++++
 .../model/SubmissionPartPostRequest.java      |  28 ++--
 .../submission/view/SubmissionService.java    |  23 +++-
 .../main/webapp/assets/js/unstructuredRest.js |  24 ++++
 .../src/scripts/dbschema/fltrail.sql          |   9 +-
 8 files changed, 262 insertions(+), 38 deletions(-)
 create mode 100644 gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartBodyElement.java

diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
index 69c29758..f842d48f 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java
@@ -5,6 +5,8 @@ import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
 import unipotsdam.gf.modules.submission.model.SubmissionPart;
 import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
 
+import java.util.ArrayList;
+
 /**
  * @author Sven Kästle
  * skaestle@uni-potsdam.de
@@ -51,6 +53,14 @@ public interface ISubmission {
      */
     SubmissionPart getSubmissionPart(String submissionPartId);
 
+    /**
+     * Get all submission parts based on an id
+     *
+     * @param fullSubmissionId The id of a full submission
+     * @return An ArrayList holding the submission parts
+     */
+    ArrayList<SubmissionPart> getAllSubmissionParts(String fullSubmissionId);
+
     /**
      * Checks if a submission part id already exists in the database
      *
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
index bf59d08b..2bfb87ad 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/controller/SubmissionController.java
@@ -1,14 +1,14 @@
 package unipotsdam.gf.modules.submission.controller;
 
+import com.google.common.base.Strings;
 import unipotsdam.gf.core.database.mysql.MysqlConnect;
 import unipotsdam.gf.core.database.mysql.VereinfachtesResultSet;
 import unipotsdam.gf.interfaces.ISubmission;
 import unipotsdam.gf.modules.peer2peerfeedback.Category;
-import unipotsdam.gf.modules.submission.model.FullSubmission;
-import unipotsdam.gf.modules.submission.model.FullSubmissionPostRequest;
-import unipotsdam.gf.modules.submission.model.SubmissionPart;
-import unipotsdam.gf.modules.submission.model.SubmissionPartPostRequest;
+import unipotsdam.gf.modules.submission.model.*;
 
+import java.sql.PreparedStatement;
+import java.util.ArrayList;
 import java.util.UUID;
 
 /**
@@ -119,8 +119,14 @@ public class SubmissionController implements ISubmission {
         connection.connect();
 
         // build and execute request
-        String request = "INSERT INTO submissionparts (`id`, `userId`, `fullSubmissionId`, `text`, `category`) VALUES (?,?,?,?,?);";
-        connection.issueInsertOrDeleteStatement(request, uuid, submissionPartPostRequest.getUserId(), submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getText(), submissionPartPostRequest.getCategory().toString());
+        String request = "INSERT INTO submissionparts (`id`, `userId`, `fullSubmissionId`, `category`) VALUES (?,?,?,?);";
+        connection.issueInsertOrDeleteStatement(request, uuid, submissionPartPostRequest.getUserId(), submissionPartPostRequest.getFullSubmissionId(), submissionPartPostRequest.getCategory().toString());
+
+        // build and execute body requests
+        String requestElement = "INSERT INTO submissionpartbodyelements (`submissionPartId`, `text`, `startCharacter`, `endCharacter`) VALUES (?,?,?,?)";
+        for (SubmissionPartBodyElement element : submissionPartPostRequest.getBody()) {
+            connection.issueInsertOrDeleteStatement(requestElement, uuid, element.getText(), element.getStartCharacter(), element.getEndCharacter());
+        }
 
         // get the new submission from database
         SubmissionPart submissionPart = getSubmissionPart(uuid);
@@ -140,12 +146,12 @@ public class SubmissionController implements ISubmission {
         connection.connect();
 
         // build and execute request
-        String request = "SELECT * FROM submissionparts WHERE id = ?;";
+        String request = "SELECT * FROM submissionparts LEFT JOIN submissionpartbodyelements ON id = submissionPartId WHERE id = ?;";
         VereinfachtesResultSet rs = connection.issueSelectStatement(request, submissionPartId);
 
         if (rs.next()) {
             // save submission
-            SubmissionPart submissionPart = getSubmissionPartFromResultSelt(rs);
+            SubmissionPart submissionPart = getSubmissionPartFromResultSet(rs);
 
             // close connection
             connection.close();
@@ -161,6 +167,36 @@ public class SubmissionController implements ISubmission {
 
     }
 
+    @Override
+    public ArrayList<SubmissionPart> getAllSubmissionParts(String fullSubmissionId) {
+
+        // establish connection
+        MysqlConnect connection = new MysqlConnect();
+        connection.connect();
+
+        // build and execute request
+        String request = "SELECT * " +
+                "FROM submissionparts " +
+                "LEFT JOIN submissionpartbodyelements " +
+                "ON id = submissionPartId " +
+                "WHERE fullSubmissionId = ? " +
+                "ORDER BY id;";
+        VereinfachtesResultSet rs = connection.issueSelectStatement(request, fullSubmissionId);
+
+        ArrayList<SubmissionPart> submissionParts = new ArrayList<>();
+
+        if (rs.next()) {
+            // save submission
+            submissionParts = getAllSubmissionPartsFromResultSet(rs);
+        }
+
+        // close connection
+        connection.close();
+
+        return submissionParts;
+
+    }
+
     @Override
     public boolean existsSubmissionPartId(String submissionPartId) {
 
@@ -216,15 +252,78 @@ public class SubmissionController implements ISubmission {
      * @param rs The result set from the database query
      * @return A new submission part object
      */
-    private SubmissionPart getSubmissionPartFromResultSelt(VereinfachtesResultSet rs) {
+    private SubmissionPart getSubmissionPartFromResultSet(VereinfachtesResultSet rs) {
 
         String id = rs.getString("id");
         long timestamp = rs.getTimestamp("timestamp").getTime();
         String userId = rs.getString("userId");
         String fullSubmissionId = rs.getString("fullSubmissionId");
-        String text = rs.getString("text");
         Category category = Category.valueOf(rs.getString("category").toUpperCase());
 
-        return new SubmissionPart(id, timestamp, userId, fullSubmissionId, text, category);
+        // build body and iterate over result set
+        ArrayList<SubmissionPartBodyElement> body = new ArrayList<>();
+
+        do {
+            // only add it if the element is not empty
+            if (!Strings.isNullOrEmpty(rs.getString("submissionPartId"))) {
+                SubmissionPartBodyElement element = new SubmissionPartBodyElement(
+                        rs.getString("text"),
+                        rs.getInt("startCharacter"),
+                        rs.getInt("endCharacter"));
+
+                body.add(element);
+            }
+        } while (rs.next());
+
+        return new SubmissionPart(id, timestamp, userId, fullSubmissionId, category, body);
     }
+
+    private ArrayList<SubmissionPart> getAllSubmissionPartsFromResultSet(VereinfachtesResultSet rs) {
+
+        ArrayList<SubmissionPart> submissionParts = new ArrayList<>();
+        // tmp part
+        SubmissionPart tmpPart = null;
+        // tmp body element
+        SubmissionPartBodyElement tmpElement;
+        // tmp category
+        String tmpCategory = "";
+        do {
+
+            if (!tmpCategory.equals(rs.getString("category").toUpperCase())) {
+                // current tmp category
+                tmpCategory = rs.getString("category").toUpperCase();
+
+                // add last submission part
+                if (tmpPart != null) {
+                    submissionParts.add(tmpPart);
+                }
+
+                // build submission part with empty body
+                tmpPart = new SubmissionPart(
+                    rs.getString("id"),
+                    rs.getTimestamp("timestamp").getTime(),
+                    rs.getString("userId"),
+                    rs.getString("fullSubmissionId"),
+                    Category.valueOf(tmpCategory),
+                    new ArrayList<SubmissionPartBodyElement>()
+                );
+            }
+
+            tmpElement = new SubmissionPartBodyElement(
+                    rs.getString("text"),
+                    rs.getInt("startCharacter"),
+                    rs.getInt("endCharacter")
+            );
+
+            tmpPart.getBody().add(tmpElement);
+
+        } while (rs.next());
+
+        // add last part
+        submissionParts.add(tmpPart);
+
+        System.out.println(submissionParts.toString());
+        return submissionParts;
+    }
+
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPart.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPart.java
index 7d2bf0d9..de03fa1a 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPart.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPart.java
@@ -2,27 +2,30 @@ package unipotsdam.gf.modules.submission.model;
 
 import unipotsdam.gf.modules.peer2peerfeedback.Category;
 
+import java.util.ArrayList;
+
 /**
  * @author Sven Kästle
  * skaestle@uni-potsdam.de
  */
 public class SubmissionPart {
+
     // variables
     private String id;
     private long timestamp;
     private String userId;
     private String fullSubmissionId;
-    private String text;
     private Category category;
+    private ArrayList<SubmissionPartBodyElement> body;
 
     // constructor
-    public SubmissionPart(String id, long timestamp, String userId, String fullSubmissionId, String text, Category category) {
+    public SubmissionPart(String id, long timestamp, String userId, String fullSubmissionId, Category category, ArrayList<SubmissionPartBodyElement> body) {
         this.id = id;
         this.timestamp = timestamp;
         this.userId = userId;
         this.fullSubmissionId = fullSubmissionId;
-        this.text = text;
         this.category = category;
+        this.body = body;
     }
 
     public SubmissionPart(){}
@@ -60,14 +63,6 @@ public class SubmissionPart {
         this.fullSubmissionId = fullSubmissionId;
     }
 
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
     public Category getCategory() {
         return category;
     }
@@ -76,6 +71,14 @@ public class SubmissionPart {
         this.category = category;
     }
 
+    public ArrayList<SubmissionPartBodyElement> getBody() {
+        return body;
+    }
+
+    public void setBody(ArrayList<SubmissionPartBodyElement> body) {
+        this.body = body;
+    }
+
     @Override
     public String toString() {
         return "SubmissionPart{" +
@@ -83,8 +86,9 @@ public class SubmissionPart {
                 ", timestamp=" + timestamp +
                 ", userId='" + userId + '\'' +
                 ", fullSubmissionId='" + fullSubmissionId + '\'' +
-                ", text='" + text + '\'' +
                 ", category=" + category +
+                ", body=" + body +
                 '}';
     }
+
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartBodyElement.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartBodyElement.java
new file mode 100644
index 00000000..7448d70a
--- /dev/null
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartBodyElement.java
@@ -0,0 +1,57 @@
+package unipotsdam.gf.modules.submission.model;
+
+/**
+ * @author Sven Kästle
+ * skaestle@uni-potsdam.de
+ */
+public class SubmissionPartBodyElement {
+
+    // variables
+    private String text;
+    private int startCharacter;
+    private int endCharacter;
+
+    // constructors
+    public SubmissionPartBodyElement(String text, int startCharacter, int endCharacter) {
+        this.text = text;
+        this.startCharacter = startCharacter;
+        this.endCharacter = endCharacter;
+    }
+
+    public SubmissionPartBodyElement() {}
+
+    // methods
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public int getStartCharacter() {
+        return startCharacter;
+    }
+
+    public void setStartCharacter(int startCharacter) {
+        this.startCharacter = startCharacter;
+    }
+
+    public int getEndCharacter() {
+        return endCharacter;
+    }
+
+    public void setEndCharacter(int endCharacter) {
+        this.endCharacter = endCharacter;
+    }
+
+    @Override
+    public String toString() {
+        return "SubmissionPartBodyElement{" +
+                ", text='" + text + '\'' +
+                ", startCharacter=" + startCharacter +
+                ", endCharacter=" + endCharacter +
+                '}';
+    }
+
+}
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartPostRequest.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartPostRequest.java
index f85efffd..07ac839b 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartPostRequest.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/model/SubmissionPartPostRequest.java
@@ -2,23 +2,26 @@ package unipotsdam.gf.modules.submission.model;
 
 import unipotsdam.gf.modules.peer2peerfeedback.Category;
 
+import java.util.ArrayList;
+
 /**
  * @author Sven Kästle
  * skaestle@uni-potsdam.de
  */
 public class SubmissionPartPostRequest {
+
     // variables
     private String userId;
     private String fullSubmissionId;
-    private String text;
     private Category category;
+    private ArrayList<SubmissionPartBodyElement> body;
 
     // constructors
-    public SubmissionPartPostRequest(String userId, String fullSubmissionId, String text, Category category) {
+    public SubmissionPartPostRequest(String userId, String fullSubmissionId, Category category, ArrayList<SubmissionPartBodyElement> body) {
         this.userId = userId;
         this.fullSubmissionId = fullSubmissionId;
-        this.text = text;
         this.category = category;
+        this.body = body;
     }
 
     public SubmissionPartPostRequest(){}
@@ -40,14 +43,6 @@ public class SubmissionPartPostRequest {
         this.fullSubmissionId = fullSubmissionId;
     }
 
-    public String getText() {
-        return text;
-    }
-
-    public void setText(String text) {
-        this.text = text;
-    }
-
     public Category getCategory() {
         return category;
     }
@@ -56,13 +51,22 @@ public class SubmissionPartPostRequest {
         this.category = category;
     }
 
+    public ArrayList<SubmissionPartBodyElement> getBody() {
+        return body;
+    }
+
+    public void setBody(ArrayList<SubmissionPartBodyElement> body) {
+        this.body = body;
+    }
+
     @Override
     public String toString() {
         return "SubmissionPartPostRequest{" +
                 "userId='" + userId + '\'' +
                 ", fullSubmissionId='" + fullSubmissionId + '\'' +
-                ", text='" + text + '\'' +
                 ", category=" + category +
+                ", body=" + body +
                 '}';
     }
+
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
index 06685e3d..2b3319e7 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/submission/view/SubmissionService.java
@@ -6,6 +6,7 @@ import unipotsdam.gf.modules.submission.model.*;
 import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.ArrayList;
 
 /**
  * @author Sven Kästle
@@ -65,13 +66,31 @@ public class SubmissionService {
         SubmissionController controller = new SubmissionController();
         SubmissionPart submissionPart = controller.getSubmissionPart(submissionPartId);
 
-        if(submissionPart != null) {
+        if (submissionPart != null) {
             return  Response.ok(submissionPart).build();
         }
         else {
             // declare response
             SubmissionResponse response = new SubmissionResponse();
-            response.setMessage("Submission with the id '" + submissionPartId + "' can't be found");
+            response.setMessage("Submission part with the id '" + submissionPartId + "' can't be found");
+
+            return Response.status(Response.Status.NOT_FOUND).entity(response).build();
+        }
+    }
+
+    @GET
+    @Path("/full/{id}/parts")
+    public Response getAllSubmissionParts(@PathParam("id") String fullSubmissionId) {
+        // get submission parts from database based by id
+        SubmissionController controller = new SubmissionController();
+        ArrayList<SubmissionPart> parts = controller.getAllSubmissionParts(fullSubmissionId);
+
+        if (parts.size() > 0) {
+            return Response.ok(parts).build();
+        }
+        else {
+            SubmissionResponse response = new SubmissionResponse();
+            response.setMessage("No submission parts found for submission with the id '" + fullSubmissionId + "'");
 
             return Response.status(Response.Status.NOT_FOUND).entity(response).build();
         }
diff --git a/gemeinsamforschen/src/main/webapp/assets/js/unstructuredRest.js b/gemeinsamforschen/src/main/webapp/assets/js/unstructuredRest.js
index 9dcd1fd8..56bc502d 100644
--- a/gemeinsamforschen/src/main/webapp/assets/js/unstructuredRest.js
+++ b/gemeinsamforschen/src/main/webapp/assets/js/unstructuredRest.js
@@ -86,4 +86,28 @@ function getSubmissionPart(id, responseHandler, errorHandler) {
             errorHandler();
         }
     })
+}
+
+/**
+ * GET: Get all submission parts for a given full submission id
+ *
+ * @param id The id of the full submission
+ * @param responseHandler The response handler
+ * @param errorHandler The error handler
+ */
+function getAllSubmissionParts(id, responseHandler, errorHandler) {
+    var url = "../rest/submissions/full/" + id + "/parts";
+    $.ajax({
+        url: url,
+        type: "GET",
+        dataType: "json",
+        success: function (response) {
+            // handle the response
+            responseHandler(response);
+        },
+        error: function () {
+            // handle the error
+            errorHandler();
+        }
+    })
 }
\ No newline at end of file
diff --git a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
index 654bcf45..eaca2fef 100644
--- a/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
+++ b/gemeinsamforschen/src/scripts/dbschema/fltrail.sql
@@ -134,11 +134,18 @@ CREATE TABLE if not exists `submissionparts` (
   `timestamp` TIMESTAMP on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `userId` VARCHAR(120) NOT NULL,
   `fullSubmissionId` VARCHAR(120) NOT NULL,
-  `text` MEDIUMTEXT NOT NULL,
   `category` VARCHAR(30) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE = InnoDB DEFAULT CHARSET=utf8;
 
+CREATE TABLE if not exists `submissionpartbodyelements` (
+  `submissionPartId` VARCHAR(120) NOT NULL,
+  `text` MEDIUMTEXT NOT NULL,
+  `startCharacter` int(11) NOT NULL,
+  `endCharacter` int(11) NOT NULL,
+  PRIMARY KEY (`submissionPartId`, `startCharacter`, `endCharacter`)
+) ENGINE = InnoDB DEFAULT CHARSET=utf8;
+
 alter table users
 
   add isStudent tinyint(1) default '1' null;
-- 
GitLab