diff options
Diffstat (limited to 'src/com')
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; } } |