[opensocial-java-client] r121 committed - Added online unit tests, 3-legged OAuth support with sample app, and s...

12 views
Skip to first unread message

codesite...@google.com

unread,
Dec 1, 2009, 4:40:11 AM12/1/09
to opensocial-cl...@googlegroups.com
Revision: 121
Author: apij...@google.com
Date: Tue Dec 1 01:39:52 2009
Log: Added online unit tests, 3-legged OAuth support with sample app, and
support for fetching, updating, and removing app data and fetching and
creating activities
http://code.google.com/p/opensocial-java-client/source/detail?r=121

Added:
/branches/2009q4rewrite/java/build.xml
/branches/2009q4rewrite/java/demos/ThirdLeg
/branches/2009q4rewrite/java/demos/ThirdLeg/.classpath
/branches/2009q4rewrite/java/demos/ThirdLeg/.project
/branches/2009q4rewrite/java/demos/ThirdLeg/.settings

/branches/2009q4rewrite/java/demos/ThirdLeg/.settings/com.google.appengine.eclipse.core.prefs
/branches/2009q4rewrite/java/demos/ThirdLeg/README
/branches/2009q4rewrite/java/demos/ThirdLeg/build.xml
/branches/2009q4rewrite/java/demos/ThirdLeg/src
/branches/2009q4rewrite/java/demos/ThirdLeg/src/META-INF
/branches/2009q4rewrite/java/demos/ThirdLeg/src/META-INF/jdoconfig.xml
/branches/2009q4rewrite/java/demos/ThirdLeg/src/log4j.properties
/branches/2009q4rewrite/java/demos/ThirdLeg/src/org
/branches/2009q4rewrite/java/demos/ThirdLeg/src/org/opensocial
/branches/2009q4rewrite/java/demos/ThirdLeg/src/org/opensocial/demos

/branches/2009q4rewrite/java/demos/ThirdLeg/src/org/opensocial/demos/AuthFilter.java
/branches/2009q4rewrite/java/demos/ThirdLeg/war
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/appengine-web.xml
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib

/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/commons-codec-1.3.jar

/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/json_simple-1.1.jar

/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/oauth-20090825.jar
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/opensocial.jar
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/logging.properties
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/web.xml
/branches/2009q4rewrite/java/demos/ThirdLeg/war/index.jsp
/branches/2009q4rewrite/java/demos/ThirdLeg/war/signOut.jsp
/branches/2009q4rewrite/java/lib/junit-4.5.jar

/branches/2009q4rewrite/java/src/org/opensocial/auth/OAuth3LeggedScheme.java
/branches/2009q4rewrite/java/src/org/opensocial/auth/OAuthScheme.java

/branches/2009q4rewrite/java/src/org/opensocial/providers/GoogleProvider.java

/branches/2009q4rewrite/java/src/org/opensocial/providers/OrkutSandboxProvider.java

/branches/2009q4rewrite/java/src/org/opensocial/services/ActivityService.java

/branches/2009q4rewrite/java/src/org/opensocial/services/AppDataService.java
/branches/2009q4rewrite/java/test
/branches/2009q4rewrite/java/test/org
/branches/2009q4rewrite/java/test/org/opensocial
/branches/2009q4rewrite/java/test/org/opensocial/ClientTest.java
/branches/2009q4rewrite/java/test/org/opensocial/online
/branches/2009q4rewrite/java/test/org/opensocial/online/ActivityTest.java
/branches/2009q4rewrite/java/test/org/opensocial/online/AppDataTest.java
/branches/2009q4rewrite/java/test/org/opensocial/online/PeopleTest.java
/branches/2009q4rewrite/java/test/org/opensocial/services

/branches/2009q4rewrite/java/test/org/opensocial/services/PeopleServiceTest.java
Deleted:
/branches/2009q4rewrite/java/demos/KitchenSink.java
/branches/2009q4rewrite/java/src/org/opensocial/data
Modified:
/branches/2009q4rewrite/java/src/org/opensocial/Client.java
/branches/2009q4rewrite/java/src/org/opensocial/Request.java
/branches/2009q4rewrite/java/src/org/opensocial/Response.java

/branches/2009q4rewrite/java/src/org/opensocial/auth/OAuth2LeggedScheme.java
/branches/2009q4rewrite/java/src/org/opensocial/http/HttpClient.java

/branches/2009q4rewrite/java/src/org/opensocial/http/HttpResponseMessage.java
/branches/2009q4rewrite/java/src/org/opensocial/parsers/JsonParser.java
/branches/2009q4rewrite/java/src/org/opensocial/parsers/Parser.java

/branches/2009q4rewrite/java/src/org/opensocial/providers/MySpaceProvider.java

/branches/2009q4rewrite/java/src/org/opensocial/providers/OrkutProvider.java
/branches/2009q4rewrite/java/src/org/opensocial/providers/Provider.java
/branches/2009q4rewrite/java/src/org/opensocial/services/PeopleService.java

