Author: doll
Date: Thu Mar 13 09:23:25 2008
New Revision: 636798

URL: http://svn.apache.org/viewvc?rev=636798&view=rev
Log:
Added an activities service for fetching and creating activities. The sample 
container can now fetch activities read from the state file. 
Creating activities is not fully supported yet, we need to do some json to pojo 
translation work first. 



Added:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ActivitiesService.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/Activity.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/StateFileDataHandler.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/GadgetDataTest.java

Added: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ActivitiesService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ActivitiesService.java?rev=636798&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ActivitiesService.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/ActivitiesService.java
 Thu Mar 13 09:23:25 2008
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.shindig.social.opensocial;
+
+import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.social.opensocial.model.Activity;
+
+import java.util.List;
+
+public interface ActivitiesService {
+  /**
+   * Returns a list of activities that correspond to the passed in person ids.
+   * @param ids The ids of the people to fetch activities for.
+   * @return a response item with the list of activities.
+   */
+  public ResponseItem<List<Activity>> getActivities(List<String> ids);
+
+  /**
+   * Creates the passed in activity for the given user. Once createActivity is
+   * called, getActivities will be able to return the Activity.
+   * @param personId The id of the person to create the activity for.
+   * @param activity The activity to create.
+   * @return a response item containing any errors
+   */
+  public ResponseItem createActivity(String personId, Activity activity);
+}

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/OpenSocialDataHandler.java
 Thu Mar 13 09:23:25 2008
@@ -22,10 +22,12 @@
 import org.json.JSONObject;
 import org.apache.shindig.social.samplecontainer.BasicPeopleService;
 import org.apache.shindig.social.samplecontainer.BasicDataService;
+import org.apache.shindig.social.samplecontainer.BasicActivitiesService;
 import org.apache.shindig.social.opensocial.PeopleService;
 import org.apache.shindig.social.opensocial.DataService;
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.model.OpenSocialDataType;
+import org.apache.shindig.social.opensocial.model.Activity;
 import org.apache.shindig.social.*;
 
 import java.io.IOException;
@@ -49,6 +51,8 @@
   // TODO: get through injection
   private static PeopleService peopleHandler = new BasicPeopleService();
   private static DataService dataHandler = new BasicDataService();
+  private static ActivitiesService activitiesHandler
+      = new BasicActivitiesService();
 
   public boolean shouldHandle(String requestType) {
     try {
@@ -87,6 +91,20 @@
 
           response = dataHandler.updatePersonData(id, key, value);
           break;
+
+        case FETCH_ACTIVITIES:
+          response = activitiesHandler.getActivities(peopleIds);
+          break;
+
+        case CREATE_ACTIVITY:
+          // We only support creating an activity for one person right now
+          String personId = peopleIds.get(0);
+
+          // TODO: We need to get the other fields from the json..
+          // so json -> pojo
+          Activity activity = new Activity("5", personId);
+          activity.setTitle("Temporary title - we don't read json right now");
+          response = activitiesHandler.createActivity(personId, activity);
       }
 
     } catch (JSONException e) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/Activity.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/Activity.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/Activity.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/Activity.java
 Thu Mar 13 09:23:25 2008
@@ -20,28 +20,30 @@
 import org.apache.shindig.social.Mandatory;
 import org.apache.shindig.social.AbstractGadgetData;
 
