summaryrefslogtreecommitdiff
path: root/src/com
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
commita2a1d7a67b1458cc342c0eb8d5a2732c806ddacf (patch)
tree3278235acde130e2abbf0ed61dfbe1a795c095b6 /src/com
parent9d2016bd2320f9b252e91057a36455d31457236d (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.
Diffstat (limited to 'src/com')
-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
7 files changed, 136 insertions, 4 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 ef8515a..7b36538 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;
}
}