=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/build.xml Tue Dec 1 01:39:52 2009
@@ -0,0 +1,101 @@
+<project name="OpenSocial Client Library" default="compile" basedir=".">
+
+ <property name="app.name" value="opensocial"/>
+
+ <!-- Paths for source code and compiled files -->
+ <property name="src.home" value="${basedir}/src"/>
+ <property name="test.home" value="${basedir}/test"/>
+ <property name="build.home" value="${basedir}/bin"/>
+
+ <!-- Path for sample application source and binaries -->
+ <property name="demos-src.home" value="${basedir}/demos"/>
+ <property name="demos-bin.home" value="${demos-src.home}/bin"/>
+
+ <!-- Path for dependent libraries -->
+ <property name="lib.home" value="${basedir}/lib"/>
+
+ <!-- Path for Javadoc-generated files -->
+ <property name="docs.home" value="${basedir}/docs"/>
+
+ <!-- Path for packaged distribution files -->
+ <property name="dist.home" value="${basedir}/dist"/>
+
+ <path id="compile-src.classpath">
+ <fileset dir="${lib.home}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="compile-demos.classpath">
+ <fileset dir="${lib.home}">
+ <include name="*.jar"/>
+ </fileset>
+ <fileset dir="${dist.home}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <path id="test.classpath">
+ <pathelement location="${src.home}"/>
+ <pathelement location="${test.home}"/>
+ <fileset dir="${lib.home}">
+ <include name="*.jar"/>
+ </fileset>
+ </path>
+
+ <target name="compile" description="Compile Java sources">
+ <mkdir dir="${build.home}"/>
+ <javac destdir="${build.home}" debug="true"
debuglevel="lines,vars,source">
+ <classpath refid="compile-src.classpath"/>
+ <src path="${src.home}"/>
+ <src path="${test.home}"/>
+ </javac>
+ </target>
+
+ <target name="compile-samples" depends="dist" description="Compile
sample applications">
+ <mkdir dir="${demos-bin.home}"/>
+ <javac destdir="${demos-bin.home}" debug="true"
debuglevel="lines,vars,source">
+ <classpath refid="compile-demos.classpath"/>
+ <src path="${demos-src.home}"/>
+ </javac>
+ </target>
+
+ <target name="dist" depends="compile,javadoc" description="Create
packaged distribution files">
+ <mkdir dir="${dist.home}"/>
+ <jar jarfile="${dist.home}/${app.name}.jar">
+ <fileset dir="${src.home}" />
+ <fileset dir="${build.home}"/>
+ </jar>
+ </target>
+
+ <target name="javadoc" depends="compile" description="Create
Javadoc-generated files">
+ <delete>
+ <fileset dir="${docs.home}"/>
+ </delete>
+ <javadoc sourcepath="${src.home}" destdir="${docs.home}"
packagenames="*">
+ <classpath refid="compile-src.classpath"/>
+ </javadoc>
+ </target>
+
+ <target name="test" depends="compile" description="Run JUnit test
suites">
+ <junit printsummary="false" haltonfailure="true">
+ <formatter type="brief" usefile="false" />
+ <batchtest>
+ <fileset dir="${build.home}" includes="**/*Test.class" />
+ </batchtest>
+ <classpath>
+ <fileset dir="${lib.home}">
+ <include name="*.jar"/>
+ </fileset>
+ </classpath>
+ <classpath location="${build.home}"/>
+ </junit>
+ </target>
+
+ <target name="clean">
+ <delete dir="${demos-bin.home}"/>
+ <delete dir="${build.home}"/>
+ <delete dir="${dist.home}"/>
+ </target>
+
+</project>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/.classpath Tue Dec 1
01:39:52 2009
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con"
path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
+ <classpathentry kind="con"
path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/commons-codec-1.3.jar"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/json_simple-1.1.jar"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/oauth-20090825.jar"/>
+ <classpathentry kind="lib" path="war/WEB-INF/lib/opensocial.jar"/>
+ <classpathentry kind="output" path="war/WEB-INF/classes"/>
+</classpath>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/.project Tue Dec 1
01:39:52 2009
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>ThirdLeg</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.google.gdt.eclipse.core.webAppProjectValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.google.appengine.eclipse.core.enhancerbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.google.appengine.eclipse.core.projectValidator</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>com.google.appengine.eclipse.core.gaeNature</nature>
+ <nature>com.google.gdt.eclipse.core.webAppNature</nature>
+ </natures>
+</projectDescription>
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/.settings/com.google.appengine.eclipse.core.prefs
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,3 @@
+#Wed Nov 25 00:42:11 PST 2009
+eclipse.preferences.version=1
+filesCopiedToWebInfLib=appengine-api-1.0-sdk-1.2.6.jar|
appengine-api-labs-1.2.6.jar|datanucleus-appengine-1.0.3.jar|
datanucleus-core-1.1.5.jar|datanucleus-jpa-1.1.5.jar|
geronimo-jpa_3.0_spec-1.1.1.jar|geronimo-jta_1.1_spec-1.1.1.jar|
jdo2-api-2.3-eb.jar
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/README Tue Dec 1 01:39:52
2009
@@ -0,0 +1,25 @@
+OpenSocial Java client library -- ThirdLeg demo
+
+ThirdLeg is a simple sample web application demonstrating how to use the
three-
+legged OAuth process to ascertain the viewer's identity. It includes a
standard
+Java servlet filter which makes the necessary authentication calls and
manages
+the state of the application, as well as a simple JSP which executes a
batch
+request for the viewer's profile information and friends.
+
+This application is packaged as a Google App Engine application. To run it,
+follow these steps:
+
+1. If you haven't already, download the latest Google App Engine SDK for
Java
+ from http://code.google.com/appengine/downloads.html and unzip it.
+2. Modify the second line of the build.xml file, updating the sdk.dir
property
+ to point to the location of your downloaded SDK.
+3. To run the application on the App Engine development server, open a new
+ command line window, navigate to the ThirdLeg directory, and execute
+ 'ant runserver' -- now access your app at http://localhost:8080/.
+4. To deploy the application to App Engine's production environment,
register a
+ new application ID at http://appengine.google.com, add this new ID
between
+ the <application></application> tags in war/WEB-INF/appengine-web.xml,
and
+ execute 'ant update' from the command line. Note that you may need to
use
+ the SDK's appcfg.cmd utility to input your account credentials before
you
+ can use this particular ant target -- see
+ http://code.google.com/appengine/docs/java/tools/uploadinganapp.html.
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/build.xml Tue Dec 1
01:39:52 2009
@@ -0,0 +1,79 @@
+<project>
+ <property name="sdk.dir" location="" />
+
+ <import file="${sdk.dir}/config/user/ant-macros.xml" />
+
+ <path id="project.classpath">
+ <pathelement path="war/WEB-INF/classes" />
+ <fileset dir="war/WEB-INF/lib">
+ <include name="**/*.jar" />
+ </fileset>
+ <fileset dir="${sdk.dir}/lib">
+ <include name="shared/**/*.jar" />
+ </fileset>
+ </path>
+
+ <target name="copyjars"
+ description="Copies the App Engine JARs to the WAR.">
+ <copy
+ todir="war/WEB-INF/lib"
+ flatten="true">
+ <fileset dir="${sdk.dir}/lib/user">
+ <include name="**/*.jar" />
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="compile" depends="copyjars"
+ description="Compiles Java source and copies other source files to
the WAR.">
+ <mkdir dir="war/WEB-INF/classes" />
+ <copy todir="war/WEB-INF/classes">
+ <fileset dir="src">
+ <exclude name="**/*.java" />
+ </fileset>
+ </copy>
+ <javac
+ srcdir="src"
+ destdir="war/WEB-INF/classes"
+ classpathref="project.classpath"
+ debug="on" />
+ </target>
+
+ <target name="datanucleusenhance" depends="compile"
+ description="Performs JDO enhancement on compiled data classes.">
+ <enhance_war war="war" />
+ </target>
+
+ <target name="runserver" depends="datanucleusenhance"
+ description="Starts the development server.">
+ <dev_appserver war="war" />
+ </target>
+
+ <target name="update" depends="datanucleusenhance"
+ description="Uploads the application to App Engine.">
+ <appcfg action="update" war="war" />
+ </target>
+
+ <target name="update_indexes" depends="datanucleusenhance"
+ description="Uploads just the datastore index configuration to App
Engine.">
+ <appcfg action="update_indexes" war="war" />
+ </target>
+
+ <target name="rollback" depends="datanucleusenhance"
+ description="Rolls back an interrupted application update.">
+ <appcfg action="rollback" war="war" />
+ </target>
+
+ <target name="request_logs"
+ description="Downloads log data from App Engine for the
application.">
+ <appcfg action="request_logs" war="war">
+ <options>
+ <arg value="--num_days=5"/>
+ </options>
+ <args>
+ <arg value="logs.txt"/>
+ </args>
+ </appcfg>
+ </target>
+
+</project>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/src/META-INF/jdoconfig.xml
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
+
+ <persistence-manager-factory name="transactions-optional">
+ <property name="javax.jdo.PersistenceManagerFactoryClass"
+
value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
+ <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
+ <property name="javax.jdo.option.NontransactionalRead"
value="true"/>
+ <property name="javax.jdo.option.NontransactionalWrite"
value="true"/>
+ <property name="javax.jdo.option.RetainValues" value="true"/>
+ <property name="datanucleus.appengine.autoCreateDatastoreTxns"
value="true"/>
+ </persistence-manager-factory>
+</jdoconfig>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/src/log4j.properties Tue
Dec 1 01:39:52 2009
@@ -0,0 +1,24 @@
+# A default log4j configuration for log4j users.
+#
+# To use this configuration, deploy it into your application's
WEB-INF/classes
+# directory. You are also encouraged to edit it as you like.
+
+# Configure the console as our one appender
+log4j.appender.A1=org.apache.log4j.ConsoleAppender
+log4j.appender.A1.layout=org.apache.log4j.PatternLayout
+log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c]
- %m%n
+
+# tighten logging on the DataNucleus Categories
+log4j.category.DataNucleus.JDO=WARN, A1
+log4j.category.DataNucleus.Persistence=WARN, A1
+log4j.category.DataNucleus.Cache=WARN, A1
+log4j.category.DataNucleus.MetaData=WARN, A1
+log4j.category.DataNucleus.General=WARN, A1
+log4j.category.DataNucleus.Utility=WARN, A1
+log4j.category.DataNucleus.Transaction=WARN, A1
+log4j.category.DataNucleus.Datastore=WARN, A1
+log4j.category.DataNucleus.ClassLoading=WARN, A1
+log4j.category.DataNucleus.Plugin=WARN, A1
+log4j.category.DataNucleus.ValueGeneration=WARN, A1
+log4j.category.DataNucleus.Enhancer=WARN, A1
+log4j.category.DataNucleus.SchemaTool=WARN, A1
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/src/org/opensocial/demos/AuthFilter.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,63 @@
+package org.opensocial.demos;
+
+import org.opensocial.auth.OAuth3LeggedScheme;
+import org.opensocial.providers.GoogleProvider;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class AuthFilter implements Filter {
+
+ public void init(FilterConfig config) throws ServletException {
+ }
+
+ public void doFilter(ServletRequest req, ServletResponse resp,
+ FilterChain chain) throws IOException, ServletException {
+ HttpServletResponse response = (HttpServletResponse) resp;
+ HttpServletRequest request = (HttpServletRequest) req;
+ HttpSession session = request.getSession();
+
+ OAuth3LeggedScheme authScheme = new OAuth3LeggedScheme(
+ new GoogleProvider(), "anonymous", "anonymous");
+ OAuth3LeggedScheme.Token requestToken =
+ (OAuth3LeggedScheme.Token) session.getAttribute("rt");
+ OAuth3LeggedScheme.Token accessToken =
+ (OAuth3LeggedScheme.Token) session.getAttribute("at");
+
+ String tokenParam = request.getParameter("oauth_token");
+
+ if (accessToken != null) {
+ chain.doFilter(req, resp);
+ } else if (tokenParam != null && requestToken != null) {
+ try {
+ authScheme.setRequestToken(requestToken);
+ authScheme.requestAccessToken(tokenParam);
+ session.setAttribute("at", authScheme.getAccessToken());
+ response.sendRedirect(request.getRequestURL().toString());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else {
+ try {
+ String authUrl =
+
authScheme.getAuthorizationUrl(request.getRequestURL().toString());
+ session.setAttribute("rt", authScheme.getRequestToken());
+ response.sendRedirect(authUrl);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public void destroy() {
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/appengine-web.xml
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
+ <application></application>
+ <version>1</version>
+
+ <!-- Configure java.util.logging -->
+ <system-properties>
+ <property name="java.util.logging.config.file"
value="WEB-INF/logging.properties"/>
+ </system-properties>
+
+ <sessions-enabled>true</sessions-enabled>
+</appengine-web-app>
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/commons-codec-1.3.jar
Tue Dec 1 01:39:52 2009
Binary file, no diff available.
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/json_simple-1.1.jar
Tue Dec 1 01:39:52 2009
Binary file, no diff available.
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/oauth-20090825.jar
Tue Dec 1 01:39:52 2009
Binary file, no diff available.
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/lib/opensocial.jar
Tue Dec 1 01:39:52 2009
Binary file, no diff available.
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/logging.properties
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,28 @@
+# A default java.util.logging configuration.
+# (All App Engine logging is through java.util.logging by default).
+#
+# To use this configuration, copy it into your application's WEB-INF
+# folder and add the following to your appengine-web.xml:
+#
+# <system-properties>
+# <property name="java.util.logging.config.file"
value="WEB-INF/logging.properties"/>
+# </system-properties>
+#
+
+# Set the default logging level for all loggers to WARNING
+.level = WARNING
+
+# Set the default logging level for ORM, specifically, to WARNING
+DataNucleus.JDO.level=WARNING
+DataNucleus.Persistence.level=WARNING
+DataNucleus.Cache.level=WARNING
+DataNucleus.MetaData.level=WARNING
+DataNucleus.General.level=WARNING
+DataNucleus.Utility.level=WARNING
+DataNucleus.Transaction.level=WARNING
+DataNucleus.Datastore.level=WARNING
+DataNucleus.ClassLoading.level=WARNING
+DataNucleus.Plugin.level=WARNING
+DataNucleus.ValueGeneration.level=WARNING
+DataNucleus.Enhancer.level=WARNING
+DataNucleus.SchemaTool.level=WARNING
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/war/WEB-INF/web.xml Tue
Dec 1 01:39:52 2009
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
+http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+ version="2.5">
+ <filter>
+ <filter-name>AuthFilter</filter-name>
+ <filter-class>org.opensocial.demos.AuthFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>AuthFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <welcome-file-list>
+ <welcome-file>index.jsp</welcome-file>
+ </welcome-file-list>
+</web-app>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/war/index.jsp Tue Dec 1
01:39:52 2009
@@ -0,0 +1,67 @@
+<%@ page import="org.opensocial.Client" %>
+<%@ page import="org.opensocial.Request" %>
+<%@ page import="org.opensocial.Response" %>
+<%@ page import="org.opensocial.auth.OAuth3LeggedScheme" %>
+<%@ page import="org.opensocial.models.Person" %>
+<%@ page import="org.opensocial.providers.GoogleProvider" %>
+<%@ page import="org.opensocial.services.PeopleService" %>
+
+<%@ page import="java.util.HashMap" %>
+<%@ page import="java.util.List" %>
+<%@ page import="java.util.Map" %>
+
+<%
+ Person viewer = null;
+ List<Person> friends = null;
+
+ OAuth3LeggedScheme authScheme = null;
+ OAuth3LeggedScheme.Token requestToken =
+ (OAuth3LeggedScheme.Token) session.getAttribute("rt");
+ OAuth3LeggedScheme.Token accessToken =
+ (OAuth3LeggedScheme.Token) session.getAttribute("at");
+
+ if (requestToken != null && accessToken != null) {
+ authScheme =
+ new OAuth3LeggedScheme(new
GoogleProvider(), "anonymous", "anonymous");
+ authScheme.setRequestToken(requestToken);
+ authScheme.setAccessToken(accessToken);
+
+ Client client = new Client(new GoogleProvider(), authScheme);
+ try {
+ Map<String, Request> requests = new HashMap<String, Request>();
+ requests.put("friends", PeopleService.retrieve("@me", "@friends"));
+ requests.put("viewer", PeopleService.retrieve());
+
+ Map<String, Response> responses = client.send(requests);
+ friends = responses.get("friends").getEntries();
+ viewer = responses.get("viewer").getEntry();
+ } catch (Exception e) {
+ }
+ }
+%>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
+ <title>Content</title>
+ </head>
+ <body>
+ <a href="/signOut.jsp">Sign out</a>
+
+ <div>
+ Welcome, <b><%= viewer.getDisplayName() %></b>!
+ </div>
+ <div>
+ <h4>Friends:</h4>
+ <ul>
+ <%
+ for (Person friend : friends) {
+ out.println("<li>" + friend.getDisplayName() + "</li>");
+ }
+ %>
+ </ul>
+ </div>
+ </body>
+</html>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/demos/ThirdLeg/war/signOut.jsp Tue Dec 1
01:39:52 2009
@@ -0,0 +1,4 @@
+<%
+ session.invalidate();
+ response.sendRedirect("/");
+%>
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/lib/junit-4.5.jar Tue Dec 1 01:39:52 2009
Binary file, no diff available.
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/src/org/opensocial/auth/OAuth3LeggedScheme.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,154 @@
+package org.opensocial.auth;
+
+import net.oauth.OAuth;
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthConsumer;
+import net.oauth.OAuthException;
+import net.oauth.OAuthMessage;
+import net.oauth.OAuthServiceProvider;
+import net.oauth.client.OAuthClient;
+import net.oauth.http.HttpMessage;
+
+import org.opensocial.RequestException;
+import org.opensocial.http.HttpClient;
+import org.opensocial.providers.Provider;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.net.URISyntaxException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+public class OAuth3LeggedScheme extends OAuthScheme implements AuthScheme {
+
+ public static class Token implements Serializable {
+ public String token;
+ public String secret;
+
+ public Token(String token, String secret) {
+ this.token = token;
+ this.secret = secret;
+ }
+
+ public Token() {
+ }
+ }
+
+ private Provider provider;
+ private OAuthClient oAuthClient;
+ private Token requestToken;
+ private Token accessToken;
+
+ public OAuth3LeggedScheme(Provider provider, String consumerKey,
+ String consumerSecret) {
+ this(provider, consumerKey, consumerSecret, new HttpClient());
+ }
+
+ public OAuth3LeggedScheme(Provider provider, String consumerKey,
+ String consumerSecret, HttpClient httpClient) {
+ super(consumerKey, consumerSecret);
+
+ this.provider = provider;
+ this.oAuthClient = new OAuthClient(httpClient);
+ }
+
+ public HttpMessage getHttpMessage(Provider provider, String method,
+ String url, Map<String, String> headers, String body) throws
+ RequestException, IOException {
+ return getHttpMessage(provider, method, url, headers, body, null);
+ }
+
+ public HttpMessage getHttpMessage(Provider provider, String method,
+ String url, Map<String, String> headers, String body,
+ Collection<? extends Entry> parameters) throws
+ RequestException, IOException {
+ OAuthAccessor accessor = getOAuthAccessor(accessToken.token,
+ accessToken.secret);
+ OAuthMessage message = new OAuthMessage(method, url, parameters,
+ stringToStream(body));
+
+ for (Map.Entry<String, String> header : headers.entrySet()) {
+ message.getHeaders().add(header);
+ }
+
+ return getHttpMessage(message, accessor, body,
provider.getSignBodyHash());
+ }
+
+ public String getAuthorizationUrl(String callbackUrl) throws
OAuthException,
+ URISyntaxException, IOException {
+ requestToken = requestRequestToken();
+ if (requestToken.token == null) {
+ // This is an unregistered OAuth request
+ return provider.getAuthorizeUrl() + "?oauth_callback=" + callbackUrl;
+ }
+
+ return provider.getAuthorizeUrl() + "?oauth_token=" +
requestToken.token +
+ "&oauth_callback=" + callbackUrl;
+ }
+
+ public void requestAccessToken(String oAuthToken) throws OAuthException,
+ URISyntaxException, IOException {
+ OAuthAccessor accessor = getOAuthAccessor(oAuthToken,
+ this.requestToken.secret);
+ OAuthMessage message = oAuthClient.invoke(accessor, "GET",
+ provider.getAccessTokenUrl(), null);
+
+ accessToken = new Token(message.getToken(),
+ message.getParameter(OAuth.OAUTH_TOKEN_SECRET));
+ }
+
+ public Token getRequestToken() {
+ return requestToken;
+ }
+
+ public Token getAccessToken() {
+ return accessToken;
+ }
+
+ public void setRequestToken(Token token) {
+ requestToken = token;
+ }
+
+ public void setAccessToken(Token token) {
+ accessToken = token;
+ }
+
+ private Token requestRequestToken() throws OAuthException,
+ URISyntaxException, IOException {
+ if (provider.getRequestTokenUrl() == null) {
+ return new Token();
+ }
+
+ Set<Map.Entry<String,String>> extraParams = null;
+ if (provider.getRequestTokenParameters() != null) {
+ extraParams = provider.getRequestTokenParameters().entrySet();
+ }
+
+ OAuthAccessor accessor = getOAuthAccessor();
+ oAuthClient.getRequestToken(accessor, "GET", extraParams);
+
+ return new Token(accessor.requestToken, accessor.tokenSecret);
+ }
+
+ private OAuthAccessor getOAuthAccessor() {
+ OAuthServiceProvider serviceProvider = new OAuthServiceProvider(
+ provider.getRequestTokenUrl(), provider.getAuthorizeUrl(),
+ provider.getAccessTokenUrl());
+
+ OAuthConsumer consumer = new OAuthConsumer(null, consumerKey,
+ consumerSecret, serviceProvider);
+ consumer.setProperty(OAuth.OAUTH_SIGNATURE_METHOD, OAuth.HMAC_SHA1);
+
+ return new OAuthAccessor(consumer);
+ }
+
+ private OAuthAccessor getOAuthAccessor(String token, String secret) {
+ OAuthAccessor accessor = getOAuthAccessor();
+ accessor.accessToken = token;
+ accessor.tokenSecret = secret;
+
+ return accessor;
+ }
+}
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/src/org/opensocial/auth/OAuthScheme.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,86 @@
+package org.opensocial.auth;
+
+import net.oauth.OAuthAccessor;
+import net.oauth.OAuthException;
+import net.oauth.OAuthMessage;
+import net.oauth.ParameterStyle;
+import net.oauth.http.HttpMessage;
+
+import org.apache.commons.codec.binary.Base64;
+import org.opensocial.RequestException;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+
+public abstract class OAuthScheme {
+
+ protected String consumerKey;
+ protected String consumerSecret;
+
+ public OAuthScheme(String consumerKey, String consumerSecret) {
+ this.consumerKey = consumerKey;
+ this.consumerSecret = consumerSecret;
+ }
+
+ public String getConsumerKey() {
+ return consumerKey;
+ }
+
+ public String getConsumerSecret() {
+ return consumerSecret;
+ }
+
+ protected InputStream stringToStream(String text) {
+ InputStream stream = null;
+
+ if (text != null) {
+ try {
+ stream = new ByteArrayInputStream(text.getBytes("UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ // Ignore
+ }
+ }
+
+ return stream;
+ }
+
+ protected HttpMessage getHttpMessage(OAuthMessage message,
+ OAuthAccessor accessor, String body, boolean signBodyHash) throws
+ IOException, RequestException {
+ if (body != null) {
+ if (signBodyHash) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("SHA-1");
+
+ byte[] hash = md.digest(body.getBytes("UTF-8"));
+ byte[] encodedHash = new Base64().encode(hash);
+
+ message.addParameter("oauth_body_hash",
+ new String(encodedHash, "UTF-8"));
+ } catch (java.security.NoSuchAlgorithmException e) {
+ // Ignore exception
+ } catch (java.io.UnsupportedEncodingException e) {
+ // Ignore exception
+ }
+ } else if (message.getHeader(HttpMessage.CONTENT_TYPE)
+ .equals("application/x-www-form-urlencoded")){
+ message.addParameter(body, "");
+ }
+ }
+
+ try {
+ message.addRequiredParameters(accessor);
+ } catch (OAuthException e) {
+ throw new RequestException(
+ "OAuth error thrown while signing request " + e.getMessage());
+ } catch (java.net.URISyntaxException e) {
+ throw new RequestException(
+ "Malformed request URL " + message.URL + " could not be signed");
+ }
+
+ return HttpMessage.newRequest(message, ParameterStyle.QUERY_STRING);
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/src/org/opensocial/providers/GoogleProvider.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,24 @@
+package org.opensocial.providers;
+
+public class GoogleProvider extends Provider {
+
+ public GoogleProvider() {
+ this(false);
+ }
+
+ public GoogleProvider(boolean useRest) {
+ super();
+
+ setName("Google");
+ setVersion("0.8");
+ setRestEndpoint("http://www-opensocial.googleusercontent.com/api/");
+ if (!useRest) {
+
setRpcEndpoint("http://www-opensocial.googleusercontent.com/api/rpc/");
+ }
+ setAuthorizeUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
+
setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
+
setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken");
+ addRequestTokenParameter("scope", getRestEndpoint() + " " +
+ getRpcEndpoint());
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/src/org/opensocial/providers/OrkutSandboxProvider.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,19 @@
+package org.opensocial.providers;
+
+public class OrkutSandboxProvider extends Provider {
+
+ public OrkutSandboxProvider() {
+ this(false);
+ }
+
+ public OrkutSandboxProvider(boolean useRest) {
+ super();
+
+ setName("orkut");
+ setVersion("0.8");
+ setRestEndpoint("http://sandbox.orkut.com/social/rest/");
+ if (!useRest) {
+ setRpcEndpoint("http://sandbox.orkut.com/social/rpc/");
+ }
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/src/org/opensocial/services/ActivityService.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,43 @@
+package org.opensocial.services;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.opensocial.Request;
+import org.opensocial.models.Activity;
+
+public class ActivityService extends Service {
+
+ private static final String restTemplate =
+ "activities/{guid}/{selector}/{appid}/{activityid}";
+
+ public static Request create(Activity activity) {
+ Request request = new
Request(restTemplate, "activities.create", "POST");
+ request.setSelector(ActivityService.SELF);
+ request.setGuid(ActivityService.VIEWER);
+ request.setAppId(ActivityService.APP);
+
+ // Add RPC payload parameters
+ Map activityParameter = new HashMap();
+ activityParameter.put("body", activity.getBody());
+ activityParameter.put("title", activity.getTitle());
+
+ request.addRpcPayloadParameter("activity", activityParameter);
+
+ // Add REST payload parameters
+ request.addRestPayloadParameter("body", activity.getBody());
+ request.addRestPayloadParameter("title", activity.getTitle());
+ request.addRestPayloadParameter("titleId", activity.getTitleId());
+
+ return request;
+ }
+
+ public static Request retrieve() {
+ Request request = new Request(restTemplate, "activities.get", "GET");
+ request.setModelClass(Activity.class);
+ request.setSelector(ActivityService.SELF);
+ request.setGuid(ActivityService.VIEWER);
+
+ return request;
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/src/org/opensocial/services/AppDataService.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,102 @@
+package org.opensocial.services;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.opensocial.Request;
+import org.opensocial.models.AppData;
+
+public class AppDataService extends Service {
+
+ private static final String restTemplate =
+ "appdata/{guid}/{selector}/{appid}";
+
+ public static Request retrieve() {
+ Request request = new Request(restTemplate, "appdata.get", "GET");
+ request.setModelClass(AppData.class);
+ request.setSelector(Service.SELF);
+ request.setGuid(Service.VIEWER);
+ request.setAppId(Service.APP);
+
+ return request;
+ }
+
+ public static Request update(String key, String value) {
+ Map<String, String> data = new HashMap<String, String>();
+ data.put(key, value);
+
+ return update(data);
+ }
+
+ public static Request update(Map<String, String> data) {
+ Request request = new Request(restTemplate, "appdata.update", "PUT");
+ request.setSelector(AppDataService.SELF);
+ request.setGuid("@viewer");
+ request.setAppId(AppDataService.APP);
+
+ // Add RPC payload parameters
+ List<String> fields = new ArrayList<String>(data.size());
+ for (Map.Entry<String, String> field : data.entrySet()) {
+ fields.add(field.getKey());
+ }
+
+ request.addRpcPayloadParameter("data", data);
+ request.addRpcPayloadParameter("fields", fields);
+
+ // Add REST query string parameters
+ StringBuilder fieldsBuilder = new StringBuilder();
+ for (Map.Entry<String, String> datum : data.entrySet()) {
+ if (fieldsBuilder.length() != 0) {
+ fieldsBuilder.append(",");
+ }
+ fieldsBuilder.append(datum.getKey());
+ }
+
+ request.addRestQueryStringParameter("fields",
fieldsBuilder.toString());
+
+ // Add REST payload parameters
+ for (Map.Entry<String, String> datum : data.entrySet()) {
+ request.addRestPayloadParameter(datum.getKey(), datum.getValue());
+ }
+
+ return request;
+ }
+
+ public static Request delete(String key) {
+ return delete(new String[] {key});
+ }
+
+ public static Request delete(String[] keys) {
+ List<String> keyList = new ArrayList<String>(keys.length);
+ for (int i = 0; i < keys.length; i++) {
+ keyList.add(keys[i]);
+ }
+
+ return delete(keyList);
+ }
+
+ public static Request delete(List<String> keys) {
+ Request request = new
Request(restTemplate, "appdata.delete", "DELETE");
+ request.setSelector(Service.SELF);
+ request.setGuid(Service.VIEWER);
+ request.setAppId(Service.APP);
+
+ // Add RPC parameters
+ request.addRpcPayloadParameter("fields", keys);
+
+ // Add REST parameters
+ StringBuilder fieldsBuilder = new StringBuilder();
+ for (String key : keys) {
+ if (fieldsBuilder.length() != 0) {
+ fieldsBuilder.append(",");
+ }
+ fieldsBuilder.append(key);
+ }
+
+ request.addRestQueryStringParameter("fields",
fieldsBuilder.toString());
+
+ return request;
+ }
+}
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/test/org/opensocial/ClientTest.java Tue
Dec 1 01:39:52 2009
@@ -0,0 +1,36 @@
+package org.opensocial;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.opensocial.auth.OAuth2LeggedScheme;
+import org.opensocial.providers.OrkutProvider;
+import org.opensocial.providers.Provider;
+import org.opensocial.services.PeopleService;
+
+public class ClientTest {
+
+ private static final String VIEWER_ID = "03067092798963641994";
+ private static final String CONSUMER_KEY = "orkut.com:623061448914";
+ private static final String CONSUMER_SECRET = "uynAeXiWTisflWX99KU1D2q5";
+
+ @Test(expected = RequestException.class)
+ public void testEmptyRequestQueue() throws RequestException, IOException
{
+ Client client = new Client(new OrkutProvider(), new OAuth2LeggedScheme(
+ CONSUMER_KEY, CONSUMER_SECRET, VIEWER_ID));
+
+ Map<String, Request> requests = new HashMap<String, Request>();
+ client.send(requests);
+ }
+
+ @Test(expected = RequestException.class)
+ public void testNoEndpointsSet() throws RequestException, IOException {
+ Client client = new Client(new Provider(), new OAuth2LeggedScheme(
+ CONSUMER_KEY, CONSUMER_SECRET, VIEWER_ID));
+
+ Request request = PeopleService.retrieve();
+ client.send(request);
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/test/org/opensocial/online/ActivityTest.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,57 @@
+package org.opensocial.online;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.opensocial.Client;
+import org.opensocial.Request;
+import org.opensocial.Response;
+import org.opensocial.auth.OAuth2LeggedScheme;
+import org.opensocial.models.Activity;
+import org.opensocial.providers.MySpaceProvider;
+import org.opensocial.services.ActivityService;
+
+import java.util.Date;
+import java.util.List;
+
+public class ActivityTest {
+
+ private static final String MYSPACE_KEY
= "http://www.myspace.com/495182150";
+ private static final String MYSPACE_SECRET =
+ "20ab52223e684594a8050a8bfd4b06693ba9c9183ee24e1987be87746b1b03f8";
+ private static final String MYSPACE_ID = "495184236";
+
+ @Test
+ public void createMySpace() {
+ Activity activity = new Activity();
+ activity.setTitle("opensocial-java-client test activity at " +
+ new Date().getTime());
+ activity.setBody("opensocial-java-client test activity body");
+ activity.setTitleId("test");
+
+ try {
+ Client client = new Client(new MySpaceProvider(),
+ new OAuth2LeggedScheme(MYSPACE_KEY, MYSPACE_SECRET, MYSPACE_ID));
+ Request request = ActivityService.create(activity);
+ client.send(request);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+
+ @Test
+ public void retrieveFromMySpace() {
+ try {
+ Client client = new Client(new MySpaceProvider(),
+ new OAuth2LeggedScheme(MYSPACE_KEY, MYSPACE_SECRET, MYSPACE_ID));
+ Request request = ActivityService.retrieve();
+ Response response = client.send(request);
+
+ List<Activity> activities = response.getEntries();
+ assertTrue(activities.size() > 0);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/test/org/opensocial/online/AppDataTest.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,175 @@
+package org.opensocial.online;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.opensocial.Client;
+import org.opensocial.Request;
+import org.opensocial.Response;
+import org.opensocial.auth.OAuth2LeggedScheme;
+import org.opensocial.models.AppData;
+import org.opensocial.providers.OrkutSandboxProvider;
+import org.opensocial.services.AppDataService;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+
+public class AppDataTest {
+
+ private static final String ORKUT_KEY = "orkut.com:623061448914";
+ private static final String ORKUT_SECRET = "uynAeXiWTisflWX99KU1D2q5";
+ private static final String ORKUT_ID = "03067092798963641994";
+
+ @BeforeClass
+ public static void setup() {
+ Client client = new Client(new OrkutSandboxProvider(),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+ try {
+ Request request = AppDataService.update("java", "rocks");
+ client.send(request);
+ } catch (Exception e) {
+ }
+ }
+
+ @Test
+ public void retrieveFromOrkutUsingRpc() {
+ retrieveFromOrkut(false);
+ }
+
+ @Test
+ public void retrieveFromOrkutUsingRest() {
+ retrieveFromOrkut(true);
+ }
+
+ private void retrieveFromOrkut(boolean useRest) {
+ try {
+ Client client = new Client(new OrkutSandboxProvider(useRest),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+ Request request = AppDataService.retrieve();
+ Response response = client.send(request);
+
+ AppData data = response.getEntry();
+ assertTrue(data.hasField(ORKUT_ID));
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+
+ @Test
+ public void singleUpdateAndRetrieveFromOrkutUsingRpc() {
+ singleUpdateAndRetrieveFromOrkut(false);
+ }
+
+ @Test
+ public void singleUpdateAndRetrieveFromOrkutUsingRest() {
+ singleUpdateAndRetrieveFromOrkut(true);
+ }
+
+ private void singleUpdateAndRetrieveFromOrkut(boolean useRest) {
+ Random generator = new Random();
+ String randomValue = String.valueOf(generator.nextInt());
+
+ Client client = new Client(new OrkutSandboxProvider(useRest),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+
+ try {
+ Request request = AppDataService.update("key", randomValue);
+ client.send(request);
+ } catch (Exception e) {
+ fail("Exception occurred while processing update request");
+ }
+
+ try {
+ Request request = AppDataService.retrieve();
+ Response response = client.send(request);
+
+ AppData data = response.getEntry();
+ assertTrue(data.getDataForUser(ORKUT_ID, "key").equals(randomValue));
+ } catch (Exception e) {
+ fail("Exception occurred while processing retrieve request");
+ }
+
+ try {
+ Request request = AppDataService.delete("key");
+ client.send(request);
+ } catch (Exception e) {
+ fail("Exception occurred while processing delete request");
+ }
+
+ try {
+ Request request = AppDataService.retrieve();
+ Response response = client.send(request);
+
+ AppData data = response.getEntry();
+ assertTrue(data.hasField(ORKUT_ID));
+ assertTrue(data.getDataForUser(ORKUT_ID, "key") == null);
+ assertTrue(data.getDataForUser(ORKUT_ID, "java") != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing retrieve request");
+ }
+ }
+
+ @Test
+ public void multiUpdateRetrieveAndDeleteFromOrkutUsingRpc() {
+ multiUpdateRetrieveAndDeleteFromOrkut(false);
+ }
+
+ @Test
+ public void multiUpdateRetrieveAndDeleteFromOrkutUsingRest() {
+ multiUpdateRetrieveAndDeleteFromOrkut(true);
+ }
+
+ private void multiUpdateRetrieveAndDeleteFromOrkut(boolean useRest) {
+ Random generator = new Random();
+ String randomValue1 = String.valueOf(generator.nextInt());
+ String randomValue2 = String.valueOf(generator.nextInt());
+
+ Client client = new Client(new OrkutSandboxProvider(useRest),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+
+ try {
+ Map<String, String> data = new HashMap<String, String>();
+ data.put("key1", randomValue1);
+ data.put("key2", randomValue2);
+
+ Request request = AppDataService.update(data);
+ client.send(request);
+ } catch (Exception e) {
+ fail("Exception occurred while processing update request");
+ }
+
+ try {
+ Request request = AppDataService.retrieve();
+ Response response = client.send(request);
+
+ AppData data = response.getEntry();
+
assertTrue(data.getDataForUser(ORKUT_ID, "key1").equals(randomValue1));
+
assertTrue(data.getDataForUser(ORKUT_ID, "key2").equals(randomValue2));
+ } catch (Exception e) {
+ fail("Exception occurred while processing retrieve request");
+ }
+
+ try {
+ Request request = AppDataService.delete(new String[]
{"key1", "key2"});
+ client.send(request);
+ } catch (Exception e) {
+ fail("Exception occurred while processing delete request");
+ }
+
+ try {
+ Request request = AppDataService.retrieve();
+ Response response = client.send(request);
+
+ AppData data = response.getEntry();
+ assertTrue(data.hasField(ORKUT_ID));
+ assertTrue(data.getDataForUser(ORKUT_ID, "key1") == null);
+ assertTrue(data.getDataForUser(ORKUT_ID, "key2") == null);
+ assertTrue(data.getDataForUser(ORKUT_ID, "java") != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing retrieve request");
+ }
+ }
+}
=======================================
--- /dev/null
+++ /branches/2009q4rewrite/java/test/org/opensocial/online/PeopleTest.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,114 @@
+package org.opensocial.online;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.opensocial.Client;
+import org.opensocial.Request;
+import org.opensocial.Response;
+import org.opensocial.auth.OAuth2LeggedScheme;
+import org.opensocial.models.Person;
+import org.opensocial.providers.GoogleProvider;
+import org.opensocial.providers.MySpaceProvider;
+import org.opensocial.providers.OrkutProvider;
+import org.opensocial.services.PeopleService;
+
+public class PeopleTest {
+
+ private static final String ORKUT_KEY = "orkut.com:623061448914";
+ private static final String ORKUT_SECRET = "uynAeXiWTisflWX99KU1D2q5";
+ private static final String ORKUT_ID = "03067092798963641994";
+
+ private static final String GOOGLE_KEY = "google.com:249475676706";
+ private static final String GOOGLE_SECRET = "fWPcoVP6DOLVqZOF2HH+ihU2";
+ private static final String GOOGLE_ID = "101911127807751034357";
+
+ private static final String MYSPACE_KEY
= "http://www.myspace.com/495182150";
+ private static final String MYSPACE_SECRET =
+ "20ab52223e684594a8050a8bfd4b06693ba9c9183ee24e1987be87746b1b03f8";
+ private static final String MYSPACE_ID = "495184236";
+
+ @Test
+ public void retrieveSelfFromOrkutUsingRpc() {
+ retrieveSelfFromOrkut(false);
+ }
+
+ @Test
+ public void retrieveSelfFromOrkutUsingRest() {
+ retrieveSelfFromOrkut(true);
+ }
+
+ private void retrieveSelfFromOrkut(boolean useRest) {
+ try {
+ Client client = new Client(new OrkutProvider(useRest),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+ Request request = PeopleService.retrieve();
+ Response response = client.send(request);
+
+ Person self = response.getEntry();
+ assertTrue(self.getId() != null);
+ assertTrue(self.getDisplayName() != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+
+ @Test
+ public void retrieveFriendsFromOrkutUsingRpc() {
+ retrieveFriendsFromOrkut(false);
+ }
+
+ @Test
+ public void retrieveFriendsFromOrkutUsingRest() {
+ retrieveFriendsFromOrkut(true);
+ }
+
+ private void retrieveFriendsFromOrkut(boolean useRest) {
+ try {
+ Client client = new Client(new OrkutProvider(useRest),
+ new OAuth2LeggedScheme(ORKUT_KEY, ORKUT_SECRET, ORKUT_ID));
+ Request request = PeopleService.retrieve(PeopleService.VIEWER,
+ PeopleService.FRIENDS);
+ Response response = client.send(request);
+
+ Person self = response.getEntry();
+ assertTrue(self.getId() != null);
+ assertTrue(self.getDisplayName() != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+
+ @Test
+ public void retrieveSelfFromGoogle() {
+ try {
+ Client client = new Client(new GoogleProvider(),
+ new OAuth2LeggedScheme(GOOGLE_KEY, GOOGLE_SECRET, GOOGLE_ID));
+ Request request = PeopleService.retrieve();
+ Response response = client.send(request);
+
+ Person self = response.getEntry();
+ assertTrue(self.getId() != null);
+ assertTrue(self.getDisplayName() != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+
+ @Test
+ public void retrieveSelfFromMySpace() {
+ try {
+ Client client = new Client(new MySpaceProvider(),
+ new OAuth2LeggedScheme(MYSPACE_KEY, MYSPACE_SECRET, MYSPACE_ID));
+ Request request = PeopleService.retrieve();
+ Response response = client.send(request);
+
+ Person self = response.getEntry();
+ assertTrue(self.getId() != null);
+ assertTrue(self.getDisplayName() != null);
+ } catch (Exception e) {
+ fail("Exception occurred while processing request");
+ }
+ }
+}
=======================================
--- /dev/null
+++
/branches/2009q4rewrite/java/test/org/opensocial/services/PeopleServiceTest.java
Tue Dec 1 01:39:52 2009
@@ -0,0 +1,52 @@
+package org.opensocial.services;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.opensocial.Request;
+import org.opensocial.models.Person;
+
+public class PeopleServiceTest {
+
+ @Test
+ public void retrieveWithZeroArguments() {
+ Request request = PeopleService.retrieve();
+
+ testCommonAttributes(request);
+ testCommonRetrieveAttributes(request);
+ assertTrue(request.getGuid().equals(Service.VIEWER));
+ assertTrue(request.getSelector().equals(Service.SELF));
+
+ }
+
+ @Test
+ public void retrieveWithOneArgument() {
+ final String id = "03067092798963641994";
+ Request request = PeopleService.retrieve(id);
+
+ testCommonAttributes(request);
+ testCommonRetrieveAttributes(request);
+ assertTrue(request.getGuid().equals(id));
+ assertTrue(request.getSelector().equals(Service.SELF));
+ }
+
+ @Test
+ public void retrieveWithTwoArguments() {
+ Request request = PeopleService.retrieve(Service.VIEWER,
Service.FRIENDS);
+
+ testCommonAttributes(request);
+ testCommonRetrieveAttributes(request);
+ assertTrue(request.getGuid().equals(Service.VIEWER));
+ assertTrue(request.getSelector().equals(Service.FRIENDS));
+ }
+
+ private void testCommonAttributes(Request request) {
+ assertTrue(request.getModelClass().equals(Person.class));
+
assertTrue(request.getTemplate().equals("people/{guid}/{selector}/{pid}"));
+ }
+
+ private void testCommonRetrieveAttributes(Request request) {
+ assertTrue(request.getRestMethod().equals("GET"));
+ assertTrue(request.getRpcMethod().equals("people.get"));
+ }
+}
=======================================
--- /branches/2009q4rewrite/java/demos/KitchenSink.java Wed Oct 14 18:05:00
2009
+++ /dev/null
@@ -1,129 +0,0 @@
-
-import org.opensocial.Client;
-import org.opensocial.Request;
-import org.opensocial.RequestException;
-import org.opensocial.Response;
-import org.opensocial.auth.AuthScheme;
-import org.opensocial.auth.OAuth2LeggedScheme;
-import org.opensocial.data.Model;
-import org.opensocial.data.Person;
-import org.opensocial.providers.MySpaceProvider;
-import org.opensocial.providers.OrkutProvider;
-import org.opensocial.services.PeopleService;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class KitchenSink {
-
- public static void main(String[] args) {
- AuthScheme orkutAuth = new OAuth2LeggedScheme("orkut.com:623061448914",
- "uynAeXiWTisflWX99KU1D2q5", "03067092798963641994");
- Client orkutClient = new Client(new OrkutProvider(), orkutAuth);
-
- AuthScheme myspaceAuth = new OAuth2LeggedScheme(
- "http://www.myspace.com/495182150",
- "20ab52223e684594a8050a8bfd4b06693ba9c9183ee24e1987be87746b1b03f8",
- "495184236");
- Client myspaceClient = new Client(new MySpaceProvider(), myspaceAuth);
-
-
- /** orkut single request
*************************************************/
-
- try {
- Request request = PeopleService.get();
- Response response = orkutClient.send(request);
- Person user = (Person) response.getEntry();
-
- System.out.println("\norkut profile data:");
- System.out.println(user.getId() + " | " + user.getDisplayName());
- } catch (RequestException e) {
- System.out.println("RequestException thrown: " + e.getMessage());
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println("IOException thrown: " + e.getMessage());
- e.printStackTrace();
- }
-
- /** MySpace single request
***********************************************/
-
- try {
- Request request = PeopleService.get();
- Response response = myspaceClient.send(request);
- Person user = (Person) response.getEntry();
-
- System.out.println("\nMySpace profile data:");
- System.out.println(user.getId() + " | " + user.getDisplayName());
- } catch (RequestException e) {
- System.out.println("RequestException thrown: " + e.getMessage());
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println("IOException thrown: " + e.getMessage());
- e.printStackTrace();
- }
-
- /** orkut batch request
**************************************************/
-
- try {
- Request profileDataRequest =
PeopleService.get("03067092798963641994");
- Request friendDataRequest = PeopleService.get("03067092798963641994",
- PeopleService.FRIENDS);
-
- Map<String, Request> requests = new HashMap<String, Request>();
- requests.put("viewer", profileDataRequest);
- requests.put("friends", friendDataRequest);
-
- Map<String, Response> responses = orkutClient.send(requests);
- Person user = (Person) responses.get("viewer").getEntry();
- List<Model> friends = responses.get("friends").getEntries();
-
- System.out.println("\norkut profile data:");
- System.out.println(user.getId() + " | " + user.getDisplayName());
-
- System.out.println("\norkut friends:");
- for (Model friendEntry : friends) {
- Person friend = (Person) friendEntry;
- System.out.println(friend.getId() + " | " +
friend.getDisplayName());
- }
- } catch (RequestException e) {
- System.out.println("RequestException thrown: " + e.getMessage());
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println("IOException thrown: " + e.getMessage());
- e.printStackTrace();
- }
-
- /** MySpace batch request
************************************************/
-
- try {
- Request profileDataRequest = PeopleService.get();
- Request friendDataRequest = PeopleService.get(PeopleService.VIEWER,
- PeopleService.FRIENDS);
-
- Map<String, Request> requests = new HashMap<String, Request>();
- requests.put("viewer", profileDataRequest);
- requests.put("friends", friendDataRequest);
-
- Map<String, Response> responses = myspaceClient.send(requests);
- Person user = (Person) responses.get("viewer").getEntry();
- List<Model> friends = responses.get("friends").getEntries();
-
- System.out.println("\nMySpace profile data:");
- System.out.println(user.getId() + " | " + user.getDisplayName());
-
- System.out.println("\nMySpace friends:");
- for (Model friendEntry : friends) {
- Person friend = (Person) friendEntry;
- System.out.println(friend.getId() + " | " +
friend.getDisplayName());
- }
- } catch (RequestException e) {
- System.out.println("RequestException thrown: " + e.getMessage());
- e.printStackTrace();
- } catch (IOException e) {
- System.out.println("IOException thrown: " + e.getMessage());
- e.printStackTrace();
- }
- }
-}
=======================================
--- /branches/2009q4rewrite/java/src/org/opensocial/Client.java Wed Oct 14
18:05:00 2009
+++ /branches/2009q4rewrite/java/src/org/opensocial/Client.java Tue Dec 1
01:39:52 2009
@@ -2,7 +2,6 @@

import net.oauth.http.HttpMessage;

-import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.opensocial.auth.AuthScheme;
@@ -11,6 +10,8 @@
import org.opensocial.providers.Provider;

import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

@@ -20,8 +21,6 @@
private AuthScheme authScheme;
private HttpClient httpClient;

- private static final Logger logger = Logger.getLogger("org.opensocial");
-
public Client(Provider provider, AuthScheme authScheme) {
this.provider = provider;
this.authScheme = authScheme;
@@ -79,34 +78,16 @@
RequestException, IOException {
Map<String, String> requestHeaders = new HashMap<String, String>();
requestHeaders.put(HttpMessage.CONTENT_TYPE,
provider.getContentType());
-
- JSONArray requestArray = new JSONArray();
- for (Map.Entry<String, Request> requestEntry : requests.entrySet()) {
- JSONObject request = new JSONObject();
- request.put("id", requestEntry.getKey());
- request.put("method", requestEntry.getValue().getRpcMethod());
-
- JSONObject requestParams = new JSONObject();
- if (requestEntry.getValue().getGuid() != null) {
- requestParams.put("userId", requestEntry.getValue().getGuid());
- }
- if (requestEntry.getValue().getSelector() != null) {
- requestParams.put("groupId",
requestEntry.getValue().getSelector());
- }
-
- request.put("params", requestParams);
- requestArray.add(request);
- }

HttpMessage message = authScheme.getHttpMessage(provider, "POST",
- buildRpcUrl(), requestHeaders, requestArray.toJSONString());
+ buildRpcUrl(), requestHeaders, buildRpcPayload(requests));

HttpResponseMessage responseMessage = httpClient.execute(message);

- logger.debug("Request URL: " +
responseMessage.getUrl().toExternalForm());
- logger.debug("Request body: " + requestArray.toJSONString());
- logger.debug("Status code: " + responseMessage.getStatusCode());
- logger.debug("Response: " + responseMessage.getResponse());
+ System.out.println("Request URL: " +
responseMessage.getUrl().toString());
+ System.out.println("Request body: " + buildRpcPayload(requests));
+ System.out.println("Status code: " + responseMessage.getStatusCode());
+ System.out.println("Response: " + responseMessage.getResponse());

Map<String, Response> responses = Response.parseRpcResponse(requests,
responseMessage, provider.getVersion());
@@ -120,19 +101,63 @@
requestHeaders.put(HttpMessage.CONTENT_TYPE,
provider.getContentType());

HttpMessage message = authScheme.getHttpMessage(provider,
- request.getRestMethod(), buildRestUrl(request), requestHeaders,
null);
+ request.getRestMethod(), buildRestUrl(request), requestHeaders,
+ buildRestPayload(request));

HttpResponseMessage responseMessage = httpClient.execute(message);

- logger.debug("Request URL: " + responseMessage.getUrl().toString());
- logger.debug("Status code: " + responseMessage.getStatusCode());
- logger.debug("Response: " + responseMessage.getResponse());
+ System.out.println("Request method: " + responseMessage.getMethod());
+ System.out.println("Request URL: " +
responseMessage.getUrl().toString());
+ System.out.println("Request body: " + buildRestPayload(request));
+ System.out.println("Status code: " + responseMessage.getStatusCode());
+ System.out.println("Response: " + responseMessage.getResponse());

Response response = Response.parseRestResponse(request,
responseMessage,
provider.getVersion());

return response;
}
+
+ private String buildRpcUrl() {
+ StringBuilder builder = new StringBuilder(provider.getRpcEndpoint());
+
+ // Remove trailing forward slash
+ if (builder.charAt(builder.length() - 1) == '/') {
+ builder.deleteCharAt(builder.length() - 1);
+ }
+
+ return builder.toString();
+ }
+
+ private String buildRpcPayload(Map<String, Request> requests) {
+ JSONArray requestArray = new JSONArray();
+ for (Map.Entry<String, Request> requestEntry : requests.entrySet()) {
+ JSONObject request = new JSONObject();
+ request.put("id", requestEntry.getKey());
+ request.put("method", requestEntry.getValue().getRpcMethod());
+
+ JSONObject requestParams = new JSONObject();
+ if (requestEntry.getValue().getGuid() != null) {
+ requestParams.put("userId", requestEntry.getValue().getGuid());
+ }
+ if (requestEntry.getValue().getSelector() != null) {
+ requestParams.put("groupId",
requestEntry.getValue().getSelector());
+ }
+ if (requestEntry.getValue().getAppId() != null) {
+ requestParams.put("appId", requestEntry.getValue().getAppId());
+ }
+
+ for (Map.Entry<String, Object> parameter :
+ requestEntry.getValue().getRpcPayloadParameters().entrySet()) {
+ requestParams.put(parameter.getKey(), parameter.getValue());
+ }
+
+ request.put("params", requestParams);
+ requestArray.add(request);
+ }
+
+ return requestArray.toJSONString();
+ }

private String buildRestUrl(Request request) {
StringBuilder builder = new StringBuilder(provider.getRestEndpoint());
@@ -148,6 +173,9 @@
} else if (tag.equals("selector") && request.getSelector() !=
null) {
builder.append(request.getSelector());
builder.append("/");
+ } else if (tag.equals("appid") && request.getAppId() != null) {
+ builder.append(request.getAppId());
+ builder.append("/");
}
} else {
builder.append(component);
@@ -157,18 +185,45 @@

// Remove trailing forward slash
builder.deleteCharAt(builder.length() - 1);
+
+ // Append query string parameters
+ Map<String, String> parameters =
request.getRestQueryStringParameters();
+ if (parameters != null && parameters.size() > 0) {
+ boolean runOnce = false;
+
+ for (Map.Entry<String, String> parameter: parameters.entrySet()) {
+ if (!runOnce) {
+ builder.append("?");
+ runOnce = true;
+ } else {
+ builder.append("&");
+ }
+
+ try {
+ builder.append(URLEncoder.encode(parameter.getKey(), "UTF-8"));
+ builder.append("=");
+ builder.append(URLEncoder.encode(parameter.getValue(), "UTF-8"));
+ } catch (UnsupportedEncodingException e) {
+ // Ignore
+ }
+ }
+ }

return builder.toString();
}

- private String buildRpcUrl() {
- StringBuilder builder = new StringBuilder(provider.getRpcEndpoint());
-
- // Remove trailing forward slash
- if (builder.charAt(builder.length() - 1) == '/') {
- builder.deleteCharAt(builder.length() - 1);
+ private String buildRestPayload(Request request) {
+ Map<String, Object> parameters = request.getRestPayloadParameters();
+
+ if (parameters == null || parameters.size() == 0) {
+ return null;
}

- return builder.toString();
+ JSONObject payload = new JSONObject();
+ for (Map.Entry<String, Object> parameter : parameters.entrySet()) {
+ payload.put(parameter.getKey(), parameter.getValue());
+ }
+
+ return payload.toJSONString();
}
}
=======================================
--- /branches/2009q4rewrite/java/src/org/opensocial/Request.java Wed Oct 14
18:05:00 2009
+++ /branches/2009q4rewrite/java/src/org/opensocial/Request.java Tue Dec 1
01:39:52 2009
@@ -3,28 +3,34 @@
import java.util.HashMap;
import java.util.Map;

-import org.opensocial.data.Model;
+import org.opensocial.models.Model;

public class Request {

private String guid;
+ private String appId;
private String selector;
private String template;
private String rpcMethod;
private String restMethod;
- private Map<String, String> parameters;
+ private Map<String, Object> rpcPayloadParameters;
+ private Map<String, Object> restPayloadParameters;
+ private Map<String, String> restQueryStringParameters;
private Class<? extends Model> modelClass;

public Request(String template, String rpcMethod, String restMethod) {
this.template = template;
this.rpcMethod = rpcMethod;
this.restMethod = restMethod;
- this.parameters = new HashMap<String, String>();
}

public String getGuid() {
return guid;
}
+
+ public String getAppId() {
+ return appId;
+ }

public String getSelector() {
return selector;
@@ -42,8 +48,28 @@
return restMethod;
}

- public Map<String, String> getParameters() {
- return parameters;
+ public Map<String, Object> getRpcPayloadParameters() {
+ if (rpcPayloadParameters == null) {
+ rpcPayloadParameters = new HashMap<String, Object>();
+ }
+
+ return rpcPayloadParameters;
+ }
+
+ public Map<String, Object> getRestPayloadParameters() {
+ if (restPayloadParameters == null) {
+ restPayloadParameters = new HashMap<String, Object>();
+ }
+
+ return restPayloadParameters;
+ }
+
+ public Map<String, String> getRestQueryStringParameters() {
+ if (restQueryStringParameters == null) {
+ restQueryStringParameters = new HashMap<String, String>();
+ }
+
+ return restQueryStringParameters;
}

public Class<? extends Model> getModelClass() {
@@ -57,10 +83,50 @@
public void setGuid(String guid) {
this.guid = guid;
}
+
+ public void setAppId(String appId) {
+ this.appId = appId;
+ }

public void setSelector(String selector) {
this.selector = selector;
}
+
+ public void addRpcPayloadParameter(String key, Object value) {
+ if (rpcPayloadParameters == null) {
+ rpcPayloadParameters = new HashMap<String, Object>();
+ }
+
+ rpcPayloadParameters.put(key, value);
+ }
+
+ public void setRpcPayloadParameters(Map<String, Object> parameters) {
+ rpcPayloadParameters = parameters;
+ }
+
+ public void addRestPayloadParameter(String key, Object value) {
+ if (restPayloadParameters == null) {
+ restPayloadParameters = new HashMap<String, Object>();
+ }
+
+ restPayloadParameters.put(key, value);
+ }
+
+ public void setRestPayloadParameters(Map<String, Object> parameters) {
+ restPayloadParameters = parameters;
+ }
+
+ public void addRestQueryStringParameter(String key, String value) {
+ if (restQueryStringParameters == null) {
+ restQueryStringParameters = new HashMap<String, String>();
+ }
+
+ restQueryStringParameters.put(key, value);
+ }
+
+ public void setRestQueryStringParameters(Map<String, String> parameters)
{
+ restQueryStringParameters = parameters;
+ }

public void setModelClass(Class<? extends Model> modelClass) {
this.modelClass = modelClass;
=======================================
--- /branches/2009q4rewrite/java/src/org/opensocial/Response.java Wed Oct
14 18:05:00 2009
+++ /branches/2009q4rewrite/java/src/org/opensocial/Response.java Tue Dec
1 01:39:52 2009
@@ -1,7 +1,7 @@
package org.opensocial;

-import org.opensocial.data.Model;
import org.opensocial.http.HttpResponseMessage;
+import org.opensocial.models.Model;
import org.opensocial.parsers.JsonParser;
import org.opensocial.parsers.Parser;

@@ -70,16 +70,16 @@
return isFiltered;
}

- public List<Model> getEntries() {
- return entries;
+ public <T extends Model> List<T> getEntries() {
+ return (List<T>) entries;
}

- public Model getEntry() {
+ public <T extends Model> T getEntry() {
if (entries == null || entries.size() == 0) {
return null;
}

- return entries.get(0);
+ return (T) entries.get(0);
}

public void setStartIndex(Object startIndex) {
=======================================
***Additional files exist in this changeset.***
Reply all
Reply to author
Forward
0 new messages