package kr.ac.kaist.resl.lilliput.adaptor; import java.io.IOException; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.configuration.BaseConfiguration; import org.apache.commons.configuration.Configuration; import org.json.JSONArray; import org.json.JSONObject; import kr.ac.kaist.resl.lilliput.utility.TitanHelper; import com.restfb.Connection; import com.restfb.DefaultFacebookClient; import com.restfb.FacebookClient; import com.restfb.types.Account; import com.restfb.types.Location; import com.restfb.types.NamedFacebookType; import com.restfb.types.Page; import com.restfb.types.User; import com.restfb.types.User.Education; import com.restfb.types.User.Sport; import com.restfb.types.User.Work; import com.thinkaurelius.titan.core.TitanFactory; import com.thinkaurelius.titan.core.TitanGraph; import com.tinkerpop.blueprints.Vertex; /** * Servlet implementation class FacebookAdaptor */ public class FacebookAdaptor extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public FacebookAdaptor() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = (String)request.getParameter("name"); String accessToken = (String)request.getParameter("accessToken"); Configuration conf = new BaseConfiguration(); conf.setProperty("storage.backend", "cassandra"); conf.setProperty("storage.hostname", "127.0.0.1"); TitanGraph g = TitanFactory.open(conf); Update(g, accessToken, name); g.shutdown(); } private void Update(TitanGraph g, String accessToken, String name) { // Facebook Client FacebookClient facebookClient = new DefaultFacebookClient(accessToken); //fetch user System.out.println(" [FacebookAdaptor] Fetching user : " + name ); User user = facebookClient.fetchObject("me", User.class); Vertex human = createVertex(g, "Human", user); System.out.println(" [FacebookAdaptor] Fetching user : Completed" ); System.out.println(" [FacebookAdaptor] Fetching friends" ); Connection<User> myFriendConnections = facebookClient.fetchConnection("me/friends", User.class); List<User> myFriends = myFriendConnections.getData(); for(int i = 0 ; i < myFriends.size() ; i ++ ) { System.out.println(" [FacebookAdaptor] Fetching friends #:" + i); User myFriend = myFriends.get(i); Vertex friend = createVertex(g, "Human", myFriend); g.addEdge(null, human, friend, "hasFriend"); g.addEdge(null, friend, human, "hasFriend"); g.commit(); } System.out.println(" [FacebookAdaptor] Fetching friends : Completed " ); System.out.println(" [FacebookAdaptor] Fetching object " ); //fetch Pages Connection<Account> myPageConnections = facebookClient.fetchConnection("me/accounts", Account.class); List<Account> myPages = myPageConnections.getData(); for(int i = 0 ; i < myPages.size() ; i ++ ) { Account tempAcc = myPages.get(i); if( tempAcc.getCategory().equals("Application")) continue; String PageaccessToken = tempAcc.getAccessToken(); String id = tempAcc.getId(); //making facebookClient FacebookClient pageClient = new DefaultFacebookClient(PageaccessToken); //getting Place page Page page = pageClient.fetchObject(id, Page.class); Vertex pageVertex = createVertex(g, "", page); g.addEdge(null, human, pageVertex, "hasOwnership"); g.addEdge(null, pageVertex, human, "isOwnedBy"); } System.out.println(" [FacebookAdaptor] Fetching Object : Completed " ); System.out.println(" [FacebookAdaptor] Completed " ); return; } public Vertex createVertex(TitanGraph g, String lType, Page page) { Vertex pageVertex = TitanHelper.getVertex(g, "fid", page.getId()); if( pageVertex == null ) { System.out.println(" [FacebookAdaptor] Create Vertex [ Object/Place ] "); pageVertex = g.addVertex(null); } else { System.out.println(" [FacebookAdaptor] Update Existing Vertex [ Object/Place ] "); } // Tricky Point : about contains EPC if( page.getAbout() != null ) pageVertex.setProperty("epc", page.getAbout()); if( page.getAccessToken() != null ) pageVertex.setProperty("fAccessToken", page.getAccessToken()); if( page.getCategory() != null ) pageVertex.setProperty("category", page.getCategory()); if( page.getCover() != null ) if( page.getCover().getSource() != null ) pageVertex.setProperty("coverPhoto", page.getCover().getSource()); if( page.getDescription() != null ) pageVertex.setProperty("description", page.getDescription()); if( page.getGeneralInfo() != null) pageVertex.setProperty("generalInfo", page.getGeneralInfo()); if( page.getId() != null ) pageVertex.setProperty("fid", page.getId()); if( page.getLikes() != null ) pageVertex.setProperty("nLikes", page.getLikes()); if( page.getLink() != null ) pageVertex.setProperty("fLink", page.getLink()); if( page.getLocation() != null ) { Location loc = page.getLocation(); if( loc.getLatitude() != null ) pageVertex.setProperty("latitude", loc.getLatitude()); if( loc.getLongitude() != null ) pageVertex.setProperty("longitude", loc.getLongitude()); } if( page.getName() != null ) pageVertex.setProperty("name", page.getName()); if( page.getMission() != null ) pageVertex.setProperty("mission", page.getMission()); if( page.getPicture() != null ) pageVertex.setProperty("picture", page.getPicture()); if( page.getProducts() != null ) pageVertex.setProperty("product", page.getProducts()); if( page.getType() != null ) pageVertex.setProperty("fType", page.getType()); if( page.getUsername() != null ) pageVertex.setProperty("fUsername", page.getUsername()); // Make lType // EPC Specific String epc = page.getAbout(); if( epc !=null) { String[] flags = epc.split(":"); if( flags.length >= 4 ) { if( flags[3].equals("sgtin")) //object { pageVertex.setProperty("lType", "Object"); } else if( flags[3].equals("sgln")) //place { pageVertex.setProperty("lType", "Place"); } } } g.commit(); return pageVertex; } public Vertex createVertex(TitanGraph g, String lType, User user) { // Check whether exist Vertex human = TitanHelper.getVertex(g, "email", user.getEmail()); if( human == null ) { human = TitanHelper.getVertex(g, "fid", user.getId()); if( human == null ) { System.out.println(" [FacebookAdaptor] Create Vertex [ Human ] "); human = g.addVertex(null); } else { System.out.println(" [FacebookAdaptor] Use Existing Vertex made by others [ Human ] "); } } else { System.out.println(" [FacebookAdaptor] Update Existing Vertex [ Human ] "); } // To make relationship g.commit(); System.out.println(" [FacebookAdaptor] Fetching user : 0%" ); // Update User profile human.setProperty("lType", "Human"); if( user.getAbout() != null ) human.setProperty("about", user.getAbout()); if( user.getBio() != null ) human.setProperty("bio", user.getBio()); if( user.getBirthday() != null ) human.setProperty("birthday", user.getBirthday()); if( user.getEducation() != null ) { List<Education> edus = user.getEducation(); for( int i = 0 ; i < edus.size() ; i++ ) { Education edu = edus.get(i); Vertex eduVertex = null; if(edu.getSchool() != null ) { eduVertex = createVertex(g, "Artifact.Facebook.Education", edu.getSchool()); } if( eduVertex == null ) continue; if( edu.getType() != null ) eduVertex.setProperty("fType", edu.getType()); if( edu.getYear() != null ) eduVertex.setProperty("year", edu.getYear().getName()); g.addEdge(null, human, eduVertex, "haveEducation"); g.addEdge(null, eduVertex, human, "isEducatedFrom"); g.commit(); } } System.out.println(" [FacebookAdaptor] Fetching user : 15%" ); if( user.getEmail() != null ) human.setProperty("email", user.getEmail()); if( user.getFavoriteAthletes() != null ) { List<NamedFacebookType> athletes = user.getFavoriteAthletes(); for( int i = 0 ; i < athletes.size() ; i++ ) { NamedFacebookType athlete = athletes.get(i); Vertex athVertex = createVertex(g, "Human", athlete); g.addEdge(null, human, athVertex, "like"); g.addEdge(null, athVertex, human, "isLiked"); g.commit(); } //JSONArray jArr = getJSONArrayFromListFacebookType(user.getFavoriteAthletes()); //human.setProperty("favoriteAthletes", jArr.toString()); } System.out.println(" [FacebookAdaptor] Fetching user : 30%" ); if( user.getFavoriteTeams() != null ) { List<NamedFacebookType> teams = user.getFavoriteTeams(); for( int i = 0 ; i < teams.size() ; i++ ) { NamedFacebookType team = teams.get(i); Vertex teamVertex = createVertex(g, "Artifact.Facebook.Team", team); g.addEdge(null, human, teamVertex, "like"); g.addEdge(null, teamVertex, human, "isLiked"); g.commit(); } //JSONArray jArr = getJSONArrayFromListFacebookType(user.getFavoriteTeams()); //human.setProperty("favoriteTeams", jArr.toString()); } if( user.getFirstName() != null ) human.setProperty("firstName", user.getFirstName()); if( user.getGender() != null ) human.setProperty("gender", user.getGender()); if( user.getHometown() != null ) { NamedFacebookType hometown = user.getHometown(); Vertex homeVertex = createVertex(g, "Artifact.Facebook.Hometown", hometown); g.addEdge(null, human, homeVertex, "liveIn"); g.addEdge(null, homeVertex, human, "isLivedIn"); g.commit(); //JSONObject jObj = getJSONObjectFromFacebookType(user.getHometown()); //human.setProperty("hometown", jObj.toString()); } System.out.println(" [FacebookAdaptor] Fetching user : 50%" ); if( user.getHometownName() != null ) human.setProperty("hometownName", user.getHometownName()); if( user.getId() != null ) human.setProperty("fid", user.getId()); if( user.getLanguages() != null ) { List<NamedFacebookType> languages = user.getLanguages(); for( int i = 0 ; i < languages.size() ; i++ ) { NamedFacebookType language = languages.get(i); Vertex languageVertex = createVertex(g, "Artifact.Facebook.Language", language); g.addEdge(null, human, languageVertex, "haveLanguage"); g.addEdge(null, languageVertex, human, "isSpeakedBy"); g.commit(); } //JSONArray jArr = getJSONArrayFromListFacebookType(user.getLanguages()); //human.setProperty("language", jArr.toString()); } if( user.getLastName() != null ) human.setProperty("lastName", user.getLastName()); if( user.getLink() != null ) human.setProperty("fLink", user.getLink()); if( user.getLocale() != null ) human.setProperty("locale", user.getLocale()); if( user.getLocation() != null ) { NamedFacebookType location = user.getLocation(); Vertex locVertex = createVertex(g, "Artifact.Facebook.Location", location); g.addEdge(null, human, locVertex, "isLocatedIn"); g.addEdge(null, locVertex, human, "isContaining"); g.commit(); //JSONObject jObj = getJSONObjectFromFacebookType(user.getLocation()); //human.setProperty("location", jObj); } if( user.getMiddleName() != null ) human.setProperty("middleName", user.getMiddleName()); if( user.getName() != null ) human.setProperty("name", user.getName()); if( user.getPolitical() != null ) human.setProperty("political", user.getPolitical()); if( user.getQuotes() != null ) human.setProperty("quotes", user.getQuotes()); if( user.getRelationshipStatus() != null ) human.setProperty("relationshipStatus", user.getRelationshipStatus()); if( user.getReligion() != null) human.setProperty("religion", user.getReligion()); if( user.getSignificantOther() != null ) { NamedFacebookType significantOther = user.getSignificantOther(); Vertex sigVertex = createVertex(g, "Human", significantOther); g.addEdge(null, human, sigVertex, "isLoving"); g.addEdge(null, sigVertex, human, "isLoving"); g.commit(); //JSONObject jObj = getJSONObjectFromFacebookType(user.getSignificantOther()); //human.setProperty("significantOther", jObj.toString()); } if( user.getSports() != null ) { List<Sport> sports = user.getSports(); for( int i = 0 ; i < sports.size() ; i++ ) { Sport sport = sports.get(i); Vertex sportVertex = createVertex(g, "Artifact.Facebook.Sport", sport); g.addEdge(null, human, sportVertex, "like"); g.addEdge(null, sportVertex, human, "isLikedBy"); g.commit(); } } System.out.println(" [FacebookAdaptor] Fetching user : 70%" ); if( user.getTimezone() != null ) human.setProperty("timezone", user.getTimezone()); if( user.getUsername() != null ) human.setProperty("fUsername", user.getUsername()); if( user.getWebsite() != null ) human.setProperty("website", user.getWebsite()); if( user.getWork() != null ) { List<Work> works = user.getWork(); JSONArray jArr= new JSONArray(); for( int i = 0 ; i < works.size() ; i++ ) { Work work = works.get(i); JSONObject jObj = new JSONObject(); if( work.getDescription() != null ) jObj.put("description", work.getDescription()); if( work.getEmployer() != null ) { JSONObject jObj2 = getJSONObjectFromFacebookType(work.getEmployer()); jObj.put("employer", jObj2.toString()); } if( work.getEndDate() != null ) jObj.put("endDate", work.getEndDate().toString()); if( work.getLocation() != null ) { JSONObject jObj2 = getJSONObjectFromFacebookType(work.getLocation()); jObj.put("location", jObj2.toString()); } if( work.getPosition() != null ) { JSONObject jObj2 = getJSONObjectFromFacebookType(work.getPosition()); jObj.put("position", jObj2.toString()); } if( work.getStartDate() != null ) jObj.put("startDate", work.getStartDate().toString()); if( work.getWith() != null ) { JSONArray jArr2 = getJSONArrayFromListFacebookType(work.getWith()); jObj.put("with", jArr2.toString()); } jArr.put(jObj); } human.setProperty("work", jArr.toString()); } Date date = new Date(); human.setProperty("updateTime", new Timestamp(date.getTime())); g.commit(); return human; } public Vertex createVertex(TitanGraph g, String lType, Sport sportElement) { Vertex v = TitanHelper.getVertex(g, "fid", sportElement.getId()); if( v == null ) { System.out.println(" [FacebookAdaptor] Create Vertex [" + lType + "] "); v = g.addVertex(null); } else { System.out.println(" [FacebookAdaptor] Update Existing Vertex [" + lType + "] "); } v.setProperty("lType", lType); if( sportElement.getId() != null ) v.setProperty("fid", sportElement.getId()); if( sportElement.getName() != null ) v.setProperty("name", sportElement.getName()); if( sportElement.getType() != null ) v.setProperty("type", sportElement.getType()); g.commit(); System.out.println(" [FacebookAdaptor] Vertex Created [" + lType + "] "); return v; } public Vertex createVertex(TitanGraph g, String lType, NamedFacebookType facebookElement) { Vertex v = TitanHelper.getVertex(g, "fid", facebookElement.getId()); if( v == null ) { System.out.println(" [FacebookAdaptor] Create Vertex [" + lType + "] "); v = g.addVertex(null); } else { System.out.println(" [FacebookAdaptor] Update Existing Vertex [" + lType + "] "); } v.setProperty("lType", lType); if( facebookElement.getId() != null ) v.setProperty("fid", facebookElement.getId()); if( facebookElement.getName() != null ) v.setProperty("name", facebookElement.getName()); if( facebookElement.getType() != null ) v.setProperty("fType", facebookElement.getType()); g.commit(); System.out.println(" [FacebookAdaptor] Vertex Created [" + lType + "] "); return v; } public JSONObject getJSONObjectFromFacebookType(NamedFacebookType facebookElement ) { JSONObject jObj = new JSONObject(); if( facebookElement.getId() != null ) jObj.put("fid", facebookElement.getId()); if( facebookElement.getName() != null ) jObj.put("name", facebookElement.getName()); if( facebookElement.getType() != null ) jObj.put("fType", facebookElement.getType()); return jObj; } public JSONArray getJSONArrayFromListFacebookType(List<NamedFacebookType> facebookList) { JSONArray jArr = new JSONArray(); for( int i = 0 ; i < facebookList.size() ; i++ ) { NamedFacebookType facebookElement = facebookList.get(i); JSONObject jObj = new JSONObject(); if( facebookElement.getId() != null ) jObj.put("fid", facebookElement.getId()); if( facebookElement.getName() != null ) jObj.put("name", facebookElement.getName()); if( facebookElement.getType() != null ) jObj.put("fType", facebookElement.getType()); jArr.put(jObj); } return jArr; } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Do Nothing } }