summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Morgan <jesse@jesterpm.net>2014-02-20 21:14:34 -0800
committerJesse Morgan <jesse@jesterpm.net>2014-02-20 21:14:34 -0800
commit379c3fd79c4846b3453c1ad5195ca9b627176f06 (patch)
tree2cda81edbdd023ec3503a959d79b9861b1c13472
parent91f5eb337fb7223cc680582d42f2d31a906cfbca (diff)
Added support for displaying message on Feed.
Changed MessageThread so that a thread always contains one original message. Added support in JsonEncodedProvider for JavaTypes in addition to classes. Updated communityfeed.ftl to actually display questions and answers.
-rw-r--r--src/com/p4square/grow/backend/feed/ThreadResource.java5
-rw-r--r--src/com/p4square/grow/backend/feed/TopicResource.java20
-rw-r--r--src/com/p4square/grow/frontend/FeedData.java65
-rw-r--r--src/com/p4square/grow/frontend/JsonRequestProvider.java8
-rw-r--r--src/com/p4square/grow/frontend/TrainingPageResource.java10
-rw-r--r--src/com/p4square/grow/model/MessageThread.java15
-rw-r--r--src/com/p4square/grow/provider/JsonEncodedProvider.java17
-rw-r--r--src/templates/templates/communityfeed.ftl37
8 files changed, 153 insertions, 24 deletions
diff --git a/src/com/p4square/grow/backend/feed/ThreadResource.java b/src/com/p4square/grow/backend/feed/ThreadResource.java
index 32a2f64..c0604a8 100644
--- a/src/com/p4square/grow/backend/feed/ThreadResource.java
+++ b/src/com/p4square/grow/backend/feed/ThreadResource.java
@@ -6,6 +6,7 @@ package com.p4square.grow.backend.feed;
import java.io.IOException;
+import java.util.Date;
import java.util.Map;
import java.util.UUID;
@@ -87,6 +88,10 @@ public class ThreadResource extends ServerResource {
message.setThreadId(mThreadId);
message.setId(String.format("%x-%s", System.currentTimeMillis(), UUID.randomUUID().toString()));
+ if (message.getCreated() == null) {
+ message.setCreated(new Date());
+ }
+
String collectionKey = mTopic + "/" + mThreadId;
mBackend.getMessageProvider().put(collectionKey, message.getId(), message);
diff --git a/src/com/p4square/grow/backend/feed/TopicResource.java b/src/com/p4square/grow/backend/feed/TopicResource.java
index 0904baa..3519ca9 100644
--- a/src/com/p4square/grow/backend/feed/TopicResource.java
+++ b/src/com/p4square/grow/backend/feed/TopicResource.java
@@ -6,7 +6,9 @@ package com.p4square.grow.backend.feed;
import java.io.IOException;
+import java.util.Date;
import java.util.Map;
+import java.util.UUID;
import org.restlet.data.Status;
import org.restlet.resource.ServerResource;
@@ -16,6 +18,7 @@ import org.restlet.ext.jackson.JacksonRepresentation;
import org.apache.log4j.Logger;
+import com.p4square.grow.model.Message;
import com.p4square.grow.model.MessageThread;
/**
@@ -72,12 +75,25 @@ public class TopicResource extends ServerResource {
}
try {
+ // Deserialize the incoming message.
+ JacksonRepresentation<Message> jsonRep = new JacksonRepresentation<Message>(entity, Message.class);
+ Message message = jsonRep.getObject();
+ if (message.getCreated() == null) {
+ message.setCreated(new Date());
+ }
+
+ // Create the new thread.
MessageThread newThread = MessageThread.createNew();
+
+ // Force the thread id and message to be what we expect.
+ message.setId(String.format("%x-%s", System.currentTimeMillis(), UUID.randomUUID().toString()));
+ message.setThreadId(newThread.getId());
+ newThread.setMessage(message);
+
mBackend.getThreadProvider().put(mTopic, newThread.getId(), newThread);
- setStatus(Status.SUCCESS_NO_CONTENT);
setLocationRef(mTopic + "/" + newThread.getId());
- return null;
+ return new JacksonRepresentation(newThread);
} catch (IOException e) {
LOG.error("Unexpected exception: " + e.getMessage(), e);
diff --git a/src/com/p4square/grow/frontend/FeedData.java b/src/com/p4square/grow/frontend/FeedData.java
new file mode 100644
index 0000000..acff8d9
--- /dev/null
+++ b/src/com/p4square/grow/frontend/FeedData.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2014 Jesse Morgan
+ */
+
+package com.p4square.grow.frontend;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.restlet.Context;
+import org.restlet.Restlet;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+
+import com.p4square.grow.config.Config;
+import com.p4square.grow.frontend.JsonRequestProvider;
+import com.p4square.grow.model.Message;
+import com.p4square.grow.model.MessageThread;
+import com.p4square.grow.provider.JsonEncodedProvider;
+import com.p4square.grow.provider.Provider;
+
+/**
+ * Fetch feed data for a topic.
+ */
+public class FeedData {
+
+ private final Config mConfig;
+ private final String mBackendURI;
+
+ private final Provider<String, List<MessageThread>> mThreadProvider;
+ private final Provider<String, List<Message>> mMessageProvider;
+
+ public FeedData(final Context context, final Config config) {
+ mConfig = config;
+ mBackendURI = mConfig.getString("backendUri", "riap://component/backend") + "/feed";
+
+ Restlet clientDispatcher = context.getClientDispatcher();
+
+ TypeFactory factory = JsonEncodedProvider.MAPPER.getTypeFactory();
+
+ JavaType threadType = factory.constructCollectionType(List.class, MessageThread.class);
+ mThreadProvider = new JsonRequestProvider<List<MessageThread>>(clientDispatcher, threadType);
+
+ JavaType messageType = factory.constructCollectionType(List.class, Message.class);
+ mMessageProvider = new JsonRequestProvider<List<Message>>(clientDispatcher, messageType);
+ }
+
+ public List<MessageThread> getThreads(final String topic) throws IOException {
+ return mThreadProvider.get(makeUrl(topic));
+ }
+
+ public List<Message> getMessages(final String topic, final String threadId) throws IOException {
+ return mMessageProvider.get(makeUrl(topic, threadId));
+ }
+
+ private String makeUrl(String... parts) {
+ String url = mBackendURI;
+ for (String part : parts) {
+ url += "/" + part;
+ }
+
+ return url;
+ }
+}
diff --git a/src/com/p4square/grow/frontend/JsonRequestProvider.java b/src/com/p4square/grow/frontend/JsonRequestProvider.java
index c372251..8eee6d3 100644
--- a/src/com/p4square/grow/frontend/JsonRequestProvider.java
+++ b/src/com/p4square/grow/frontend/JsonRequestProvider.java
@@ -6,6 +6,8 @@ package com.p4square.grow.frontend;
import java.io.IOException;
+import com.fasterxml.jackson.databind.JavaType;
+
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.Restlet;
@@ -31,6 +33,12 @@ public class JsonRequestProvider<V> extends JsonEncodedProvider<String, V> {
mDispatcher = dispatcher;
}
+ public JsonRequestProvider(Restlet dispatcher, JavaType type) {
+ super(type);
+
+ mDispatcher = dispatcher;
+ }
+
@Override
public V get(String url) throws IOException {
Request request = new Request(Method.GET, url);
diff --git a/src/com/p4square/grow/frontend/TrainingPageResource.java b/src/com/p4square/grow/frontend/TrainingPageResource.java
index 0f2b284..a7ebd61 100644
--- a/src/com/p4square/grow/frontend/TrainingPageResource.java
+++ b/src/com/p4square/grow/frontend/TrainingPageResource.java
@@ -70,6 +70,7 @@ public class TrainingPageResource extends FreeMarkerPageResource {
private JsonRequestClient mJsonClient;
private Provider<String, TrainingRecord> mTrainingRecordProvider;
+ private FeedData mFeedData;
// Fields pertaining to this request.
protected String mChapter;
@@ -95,6 +96,8 @@ public class TrainingPageResource extends FreeMarkerPageResource {
}
};
+ mFeedData = new FeedData(getContext(), mConfig);
+
mChapter = getAttribute("chapter");
mUserId = getRequest().getClientInfo().getUser().getIdentifier();
}
@@ -209,7 +212,12 @@ public class TrainingPageResource extends FreeMarkerPageResource {
root.put("overallProgress", overallProgress);
root.put("videos", videos);
root.put("allowUserToSkip", allowUserToSkip);
- root.put("showfeed", getQueryValue("showfeed") != null);
+
+ boolean showfeed = getQueryValue("showfeed") != null;
+ root.put("showfeed", showfeed);
+ if (showfeed) {
+ root.put("feeddata", mFeedData);
+ }
return new TemplateRepresentation(mTrainingTemplate, root, MediaType.TEXT_HTML);
diff --git a/src/com/p4square/grow/model/MessageThread.java b/src/com/p4square/grow/model/MessageThread.java
index f93ec13..25a46b7 100644
--- a/src/com/p4square/grow/model/MessageThread.java
+++ b/src/com/p4square/grow/model/MessageThread.java
@@ -12,6 +12,7 @@ import java.util.UUID;
*/
public class MessageThread {
private String mId;
+ private Message mMessage;
/**
* Create a new thread with a probably unique id.
@@ -40,4 +41,18 @@ public class MessageThread {
mId = id;
}
+ /**
+ * @return The original message.
+ */
+ public Message getMessage() {
+ return mMessage;
+ }
+
+ /**
+ * Set the original message.
+ * @param id The new message.
+ */
+ public void setMessage(Message message) {
+ mMessage = message;
+ }
}
diff --git a/src/com/p4square/grow/provider/JsonEncodedProvider.java b/src/com/p4square/grow/provider/JsonEncodedProvider.java
index 655b531..03e4056 100644
--- a/src/com/p4square/grow/provider/JsonEncodedProvider.java
+++ b/src/com/p4square/grow/provider/JsonEncodedProvider.java
@@ -7,6 +7,7 @@ package com.p4square.grow.provider;
import java.io.IOException;
import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
@@ -25,9 +26,16 @@ public abstract class JsonEncodedProvider<K, V> implements Provider<K, V> {
}
private final Class<V> mClazz;
+ private final JavaType mType;
public JsonEncodedProvider(Class<V> clazz) {
mClazz = clazz;
+ mType = null;
+ }
+
+ public JsonEncodedProvider(JavaType type) {
+ mType = type;
+ mClazz = null;
}
/**
@@ -53,7 +61,14 @@ public abstract class JsonEncodedProvider<K, V> implements Provider<K, V> {
return null;
}
- V obj = MAPPER.readValue(blob, mClazz);
+ V obj;
+ if (mClazz != null) {
+ obj = MAPPER.readValue(blob, mClazz);
+
+ } else {
+ obj = MAPPER.readValue(blob, mType);
+ }
+
return obj;
}
}
diff --git a/src/templates/templates/communityfeed.ftl b/src/templates/templates/communityfeed.ftl
index f3e9477..e1ef191 100644
--- a/src/templates/templates/communityfeed.ftl
+++ b/src/templates/templates/communityfeed.ftl
@@ -1,24 +1,21 @@
<div id="thefeed">
<h2>The Feed</h2>
- <article>
- <div class="question">
- Q: How has God worked in your life...
- <div><a class="reply" href="#">Answer</a></div>
- </div>
- <div class="answer">
- A: God has worked in an amazing way in my own life. I constantly
- <a class="readmore" href="#">(continue)</a>
- </div>
- </article>
- <article>
- <div class="question">
- Q: How has God worked in your life...
- <div><a class="reply" href="#">Answer</a></div>
- </div>
- <div class="answer">
- A: God has worked in an amazing way in my own life. I constantly
- <a class="readmore" href="#">(continue)</a>
- </div>
- </article>
+
+ <#assign threads = feeddata.getThreads(chapter)>
+ <#list threads as thread>
+ <#assign messages = feeddata.getMessages(chapter, thread.id)>
+ <article>
+ <div class="question" id="${thread.id}">
+ Q: ${thread.message.message!""}
+ <div><a class="reply" href="#">Answer</a></div>
+ </div>
+ <#list messages as msg>
+ <div class="answer" id="${msg.id}">
+ A: ${msg.message!""}
+ <a class="readmore" href="#">(continue)</a>
+ </div>
+ </#list>
+ </article>
+ </#list>
</div>