Author: doll
Date: Tue Mar 18 07:16:35 2008
New Revision: 638380

URL: http://svn.apache.org/viewvc?rev=638380&view=rev
Log:
The GadgetDataServlet now fetches the security token from all requests and 
creates a GadgetToken using the gadgetsigner (this is the same way that the 
signed request methods make gadget tokens)

This token is now passed to the people service methods (which have todos to 
refactor the apis) in order to determine the current viewer and owner.

For the sample container, this now means that you can change the current owner 
and viewer on the page. It also means that the state file format has changed. 
You no longer declare the owner and viewer, rather you declare people with 
friends. The dtd has been updated to reflect some of this. 


Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/RequestItem.java
    
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/PeopleService.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.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/javascript/samplecontainer/state-basicfriendlist.xml
    incubator/shindig/trunk/javascript/samplecontainer/state.dtd

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/GadgetDataServlet.java
 Tue Mar 18 07:16:35 2008
@@ -22,6 +22,9 @@
 import org.json.JSONObject;
 import org.apache.shindig.social.samplecontainer.StateFileDataHandler;
 import org.apache.shindig.social.opensocial.OpenSocialDataHandler;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetToken;
+import org.apache.shindig.gadgets.http.CrossServletState;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -29,6 +32,8 @@
 import java.util.List;
 import java.util.ArrayList;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -63,27 +68,41 @@
     handlers.add(new StateFileDataHandler());
   }
 
+  private CrossServletState servletState;
+
+  @Override
+  public void init(ServletConfig config) throws ServletException {
+    servletState = CrossServletState.get(config);
+  }
+
   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
       throws IOException {
-    // TODO: Get the security token and pass the viewer and owner along in the
-    // request items
 
     String requestParam = req.getParameter("request");
+    String token = req.getParameter("st");
 
     DataResponse response;
     try {
-      response = new DataResponse(createResponse(requestParam));
+      response = new DataResponse(createResponse(requestParam, token));
     } catch (JSONException e) {
       response = new DataResponse(ResponseError.BAD_REQUEST);
+    } catch (GadgetException e) {
+      logger.info("Request was made with invalid security token: " + token);
+      response = new DataResponse(ResponseError.BAD_REQUEST);
     }
 
     PrintWriter writer = resp.getWriter();
     writer.write(response.toJson().toString());
   }
 