+import java.util.Map;
+import java.util.List;
+
 public class Activity extends AbstractGadgetData {
   private String appId;
   private String body;
   private String bodyId;
   private String externalId;
   @Mandatory private String id;
-  private MediaItem[] mediaItems;
+  private List<MediaItem> mediaItems;
   private Long postedTime;
   private Float priority;
   private String streamFaviconUrl;
   private String streamSourceUrl;
   private String streamTitle;
   private String streamUrl;
-  // private Map<String, String> templateParams
+  private Map<String, String> templateParams;
   private String title;
   private String titleId;
   private String url;
   @Mandatory private String userId;
 
-  public Activity(String id, String appId, String userId) {
+  public Activity(String id, String userId) {
     this.id = id;
-    this.appId = appId;
     this.userId = userId;
   }
 
@@ -85,11 +87,11 @@
     this.id = id;
   }
 
-  public MediaItem[] getMediaItems() {
+  public List<MediaItem> getMediaItems() {
     return mediaItems;
   }
 
-  public void setMediaItems(MediaItem[] mediaItems) {
+  public void setMediaItems(List<MediaItem> mediaItems) {
     this.mediaItems = mediaItems;
   }
 
@@ -139,6 +141,14 @@
 
   public void setStreamUrl(String streamUrl) {
     this.streamUrl = streamUrl;
+  }
+
+  public Map<String, String> getTemplateParams() {
+    return templateParams;
+  }
+
+  public void setTemplateParams(Map<String, String> templateParams) {
+    this.templateParams = templateParams;
   }
 
   public String getTitle() {

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/model/OpenSocialDataType.java
 Thu Mar 13 09:23:25 2008
@@ -18,5 +18,7 @@
 package org.apache.shindig.social.opensocial.model;
 
 public enum OpenSocialDataType {
-  FETCH_PEOPLE, FETCH_PERSON_APP_DATA, UPDATE_PERSON_APP_DATA, FETCH_ACTIVITIES
+  FETCH_PEOPLE,
+  FETCH_PERSON_APP_DATA, UPDATE_PERSON_APP_DATA, 
+  FETCH_ACTIVITIES, CREATE_ACTIVITY
 }

Added: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java?rev=636798&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
 (added)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicActivitiesService.java
 Thu Mar 13 09:23:25 2008
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.shindig.social.samplecontainer;
+
+import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.social.opensocial.ActivitiesService;
+import org.apache.shindig.social.opensocial.model.Activity;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Date;
+
+/**
+ * @author Cassandra Doll <[EMAIL PROTECTED]>
+ */
+public class BasicActivitiesService implements ActivitiesService {
+  public ResponseItem<List<Activity>> getActivities(List<String> ids) {
+    Map<String, List<Activity>> allActivities =
+        XmlStateFileFetcher.get().getActivities();
+
+    List<Activity> activities = new ArrayList<Activity>();
+
+    for (String id : ids) {
+      List<Activity> personActivities = allActivities.get(id);
+      if (personActivities != null) {
+        activities.addAll(personActivities);
+      }
+    }
+
+    // TODO: Sort them
+    return new ResponseItem<List<Activity>>(activities);
+  }
+
+  public ResponseItem createActivity(String personId, Activity activity) {
+    // TODO: Validate the activity and do any template expanding
+    activity.setUserId(personId);
+    activity.setPostedTime(new Date().getTime());
+
+    XmlStateFileFetcher.get().createActivity(personId, activity);
+    return new ResponseItem<JSONObject>(new JSONObject());
+  }
+}

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicDataService.java
 Thu Mar 13 09:23:25 2008
@@ -17,14 +17,9 @@
  */
 package org.apache.shindig.social.samplecontainer;
 
-import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.social.ResponseItem;
 import org.apache.shindig.social.opensocial.DataService;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Element;
 import org.json.JSONObject;
 
 import java.util.HashMap;

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/StateFileDataHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/StateFileDataHandler.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/StateFileDataHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/StateFileDataHandler.java
 Thu Mar 13 09:23:25 2008
@@ -42,7 +42,7 @@
   public boolean shouldHandle(String requestType) {
      try {
       // There should be a cleaner way to do this...
-      RequestType.valueOf(requestType);                                        
 
+      RequestType.valueOf(requestType);
       return true;
     } catch (IllegalArgumentException e) {
       return false;
@@ -62,6 +62,7 @@
         state.put("people", fetcher.getAllPeople());
         state.put("idMap", fetcher.getIdMap());
         state.put("data", fetcher.getAppData());
+        state.put("activities", fetcher.getActivities());
         response = new ResponseItem<Map<String, Object>>(state);
         break;
       case SET_STATE:

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/XmlStateFileFetcher.java
 Thu Mar 13 09:23:25 2008
@@ -9,6 +9,8 @@
 import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.Name;
 import org.apache.shindig.social.opensocial.model.Phone;
+import org.apache.shindig.social.opensocial.model.Activity;
+import org.apache.shindig.social.opensocial.model.MediaItem;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
@@ -40,7 +42,6 @@
     return fetcher;
   }
 
-
   private URI stateFile;
   private Document document;
 
@@ -49,6 +50,7 @@
   private Map<String, Map<String, String>> allData;
   private Map<IdSpec.Type, List<String>> idMap;
   private Map<String, Person> allPeople;
+  private Map<String, List<Activity>> allActivities;
 
   private XmlStateFileFetcher() {
    try {
@@ -59,6 +61,15 @@
     }
   }
 
+  public void resetStateFile(URI stateFile) {
+    this.stateFile = stateFile;
+    this.document = null;
+    this.allData = null;
+    this.idMap = null;
+    this.allPeople = null;
+    this.allActivities = null;
+  }
+
   private Document fetchStateDocument() {
     if (document != null) {
       return document;
@@ -212,13 +223,92 @@
     idMap.put(idType, ids);
   }
 
+  public Map<String, List<Activity>> getActivities() {
+    if (allActivities == null) {
+      setupActivities();
+    }
+
+    return allActivities;
+  }
+
+  private void setupActivities() {
+    allActivities = new HashMap<String, List<Activity>>();
 
-  public void resetStateFile(URI stateFile) {
-    this.stateFile = stateFile;
-    this.document = null;
-    this.allData = null;
-    this.idMap = null;
-    this.allPeople = null;
+    Element root = this.fetchStateDocument().getDocumentElement();
+    NodeList activitiesElements = root.getElementsByTagName("activities");
+
+    if (activitiesElements != null && activitiesElements.item(0) != null) {
+      NodeList streamItems = activitiesElements.item(0).getChildNodes();
+
+      for (int i = 0; i < streamItems.getLength(); i++) {
+        Node streamItem = streamItems.item(i);
+        NamedNodeMap streamParams = streamItem.getAttributes();
+        String streamTitle = "", userId = "";
+        if (streamParams != null) {
+          streamTitle = streamParams.getNamedItem("title").getNodeValue();
+          userId = streamParams.getNamedItem("userId").getNodeValue();
+        }
+
+        createActivities(streamItem, userId, streamTitle);
+      }
+    }
+  }
+
+  private void createActivities(Node streamItem, String userId,
+      String streamTitle) {
+    NodeList activityItems = streamItem.getChildNodes();
+    if (activityItems != null) {
+      for (int i = 0; i < activityItems.getLength(); i++) {
+        Node activityItem = activityItems.item(i);
+        NamedNodeMap activityParams = activityItem.getAttributes();
+        if (activityParams == null) {
+          continue;
+        }
+
+        String title = activityParams.getNamedItem("title").getNodeValue();
+        String body = activityParams.getNamedItem("body").getNodeValue();
+        String id = activityParams.getNamedItem("id").getNodeValue();
+
+        Activity activity = new Activity(id, userId);
+        activity.setStreamTitle(streamTitle);
+        activity.setTitle(title);
+        activity.setBody(body);
+        activity.setMediaItems(getMediaItems(activityItem));
+
+        createActivity(userId, activity);
+      }
+    }
   }
 
+  private List<MediaItem> getMediaItems(Node activityItem) {
+    List<MediaItem> media = new ArrayList<MediaItem>();
+
+    NodeList mediaItems = activityItem.getChildNodes();
+    if (mediaItems != null) {
+      for (int i = 0; i < mediaItems.getLength(); i++) {
+        NamedNodeMap mediaParams = mediaItems.item(i).getAttributes();
+        if (mediaParams != null) {
+          String typeString = mediaParams.getNamedItem("type").getNodeValue();
+          String mimeType = 
mediaParams.getNamedItem("mimeType").getNodeValue();
+          String url = mediaParams.getNamedItem("url").getNodeValue();
+
+          media.add(new MediaItem(mimeType,
+              MediaItem.Type.valueOf(typeString), url));
+        }
+      }
+    }
+
+    return media;
+  }
+
+  public void createActivity(String userId, Activity activity) {
+    if (allActivities == null) {
+      setupActivities();
+    }
+
+    if (allActivities.get(userId) == null) {
+      allActivities.put(userId, new ArrayList<Activity>());
+    }
+    allActivities.get(userId).add(activity);
+  }
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/GadgetDataTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/GadgetDataTest.java?rev=636798&r1=636797&r2=636798&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/GadgetDataTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/GadgetDataTest.java
 Thu Mar 13 09:23:25 2008
@@ -25,6 +25,8 @@
 
 import java.util.Map;
 import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
 
 public class GadgetDataTest extends TestCase {
   private Person johnDoe;
@@ -50,10 +52,10 @@
     };
     johnDoe.setEmails(emails);
 
-    activity = new Activity("activityId", "appId", johnDoe.getId());
-    MediaItem[] mediaItems = {
-        new MediaItem("image/jpg", MediaItem.Type.IMAGE, "http://foo.bar";)
-    };
+    activity = new Activity("activityId", johnDoe.getId());
+
+    List<MediaItem> mediaItems = new ArrayList<MediaItem>();
+    mediaItems.add(new MediaItem("image/jpg", MediaItem.Type.IMAGE, 
"http://foo.bar";));
     activity.setMediaItems(mediaItems);
   }
 
@@ -94,13 +96,12 @@
   public void testActivityToJson() throws Exception {
     JSONObject result = activity.toJson();
     assertEquals(activity.getUserId(), result.getString("userId"));
-    assertEquals(activity.getAppId(), result.getString("appId"));
     assertEquals(activity.getId(), result.getString("id"));
 
     JSONArray mediaItemsArray = result.getJSONArray("mediaItems");
     assertEquals(1, mediaItemsArray.length());
 
-    MediaItem expectedItem = activity.getMediaItems()[0];
+    MediaItem expectedItem = activity.getMediaItems().get(0);
     JSONObject actualItem = mediaItemsArray.getJSONObject(0);
 
     assertEquals(expectedItem.getUrl(), actualItem.getString("url"));
@@ -121,7 +122,8 @@
     item2Map.put("value", "2");
     map.put("item2", item2Map);
 
-    ResponseItem response = new ResponseItem(map);
+    ResponseItem response 
+        = new ResponseItem<Map<String, Map<String, String>>>(map);
     JSONObject result = response.toJson();
 
     JSONObject jsonMap = result.getJSONObject("response");


Reply via email to