From 9d0255e771a91f60c450dd65e7fd8693b22bb584 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=20K=C3=A4sler?= <tom.kaesler@mni.thm.de>
Date: Mon, 8 Oct 2018 22:51:08 +0200
Subject: [PATCH] change contentgroup to array in room model

See merge request !94
---
 src/main/java/de/thm/arsnova/model/Room.java  | 20 ++++--
 .../arsnova/service/ContentServiceImpl.java   | 68 +++++++++++++------
 .../thm/arsnova/service/RoomServiceImpl.java  |  8 +--
 3 files changed, 69 insertions(+), 27 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/model/Room.java b/src/main/java/de/thm/arsnova/model/Room.java
index cb85893ef..ad3610d19 100644
--- a/src/main/java/de/thm/arsnova/model/Room.java
+++ b/src/main/java/de/thm/arsnova/model/Room.java
@@ -12,9 +12,20 @@ import java.util.Set;
 
 public class Room extends Entity {
 	public static class ContentGroup {
+		private String name;
 		private Set<String> contentIds;
 		private boolean autoSort;
 
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getName() {
+			return this.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 Set<String> getContentIds() {
 			if (contentIds == null) {
@@ -42,6 +53,7 @@ public class Room extends Entity {
 		@Override
 		public String toString() {
 			return new ToStringCreator(this)
+					.append("name", name)
 					.append("contentIds", contentIds)
 					.append("autoSort", autoSort)
 					.toString();
@@ -297,7 +309,7 @@ public class Room extends Entity {
 	private String abbreviation;
 	private String description;
 	private boolean closed;
-	private Map<String, ContentGroup> contentGroups;
+	private Set<ContentGroup> contentGroups;
 	private Settings settings;
 	private Author author;
 	private PoolProperties poolProperties;
@@ -366,16 +378,16 @@ public class Room extends Entity {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public Map<String, ContentGroup> getContentGroups() {
+	public Set<ContentGroup> getContentGroups() {
 		if (contentGroups == null) {
-			contentGroups = new HashMap<>();
+			contentGroups = new HashSet<ContentGroup>();
 		}
 
 		return contentGroups;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setContentGroups(final Map<String, ContentGroup> contentGroups) {
+	public void setContentGroups(final Set<ContentGroup> contentGroups) {
 		this.contentGroups = contentGroups;
 	}
 
diff --git a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
index 4bd055372..a2e11f4f3 100644
--- a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
@@ -120,13 +120,17 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	public Iterable<Content> getByRoomIdAndGroup(final String roomId, final String group) {
 		final Room room = roomRepository.findOne(roomId);
-		final Room.ContentGroup contentGroup = room.getContentGroups().get(group);
+		Room.ContentGroup contentGroup = null;
+		for (Room.ContentGroup cg : room.getContentGroups()) {
+			if (cg.getName().equals(group)) {
+				contentGroup = cg;
+			}
+		}
 		if (contentGroup == null) {
 			throw new NotFoundException("Content group does not exist.");
 		}
-		Set<String> contentIds = contentGroup.getContentIds();
 
-		return get(contentIds);
+		return get(contentGroup.getContentIds());
 	}
 
 	@Override
@@ -138,7 +142,12 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	public int countByRoomIdAndGroup(final String roomId, final String group) {
 		final Room room = roomRepository.findOne(roomId);
-		final Room.ContentGroup contentGroup = room.getContentGroups().get(group);
+		Room.ContentGroup contentGroup = null;
+		for (Room.ContentGroup cg : room.getContentGroups()) {
+			if (cg.getName().equals(group)) {
+				contentGroup = cg;
+			}
+		}
 		if (contentGroup == null) {
 			throw new NotFoundException("Content group does not exist.");
 		}
@@ -173,10 +182,21 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	public void finalizeCreate(final Content content) {
 		/* Update content groups of room */
 		final Room room = roomRepository.findOne(content.getRoomId());
-		for (final String groupName : content.getGroups()) {
-			Room.ContentGroup group = room.getContentGroups().getOrDefault(groupName, new Room.ContentGroup());
-			room.getContentGroups().put(groupName, group);
-			group.getContentIds().add(content.getId());
+		final Set<Room.ContentGroup> contentGroups = room.getContentGroups();
+		for (final Room.ContentGroup cg : contentGroups) {
+			if (content.getGroups().contains(cg.getName())) {
+				cg.getContentIds().add(content.getId());
+				content.getGroups().remove(cg.getName());
+			}
+		}
+		for (final String newContentGroups : content.getGroups()) {
+			Room.ContentGroup newGroup = new Room.ContentGroup();
+			Set<String> newContentIds = new HashSet<String>();
+			newContentIds.add(content.getId());
+			newGroup.setName(newContentGroups);
+			newGroup.setAutoSort(true);
+			newGroup.setContentIds(newContentIds);
+			room.getContentGroups().add(newGroup);
 		}
 		roomRepository.save(room);
 
@@ -211,17 +231,26 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	public void finalizeUpdate(final Content content) {
 		/* Update content groups of room */
 		final Room room = roomRepository.findOne(content.getRoomId());
-		final Set<String> contentsGroupNames = content.getGroups();
-		final Set<String> allGroupNames = new HashSet<>(contentsGroupNames);
-		allGroupNames.addAll(room.getContentGroups().keySet());
-		for (final String groupName : allGroupNames) {
-			Room.ContentGroup group = room.getContentGroups().getOrDefault(groupName, new Room.ContentGroup());
-			if (contentsGroupNames.contains(groupName)) {
-				group.getContentIds().add(content.getId());
+		for (final Room.ContentGroup cg : room.getContentGroups()) {
+			if (content.getGroups().contains(cg.getName())) {
+				cg.getContentIds().add(content.getId());
+				content.getGroups().remove(cg.getName());
 			} else {
-				group.getContentIds().remove(content.getId());
+				cg.getContentIds().remove(content.getId());
+				if (cg.getContentIds().isEmpty()) {
+					room.getContentGroups().remove(cg);
+				}
 			}
 		}
+		for (final String newContentGroups : content.getGroups()) {
+			Room.ContentGroup newGroup = new Room.ContentGroup();
+			Set<String> newContentIds = new HashSet<String>();
+			newContentIds.add(content.getId());
+			newGroup.setName(newContentGroups);
+			newGroup.setAutoSort(true);
+			newGroup.setContentIds(newContentIds);
+			room.getContentGroups().add(newGroup);
+		}
 		roomRepository.save(room);
 
 		/* TODO: not sure yet how to refactor this code - we need access to the old and new entity
@@ -256,9 +285,10 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			throw new UnauthorizedException();
 		}
 
-		for (final String groupName : content.getGroups()) {
-			Room.ContentGroup group = room.getContentGroups().getOrDefault(groupName, new Room.ContentGroup());
-			group.getContentIds().remove(content.getId());
+		for (final Room.ContentGroup contentGroup : room.getContentGroups()) {
+			if (content.getGroups().contains(contentGroup.getName())) {
+				contentGroup.getContentIds().remove(contentId);
+			}
 		}
 		roomRepository.save(room);
 
diff --git a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
index 6df577940..816a49aa3 100644
--- a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
@@ -59,7 +59,6 @@ import java.util.Comparator;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
-import java.util.Map;
 import java.util.Set;
 import java.util.HashSet;
 
@@ -178,7 +177,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	public Room get(final String id) {
 		Room r = super.get(id);
 		// creates a set from all room content groups
-		Set<String> cIdsWithGroup = r.getContentGroups().values().stream()
+		Set<String> cIdsWithGroup = r.getContentGroups().stream()
 				.map(Room.ContentGroup::getContentIds)
 				.flatMap(ids -> ids.stream())
 				.collect(Collectors.toSet());
@@ -187,11 +186,12 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		cIds.removeAll(cIdsWithGroup);
 
 		if (!cIds.isEmpty()) {
-			Map<String, Room.ContentGroup> cgs = r.getContentGroups();
+			Set<Room.ContentGroup> cgs = r.getContentGroups();
 			Room.ContentGroup defaultGroup = new Room.ContentGroup();
 			defaultGroup.setContentIds(cIds);
 			defaultGroup.setAutoSort(true);
-			cgs.put("", defaultGroup);
+			defaultGroup.setName("");
+			cgs.add(defaultGroup);
 		}
 
 		return r;
-- 
GitLab