/*
+---------------------------------------------------------------------------+
| Facebook Development Platform Java Client |
+---------------------------------------------------------------------------+
| Copyright (c) 2007-2008 Facebook, Inc. |
| All rights reserved. |
| |
| Redistribution and use in source and binary forms, with or without |
| modification, are permitted provided that the following conditions |
| are met: |
| |
| 1. Redistributions of source code must retain the above copyright |
| notice, this list of conditions and the following disclaimer. |
| 2. Redistributions in binary form must reproduce the above copyright |
| notice, this list of conditions and the following disclaimer in the |
| documentation and/or other materials provided with the distribution. |
| |
| THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+---------------------------------------------------------------------------+
| For help with this library, contact developers-help@facebook.com |
+---------------------------------------------------------------------------+
*/
package com.facebook.api;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
/**
* A FacebookRestClient that uses the JSON result format. This means
* results from calls to the Facebook API are returned as
* <a href="http://www.json.org/">JSON</a> and
* transformed into Java <code>Object</code>'s.
*/
public class FacebookJsonRestClient extends FacebookRestClient<Object> {
public FacebookJsonRestClient(String apiKey, String secret) {
this(SERVER_URL, apiKey, secret, null);
}
public FacebookJsonRestClient(String apiKey, String secret, String sessionKey) {
this(SERVER_URL, apiKey, secret, sessionKey);
}
public FacebookJsonRestClient(String serverAddr, String apiKey, String secret, String sessionKey)
throws MalformedURLException {
this(new URL(serverAddr), apiKey, secret, sessionKey);
}
public FacebookJsonRestClient(URL serverUrl, String apiKey, String secret, String sessionKey) {
super(serverUrl, apiKey, secret, sessionKey);
}
/**
* The response format in which results to FacebookMethod calls are returned
* @return the format: either XML, JSON, or null (API default)
*/
public String getResponseFormat() {
return "json";
}
/**
* Extracts a String from a result consisting entirely of a String.
* @param val
* @return the String
*/
public String extractString(Object val) {
try {
return (String) val;
} catch (ClassCastException cce) {
logException(cce);
return null;
}
}
/**
* Sets the session information (sessionKey) using the token from auth_createToken.
*
* @param authToken the token returned by auth_createToken or passed back to your callback_url.
* @return the session key
* @throws FacebookException
* @throws IOException
*/
public String auth_getSession(String authToken)
throws FacebookException, IOException {
if (null != this._sessionKey) {
return this._sessionKey;
}
JSONObject d = (JSONObject) this.callMethod(FacebookMethod.AUTH_GET_SESSION,
new Pair<String, CharSequence>("auth_token", authToken.toString()));
this._sessionKey = (String) d.get("session_key");
Object uid = d.get("uid");
try {
this._userId = ((Long) uid).intValue();
} catch (ClassCastException cce) {
this._userId = Integer.parseInt((String) uid);
}
if (this.isDesktop()) {
this._sessionSecret = (String) d.get("secret");
}
return this._sessionKey;
}
/**
* Parses the result of an API call from JSON into Java Objects.
* @param data an InputStream with the results of a request to the Facebook servers
* @param method the method
* @return a Java Object
* @throws FacebookException if <code>data</code> represents an error
* @throws IOException if <code>data</code> is not readable
* @see JSONObject
*/
protected Object parseCallResult(InputStream data, IFacebookMethod method)
throws FacebookException, IOException {
Object json = JSONValue.parse(new InputStreamReader(data));
if (isDebug()) {
log(method.methodName() + ": " + (null != json ? json.toString() : "null"));
}
if (json instanceof JSONObject) {
JSONObject jsonObj = (JSONObject) json;
if (jsonObj.containsKey("error_code")) {
Long errorCode = (Long) jsonObj.get("error_code");
String message = (String) jsonObj.get("error_msg");
throw new FacebookException(errorCode.intValue(), message);
}
}
return json;
}
/**
* Extracts a URL from a result that consists of a URL only.
* For JSON, that result is simply a String.
* @param url
* @return the URL
*/
protected URL extractURL(Object url)
throws IOException {
if (!(url instanceof String)) {
return null;
}
return (null == url || "".equals(url)) ? null : new URL( (String) url);
}
/**
* Extracts an Integer from a result that consists of an Integer only.
* @param val
* @return the Integer
*/
protected int extractInt(Object val) {
try {
return (Integer) val;
} catch (ClassCastException cce) {
logException(cce);
return 0;
}
}
/**
* Extracts a Boolean from a result that consists of a Boolean only.
* @param val
* @return the Boolean
*/
protected boolean extractBoolean(Object val) {
try {
return (Boolean) val;
} catch (ClassCastException cce) {
logException(cce);
return false;
}
}
/**
* Extracts a Long from a result that consists of an Long only.
* @param val
* @return the Integer
*/
protected Long extractLong(Object val) {
try {
return (Long) val;
} catch (ClassCastException cce) {
logException(cce);
return null;
}
}
}