diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/com/p4square/grow/backend/feed/ThreadResource.java | 5 | ||||
| -rw-r--r-- | src/com/p4square/grow/backend/feed/TopicResource.java | 20 | ||||
| -rw-r--r-- | src/com/p4square/grow/frontend/FeedData.java | 65 | ||||
| -rw-r--r-- | src/com/p4square/grow/frontend/JsonRequestProvider.java | 8 | ||||
| -rw-r--r-- | src/com/p4square/grow/frontend/TrainingPageResource.java | 10 | ||||
| -rw-r--r-- | src/com/p4square/grow/model/MessageThread.java | 15 | ||||
| -rw-r--r-- | src/com/p4square/grow/provider/JsonEncodedProvider.java | 17 | ||||
| -rw-r--r-- | src/templates/templates/communityfeed.ftl | 37 | 
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>  | 
