You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by do...@apache.org on 2008/03/12 14:13:21 UTC

svn commit: r636312 - in /incubator/shindig/trunk: features/core/ java/gadgets/src/main/java/org/apache/shindig/social/ java/gadgets/src/main/java/org/apache/shindig/social/file/ java/gadgets/src/main/java/org/apache/shindig/social/http/ java/gadgets/s...

Author: doll
Date: Wed Mar 12 06:13:16 2008
New Revision: 636312

URL: http://svn.apache.org/viewvc?rev=636312&view=rev
Log:
Added to new social pojos - DataResponse and ResponseItem. These map directly to the wire format used with the opensocial javascript and removed the need for any json string concatenation. The interfaces now return all ResponseItems which cleans up the error handling todos.  

Also added some logic to the AbstractSocialData class to handle maps so that this would work.

Put in the quick fix for the util.js file in this cl just so that the samplecontainer isn't broken for everyone.


Added:
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataResponse.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/ResponseItem.java
Modified:
    incubator/shindig/trunk/features/core/util.js
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractSocialData.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/PeopleHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicDataHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicPeopleHandler.java
    incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/http/SocialDataServlet.java
    incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/SocialDataTest.java

Modified: incubator/shindig/trunk/features/core/util.js
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/features/core/util.js?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/features/core/util.js (original)
+++ incubator/shindig/trunk/features/core/util.js Wed Mar 12 06:13:16 2008
@@ -98,7 +98,9 @@
   function init(config) {
     features = config["core.util"] || {};
   }
-  gadgets.config.register("core.util", null, init);
+  if (gadgets.config) {
+    gadgets.config.register("core.util", null, init);
+  }
 
   return /** @scope gadgets.util */ {
 

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractSocialData.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractSocialData.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractSocialData.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/AbstractSocialData.java Wed Mar 12 06:13:16 2008
@@ -23,6 +23,9 @@
 
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.Collection;
+import java.util.Map;
 
 /**
  * Autoconvert a pojo in a JSONObject If a value is set to null will not be
@@ -82,26 +85,51 @@
     String getterName = field.getName();
     getterName = "get" + getterName.substring(0, 1).toUpperCase()
         + getterName.substring(1, getterName.length());
+
     Object val = this.getClass().getMethod(getterName, EMPTY_PARAM).invoke(
         this, EMPTY_OBJECT);
     String name = field.getName();
     if (val != null) {
-      if (val instanceof AbstractSocialData[]) {
-        JSONArray array = new JSONArray();
-        for (AbstractSocialData asd : (AbstractSocialData[]) val) {
-          array.put(asd.toJson());
-        }
-        val = array;
-      } else if (val instanceof AbstractSocialData) {
-        // get json object
-        val = ((AbstractSocialData) val).toJson();
-      }
-      object.put(name, val);
+      object.put(name, translateObjectToJson(val));
     } else {
       if (mandatory) {
         throw new RuntimeException(name
             + " is a mandory value, it should not be null");
       }
     }
+  }
+
+  private Object translateObjectToJson(Object val) throws JSONException {
+    if (val instanceof AbstractSocialData[]) {
+      JSONArray array = new JSONArray();
+      for (Object asd : (AbstractSocialData[]) val) {
+        array.put(translateObjectToJson(asd));
+      }
+      return array;
+
+    } else if (val instanceof List) {
+      JSONArray list = new JSONArray();
+      for (Object item : (List) val) {
+        list.put(translateObjectToJson(item));
+      }
+      return list;
+
+    } else if (val instanceof Map) {
+      JSONObject map = new JSONObject();
+      // TODO: Support more than just a map from String to Object
+      Map<String, Object> originalMap = (Map<String, Object>) val;
+
+      for (String item : originalMap.keySet()) {
+        map.put(item, translateObjectToJson(originalMap.get(item)));
+      }
+      return map;
+
+    } else if (val instanceof AbstractSocialData) {
+      return ((AbstractSocialData) val).toJson();
+    }
+
+    // Fallback to returning the original object. This works fine for primitive
+    // types and JSONObject types.
+    return val;
   }
 }

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataHandler.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataHandler.java Wed Mar 12 06:13:16 2008
@@ -21,7 +21,7 @@
 import java.util.Map;
 
 public interface DataHandler {
-  public Map<String, Map<String, String>> getPersonData(List<String> ids);
+  public ResponseItem<Map<String, Map<String, String>>> getPersonData(List<String> ids);
 
   /**
    * Updates the data key for the given person with the new value.
@@ -29,8 +29,7 @@
    * @param id The person the data is for.
    * @param key The key of the data.
    * @param value The new value of the data.
-   * @return true if there was an error in updating the app data
+   * @return ResponseItem a response item with the error code set if there was a problem
    */
-  // TODO: Somehow we need to generalize error handling
-  public boolean updatePersonData(String id, String key, String value);
+  public ResponseItem updatePersonData(String id, String key, String value);
 }

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataResponse.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataResponse.java?rev=636312&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataResponse.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/DataResponse.java Wed Mar 12 06:13:16 2008
@@ -0,0 +1,55 @@
+/*
+ * 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;
+
+import java.util.List;
+import java.util.ArrayList;
+
+
+/**
+ * Represents the response object which gets passed as json to the gadget
+ */
+public class DataResponse extends AbstractSocialData {
+  @Mandatory private List<ResponseItem> responses;
+  private ResponseError error;
+
+  public DataResponse(ResponseError error) {
+    this.error = error;
+    this.responses = new ArrayList<ResponseItem>();
+  }
+
+  public DataResponse(List<ResponseItem> responses) {
+    this.responses = responses;
+  }
+
+  public List<ResponseItem> getResponses() {
+    return responses;
+  }
+
+  public void setResponses(List<ResponseItem> responses) {
+    this.responses = responses;
+  }
+
+  public ResponseError getError() {
+    return error;
+  }
+
+  public void setError(ResponseError error) {
+    this.error = error;
+  }
+}
\ No newline at end of file

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/PeopleHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/PeopleHandler.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/PeopleHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/PeopleHandler.java Wed Mar 12 06:13:16 2008
@@ -37,5 +37,5 @@
    * @param ids The ids of the people to fetch.
    * @return a list of people.
    */
