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