package kr.ac.kaist.resl.lilliput.core;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.ac.kaist.resl.lilliput.util.MongoHelper;
import org.apache.commons.io.IOUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.types.User;
import edu.stanford.smi.protege.model.Project;
import edu.stanford.smi.protege.server.RemoteProjectManager;
import edu.stanford.smi.protegex.owl.model.OWLModel;
import edu.stanford.smi.protegex.owl.model.OWLObjectProperty;
import edu.stanford.smi.protegex.owl.model.RDFIndividual;
/**
* Servlet implementation class FacebookCallback
*/
public class FacebookCallback extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FacebookCallback() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println();
PrintWriter out = response.getWriter();
//String mode = (String)request.getParameter("hub.mode");
String challenge = (String)request.getParameter("hub.challenge");
String verify_token = (String)request.getParameter("hub.verify_token");
if( verify_token.equals("123"))
{
out.print(challenge);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println();
try{
StringBuilder sb = new StringBuilder();
String s;
while ((s = request.getReader().readLine()) != null) {
sb.append(s);
}
System.out.println(sb.toString());
JSONObject reqObj = new JSONObject(sb.toString());
keepConsistencyWithFacebook(reqObj);
}catch(Exception e)
{
}
}
public void keepConsistencyWithFacebook(JSONObject fbObj)
{
try{
@SuppressWarnings("unused")
String object = fbObj.getString("object");
JSONArray entries = fbObj.getJSONArray("entry");
for(int i = 0 ; i < entries.length() ; i ++ )
{
JSONObject entry = entries.getJSONObject(i);
String uid = entry.getString("uid");
changeFriendship(uid);
}
}catch( JSONException e )
{
}
}
public void changeFriendship(String uid)
{
String appAC = getAppAC();
//making facebookClient
FacebookClient facebookClient = new DefaultFacebookClient(appAC);
Connection<User> myFriendConnections = facebookClient.fetchConnection(uid+"/friends", User.class);
List<User> myFriends = myFriendConnections.getData();
System.out.println("my Friends");
//Ontology�� �ҷ���
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
OWLObjectProperty hasFriend = owlModel.getOWLObjectProperty("hasFriend");
MongoHelper mHelper = new MongoHelper();
//���� ������
String myEpc = mHelper.isHumanSavedInDB(uid);
RDFIndividual myInd = owlModel.getRDFIndividual(myEpc);
if( myInd == null )
{
return ;
}
//������ Graph������ ����
@SuppressWarnings("rawtypes")
Collection friendCol = myInd.getPropertyValues(hasFriend);
@SuppressWarnings("rawtypes")
Iterator friendIter = friendCol.iterator();
List<String> prevConnect = new ArrayList<String>();
while( friendIter.hasNext())
{
RDFIndividual friendRDF = (RDFIndividual)friendIter.next();
prevConnect.add(friendRDF.getBrowserText());
}
//���� ����� epc�Ϸ�
//�ֽ� ����� �͵��� ������
List<String> currConnect = new ArrayList<String>();
for(int i = 0 ; i < myFriends.size() ; i++ )
{
String tfid = myFriends.get(i).getId();
String friendEPC = mHelper.isHumanSavedInDB(tfid);
if(friendEPC != null )
{
currConnect.add(friendEPC);
}
}
for(int i = 0 ; i < currConnect.size() ; i++)
{
String currStr = currConnect.get(i);
if( prevConnect.contains(currStr))
{
continue;
}
else
{ //���� ����Ǿ� �ϴµ� �������� ���ٸ� ���Ӱ� ������� �־�� �Ѵ�.
RDFIndividual friendInd = owlModel.getRDFIndividual(currStr);
myInd.addPropertyValue(hasFriend, friendInd);
}
}
for(int i = 0 ; i < prevConnect.size() ; i++)
{
String prevStr = prevConnect.get(i);
if( currConnect.contains(prevStr))
{
continue;
}
else
{
//������ ����Ǿ� �־�����, ���翡 ���ٸ� ��������
RDFIndividual friendInd = owlModel.getRDFIndividual(prevStr);
myInd.removePropertyValue(hasFriend, friendInd);
}
}
}
public String getAppAC()
{
try {
URL url;
url = new URL("https://graph.facebook.com/oauth/access_token?client_id=136511403124173&client_secret=6d2d602142b59b0df5738c7a151c66cf&grant_type=client_credentials");
URLConnection con = url.openConnection();
InputStream in = con.getInputStream();
String encoding = con.getContentEncoding();
encoding = encoding == null ? "UTF-8" : encoding;
String body = IOUtils.toString(in, encoding);
String[] tokens = body.split("=");
return tokens[1];
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}