package kr.ac.kaist.resl.lilliput.rest;
import java.io.IOException;
import java.util.List;
import javax.xml.datatype.DatatypeConfigurationException;
import kr.ac.kaist.resl.lilliput.ac.AccessController;
import kr.ac.kaist.resl.lilliput.ac.AccessibilityPair;
import kr.ac.kaist.resl.lilliput.util.EPCISHelper;
import kr.ac.kaist.resl.lilliput.util.MashalInteger;
import kr.ac.kaist.resl.lilliput.util.MashalFloat;
import kr.ac.kaist.resl.lilliput.util.MashalBoolean;
import net.sf.json.xml.XMLSerializer;
import org.fosstrak.epcis.model.Poll;
import org.fosstrak.epcis.model.QueryResults;
import org.fosstrak.epcis.queryclient.QueryControlClient;
import org.fosstrak.epcis.soap.ImplementationExceptionResponse;
import org.fosstrak.epcis.soap.NoSuchNameExceptionResponse;
import org.fosstrak.epcis.soap.QueryParameterExceptionResponse;
import org.fosstrak.epcis.soap.QueryTooComplexExceptionResponse;
import org.fosstrak.epcis.soap.QueryTooLargeExceptionResponse;
import org.fosstrak.epcis.soap.SecurityExceptionResponse;
import org.fosstrak.epcis.soap.ValidationExceptionResponse;
import org.fosstrak.epcis.utils.QueryResultsParser;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.MarshalFloat;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.xmlpull.v1.XmlPullParserException;
import com.mongodb.MongoException;
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.OWLObjectProperty;
import edu.stanford.smi.protegex.owl.model.RDFIndividual;
public class PushService extends ServerResource {
@Get("json")
public JsonRepresentation toJson() throws JSONException {
try {
//epc�� ���ͼ�
String epc = getQuery().getValues("epc");
String service = (String)getRequest().getAttributes().get("service");
String param = (String)getRequest().getAttributes().get("params"); //JSON���� �� Str
if( epc == null )
{
return null;
}
//Save Space to Ontology if it is not saved
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
List<AccessibilityPair> acPair = AccessController.getAccessibilityList(owlModel, epc);
AccessibilityPair ap = null;
for(int i = 0 ; i < acPair.size() ; i++ )
{
AccessibilityPair ac = acPair.get(i);
if( ac.subject.equals(epc) && ac.object.equals(service))
{
ap = ac;
break;
}
}
if( ap == null)
{
return null;
}
//���� AC�� �����.
RDFIndividual targetService = owlModel.getOWLIndividual(ap.object);
OWLObjectProperty isServiceOf = owlModel.getOWLObjectProperty("isServiceOf");
OWLDatatypeProperty urlProp = owlModel.getOWLDatatypeProperty("epcisURL");
RDFIndividual targetEPC = null;
String url = null;
JSONObject returnObj = null;
//EPCIS���
if( ap.object.contains("EPCIS"))
{
//�������� �˾Ƴ���
targetEPC = (RDFIndividual)targetService.getPropertyValue(isServiceOf);
//EPCIS�� �����Ѵ�
url = (String)targetService.getPropertyValue(urlProp);
String targetEPCStr = targetEPC.getBrowserText();
returnObj = invokeEPCIS(targetEPCStr, url);
}
else if( ap.object.contains("WebService"))
{
JSONArray paramArr = new JSONArray(param);
OWLDatatypeProperty methodNamed = owlModel.getOWLDatatypeProperty("wsMethodName");
OWLDatatypeProperty soapActiond = owlModel.getOWLDatatypeProperty("wsSoapAction");
OWLDatatypeProperty nameSpaced = owlModel.getOWLDatatypeProperty("wsNameSpace");
OWLDatatypeProperty wsUrld = owlModel.getOWLDatatypeProperty("wsURL");
String METHOD_NAME = (String)targetService.getPropertyValue(methodNamed);
String SOAP_ACTION = (String)targetService.getPropertyValue(soapActiond);
String NAMESPACE = (String)targetService.getPropertyValue(nameSpaced);
String URL = (String)targetService.getPropertyValue(wsUrld);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;
for( int i = 0 ; i < paramArr.length() ; i ++ )
{
JSONObject paramObj = paramArr.getJSONObject(i);
String paramName = paramObj.getString("name");
String paramType = paramObj.getString("type");
String paramValue = paramObj.getString("value");
if( paramType.equals("float"))
{
request.addProperty(paramName, Float.parseFloat(paramValue));
envelope.addMapping(NAMESPACE, "float", float.class);
MarshalFloat mf = new MarshalFloat();
mf.register(envelope);
}else if( paramType.equals("int"))
{
request.addProperty(paramName, Integer.parseInt(paramValue));
envelope.addMapping(NAMESPACE, "int", int.class);
MashalInteger mi = new MashalInteger();
mi.register(envelope);
}else if( paramType.equals("boolean"))
{
request.addProperty(paramName, Boolean.parseBoolean(param));
envelope.addMapping(NAMESPACE, "boolean", boolean.class);
MashalBoolean mb = new MashalBoolean();
mb.register(envelope);
}
}
envelope.setOutputSoapObject(request);
HttpTransportSE ht = new HttpTransportSE(URL);
ht.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
if( response != null )
{
returnObj.put("WS_Message", response.toString());
}
else
{
return null;
}
}
p.dispose();
JsonRepresentation representation = new JsonRepresentation(returnObj);
return representation;
} catch (MongoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JSONObject returnJson = new JSONObject();
returnJson.put("message", "error occured");
JsonRepresentation representation = new JsonRepresentation(returnJson);
return representation;
}
public JSONObject invokeEPCIS(String epc, String url) {
try {
QueryControlClient client = new QueryControlClient(url);
//Poll
EPCISHelper eHelper = new EPCISHelper();
Poll poll = null;
Poll poll2 = null;
if( epc.contains("gid") || epc.contains("sgtin"))
{
poll = eHelper.createRecentObjectPoll(epc);
poll2 = eHelper.createRecentSensingObjectPoll(epc);
QueryResults results = client.poll(poll);
QueryResults results2 = client.poll(poll2);
//Retrieve Document
String result = QueryResultsParser.queryResultsToXml(results);
String result2 = QueryResultsParser.queryResultsToXml(results2);
XMLSerializer serializer = new XMLSerializer();
net.sf.json.JSONObject resultJSON = (net.sf.json.JSONObject)serializer.read(result);
net.sf.json.JSONObject resultJSON2 = (net.sf.json.JSONObject)serializer.read(result2);
JSONObject returnObject = new JSONObject(resultJSON.toString());
JSONObject returnObject2 = new JSONObject(resultJSON2.toString());
JSONObject totObj = new JSONObject();
totObj.put("ObjectEvent", returnObject);
totObj.put("SensingEvent", returnObject2);
JsonRepresentation representation = new JsonRepresentation(totObj);
return totObj;
}
else if( epc.contains("sgln"))
{
poll = eHelper.createRecentPoll(epc);
QueryResults results = client.poll(poll);
String result = QueryResultsParser.queryResultsToXml(results);
XMLSerializer serializer = new XMLSerializer();
net.sf.json.JSONObject resultJSON = (net.sf.json.JSONObject)serializer.read(result);
JSONObject returnObject = new JSONObject(resultJSON.toString());
return returnObject;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ImplementationExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QueryTooComplexExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QueryTooLargeExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ValidationExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchNameExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (QueryParameterExceptionResponse e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null ;
}
}