package kr.ac.kaist.resl.lilliput.core;
import java.io.IOException;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import kr.ac.kaist.resl.lilliput.util.JSONHelper;
import kr.ac.kaist.resl.lilliput.util.MongoHelper;
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.Account;
import com.restfb.types.NamedFacebookType;
import com.restfb.types.Page;
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 RenewAndDelete
*/
public class RenewAndDelete extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RenewAndDelete() {
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
String userAC = (String)request.getParameter("userAC");
String target = (String)request.getParameter("target");
String type = (String)request.getParameter("Type");
String value = (String)request.getParameter("rad_object");
String userEPC = (String)request.getParameter("userEPC");
String thingFID = null;
String thingAC = null;
@SuppressWarnings("unused")
String thingName = null;
String thingEPC = null;
String result = null;
if( value != null)
{
String[] thingValues = value.split("/");
thingFID = thingValues[0];
thingName = thingValues[1];
thingAC = thingValues[2];
thingEPC = thingValues[3];
}
if( target.equals("human") && type.equals("Renew"))
{
result = doRenewHuman(userAC, userEPC);
}
else if( target.equals("human") && type.equals("Delete"))
{
result = doDeleteHuman(userAC, userEPC);
}
else if( target.equals("object") && type.equals("Renew"))
{
result = doRenewObject(userAC, userEPC, thingFID, thingEPC, thingAC);
}
else if( target.equals("object") && type.equals("Delete"))
{
result = doDeleteObject(userAC, userEPC, thingFID, thingEPC, thingAC);
}
else if( target.equals("place") && type.equals("Renew"))
{
result = doRenewPlace(userAC, userEPC, thingFID, thingEPC, thingAC);
}
else if( target.equals("place") && type.equals("Delete"))
{
result = doDeletePlace(userAC, userEPC, thingFID, thingEPC, thingAC);
}
request.setAttribute("result", result);
RequestDispatcher dispatcher = request.getRequestDispatcher("ServiceResult.jsp");
dispatcher.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@SuppressWarnings("unchecked")
public String doRenewHuman(String userAC, String userEPC)
{
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
MongoHelper mHelper = new MongoHelper();
try {
//user�� fb���� �ƿ´�.
//making facebookClient
FacebookClient facebookClient = new DefaultFacebookClient(userAC);
//fetch user
User user = facebookClient.fetchObject("me", User.class);
//creating json object of user
JSONHelper jhelper = new JSONHelper();
JSONObject jsonUser = jhelper.getJSONFromUser(user);
DatatypeFactory dataFactory = DatatypeFactory.newInstance();
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
jsonUser.put("SyncTime", now.toString());
//
//���� human�� ��.
JSONObject prev = mHelper.getInformationUsingFID("HumanInformation", user.getId());
//human������ �����Ѵ�.
String oid = prev.getString("_id");
System.out.println(oid);
String reDB = mHelper.updateInformationToDB("HumanInformation", oid, jsonUser);
if( reDB == null )
{
return " Unexpected Error Occured : DB update Failed " ;
}
RDFIndividual humanInd = owlModel.getRDFIndividual(userEPC);
if( humanInd == null )
{
return " Unexpected Error Occured : human is not in Ontology " ;
}
Connection<User> myFriendConnections = facebookClient.fetchConnection("me/friends", User.class);
List<User> myFriends = myFriendConnections.getData();
System.out.println("my Friends");
OWLObjectProperty hasFriend = owlModel.getOWLObjectProperty("hasFriend");
OWLObjectProperty hasLover = owlModel.getOWLObjectProperty("hasLover");
//remove current connection
Collection<RDFIndividual> friendsCol = humanInd.getPropertyValuesAs(hasFriend, RDFIndividual.class);
Iterator<RDFIndividual> friendsIter = friendsCol.iterator();
while( friendsIter.hasNext() )
{
RDFIndividual friendInd = friendsIter.next();
humanInd.removePropertyValue(hasFriend, friendInd);
}
Collection<RDFIndividual> loversCol = humanInd.getPropertyValuesAs(hasLover, RDFIndividual.class);
Iterator<RDFIndividual> loversIter = loversCol.iterator();
while( loversIter.hasNext())
{
RDFIndividual loverInd = loversIter.next();
humanInd.removePropertyValue(hasLover, loverInd);
}
//ģ���� DB�� �ִٸ� object ID�� ã�� ģ���� �����Ѵ�.
for(int i = 0 ; i < myFriends.size() ; i ++ )
{
String tfid = myFriends.get(i).getId();
String friendEPC = mHelper.isHumanSavedInDB(tfid);
RDFIndividual friendInd = owlModel.getRDFIndividual(friendEPC);
if(friendInd == null )
{
System.out.println( " your friend " + myFriends.get(i).getName() + " is not a member of Lilliput, yet");
continue;
}
else
{
humanInd.addPropertyValue(hasFriend, friendInd);
System.out.println( myFriends.get(i).getName() + " is now friend in Lilliput");
}
}
NamedFacebookType lover = user.getSignificantOther();
if( lover != null )
{
String lover_fid = lover.getId();
String lover_EPC = mHelper.isHumanSavedInDB(lover_fid);
RDFIndividual loverInd = owlModel.getRDFIndividual(lover_EPC);
if(loverInd == null)
{
System.out.println( " your lover " + lover.getName() + " is not a memeber of Lilliput, yet ");
}
else
{
humanInd.addPropertyValue(hasLover, loverInd);
System.out.println( lover.getName() + " is now lover in Lilliput");
}
}
p.dispose();
mHelper.close();
return "Success";
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.dispose();
mHelper.close();
return null;
}
public String doDeleteHuman(String userAC, String userEPC)
{
//individual�� ����� ���赵 ��������.
//1. ������ DB���� �����.
//2. ������ individual�� �����.
//3. ownership�� �͵��� �����´�.
//4. �װ͵��� ������ db���� �����.
//5. �װ͵��� individual�� �����.
//6. human individual�� �����.
//1. ������ db���� �����.
FacebookClient facebookClient = new DefaultFacebookClient(userAC);
//fetch user
User user = facebookClient.fetchObject("me", User.class);
MongoHelper mHelper = new MongoHelper();
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
try {
//���� �ڽ��� �͵��� Clear�ؾ��Ѵ�
//fetch Pages
Connection<Account> myPageConnections = facebookClient.fetchConnection("me/accounts", Account.class);
List<Account> myPages = myPageConnections.getData();
JSONArray pages = new JSONArray();
for(int i = 0 ; i < myPages.size() ; i ++ )
{
JSONObject pageJson = new JSONObject();
Account tempAcc = myPages.get(i);
if( tempAcc.getCategory().equals("Application"))
{
continue;
}
String tname = tempAcc.getName();
String PageaccessToken = tempAcc.getAccessToken();
String id = tempAcc.getId();
pageJson.put("name", tname);
pageJson.put("access_token", PageaccessToken);
pageJson.put("id", id);
pages.put(pageJson);
}
JSONArray registratedObject = new JSONArray();
JSONArray registratedPlace = new JSONArray();
for(int i = 0 ; i < pages.length() ; i++ )
{
JSONObject tempPage = pages.getJSONObject(i);
String uid = mHelper.isSavedInDB("EPCStorage", "fid", tempPage.getString("id"));
if( uid != null )
{
//urn:epc:id:sgtin:
//urn:epc:id:sgln:
String[] flags = uid.split(":");
if( flags.length < 4)
{
System.out.println( "Unexpected Error Occured : Abnormal EPC is stored in DB");
continue;
}
if( flags[3].equals("sgtin")) //object
{
JSONObject ret = mHelper.getInformationUsingFID("ObjectInformation", tempPage.getString("id"));
if( ret.isNull("SyncTime") != true ) tempPage.put("SyncTime", ret.getString("SyncTime"));
if( ret.isNull("epc") != true ) tempPage.put("epc", ret.getString("epc"));
registratedObject.put(tempPage);
}
else if( flags[3].equals("sgln")) //place
{
JSONObject ret = mHelper.getInformationUsingFID("SpaceInformation", tempPage.getString("id"));
if( ret.isNull("SyncTime") != true ) tempPage.put("SyncTime", ret.getString("SyncTime"));
if( ret.isNull("epc") != true ) tempPage.put("epc", ret.getString("epc"));
registratedPlace.put(tempPage);
}
}
}
//doDeleteObject(String userAC, String userEPC, String thingFID, String thingEPC, String thingAC )
//object�� �����
for( int i = 0 ; i < registratedObject.length() ; i ++ )
{
JSONObject tempObject = registratedObject.getJSONObject(i);
String thingFID = tempObject.getString("id");
String thingEPC = tempObject.getString("epc");
String thingAC = tempObject.getString("access_token");
doDeleteObject(userAC, userEPC, thingFID, thingEPC, thingAC);
}
for( int i = 0 ; i < registratedPlace.length() ; i ++ )
{
JSONObject tempPlace = registratedPlace.getJSONObject(i);
String thingFID = tempPlace.getString("id");
String thingEPC = tempPlace.getString("epc");
String thingAC = tempPlace.getString("access_token");
doDeletePlace(userAC, userEPC, thingFID, thingEPC, thingAC);
}
JSONObject ret = mHelper.getInformationUsingFID("HumanInformation", user.getId());
String oid = ret.getString("_id");
mHelper.deleteDocumentInDB("HumanInformation", userEPC);
mHelper.deleteDocumentInDB("EPCStorage", userEPC);
//2. ������ individual�� ����� //3. object individual�� �����
RDFIndividual ind = owlModel.getRDFIndividual(userEPC);
RDFIndividual inf = owlModel.getRDFIndividual(oid);
ind.delete();
inf.delete();
p.dispose();
mHelper.close();
return "success";
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//�� �ɵ�
return null;
}
public String doRenewObject(String userAC, String userEPC, String thingFID, String thingEPC, String thingAC )
{
try {
//object������ fb���� �����´�.
FacebookClient facebookClient = new DefaultFacebookClient(userAC);
//getting object page
Page objectPage = facebookClient.fetchObject(thingFID, Page.class);
if( objectPage == null )
{
return "object renew is failed";
}
MongoHelper mHelper = new MongoHelper();
JSONHelper jhelper = new JSONHelper();
JSONObject jsonObject = jhelper.getJSONFromObject(objectPage, thingEPC);
DatatypeFactory dataFactory = DatatypeFactory.newInstance();
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
jsonObject.put("SyncTime", now.toString());
//���� object�� ��.
JSONObject prev = mHelper.getInformationUsingFID("ObjectInformation", thingFID);
//object������ �����Ѵ�.
String oid = prev.getString("_id");
System.out.println(oid);
String reDB = mHelper.updateInformationToDB("ObjectInformation", oid, jsonObject);
mHelper.close();
if( reDB == null )
{
return " Unexpected Error Occured : DB update Failed " ;
}
else
{
return " Success " ;
}
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return " Unexpected Error Occured " ;
}
public String doDeleteObject(String userAC, String userEPC, String thingFID, String thingEPC, String thingAC )
{
try
{
//1. ������ db���� �����.
MongoHelper mHelper = new MongoHelper();
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
JSONObject ret = mHelper.getInformationUsingFID("ObjectInformation", thingFID);
String oid = ret.getString("_id");
mHelper.deleteDocumentInDB("ObjectInformation", thingEPC);
mHelper.deleteDocumentInDB("EPCStorage", thingEPC);
//2. ������ individual�� ����� //3. object individual�� �����
RDFIndividual ind = owlModel.getRDFIndividual(thingEPC);
RDFIndividual inf = owlModel.getRDFIndividual(oid);
ind.delete();
inf.delete();
return "success";
}
catch( JSONException e )
{
return null;
}
}
public String doRenewPlace(String userAC, String userEPC, String thingFID, String thingEPC, String thingAC )
{
//place������ fb���� �����´�.
//place������ �����.
//place������ �����Ѵ�.
try {
//object������ fb���� �����´�.
FacebookClient facebookClient = new DefaultFacebookClient(userAC);
//getting object page
Page placePage = facebookClient.fetchObject(thingFID, Page.class);
if( placePage == null )
{
return "place renew is failed";
}
//object ������ �����.
MongoHelper mHelper = new MongoHelper();
JSONHelper jhelper = new JSONHelper();
JSONObject jsonObject = jhelper.getJSONFromObject(placePage, thingEPC);
DatatypeFactory dataFactory = DatatypeFactory.newInstance();
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
jsonObject.put("SyncTime", now.toString());
//���� object�� ��.
JSONObject prev = mHelper.getInformationUsingFID("SpaceInformation", thingFID);
//object������ �����Ѵ�.
String oid = prev.getString("_id");
System.out.println(oid);
String reDB = mHelper.updateInformationToDB("SpaceInformation", oid, jsonObject);
mHelper.close();
if( reDB == null )
{
return " Unexpected Error Occured : DB update Failed " ;
}
else
{
return " Success " ;
}
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return " Unexpected Error Occured " ;
}
public String doDeletePlace(String userAC, String userEPC, String thingFID, String thingEPC, String thingAC )
{
try
{
//1. ������ db���� �����.
MongoHelper mHelper = new MongoHelper();
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
JSONObject ret = mHelper.getInformationUsingFID("SpaceInformation", thingFID);
String oid = ret.getString("_id");
mHelper.deleteDocumentInDB("SpaceInformation", thingEPC);
mHelper.deleteDocumentInDB("EPCStorage", thingEPC);
//2. ������ individual�� ����� //3. object individual�� �����
RDFIndividual ind = owlModel.getRDFIndividual(thingEPC);
RDFIndividual inf = owlModel.getRDFIndividual(oid);
ind.delete();
inf.delete();
return "success";
}
catch( JSONException e )
{
return null;
}
}
}