From 85cedefb6c5f3cc502775e243153401f65d4d0b9 Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Tue, 19 Sep 2017 14:47:14 +0200 Subject: [PATCH] Add additional entities and entity properties for API v3 Introduced content groups which replace question variants and support sorting. --- .../java/de/thm/arsnova/entities/Answer.java | 45 +++ .../arsnova/entities/AnswerStatistics.java | 95 ++++++ .../java/de/thm/arsnova/entities/Comment.java | 20 +- .../java/de/thm/arsnova/entities/Content.java | 113 ++++++- .../de/thm/arsnova/entities/Feedback.java | 2 +- .../de/thm/arsnova/entities/LogEntry.java | 18 +- .../thm/arsnova/entities/MigrationState.java | 84 +++++ .../java/de/thm/arsnova/entities/Motd.java | 8 +- .../java/de/thm/arsnova/entities/Room.java | 290 ++++++++++++++++++ .../thm/arsnova/entities/RoomStatistics.java | 19 +- .../de/thm/arsnova/entities/ScoreOptions.java | 6 +- .../arsnova/entities/ServiceDescription.java | 18 +- .../de/thm/arsnova/entities/Statistics.java | 10 +- .../de/thm/arsnova/entities/TextAnswer.java | 28 +- .../arsnova/entities/UserAuthentication.java | 31 +- .../de/thm/arsnova/entities/UserProfile.java | 67 ++-- .../entities/migration/FromV2Migrator.java | 17 +- .../entities/migration/ToV2Migrator.java | 4 +- 18 files changed, 783 insertions(+), 92 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/entities/AnswerStatistics.java create mode 100644 src/main/java/de/thm/arsnova/entities/MigrationState.java diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index fc2fd9acb..f564ff3cb 100644 --- a/src/main/java/de/thm/arsnova/entities/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/Answer.java @@ -3,10 +3,16 @@ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.Map; + public abstract class Answer implements Entity { private String id; private String rev; private String contentId; + private String roomId; + private String creatorId; + private int round; + private Map<String, Map<String, ?>> extensions; @Override @JsonView({View.Persistence.class, View.Public.class}) @@ -41,4 +47,43 @@ public abstract class Answer implements Entity { public void setContentId(final String contentId) { this.contentId = contentId; } + + @JsonView(View.Persistence.class) + public String getRoomId() { + return roomId; + } + + @JsonView(View.Persistence.class) + public void setRoomId(String roomId) { + this.roomId = roomId; + } + + @JsonView(View.Persistence.class) + public String getCreatorId() { + return creatorId; + } + + public void setCreatorId(final String creatorId) { + this.creatorId = creatorId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public int getRound() { + return round; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRound(final int round) { + this.round = round; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, Map<String, ?>> getExtensions() { + return extensions; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setExtensions(Map<String, Map<String, ?>> extensions) { + this.extensions = extensions; + } } diff --git a/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java b/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java new file mode 100644 index 000000000..17bfd208d --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java @@ -0,0 +1,95 @@ +package de.thm.arsnova.entities; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.serialization.View; + +import java.util.List; + +public class AnswerStatistics { + public class RoundStatistics { + public class Combination { + private int[] selectedChoiceIndexes; + private int count; + } + + private int round; + private int[] independentCounts; + private List<Combination> combinatedCounts; + private int abstentionCount; + + @JsonView(View.Public.class) + public int getRound() { + return round; + } + + public void setRound(int round) { + this.round = round; + } + + @JsonView(View.Public.class) + public int[] getIndependentCounts() { + return independentCounts; + } + + public void setIndependentCounts(final int[] independentCounts) { + this.independentCounts = independentCounts; + } + + @JsonView(View.Public.class) + public List<Combination> getCombinatedCounts() { + return combinatedCounts; + } + + public void setCombinatedCounts(List<Combination> combinatedCounts) { + this.combinatedCounts = combinatedCounts; + } + + @JsonView(View.Public.class) + public int getAbstentionCount() { + return abstentionCount; + } + + public void setAbstentionCount(int abstentionCount) { + this.abstentionCount = abstentionCount; + } + } + + public class RoundTransition { + private int roundA; + private int roundB; + private int[] selectedChoiceIndexesA; + private int[] selectedChoiceIndexesB; + private int count; + } + + private String contentId; + private List<RoundStatistics> roundStatistics; + private List<RoundTransition> roundTransitions; + + @JsonView(View.Public.class) + public String getContentId() { + return contentId; + } + + public void setContentId(final String contentId) { + this.contentId = contentId; + } + + @JsonView(View.Public.class) + public List<RoundStatistics> getRoundStatistics() { + return roundStatistics; + } + + public void setRoundStatistics(List<RoundStatistics> roundStatistics) { + this.roundStatistics = roundStatistics; + } + + @JsonView(View.Public.class) + public List<RoundTransition> getRoundTransitions() { + return roundTransitions; + } + + public void setRoundTransitions(List<RoundTransition> roundTransitions) { + this.roundTransitions = roundTransitions; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/Comment.java b/src/main/java/de/thm/arsnova/entities/Comment.java index 4d692bce7..976691b03 100644 --- a/src/main/java/de/thm/arsnova/entities/Comment.java +++ b/src/main/java/de/thm/arsnova/entities/Comment.java @@ -3,6 +3,9 @@ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.Date; +import java.util.Map; + public class Comment implements Entity { private String id; private String rev; @@ -10,8 +13,9 @@ public class Comment implements Entity { private String creatorId; private String subject; private String body; - private long timestamp; + private Date timestamp; private boolean read; + private Map<String, Map<String, ?>> extensions; @Override @JsonView({View.Persistence.class, View.Public.class}) @@ -78,12 +82,12 @@ public class Comment implements Entity { } @JsonView({View.Persistence.class, View.Public.class}) - public long getTimestamp() { + public Date getTimestamp() { return timestamp; } @JsonView(View.Persistence.class) - public void setTimestamp(final long timestamp) { + public void setTimestamp(final Date timestamp) { this.timestamp = timestamp; } @@ -96,4 +100,14 @@ public class Comment implements Entity { public void setRead(final boolean read) { this.read = read; } + + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, Map<String, ?>> getExtensions() { + return extensions; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setExtensions(Map<String, Map<String, ?>> extensions) { + this.extensions = extensions; + } } diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java index 9996784d4..c75c5d4ae 100644 --- a/src/main/java/de/thm/arsnova/entities/Content.java +++ b/src/main/java/de/thm/arsnova/entities/Content.java @@ -3,7 +3,79 @@ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.Date; +import java.util.Map; + public class Content implements Entity { + public class State { + private int round = 1; + private Date roundEndTimestamp; + private boolean visible = true; + private boolean solutionVisible = false; + private boolean responsesEnabled = true; + private boolean responsesVisible = false; + + @JsonView({View.Persistence.class, View.Public.class}) + public int getRound() { + return round; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRound(final int round) { + this.round = round; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Date getRoundEndTimestamp() { + return roundEndTimestamp; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setRoundEndTimestamp(Date roundEndTimestamp) { + this.roundEndTimestamp = roundEndTimestamp; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isVisible() { + return visible; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isSolutionVisible() { + return solutionVisible; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSolutionVisible(final boolean solutionVisible) { + this.solutionVisible = solutionVisible; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setVisible(final boolean visible) { + this.visible = visible; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean areResponsesEnabled() { + return responsesEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setResponsesEnabled(final boolean responsesEnabled) { + this.responsesEnabled = responsesEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean areResponsesVisible() { + return responsesVisible; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setResponsesVisible(final boolean responsesVisible) { + this.responsesVisible = responsesVisible; + } + } + private String id; private String rev; private String roomId; @@ -11,6 +83,9 @@ public class Content implements Entity { private String body; private String format; private String group; + private State state; + private Date timestamp; + private Map<String, Map<String, ?>> extensions; @Override @JsonView({View.Persistence.class, View.Public.class}) @@ -76,13 +151,47 @@ public class Content implements Entity { this.format = format; } - @JsonView({View.Persistence.class, View.Public.class}) + @JsonView(View.Public.class) public String getGroup() { return group; } - @JsonView({View.Persistence.class, View.Public.class}) + @JsonView(View.Public.class) public void setGroup(final String group) { this.group = group; } + + @JsonView({View.Persistence.class, View.Public.class}) + public State getState() { + return state; + } + + public void resetState() { + this.state = new State(); + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setState(final State state) { + this.state = state; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Date getTimestamp() { + return timestamp; + } + + @JsonView(View.Persistence.class) + public void setTimestamp(Date timestamp) { + this.timestamp = timestamp; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, Map<String, ?>> getExtensions() { + return extensions; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setExtensions(Map<String, Map<String, ?>> extensions) { + this.extensions = extensions; + } } diff --git a/src/main/java/de/thm/arsnova/entities/Feedback.java b/src/main/java/de/thm/arsnova/entities/Feedback.java index b46616432..235260cd1 100644 --- a/src/main/java/de/thm/arsnova/entities/Feedback.java +++ b/src/main/java/de/thm/arsnova/entities/Feedback.java @@ -51,7 +51,7 @@ public class Feedback { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj == null) { return false; } diff --git a/src/main/java/de/thm/arsnova/entities/LogEntry.java b/src/main/java/de/thm/arsnova/entities/LogEntry.java index eabb1fcea..21a0fb808 100644 --- a/src/main/java/de/thm/arsnova/entities/LogEntry.java +++ b/src/main/java/de/thm/arsnova/entities/LogEntry.java @@ -57,13 +57,13 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setRevision(final String rev) { - this.rev = rev; + public String getRevision() { + return rev; } @JsonView(View.Persistence.class) - public String getRevision() { - return rev; + public void setRevision(final String rev) { + this.rev = rev; } @JsonView(View.Persistence.class) @@ -72,7 +72,7 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setTimestamp(long timestamp) { + public void setTimestamp(final long timestamp) { this.timestamp = timestamp; } @@ -82,7 +82,7 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setEvent(String event) { + public void setEvent(final String event) { this.event = event; } @@ -92,12 +92,12 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setLevel(int level) { + public void setLevel(final int level) { this.level = level; } @JsonView(View.Persistence.class) - public void setLevel(LogLevel level) { + public void setLevel(final LogLevel level) { this.level = level.ordinal(); } @@ -107,7 +107,7 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setPayload(Map<String, Object> payload) { + public void setPayload(final Map<String, Object> payload) { this.payload = payload; } } diff --git a/src/main/java/de/thm/arsnova/entities/MigrationState.java b/src/main/java/de/thm/arsnova/entities/MigrationState.java new file mode 100644 index 000000000..56762825f --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/MigrationState.java @@ -0,0 +1,84 @@ +package de.thm.arsnova.entities; + +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.serialization.View; + +import java.util.Date; +import java.util.List; + +public class MigrationState implements Entity { + public class Migration { + private String id; + private Date start; + + public Migration(String id, Date start) { + this.id = id; + this.start = start; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getId() { + return id; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Date getStart() { + return start; + } + } + + private String id = "MigrationState"; + private String rev; + private Migration active; + private List<String> completed; + + @Override + @JsonView(View.Persistence.class) + public String getId() { + return id; + } + + @Override + @JsonView(View.Persistence.class) + public void setId(final String id) { + if (!id.equals(this.id)) { + throw new IllegalArgumentException("ID of this entity must not be changed."); + }; + } + + @Override + @JsonView({View.Persistence.class, View.Public.class}) + public String getRevision() { + return rev; + } + + @Override + @JsonView(View.Persistence.class) + public void setRevision(final String rev) { + this.rev = rev; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Migration getActive() { + return active; + } + + @JsonView(View.Persistence.class) + public void setActive(final Migration active) { + this.active = active; + } + + public void setActive(final String id, final Date start) { + this.setActive(new Migration(id, start)); + } + + @JsonView({View.Persistence.class, View.Public.class}) + public List<String> getCompleted() { + return completed; + } + + @JsonView(View.Persistence.class) + public void setCompleted(final List<String> completed) { + this.completed = completed; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/Motd.java b/src/main/java/de/thm/arsnova/entities/Motd.java index 7f19e477e..6dd90bffc 100644 --- a/src/main/java/de/thm/arsnova/entities/Motd.java +++ b/src/main/java/de/thm/arsnova/entities/Motd.java @@ -103,7 +103,7 @@ public class Motd implements Entity { } @JsonView({View.Persistence.class, View.Public.class}) - public void setAudience(String a) { + public void setAudience(final String a) { audience = a; } @@ -113,7 +113,7 @@ public class Motd implements Entity { } @JsonView({View.Persistence.class, View.Public.class}) - public void setSessionId(String sessionId) { + public void setSessionId(final String sessionId) { this.sessionId = sessionId; } @@ -124,7 +124,7 @@ public class Motd implements Entity { } @JsonView({View.Persistence.class, View.Public.class}) - public void setSessionkey(String a) { + public void setSessionkey(final String a) { sessionkey = a; } @@ -159,7 +159,7 @@ public class Motd implements Entity { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj == null || !obj.getClass().equals(this.getClass())) { return false; } diff --git a/src/main/java/de/thm/arsnova/entities/Room.java b/src/main/java/de/thm/arsnova/entities/Room.java index b782afb6b..32d71fee8 100644 --- a/src/main/java/de/thm/arsnova/entities/Room.java +++ b/src/main/java/de/thm/arsnova/entities/Room.java @@ -3,14 +3,244 @@ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.List; +import java.util.Map; + public class Room implements Entity { + public class ContentGroup { + private List<String> contentIds; + private boolean autoSort; + + @JsonView({View.Persistence.class, View.Public.class}) + public List<String> getContentIds() { + return contentIds; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setContentIds(final List<String> contentIds) { + this.contentIds = contentIds; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isAutoSort() { + return autoSort; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAutoSort(final boolean autoSort) { + this.autoSort = autoSort; + } + } + + public class Settings { + private boolean questionsEnabled = true; + private boolean slidesEnabled = true; + private boolean commentsEnabled = true; + private boolean flashcardsEnabled = true; + private boolean livevoteEnabled = true; + private boolean scoreEnabled = true; + private boolean multipleRoundsEnabled = true; + private boolean timerEnabled = true; + private boolean feedbackLocked = false; + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isQuestionsEnabled() { + return questionsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setQuestionsEnabled(final boolean questionsEnabled) { + this.questionsEnabled = questionsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isSlidesEnabled() { + return slidesEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSlidesEnabled(final boolean slidesEnabled) { + this.slidesEnabled = slidesEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isCommentsEnabled() { + return commentsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setCommentsEnabled(final boolean commentsEnabled) { + this.commentsEnabled = commentsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isFlashcardsEnabled() { + return flashcardsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setFlashcardsEnabled(final boolean flashcardsEnabled) { + this.flashcardsEnabled = flashcardsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isLivevoteEnabled() { + return livevoteEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setLivevoteEnabled(boolean livevoteEnabled) { + this.livevoteEnabled = livevoteEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isScoreEnabled() { + return scoreEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setScoreEnabled(final boolean scoreEnabled) { + this.scoreEnabled = scoreEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isMultipleRoundsEnabled() { + return multipleRoundsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setMultipleRoundsEnabled(final boolean multipleRoundsEnabled) { + this.multipleRoundsEnabled = multipleRoundsEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isTimerEnabled() { + return timerEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setTimerEnabled(final boolean timerEnabled) { + this.timerEnabled = timerEnabled; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public boolean isFeedbackLocked() { + return feedbackLocked; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setFeedbackLocked(final boolean feedbackLocked) { + this.feedbackLocked = feedbackLocked; + } + } + + public class Author { + private String name; + private String mail; + private String organizationName; + private String organizationLogo; + private String organizationUnit; + + @JsonView({View.Persistence.class, View.Public.class}) + public String getName() { + return name; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setName(final String name) { + this.name = name; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getMail() { + return mail; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setMail(final String mail) { + this.mail = mail; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getOrganizationName() { + return organizationName; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOrganizationName(final String organizationName) { + this.organizationName = organizationName; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getOrganizationLogo() { + return organizationLogo; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOrganizationLogo(final String organizationLogo) { + this.organizationLogo = organizationLogo; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getOrganizationUnit() { + return organizationUnit; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setOrganizationUnit(final String organizationUnit) { + this.organizationUnit = organizationUnit; + } + } + + public class PoolProperties { + private String category; + private String level; + private String license; + + @JsonView({View.Persistence.class, View.Public.class}) + public String getCategory() { + return category; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setCategory(final String category) { + this.category = category; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getLevel() { + return level; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setLevel(final String level) { + this.level = level; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getLicense() { + return license; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setLicense(final String license) { + this.license = license; + } + } + private String id; private String rev; private String shortId; private String ownerId; private String name; private String abbreviation; + private String description; private boolean closed; + private Map<String, ContentGroup> contentGroups; + private Settings settings; + private Author author; + private PoolProperties poolProperties; + private Map<String, Map<String, ?>> extensions; private RoomStatistics statistics; @Override @@ -77,6 +307,16 @@ public class Room implements Entity { this.abbreviation = abbreviation; } + @JsonView({View.Persistence.class, View.Public.class}) + public String getDescription() { + return description; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setDescription(final String description) { + this.description = description; + } + @JsonView({View.Persistence.class, View.Public.class}) public boolean isClosed() { return closed; @@ -87,6 +327,56 @@ public class Room implements Entity { this.closed = closed; } + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, ContentGroup> getContentGroups() { + return contentGroups; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setContentGroups(final Map<String, ContentGroup> contentGroups) { + this.contentGroups = contentGroups; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Settings getSettings() { + return settings; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSettings(Settings settings) { + this.settings = settings; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Author getAuthor() { + return author; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAuthor(final Author author) { + this.author = author; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public PoolProperties getPoolProperties() { + return poolProperties; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setPoolProperties(final PoolProperties poolProperties) { + this.poolProperties = poolProperties; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, Map<String, ?>> getExtensions() { + return extensions; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setExtensions(final Map<String, Map<String, ?>> extensions) { + this.extensions = extensions; + } + @JsonView(View.Public.class) public RoomStatistics getStatistics() { return statistics; diff --git a/src/main/java/de/thm/arsnova/entities/RoomStatistics.java b/src/main/java/de/thm/arsnova/entities/RoomStatistics.java index fdba8fb2b..ba07a03d7 100644 --- a/src/main/java/de/thm/arsnova/entities/RoomStatistics.java +++ b/src/main/java/de/thm/arsnova/entities/RoomStatistics.java @@ -5,13 +5,20 @@ import de.thm.arsnova.entities.serialization.View; public class RoomStatistics { private int contentCount = 0; + private int unansweredContentCount = 0; private int answerCount = 0; private int unreadAnswerCount = 0; private int commentCount = 0; private int unreadCommentCount = 0; - public RoomStatistics() { + @JsonView(View.Public.class) + public int getUnansweredContentCount() { + return unansweredContentCount; + } + @JsonView(View.Public.class) + public void setUnansweredContentCount(final int unansweredContentCount) { + this.unansweredContentCount = unansweredContentCount; } @JsonView(View.Public.class) @@ -19,7 +26,7 @@ public class RoomStatistics { return contentCount; } - public void setContentCount(int contentCount) { + public void setContentCount(final int contentCount) { this.contentCount = contentCount; } @@ -28,7 +35,7 @@ public class RoomStatistics { return answerCount; } - public void setAnswerCount(int answerCount) { + public void setAnswerCount(final int answerCount) { this.answerCount = answerCount; } @@ -37,7 +44,7 @@ public class RoomStatistics { return unreadAnswerCount; } - public void setUnreadAnswerCount(int unreadAnswerCount) { + public void setUnreadAnswerCount(final int unreadAnswerCount) { this.unreadAnswerCount = unreadAnswerCount; } @@ -46,7 +53,7 @@ public class RoomStatistics { return commentCount; } - public void setCommentCount(int commentCount) { + public void setCommentCount(final int commentCount) { this.commentCount = commentCount; } @@ -55,7 +62,7 @@ public class RoomStatistics { return unreadCommentCount; } - public void setUnreadCommentCount(int unreadCommentCount) { + public void setUnreadCommentCount(final int unreadCommentCount) { this.unreadCommentCount = unreadCommentCount; } } diff --git a/src/main/java/de/thm/arsnova/entities/ScoreOptions.java b/src/main/java/de/thm/arsnova/entities/ScoreOptions.java index 4b032b102..e5559970d 100644 --- a/src/main/java/de/thm/arsnova/entities/ScoreOptions.java +++ b/src/main/java/de/thm/arsnova/entities/ScoreOptions.java @@ -34,7 +34,7 @@ public class ScoreOptions implements Serializable { private String questionVariant = ""; - public ScoreOptions(ScoreOptions scoreOptions) { + public ScoreOptions(final ScoreOptions scoreOptions) { this(); this.type = scoreOptions.getType(); this.questionVariant = scoreOptions.getQuestionVariant(); @@ -49,7 +49,7 @@ public class ScoreOptions implements Serializable { } @JsonView({View.Persistence.class, View.Public.class}) - public void setType(String type) { + public void setType(final String type) { this.type = type; } @@ -60,7 +60,7 @@ public class ScoreOptions implements Serializable { } @JsonView({View.Persistence.class, View.Public.class}) - public void setQuestionVariant(String questionVariant) { + public void setQuestionVariant(final String questionVariant) { this.questionVariant = questionVariant; } } diff --git a/src/main/java/de/thm/arsnova/entities/ServiceDescription.java b/src/main/java/de/thm/arsnova/entities/ServiceDescription.java index 33c159958..c6546a724 100644 --- a/src/main/java/de/thm/arsnova/entities/ServiceDescription.java +++ b/src/main/java/de/thm/arsnova/entities/ServiceDescription.java @@ -31,20 +31,20 @@ public class ServiceDescription { private int order = 0; private String[] allowedRoles; - public ServiceDescription(String id, String name, String dialogUrl) { + public ServiceDescription(final String id, final String name, final String dialogUrl) { this.id = id; this.name = name; this.dialogUrl = dialogUrl; } - public ServiceDescription(String id, String name, String dialogUrl, String[] allowedRoles) { + public ServiceDescription(final String id, final String name, final String dialogUrl, final String[] allowedRoles) { this.id = id; this.name = name; this.dialogUrl = dialogUrl; this.allowedRoles = allowedRoles; } - public ServiceDescription(String id, String name, String dialogUrl, String[] allowedRoles, String image) { + public ServiceDescription(final String id, final String name, final String dialogUrl, final String[] allowedRoles, final String image) { this.id = id; this.name = name; this.dialogUrl = dialogUrl; @@ -59,7 +59,7 @@ public class ServiceDescription { return id; } - public void setId(String id) { + public void setId(final String id) { this.id = id; } @@ -68,7 +68,7 @@ public class ServiceDescription { return name; } - public void setName(String name) { + public void setName(final String name) { this.name = name; } @@ -77,7 +77,7 @@ public class ServiceDescription { return dialogUrl; } - public void setDialogUrl(String dialogUrl) { + public void setDialogUrl(final String dialogUrl) { this.dialogUrl = dialogUrl; } @@ -86,7 +86,7 @@ public class ServiceDescription { return image; } - public void setImage(String image) { + public void setImage(final String image) { this.image = image; } @@ -95,7 +95,7 @@ public class ServiceDescription { return order; } - public void setOrder(int order) { + public void setOrder(final int order) { this.order = order; } @@ -104,7 +104,7 @@ public class ServiceDescription { return allowedRoles; } - public void setAllowedRoles(String[] roles) { + public void setAllowedRoles(final String[] roles) { this.allowedRoles = roles; } } diff --git a/src/main/java/de/thm/arsnova/entities/Statistics.java b/src/main/java/de/thm/arsnova/entities/Statistics.java index ae3eda70d..a4a031cf1 100644 --- a/src/main/java/de/thm/arsnova/entities/Statistics.java +++ b/src/main/java/de/thm/arsnova/entities/Statistics.java @@ -129,7 +129,7 @@ public class Statistics { return interposedQuestions; } - public void setInterposedQuestions(int interposedQuestions) { + public void setInterposedQuestions(final int interposedQuestions) { this.interposedQuestions = interposedQuestions; } @@ -139,7 +139,7 @@ public class Statistics { return flashcards; } - public void setFlashcards(int flashcards) { + public void setFlashcards(final int flashcards) { this.flashcards = flashcards; } @@ -149,7 +149,7 @@ public class Statistics { return creators; } - public void setCreators(int creators) { + public void setCreators(final int creators) { this.creators = creators; } @@ -159,7 +159,7 @@ public class Statistics { return conceptQuestions; } - public void setConceptQuestions(int conceptQuestions) { + public void setConceptQuestions(final int conceptQuestions) { this.conceptQuestions = conceptQuestions; } @@ -169,7 +169,7 @@ public class Statistics { return activeStudents; } - public void setActiveStudents(int activeStudents) { + public void setActiveStudents(final int activeStudents) { this.activeStudents = activeStudents; } diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java index 1ca7a828c..881f3e16c 100644 --- a/src/main/java/de/thm/arsnova/entities/TextAnswer.java +++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java @@ -3,9 +3,13 @@ package de.thm.arsnova.entities; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.Date; + public class TextAnswer extends Answer { private String subject; private String body; + private boolean read; + private Date timestamp; @JsonView({View.Persistence.class, View.Public.class}) public String getSubject() { @@ -13,7 +17,7 @@ public class TextAnswer extends Answer { } @JsonView({View.Persistence.class, View.Public.class}) - public void setSubject(String subject) { + public void setSubject(final String subject) { this.subject = subject; } @@ -23,7 +27,27 @@ public class TextAnswer extends Answer { } @JsonView({View.Persistence.class, View.Public.class}) - public void setBody(String body) { + public void setBody(final String body) { this.body = body; } + + @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; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public Date getTimestamp() { + return timestamp; + } + + @JsonView(View.Persistence.class) + public void setTimestamp(final Date timestamp) { + this.timestamp = timestamp; + } } diff --git a/src/main/java/de/thm/arsnova/entities/UserAuthentication.java b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java index f9ad955b2..b47de4585 100644 --- a/src/main/java/de/thm/arsnova/entities/UserAuthentication.java +++ b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java @@ -43,47 +43,56 @@ public class UserAuthentication implements Serializable { public static final String GUEST = "guest"; private static final long serialVersionUID = 1L; + private String id; private String username; private String type; private UserRoomService.Role role; private boolean isAdmin; - public UserAuthentication(Google2Profile profile) { + public UserAuthentication(final Google2Profile profile) { setUsername(profile.getEmail()); setType(UserAuthentication.GOOGLE); } - public UserAuthentication(TwitterProfile profile) { + public UserAuthentication(final TwitterProfile profile) { setUsername(profile.getUsername()); setType(UserAuthentication.TWITTER); } - public UserAuthentication(FacebookProfile profile) { + public UserAuthentication(final FacebookProfile profile) { setUsername(profile.getProfileUrl().toString()); setType(UserAuthentication.FACEBOOK); } - public UserAuthentication(AttributePrincipal principal) { + public UserAuthentication(final AttributePrincipal principal) { setUsername(principal.getName()); setType(UserAuthentication.THM); } - public UserAuthentication(AnonymousAuthenticationToken token) { + public UserAuthentication(final AnonymousAuthenticationToken token) { setUsername(UserAuthentication.ANONYMOUS); setType(UserAuthentication.ANONYMOUS); } - public UserAuthentication(UsernamePasswordAuthenticationToken token) { + public UserAuthentication(final UsernamePasswordAuthenticationToken token) { setUsername(token.getName()); setType(LDAP); } + public String getId() { + return id; + } + + public void setId(final String id) { + this.id = id; + } + @JsonView(View.Public.class) public String getUsername() { return username; } - public void setUsername(String username) { + public void setUsername(final String username) { this.username = username; } @@ -92,7 +101,7 @@ public class UserAuthentication implements Serializable { return type; } - public void setType(String type) { + public void setType(final String type) { this.type = type; } @@ -100,7 +109,7 @@ public class UserAuthentication implements Serializable { return role; } - public void setRole(UserRoomService.Role role) { + public void setRole(final UserRoomService.Role role) { this.role = role; } @@ -108,7 +117,7 @@ public class UserAuthentication implements Serializable { return this.role == role; } - public void setAdmin(boolean a) { + public void setAdmin(final boolean a) { this.isAdmin = a; } @@ -134,7 +143,7 @@ public class UserAuthentication implements Serializable { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (obj == null || !obj.getClass().equals(this.getClass())) { return false; } diff --git a/src/main/java/de/thm/arsnova/entities/UserProfile.java b/src/main/java/de/thm/arsnova/entities/UserProfile.java index dd932fc38..515422b48 100644 --- a/src/main/java/de/thm/arsnova/entities/UserProfile.java +++ b/src/main/java/de/thm/arsnova/entities/UserProfile.java @@ -4,8 +4,10 @@ import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; public class UserProfile implements Entity { @@ -13,7 +15,7 @@ public class UserProfile implements Entity { private String password; private String activationKey; private String passwordResetKey; - private long passwordResetTime; + private Date passwordResetTime; @JsonView(View.Persistence.class) public String getPassword() { @@ -21,7 +23,7 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setPassword(String password) { + public void setPassword(final String password) { this.password = password; } @@ -31,7 +33,7 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setActivationKey(String activationKey) { + public void setActivationKey(final String activationKey) { this.activationKey = activationKey; } @@ -41,30 +43,30 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setPasswordResetKey(String passwordResetKey) { + public void setPasswordResetKey(final String passwordResetKey) { this.passwordResetKey = passwordResetKey; } @JsonView(View.Persistence.class) - public long getPasswordResetTime() { + public Date getPasswordResetTime() { return passwordResetTime; } @JsonView(View.Persistence.class) - public void setPasswordResetTime(long passwordResetTime) { + public void setPasswordResetTime(final Date passwordResetTime) { this.passwordResetTime = passwordResetTime; } } public class RoomHistoryEntry { private String roomId; - private long lastVisit; + private Date lastVisit; public RoomHistoryEntry() { } - public RoomHistoryEntry(String roomId, long lastVisit) { + public RoomHistoryEntry(String roomId, Date lastVisit) { this.roomId = roomId; this.lastVisit = lastVisit; } @@ -77,11 +79,11 @@ public class UserProfile implements Entity { this.roomId = roomId; } - public long getLastVisit() { + public Date getLastVisit() { return lastVisit; } - public void setLastVisit(long lastVisit) { + public void setLastVisit(Date lastVisit) { this.lastVisit = lastVisit; } } @@ -90,11 +92,12 @@ public class UserProfile implements Entity { private String rev; private String authProvider; private String loginId; - private long creation; - private long lastLogin; + private Date creationTimestamp; + private Date lastLoginTimestamp; private Account account; private List<RoomHistoryEntry> roomHistory = new ArrayList<>(); private Set<String> acknowledgedMotds = new HashSet<>(); + private Map<String, Map<String, ?>> extensions; @Override @JsonView({View.Persistence.class, View.Public.class}) @@ -104,7 +107,7 @@ public class UserProfile implements Entity { @Override @JsonView({View.Persistence.class, View.Public.class}) - public void setId(String id) { + public void setId(final String id) { this.id = id; } @@ -116,7 +119,7 @@ public class UserProfile implements Entity { @Override @JsonView({View.Persistence.class, View.Public.class}) - public void setRevision(String rev) { + public void setRevision(final String rev) { this.rev = rev; } @@ -126,7 +129,7 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setAuthProvider(String authProvider) { + public void setAuthProvider(final String authProvider) { this.authProvider = authProvider; } @@ -136,28 +139,28 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setLoginId(String loginId) { + public void setLoginId(final String loginId) { this.loginId = loginId; } @JsonView({View.Persistence.class, View.Public.class}) - public long getCreation() { - return creation; + public Date getCreationTimestamp() { + return creationTimestamp; } @JsonView(View.Persistence.class) - public void setCreation(long creation) { - this.creation = creation; + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; } @JsonView({View.Persistence.class, View.Public.class}) - public long getLastLogin() { - return lastLogin; + public Date getLastLoginTimestamp() { + return lastLoginTimestamp; } @JsonView(View.Persistence.class) - public void setLastLogin(long lastLogin) { - this.lastLogin = lastLogin; + public void setLastLoginTimestamp(final Date lastLoginTimestamp) { + this.lastLoginTimestamp = lastLoginTimestamp; } @JsonView(View.Persistence.class) @@ -166,7 +169,7 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setAccount(Account account) { + public void setAccount(final Account account) { this.account = account; } @@ -176,7 +179,7 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setRoomHistory(List<RoomHistoryEntry> roomHistory) { + public void setRoomHistory(final List<RoomHistoryEntry> roomHistory) { this.roomHistory = roomHistory; } @@ -186,7 +189,17 @@ public class UserProfile implements Entity { } @JsonView(View.Persistence.class) - public void setAcknowledgedMotds(Set<String> acknowledgedMotds) { + public void setAcknowledgedMotds(final Set<String> acknowledgedMotds) { this.acknowledgedMotds = acknowledgedMotds; } + + @JsonView({View.Persistence.class, View.Public.class}) + public Map<String, Map<String, ?>> getExtensions() { + return extensions; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setExtensions(Map<String, Map<String, ?>> extensions) { + this.extensions = extensions; + } } diff --git a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java index caa7e6565..4b9614c8b 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java @@ -33,6 +33,7 @@ import de.thm.arsnova.entities.migration.v2.Room; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -65,13 +66,13 @@ public class FromV2Migrator { account.setPassword(dbUser.getPassword()); account.setActivationKey(dbUser.getActivationKey()); account.setPasswordResetKey(dbUser.getPasswordResetKey()); - account.setPasswordResetTime(dbUser.getPasswordResetTime()); + account.setPasswordResetTime(new Date(dbUser.getPasswordResetTime())); } if (loggedIn != null) { profile.setLoginId(loggedIn.getUser()); - profile.setLastLogin(loggedIn.getTimestamp()); + profile.setLastLoginTimestamp(new Date(loggedIn.getTimestamp())); List<UserProfile.RoomHistoryEntry> sessionHistory = loggedIn.getVisitedSessions().stream() - .map(entry -> profile.new RoomHistoryEntry(entry.getId(), 0)) + .map(entry -> profile.new RoomHistoryEntry(entry.getId(), new Date(0))) .collect(Collectors.toList()); profile.setRoomHistory(sessionHistory); } @@ -82,8 +83,8 @@ public class FromV2Migrator { return profile; } - public de.thm.arsnova.entities.Room migrate(final Room from, final DbUser owner) { - if (!owner.getUsername().equals(from.getCreator())) { + public de.thm.arsnova.entities.Room migrate(final Room from, final UserProfile owner) { + if (!owner.getLoginId().equals(from.getCreator())) { throw new IllegalArgumentException("Username of owner object does not match session creator."); } final de.thm.arsnova.entities.Room to = new de.thm.arsnova.entities.Room(); @@ -167,8 +168,8 @@ public class FromV2Migrator { return to; } - public de.thm.arsnova.entities.Comment migrate(final Comment from, final DbUser creator) { - if (!creator.getUsername().equals(from.getCreator())) { + public de.thm.arsnova.entities.Comment migrate(final Comment from, final UserProfile creator) { + if (!creator.getLoginId().equals(from.getCreator())) { throw new IllegalArgumentException("Username of creator object does not match comment creator."); } final de.thm.arsnova.entities.Comment to = new de.thm.arsnova.entities.Comment(); @@ -177,7 +178,7 @@ public class FromV2Migrator { to.setCreatorId(creator.getId()); to.setSubject(from.getSubject()); to.setBody(from.getText()); - to.setTimestamp(from.getTimestamp()); + to.setTimestamp(new Date(from.getTimestamp())); to.setRead(from.isRead()); return to; diff --git a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java index 0175a5d71..da4911236 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java @@ -48,7 +48,7 @@ public class ToV2Migrator { final LoggedIn to = new LoggedIn(); copyCommonProperties(from, to); to.setUser(from.getLoginId()); - to.setTimestamp(from.getLastLogin()); + to.setTimestamp(from.getLastLoginTimestamp().getTime()); to.setVisitedSessions(from.getRoomHistory().stream() .map(entry -> new VisitedRoom()) .collect(Collectors.toList())); @@ -136,7 +136,7 @@ public class ToV2Migrator { to.setCreator(creator.getLoginId()); to.setSubject(from.getSubject()); to.setText(from.getBody()); - to.setTimestamp(from.getTimestamp()); + to.setTimestamp(from.getTimestamp().getTime()); to.setRead(from.isRead()); return to; -- GitLab