From 284a41c4de4585eae4be7782e0754cc7657d54bb Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Tue, 29 Aug 2017 14:10:04 +0200 Subject: [PATCH] Refactor API/entities for contents and answers --- .../arsnova/controller/ContentController.java | 4 +- .../java/de/thm/arsnova/entities/Answer.java | 343 +------ .../de/thm/arsnova/entities/ChoiceAnswer.java | 21 + .../entities/ChoiceQuestionContent.java | 69 ++ .../java/de/thm/arsnova/entities/Content.java | 850 +---------------- .../de/thm/arsnova/entities/TextAnswer.java | 29 + .../entities/migration/V2Migrator.java | 79 ++ .../arsnova/entities/migration/v2/Answer.java | 362 +++++++ .../v2/AnswerOption.java} | 6 +- .../entities/migration/v2/Content.java | 883 ++++++++++++++++++ .../CouchDbTypeFieldConverter.java | 4 +- .../transport/AnswerQueueElement.java | 4 +- .../transport/ImportExportSession.java | 4 +- .../thm/arsnova/events/DeleteAnswerEvent.java | 2 +- .../arsnova/events/DeleteQuestionEvent.java | 2 +- .../thm/arsnova/events/LockQuestionEvent.java | 2 +- .../arsnova/events/LockQuestionsEvent.java | 2 +- .../de/thm/arsnova/events/LockVoteEvent.java | 2 +- .../de/thm/arsnova/events/LockVotesEvent.java | 2 +- .../de/thm/arsnova/events/NewAnswerEvent.java | 4 +- .../thm/arsnova/events/NewQuestionEvent.java | 2 +- .../arsnova/events/PiRoundCancelEvent.java | 2 +- .../events/PiRoundDelayedStartEvent.java | 2 +- .../thm/arsnova/events/PiRoundEndEvent.java | 2 +- .../thm/arsnova/events/PiRoundResetEvent.java | 2 +- .../arsnova/events/UnlockQuestionEvent.java | 2 +- .../arsnova/events/UnlockQuestionsEvent.java | 2 +- .../thm/arsnova/events/UnlockVoteEvent.java | 2 +- .../thm/arsnova/events/UnlockVotesEvent.java | 2 +- .../arsnova/persistance/AnswerRepository.java | 2 +- .../persistance/ContentRepository.java | 2 +- .../couchdb/CouchDbAnswerRepository.java | 3 +- .../couchdb/CouchDbContentRepository.java | 2 +- .../ApplicationPermissionEvaluator.java | 2 +- .../thm/arsnova/services/ContentService.java | 4 +- .../arsnova/services/ContentServiceImpl.java | 4 +- .../java/de/thm/arsnova/util/ImageUtils.java | 2 +- .../websocket/ArsnovaSocketioServerImpl.java | 14 +- .../arsnova/websocket/message/Content.java | 2 +- .../de/thm/arsnova/entities/ContentTest.java | 33 +- 40 files changed, 1547 insertions(+), 1215 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java create mode 100644 src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java create mode 100644 src/main/java/de/thm/arsnova/entities/TextAnswer.java create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java rename src/main/java/de/thm/arsnova/entities/{PossibleAnswer.java => migration/v2/AnswerOption.java} (92%) create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Content.java diff --git a/src/main/java/de/thm/arsnova/controller/ContentController.java b/src/main/java/de/thm/arsnova/controller/ContentController.java index e2858bf40..848797f3d 100644 --- a/src/main/java/de/thm/arsnova/controller/ContentController.java +++ b/src/main/java/de/thm/arsnova/controller/ContentController.java @@ -18,8 +18,8 @@ package de.thm.arsnova.controller; import de.thm.arsnova.util.PaginationListDecorator; -import de.thm.arsnova.entities.Answer; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.exceptions.BadRequestException; import de.thm.arsnova.exceptions.ForbiddenException; import de.thm.arsnova.exceptions.NoContentException; diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index 50c9a795c..fc2fd9acb 100644 --- a/src/main/java/de/thm/arsnova/entities/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/Answer.java @@ -1,363 +1,44 @@ -/* - * This file is part of ARSnova Backend. - * Copyright (C) 2012-2018 The ARSnova Team and Contributors - * - * ARSnova Backend is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * ARSnova Backend is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ package de.thm.arsnova.entities; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.io.Serializable; - -/** - * Both a regular (single choice, evaluation, etc.) as well as a freetext answer. - * - * This class has additional fields to transport generated answer statistics. - */ -@ApiModel(value = "Answer", description = "the answer entity") -public class Answer implements Entity { +public abstract class Answer implements Entity { private String id; private String rev; - private String type; - private String sessionId; - private String questionId; - private String answerText; - private String answerTextRaw; - private String answerSubject; - private boolean successfulFreeTextAnswer; - private String questionVariant; - private int questionValue; - private int piRound; - private String user; - private long timestamp; - private boolean read; - private int answerCount = 1; - private boolean abstention; - private int abstentionCount; - @JsonIgnore - private String answerImage; - private String answerThumbnailImage; - - public Answer() { - this.type = "skill_question_answer"; - } + private String contentId; - @ApiModelProperty(required = true, value = "the couchDB ID") + @Override @JsonView({View.Persistence.class, View.Public.class}) public String getId() { return id; } + @Override @JsonView({View.Persistence.class, View.Public.class}) public void setId(final String id) { this.id = id; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setRevision(final String rev) { - this.rev = rev; - } - + @Override @JsonView({View.Persistence.class, View.Public.class}) public String getRevision() { return rev; } - @ApiModelProperty(required = true, value = "ID of the session, the answer is assigned to") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getSessionId() { - return sessionId; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setSessionId(final String sessionId) { - this.sessionId = sessionId; - } - - @ApiModelProperty(required = true, value = "used to display question id") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getQuestionId() { - return questionId; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setQuestionId(final String questionId) { - this.questionId = questionId; - } - - @ApiModelProperty(required = true, value = "the answer text") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getAnswerText() { - return answerText; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setAnswerText(final String answerText) { - this.answerText = answerText; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final String getAnswerTextRaw() { - return this.answerTextRaw; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setAnswerTextRaw(final String answerTextRaw) { - this.answerTextRaw = answerTextRaw; - } - - @ApiModelProperty(required = true, value = "the answer subject") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getAnswerSubject() { - return answerSubject; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setAnswerSubject(final String answerSubject) { - this.answerSubject = answerSubject; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final boolean isSuccessfulFreeTextAnswer() { - return this.successfulFreeTextAnswer; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setSuccessfulFreeTextAnswer(final boolean successfulFreeTextAnswer) { - this.successfulFreeTextAnswer = successfulFreeTextAnswer; - } - - @ApiModelProperty(required = true, value = "the peer instruction round nr.") - @JsonView({View.Persistence.class, View.Public.class}) - public int getPiRound() { - return piRound; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setPiRound(int piRound) { - this.piRound = piRound; - } - - @ApiModelProperty(required = true, value = "the user") - @JsonView(View.Persistence.class) - public final String getUser() { - return user; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setUser(final String user) { - this.user = user; - } - - @ApiModelProperty(required = true, value = "the answer image") - @JsonView(View.Persistence.class) - public String getAnswerImage() { - return answerImage; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setAnswerImage(String answerImage) { - this.answerImage = answerImage; - } - - @ApiModelProperty(required = true, value = "the answer thumbnail") - @JsonView({View.Persistence.class, View.Public.class}) - public String getAnswerThumbnailImage() { - return answerThumbnailImage; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setAnswerThumbnailImage(String answerThumbnailImage) { - this.answerThumbnailImage = answerThumbnailImage; - } - - @ApiModelProperty(required = true, value = "the creation date timestamp") - @JsonView({View.Persistence.class, View.Public.class}) - public long getTimestamp() { - return timestamp; - } - - @JsonView(View.Persistence.class) - public void setTimestamp(long timestamp) { - this.timestamp = timestamp; - } - - @ApiModelProperty(required = true, value = "displays whether the answer is read") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isRead() { - return read; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setRead(boolean read) { - this.read = read; - } - - @ApiModelProperty(required = true, value = "the number of answers given. used for statistics") - @JsonView(View.Public.class) - public final int getAnswerCount() { - return answerCount; - } - - public final void setAnswerCount(final int answerCount) { - this.answerCount = answerCount; - } - - @ApiModelProperty(required = true, value = "the abstention") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isAbstention() { - return abstention; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setAbstention(boolean abstention) { - this.abstention = abstention; - } - - @ApiModelProperty(required = true, value = "the number of abstentions given. used for statistics") - @JsonView(View.Public.class) - public int getAbstentionCount() { - return abstentionCount; - } - - public void setAbstentionCount(int abstentionCount) { - this.abstentionCount = abstentionCount; - } - - @ApiModelProperty(required = true, value = "either lecture or preparation") - @JsonView({View.Persistence.class, View.Public.class}) - public String getQuestionVariant() { - return questionVariant; - } - + @Override @JsonView({View.Persistence.class, View.Public.class}) - public void setQuestionVariant(String questionVariant) { - this.questionVariant = questionVariant; + public void setRevision(final String rev) { + this.rev = rev; } - @ApiModelProperty(required = true, value = "used to display question value") @JsonView({View.Persistence.class, View.Public.class}) - public int getQuestionValue() { - return questionValue; + public String getContentId() { + return contentId; } @JsonView({View.Persistence.class, View.Public.class}) - public void setQuestionValue(int questionValue) { - this.questionValue = questionValue; - } - - @Override - public final String toString() { - return "Answer type:'" + type + "'" - + ", session: " + sessionId - + ", question: " + questionId - + ", subject: " + answerSubject - + ", answerCount: " + answerCount - + ", answer: " + answerText - + ", user: " + user; - } - - @Override - public int hashCode() { - // auto generated! - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((rev == null) ? 0 : rev.hashCode()); - result = prime * result + ((answerSubject == null) ? 0 : answerSubject.hashCode()); - result = prime * result + ((answerText == null) ? 0 : answerText.hashCode()); - result = prime * result + piRound; - result = prime * result + ((questionId == null) ? 0 : questionId.hashCode()); - result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode()); - result = prime * result + (int) (timestamp ^ (timestamp >>> 32)); - result = prime * result + ((user == null) ? 0 : user.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - // auto generated! - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Answer other = (Answer) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - if (rev == null) { - if (other.rev != null) { - return false; - } - } else if (!rev.equals(other.rev)) { - return false; - } - if (answerSubject == null) { - if (other.answerSubject != null) { - return false; - } - } else if (!answerSubject.equals(other.answerSubject)) { - return false; - } - if (answerText == null) { - if (other.answerText != null) { - return false; - } - } else if (!answerText.equals(other.answerText)) { - return false; - } - if (piRound != other.piRound) { - return false; - } - if (questionId == null) { - if (other.questionId != null) { - return false; - } - } else if (!questionId.equals(other.questionId)) { - return false; - } - if (sessionId == null) { - if (other.sessionId != null) { - return false; - } - } else if (!sessionId.equals(other.sessionId)) { - return false; - } - if (timestamp != other.timestamp) { - return false; - } - if (user == null) { - if (other.user != null) { - return false; - } - } else if (!user.equals(other.user)) { - return false; - } - return true; + public void setContentId(final String contentId) { + this.contentId = contentId; } } diff --git a/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java b/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java new file mode 100644 index 000000000..1bb6f31b2 --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java @@ -0,0 +1,21 @@ +package de.thm.arsnova.entities; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.migration.v2.AnswerOption; +import de.thm.arsnova.entities.serialization.View; + +import java.util.List; + +public class ChoiceAnswer extends Answer { + private List<Integer> selectedChoiceIndexes; + + @JsonView({View.Persistence.class, View.Public.class}) + public List<Integer> getSelectedChoiceIndexes() { + return selectedChoiceIndexes; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSelectedChoiceIndexes(final List<Integer> selectedChoiceIndexes) { + this.selectedChoiceIndexes = selectedChoiceIndexes; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java b/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java new file mode 100644 index 000000000..ff660b1e6 --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java @@ -0,0 +1,69 @@ +package de.thm.arsnova.entities; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.serialization.View; + +import java.util.ArrayList; +import java.util.List; + +public class ChoiceQuestionContent extends Content { + public class AnswerOption { + private String label; + private int points; + + @JsonView({View.Persistence.class, View.Public.class}) + public String getLabel() { + return label; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setLabel(String label) { + this.label = label; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public int getPoints() { + return points; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPoints(int points) { + this.points = points; + } + } + + private List<AnswerOption> options = new ArrayList<>(); + private List<Integer> correctOptionIndexes = new ArrayList<>(); + private boolean multiple; + + @JsonView({View.Persistence.class, View.Public.class}) + public List<AnswerOption> getOptions() { + return options; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOptions(final List<AnswerOption> options) { + this.options = options; + } + + /* TODO: A new JsonView is needed here. */ + @JsonView(View.Persistence.class) + public List<Integer> getCorrectOptionIndexes() { + return correctOptionIndexes; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setCorrectOptionIndexes(final List<Integer> correctOptionIndexes) { + this.correctOptionIndexes = correctOptionIndexes; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isMultiple() { + return multiple; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setMultiple(final boolean multiple) { + this.multiple = multiple; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java index 1bcb79434..ccd5d839c 100644 --- a/src/main/java/de/thm/arsnova/entities/Content.java +++ b/src/main/java/de/thm/arsnova/entities/Content.java @@ -1,882 +1,88 @@ -/* - * This file is part of ARSnova Backend. - * Copyright (C) 2012-2018 The ARSnova Team and Contributors - * - * ARSnova Backend is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * ARSnova Backend is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import java.util.Date; -import java.util.List; - -/** - * A question the teacher is asking. - */ -@ApiModel(value = "content", description = "the content entity") public class Content implements Entity { private String id; private String rev; - private String questionType; - private String questionVariant; - private String subject; - private String text; - private boolean active; - private String releasedFor; - private List<PossibleAnswer> possibleAnswers; - private boolean noCorrect; - // TODO: We currently need both sessionId and sessionKeyword, but sessionKeyword will not be persisted. private String sessionId; - // This property is needed because the client does not have the session ID, only the keyword. - private String sessionKeyword; - private long timestamp; - private int number; - private int duration; - private int piRound; - private long piRoundEndTime = 0; - private long piRoundStartTime = 0; - private boolean piRoundFinished = false; - private boolean piRoundActive = false; - private boolean votingDisabled; - private boolean showStatistic; // sic - private boolean showAnswer; - private boolean abstention; - private boolean ignoreCaseSensitive; - private boolean ignoreWhitespaces; - private boolean ignorePunctuation; - private boolean fixedAnswer; - private boolean strictMode; - private int rating; - private String correctAnswer; - - private String image; - private String fcImage; - private int gridSize; - private int offsetX; - private int offsetY; - private int zoomLvl; - private int gridOffsetX; - private int gridOffsetY; - private int gridZoomLvl; - private int gridSizeX; - private int gridSizeY; - private boolean gridIsHidden; - private int imgRotation; - private boolean toggleFieldsLeft; - private int numClickableFields; - private int thresholdCorrectAnswers; - private boolean cvIsColored; - private String gridLineColor; - private int numberOfDots; - private String gridType; - private String scaleFactor; - private String gridScaleFactor; - private boolean imageQuestion; - private boolean textAnswerEnabled; - private String hint; - private String solution; + private String subject; + private String body; + private String format; + private String group; - @ApiModelProperty(required = true, value = "the couchDB ID") + @Override @JsonView({View.Persistence.class, View.Public.class}) public String getId() { return id; } + @Override @JsonView({View.Persistence.class, View.Public.class}) public void setId(final String id) { this.id = id; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setRevision(final String rev) { - this.rev = rev; - } - + @Override @JsonView({View.Persistence.class, View.Public.class}) public String getRevision() { return rev; } - @ApiModelProperty(required = true, value = "the question type") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getQuestionType() { - return questionType; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setQuestionType(final String questionType) { - this.questionType = questionType; - } - - @ApiModelProperty(required = true, value = "either lecture or preparation") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getQuestionVariant() { - return questionVariant; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setQuestionVariant(final String questionVariant) { - this.questionVariant = questionVariant; - } - - @ApiModelProperty(required = true, value = "used to display subject") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getSubject() { - return subject; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setSubject(final String subject) { - this.subject = subject; - } - - @ApiModelProperty(required = true, value = "the text") - @JsonView({View.Persistence.class, View.Public.class}) - public final String getText() { - return text; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setText(final String text) { - this.text = text; - } - - @ApiModelProperty(required = true, value = "true for active question") - @JsonView({View.Persistence.class, View.Public.class}) - public final boolean isActive() { - return active; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setActive(final boolean active) { - this.active = active; - } - - @ApiModelProperty(required = true, value = "deprecated - previously used to limitate the audience") - public final String getReleasedFor() { - return releasedFor; - } - - public final void setReleasedFor(final String releasedFor) { - this.releasedFor = releasedFor; - } - - @ApiModelProperty(required = true, value = "list of possible answers") - @JsonView({View.Persistence.class, View.Public.class}) - public final List<PossibleAnswer> getPossibleAnswers() { - return possibleAnswers; - } - + @Override @JsonView({View.Persistence.class, View.Public.class}) - public final void setPossibleAnswers(final List<PossibleAnswer> possibleAnswers) { - this.possibleAnswers = possibleAnswers; - } - - @ApiModelProperty(required = true, value = "if true, no answer is marked correct") - public final boolean isNoCorrect() { - return noCorrect; - } - - public final void setNoCorrect(final boolean noCorrect) { - this.noCorrect = noCorrect; + public void setRevision(final String rev) { + this.rev = rev; } - @ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to") @JsonView({View.Persistence.class, View.Public.class}) - public final String getSessionId() { + public String getSessionId() { return sessionId; } @JsonView({View.Persistence.class, View.Public.class}) - public final void setSessionId(final String sessionId) { + public void setSessionId(final String sessionId) { this.sessionId = sessionId; } - @ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to") - public final String getSession() { - return sessionId; - } - - public final void setSession(final String session) { - sessionId = session; - } - - @ApiModelProperty(required = true, value = "the session keyword, the question is assigned to") - public final String getSessionKeyword() { - return sessionKeyword; - } - - public final void setSessionKeyword(final String keyword) { - sessionKeyword = keyword; - } - - @ApiModelProperty(required = true, value = "creation date timestamp") - @JsonView(View.Persistence.class) - public final long getTimestamp() { - return timestamp; - } - - @JsonView(View.Persistence.class) - public final void setTimestamp(final long timestamp) { - this.timestamp = timestamp; - } - - @ApiModelProperty(required = true, value = "used to display number") - public final int getNumber() { - return number; - } - - public final void setNumber(final int number) { - this.number = number; - } - - @ApiModelProperty(required = true, value = "used to display duration") - @JsonView({View.Persistence.class, View.Public.class}) - public final int getDuration() { - return duration; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setDuration(final int duration) { - this.duration = duration; - } - - @ApiModelProperty(required = true, value = "true for image question") - @JsonView({View.Persistence.class, View.Public.class}) - public final boolean isImageQuestion() { - return imageQuestion; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setImageQuestion(boolean imageQuestion) { - this.imageQuestion = imageQuestion; - } - - @ApiModelProperty(required = true, value = "the peer instruction round no.") - @JsonView({View.Persistence.class, View.Public.class}) - public int getPiRound() { - return piRound; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setPiRound(final int piRound) { - this.piRound = piRound; - } - - @ApiModelProperty(required = true, value = "the peer instruction round end timestamp") - @JsonView({View.Persistence.class, View.Public.class}) - public long getPiRoundEndTime() { - return piRoundEndTime; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setPiRoundEndTime(long piRoundEndTime) { - this.piRoundEndTime = piRoundEndTime; - } - - @ApiModelProperty(required = true, value = "the peer instruction round start timestamp") - @JsonView({View.Persistence.class, View.Public.class}) - public long getPiRoundStartTime() { - return piRoundStartTime; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setPiRoundStartTime(long piRoundStartTime) { - this.piRoundStartTime = piRoundStartTime; - } - - @ApiModelProperty(required = true, value = "true for active peer instruction round") - public boolean isPiRoundActive() { - return piRoundActive; - } - - public void setPiRoundActive(boolean piRoundActive) { - this.piRoundActive = piRoundActive; - } - - @ApiModelProperty(required = true, value = "true for finished peer instruction round") - public boolean isPiRoundFinished() { - return piRoundFinished; - } - - public void setPiRoundFinished(boolean piRoundFinished) { - this.piRoundFinished = piRoundFinished; - } - - @ApiModelProperty(required = true, value = "used to display showStatistic") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isShowStatistic() { - return showStatistic; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setShowStatistic(final boolean showStatistic) { - this.showStatistic = showStatistic; - } - - @ApiModelProperty(required = true, value = "used to display cvIsColored") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean getCvIsColored() { - return cvIsColored; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setCvIsColored(boolean cvIsColored) { - this.cvIsColored = cvIsColored; - } - - @ApiModelProperty(required = true, value = "used to display showAnswer") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isShowAnswer() { - return showAnswer; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setShowAnswer(final boolean showAnswer) { - this.showAnswer = showAnswer; - } - - @ApiModelProperty(required = true, value = "used to display abstention") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isAbstention() { - return abstention; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setAbstention(final boolean abstention) { - this.abstention = abstention; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isIgnoreCaseSensitive() { - return ignoreCaseSensitive; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setIgnoreCaseSensitive(final boolean ignoreCaseSensitive) { - this.ignoreCaseSensitive = ignoreCaseSensitive; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isIgnoreWhitespaces() { - return ignoreWhitespaces; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setIgnoreWhitespaces(final boolean ignoreWhitespaces) { - this.ignoreWhitespaces = ignoreWhitespaces; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isIgnorePunctuation() { - return ignorePunctuation; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setIgnorePunctuation(final boolean ignorePunctuation) { - this.ignorePunctuation = ignorePunctuation; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isFixedAnswer() { - return this.fixedAnswer; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setFixedAnswer(final boolean fixedAnswer) { - this.fixedAnswer = fixedAnswer; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isStrictMode() { - return this.strictMode; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setStrictMode(final boolean strictMode) { - this.strictMode = strictMode; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final int getRating() { - return this.rating; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setRating(final int rating) { - this.rating = rating; - } - @JsonView({View.Persistence.class, View.Public.class}) - public final String getCorrectAnswer() { - return correctAnswer; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public final void setCorrectAnswer(final String correctAnswer) { - this.correctAnswer = correctAnswer; - } - - @ApiModelProperty(required = true, value = "the image") - @JsonView({View.Persistence.class, View.Public.class}) - public String getImage() { - return image; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setImage(final String image) { - this.image = image; - } - - @ApiModelProperty(required = true, value = "the fcImage") - @JsonView({View.Persistence.class, View.Public.class}) - public String getFcImage() { - return fcImage; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setFcImage(final String fcImage) { - this.fcImage = fcImage; - } - - @ApiModelProperty(required = true, value = "the grid size") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridSize() { - return gridSize; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridSize(final int gridSize) { - this.gridSize = gridSize; - } - - @ApiModelProperty(required = true, value = "the image X offset") - @JsonView({View.Persistence.class, View.Public.class}) - public int getOffsetX() { - return offsetX; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setOffsetX(final int offsetX) { - this.offsetX = offsetX; - } - - @ApiModelProperty(required = true, value = "the image Y offset") - @JsonView({View.Persistence.class, View.Public.class}) - public int getOffsetY() { - return offsetY; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setOffsetY(final int offsetY) { - this.offsetY = offsetY; - } - - @ApiModelProperty(required = true, value = "the image zoom level") - @JsonView({View.Persistence.class, View.Public.class}) - public int getZoomLvl() { - return zoomLvl; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setZoomLvl(final int zoomLvl) { - this.zoomLvl = zoomLvl; - } - - @ApiModelProperty(required = true, value = "the grid X offset") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridOffsetX() { - return gridOffsetX; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridOffsetX(int gridOffsetX) { - this.gridOffsetX = gridOffsetX; - } - - @ApiModelProperty(required = true, value = "the grid Y offset") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridOffsetY() { - return gridOffsetY; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridOffsetY(int gridOffsetY) { - this.gridOffsetY = gridOffsetY; - } - - @ApiModelProperty(required = true, value = "the grid zoom lvl") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridZoomLvl() { - return gridZoomLvl; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridZoomLvl(int gridZoomLvl) { - this.gridZoomLvl = gridZoomLvl; - } - - @ApiModelProperty(required = true, value = "the grid X size") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridSizeX() { - return gridSizeX; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridSizeX(int gridSizeX) { - this.gridSizeX = gridSizeX; - } - - @ApiModelProperty(required = true, value = "the grid Y size") - @JsonView({View.Persistence.class, View.Public.class}) - public int getGridSizeY() { - return gridSizeY; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridSizeY(int gridSizeY) { - this.gridSizeY = gridSizeY; - } - - @ApiModelProperty(required = true, value = "true for hidden grid") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean getGridIsHidden() { - return gridIsHidden; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridIsHidden(boolean gridIsHidden) { - this.gridIsHidden = gridIsHidden; - } - - @ApiModelProperty(required = true, value = "the image rotation") - @JsonView({View.Persistence.class, View.Public.class}) - public int getImgRotation() { - return imgRotation; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setImgRotation(int imgRotation) { - this.imgRotation = imgRotation; - } - - @ApiModelProperty(required = true, value = "the toggled left fields") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean getToggleFieldsLeft() { - return toggleFieldsLeft; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setToggleFieldsLeft(boolean toggleFieldsLeft) { - this.toggleFieldsLeft = toggleFieldsLeft; - } - - @ApiModelProperty(required = true, value = "the number of clickable fields") - @JsonView({View.Persistence.class, View.Public.class}) - public int getNumClickableFields() { - return numClickableFields; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setNumClickableFields(int numClickableFields) { - this.numClickableFields = numClickableFields; - } - - @ApiModelProperty(required = true, value = "the threshold of correct answers") - @JsonView({View.Persistence.class, View.Public.class}) - public int getThresholdCorrectAnswers() { - return thresholdCorrectAnswers; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setThresholdCorrectAnswers(int thresholdCorrectAnswers) { - this.thresholdCorrectAnswers = thresholdCorrectAnswers; - } - - @ApiModelProperty(required = true, value = "the grid line color") - @JsonView({View.Persistence.class, View.Public.class}) - public String getGridLineColor() { - return gridLineColor; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridLineColor(String gridLineColor) { - this.gridLineColor = gridLineColor; - } - - @ApiModelProperty(required = true, value = "the number of dots") - @JsonView({View.Persistence.class, View.Public.class}) - public int getNumberOfDots() { - return numberOfDots; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setNumberOfDots(int numberOfDots) { - this.numberOfDots = numberOfDots; - } - - @ApiModelProperty(required = true, value = "the grid type") - @JsonView({View.Persistence.class, View.Public.class}) - public String getGridType() { - return gridType; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridType(String gridType) { - this.gridType = gridType; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setScaleFactor(String scaleFactor) { - this.scaleFactor = scaleFactor; - } - - @ApiModelProperty(required = true, value = "the image scale factor") - @JsonView({View.Persistence.class, View.Public.class}) - public String getScaleFactor() { - return this.scaleFactor; - } - - @JsonView({View.Persistence.class, View.Public.class}) - public void setGridScaleFactor(String scaleFactor) { - this.gridScaleFactor = scaleFactor; - } - - @ApiModelProperty(required = true, value = "the grid scale factor") - @JsonView({View.Persistence.class, View.Public.class}) - public String getGridScaleFactor() { - return this.gridScaleFactor; - } - - @ApiModelProperty(required = true, value = "true for a question that can be answered via text") - @JsonView({View.Persistence.class, View.Public.class}) - public boolean isTextAnswerEnabled() { - return this.textAnswerEnabled; + public String getSubject() { + return subject; } @JsonView({View.Persistence.class, View.Public.class}) - public void setTextAnswerEnabled(boolean textAnswerEnabled) { - this.textAnswerEnabled = textAnswerEnabled; + public void setSubject(final String subject) { + this.subject = subject; } - @ApiModelProperty(required = true, value = "true for disabled voting") @JsonView({View.Persistence.class, View.Public.class}) - public boolean isVotingDisabled() { - return votingDisabled; + public String getBody() { + return body; } @JsonView({View.Persistence.class, View.Public.class}) - public void setVotingDisabled(boolean votingDisabled) { - this.votingDisabled = votingDisabled; + public void setBody(final String body) { + this.body = body; } @JsonView({View.Persistence.class, View.Public.class}) - public String getHint() { - return hint; + public String getFormat() { + return format; } @JsonView({View.Persistence.class, View.Public.class}) - public void setHint(String hint) { - this.hint = hint; + public void setFormat(final String format) { + this.format = format; } @JsonView({View.Persistence.class, View.Public.class}) - public String getSolution() { - return solution; + public String getGroup() { + return group; } @JsonView({View.Persistence.class, View.Public.class}) - public void setSolution(String solution) { - this.solution = solution; - } - - @Override - public final String toString() { - return "Content type '" + questionType + "': " + subject + ";\n" + text + possibleAnswers; - } - - @Override - public int hashCode() { - // auto generated! - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - // auto generated! - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Content other = (Content) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - return true; - } - - public int calculateValue(Answer answer) { - if (answer.isAbstention()) { - return 0; - } else if ("mc".equals(this.questionType)) { - return calculateMultipleChoiceValue(answer); - } else if ("grid".equals(this.questionType)) { - return calculateGridValue(answer); - } else { - return calculateRegularValue(answer); - } - } - - public String checkCaseSensitive(String answerText) { - if (this.isIgnoreCaseSensitive()) { - this.setCorrectAnswer(this.getCorrectAnswer().toLowerCase()); - return answerText.toLowerCase(); - } - return answerText; - } - public String checkWhitespaces(String answerText) { - if (this.isIgnoreWhitespaces()) { - this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("[\\s]", "")); - return answerText.replaceAll("[\\s]", ""); - } - return answerText; - } - public String checkPunctuation(String answerText) { - if (this.isIgnorePunctuation()) { - this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("\\p{Punct}", "")); - return answerText.replaceAll("\\p{Punct}", ""); - } - return answerText; - } - - public void checkTextStrictOptions(Answer answer) { - answer.setAnswerTextRaw(this.checkCaseSensitive(answer.getAnswerTextRaw())); - answer.setAnswerTextRaw(this.checkPunctuation(answer.getAnswerTextRaw())); - answer.setAnswerTextRaw(this.checkWhitespaces(answer.getAnswerTextRaw())); - } - - public int evaluateCorrectAnswerFixedText(String answerTextRaw) { - if (answerTextRaw != null) { - if (answerTextRaw.equals(this.getCorrectAnswer())) { - return this.getRating(); - } - } - return 0; - } - - public boolean isSuccessfulFreeTextAnswer(String answerTextRaw) { - return answerTextRaw != null && answerTextRaw.equals(this.getCorrectAnswer()); - } - - public void updateRoundStartVariables(Date start, Date end) { - if (this.getPiRound() == 1 && this.isPiRoundFinished()) { - this.setPiRound(2); - } - - this.setActive(true); - this.setShowAnswer(false); - this.setPiRoundActive(true); - this.setShowStatistic(false); - this.setVotingDisabled(false); - this.setPiRoundFinished(false); - this.setPiRoundStartTime(start.getTime()); - this.setPiRoundEndTime(end.getTime()); - } - - public void updateRoundManagementState() { - final long time = new Date().getTime(); - - if (time > this.getPiRoundEndTime() && this.isPiRoundActive()) { - this.setPiRoundEndTime(0); - this.setPiRoundStartTime(0); - this.setPiRoundActive(false); - this.setPiRoundFinished(true); - } - } - - public void resetRoundManagementState() { - this.setPiRoundEndTime(0); - this.setPiRoundStartTime(0); - this.setVotingDisabled(true); - this.setPiRoundActive(false); - this.setPiRoundFinished(false); - this.setShowStatistic(false); - this.setShowAnswer(false); - } - - public void resetQuestionState() { - this.setPiRoundEndTime(0); - this.setPiRoundStartTime(0); - this.setPiRoundActive(false); - this.setPiRoundFinished(false); - this.setVotingDisabled(false); - - if ("freetext".equals(this.getQuestionType())) { - this.setPiRound(0); - } else { - this.setPiRound(1); - } - } - - private int calculateRegularValue(Answer answer) { - String answerText = answer.getAnswerText(); - for (PossibleAnswer p : this.possibleAnswers) { - if (answerText.equals(p.getText())) { - return p.getValue(); - } - } - return 0; - } - - private int calculateGridValue(Answer answer) { - int value = 0; - String[] answers = answer.getAnswerText().split(","); - for (String a : answers) { - for (PossibleAnswer p : this.possibleAnswers) { - if (a.equals(p.getText())) { - value += p.getValue(); - } - } - } - return value; - } - - private int calculateMultipleChoiceValue(Answer answer) { - int value = 0; - String[] answers = answer.getAnswerText().split(","); - for (int i = 0; i < this.possibleAnswers.size() && i < answers.length; i++) { - if ("1".equals(answers[i])) { - PossibleAnswer p = this.possibleAnswers.get(i); - value += p.getValue(); - } - } - return value; + public void setGroup(final String group) { + this.group = group; } } diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java new file mode 100644 index 000000000..1ca7a828c --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java @@ -0,0 +1,29 @@ +package de.thm.arsnova.entities; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.serialization.View; + +public class TextAnswer extends Answer { + private String subject; + private String body; + + @JsonView({View.Persistence.class, View.Public.class}) + public String getSubject() { + return subject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSubject(String subject) { + this.subject = subject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getBody() { + return body; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setBody(String body) { + this.body = body; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java index 6c007027c..83a84eee5 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java @@ -1,10 +1,89 @@ package de.thm.arsnova.entities.migration; +import de.thm.arsnova.entities.ChoiceAnswer; +import de.thm.arsnova.entities.ChoiceQuestionContent; import de.thm.arsnova.entities.Entity; +import de.thm.arsnova.entities.TextAnswer; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.AnswerOption; +import de.thm.arsnova.entities.migration.v2.Content; + +import java.util.ArrayList; +import java.util.List; public class V2Migrator { private void copyCommonProperties(final Entity from, final Entity to) { to.setId(from.getId()); to.setRevision(from.getRevision()); } + + public de.thm.arsnova.entities.Content migrate(final Content from) { + de.thm.arsnova.entities.Content to; + switch (from.getQuestionType()) { + case "abcd": + case "mc": + ChoiceQuestionContent choiceQuestionContent = new ChoiceQuestionContent(); + to = choiceQuestionContent; + for (int i = 0; i < from.getPossibleAnswers().size(); i++) { + de.thm.arsnova.entities.migration.v2.AnswerOption choice = from.getPossibleAnswers().get(i); + if (choice.isCorrect()) { + choiceQuestionContent.getCorrectOptionIndexes().add(i); + } + } + + break; + case "text": + to = new de.thm.arsnova.entities.Content(); + break; + default: + throw new IllegalArgumentException("Unsupported content format."); + } + copyCommonProperties(from, to); + to.setSessionId(from.getSessionId()); + to.setSubject(from.getSubject()); + to.setBody(from.getText()); + to.setFormat(from.getQuestionType()); + to.setGroup(from.getQuestionVariant()); + + return to; + } + + public de.thm.arsnova.entities.Answer migrate(final Answer from, final Content content) { + switch (content.getQuestionType()) { + case "abcd": + case "mc": + return migrate(from, content.getPossibleAnswers()); + case "text": + return migrate(from); + default: + throw new IllegalArgumentException("Unsupported content format."); + } + } + + public ChoiceAnswer migrate(final Answer from, final List<AnswerOption> options) { + final ChoiceAnswer to = new ChoiceAnswer(); + copyCommonProperties(from, to); + to.setContentId(from.getQuestionId()); + List<Integer> selectedChoiceIndexes = new ArrayList<>(); + to.setSelectedChoiceIndexes(selectedChoiceIndexes); + + for (int i = 0; i < options.size(); i++) { + AnswerOption choice = options.get(i); + if (choice.getText().equals(from.getAnswerText())) { + selectedChoiceIndexes.add(i); + } + } + + return to; + } + + public TextAnswer migrate(final Answer from) { + final TextAnswer to = new TextAnswer(); + copyCommonProperties(from, to); + to.setContentId(from.getQuestionId()); + to.setSubject(from.getAnswerSubject()); + to.setBody(from.getAnswerText()); + + return to; + } } diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java new file mode 100644 index 000000000..7c13d76bd --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java @@ -0,0 +1,362 @@ +/* + * This file is part of ARSnova Backend. + * Copyright (C) 2012-2017 The ARSnova Team + * + * ARSnova Backend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ARSnova Backend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package de.thm.arsnova.entities.migration.v2; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.Entity; +import de.thm.arsnova.entities.serialization.View; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * Both a regular (single choice, evaluation, etc.) as well as a freetext answer. + * + * This class has additional fields to transport generated answer statistics. + */ +@ApiModel(value = "Answer", description = "the answer entity") +public class Answer implements Entity { + private String id; + private String rev; + private String type; + private String sessionId; + private String questionId; + private String answerText; + private String answerTextRaw; + private String answerSubject; + private boolean successfulFreeTextAnswer; + private String questionVariant; + private int questionValue; + private int piRound; + private String user; + private long timestamp; + private boolean read; + private int answerCount = 1; + private boolean abstention; + private int abstentionCount; + @JsonIgnore + private String answerImage; + private String answerThumbnailImage; + + public Answer() { + this.type = "skill_question_answer"; + } + + @ApiModelProperty(required = true, value = "the couchDB ID") + @JsonView({View.Persistence.class, View.Public.class}) + public String getId() { + return id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setId(final String id) { + this.id = id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRevision(final String rev) { + this.rev = rev; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getRevision() { + return rev; + } + + @ApiModelProperty(required = true, value = "ID of the session, the answer is assigned to") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getSessionId() { + return sessionId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setSessionId(final String sessionId) { + this.sessionId = sessionId; + } + + @ApiModelProperty(required = true, value = "used to display question id") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getQuestionId() { + return questionId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setQuestionId(final String questionId) { + this.questionId = questionId; + } + + @ApiModelProperty(required = true, value = "the answer text") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getAnswerText() { + return answerText; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setAnswerText(final String answerText) { + this.answerText = answerText; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final String getAnswerTextRaw() { + return this.answerTextRaw; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setAnswerTextRaw(final String answerTextRaw) { + this.answerTextRaw = answerTextRaw; + } + + @ApiModelProperty(required = true, value = "the answer subject") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getAnswerSubject() { + return answerSubject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setAnswerSubject(final String answerSubject) { + this.answerSubject = answerSubject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final boolean isSuccessfulFreeTextAnswer() { + return this.successfulFreeTextAnswer; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setSuccessfulFreeTextAnswer(final boolean successfulFreeTextAnswer) { + this.successfulFreeTextAnswer = successfulFreeTextAnswer; + } + + @ApiModelProperty(required = true, value = "the peer instruction round nr.") + @JsonView({View.Persistence.class, View.Public.class}) + public int getPiRound() { + return piRound; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPiRound(int piRound) { + this.piRound = piRound; + } + + @ApiModelProperty(required = true, value = "the user") + @JsonView(View.Persistence.class) + public final String getUser() { + return user; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setUser(final String user) { + this.user = user; + } + + @ApiModelProperty(required = true, value = "the answer image") + @JsonView(View.Persistence.class) + public String getAnswerImage() { + return answerImage; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAnswerImage(String answerImage) { + this.answerImage = answerImage; + } + + @ApiModelProperty(required = true, value = "the answer thumbnail") + @JsonView({View.Persistence.class, View.Public.class}) + public String getAnswerThumbnailImage() { + return answerThumbnailImage; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAnswerThumbnailImage(String answerThumbnailImage) { + this.answerThumbnailImage = answerThumbnailImage; + } + + @ApiModelProperty(required = true, value = "the creation date timestamp") + @JsonView({View.Persistence.class, View.Public.class}) + public long getTimestamp() { + return timestamp; + } + + @JsonView(View.Persistence.class) + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + @ApiModelProperty(required = true, value = "displays whether the answer is read") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isRead() { + return read; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRead(boolean read) { + this.read = read; + } + + @ApiModelProperty(required = true, value = "the number of answers given. used for statistics") + @JsonView(View.Public.class) + public final int getAnswerCount() { + return answerCount; + } + + public final void setAnswerCount(final int answerCount) { + this.answerCount = answerCount; + } + + @ApiModelProperty(required = true, value = "the abstention") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isAbstention() { + return abstention; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAbstention(boolean abstention) { + this.abstention = abstention; + } + + @ApiModelProperty(required = true, value = "the number of abstentions given. used for statistics") + @JsonView(View.Public.class) + public int getAbstentionCount() { + return abstentionCount; + } + + public void setAbstentionCount(int abstentionCount) { + this.abstentionCount = abstentionCount; + } + + @ApiModelProperty(required = true, value = "either lecture or preparation") + @JsonView({View.Persistence.class, View.Public.class}) + public String getQuestionVariant() { + return questionVariant; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setQuestionVariant(String questionVariant) { + this.questionVariant = questionVariant; + } + + @ApiModelProperty(required = true, value = "used to display question value") + @JsonView({View.Persistence.class, View.Public.class}) + public int getQuestionValue() { + return questionValue; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setQuestionValue(int questionValue) { + this.questionValue = questionValue; + } + + @Override + public final String toString() { + return "Answer type:'" + type + "'" + + ", session: " + sessionId + + ", question: " + questionId + + ", subject: " + answerSubject + + ", answerCount: " + answerCount + + ", answer: " + answerText + + ", user: " + user; + } + + @Override + public int hashCode() { + // auto generated! + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((rev == null) ? 0 : rev.hashCode()); + result = prime * result + ((answerSubject == null) ? 0 : answerSubject.hashCode()); + result = prime * result + ((answerText == null) ? 0 : answerText.hashCode()); + result = prime * result + piRound; + result = prime * result + ((questionId == null) ? 0 : questionId.hashCode()); + result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode()); + result = prime * result + (int) (timestamp ^ (timestamp >>> 32)); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + // auto generated! + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Answer other = (Answer) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + if (rev == null) { + if (other.rev != null) { + return false; + } + } else if (!rev.equals(other.rev)) { + return false; + } + if (answerSubject == null) { + if (other.answerSubject != null) { + return false; + } + } else if (!answerSubject.equals(other.answerSubject)) { + return false; + } + if (answerText == null) { + if (other.answerText != null) { + return false; + } + } else if (!answerText.equals(other.answerText)) { + return false; + } + if (piRound != other.piRound) { + return false; + } + if (questionId == null) { + if (other.questionId != null) { + return false; + } + } else if (!questionId.equals(other.questionId)) { + return false; + } + if (sessionId == null) { + if (other.sessionId != null) { + return false; + } + } else if (!sessionId.equals(other.sessionId)) { + return false; + } + if (timestamp != other.timestamp) { + return false; + } + if (user == null) { + if (other.user != null) { + return false; + } + } else if (!user.equals(other.user)) { + return false; + } + return true; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java b/src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java similarity index 92% rename from src/main/java/de/thm/arsnova/entities/PossibleAnswer.java rename to src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java index 84e83b2d4..5bd8b152b 100644 --- a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.thm.arsnova.entities; +package de.thm.arsnova.entities.migration.v2; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; @@ -28,7 +28,7 @@ import java.io.Serializable; * This class represents an answer option of a question. */ @ApiModel(value = "session/answer", description = "the possible answer entity") -public class PossibleAnswer implements Serializable { +public class AnswerOption implements Serializable { private String id; private String text; @@ -79,6 +79,6 @@ public class PossibleAnswer implements Serializable { @Override public String toString() { - return "PossibleAnswer [id=" + id + ", text=" + text + ", correct=" + correct + "]"; + return "AnswerOption [id=" + id + ", text=" + text + ", correct=" + correct + "]"; } } diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java new file mode 100644 index 000000000..e372c05e7 --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java @@ -0,0 +1,883 @@ +/* + * This file is part of ARSnova Backend. + * Copyright (C) 2012-2017 The ARSnova Team + * + * ARSnova Backend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * ARSnova Backend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package de.thm.arsnova.entities.migration.v2; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.Entity; +import de.thm.arsnova.entities.serialization.View; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; +import java.util.List; + +/** + * A question the teacher is asking. + */ +@ApiModel(value = "content", description = "the content entity") +public class Content implements Entity { + private String id; + private String rev; + private String questionType; + private String questionVariant; + private String subject; + private String text; + private boolean active; + private String releasedFor; + private List<AnswerOption> possibleAnswers; + private boolean noCorrect; + // TODO: We currently need both sessionId and sessionKeyword, but sessionKeyword will not be persisted. + private String sessionId; + // This property is needed because the client does not have the session ID, only the keyword. + private String sessionKeyword; + private long timestamp; + private int number; + private int duration; + private int piRound; + private long piRoundEndTime = 0; + private long piRoundStartTime = 0; + private boolean piRoundFinished = false; + private boolean piRoundActive = false; + private boolean votingDisabled; + private boolean showStatistic; // sic + private boolean showAnswer; + private boolean abstention; + private boolean ignoreCaseSensitive; + private boolean ignoreWhitespaces; + private boolean ignorePunctuation; + private boolean fixedAnswer; + private boolean strictMode; + private int rating; + private String correctAnswer; + + private String image; + private String fcImage; + private int gridSize; + private int offsetX; + private int offsetY; + private int zoomLvl; + private int gridOffsetX; + private int gridOffsetY; + private int gridZoomLvl; + private int gridSizeX; + private int gridSizeY; + private boolean gridIsHidden; + private int imgRotation; + private boolean toggleFieldsLeft; + private int numClickableFields; + private int thresholdCorrectAnswers; + private boolean cvIsColored; + private String gridLineColor; + private int numberOfDots; + private String gridType; + private String scaleFactor; + private String gridScaleFactor; + private boolean imageQuestion; + private boolean textAnswerEnabled; + private String hint; + private String solution; + + @ApiModelProperty(required = true, value = "the couchDB ID") + @JsonView({View.Persistence.class, View.Public.class}) + public String getId() { + return id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setId(final String id) { + this.id = id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRevision(final String rev) { + this.rev = rev; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getRevision() { + return rev; + } + + @ApiModelProperty(required = true, value = "the question type") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getQuestionType() { + return questionType; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setQuestionType(final String questionType) { + this.questionType = questionType; + } + + @ApiModelProperty(required = true, value = "either lecture or preparation") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getQuestionVariant() { + return questionVariant; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setQuestionVariant(final String questionVariant) { + this.questionVariant = questionVariant; + } + + @ApiModelProperty(required = true, value = "used to display subject") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getSubject() { + return subject; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setSubject(final String subject) { + this.subject = subject; + } + + @ApiModelProperty(required = true, value = "the text") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getText() { + return text; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setText(final String text) { + this.text = text; + } + + @ApiModelProperty(required = true, value = "true for active question") + @JsonView({View.Persistence.class, View.Public.class}) + public final boolean isActive() { + return active; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setActive(final boolean active) { + this.active = active; + } + + @ApiModelProperty(required = true, value = "deprecated - previously used to limitate the audience") + public final String getReleasedFor() { + return releasedFor; + } + + public final void setReleasedFor(final String releasedFor) { + this.releasedFor = releasedFor; + } + + @ApiModelProperty(required = true, value = "list of possible answers") + @JsonView({View.Persistence.class, View.Public.class}) + public final List<AnswerOption> getPossibleAnswers() { + return possibleAnswers; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setPossibleAnswers(final List<AnswerOption> possibleAnswers) { + this.possibleAnswers = possibleAnswers; + } + + @ApiModelProperty(required = true, value = "if true, no answer is marked correct") + public final boolean isNoCorrect() { + return noCorrect; + } + + public final void setNoCorrect(final boolean noCorrect) { + this.noCorrect = noCorrect; + } + + @ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to") + @JsonView({View.Persistence.class, View.Public.class}) + public final String getSessionId() { + return sessionId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setSessionId(final String sessionId) { + this.sessionId = sessionId; + } + + @ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to") + public final String getSession() { + return sessionId; + } + + public final void setSession(final String session) { + sessionId = session; + } + + @ApiModelProperty(required = true, value = "the session keyword, the question is assigned to") + public final String getSessionKeyword() { + return sessionKeyword; + } + + public final void setSessionKeyword(final String keyword) { + sessionKeyword = keyword; + } + + @ApiModelProperty(required = true, value = "creation date timestamp") + @JsonView(View.Persistence.class) + public final long getTimestamp() { + return timestamp; + } + + @JsonView(View.Persistence.class) + public final void setTimestamp(final long timestamp) { + this.timestamp = timestamp; + } + + @ApiModelProperty(required = true, value = "used to display number") + public final int getNumber() { + return number; + } + + public final void setNumber(final int number) { + this.number = number; + } + + @ApiModelProperty(required = true, value = "used to display duration") + @JsonView({View.Persistence.class, View.Public.class}) + public final int getDuration() { + return duration; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setDuration(final int duration) { + this.duration = duration; + } + + @ApiModelProperty(required = true, value = "true for image question") + @JsonView({View.Persistence.class, View.Public.class}) + public final boolean isImageQuestion() { + return imageQuestion; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setImageQuestion(boolean imageQuestion) { + this.imageQuestion = imageQuestion; + } + + @ApiModelProperty(required = true, value = "the peer instruction round no.") + @JsonView({View.Persistence.class, View.Public.class}) + public int getPiRound() { + return piRound; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPiRound(final int piRound) { + this.piRound = piRound; + } + + @ApiModelProperty(required = true, value = "the peer instruction round end timestamp") + @JsonView({View.Persistence.class, View.Public.class}) + public long getPiRoundEndTime() { + return piRoundEndTime; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPiRoundEndTime(long piRoundEndTime) { + this.piRoundEndTime = piRoundEndTime; + } + + @ApiModelProperty(required = true, value = "the peer instruction round start timestamp") + @JsonView({View.Persistence.class, View.Public.class}) + public long getPiRoundStartTime() { + return piRoundStartTime; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPiRoundStartTime(long piRoundStartTime) { + this.piRoundStartTime = piRoundStartTime; + } + + @ApiModelProperty(required = true, value = "true for active peer instruction round") + public boolean isPiRoundActive() { + return piRoundActive; + } + + public void setPiRoundActive(boolean piRoundActive) { + this.piRoundActive = piRoundActive; + } + + @ApiModelProperty(required = true, value = "true for finished peer instruction round") + public boolean isPiRoundFinished() { + return piRoundFinished; + } + + public void setPiRoundFinished(boolean piRoundFinished) { + this.piRoundFinished = piRoundFinished; + } + + @ApiModelProperty(required = true, value = "used to display showStatistic") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isShowStatistic() { + return showStatistic; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setShowStatistic(final boolean showStatistic) { + this.showStatistic = showStatistic; + } + + @ApiModelProperty(required = true, value = "used to display cvIsColored") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean getCvIsColored() { + return cvIsColored; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setCvIsColored(boolean cvIsColored) { + this.cvIsColored = cvIsColored; + } + + @ApiModelProperty(required = true, value = "used to display showAnswer") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isShowAnswer() { + return showAnswer; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setShowAnswer(final boolean showAnswer) { + this.showAnswer = showAnswer; + } + + @ApiModelProperty(required = true, value = "used to display abstention") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isAbstention() { + return abstention; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAbstention(final boolean abstention) { + this.abstention = abstention; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isIgnoreCaseSensitive() { + return ignoreCaseSensitive; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setIgnoreCaseSensitive(final boolean ignoreCaseSensitive) { + this.ignoreCaseSensitive = ignoreCaseSensitive; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isIgnoreWhitespaces() { + return ignoreWhitespaces; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setIgnoreWhitespaces(final boolean ignoreWhitespaces) { + this.ignoreWhitespaces = ignoreWhitespaces; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isIgnorePunctuation() { + return ignorePunctuation; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setIgnorePunctuation(final boolean ignorePunctuation) { + this.ignorePunctuation = ignorePunctuation; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isFixedAnswer() { + return this.fixedAnswer; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setFixedAnswer(final boolean fixedAnswer) { + this.fixedAnswer = fixedAnswer; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isStrictMode() { + return this.strictMode; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setStrictMode(final boolean strictMode) { + this.strictMode = strictMode; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final int getRating() { + return this.rating; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setRating(final int rating) { + this.rating = rating; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final String getCorrectAnswer() { + return correctAnswer; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public final void setCorrectAnswer(final String correctAnswer) { + this.correctAnswer = correctAnswer; + } + + @ApiModelProperty(required = true, value = "the image") + @JsonView({View.Persistence.class, View.Public.class}) + public String getImage() { + return image; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setImage(final String image) { + this.image = image; + } + + @ApiModelProperty(required = true, value = "the fcImage") + @JsonView({View.Persistence.class, View.Public.class}) + public String getFcImage() { + return fcImage; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setFcImage(final String fcImage) { + this.fcImage = fcImage; + } + + @ApiModelProperty(required = true, value = "the grid size") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridSize() { + return gridSize; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridSize(final int gridSize) { + this.gridSize = gridSize; + } + + @ApiModelProperty(required = true, value = "the image X offset") + @JsonView({View.Persistence.class, View.Public.class}) + public int getOffsetX() { + return offsetX; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOffsetX(final int offsetX) { + this.offsetX = offsetX; + } + + @ApiModelProperty(required = true, value = "the image Y offset") + @JsonView({View.Persistence.class, View.Public.class}) + public int getOffsetY() { + return offsetY; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOffsetY(final int offsetY) { + this.offsetY = offsetY; + } + + @ApiModelProperty(required = true, value = "the image zoom level") + @JsonView({View.Persistence.class, View.Public.class}) + public int getZoomLvl() { + return zoomLvl; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setZoomLvl(final int zoomLvl) { + this.zoomLvl = zoomLvl; + } + + @ApiModelProperty(required = true, value = "the grid X offset") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridOffsetX() { + return gridOffsetX; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridOffsetX(int gridOffsetX) { + this.gridOffsetX = gridOffsetX; + } + + @ApiModelProperty(required = true, value = "the grid Y offset") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridOffsetY() { + return gridOffsetY; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridOffsetY(int gridOffsetY) { + this.gridOffsetY = gridOffsetY; + } + + @ApiModelProperty(required = true, value = "the grid zoom lvl") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridZoomLvl() { + return gridZoomLvl; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridZoomLvl(int gridZoomLvl) { + this.gridZoomLvl = gridZoomLvl; + } + + @ApiModelProperty(required = true, value = "the grid X size") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridSizeX() { + return gridSizeX; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridSizeX(int gridSizeX) { + this.gridSizeX = gridSizeX; + } + + @ApiModelProperty(required = true, value = "the grid Y size") + @JsonView({View.Persistence.class, View.Public.class}) + public int getGridSizeY() { + return gridSizeY; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridSizeY(int gridSizeY) { + this.gridSizeY = gridSizeY; + } + + @ApiModelProperty(required = true, value = "true for hidden grid") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean getGridIsHidden() { + return gridIsHidden; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridIsHidden(boolean gridIsHidden) { + this.gridIsHidden = gridIsHidden; + } + + @ApiModelProperty(required = true, value = "the image rotation") + @JsonView({View.Persistence.class, View.Public.class}) + public int getImgRotation() { + return imgRotation; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setImgRotation(int imgRotation) { + this.imgRotation = imgRotation; + } + + @ApiModelProperty(required = true, value = "the toggled left fields") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean getToggleFieldsLeft() { + return toggleFieldsLeft; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setToggleFieldsLeft(boolean toggleFieldsLeft) { + this.toggleFieldsLeft = toggleFieldsLeft; + } + + @ApiModelProperty(required = true, value = "the number of clickable fields") + @JsonView({View.Persistence.class, View.Public.class}) + public int getNumClickableFields() { + return numClickableFields; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setNumClickableFields(int numClickableFields) { + this.numClickableFields = numClickableFields; + } + + @ApiModelProperty(required = true, value = "the threshold of correct answers") + @JsonView({View.Persistence.class, View.Public.class}) + public int getThresholdCorrectAnswers() { + return thresholdCorrectAnswers; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setThresholdCorrectAnswers(int thresholdCorrectAnswers) { + this.thresholdCorrectAnswers = thresholdCorrectAnswers; + } + + @ApiModelProperty(required = true, value = "the grid line color") + @JsonView({View.Persistence.class, View.Public.class}) + public String getGridLineColor() { + return gridLineColor; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridLineColor(String gridLineColor) { + this.gridLineColor = gridLineColor; + } + + @ApiModelProperty(required = true, value = "the number of dots") + @JsonView({View.Persistence.class, View.Public.class}) + public int getNumberOfDots() { + return numberOfDots; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setNumberOfDots(int numberOfDots) { + this.numberOfDots = numberOfDots; + } + + @ApiModelProperty(required = true, value = "the grid type") + @JsonView({View.Persistence.class, View.Public.class}) + public String getGridType() { + return gridType; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridType(String gridType) { + this.gridType = gridType; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setScaleFactor(String scaleFactor) { + this.scaleFactor = scaleFactor; + } + + @ApiModelProperty(required = true, value = "the image scale factor") + @JsonView({View.Persistence.class, View.Public.class}) + public String getScaleFactor() { + return this.scaleFactor; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setGridScaleFactor(String scaleFactor) { + this.gridScaleFactor = scaleFactor; + } + + @ApiModelProperty(required = true, value = "the grid scale factor") + @JsonView({View.Persistence.class, View.Public.class}) + public String getGridScaleFactor() { + return this.gridScaleFactor; + } + + @ApiModelProperty(required = true, value = "true for a question that can be answered via text") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isTextAnswerEnabled() { + return this.textAnswerEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setTextAnswerEnabled(boolean textAnswerEnabled) { + this.textAnswerEnabled = textAnswerEnabled; + } + + @ApiModelProperty(required = true, value = "true for disabled voting") + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isVotingDisabled() { + return votingDisabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setVotingDisabled(boolean votingDisabled) { + this.votingDisabled = votingDisabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getHint() { + return hint; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setHint(String hint) { + this.hint = hint; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getSolution() { + return solution; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSolution(String solution) { + this.solution = solution; + } + + @Override + public final String toString() { + return "Content type '" + questionType + "': " + subject + ";\n" + text + possibleAnswers; + } + + @Override + public int hashCode() { + // auto generated! + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + // auto generated! + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Content other = (Content) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + return true; + } + + public int calculateValue(Answer answer) { + if (answer.isAbstention()) { + return 0; + } else if ("mc".equals(this.questionType)) { + return calculateMultipleChoiceValue(answer); + } else if ("grid".equals(this.questionType)) { + return calculateGridValue(answer); + } else { + return calculateRegularValue(answer); + } + } + + public String checkCaseSensitive(String answerText) { + if (this.isIgnoreCaseSensitive()) { + this.setCorrectAnswer(this.getCorrectAnswer().toLowerCase()); + return answerText.toLowerCase(); + } + return answerText; + } + public String checkWhitespaces(String answerText) { + if (this.isIgnoreWhitespaces()) { + this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("[\\s]", "")); + return answerText.replaceAll("[\\s]", ""); + } + return answerText; + } + public String checkPunctuation(String answerText) { + if (this.isIgnorePunctuation()) { + this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("\\p{Punct}", "")); + return answerText.replaceAll("\\p{Punct}", ""); + } + return answerText; + } + + public void checkTextStrictOptions(Answer answer) { + answer.setAnswerTextRaw(this.checkCaseSensitive(answer.getAnswerTextRaw())); + answer.setAnswerTextRaw(this.checkPunctuation(answer.getAnswerTextRaw())); + answer.setAnswerTextRaw(this.checkWhitespaces(answer.getAnswerTextRaw())); + } + + public int evaluateCorrectAnswerFixedText(String answerTextRaw) { + if (answerTextRaw != null) { + if (answerTextRaw.equals(this.getCorrectAnswer())) { + return this.getRating(); + } + } + return 0; + } + + public boolean isSuccessfulFreeTextAnswer(String answerTextRaw) { + return answerTextRaw != null && answerTextRaw.equals(this.getCorrectAnswer()); + } + + public void updateRoundStartVariables(Date start, Date end) { + if (this.getPiRound() == 1 && this.isPiRoundFinished()) { + this.setPiRound(2); + } + + this.setActive(true); + this.setShowAnswer(false); + this.setPiRoundActive(true); + this.setShowStatistic(false); + this.setVotingDisabled(false); + this.setPiRoundFinished(false); + this.setPiRoundStartTime(start.getTime()); + this.setPiRoundEndTime(end.getTime()); + } + + public void updateRoundManagementState() { + final long time = new Date().getTime(); + + if (time > this.getPiRoundEndTime() && this.isPiRoundActive()) { + this.setPiRoundEndTime(0); + this.setPiRoundStartTime(0); + this.setPiRoundActive(false); + this.setPiRoundFinished(true); + } + } + + public void resetRoundManagementState() { + this.setPiRoundEndTime(0); + this.setPiRoundStartTime(0); + this.setVotingDisabled(true); + this.setPiRoundActive(false); + this.setPiRoundFinished(false); + this.setShowStatistic(false); + this.setShowAnswer(false); + } + + public void resetQuestionState() { + this.setPiRoundEndTime(0); + this.setPiRoundStartTime(0); + this.setPiRoundActive(false); + this.setPiRoundFinished(false); + this.setVotingDisabled(false); + + if ("freetext".equals(this.getQuestionType())) { + this.setPiRound(0); + } else { + this.setPiRound(1); + } + } + + private int calculateRegularValue(Answer answer) { + String answerText = answer.getAnswerText(); + for (AnswerOption p : this.possibleAnswers) { + if (answerText.equals(p.getText())) { + return p.getValue(); + } + } + return 0; + } + + private int calculateGridValue(Answer answer) { + int value = 0; + String[] answers = answer.getAnswerText().split(","); + for (String a : answers) { + for (AnswerOption p : this.possibleAnswers) { + if (a.equals(p.getText())) { + value += p.getValue(); + } + } + } + return value; + } + + private int calculateMultipleChoiceValue(Answer answer) { + int value = 0; + String[] answers = answer.getAnswerText().split(","); + for (int i = 0; i < this.possibleAnswers.size() && i < answers.length; i++) { + if ("1".equals(answers[i])) { + AnswerOption p = this.possibleAnswers.get(i); + value += p.getValue(); + } + } + return value; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java index 848955229..6993b84f1 100644 --- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java +++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java @@ -20,13 +20,13 @@ package de.thm.arsnova.entities.serialization; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.Converter; -import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.Comment; import de.thm.arsnova.entities.DbUser; import de.thm.arsnova.entities.Entity; import de.thm.arsnova.entities.LogEntry; import de.thm.arsnova.entities.Motd; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.MotdList; import de.thm.arsnova.entities.Session; diff --git a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java index 6e0346f8f..be1b1e6ba 100644 --- a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java +++ b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java @@ -17,8 +17,8 @@ */ package de.thm.arsnova.entities.transport; -import de.thm.arsnova.entities.Answer; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; diff --git a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java index fed5f051f..5ebaca6e1 100644 --- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java +++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java @@ -18,9 +18,9 @@ package de.thm.arsnova.entities.transport; import com.fasterxml.jackson.annotation.JsonView; -import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Motd; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.SessionFeature; diff --git a/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java b/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java index 5b303ac42..bda39f5d8 100644 --- a/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java +++ b/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java b/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java index 2cf1a8313..d9a735008 100644 --- a/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java +++ b/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java b/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java index 506ae9183..26a74e126 100644 --- a/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java +++ b/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java b/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java index 85d501ed0..cfe6bf95d 100644 --- a/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java +++ b/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/events/LockVoteEvent.java b/src/main/java/de/thm/arsnova/events/LockVoteEvent.java index 4cdf67968..f55f84de1 100644 --- a/src/main/java/de/thm/arsnova/events/LockVoteEvent.java +++ b/src/main/java/de/thm/arsnova/events/LockVoteEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.HashMap; diff --git a/src/main/java/de/thm/arsnova/events/LockVotesEvent.java b/src/main/java/de/thm/arsnova/events/LockVotesEvent.java index fc469749f..a4c4d5b42 100644 --- a/src/main/java/de/thm/arsnova/events/LockVotesEvent.java +++ b/src/main/java/de/thm/arsnova/events/LockVotesEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java index 649e241ef..94ccc2488 100644 --- a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java +++ b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java @@ -17,8 +17,8 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Answer; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; diff --git a/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java b/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java index 4b638229b..1176a3f9b 100644 --- a/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java +++ b/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java index 48fb6796d..79abfeb0f 100644 --- a/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java +++ b/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java index 26da09430..ec93fff87 100644 --- a/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java +++ b/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.HashMap; diff --git a/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java index edaa084e8..868996e0b 100644 --- a/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java +++ b/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.HashMap; diff --git a/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java index 3ff1a9d81..d869b20ec 100644 --- a/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java +++ b/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.HashMap; diff --git a/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java b/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java index f38fe0af5..e5bc95e89 100644 --- a/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java +++ b/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; /** diff --git a/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java b/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java index 53ccddeba..555349b43 100644 --- a/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java +++ b/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java b/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java index 605defea4..109555edd 100644 --- a/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java +++ b/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.HashMap; diff --git a/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java b/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java index bbdd513ae..83bd98bf1 100644 --- a/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java +++ b/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.events; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java index 67db63626..6e3e0ff33 100644 --- a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.persistance; -import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.User; import org.springframework.data.repository.CrudRepository; diff --git a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java index 9dbef6ce1..5e0113d1e 100644 --- a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java @@ -1,6 +1,6 @@ package de.thm.arsnova.persistance; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.User; import org.springframework.data.repository.CrudRepository; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java index 96f8e43ed..6488e5931 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java @@ -2,7 +2,7 @@ package de.thm.arsnova.persistance.couchdb; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Lists; -import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.User; import de.thm.arsnova.persistance.AnswerRepository; import de.thm.arsnova.persistance.LogEntryRepository; @@ -11,7 +11,6 @@ import org.ektorp.ComplexKey; import org.ektorp.CouchDbConnector; import org.ektorp.DbAccessException; import org.ektorp.DocumentOperationResult; -import org.ektorp.UpdateConflictException; import org.ektorp.ViewResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java index ab9934fd1..85ae69218 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java @@ -1,6 +1,6 @@ package de.thm.arsnova.persistance.couchdb; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.User; import de.thm.arsnova.persistance.ContentRepository; import de.thm.arsnova.persistance.LogEntryRepository; diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java index b20639d86..965073a35 100644 --- a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java +++ b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java @@ -18,7 +18,7 @@ package de.thm.arsnova.security; import de.thm.arsnova.entities.Comment; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; import de.thm.arsnova.persistance.CommentRepository; diff --git a/src/main/java/de/thm/arsnova/services/ContentService.java b/src/main/java/de/thm/arsnova/services/ContentService.java index 9dbb6db5f..406de8ef7 100644 --- a/src/main/java/de/thm/arsnova/services/ContentService.java +++ b/src/main/java/de/thm/arsnova/services/ContentService.java @@ -17,8 +17,8 @@ */ package de.thm.arsnova.services; -import de.thm.arsnova.entities.Answer; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.User; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java index 7c2c92a9b..fc1d060fb 100644 --- a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java @@ -20,8 +20,8 @@ package de.thm.arsnova.services; import de.thm.arsnova.entities.transport.AnswerQueueElement; import de.thm.arsnova.persistance.LogEntryRepository; import de.thm.arsnova.util.ImageUtils; -import de.thm.arsnova.entities.Answer; -import de.thm.arsnova.entities.Content; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.Session; import de.thm.arsnova.entities.User; import de.thm.arsnova.events.*; diff --git a/src/main/java/de/thm/arsnova/util/ImageUtils.java b/src/main/java/de/thm/arsnova/util/ImageUtils.java index 9b79795b5..bdfdfc272 100644 --- a/src/main/java/de/thm/arsnova/util/ImageUtils.java +++ b/src/main/java/de/thm/arsnova/util/ImageUtils.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.util; -import de.thm.arsnova.entities.Answer; +import de.thm.arsnova.entities.migration.v2.Answer; import org.apache.commons.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java index 6ceddaa77..9c3f88c20 100644 --- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java +++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java @@ -444,9 +444,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova broadcastInSession(session.getKeyword(), "audQuestionAvail", audienceQuestion.getId()); } - public void reportLecturerQuestionAvailable(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.Content> qs) { + public void reportLecturerQuestionAvailable(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.migration.v2.Content> qs) { List<Content> contents = new ArrayList<>(); - for (de.thm.arsnova.entities.Content q : qs) { + for (de.thm.arsnova.entities.migration.v2.Content q : qs) { contents.add(new Content(q)); } @@ -457,9 +457,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova broadcastInSession(session.getKeyword(), "lecturerQuestionAvailable", contents); } - public void reportLecturerQuestionsLocked(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.Content> qs) { + public void reportLecturerQuestionsLocked(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.migration.v2.Content> qs) { List<Content> contents = new ArrayList<>(); - for (de.thm.arsnova.entities.Content q : qs) { + for (de.thm.arsnova.entities.migration.v2.Content q : qs) { contents.add(new Content(q)); } broadcastInSession(session.getKeyword(), "lecturerQuestionLocked", contents); @@ -525,7 +525,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova broadcastInSession(sessionKey, "countPreparationQuestionAnswers", contentService.countPreparationQuestionAnswersInternal(sessionKey)); // Update the unanswered count for the content variant that was answered. - final de.thm.arsnova.entities.Content content = event.getContent(); + final de.thm.arsnova.entities.migration.v2.Content content = event.getContent(); if ("lecture".equals(content.getQuestionVariant())) { sendToUser(event.getUser(), "unansweredLecturerQuestions", contentService.getUnAnsweredLectureQuestionIds(sessionKey, event.getUser())); } else if ("preparation".equals(content.getQuestionVariant())) { @@ -589,7 +589,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova @Override public void visit(LockVotesEvent event) { List<Content> contents = new ArrayList<>(); - for (de.thm.arsnova.entities.Content q : event.getQuestions()) { + for (de.thm.arsnova.entities.migration.v2.Content q : event.getQuestions()) { contents.add(new Content(q)); } broadcastInSession(event.getSession().getKeyword(), "lockVotes", contents); @@ -598,7 +598,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova @Override public void visit(UnlockVotesEvent event) { List<Content> contents = new ArrayList<>(); - for (de.thm.arsnova.entities.Content q : event.getQuestions()) { + for (de.thm.arsnova.entities.migration.v2.Content q : event.getQuestions()) { contents.add(new Content(q)); } broadcastInSession(event.getSession().getKeyword(), "unlockVotes", contents); diff --git a/src/main/java/de/thm/arsnova/websocket/message/Content.java b/src/main/java/de/thm/arsnova/websocket/message/Content.java index 6344dd3eb..6a2ec724e 100644 --- a/src/main/java/de/thm/arsnova/websocket/message/Content.java +++ b/src/main/java/de/thm/arsnova/websocket/message/Content.java @@ -25,7 +25,7 @@ public class Content { private final String _id; private final String variant; - public Content(de.thm.arsnova.entities.Content content) { + public Content(de.thm.arsnova.entities.migration.v2.Content content) { this._id = content.getId(); this.variant = content.getQuestionVariant(); } diff --git a/src/test/java/de/thm/arsnova/entities/ContentTest.java b/src/test/java/de/thm/arsnova/entities/ContentTest.java index fa3e4dc70..2cacd43a1 100644 --- a/src/test/java/de/thm/arsnova/entities/ContentTest.java +++ b/src/test/java/de/thm/arsnova/entities/ContentTest.java @@ -17,6 +17,9 @@ */ package de.thm.arsnova.entities; +import de.thm.arsnova.entities.migration.v2.Answer; +import de.thm.arsnova.entities.migration.v2.AnswerOption; +import de.thm.arsnova.entities.migration.v2.Content; import org.junit.Test; import java.util.ArrayList; @@ -28,17 +31,17 @@ public class ContentTest { @SuppressWarnings("serial") @Test public void shouldComputeBasedOnCorrectAnswerWithExactMatch() { - final PossibleAnswer p1 = new PossibleAnswer(); + final AnswerOption p1 = new AnswerOption(); p1.setText("Yes"); p1.setCorrect(true); p1.setValue(10); - final PossibleAnswer p2 = new PossibleAnswer(); + final AnswerOption p2 = new AnswerOption(); p2.setText("No"); p2.setCorrect(false); p2.setValue(-10); Content q = new Content(); q.setQuestionType("yesno"); - q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{ + q.setPossibleAnswers(new ArrayList<AnswerOption>() {{ add(p1); add(p2); }}); @@ -54,17 +57,17 @@ public class ContentTest { @SuppressWarnings("serial") @Test public void shouldEqualAbstentionToZeroValue() { - final PossibleAnswer p1 = new PossibleAnswer(); + final AnswerOption p1 = new AnswerOption(); p1.setText("Yes"); p1.setCorrect(true); p1.setValue(10); - final PossibleAnswer p2 = new PossibleAnswer(); + final AnswerOption p2 = new AnswerOption(); p2.setText("No"); p2.setCorrect(false); p2.setValue(-10); Content q = new Content(); q.setAbstention(true); - q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{ + q.setPossibleAnswers(new ArrayList<AnswerOption>() {{ add(p1); add(p2); }}); @@ -77,21 +80,21 @@ public class ContentTest { @SuppressWarnings("serial") @Test public void shouldCalculateMultipleChoiceAnswers() { - final PossibleAnswer p1 = new PossibleAnswer(); + final AnswerOption p1 = new AnswerOption(); p1.setText("Yes"); p1.setCorrect(true); p1.setValue(10); - final PossibleAnswer p2 = new PossibleAnswer(); + final AnswerOption p2 = new AnswerOption(); p2.setText("No"); p2.setCorrect(false); p2.setValue(-10); - final PossibleAnswer p3 = new PossibleAnswer(); + final AnswerOption p3 = new AnswerOption(); p3.setText("Maybe"); p3.setCorrect(true); p3.setValue(10); Content q = new Content(); q.setQuestionType("mc"); - q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{ + q.setPossibleAnswers(new ArrayList<AnswerOption>() {{ add(p1); add(p2); add(p3); @@ -118,25 +121,25 @@ public class ContentTest { @SuppressWarnings("serial") @Test public void shouldCalculatePictureQuestionAnswers() { - final PossibleAnswer p1 = new PossibleAnswer(); + final AnswerOption p1 = new AnswerOption(); p1.setText("0;0"); p1.setCorrect(true); p1.setValue(10); - final PossibleAnswer p2 = new PossibleAnswer(); + final AnswerOption p2 = new AnswerOption(); p2.setText("0;1"); p2.setCorrect(false); p2.setValue(-10); - final PossibleAnswer p3 = new PossibleAnswer(); + final AnswerOption p3 = new AnswerOption(); p3.setText("1;0"); p3.setCorrect(true); p3.setValue(10); - final PossibleAnswer p4 = new PossibleAnswer(); + final AnswerOption p4 = new AnswerOption(); p4.setText("1;1"); p4.setCorrect(true); p4.setValue(10); Content q = new Content(); q.setQuestionType("grid"); - q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{ + q.setPossibleAnswers(new ArrayList<AnswerOption>() {{ add(p1); add(p2); add(p3); -- GitLab