-  public List<Person> getPeople(List<String> ids);
+  public ResponseItem<List<Person>> getPeople(List<String> ids);
 }

Added: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/ResponseItem.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/ResponseItem.java?rev=636312&view=auto
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/ResponseItem.java (added)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/ResponseItem.java Wed Mar 12 06:13:16 2008
@@ -0,0 +1,55 @@
+/*
+ * 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;
+
+/**
+ * Represents the response items that get handed back as json within the
+ * DataResponse
+ */
+public class ResponseItem<T> extends AbstractSocialData {
+  private ResponseError error;
+
+  // Must be compatible with AbstractSocialData.toJson. This means it should be
+  // an AbstractSocialData or a collection of AbstractSocialData
+  @Mandatory private T response;
+
+  public ResponseItem(ResponseError error, T response) {
+    this.error = error;
+    this.response = response;
+  }
+
+  public ResponseItem(T response) {
+    this(null, response);
+  }
+
+  public ResponseError getError() {
+    return error;
+  }
+
+  public void setError(ResponseError error) {
+    this.error = error;
+  }
+
+  public T getResponse() {
+    return response;
+  }
+
+  public void setResponse(T response) {
+    this.response = response;
+  }
+}
\ No newline at end of file

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicDataHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicDataHandler.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicDataHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicDataHandler.java Wed Mar 12 06:13:16 2008
@@ -18,11 +18,14 @@
 package org.apache.shindig.social.file;
 
 import org.apache.shindig.social.DataHandler;
+import org.apache.shindig.social.ResponseItem;
+import org.apache.shindig.social.ResponseError;
 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;
 import java.util.List;
@@ -73,7 +76,8 @@
     }
   }
 
-  public Map<String, Map<String, String>> getPersonData(List<String> ids) {
+  public ResponseItem<Map<String, Map<String, String>>> getPersonData(
+      List<String> ids) {
     // TODO: Use the opensource Collections library
     Map<String, Map<String, String>> data =
         new HashMap<String, Map<String, String>>();
@@ -82,12 +86,12 @@
       data.put(id, allData.get(id));
     }
 
-    return data;
+    return new ResponseItem<Map<String, Map<String, String>>>(data);
   }
 
