package org.societies.platform.socialdata.converters; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.shindig.protocol.model.ExtendableBean; import org.apache.shindig.protocol.model.ExtendableBeanImpl; import org.apache.shindig.social.core.model.ActivityEntryImpl; import org.apache.shindig.social.core.model.ActivityObjectImpl; import org.apache.shindig.social.core.model.MediaLinkImpl; import org.apache.shindig.social.opensocial.model.ActivityEntry; import org.apache.shindig.social.opensocial.model.ActivityObject; import org.apache.shindig.social.opensocial.model.MediaLink; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.internal.sns.ISocialData; import org.societies.platform.socialdata.model.ActionLink; public class ActivityConverterFromFacebook implements ActivityConverter { private Logger logger = LoggerFactory.getLogger(ActivityConverterFromFacebook.class); class fb_user{ public String name; public String type; public fb_user(String name, String type){ this.name= name; this.type= type; } } /* COSTANTS */ public static final String DATA = "data"; public static final String ID = "id"; // // verb // public static final String POST = "post"; // public static final String TAG = "tag"; // public static final String UPDATE = "update"; // public static final String LIKE = "like"; // public static final String SHARE = "share"; // public static final String MAKE_FRIEND = "make-friend"; // public static final String ATTEND = "attend"; // // //Object type??? // // public static final String NOTE = "note"; // public static final String IMAGE = "image"; // public static final String PERSON = "person"; // public static final String BOOKMARK = "bookmark"; // public static final String COMMENT = "comment"; // public static final String EVENT = "event"; // public static final String QUESTION = "question"; // public static final String COLLECTION = "collection"; // public static final String PLACE = "places"; private static final String STORY = "story"; private static final String CAPTION = "caption"; private static final String AUTHOR_NAME = "name"; private static final String MESSAGE = "message"; private static final String FROM = "from"; private static final String ICON = "icon"; private static final String TYPE = "type"; private static final String UPDATED_TIME = "updated_time"; private static final String CREATED_TIME = "created_time"; private static final String LINK = "link"; private static final String APPLICATION = "application"; private static final String ACTIONLINKS = "actionLinks"; String imageUrl = "https://graph.facebook.com/FBID/picture?type=normal&access_token="; String previewUrl = "https://graph.facebook.com/OBJECTID/picture?type=normal&access_token="; ArrayList<ActivityEntry> activities = new ArrayList<ActivityEntry>(); @Override public List<ActivityEntry> load(String data) { activities = new ArrayList<ActivityEntry>(); JSONArray elements; ActivityObject providerObj = new ActivityObjectImpl(); providerObj.setUrl("www.facebook.com"); providerObj.setId("facebook.com"); providerObj.setDisplayName("Facebook"); try { JSONObject jsonData = new JSONObject(data); elements = new JSONArray(jsonData.getString(DATA)); //System.out.println("element to be analyzed:"+elements.length()); for (int i=0; i<elements.length(); i++){ JSONObject elm = elements.getJSONObject(i); ActivityEntry entry = new ActivityEntryImpl(); entry.setId("facebook:"+elm.getString(ID)); entry.setActor(setActor(elm.getString(FROM))); entry.setProvider(providerObj); // FIX with facebook entry.setVerb(ISocialData.POST); entry.setUpdated(elm.getString(UPDATED_TIME)); entry.setPublished(elm.getString(CREATED_TIME)); ArrayList<ActionLink> actionLinks = new ArrayList<ActionLink>(); ExtendableBean actionlinksEB= new ExtendableBeanImpl(); actionlinksEB.put(ACTIONLINKS, actionLinks); entry.setOpenSocial(actionlinksEB); if (elm.has(APPLICATION)) entry.setProvider(setProvider(elm.getString(APPLICATION))); if (elm.has(ICON)) entry.setIcon(getIcon(elm)); if (elm.has(MESSAGE)){ entry.setContent(elm.getString(MESSAGE)); ActivityObject aObj = new ActivityObjectImpl(); aObj.setObjectType(genType(elm.getString(TYPE))); if (elm.has(LINK)) aObj.setUrl(elm.getString(LINK)); entry.setObject(aObj); } else if (elm.has(STORY)){ entry.setContent(elm.getString(STORY)); fixEntry(entry, elm); //System.out.println("---- Actor:"+entry.getActor().getDisplayName()+ " - Type:"+elm.getString(TYPE)+ " Story: " + entry.getContent()); } else if (elm.has(CAPTION)){ entry.setContent(elm.getString(CAPTION)); ActivityObject aObj = new ActivityObjectImpl(); aObj.setObjectType(genType(elm.getString(TYPE))); if (elm.has(LINK)) aObj.setUrl(elm.getString(LINK)); entry.setObject(aObj); } //else entry.setContent("???"); //System.out.println("ADD id:"+entry.getId() + " from:"+entry.getActor().getDisplayName() + " verb:"+entry.getVerb() + " content:"+entry.getContent()); activities.add(entry); } } catch (JSONException e) { e.printStackTrace(); } return activities; } private void fixEntry(ActivityEntry entry, JSONObject elm) throws JSONException{ String story = entry.getContent(); // VERB Tagged - Object - Actor - Author Myself Pattern p1 = Pattern.compile(".* was tagged in .* (photo|album)(?:\\s(.*))?."); Matcher m1 = p1.matcher(story); if (m1.find()){ entry.setVerb(ISocialData.TAG); entry.setObject(entry.getActor()); ActivityObject aObj = new ActivityObjectImpl(); entry.setTarget(aObj); if (elm.has(LINK)) aObj.setUrl(elm.getString(LINK)); if (m1.group(2)!=null){ aObj.setObjectType(ISocialData.COLLECTION); aObj.setDisplayName(m1.group(2)); } else{ aObj.setObjectType(genType(elm.getString(TYPE))); } return; } // VERB Pattern p2 = Pattern.compile("\"(.*)\" on .* (\\S+)."); Matcher m2 = p2.matcher(story); if (m2.find()){ entry.setVerb(ISocialData.POST); entry.setContent(m2.group(1)); ActivityObject object = new ActivityObjectImpl(); object.setObjectType(ISocialData.COMMENT); entry.setObject(object); ActivityObject target = new ActivityObjectImpl(); target.setObjectType(genType(m2.group(2))); entry.setTarget(target); return; } // VERB FRIENDS Pattern p3 = Pattern.compile(".* (is|are) now friends.*."); Matcher m3 = p3.matcher(story); if (m3.find()){ String story_tags = elm.getString("story_tags"); JSONObject jstags = new JSONObject(story_tags); List<fb_user> users = new ArrayList<fb_user>(); Iterator<String> keys = jstags.keys(); while(keys.hasNext()){ JSONArray jUserArray = jstags.getJSONArray(keys.next()); for (int i=0; i < jUserArray.length();i++){ JSONObject jUser = jUserArray.getJSONObject(i); if (!entry.getActor().getDisplayName().equalsIgnoreCase(jUser.getString("name"))) users.add(new fb_user(jUser.getString("name"), jUser.getString("type"))); } } entry.setVerb(ISocialData.MAKE_FRIEND); fb_user user = users.get(0); ActivityObject object = new ActivityObjectImpl(); object.setDisplayName(user.name); object.setObjectType(genType(user.type)); entry.setObject(object); if (users.size()>1){ for(int i=1; i<users.size(); i++){ fb_user user1 = users.get(i); ActivityEntry activity = new ActivityEntryImpl(); activity.setActor(entry.getActor()); activity.setVerb(ISocialData.MAKE_FRIEND); activity.setContent(entry.getContent()); ActivityObject object1 = new ActivityObjectImpl(); object.setDisplayName(user1.name); object.setObjectType(genType(user1.type)); activity.setObject(object1); activity.setPublished(entry.getPublished()); activities.add(activity); } } return; } Pattern p4 = Pattern.compile(".* likes .*."); Matcher m4 = p4.matcher(story); if (m4.find()){ List<fb_user> users = new ArrayList<fb_user>(); String story_tags = elm.getString("story_tags"); logger.debug("Add story tag:"+story_tags); JSONObject jstags = new JSONObject(story_tags); Iterator<String> keys = jstags.keys(); while(keys.hasNext()){ //this is the new line you have to find JSONArray jUserArray = jstags.getJSONArray(keys.next()); for (int i=0; i < jUserArray.length();i++){ JSONObject jUser = jUserArray.getJSONObject(i); if (!entry.getActor().getDisplayName().equalsIgnoreCase(jUser.getString("name"))){ String type = ""; if (jUser.has("type")) type= jUser.getString("type"); users.add(new fb_user(jUser.getString("name"), type)); } } } entry.setVerb(ISocialData.LIKE); if (users.size()>0){ fb_user user = users.get(0); ActivityObject object = new ActivityObjectImpl(); object.setDisplayName(user.name); object.setObjectType(genType(user.type)); entry.setObject(object); logger.info("Add User:"+ user.name + " type:"+user.type); if (users.size()>1){ for(int i=1; i<users.size(); i++){ fb_user user1 = users.get(i); ActivityEntry activity = new ActivityEntryImpl(); activity.setActor(entry.getActor()); activity.setVerb(ISocialData.LIKE); activity.setContent(entry.getContent()); ActivityObject object1 = new ActivityObjectImpl(); object1.setDisplayName(user1.name); object1.setObjectType(genType(user1.type)); activity.setObject(object1); activity.setPublished(entry.getPublished()); activities.add(activity); } } }else logger.info("NO User:"); return; } Pattern p5 = Pattern.compile(".* (?:changed|updated) .* (?:picture|photo)."); Matcher m5 = p5.matcher(story); if (m5.find()){ entry.setVerb(ISocialData.UPDATE); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(ISocialData.PERSON); obj.setDisplayName(entry.getActor().getDisplayName()); entry.setObject(obj); return; } Pattern p6 = Pattern.compile(".* added (\\d+) new photo.* album (.*)."); Matcher m6 = p6.matcher(story); if (m6.find()){ entry.setVerb(ISocialData.POST); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(genType(elm.getString(TYPE))); entry.setObject(obj); ActivityObject target = new ActivityObjectImpl(); target.setObjectType(ISocialData.COLLECTION); target.setDisplayName(m6.group(2)); entry.setTarget(target); for (int i=1; i< Integer.parseInt(m6.group(1)); i++){ ActivityEntry activity = new ActivityEntryImpl(); activity.setActor(entry.getActor()); activity.setVerb(entry.getVerb()); activity.setTarget(entry.getTarget()); activity.setObject(entry.getObject()); activity.setPublished(entry.getPublished()); activity.setContent(entry.getContent()); activities.add(activity); } return; } Pattern p7 = Pattern.compile(".* went to (.*) at (.*)."); Matcher m7 = p7.matcher(story); if (m7.find()){ entry.setVerb(ISocialData.ATTEND); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(ISocialData.EVENT); obj.setDisplayName(m7.group(1)); entry.setObject(obj); ActivityObject target = new ActivityObjectImpl(); target.setObjectType(ISocialData.PLACE); target.setDisplayName(m7.group(2)); entry.setTarget(target); return; } Pattern p8 = Pattern.compile(".* shared a link."); Matcher m8 = p8.matcher(story); if (m8.find()){ entry.setVerb(ISocialData.SHARE); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(ISocialData.BOOKMARK); obj.setDisplayName(elm.getString("name")); if (elm.has(LINK)) obj.setUrl(elm.getString(LINK)); entry.setObject(obj); return; } Pattern p10 = Pattern.compile(".* asked: (.*)."); Matcher m10 = p10.matcher(story); if (m10.find()){ entry.setVerb(ISocialData.POST); entry.setContent(m10.group(1)); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(ISocialData.QUESTION); entry.setObject(obj); return; } Pattern p11 = Pattern.compile(".* answered (.*) with (.*)."); Matcher m11 = p11.matcher(story); if (m11.find()){ entry.setVerb(ISocialData.POST); entry.setContent(m11.group(2)); ActivityObject obj = new ActivityObjectImpl(); obj.setObjectType(ISocialData.NOTE); entry.setObject(obj); ActivityObject target = new ActivityObjectImpl(); target.setObjectType(ISocialData.QUESTION); target.setDisplayName(m11.group(1)); entry.setTarget(target); return; } } private String genType(String string) { if ("photo".equalsIgnoreCase(string)) return ISocialData.IMAGE; else if ("link".equalsIgnoreCase(string)) return ISocialData.BOOKMARK; else if ("status".equalsIgnoreCase(string)) return ISocialData.NOTE; else if ("wall".equalsIgnoreCase(string)) return ISocialData.COLLECTION; else if ("timeline".equalsIgnoreCase(string)) return ISocialData.COLLECTION; else if ("user".equalsIgnoreCase(string)) return ISocialData.PERSON; else if ("page".equalsIgnoreCase(string)) return ISocialData.BOOKMARK; else return string.toLowerCase(); } private ActivityObject setProvider(String string) { ActivityObject provider = new ActivityObjectImpl(); JSONObject elm = null; try { elm = new JSONObject(string); provider.setId(elm.getString(ID)); provider.setDisplayName(elm.getString(AUTHOR_NAME)); } catch (JSONException e) { e.printStackTrace(); } return provider; } private MediaLink getIcon(JSONObject elm) { MediaLink icon = new MediaLinkImpl(); try { icon.setUrl(elm.getString(ICON)); } catch (JSONException e) { e.printStackTrace(); } return icon; } private ActivityObject setActor(String data) { ActivityObject actor = new ActivityObjectImpl(); JSONObject elm = null; try { elm = new JSONObject(data); actor.setId(elm.getString(ID)); actor.setDisplayName(elm.getString(AUTHOR_NAME)); actor.setUrl(imageUrl.replaceAll("FBID", actor.getId())); actor.setObjectType(ISocialData.PERSON); } catch (JSONException e) { e.printStackTrace(); } return actor; } }