diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/ISubmission.java index 69c29758cdb69cd0c01af400dcbf6d121dacfbfb..f842d48f0bab046de40f116fc91c78d4c34b1ca1 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 bf59d08bd86819ed464d5bdc273313e67963ad38..2bfb87ad675edc236b3793162c5ef447c3c87b98 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 7d2bf0d9a3e92abd225521114b79973c418bde30..de03fa1aae7c3848da77f13bebbe6dae028efb32 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 0000000000000000000000000000000000000000..7448d70ab6c9704057c71b257482bf904c74ee0a --- /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 f85efffd4f09035517c311e83425303b18592a38..07ac839bb6ca8927c00e5b766d05e1f4a50e6763 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 06685e3dee158acc60210e1c2e51d585f5e84f16..2b3319e7c05b522eb2f7fd1f191a630d5655667b 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 9dcd1fd8167876295c73e8822bb355e47ef264a9..56bc502dc7e272b8d4c1cfaa2de564e01f1bb48c 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 654bcf454e1c53720357c7f1db5f4b5eac099bcf..eaca2fefffcb45baa1f5dc63a994ef96508520b4 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;