-  public boolean updatePersonData(String id, String key, String value) {
+  public ResponseItem updatePersonData(String id, String key, String value) {
     if (!isValidKey(key)) {
-      return false;
+      return new ResponseItem<Object>(ResponseError.BAD_REQUEST, null);
     }
 
     Map<String, String> personData = allData.get(id);
@@ -97,7 +101,7 @@
     }
 
     personData.put(key, value);
-    return true;
+    return new ResponseItem<JSONObject>(new JSONObject());
   }
 
   /**

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicPeopleHandler.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicPeopleHandler.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicPeopleHandler.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/file/BasicPeopleHandler.java Wed Mar 12 06:13:16 2008
@@ -17,11 +17,7 @@
  */
 package org.apache.shindig.social.file;
 
-import org.apache.shindig.social.IdSpec;
-import org.apache.shindig.social.Name;
-import org.apache.shindig.social.PeopleHandler;
-import org.apache.shindig.social.Person;
-import org.apache.shindig.social.Phone;
+import org.apache.shindig.social.*;
 import org.json.JSONException;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -108,12 +104,12 @@
     idMap.put(idType, ids);
   }
 
-  public List<Person> getPeople(List<String> ids) {
+  public ResponseItem<List<Person>> getPeople(List<String> ids) {
     List<Person> people = new ArrayList<Person>();
     for (String id : ids) {
       people.add(allPeople.get(id));
     }
-    return people;
+    return new ResponseItem<List<Person>>(people);
   }
 
   public List<String> getIds(IdSpec idSpec) throws JSONException {

Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/http/SocialDataServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/http/SocialDataServlet.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/http/SocialDataServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/social/http/SocialDataServlet.java Wed Mar 12 06:13:16 2008
@@ -20,12 +20,7 @@
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.apache.shindig.social.ResponseError;
-import org.apache.shindig.social.SocialDataType;
-import org.apache.shindig.social.PeopleHandler;
-import org.apache.shindig.social.Person;
-import org.apache.shindig.social.IdSpec;
-import org.apache.shindig.social.DataHandler;
+import org.apache.shindig.social.*;
 import static org.apache.shindig.social.IdSpec.*;
 import org.apache.shindig.social.file.BasicPeopleHandler;
 import org.apache.shindig.social.file.BasicDataHandler;
@@ -34,7 +29,7 @@
 import java.io.PrintWriter;
 import java.util.logging.Logger;
 import java.util.List;
-import java.util.Map;
+import java.util.ArrayList;
 
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
@@ -47,9 +42,6 @@
 public class SocialDataServlet extends HttpServlet {
   private static final Logger logger
       = Logger.getLogger("org.apache.shindig.social");
-  private static final String BAD__REQUEST__RESPONSE =
-      "{\"responses\" : {}, \"error\" : \""
-      + ResponseError.BAD_REQUEST.toJson() + "\"}";
 
   // TODO: get through injection
   private PeopleHandler peopleHandler = new BasicPeopleHandler();
@@ -59,28 +51,31 @@
   protected void doPost(HttpServletRequest req, HttpServletResponse resp)
       throws IOException {
     // TODO: Get the security token
-    // TODO: Don't use string concatenation for json output
     // TODO: etc, etc, etc
 
     String requestParam = req.getParameter("request");
-    String response;
+    DataResponse response;
     try {
-      response = createResponse(requestParam);
+      response = new DataResponse(createResponse(requestParam));
     } catch (JSONException e) {
-      response = BAD__REQUEST__RESPONSE;
+      response = new DataResponse(ResponseError.BAD_REQUEST);
     }
 
     PrintWriter writer = resp.getWriter();
-    writer.write(response);
+    writer.write(response.toJson().toString());
   }
 
-  private String createResponse(String requestParam) throws JSONException {
+  private List<ResponseItem> createResponse(String requestParam)
+      throws JSONException {
+    // TODO: Improve json input handling. The json request should get auto
+    // translated into objects
     JSONArray requestItems = new JSONArray(requestParam);
-    String jsonResponse = "{\"responses\" : [";
+    List<ResponseItem> responseItems = new ArrayList<ResponseItem>();
     int length = requestItems.length();
 
     for (int i = 0; i < length; i++) {
-      String jsonData = "{}";
+      ResponseItem response = new ResponseItem<Object>(
+          ResponseError.NOT_IMPLEMENTED);
 
       JSONObject requestItem = requestItems.getJSONObject(i);
 
@@ -93,91 +88,34 @@
 
         switch (type) {
           case FETCH_PEOPLE :
-            jsonData = handleFetchPeople(peopleIds);
+            response = peopleHandler.getPeople(peopleIds);
             break;
 
           case FETCH_PERSON_APP_DATA :
-            jsonData = handleFetchData(peopleIds);
+            response = dataHandler.getPersonData(peopleIds);
             break;
 
           case UPDATE_PERSON_APP_DATA:
-            jsonData = handleUpdateData(peopleIds, requestItem);
+            // We only support updating one person right now
+            String id = peopleIds.get(0);
+
+            String key = requestItem.getString("key");
+            String value = requestItem.getString("value");
+
+            response = dataHandler.updatePersonData(id, key, value);
             break;
         }
 
-        jsonResponse += "{\"response\" : " + jsonData + "}";
       } catch (JSONException e) {
-        jsonResponse += "{\"response\" : {}, \"error\" : \""
-            + ResponseError.BAD_REQUEST.toJson() + "\"}";
+        response = new ResponseItem<Object>(ResponseError.BAD_REQUEST);
       } catch (IllegalArgumentException e) {
-        jsonResponse += "{\"response\" : {}, \"error\" : \""
-            + ResponseError.BAD_REQUEST.toJson() + "\"}";
-      }
-
-      if (i < length - 1) {
-        jsonResponse += ",";
+        response = new ResponseItem<Object>(ResponseError.BAD_REQUEST);
       }
-    }
-    jsonResponse += "]}";
-    return jsonResponse;
-  }
-
-  private String handleFetchData(List<String> peopleIds) {
-    Map<String, Map<String,String>> people
-        = dataHandler.getPersonData(peopleIds);
-
-    String jsonData = "{";
-
-    for (String userId : people.keySet()) {
-      Map<String, String> userData = people.get(userId);
-      jsonData += "\"" + userId + "\" : {";
-
-      if (userData != null) {
-        for (String dataKey : userData.keySet()) {
-          String dataValue = userData.get(dataKey);
-          jsonData += "\"" + dataKey + "\" : \"" + dataValue + "\" ";
-        }
-      }
-
-      jsonData += "}, ";
-    }
-
-    jsonData += "}";
-
-    return jsonData;
-  }
-
-  private String handleUpdateData(List<String> peopleIds,
-      JSONObject requestItem) throws JSONException {
-
-    // We only support updating one person right now
-    String id = peopleIds.get(0);
-
-    String key = requestItem.getString("key");
-    String value = requestItem.getString("value");
-
-    // TODO: Clean this error handling up
-    boolean success = dataHandler.updatePersonData(id, key, value);
-    if (!success) {
-      throw new IllegalArgumentException();
-    } else {
-      return "{}";
-    }
-  }
-
-  private String handleFetchPeople(List<String> peopleIds) {
-    List<Person> people = peopleHandler.getPeople(peopleIds);
-    if (people.isEmpty()) {
-      return "{}";
-    }
 
-    String jsonData = "[";
-    for (Person person : people) {
-      jsonData += person.toJson() + ",";
+      responseItems.add(response);
     }
-    jsonData += "]";
 
-    return jsonData;
+    return responseItems;
   }
 
 }

Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/SocialDataTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/SocialDataTest.java?rev=636312&r1=636311&r2=636312&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/SocialDataTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/social/SocialDataTest.java Wed Mar 12 06:13:16 2008
@@ -22,6 +22,9 @@
 
 import junit.framework.TestCase;
 
+import java.util.Map;
+import java.util.HashMap;
+
 public class SocialDataTest extends TestCase {
   private Person johnDoe;
   private Activity activity;
@@ -104,4 +107,25 @@
     assertEquals(expectedItem.getType().toString(),
         actualItem.getString("type"));
   }
+
+  public void testMapsToJson() throws Exception {
+    Map<String, Map<String, String>> map =
+        new HashMap<String, Map<String, String>>();
+
+    Map<String, String> item1Map = new HashMap<String, String>();
+    item1Map.put("value", "1");
+    map.put("item1", item1Map);
+
+    Map<String, String> item2Map = new HashMap<String, String>();
+    item2Map.put("value", "2");
+    map.put("item2", item2Map);
+
+    ResponseItem response = new ResponseItem(map);
+    JSONObject result = response.toJson();
+
+    JSONObject jsonMap = result.getJSONObject("response");
+    assertEquals("1", jsonMap.getJSONObject("item1").getString("value"));
+    assertEquals("2", jsonMap.getJSONObject("item2").getString("value"));
+  }
+
 }