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