package kr.ac.kaist.resl.lilliput.core; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Collection; import java.util.GregorianCalendar; 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 kr.ac.kaist.resl.lilliput.util.ONSHelper; import org.apache.commons.io.IOUtils; import org.json.JSONException; import org.json.JSONObject; import wsdl2ksoap.businesslogic.WSDLParser; import wsdl2ksoap.datatypes.Function; import wsdl2ksoap.datatypes.PropertyContainer; import wsdl2ksoap.datatypes.SoapClass; import wsdl2ksoap.datatypes.SoapClassProperty; import com.restfb.Connection; import com.restfb.DefaultFacebookClient; import com.restfb.FacebookClient; import com.restfb.Parameter; import com.restfb.json.JsonObject; 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.OWLDatatypeProperty; import edu.stanford.smi.protegex.owl.model.OWLModel; import edu.stanford.smi.protegex.owl.model.OWLNamedClass; import edu.stanford.smi.protegex.owl.model.OWLObjectProperty; import edu.stanford.smi.protegex.owl.model.RDFIndividual; /** * Servlet implementation class PropertyRegistration */ public class ObjectTest extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ObjectTest() { 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 thingStr = (String)request.getParameter("Thing"); String type = (String)request.getParameter("Type"); String access_token = (String)request.getParameter("accessToken"); String[] thingValues = thingStr.split("/"); String id = thingValues[0]; //String name = thingValues[1]; //String ac = thingValues[2]; String result = null; if( type.equals("Object") ) { result = ObjectEnroll(access_token, id); } else if( type.equals("Place")) { result = PlaceEnroll(access_token, id); } 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 } public String ObjectEnroll(String accessToken, String fid) { try { //making facebookClient FacebookClient facebookClient = new DefaultFacebookClient(accessToken); //getting object page JsonObject objectPage = facebookClient.fetchObject(fid, JsonObject.class); if( objectPage == null ) { return "object registration is failed"; } MongoHelper mHelper = new MongoHelper(); //String objectEPC = mHelper.getVacantObjectEPCinDB(); String objectEPC = objectPage.getString("about"); //JSONObject jsonObject = jhelper.getJSONFromObject(objectPage, objectEPC); JSONObject jsonObject = new JSONObject(objectPage.toString()); DatatypeFactory dataFactory = DatatypeFactory.newInstance(); XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar()); jsonObject.put("SyncTime", now.toString()); jsonObject.put("epc", objectEPC); jsonObject.put("fid", objectPage.getString("id")); jsonObject.put("picture", "https://graph.facebook.com/"+fid+"/picture"); //Ontology�� �ҷ��� RemoteProjectManager rpm = RemoteProjectManager.getInstance(); Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true); OWLModel owlModel = (OWLModel)p.getKnowledgeBase(); //identify whethere object is in or not RDFIndividual objectInd = owlModel.getRDFIndividual(objectEPC); OWLNamedClass objectClass = owlModel.getOWLNamedClass("Object"); if( objectInd != null ) { mHelper.close(); return "object registration is failed"; } else { objectInd = objectClass.createRDFIndividual(objectEPC); String result = mHelper.saveObjectEPCToDB(objectEPC, jsonObject); if( result == null ) { mHelper.close(); return "object registration is failed"; } } //fetch user User user = facebookClient.fetchObject("me", User.class); String ownerFID = user.getId(); //getting ownerEPC from DB //identify owner is registrated or not //getting ownerEPC from DB String ownerEPC = mHelper.isHumanSavedInDB(ownerFID); RDFIndividual ownerInd = owlModel.getRDFIndividual(ownerEPC); if( ownerInd == null ) { mHelper.close(); return "object registration is failed"; } //giving hasOwnership relationship between owner and object OWLObjectProperty hasOwnership = owlModel.getOWLObjectProperty("hasOwnership"); ownerInd.addPropertyValue(hasOwnership, objectInd); //saving object information to the database String objectInformID = mHelper.saveToDB("ObjectInformation", jsonObject, "epc", objectEPC); //save to Ontology : Information OWLNamedClass informClass = owlModel.getOWLNamedClass("ObjectInformation"); RDFIndividual informInd = informClass.createRDFIndividual(objectInformID); //making relationship : Human - Information OWLObjectProperty hasInform = owlModel.getOWLObjectProperty("hasObjectInformation"); objectInd.addPropertyValue(hasInform, informInd); //Accessing ONS String onsURL = "dns://[2002:8ff8:6a87::8ff8:6a87]"; JSONObject onsReturn = ONSHelper.getNAPTRFromONSWithEPC(onsURL, objectEPC); OWLDatatypeProperty acDT = owlModel.getOWLDatatypeProperty("AC"); //����Ʈ ���� objectInd.addPropertyValue(acDT, "Public"); if( onsReturn.isNull("ws") == false ) { wrappingWebService(owlModel, objectInd, onsReturn); } if( onsReturn.isNull("epcis") == false ) { wrappingEPCIS(owlModel, objectInd, onsReturn); } if( onsReturn.isNull("rest") == false ) { wrappingRESTService(owlModel, objectInd, onsReturn); } mHelper.close(); p.dispose(); System.out.println("Object Registration is finished"); return "object registration is success"; } catch (DatatypeConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); return e.toString(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); return e.toString(); } } public boolean wrappingRESTService(OWLModel owlModel, RDFIndividual objectInd, JSONObject onsReturn) { // TODO Auto-generated method stub try{ String restURL; restURL = onsReturn.getString("rest"); OWLNamedClass restClass = owlModel.getOWLNamedClass("RESTService"); OWLObjectProperty hasService = owlModel.getOWLObjectProperty("hasService"); //���� �ν��Ͻ� ����� RDFIndividual epcInd = restClass.createRDFIndividual(null); //���� objectInd.addPropertyValue(hasService, epcInd); OWLDatatypeProperty urlInd = owlModel.getOWLDatatypeProperty("RESTURL"); epcInd.addPropertyValue(urlInd, restURL); return true; }catch(JSONException e) { e.printStackTrace(); return false; } } public boolean wrappingEPCIS(OWLModel owlModel, RDFIndividual objectInd, JSONObject onsReturn) { // TODO Auto-generated method stub try{ String epcURL; epcURL = onsReturn.getString("epcis"); OWLNamedClass epcisClass = owlModel.getOWLNamedClass("EPCISService"); OWLObjectProperty hasService = owlModel.getOWLObjectProperty("hasService"); //���� �ν��Ͻ� ����� RDFIndividual epcInd = epcisClass.createRDFIndividual(null); //���� objectInd.addPropertyValue(hasService, epcInd); OWLDatatypeProperty urlInd = owlModel.getOWLDatatypeProperty("epcisURL"); epcInd.addPropertyValue(urlInd, epcURL); return true; }catch(JSONException e) { e.printStackTrace(); return false; } } public boolean wrappingWebService(OWLModel owlModel, RDFIndividual objectInd, JSONObject onsReturn) { // TODO Auto-generated method stub //WSDL �Ľ� try { String wsdlAddress; wsdlAddress = onsReturn.getString("ws"); PropertyContainer.WSDLAddress = wsdlAddress; WSDLParser.ProcessWSDL(); String NAMESPACE = PropertyContainer.Namespace; String URL = wsdlAddress; RDFIndividual wsInd ; OWLNamedClass WebServiceClass = owlModel.getOWLNamedClass("WebService"); OWLObjectProperty hasService = owlModel.getOWLObjectProperty("hasService"); OWLNamedClass wsParameter = owlModel.getOWLNamedClass("WebServiceParameter"); OWLObjectProperty hasParameter = owlModel.getOWLObjectProperty("hasParameter"); OWLNamedClass wsReturn = owlModel.getOWLNamedClass("WebServiceReturnValue"); OWLObjectProperty hasReturn = owlModel.getOWLObjectProperty("hasReturnValue"); OWLDatatypeProperty argName = owlModel.getOWLDatatypeProperty("wsArgumentName"); OWLDatatypeProperty argType = owlModel.getOWLDatatypeProperty("wsArgumentType"); OWLDatatypeProperty returnName = owlModel.getOWLDatatypeProperty("wsReturnValueName"); OWLDatatypeProperty returnType = owlModel.getOWLDatatypeProperty("wsReturnValueType"); OWLDatatypeProperty wsNameSpace = owlModel.getOWLDatatypeProperty("wsNameSpace"); OWLDatatypeProperty wsMethodName = owlModel.getOWLDatatypeProperty("wsMethodName"); OWLDatatypeProperty wsSoapAction = owlModel.getOWLDatatypeProperty("wsSoapAction"); OWLDatatypeProperty wsURL = owlModel.getOWLDatatypeProperty("wsURL"); for(int i = 0 ; i < PropertyContainer.Functions.length ; i++) { //function�޾ƿ� Function function = PropertyContainer.Functions[i]; String functionName = function.Name; String METHOD_NAME = functionName; String SOAP_ACTION = NAMESPACE+"/"+METHOD_NAME; String inputName = function.InputType; String outputName = function.OutputType; //���� �ν��Ͻ� ����� wsInd = WebServiceClass.createRDFIndividual(null); //���� objectInd.addPropertyValue(hasService, wsInd); wsInd.addPropertyValue(wsNameSpace, NAMESPACE); wsInd.addPropertyValue(wsMethodName, METHOD_NAME); wsInd.addPropertyValue(wsSoapAction, SOAP_ACTION); wsInd.addPropertyValue(wsURL, URL); for(int j = 0 ; j < PropertyContainer.Classes.size() ; j++) { //class�� �޾ƿͼ� SoapClass soapClass = PropertyContainer.Classes.get(j); //�̰� �Է��̴� if( inputName.equals(soapClass.Name)) { // parameter���� �ϳ��� ���캻�� for(int k = 0 ; k < soapClass.Properties.size() ; k++ ) { SoapClassProperty property = soapClass.Properties.get(k); //parameter instance�� ����� ������ RDFIndividual paramInd = wsParameter.createRDFIndividual(null); wsInd.addPropertyValue(hasParameter, paramInd); paramInd.addPropertyValue(argName, property.getPropertyName()); paramInd.addPropertyValue(argType, property.getPropertyClassType()); } } if( outputName.equals(soapClass.Name)) { // parameter���� �ϳ��� ���캻�� for(int k = 0 ;k< soapClass.Properties.size() ;k++ ) { SoapClassProperty property = soapClass.Properties.get(k); //parameter instance�� ����� ������ RDFIndividual returnInd = wsReturn.createRDFIndividual(null); wsInd.addPropertyValue(hasReturn, returnInd); returnInd.addPropertyValue(returnName, property.getPropertyName()); returnInd.addPropertyValue(returnType, property.getPropertyClassType()); } } } } return true; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); return false; } } public String PlaceEnroll(String accessToken, String fid) throws MalformedURLException, IOException { try { //making facebookClient FacebookClient facebookClient = new DefaultFacebookClient(accessToken); //getting Place page Page placePage = facebookClient.fetchObject(fid, Page.class); if( placePage == null ) { return "Place registration is failed"; } //getting object EPC MongoHelper mHelper = new MongoHelper(); String placeEPC = mHelper.getVacantPlaceEPCinDB(); JSONHelper jhelper = new JSONHelper(); JSONObject jsonPlace = jhelper.getJSONFromPlace(placePage, placeEPC); jsonPlace.put("picture", "https://graph.facebook.com/"+fid+"/picture"); DatatypeFactory dataFactory; dataFactory = DatatypeFactory.newInstance(); XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar()); jsonPlace.put("SyncTime", now.toString()); //Ontology�� �ҷ��� RemoteProjectManager rpm = RemoteProjectManager.getInstance(); Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true); OWLModel owlModel = (OWLModel)p.getKnowledgeBase(); //identify whethere object is in or not RDFIndividual placeInd = owlModel.getRDFIndividual(placeEPC); OWLNamedClass placeClass = owlModel.getOWLNamedClass("IndoorSpace"); if( placeInd != null ) { mHelper.close(); return "Place registration is failed"; } else { placeInd = placeClass.createRDFIndividual(placeEPC); String result = mHelper.savePlaceEPCToDB(placeEPC, jsonPlace); if( result == null ) { mHelper.close(); return "Place registration is failed"; } } //fetch user User user = facebookClient.fetchObject("me", User.class); String ownerFID = user.getId(); //getting ownerEPC from DB //identify owner is registrated or not //getting ownerEPC from DB String ownerEPC = mHelper.isHumanSavedInDB(ownerFID); RDFIndividual ownerInd = owlModel.getRDFIndividual(ownerEPC); if( ownerInd == null ) { mHelper.close(); return "object registration is failed"; } //giving hasOwnership relationship between owner and object OWLObjectProperty hasOwnership = owlModel.getOWLObjectProperty("hasOwnership"); ownerInd.addPropertyValue(hasOwnership, placeInd); //saving place information to the database String placeInformID = mHelper.saveToDB("SpaceInformation", jsonPlace, "epc", placeEPC); //save to Ontology : Information OWLNamedClass informClass = owlModel.getOWLNamedClass("SpaceInformation"); RDFIndividual informInd = informClass.createRDFIndividual(placeInformID); //making relationship : Space - Information OWLObjectProperty hasInform = owlModel.getOWLObjectProperty("hasSpaceInformation"); placeInd.addPropertyValue(hasInform, informInd); OWLDatatypeProperty acDT = owlModel.getOWLDatatypeProperty("AC"); //����Ʈ ���� placeInd.addPropertyValue(acDT, "Public"); mHelper.close(); p.dispose(); System.out.println("Place Registration is finished"); return "Place registration is Success"; } catch (DatatypeConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); return e.toString(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); return e.toString(); } } }