From 1779f3734a4c117fee306a7f069d2d34d753c367 Mon Sep 17 00:00:00 2001 From: Daniel Gerhardt <code@dgerhardt.net> Date: Mon, 25 Sep 2017 17:45:04 +0200 Subject: [PATCH] Add timestamps to entities Additionally moved previously missed v2 entities to the v2 package. --- .../arsnova/controller/MotdController.java | 2 +- .../java/de/thm/arsnova/entities/Answer.java | 27 +++ .../java/de/thm/arsnova/entities/Comment.java | 26 +++ .../java/de/thm/arsnova/entities/Content.java | 26 +++ .../java/de/thm/arsnova/entities/Entity.java | 25 +-- .../de/thm/arsnova/entities/LogEntry.java | 45 +++-- .../thm/arsnova/entities/MigrationState.java | 26 +++ .../java/de/thm/arsnova/entities/Motd.java | 154 ++++++---------- .../java/de/thm/arsnova/entities/Room.java | 27 +++ .../de/thm/arsnova/entities/TextAnswer.java | 11 +- .../de/thm/arsnova/entities/UserProfile.java | 37 ++-- .../entities/migration/FromV2Migrator.java | 4 +- .../entities/migration/ToV2Migrator.java | 4 +- .../arsnova/entities/migration/v2/Answer.java | 1 - .../entities/migration/v2/Comment.java | 1 - .../entities/migration/v2/Content.java | 1 - .../arsnova/entities/migration/v2/DbUser.java | 1 - .../arsnova/entities/migration/v2/Entity.java | 36 ++++ .../entities/migration/v2/LogEntry.java | 113 ++++++++++++ .../entities/migration/v2/LoggedIn.java | 1 - .../arsnova/entities/migration/v2/Motd.java | 169 ++++++++++++++++++ .../entities/migration/v2/MotdList.java | 1 - .../arsnova/entities/migration/v2/Room.java | 1 - .../CouchDbTypeFieldConverter.java | 6 +- .../transport/ImportExportSession.java | 2 +- .../persistance/LogEntryRepository.java | 2 +- .../arsnova/persistance/MotdRepository.java | 2 +- .../couchdb/CouchDbLogEntryRepository.java | 2 +- .../couchdb/CouchDbMotdRepository.java | 2 +- .../services/DefaultEntityServiceImpl.java | 7 + .../de/thm/arsnova/services/MotdService.java | 2 +- .../thm/arsnova/services/MotdServiceImpl.java | 2 +- 32 files changed, 585 insertions(+), 181 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java diff --git a/src/main/java/de/thm/arsnova/controller/MotdController.java b/src/main/java/de/thm/arsnova/controller/MotdController.java index 95cbc6fa8..f55be007a 100644 --- a/src/main/java/de/thm/arsnova/controller/MotdController.java +++ b/src/main/java/de/thm/arsnova/controller/MotdController.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.controller; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.entities.migration.v2.MotdList; import de.thm.arsnova.services.MotdService; import io.swagger.annotations.Api; diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java index f564ff3cb..e96a298d2 100644 --- a/src/main/java/de/thm/arsnova/entities/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/Answer.java @@ -3,11 +3,14 @@ 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 abstract class Answer implements Entity { private String id; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private String contentId; private String roomId; private String creatorId; @@ -38,6 +41,30 @@ public abstract class Answer implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public String getContentId() { return contentId; diff --git a/src/main/java/de/thm/arsnova/entities/Comment.java b/src/main/java/de/thm/arsnova/entities/Comment.java index 976691b03..414a3969a 100644 --- a/src/main/java/de/thm/arsnova/entities/Comment.java +++ b/src/main/java/de/thm/arsnova/entities/Comment.java @@ -9,6 +9,8 @@ import java.util.Map; public class Comment implements Entity { private String id; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private String sessionId; private String creatorId; private String subject; @@ -41,6 +43,30 @@ public class Comment implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public String getSessionId() { return sessionId; diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java index c75c5d4ae..84e60922f 100644 --- a/src/main/java/de/thm/arsnova/entities/Content.java +++ b/src/main/java/de/thm/arsnova/entities/Content.java @@ -78,6 +78,8 @@ public class Content implements Entity { private String id; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private String roomId; private String subject; private String body; @@ -111,6 +113,30 @@ public class Content implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public String getRoomId() { return roomId; diff --git a/src/main/java/de/thm/arsnova/entities/Entity.java b/src/main/java/de/thm/arsnova/entities/Entity.java index 97b346ba4..0d0c4538b 100644 --- a/src/main/java/de/thm/arsnova/entities/Entity.java +++ b/src/main/java/de/thm/arsnova/entities/Entity.java @@ -1,25 +1,10 @@ -/* - * 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 java.util.Date; + public interface Entity { String getId(); void setId(String id); @@ -27,6 +12,12 @@ public interface Entity { String getRevision(); void setRevision(String rev); + Date getCreationTimestamp(); + void setCreationTimestamp(Date creationTimestamp); + + Date getUpdateTimestamp(); + void setUpdateTimestamp(Date updateTimestamp); + @JsonView(View.Persistence.class) default Class<? extends Entity> getType() { return getClass(); diff --git a/src/main/java/de/thm/arsnova/entities/LogEntry.java b/src/main/java/de/thm/arsnova/entities/LogEntry.java index 21a0fb808..96e07cc4f 100644 --- a/src/main/java/de/thm/arsnova/entities/LogEntry.java +++ b/src/main/java/de/thm/arsnova/entities/LogEntry.java @@ -1,26 +1,10 @@ -/* - * 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.JsonProperty; import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.serialization.View; +import java.util.Date; import java.util.Map; public class LogEntry implements Entity { @@ -35,7 +19,8 @@ public class LogEntry implements Entity { private String id; private String rev; - private long timestamp = System.currentTimeMillis(); + private Date creationTimestamp; + private Date updateTimestamp; private String event; private int level; private Map<String, Object> payload; @@ -66,14 +51,28 @@ public class LogEntry implements Entity { this.rev = rev; } + @Override @JsonView(View.Persistence.class) - public long getTimestamp() { - return timestamp; + public Date getCreationTimestamp() { + return creationTimestamp; } + @Override @JsonView(View.Persistence.class) - public void setTimestamp(final long timestamp) { - this.timestamp = timestamp; + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; } @JsonView(View.Persistence.class) @@ -97,7 +96,7 @@ public class LogEntry implements Entity { } @JsonView(View.Persistence.class) - public void setLevel(final LogLevel level) { + public void setLevel(final de.thm.arsnova.entities.migration.v2.LogEntry.LogLevel level) { this.level = level.ordinal(); } diff --git a/src/main/java/de/thm/arsnova/entities/MigrationState.java b/src/main/java/de/thm/arsnova/entities/MigrationState.java index 56762825f..3d1d27b0c 100644 --- a/src/main/java/de/thm/arsnova/entities/MigrationState.java +++ b/src/main/java/de/thm/arsnova/entities/MigrationState.java @@ -29,6 +29,8 @@ public class MigrationState implements Entity { private String id = "MigrationState"; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private Migration active; private List<String> completed; @@ -58,6 +60,30 @@ public class MigrationState implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public Migration getActive() { return active; diff --git a/src/main/java/de/thm/arsnova/entities/Motd.java b/src/main/java/de/thm/arsnova/entities/Motd.java index 6dd90bffc..2c6bbfa12 100644 --- a/src/main/java/de/thm/arsnova/entities/Motd.java +++ b/src/main/java/de/thm/arsnova/entities/Motd.java @@ -1,169 +1,123 @@ -/* - * 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; -/** - * This class represents a message of the day. - */ -@ApiModel(value = "motd", description = "the message of the day entity") public class Motd implements Entity { - - private String motdkey; //ID + private String id; + private String rev; + private Date creationTimestamp; + private Date updateTimestamp; + private String sessionId; private Date startdate; private Date enddate; private String title; - private String text; + private String body; private String audience; - private String sessionId; - private String sessionkey; - private String id; - private String rev; - @ApiModelProperty(required = true, value = "the identification string") @JsonView({View.Persistence.class, View.Public.class}) - public String getMotdkey() { - return motdkey; + public String getId() { + return id; } @JsonView({View.Persistence.class, View.Public.class}) - public void setMotdkey(final String key) { - motdkey = key; + public void setId(final String id) { + this.id = id; } - @ApiModelProperty(required = true, value = "startdate for showing this message (timestamp format)") @JsonView({View.Persistence.class, View.Public.class}) - public Date getStartdate() { - return startdate; + public void setRevision(final String rev) { + this.rev = rev; } @JsonView({View.Persistence.class, View.Public.class}) - public void setStartdate(final Date timestamp) { - startdate = timestamp; + public String getRevision() { + return rev; } - @ApiModelProperty(required = true, value = "enddate for showing this message (timestamp format)") - @JsonView({View.Persistence.class, View.Public.class}) - public Date getEnddate() { - return enddate; + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setEnddate(final Date timestamp) { - enddate = timestamp; + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; } - @ApiModelProperty(required = true, value = "tite of the message") - @JsonView({View.Persistence.class, View.Public.class}) - public String getTitle() { - return title; + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; } - @JsonView({View.Persistence.class, View.Public.class}) - public void setTitle(final String ttitle) { - title = ttitle; + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; } - @ApiModelProperty(required = true, value = "text of the message") @JsonView({View.Persistence.class, View.Public.class}) - public String getText() { - return text; + public String getSessionId() { + return sessionId; } @JsonView({View.Persistence.class, View.Public.class}) - public void setText(final String ttext) { - text = ttext; + public void setSessionId(final String sessionId) { + this.sessionId = sessionId; } - @ApiModelProperty(required = true, value = "defines the target audience for this motd (one of the following: 'student', 'tutor', 'loggedIn', 'all')") @JsonView({View.Persistence.class, View.Public.class}) - public String getAudience() { - return audience; + public Date getStartdate() { + return startdate; } @JsonView({View.Persistence.class, View.Public.class}) - public void setAudience(final String a) { - audience = a; + public void setStartdate(final Date timestamp) { + startdate = timestamp; } @JsonView({View.Persistence.class, View.Public.class}) - public String getSessionId() { - return sessionId; + public Date getEnddate() { + return enddate; } @JsonView({View.Persistence.class, View.Public.class}) - public void setSessionId(final String sessionId) { - this.sessionId = sessionId; + public void setEnddate(final Date timestamp) { + enddate = timestamp; } - @ApiModelProperty(required = true, value = "when audience equals session, the sessionkey referes to the session the messages belong to") @JsonView({View.Persistence.class, View.Public.class}) - public String getSessionkey() { - return sessionkey; + public String getTitle() { + return title; } @JsonView({View.Persistence.class, View.Public.class}) - public void setSessionkey(final String a) { - sessionkey = a; + public void setTitle(final String ttitle) { + title = ttitle; } - @ApiModelProperty(required = true, value = "the couchDB ID") @JsonView({View.Persistence.class, View.Public.class}) - public String getId() { - return id; + public String getBody() { + return body; } @JsonView({View.Persistence.class, View.Public.class}) - public void setId(final String id) { - this.id = id; + public void setBody(final String ttext) { + body = ttext; } @JsonView({View.Persistence.class, View.Public.class}) - public void setRevision(final String rev) { - this.rev = rev; + public String getAudience() { + return audience; } @JsonView({View.Persistence.class, View.Public.class}) - public String getRevision() { - return rev; - } - - @Override - public int hashCode() { - // See http://stackoverflow.com/a/113600 - final int prim = 37; - - int result = 42; - return prim * result + this.motdkey.hashCode(); - } - - @Override - public boolean equals(final Object obj) { - if (obj == null || !obj.getClass().equals(this.getClass())) { - return false; - } - Motd other = (Motd) obj; - return this.getMotdkey().equals(other.getMotdkey()); + public void setAudience(final String a) { + audience = a; } } diff --git a/src/main/java/de/thm/arsnova/entities/Room.java b/src/main/java/de/thm/arsnova/entities/Room.java index 32d71fee8..a1ab2a672 100644 --- a/src/main/java/de/thm/arsnova/entities/Room.java +++ b/src/main/java/de/thm/arsnova/entities/Room.java @@ -3,6 +3,7 @@ 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; import java.util.Map; @@ -230,6 +231,8 @@ public class Room implements Entity { private String id; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private String shortId; private String ownerId; private String name; @@ -267,6 +270,30 @@ public class Room implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public String getShortId() { return shortId; diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java index 881f3e16c..8e36c127e 100644 --- a/src/main/java/de/thm/arsnova/entities/TextAnswer.java +++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java @@ -9,7 +9,6 @@ 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() { @@ -41,13 +40,9 @@ public class TextAnswer extends Answer { this.read = read; } + @Override @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; + public Date getCreationTimestamp() { + return getCreationTimestamp(); } } diff --git a/src/main/java/de/thm/arsnova/entities/UserProfile.java b/src/main/java/de/thm/arsnova/entities/UserProfile.java index 515422b48..30e09650a 100644 --- a/src/main/java/de/thm/arsnova/entities/UserProfile.java +++ b/src/main/java/de/thm/arsnova/entities/UserProfile.java @@ -90,9 +90,10 @@ public class UserProfile implements Entity { private String id; private String rev; + private Date creationTimestamp; + private Date updateTimestamp; private String authProvider; private String loginId; - private Date creationTimestamp; private Date lastLoginTimestamp; private Account account; private List<RoomHistoryEntry> roomHistory = new ArrayList<>(); @@ -123,6 +124,30 @@ public class UserProfile implements Entity { this.rev = rev; } + @Override + @JsonView(View.Persistence.class) + public Date getCreationTimestamp() { + return creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setCreationTimestamp(final Date creationTimestamp) { + this.creationTimestamp = creationTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public Date getUpdateTimestamp() { + return updateTimestamp; + } + + @Override + @JsonView(View.Persistence.class) + public void setUpdateTimestamp(final Date updateTimestamp) { + this.updateTimestamp = updateTimestamp; + } + @JsonView({View.Persistence.class, View.Public.class}) public String getAuthProvider() { return authProvider; @@ -143,16 +168,6 @@ public class UserProfile implements Entity { this.loginId = loginId; } - @JsonView({View.Persistence.class, View.Public.class}) - public Date getCreationTimestamp() { - return creationTimestamp; - } - - @JsonView(View.Persistence.class) - public void setCreationTimestamp(final Date creationTimestamp) { - this.creationTimestamp = creationTimestamp; - } - @JsonView({View.Persistence.class, View.Public.class}) public Date getLastLoginTimestamp() { return lastLoginTimestamp; 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 4b9614c8b..463cfa98c 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java @@ -19,7 +19,6 @@ 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.UserProfile; import de.thm.arsnova.entities.migration.v2.Answer; @@ -27,6 +26,7 @@ import de.thm.arsnova.entities.migration.v2.AnswerOption; import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.migration.v2.DbUser; +import de.thm.arsnova.entities.migration.v2.Entity; import de.thm.arsnova.entities.migration.v2.LoggedIn; import de.thm.arsnova.entities.migration.v2.MotdList; import de.thm.arsnova.entities.migration.v2.Room; @@ -43,7 +43,7 @@ import java.util.stream.Collectors; * @author Daniel Gerhardt */ public class FromV2Migrator { - private void copyCommonProperties(final Entity from, final Entity to) { + private void copyCommonProperties(final Entity from, final de.thm.arsnova.entities.Entity to) { to.setId(from.getId()); to.setRevision(from.getRevision()); } 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 da4911236..90924ebba 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java +++ b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java @@ -18,7 +18,7 @@ package de.thm.arsnova.entities.migration; import de.thm.arsnova.entities.ChoiceQuestionContent; -import de.thm.arsnova.entities.Entity; +import de.thm.arsnova.entities.migration.v2.Entity; import de.thm.arsnova.entities.UserProfile; import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.migration.v2.AnswerOption; @@ -39,7 +39,7 @@ import java.util.stream.Collectors; * @author Daniel Gerhardt */ public class ToV2Migrator { - private void copyCommonProperties(final Entity from, final Entity to) { + private void copyCommonProperties(final de.thm.arsnova.entities.Entity from, final Entity to) { to.setId(from.getId()); to.setRevision(from.getRevision()); } 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 index 7c13d76bd..44bbab419 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java @@ -19,7 +19,6 @@ 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; diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java index 9dd6196ee..224a8adaa 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java @@ -18,7 +18,6 @@ package de.thm.arsnova.entities.migration.v2; import com.fasterxml.jackson.annotation.JsonView; -import de.thm.arsnova.entities.Entity; import de.thm.arsnova.entities.UserAuthentication; import de.thm.arsnova.entities.serialization.View; import io.swagger.annotations.ApiModel; 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 index e372c05e7..30f1ce7a4 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java @@ -18,7 +18,6 @@ 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; diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java index 539c80c7a..610be70a6 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java @@ -18,7 +18,6 @@ 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; /** diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java new file mode 100644 index 000000000..6eda9e8ba --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java @@ -0,0 +1,36 @@ +/* + * 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.serialization.View; + +import java.util.Date; + +public interface Entity { + String getId(); + void setId(String id); + + String getRevision(); + void setRevision(String rev); + + @JsonView(View.Persistence.class) + default Class<? extends Entity> getType() { + return getClass(); + } +} diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java b/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java new file mode 100644 index 000000000..a4c8b35ab --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java @@ -0,0 +1,113 @@ +/* + * 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.JsonProperty; +import com.fasterxml.jackson.annotation.JsonView; +import de.thm.arsnova.entities.serialization.View; + +import java.util.Map; + +public class LogEntry implements Entity { + public enum LogLevel { + TRACE, + DEBUG, + INFO, + WARN, + ERROR, + FATAL + } + + private String id; + private String rev; + private long timestamp = System.currentTimeMillis(); + private String event; + private int level; + private Map<String, Object> payload; + + public LogEntry(@JsonProperty String event, @JsonProperty int level, @JsonProperty Map<String, Object> payload) { + this.event = event; + this.level = level; + this.payload = payload; + } + + @JsonView(View.Persistence.class) + public String getId() { + return id; + } + + @JsonView(View.Persistence.class) + public void setId(final String id) { + this.id = id; + } + + @JsonView(View.Persistence.class) + public String getRevision() { + return rev; + } + + @JsonView(View.Persistence.class) + public void setRevision(final String rev) { + this.rev = rev; + } + + @JsonView(View.Persistence.class) + public long getTimestamp() { + return timestamp; + } + + @JsonView(View.Persistence.class) + public void setTimestamp(final long timestamp) { + this.timestamp = timestamp; + } + + @JsonView(View.Persistence.class) + public String getEvent() { + return event; + } + + @JsonView(View.Persistence.class) + public void setEvent(final String event) { + this.event = event; + } + + @JsonView(View.Persistence.class) + public int getLevel() { + return level; + } + + @JsonView(View.Persistence.class) + public void setLevel(final int level) { + this.level = level; + } + + @JsonView(View.Persistence.class) + public void setLevel(final LogLevel level) { + this.level = level.ordinal(); + } + + @JsonView(View.Persistence.class) + public Map<String, Object> getPayload() { + return payload; + } + + @JsonView(View.Persistence.class) + public void setPayload(final Map<String, Object> payload) { + this.payload = payload; + } +} diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java index 2a346db7c..c70e7354b 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java @@ -18,7 +18,6 @@ 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 java.util.ArrayList; diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java new file mode 100644 index 000000000..176f12c2a --- /dev/null +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java @@ -0,0 +1,169 @@ +/* + * 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.serialization.View; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; + +/** + * This class represents a message of the day. + */ +@ApiModel(value = "motd", description = "the message of the day entity") +public class Motd implements Entity { + + private String motdkey; //ID + private Date startdate; + private Date enddate; + private String title; + private String text; + private String audience; + private String sessionId; + private String sessionkey; + private String id; + private String rev; + + @ApiModelProperty(required = true, value = "the identification string") + @JsonView({View.Persistence.class, View.Public.class}) + public String getMotdkey() { + return motdkey; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setMotdkey(final String key) { + motdkey = key; + } + + @ApiModelProperty(required = true, value = "startdate for showing this message (timestamp format)") + @JsonView({View.Persistence.class, View.Public.class}) + public Date getStartdate() { + return startdate; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setStartdate(final Date timestamp) { + startdate = timestamp; + } + + @ApiModelProperty(required = true, value = "enddate for showing this message (timestamp format)") + @JsonView({View.Persistence.class, View.Public.class}) + public Date getEnddate() { + return enddate; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setEnddate(final Date timestamp) { + enddate = timestamp; + } + + @ApiModelProperty(required = true, value = "tite of the message") + @JsonView({View.Persistence.class, View.Public.class}) + public String getTitle() { + return title; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setTitle(final String ttitle) { + title = ttitle; + } + + @ApiModelProperty(required = true, value = "text of the message") + @JsonView({View.Persistence.class, View.Public.class}) + public String getText() { + return text; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setText(final String ttext) { + text = ttext; + } + + @ApiModelProperty(required = true, value = "defines the target audience for this motd (one of the following: 'student', 'tutor', 'loggedIn', 'all')") + @JsonView({View.Persistence.class, View.Public.class}) + public String getAudience() { + return audience; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setAudience(final String a) { + audience = a; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public String getSessionId() { + return sessionId; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSessionId(final String sessionId) { + this.sessionId = sessionId; + } + + @ApiModelProperty(required = true, value = "when audience equals session, the sessionkey referes to the session the messages belong to") + @JsonView({View.Persistence.class, View.Public.class}) + public String getSessionkey() { + return sessionkey; + } + + @JsonView({View.Persistence.class, View.Public.class}) + public void setSessionkey(final String a) { + sessionkey = a; + } + + @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; + } + + @Override + public int hashCode() { + // See http://stackoverflow.com/a/113600 + final int prim = 37; + + int result = 42; + return prim * result + this.motdkey.hashCode(); + } + + @Override + public boolean equals(final Object obj) { + if (obj == null || !obj.getClass().equals(this.getClass())) { + return false; + } + Motd other = (Motd) obj; + return this.getMotdkey().equals(other.getMotdkey()); + } +} diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java index 357e0308a..c817113c5 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java @@ -18,7 +18,6 @@ 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; diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java index 205c409cd..82aa5dbed 100644 --- a/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java +++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java @@ -19,7 +19,6 @@ 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.ScoreOptions; import de.thm.arsnova.entities.UserAuthentication; import de.thm.arsnova.entities.serialization.View; 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 e0d489539..e261d15a1 100644 --- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java +++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java @@ -23,9 +23,9 @@ import com.fasterxml.jackson.databind.util.Converter; import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.DbUser; -import de.thm.arsnova.entities.Entity; -import de.thm.arsnova.entities.LogEntry; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Entity; +import de.thm.arsnova.entities.migration.v2.LogEntry; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.entities.migration.v2.Content; import de.thm.arsnova.entities.migration.v2.MotdList; import de.thm.arsnova.entities.migration.v2.Room; 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 6bc382efc..4f1e8a4bd 100644 --- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java +++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonView; import de.thm.arsnova.entities.migration.v2.Answer; import de.thm.arsnova.entities.migration.v2.Comment; import de.thm.arsnova.entities.migration.v2.Content; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.entities.migration.v2.Room; import de.thm.arsnova.entities.migration.v2.RoomFeature; import de.thm.arsnova.entities.migration.v2.RoomInfo; diff --git a/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java b/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java index 1515e340c..f6e059a90 100644 --- a/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.persistance; -import de.thm.arsnova.entities.LogEntry; +import de.thm.arsnova.entities.migration.v2.LogEntry; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/de/thm/arsnova/persistance/MotdRepository.java b/src/main/java/de/thm/arsnova/persistance/MotdRepository.java index f403ccb27..e8c8a752e 100644 --- a/src/main/java/de/thm/arsnova/persistance/MotdRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/MotdRepository.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.persistance; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import org.springframework.data.repository.CrudRepository; import java.util.List; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java index 33abf56ec..c25d5b7b0 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.persistance.couchdb; -import de.thm.arsnova.entities.LogEntry; +import de.thm.arsnova.entities.migration.v2.LogEntry; import de.thm.arsnova.persistance.LogEntryRepository; import org.ektorp.CouchDbConnector; import org.ektorp.support.CouchDbRepositorySupport; diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java index d7c5317b9..e0e2650af 100644 --- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java +++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.persistance.couchdb; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.persistance.MotdRepository; import org.ektorp.CouchDbConnector; import org.slf4j.Logger; diff --git a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java index c65f2f09f..69222b3f0 100644 --- a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java @@ -28,6 +28,7 @@ import org.springframework.security.access.prepost.PreFilter; import java.io.IOException; import java.util.Collection; +import java.util.Date; import java.util.Map; import java.util.function.Function; @@ -61,6 +62,8 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService if (entity.getId() != null || entity.getRevision() != null) { throw new IllegalArgumentException("Entity is not new."); } + entity.setCreationTimestamp(new Date()); + return repository.save(entity); } @@ -68,6 +71,8 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService @PreAuthorize("hasPermission(#oldEntity, 'update')") public T update(final T oldEntity, final T newEntity) { newEntity.setId(oldEntity.getId()); + newEntity.setUpdateTimestamp(new Date()); + return repository.save(newEntity); } @@ -84,6 +89,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService ObjectReader reader = objectMapper.readerForUpdating(obj).withView(View.Public.class); JsonNode tree = objectMapper.valueToTree(changes); reader.readValue(tree); + entity.setUpdateTimestamp(new Date()); return repository.save(entity); } @@ -102,6 +108,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService Object obj = propertyGetter.apply(entity); ObjectReader reader = objectMapper.readerForUpdating(obj).withView(View.Public.class); reader.readValue(tree); + entity.setUpdateTimestamp(new Date()); } return repository.save(entities); diff --git a/src/main/java/de/thm/arsnova/services/MotdService.java b/src/main/java/de/thm/arsnova/services/MotdService.java index c0d262c4f..101332699 100644 --- a/src/main/java/de/thm/arsnova/services/MotdService.java +++ b/src/main/java/de/thm/arsnova/services/MotdService.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.services; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.entities.migration.v2.MotdList; import java.util.Date; diff --git a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java index 34abcf4b0..c1f826901 100644 --- a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java @@ -17,7 +17,7 @@ */ package de.thm.arsnova.services; -import de.thm.arsnova.entities.Motd; +import de.thm.arsnova.entities.migration.v2.Motd; import de.thm.arsnova.entities.migration.v2.MotdList; import de.thm.arsnova.entities.migration.v2.Room; import de.thm.arsnova.entities.UserAuthentication; -- GitLab