package kr.ac.kaist.resl.lilliput.core;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.Util;
import org.bson.types.ObjectId;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.types.FacebookType;
import com.restfb.types.Page;
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 FacebookPost
*/
public class FacebookPost extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FacebookPost() {
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 accessToken = (String)request.getParameter("accessToken");
String uid = (String)request.getParameter("epc");
String ownerName = (String)request.getParameter("name");
try {
String ret = PostToFacebook(accessToken, uid, ownerName);
System.out.println(ret);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Social Graph ���鿡��
// ����
// �������� ����
// ������ ����ɶ�
// epc�� fid�� ����ȯ�Ͽ�
// Facebook�� �㺭���� �����ϴ�
RequestDispatcher dispatcher = request.getRequestDispatcher("postToFacebook.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
}
public String PostToFacebook(String accessToken, String uid, String ownerName) throws JSONException
{
try {
DatatypeFactory dataFactory = DatatypeFactory.newInstance();
//making facebookClient
FacebookClient facebookClient = new DefaultFacebookClient(accessToken);
//Useró��
if( uid.substring(0,3).equals("urn"))
{
//For Room1
JSONArray resultArr = postingObjectStatusToFacebook("urn:epc:id:sgln:00000000001.1.1");
if( resultArr == null )
{
return null;
}
if( resultArr.length() != 0 )
{
String resultStr = null;
for(int i = 0 ; i < resultArr.length() ; i++)
{
String resultObjStr = resultArr.getString(i);
JSONObject resultObj = new JSONObject(resultObjStr);
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
//direct identified object?
JSONArray nearArr = resultObj.getJSONArray("nears");
if( nearArr == null )
{
continue;
}
for( int j = 0 ; j < nearArr.length() ; j++ )
{
String nearObjStr = nearArr.getString(j);
JSONObject nearObj = new JSONObject(nearObjStr);
//identified owner
JSONArray ownerArr = nearObj.getJSONArray("owners");
if( ownerArr == null )
{
continue;
}
for( int k = 0 ; k < ownerArr.length() ; k++)
{
String ownerObjStr = ownerArr.getString(k);
JSONObject ownerObj = new JSONObject(ownerObjStr);
if( uid.equals(ownerObj.getString("epc")))
{
resultStr = "I'm in " + "urn:epc:id:sgln:00000000001.1.1" + " at " + now.toString() + " because I'm the owner of " + nearObj.getString("epc") + "which is near with " + resultObj.getString("epc");
facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", resultStr ));
return "success";
}
}
}
}
}
//For Room2
JSONArray resultArr2 = postingObjectStatusToFacebook("urn:epc:id:sgln:00000000001.1.2");
if( resultArr2 == null )
{
return null;
}
if( resultArr2.length() != 0 )
{
String resultStr2 = null;
for(int i = 0 ; i < resultArr2.length() ; i++)
{
String resultObjStr = resultArr2.getString(i);
JSONObject resultObj = new JSONObject(resultObjStr);
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
JSONArray nearArr = resultObj.getJSONArray("nears");
if( nearArr == null )
{
continue;
}
for( int j = 0 ; j < nearArr.length() ; j++ )
{
String nearObjStr = nearArr.getString(j);
JSONObject nearObj = new JSONObject(nearObjStr);
//identified owner
JSONArray ownerArr = nearObj.getJSONArray("owners");
if( ownerArr == null )
{
continue;
}
for( int k = 0 ; k < ownerArr.length() ; k++)
{
String ownerObjStr = ownerArr.getString(k);
JSONObject ownerObj = new JSONObject(ownerObjStr);
if( uid.equals(ownerObj.getString("epc")))
{
resultStr2 = "I'm in " + "urn:epc:id:sgln:00000000001.1.2" + " at " + now.toString() + " because I'm the owner of " + nearObj.getString("epc") + "which is near with " + resultObj.getString("epc");
facebookClient.publish("me/feed", FacebookType.class, Parameter.with("message", resultStr2 ));
return "success";
}
}
}
}
}
return null;
}
//getting Place page
Page placePage = facebookClient.fetchObject(uid, Page.class);
if( placePage == null )
{
//�� �������� �������� ����?
return null;
}
String epc = null;
epc = placePage.getName();
if( epc != null && epc.substring(0,15).toLowerCase().equals("urn:epc:id:sgln"))
{//place��
//Place�� ���¸� ������ �Ѵ�
JSONObject resultObj = postingPlaceStatusToFacebook(epc);
if( resultObj == null )
{
return null;
}
String message = "This place is currently [Temperature] : " + resultObj.getString("Temp") + " [Lightness] : " + resultObj.getString("Light") + " [Humidity] : " + resultObj.getString("Humid") + " in " + resultObj.getString("EventTime") ;
//Post To Facebook
facebookClient.publish(uid+"/feed", FacebookType.class, Parameter.with("message", message ));
return "success";
}
epc = placePage.getProducts();
if( epc != null )
{ //thing�̴�
//Thing�̸� ������ ������ �Ѵ�
//For Room1
JSONArray resultArr = postingObjectStatusToFacebook("urn:epc:id:sgln:00000000001.1.1");
if( resultArr == null )
{
return null;
}
if( resultArr.length() != 0 )
{
String resultStr = null;
for(int i = 0 ; i < resultArr.length() ; i++)
{
String resultObjStr = resultArr.getString(i);
JSONObject resultObj = new JSONObject(resultObjStr);
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
//direct identified object?
if( epc.equals(resultObj.getString("epc")))
{
resultStr = "I'm in " + "urn:epc:id:sgln:00000000001.1.1" + " at " + now.toString();
facebookClient.publish(uid+"/feed", FacebookType.class, Parameter.with("message", resultStr ));
return "success";
}
JSONArray nearArr = resultObj.getJSONArray("nears");
if( nearArr == null )
{
continue;
}
for( int j = 0 ; j < nearArr.length() ; j++ )
{
String nearObjStr = nearArr.getString(j);
JSONObject nearObj = new JSONObject(nearObjStr);
//indirect identified object?
if( epc.equals(nearObj.getString("epc")))
{
resultStr = "I'm in " + "urn:epc:id:sgln:00000000001.1.1" + " at " + now.toString() + " because I'm near with " + resultObj.getString("epc");
facebookClient.publish(uid+"/feed", FacebookType.class, Parameter.with("message", resultStr ));
return "success";
}
}
}
}
//For Room2
JSONArray resultArr2 = postingObjectStatusToFacebook("urn:epc:id:sgln:00000000001.1.2");
if( resultArr2 == null )
{
return null;
}
if( resultArr2.length() != 0 )
{
String resultStr2 = null;
for(int i = 0 ; i < resultArr2.length() ; i++)
{
String resultObjStr = resultArr2.getString(i);
JSONObject resultObj = new JSONObject(resultObjStr);
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
//direct identified object?
if( epc.equals(resultObj.getString("epc")))
{
resultStr2 = "I'm in " + "urn:epc:id:sgln:00000000001.1.2" + " at " + now.toString();
facebookClient.publish(uid+"/feed", FacebookType.class, Parameter.with("message", resultStr2 ));
return "success";
}
JSONArray nearArr = resultObj.getJSONArray("nears");
if( nearArr == null )
{
continue;
}
for( int j = 0 ; j < nearArr.length() ; j++ )
{
String nearObjStr = nearArr.getString(j);
JSONObject nearObj = new JSONObject(nearObjStr);
//indirect identified object?
if( epc.equals(nearObj.getString("epc")))
{
resultStr2 = "I'm in " + "urn:epc:id:sgln:00000000001.1.2" + " at " + now.toString() + " because I'm near with " + resultObj.getString("epc");
facebookClient.publish(uid+"/feed", FacebookType.class, Parameter.with("message", resultStr2 ));
return "success";
}
}
}
}
return null;
}
return null;
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@SuppressWarnings("rawtypes")
public JSONObject postingPlaceStatusToFacebook(String uid)
{
try {
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
DatatypeFactory dataFactory;
dataFactory = DatatypeFactory.newInstance();
RDFIndividual spaceInd = owlModel.getOWLIndividual(uid.toLowerCase());
OWLObjectProperty spaceEventProp = owlModel.getOWLObjectProperty("hasSpaceEvent");
List<String> spaceEventIDs = new ArrayList<String>();
Collection seCol = spaceInd.getPropertyValues(spaceEventProp);
Iterator seIter = seCol.iterator();
JSONObject queriedJson = null;
while( seIter.hasNext() )
{
RDFIndividual tempInd = (RDFIndividual)seIter.next();
spaceEventIDs.add(Util.individualToBrowserText(tempInd.getBrowserText()));
System.out.println(tempInd.getBrowserText() + "is added to list");
}
Mongo m = new Mongo("143.248.106.26", 27017);
DB db = m.getDB("Lilliput");
if( spaceEventIDs.size() == 0 )
{
return null;
}
for(int i = 0 ; i < spaceEventIDs.size(); i ++ )
{
DBCollection collection = db.getCollection("SpaceEvent");
DBObject query = new BasicDBObject();
query.put("_id",new ObjectId(spaceEventIDs.get(i)));
DBObject queriedObject = collection.findOne(query);
Map queriedMap = queriedObject.toMap();
queriedJson = new JSONObject(queriedMap);
}
XMLGregorianCalendar recentTime = null;
XMLGregorianCalendar currTime = null;
String eventsStr = queriedJson.getString("Events");
JSONArray eventsArr = new JSONArray(eventsStr);
JSONObject recentObj = null;
for(int i = 0 ; i < eventsArr.length() ; i++ )
{
JSONObject currObj = eventsArr.getJSONObject(i);
if( recentObj == null )
{
recentObj = eventsArr.getJSONObject(i);
recentTime = dataFactory.newXMLGregorianCalendar(recentObj.getString("EventTime"));
continue;
}
currTime = dataFactory.newXMLGregorianCalendar(currObj.getString("EventTime"));
if( currTime.compare(recentTime) > 0 )
{
recentTime = currTime;
recentObj = currObj;
}
}
p.dispose();
return recentObj;
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MongoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@SuppressWarnings("rawtypes")
public JSONArray postingObjectStatusToFacebook(String uid)
{
try
{
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
RDFIndividual indoorInd = owlModel.getRDFIndividual(uid);
if( indoorInd == null )
{
return null;
}
JSONArray identifiedJson = new JSONArray();
OWLObjectProperty isIdentifying = owlModel.getOWLObjectProperty("isIdentifying");
OWLObjectProperty isNear = owlModel.getOWLObjectProperty("isNear");
OWLObjectProperty isOwned = owlModel.getOWLObjectProperty("isOwned");
Collection idenCol = indoorInd.getPropertyValues(isIdentifying);
Iterator idenIter = idenCol.iterator();
while( idenIter.hasNext())
{
JSONObject resultObj = new JSONObject();
RDFIndividual identified = (RDFIndividual)idenIter.next();
resultObj.put("epc", identified.getBrowserText());
JSONArray nearArr = new JSONArray();
Collection nearCol = identified.getPropertyValues(isNear);
Iterator nearIter = nearCol.iterator();
while( nearIter.hasNext())
{
JSONObject nearObj = new JSONObject();
RDFIndividual nearInd = (RDFIndividual)nearIter.next();
nearObj.put("epc", nearInd.getBrowserText());
JSONArray ownerArr = new JSONArray();
Collection ownCol = nearInd.getPropertyValues( isOwned);
Iterator ownIter = ownCol.iterator();
while( ownIter.hasNext())
{
JSONObject ownObj = new JSONObject();
RDFIndividual ownerInd = (RDFIndividual)ownIter.next();
ownObj.put("epc", ownerInd.getBrowserText());
ownerArr.put(ownObj);
}
nearObj.put("owners", ownerArr);
nearArr.put(nearObj);
}
resultObj.put("nears", nearArr);
identifiedJson.put(resultObj);
}
p.dispose();
return identifiedJson;
}
catch( JSONException e )
{
e.printStackTrace();
}
return null;
}
}