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 PropertyRegistration extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public PropertyRegistration() {
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 access_token = thingValues[2];
//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");
jsonObject.put("access_token", accessToken);
//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");
jsonPlace.put("access_token", accessToken);
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();
}
}
}