-  private List<ResponseItem> createResponse(String requestParam)
-      throws JSONException {
+  private List<ResponseItem> createResponse(String requestParam, String token)
+      throws JSONException, GadgetException {
+    if (token == null || token.trim().isEmpty()) {
+      throw new GadgetException(GadgetException.Code.INVALID_GADGET_TOKEN);
+    }
+    GadgetToken securityToken = 
servletState.getGadgetSigner().createToken(token);
+
     // TODO: Improve json input handling. The json request should get auto
     // translated into objects
     List<ResponseItem> responseItems = new ArrayList<ResponseItem>();
@@ -94,7 +113,7 @@
     for (int i = 0; i < length; i++) {
       JSONObject jsonRequest = requestItems.getJSONObject(i);
       RequestItem requestItem = new RequestItem(jsonRequest.getString("type"),
-          jsonRequest);
+          jsonRequest, securityToken);
 
       ResponseItem response = new ResponseItem<Object>(
           ResponseError.NOT_IMPLEMENTED,

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/RequestItem.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/RequestItem.java?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/RequestItem.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/RequestItem.java
 Tue Mar 18 07:16:35 2008
@@ -18,6 +18,7 @@
 package org.apache.shindig.social;
 
 import org.json.JSONObject;
+import org.apache.shindig.gadgets.GadgetToken;
 
 /**
  * Represents the request items that come from the json. Each RequestItem 
should
@@ -26,10 +27,12 @@
 public class RequestItem extends AbstractGadgetData {
   private String type;
   private JSONObject params;
+  private GadgetToken token;
 
-  public RequestItem(String type, JSONObject params) {
+  public RequestItem(String type, JSONObject params, GadgetToken token) {
     this.type = type;
     this.params = params;
+    this.token = token;
   }
 
   public String getType() {
@@ -46,5 +49,13 @@
 
   public void setParams(JSONObject params) {
     this.params = params;
+  }
+
+  public GadgetToken getToken() {
+    return token;
+  }
+
+  public void setToken(GadgetToken token) {
+    this.token = token;
   }
 }

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=638380&r1=638379&r2=638380&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
 Tue Mar 18 07:16:35 2008
@@ -27,7 +27,10 @@
 import org.apache.shindig.social.opensocial.DataService;
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.model.Activity;
-import org.apache.shindig.social.*;
+import org.apache.shindig.social.ResponseError;
+import org.apache.shindig.social.RequestItem;
+import org.apache.shindig.social.GadgetDataHandler;
+import org.apache.shindig.social.ResponseItem;
 
 import java.util.logging.Logger;
 import java.util.logging.Level;
@@ -75,23 +78,25 @@
         new JSONObject());
 
     try {
-      String jsonSpec = request.getParams().getString("idSpec");
-      List<String> peopleIds = peopleHandler.getIds(IdSpec.fromJson(jsonSpec));
+      JSONObject params = request.getParams();
+      String jsonSpec = params.getString("idSpec");
+      List<String> peopleIds = peopleHandler.getIds(IdSpec.fromJson(jsonSpec),
+          request.getToken());
 
       switch (type) {
         case FETCH_PEOPLE :
-          JSONArray profileDetail = 
request.getParams().getJSONArray("profileDetail");
+          JSONArray profileDetail = params.getJSONArray("profileDetail");
           PeopleService.SortOrder sortOrder = PeopleService.SortOrder.valueOf(
-              request.getParams().getString("sortOrder"));
+              params.getString("sortOrder"));
           PeopleService.FilterType filter = PeopleService.FilterType.valueOf(
-              request.getParams().getString("filter"));
-          int first = request.getParams().getInt("first");
-          int max = request.getParams().getInt("max");
+              params.getString("filter"));
+          int first = params.getInt("first");
+          int max = params.getInt("max");
 
           // TODO: Should we put this in the requestitem and pass the whole
           // thing along?
           response = peopleHandler.getPeople(peopleIds, sortOrder, filter,
-              first, max);
+              first, max, request.getToken());
           break;
 
         case FETCH_PERSON_APP_DATA :
@@ -102,8 +107,8 @@
           // We only support updating one person right now
           String id = peopleIds.get(0);
 
-          String key = request.getParams().getString("key");
-          String value = request.getParams().getString("value");
+          String key = params.getString("key");
+          String value = params.getString("value");
 
           response = dataHandler.updatePersonData(id, key, value);
           break;

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/opensocial/PeopleService.java
 Tue Mar 18 07:16:35 2008
@@ -22,6 +22,7 @@
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.model.ApiCollection;
 import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.gadgets.GadgetToken;
 
 import java.util.List;
 
@@ -34,7 +35,8 @@
    * @return a list of person ids
    * @throws JSONException If the idSpec is malformed
    */
-  public List<String> getIds(IdSpec idSpec) throws JSONException;
+  public List<String> getIds(IdSpec idSpec, GadgetToken token)
+      throws JSONException;
 
   public enum SortOrder {
     topFriends, name
@@ -54,5 +56,6 @@
    * @return a list of people.
    */
   public ResponseItem<ApiCollection<Person>> getPeople(List<String> ids,
-      SortOrder sortOrder, FilterType filter, int first, int max);
+      SortOrder sortOrder, FilterType filter, int first, int max,
+      GadgetToken token);
 }

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/samplecontainer/BasicPeopleService.java
 Tue Mar 18 07:16:35 2008
@@ -22,6 +22,7 @@
 import org.apache.shindig.social.opensocial.model.IdSpec;
 import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.ApiCollection;
+import org.apache.shindig.gadgets.GadgetToken;
 import org.json.JSONException;
 
 import java.util.ArrayList;
@@ -41,12 +42,19 @@
   };
 
   public ResponseItem<ApiCollection<Person>> getPeople(List<String> ids,
-      SortOrder sortOrder, FilterType filter, int first, int max) {
+      SortOrder sortOrder, FilterType filter, int first, int max, GadgetToken 
token) {
     Map<String, Person> allPeople = XmlStateFileFetcher.get().getAllPeople();
 
     List<Person> people = new ArrayList<Person>();
     for (String id : ids) {
-      people.add(allPeople.get(id));
+      Person person = allPeople.get(id);
+      if (id.equals(token.getViewerId())) {
+        person.setIsViewer(true);
+      }
+      if (id.equals(token.getOwnerId())) {
+        person.setIsOwner(true);
+      }
+      people.add(person);
     }
 
     // We can pretend that by default the people are in top friends order
@@ -66,14 +74,29 @@
     return new ResponseItem<ApiCollection<Person>>(collection);
   }
 
-  public List<String> getIds(IdSpec idSpec) throws JSONException {
-    Map<IdSpec.Type, List<String>> idMap
-        = XmlStateFileFetcher.get().getIdMap();
-
-    if (idSpec.getType() == IdSpec.Type.USER_IDS) {
-      return idSpec.fetchUserIds();
-    } else {
-      return idMap.get(idSpec.getType());
+  public List<String> getIds(IdSpec idSpec, GadgetToken token)
+      throws JSONException {
+    Map<String, List<String>> friendIds
+        = XmlStateFileFetcher.get().getFriendIds();
+
+    List<String> ids = new ArrayList<String>();
+    switch(idSpec.getType()) {
+      case OWNER:
+        ids.add(token.getOwnerId());
+        break;
+      case VIEWER:
+        ids.add(token.getViewerId());
+        break;
+      case OWNER_FRIENDS:
+        ids.addAll(friendIds.get(token.getOwnerId()));
+        break;
+      case VIEWER_FRIENDS:
+        ids.addAll(friendIds.get(token.getOwnerId()));
+        break;
+      case USER_IDS:
+        ids.addAll(idSpec.fetchUserIds());
+        break;
     }
+    return ids;
   }
 }

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=638380&r1=638379&r2=638380&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
 Tue Mar 18 07:16:35 2008
@@ -59,7 +59,7 @@
       case DUMP_STATE:
         Map<String, Object> state = new HashMap<String, Object>();
         state.put("people", fetcher.getAllPeople());
-        state.put("idMap", fetcher.getIdMap());
+        state.put("friendIds", fetcher.getFriendIds());
         state.put("data", fetcher.getAppData());
         state.put("activities", fetcher.getActivities());
         response = new ResponseItem<Map<String, Object>>(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=638380&r1=638379&r2=638380&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
 Tue Mar 18 07:16:35 2008
@@ -1,29 +1,32 @@
 package org.apache.shindig.social.samplecontainer;
 
-import org.w3c.dom.*;
-import org.apache.shindig.gadgets.RemoteContentFetcher;
 import org.apache.shindig.gadgets.BasicRemoteContentFetcher;
 import org.apache.shindig.gadgets.RemoteContent;
+import org.apache.shindig.gadgets.RemoteContentFetcher;
 import org.apache.shindig.gadgets.RemoteContentRequest;
-import org.apache.shindig.social.opensocial.model.IdSpec;
-import org.apache.shindig.social.opensocial.model.Person;
 import org.apache.shindig.social.opensocial.model.Activity;
-import org.apache.shindig.social.opensocial.model.Phone;
-import org.apache.shindig.social.opensocial.model.Name;
 import org.apache.shindig.social.opensocial.model.MediaItem;
+import org.apache.shindig.social.opensocial.model.Name;
+import org.apache.shindig.social.opensocial.model.Person;
+import org.apache.shindig.social.opensocial.model.Phone;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.StringReader;
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.io.StringReader;
-import java.io.IOException;
-import java.util.Map;
-import java.util.List;
-import java.util.HashMap;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author Cassandra Doll <[EMAIL PROTECTED]>
@@ -64,7 +67,7 @@
   // TODO: This obviously won't work on multiple servers
   // If we care then we should do something about it
   private Map<String, Map<String, String>> allData;
-  private Map<IdSpec.Type, List<String>> idMap;
+  private Map<String, List<String>> friendIdMap;
   private Map<String, Person> allPeople;
   private Map<String, List<Activity>> allActivities;
 
@@ -81,7 +84,7 @@
     this.stateFile = stateFile;
     document = null;
     allData = null;
-    idMap = null;
+    friendIdMap = null;
     allPeople = null;
     allActivities = null;
   }
@@ -175,11 +178,11 @@
     personData.put(key, value);
   }
 
-  public Map<IdSpec.Type, List<String>> getIdMap() {
-    if (idMap == null) {
+  public Map<String, List<String>> getFriendIds() {
+    if (friendIdMap == null) {
       setupPeopleData();
     }
-    return idMap;
+    return friendIdMap;
   }
 
   public Map<String, Person> getAllPeople() {
@@ -192,44 +195,25 @@
   private void setupPeopleData() {
     Element root = fetchStateDocument().getDocumentElement();
 
-    idMap = new HashMap<IdSpec.Type, List<String>>();
     allPeople = new HashMap<String, Person>();
-
-    // TODO: Eventually the viewer and owner shouldn't be hardcoded. You should
-    // be able to visit other allPeople's "profile" pages in the sample 
container
-    setupPeopleInXmlTag(root, "viewer", IdSpec.Type.VIEWER);
-    setupPeopleInXmlTag(root, "owner", IdSpec.Type.OWNER);
-    setupPeopleInXmlTag(root, "viewerFriends", IdSpec.Type.VIEWER_FRIENDS);
-    setupPeopleInXmlTag(root, "ownerFriends", IdSpec.Type.OWNER_FRIENDS);
-
-    // Handle empty people
-    if (idMap.get(IdSpec.Type.OWNER).isEmpty()) {
-      idMap.put(IdSpec.Type.OWNER, idMap.get(IdSpec.Type.VIEWER));
-    }
-
-    if (idMap.get(IdSpec.Type.OWNER_FRIENDS).isEmpty()) {
-      idMap.put(IdSpec.Type.OWNER_FRIENDS,
-          idMap.get(IdSpec.Type.VIEWER_FRIENDS));
-    }
+    friendIdMap = new HashMap<String, List<String>>();
+    setupPeopleInXmlTag(root, "people");
   }
 
   // Adds all people in the xml tag to the allPeople map.
-  // Also puts ids into the idMap under the idType key
-  private void setupPeopleInXmlTag(Element root, String tagName,
-      IdSpec.Type idType) {
+  // Also puts friends ids into the friendIdMap
+  private void setupPeopleInXmlTag(Element root, String tagName) {
     // TODO: Use the opensource Collections library
-    List<String> ids = new ArrayList<String>();
-
     NodeList elements = root.getElementsByTagName(tagName);
     if (elements == null || elements.item(0) == null) {
-      idMap.put(idType, ids);
       return;
     }
 
     NodeList personNodes = elements.item(0).getChildNodes();
 
     for (int i = 0; i < personNodes.getLength(); i++) {
-      NamedNodeMap attributes = personNodes.item(i).getAttributes();
+      Node personNode = personNodes.item(i);
+      NamedNodeMap attributes = personNode.getAttributes();
       if (attributes == null) {
         continue;
       }
@@ -247,10 +231,20 @@
       }
 
       allPeople.put(id, person);
-      ids.add(id);
+      friendIdMap.put(id, getFriends(personNode));
     }
+  }
 
-    idMap.put(idType, ids);
+  private List<String> getFriends(Node personNode) {
+    List<String> friends = new ArrayList<String>();
+    NodeList friendNodes = personNode.getChildNodes();
+    for (int j = 0; j < friendNodes.getLength(); j++) {
+      String friendId = friendNodes.item(j).getTextContent();
+      if (friendId != null && !friendId.trim().isEmpty()) {
+        friends.add(friendId.trim());
+      }
+    }
+    return friends;
   }
 
   public Map<String, List<Activity>> getActivities() {

Modified: 
incubator/shindig/trunk/javascript/samplecontainer/state-basicfriendlist.xml
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/state-basicfriendlist.xml?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- 
incubator/shindig/trunk/javascript/samplecontainer/state-basicfriendlist.xml 
(original)
+++ 
incubator/shindig/trunk/javascript/samplecontainer/state-basicfriendlist.xml 
Tue Mar 18 07:16:35 2008
@@ -1,12 +1,16 @@
 <container>
-  <viewer>
-    <person id="john.doe" name="John Doe"></person>
-  </viewer>
-
-  <viewerFriends>
-     <person id="jane.doe" name="Jane Doe" phone="867-5309"></person>
-     <person id="george.doe" name="George Doe"></person>
-  </viewerFriends>
+  <people>
+    <person id="john.doe" name="John Doe">
+      <friend>jane.doe</friend>
+      <friend>george.doe</friend>
+    </person>
+    <person id="jane.doe" name="Jane Doe" phone="867-5309">
+      <friend>john.doe</friend>
+    </person>
+    <person id="george.doe" name="George Doe">
+      <friend>john.doe</friend>
+    </person>
+  </people>
 
   <personAppData>
     <data person="george.doe" field="count">2</data>

Modified: incubator/shindig/trunk/javascript/samplecontainer/state.dtd
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/state.dtd?rev=638380&r1=638379&r2=638380&view=diff
==============================================================================
--- incubator/shindig/trunk/javascript/samplecontainer/state.dtd (original)
+++ incubator/shindig/trunk/javascript/samplecontainer/state.dtd Tue Mar 18 
07:16:35 2008
@@ -1,10 +1,7 @@
-<!ELEMENT container (viewer, owner?, viewerFriends?, ownerFriends?, appId?,
+<!ELEMENT container (people, appId?,
     personAppData?, activities?)>
 
-<!ELEMENT viewer (person)>
-<!ELEMENT owner (person)>
-<!ELEMENT viewerFriends (person*)>
-<!ELEMENT ownerFriends (person*)>
+<!ELEMENT people (person*)>
 <!ELEMENT appId CDATA #REQUIRED>
 
 <!ELEMENT person>


Reply via email to