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
}
}