From 9462bd1d6a8084c378d28d58464f9d771065fcff Mon Sep 17 00:00:00 2001
From: Christoph Thelen <christoph.thelen@mni.thm.de>
Date: Wed, 22 Oct 2014 15:06:41 +0200
Subject: [PATCH] Tested and refactored some view code

---
 .../java/de/thm/arsnova/dao/CouchDBDao.java   | 56 ++----------------
 .../java/de/thm/arsnova/dao/NovaView.java     | 58 ++++++++++++++-----
 .../java/de/thm/arsnova/dao/NovaViewTest.java | 25 ++++++++
 3 files changed, 74 insertions(+), 65 deletions(-)

diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 24a225137..43e1d4ada 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -20,8 +20,6 @@
 package de.thm.arsnova.dao;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
 import java.util.AbstractMap;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
@@ -39,7 +37,6 @@ import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.util.JSONUtils;
 
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -150,11 +147,7 @@ public class CouchDBDao implements IDatabaseDao {
 		for (Session s : sessions) {
 			interposedQueryKeys.add("[\"" + s.get_id() + "\",\"unread\"]");
 		}
-		try {
-			interposedCountView.setKeys(URLEncoder.encode("["+StringUtils.join(interposedQueryKeys, ",")+"]", "UTF-8"));
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		interposedCountView.setKeys(interposedQueryKeys);
 		interposedCountView.setGroup(true);
 		return getSessionInfoData(sessions, questionCountView, answerCountView, interposedCountView);
 	}
@@ -167,11 +160,7 @@ public class CouchDBDao implements IDatabaseDao {
 		for (Session s : sessions) {
 			answeredQuestionQueryKeys.add("[\"" + user.getUsername() + "\",\"" + s.get_id() + "\"]");
 		}
-		try {
-			answeredQuestionsView.setKeys(URLEncoder.encode("["+StringUtils.join(answeredQuestionQueryKeys, ",")+"]", "UTF-8"));
-		} catch (UnsupportedEncodingException e) {
-			throw new RuntimeException(e);
-		}
+		answeredQuestionsView.setKeys(answeredQuestionQueryKeys);
 		return getVisitedSessionInfoData(sessions, answeredQuestionsView, questionIdsView);
 	}
 
@@ -1172,18 +1161,12 @@ public class CouchDBDao implements IDatabaseDao {
 		return getInfosForSessions(sessions);
 	}
 
-	private static class ExtendedView extends View {
-
-		private String keys;
+	private static class ExtendedView extends NovaView {
 
 		public ExtendedView(final String fullname) {
 			super(fullname);
 		}
 
-		public void setKeys(final String newKeys) {
-			keys = newKeys;
-		}
-
 		public void setCourseIdKeys(final List<Course> courses) {
 			List<String> courseIds = new ArrayList<String>();
 			for (Course c : courses) {
@@ -1201,38 +1184,7 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 
 		public void setKeyList(final List<String> keylist) {
-			if (keylist.isEmpty()) {
-				keys = "[]";
-				return;
-			}
-
-			final StringBuilder sb = new StringBuilder();
-			// generates: ["<key>","<key>","<key>",...]
-			sb.append("[\"" + StringUtils.join(keylist, "\",\"") + "\"]");
-			try {
-				setKeys(URLEncoder.encode(sb.toString(), "UTF-8"));
-			} catch (final UnsupportedEncodingException e) {
-				LOGGER.error("Error while encoding course ID keys", e);
-			}
-		}
-
-		@Override
-		public String getQueryString() {
-			final StringBuilder query = new StringBuilder();
-			if (super.getQueryString() != null) {
-				query.append(super.getQueryString());
-			}
-			if (keys != null) {
-				if (!query.toString().isEmpty()) {
-					query.append("&");
-				}
-				query.append("keys=" + keys);
-			}
-
-			if (query.toString().isEmpty()) {
-				return null;
-			}
-			return query.toString();
+			setKeys(keylist);
 		}
 	}
 
diff --git a/src/main/java/de/thm/arsnova/dao/NovaView.java b/src/main/java/de/thm/arsnova/dao/NovaView.java
index 7649b6869..dbcbb8f55 100644
--- a/src/main/java/de/thm/arsnova/dao/NovaView.java
+++ b/src/main/java/de/thm/arsnova/dao/NovaView.java
@@ -20,11 +20,17 @@ package de.thm.arsnova.dao;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
 
 import com.fourspaces.couchdb.View;
 
 public class NovaView extends View {
 
+	protected String keys;
+
 	public NovaView(final String fullname) {
 		super(fullname);
 	}
@@ -80,22 +86,40 @@ public class NovaView extends View {
 		key = toJsonArray(keys);
 	}
 
-	private String toJsonArray(final String[] strings) {
-		final StringBuilder sb = new StringBuilder();
-		for (final String str : strings) {
-			if (isNumber(str)) {
-				sb.append(str + ",");
-			} else if (str.equals("{}")) {
-				sb.append(str + ",");
+	public void setKeys(List<String> keys) {
+		this.keys = toJsonArray(keys.toArray(new String[keys.size()]));
+	}
+
+	@Override
+	public String getQueryString() {
+		final String tempQuery = super.getQueryString();
+		final StringBuilder query = new StringBuilder();
+		if (tempQuery != null) {
+			query.append(tempQuery);
+		}
+		if (keys != null) {
+			if (query.length() > 0) {
+				query.append("&");
+			}
+			query.append("keys=" + keys);
+		}
+
+		if (query.length() == 0) {
+			return null;
+		}
+		return query.toString();
+	}
+
+	private String toJsonArray(final String[] strs) {
+		final List<String> strings = new ArrayList<String>();
+		for (final String string : strs) {
+			if (isNumber(string) || isPlaceholder(string) || isArray(string)) {
+				strings.add(string);
 			} else {
-				sb.append("\"" + str + "\"" + ",");
+				strings.add("\"" + string + "\"");
 			}
 		}
-		// remove final comma
-		sb.replace(sb.length() - 1, sb.length(), "");
-		sb.insert(0, "[");
-		sb.append("]");
-		return encode(sb.toString());
+		return encode("[" + StringUtils.join(strings, ",") + "]");
 	}
 
 	private String quote(final String string) {
@@ -106,6 +130,14 @@ public class NovaView extends View {
 		return string.matches("^[0-9]+$");
 	}
 
+	private boolean isPlaceholder(final String string) {
+		return string.equals("{}");
+	}
+
+	private boolean isArray(final String string) {
+		return string.startsWith("[") && string.endsWith("]");
+	}
+
 	private String encode(final String string) {
 		try {
 			return URLEncoder.encode(string, "UTF-8");
diff --git a/src/test/java/de/thm/arsnova/dao/NovaViewTest.java b/src/test/java/de/thm/arsnova/dao/NovaViewTest.java
index 4b6b28c9f..2d8d14e6a 100644
--- a/src/test/java/de/thm/arsnova/dao/NovaViewTest.java
+++ b/src/test/java/de/thm/arsnova/dao/NovaViewTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.Arrays;
 
 import org.junit.Test;
 
@@ -108,6 +109,30 @@ public class NovaViewTest {
 		assertEncodedEquals("endkey", "[2]", v2.getQueryString());
 	}
 
+	@Test
+	public void shouldSupportAddingKeysParameter() {
+		String[] stringKeys = new String[] { "foo", "bar" };
+		String[] numberKeys = new String[] { "123", "456" };
+		String[] mixedKeys = new String[] { "foo", "123" };
+		String[] arrayKeys = new String[] { "[\"foo\",123]", "[456,\"bar\"]" };
+		String[] emptyKeys = new String[0];
+		final NovaView v1 = new NovaView(null);
+		final NovaView v2 = new NovaView(null);
+		final NovaView v3 = new NovaView(null);
+		final NovaView v4 = new NovaView(null);
+		final NovaView v5 = new NovaView(null);
+		v1.setKeys(Arrays.asList(stringKeys));
+		v2.setKeys(Arrays.asList(numberKeys));
+		v3.setKeys(Arrays.asList(mixedKeys));
+		v4.setKeys(Arrays.asList(arrayKeys));
+		v5.setKeys(Arrays.asList(emptyKeys));
+		assertEncodedEquals("keys", "[\"foo\",\"bar\"]", v1.getQueryString());
+		assertEncodedEquals("keys", "[123,456]", v2.getQueryString());
+		assertEncodedEquals("keys", "[\"foo\",123]", v3.getQueryString());
+		assertEncodedEquals("keys", "[[\"foo\",123],[456,\"bar\"]]", v4.getQueryString());
+		assertEncodedEquals("keys", "[]", v5.getQueryString());
+	}
+
 	private void assertEncodedEquals(final String key, final String expected, final String actual) {
 		try {
 			assertEquals(key + "=" + URLEncoder.encode(expected, "UTF-8"), actual);
-- 
GitLab