package org.societies.platform.socialdata.converters; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.shindig.social.core.model.AccountImpl; import org.apache.shindig.social.core.model.AddressImpl; import org.apache.shindig.social.core.model.ListFieldImpl; import org.apache.shindig.social.core.model.NameImpl; import org.apache.shindig.social.core.model.PersonImpl; import org.apache.shindig.social.opensocial.model.Account; import org.apache.shindig.social.opensocial.model.Address; import org.apache.shindig.social.opensocial.model.ListField; import org.apache.shindig.social.opensocial.model.Name; import org.apache.shindig.social.opensocial.model.Person; import org.apache.shindig.social.opensocial.model.Person.Gender; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class PersonConverterFromFacebook implements PersonConverter{ public static String WORKS = "works"; public static String ACCOUNTS = "accounts"; public static String USERNAME = "username"; public static String LOCATION = "location"; public static String RELIGION = "religion"; public static String RELATIONSHIP = "relationship_status"; public static String SPORTS = "sports"; public static String SPORT_NAME = "name"; public static String ID = "id"; public static String NAME = "name"; public static String FIRSTNAME = "first_name"; public static String LASTNAME = "last_name"; public static String GENDER = "gender"; public static String UCT = "updated_time"; public static String BIO = "headline"; public static String BIRTHDAY = "birthday"; public static String EMAIL = "email"; public static String PROFILELINK = "link"; public static String PHOTOS = "photos"; public static String TURNONS = "turnOns"; public static String INTERESTS = "interests"; public static String MUSIC = "music"; public static String BOOKS = "books"; public static String PICTURE = "picture"; // portable contact ids public static String GIVENAME = "givenName"; public static String FAMILYNAME = "familyName"; private JSONObject db; private String rawData; private Person person; public Person load(String data){ person = new PersonImpl(); this.rawData = data; try{ db = new JSONObject(this.rawData); person.setId("facebook:"+db.getString(ID)); //if(db.has(UCT)) person.setUtcOffset(db.getLong(UCT)); if (db.has(BIO)) person.setAboutMe(db.getString(BIO)); if (db.has(SPORTS)) person.setSports(setSports(db.getString(SPORTS))); if (db.has(RELATIONSHIP)) person.setRelationshipStatus(db.getString(RELATIONSHIP)); if (db.has(RELIGION)) person.setReligion(db.getString(RELIGION)); if (db.has(LOCATION)) person.setCurrentLocation(setLocation(db.getString(LOCATION))); if (db.has(ACCOUNTS)) person.setAccounts(setAccounts(db.getString(ACCOUNTS))); if (db.has(WORKS)) person.setActivities(setActivities(WORKS)); if (db.has(PROFILELINK)) person.setProfileUrl(db.getString(PROFILELINK)); if (db.has(BIRTHDAY)) person.setBirthday(getBirthDay(db.getString(BIRTHDAY))); if (db.has(GENDER)) person.setGender(gender(db.getString(GENDER))); if (db.has(EMAIL)) person.setEmails(getMails(db.getString(EMAIL))); if (db.has(PHOTOS)) person.setPhotos(getPhotos(db.getString(PHOTOS))); if (db.has(TURNONS)) person.setTurnOns(jarrayToList(db.getString(TURNONS))); if (db.has(MUSIC)) person.setMusic(jarrayToList(db.getString(MUSIC))); if (db.has(INTERESTS)) person.setInterests(jarrayToList(db.getString(INTERESTS))); if (db.has(BOOKS)) person.setBooks(jarrayToList(db.getString(BOOKS))); if (db.has(PICTURE)) { try{ person.setThumbnailUrl(db.getJSONObject(PICTURE).getJSONObject("data").getString("url")); }catch(Exception ex){} } setName(); setAccount(); } catch (JSONException e) { e.printStackTrace(); } person.setActivities(genActivities()); return person; } private void setName(){ Name name = new NameImpl(); try { String formattedName= ""; if (db.has("first_name")){ name.setGivenName(db.getString("first_name")); formattedName=db.getString("first_name"); } if (db.has("last_name")){ name.setFamilyName(db.getString("last_name")); if (formattedName.length()>0) formattedName+=" "; formattedName+= db.getString("last_name"); } name.setFormatted(formattedName); person.setDisplayName(formattedName); } catch (JSONException e) { e.printStackTrace(); } person.setName(name); } private void setAccount(){ Account account = new AccountImpl(); try{ account.setDomain("facebook.com"); String name = ""; if(db.has(FIRSTNAME)) name = name + db.getString(FIRSTNAME); if(db.has(LASTNAME)) name = name + " "+db.getString(LASTNAME); if (db.has(USERNAME)) account.setUsername(db.getString(USERNAME)); else account.setUsername(name); account.setUserId(db.getString(ID)); } catch (JSONException e) { e.printStackTrace(); } //Add the Facebook account List<Account> accounts = new ArrayList<Account>(); accounts.add(account); person.setAccounts(accounts); } private List<String> jarrayToList(String data) { List<String> list = new ArrayList<String>(); try { JSONArray jdata = new JSONArray(data); for(int i=0; i<jdata.length();i++){ list.add(jdata.getString(i)); } } catch (JSONException e) { } return list; } private List<ListField> getPhotos(String data) { List<ListField> photos = new ArrayList<ListField>(); try { JSONArray json_photos = new JSONArray(data); for(int i=0; i<json_photos.length();i++){ JSONObject p = (JSONObject) json_photos.get(i); ListField photo = new ListFieldImpl(); photo.setPrimary(p.getBoolean("primary")); photo.setType(p.getString("type")); photo.setValue(p.getString("value")); photos.add(photo); } } catch (JSONException e) { e.printStackTrace(); } return photos; } private Date getBirthDay(String date) { DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); try { return df.parse(date); } catch (ParseException e) { } return null; } private List<String> setActivities(String data) { List<String> works = new ArrayList<String>(); try { JSONArray json_works = new JSONArray(data); for(int i=0; i<json_works.length();i++){ JSONObject work = (JSONObject) json_works.get(i); works.add(work.getString("description")); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return works; } private List<String> genActivities() { List<String> activities = new ArrayList<String>(); // try{ // // // } // catch (JSONException e) { // e.printStackTrace(); // } return activities; } private List<Account> setAccounts(String data){ List<Account> accounts = new ArrayList<Account>(); // not usefull! return accounts; } private Address setLocation(String data) { Address address = new AddressImpl(); try{ JSONObject loc = new JSONObject(data); address.setFormatted(loc.getString("name")); } catch(Exception ex){} return address; } private List<String> setSports(String data) { JSONArray sports = null; List<String> sportList = null; try { sports = new JSONArray(data); sportList= new ArrayList<String>(); for(int i=0; i< sports.length(); i++){ JSONObject sport = sports.getJSONObject(i); sportList.add(sport.getString(SPORT_NAME)); } } catch (JSONException e) { e.printStackTrace(); } return sportList; } private List<ListField> getMails(String mail){ List<ListField> emails = new ArrayList<ListField>(); ListField email = new ListFieldImpl(); email.setPrimary(true); email.setType("home"); email.setValue(mail); emails.add(email); return emails; } private Name genName(){ Name name = null; if (getString(NAME)!=null) { name = new NameImpl(getString(NAME)); person.setDisplayName(getString(NAME)); name.setFormatted(getString(NAME)); } if (name==null) name = new NameImpl(); if (getString(FIRSTNAME)!=null) name.setGivenName(getString(FIRSTNAME)); if (getString(LASTNAME) !=null) name.setFamilyName(getString(LASTNAME)); return name; } private Gender gender(String g){ if ("male".equals(g)) return Gender.male; else return Gender.female; } private String getString(String key){ try { if (db.has(key)){ return db.getString(key); } } catch (JSONException e) { e.printStackTrace(); } return ""; } }