package org.societies.platform.FacebookConn.impl; import java.util.Date; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.UUID; import org.societies.api.internal.sns.ISocialConnector; import org.societies.platform.FacebookConn.FacebookConnector; import com.restfb.DefaultFacebookClient; import com.restfb.DefaultJsonMapper; import com.restfb.FacebookClient; import com.restfb.FacebookClient.AccessToken; import com.restfb.JsonMapper; import com.restfb.Parameter; import com.restfb.WebRequestor.Response; import com.restfb.batch.BatchRequest; import com.restfb.batch.BatchRequest.BatchRequestBuilder; import com.restfb.batch.BatchResponse; import com.restfb.json.JsonArray; import com.restfb.json.JsonObject; import com.restfb.types.FacebookType; public class FacebookConnectorImpl implements FacebookConnector { private String access_token = null; private String identity = null; private String name; private String id; private String lastUpdate = "yesterday"; private Properties parameters; private FacebookClient facebookClient; private int maxPostLimit = 700; private long tokenExpiration = 0; private boolean firstTime = true; /** * Empty conctructor */ public FacebookConnectorImpl(){} /** * Facebook connector construtor. Initialize the minimum set of parameter to * generate an instance of Facebook connector. * @param access_token - the use token to grant read/write access to his FB account * @param identity - societies Identity * */ public FacebookConnectorImpl (String access_token, String identity){ this.identity = identity; this.access_token = access_token; this.name = ISocialConnector.; this.id = this.name + "_" + UUID.randomUUID(); facebookClient = new DefaultFacebookClient(access_token); } public String getID(){ return this.id; } public void setToken(String access_token) { this.access_token = access_token; facebookClient = new DefaultFacebookClient(access_token); this.id = this.name + "_" + UUID.randomUUID(); } public String getLastUpdate() { return lastUpdate; } public void setLastUpdate(String lastUpdate) { this.lastUpdate = lastUpdate; } public String getToken() { // facebookClient = new DefaultFacebookClient(); // String appId = "368482799848413"; // String secretKey = "c1788688a3091638768ed803d6ebdbd0"; // String sessionKeys = null; // List<AccessToken> tokens = facebookClient.convertSessionKeysToAccessTokens(appId, secretKey, sessionKeys); // Iterator<AccessToken>it = tokens.iterator(); // while(it.hasNext()){ // AccessToken at= it.next(); // //System.out.println("token:"+at.getAccessToken() + "expires:"+at.getExpires()); // } return access_token; } public void setConnectorName(String name) { this.name= name; } public String getConnectorName() { return name; } public String getSocialData(String path) { try{ if (access_token==null) genError("Access token is null", "Connector with no token", 500); BatchRequest request = new BatchRequestBuilder(path).parameters(Parameter.with("until", lastUpdate), Parameter.with("limit", maxPostLimit)).build(); List<BatchResponse> batchResponses = facebookClient.executeBatch(request); BatchResponse response = batchResponses.get(0); lastUpdate= new Date().toString(); if (response==null) return genError("No response from Facebook (Empty)", "Empty response", 200); else if (response.getBody().length()==0) return response.toString(); else{ JsonObject result = new JsonObject(response.getBody()); return result.toString(1); } } catch(Exception ex){ return genError(ex.getMessage(), "Request failure", 400); } } private String genError(String message, String type, int code){ return "{ \"error\" : {\"message\": \""+ message + " \", \"type\": \"" + type + "\", \"code\" :\"" +code +"\"} }"; } public Map<String, String> requireAccessToken() { HashMap<String, String > credential = new HashMap<String, String>(); // try { // // WebRequestor doGet = new DefaultWebRequestor(); // Response response = doGet.executeGet("http://wd.teamlife.it/fbconnector.php"); // System.out.println("Auth: " +response.getBody()+ " code:" + response.getStatusCode()); // // } // catch (IOException e) { // e.printStackTrace(); // } // // // // this should be provided by an external component // credential.put(AUTH_TOKEN, ""); return credential; } public void disconnect() { access_token=""; } public void setMaxPostLimit(int postLimit) { this.maxPostLimit = postLimit; } public void setParameter(String key, String value){ if (parameters == null){ parameters= new Properties(); } parameters.put(key, value); } public String genURL(String path){ String opt= ""; if (parameters ==null) parameters = new Properties(); if (!parameters.contains("limit")) parameters.put("limit", ""+this.maxPostLimit); //if (!parameters.contains("until")) parameters.put("until", "yesterday"); Enumeration it = parameters.keys(); while (it.hasMoreElements()){ String k = it.nextElement().toString(); opt += "&" +k +"=" +parameters.getProperty(k); } return "https://graph.facebook.com/"+path+"?access_token="+access_token+opt ; } public void resetParameters() { parameters = new Properties(); } public String getUserProfile() { try{ BatchRequest reqME = new BatchRequestBuilder(ME).build(); BatchRequest reqBOOK = new BatchRequestBuilder(BOOKS).build(); BatchRequest reqINTEREST = new BatchRequestBuilder(INTERESTS).build(); BatchRequest reqMUSIC = new BatchRequestBuilder(MUSIC).build(); BatchRequest reqLIKES = new BatchRequestBuilder(LIKES).build(); //BatchRequest reqThumb = new BatchRequestBuilder(THUMB).build(); List<BatchResponse> batchResponses = facebookClient.executeBatch(reqME,reqBOOK,reqINTEREST,reqMUSIC, reqLIKES); BatchResponse responseMe = batchResponses.get(0); BatchResponse responseBook = batchResponses.get(1); BatchResponse responseInterest = batchResponses.get(2); BatchResponse responseMusic = batchResponses.get(3); BatchResponse responseLikes = batchResponses.get(4); //BatchResponse responseThumb = batchResponses.get(5); JsonObject me = new JsonObject(responseMe.getBody()); // System.out.println("ME:"+me.toString(1)); // System.out.println("Book:"+responseBook.getBody()); // System.out.println("Interest:"+responseInterest.getBody()); // System.out.println("Music:"+responseMusic.getBody()); // System.out.println("Likes:"+responseLikes.getBody()); me.put("turnOns", convertToPluralField(responseLikes.getBody())); me.put("books", convertToPluralField(responseBook.getBody())); me.put("music", convertToPluralField(responseMusic.getBody())); me.put("interest", convertToPluralField(responseInterest.getBody())); //me.put("thumb", convertToPluralField(responseThumb.getBody())); return me.toString(1); } catch(Exception ex){ return genError(ex.getMessage(), "Request failure", 400); } } private JsonArray convertToPluralField(String data){ JsonObject jDataObj = new JsonObject(data); JsonArray jData = jDataObj.getJsonArray("data"); JsonArray pluralFields = new JsonArray(); for (int i=0; i<jData.length(); i++){ JsonObject like = jData.getJsonObject(i); JsonObject field = new JsonObject(); field.put("value", like.get("name")); field.put("type", like.get("category")); field.put("id", like.get("id")); pluralFields.put(field); } return pluralFields; } public String getUserFriends() { try{ JsonArray fullFriends = new JsonArray(); BatchRequest request = new BatchRequestBuilder(FRIENDS).build(); List<BatchResponse> batchResponses = facebookClient.executeBatch(request); BatchResponse response = batchResponses.get(0); JsonObject friends = new JsonObject(response.getBody()); fullFriends = friends.getJsonArray("data"); boolean goOn = friends.has("paging"); while (goOn){ if (friends.getJsonObject("paging").has("next")){ String url = friends.getJsonObject("paging").getString("next"); Response resp = facebookClient.getWebRequestor().executeGet(url); if (resp!=null){ friends = new JsonObject(resp.getBody()); if (friends.has("data")){ JsonArray moreFriends = new JsonArray(friends.getString("data")); for(int i=0; i<moreFriends.length();i++) fullFriends.put(moreFriends.getJsonObject(i)); } else goOn=false; } goOn = friends.has("paging"); } else goOn=false; } JsonObject jresp = new JsonObject(); jresp.put("data", fullFriends); return jresp.toString(1); }catch(Exception ex){ return genError(ex.getMessage(), "Unable to get Friends", 400); } //return getSocialData(FRIENDS); } public String getUserActivities() { BatchRequest request = null; BatchResponse response = null; // try{ // if (firstTime){ request = new BatchRequestBuilder(FEED).parameters(Parameter.with("limit", maxPostLimit)).build(); firstTime = false; } else request= new BatchRequestBuilder(FEED).parameters(Parameter.with("since", lastUpdate), Parameter.with("limit", maxPostLimit)).build(); try{ JsonArray fullActivities = new JsonArray(); List<BatchResponse> batchResponses = facebookClient.executeBatch(request); response = batchResponses.get(0); JsonObject activities = new JsonObject(response.getBody()); fullActivities = activities.getJsonArray("data"); boolean goOn = activities.has("paging"); while (goOn){ if (activities.getJsonObject("paging").has("next")){ String url = activities.getJsonObject("paging").getString("next"); Response resp = facebookClient.getWebRequestor().executeGet(url); if (resp!=null){ activities = new JsonObject(resp.getBody()); if (activities.has("data")){ JsonArray moreActivities = new JsonArray(activities.getString("data")); for(int i=0; i<moreActivities.length();i++) fullActivities.put(moreActivities.getJsonObject(i)); } else goOn=false; } goOn = activities.has("paging"); } else goOn=false; } JsonObject jresp = new JsonObject(); jresp.put("data", fullActivities); return jresp.toString(1); }catch(Exception ex){ return genError(ex.getMessage(), "Unable to get Activities", 400); } // List<BatchResponse> batchResponses = facebookClient.executeBatch(request); // response = batchResponses.get(0); // System.out.println("response:::"+response.toString()); // return response.getBody(); // } // catch(Exception ex){ // return genError(ex.getMessage(), "Request failure", 400); // } } public String getUserGroups() { return getSocialData(GROUPS); } public long getTokenExpiration() { return tokenExpiration; } public void setTokenExpiration(long expiration){ this.tokenExpiration = expiration; } public Map<String, String> getAllSocialData(){ BatchRequest meRequest = new BatchRequestBuilder(ME).build(); BatchRequest feedRequest = new BatchRequestBuilder(FEED).parameters(Parameter.with("from", "yesterday")).build(); BatchRequest groupRequest = new BatchRequestBuilder(GROUPS).build(); BatchRequest friendsRequest = new BatchRequestBuilder(FRIENDS).build(); List<BatchResponse> batchResponses = facebookClient.executeBatch(meRequest, feedRequest, groupRequest, friendsRequest); // Responses are ordered to match up with their corresponding requests. BatchResponse meResponse = batchResponses.get(0); BatchResponse feedResponse = batchResponses.get(1); BatchResponse groupResponse = batchResponses.get(2); BatchResponse friendsResponse = batchResponses.get(3); // Since batches can have heterogenous response types, it's up to you // to parse the JSON into Java objects yourself. Luckily RestFB has some built-in // support to help you with this. JsonMapper jsonMapper = new DefaultJsonMapper(); Map<String, String> results = new HashMap<String, String>(); results.put(ME, jsonMapper.toJavaObject(meResponse.getBody(), JsonObject.class).toString()); results.put(FEED, jsonMapper.toJavaObject(feedResponse.getBody(), JsonObject.class).toString()); results.put(GROUPS, jsonMapper.toJavaObject(groupResponse.getBody(), JsonObject.class).toString()); results.put(FRIENDS, jsonMapper.toJavaObject(friendsResponse.getBody(), JsonObject.class).toString()); return results; } @Override public void post(String value) { JsonObject complexValue = null; try{ complexValue = new JsonObject(value); }catch (Exception e) { } if (complexValue != null){ if (complexValue.has("event")){ // Date tomorrow = DateFormat.parse(complexValue.getInt("from") + 1000L * 60L * 60L * 24L); // Date twoDaysFromNow = DateFormat.parse(complexValue.getInt("to") + 1000L * 60L * 60L * 48L); // JsonObject jEvt = complexValue.getJsonObject("event"); FacebookType publishEventResponse = facebookClient.publish( EVENTS, FacebookType.class, Parameter.with("name",jEvt.getString("name")), Parameter.with("start_time", jEvt.getString("from")), Parameter.with("end_time", jEvt.getString("to")), Parameter.with("location", jEvt.getString("location")), Parameter.with("description", jEvt.getString("description")) ); } else if (complexValue.has("checkin")){ Map<String, String> coordinates = new HashMap<String, String>(); JsonObject jCK = complexValue.getJsonObject("checkin"); coordinates.put("latitude", jCK.getString("lat")); coordinates.put("longitude", jCK.getString("lon")); FacebookType publishCheckinResponse = facebookClient.publish(CHECKINS, FacebookType.class, Parameter.with("message", jCK.getString("message")), Parameter.with("coordinates", coordinates), Parameter.with("place", jCK.getString("place"))); System.out.println("Published checkin ID: " + publishCheckinResponse.getId()); } } else{ System.out.println(" Just a post! ==> "+value ); FacebookType publishMessageResponse = facebookClient.publish(FEED, FacebookType.class, Parameter.with("message", value)); } } }