package kr.ac.kaist.resl.lilliput.core;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
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 kr.ac.kaist.resl.lilliput.util.EPCISHelper;
import kr.ac.kaist.resl.lilliput.util.JSONHelper;
import kr.ac.kaist.resl.lilliput.util.MongoHelper;
import kr.ac.kaist.resl.lilliput.util.ObjectEventThread;
import org.fosstrak.epcis.model.Poll;
import org.fosstrak.epcis.model.QueryResults;
import org.fosstrak.epcis.queryclient.QueryControlClient;
import org.fosstrak.epcis.utils.QueryResultsParser;
import org.json.JSONArray;
import org.json.JSONObject;
import org.w3c.dom.Document;
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.OWLNamedClass;
import edu.stanford.smi.protegex.owl.model.OWLObjectProperty;
import edu.stanford.smi.protegex.owl.model.RDFIndividual;
/**
* Servlet implementation class ObjectIntegration
*/
public class ObjectIntegration extends HttpServlet {
private static final long serialVersionUID = 1L;
private String queryURL;
@SuppressWarnings("unused")
private String epcLocation;
private QueryResults results;
// private final static String owlURI = "http://143.248.106.26:8880/Lilliput/OWLFile/IoTSocialGraph0531.owl";
/**
* @see HttpServlet#HttpServlet()
*/
public ObjectIntegration() {
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 queryURL = (String)request.getParameter("EPCISQueryURL");
String epcLocation = (String)request.getParameter("EPCLocation");
String period = (String)request.getParameter("Period");
ObjectEventThread objectEventThread = new ObjectEventThread(queryURL, epcLocation, Integer.parseInt(period));
objectEventThread.start();
RequestDispatcher dispatcher = request.getRequestDispatcher("registration.jsp");
dispatcher.forward(request, response);
//ObjectRegistration(queryURL, epcLocation, period);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
@SuppressWarnings("rawtypes")
public boolean ObjectRegistration(String epcisURL, String epcLocation, String period)
{ //coap://iotsensor1.iot.kr:5683/sensors/temp
try {
//Query to EPCIS repository
queryURL = epcisURL;
QueryControlClient client = new QueryControlClient(queryURL);
this.epcLocation = epcLocation;
//Poll
EPCISHelper eHelper = new EPCISHelper();
Poll poll = eHelper.createRecentPoll(epcLocation);
results = client.poll(poll);
//Retrieve Document
JSONHelper jHelper = new JSONHelper();
Document result = QueryResultsParser.queryResultsToDocument(results);
List<JSONObject> returnedEvent = jHelper.getJSONFromEPC(result);
RemoteProjectManager rpm = RemoteProjectManager.getInstance();
Project p = rpm.getProject("localhost:5100", "Lilliput", "1234", "IoTSocialGraph", true);
OWLModel owlModel = (OWLModel)p.getKnowledgeBase();
//OWLModel owlModel = ProtegeOWL.createJenaOWLModelFromURI(owlURI);
List<String> queryTypes = new ArrayList<String>();
//DB Processing Object and IndoorSpace
//�̺�Ʈ�� ������ �׳� ����
if(returnedEvent == null)
{
System.out.println("There is no Events");
return false;
}
//Business location ���
//Save Space to Ontology if it is not saved
OWLNamedClass indoorSpaceClass = owlModel.getOWLNamedClass("IndoorSpace");
OWLNamedClass objectEventClass = owlModel.getOWLNamedClass("ObjectEvent");
//Identify whethere there is this space or not
Collection indoorSpaces = indoorSpaceClass.getInstances(false);
Iterator indoorSpaceIter = indoorSpaces.iterator();
RDFIndividual epcLocationInd = null;
boolean isItSaved = false;
while( indoorSpaceIter.hasNext() )
{
epcLocationInd = (RDFIndividual)indoorSpaceIter.next();
if( epcLocationInd.getBrowserText().equals(epcLocation))
{
isItSaved = true;
break;
}
}
String eventObjectID;
OWLObjectProperty hasObjectEvent = owlModel.getOWLObjectProperty("hasObjectEvent");
OWLObjectProperty hasObjectEventIn = owlModel.getOWLObjectProperty("hasObjectEventIn");
//
//
RDFIndividual spaceEventInd;
if( isItSaved == false )
{
//���� ����ؾ���
//��������� ���
epcLocationInd = indoorSpaceClass.createRDFIndividual(epcLocation);
JSONObject spaceEvent = new JSONObject();
spaceEvent.put("epc", epcLocation);
JSONArray events = new JSONArray();
spaceEvent.put("Events", events);
queryTypes.add("epc");
//epc�� �����ϰ� objectID�� ������
MongoHelper mHelper = new MongoHelper();
eventObjectID = mHelper.saveToDB("ObjectEvent", spaceEvent, queryTypes);
//spaceEvent�� ��������� objectID�� ������
spaceEventInd = objectEventClass.createRDFIndividual(eventObjectID);
//������
epcLocationInd.setPropertyValue(hasObjectEvent, spaceEventInd);
}
else
{
//���� ����ϴ°� �ƴ϶�� objecteventind�� ���
System.out.println(epcLocationInd.getPropertyValueCount(hasObjectEvent));
spaceEventInd = (RDFIndividual)epcLocationInd.getPropertyValue(hasObjectEvent);
//objectID�� �����´�
String[] objectIDs = spaceEventInd.getBrowserText().split("#");
eventObjectID = objectIDs[1];
}
//���� ������ ��������� ����ϰ� �̺�Ʈ���� ����� ������
//������Ʈ �̺�Ʈ�� ó���Ѵ�
//�������̺�Ʈ���� Ȯ���Ѵ�
//Processing Object
JSONObject epcEvent = returnedEvent.get(0);
//epcEvent���� eventTime�� �ִ�. �̰��� �����Ϲ� �������� �ʴ´�
MongoHelper mHelper = new MongoHelper();
boolean isLastEvent = mHelper.isLastEventInDB("ObjectEvent", eventObjectID, epcEvent, "Events");
if( isLastEvent == true )
{
System.out.println("It is last event");
return false;
}
//������ �̺�Ʈ�� �ƴ϶�� �����Ѵ�.
//�����ؾ��� ������Ʈ�̺�Ʈ�� �˰� �ִ�. spaceEventInd
mHelper.saveToDBInArray("ObjectEvent", eventObjectID , epcEvent, "Events");
//���峡
//���� ��������ʿ� ���������ߵ�
JSONArray tempEpcs = epcEvent.getJSONArray("epcList");
//�켱 ��������� ��� objectClass�� �ν��Ͻ��� ���� hasObjectEvent�� �ش��ϴ� ���踦 ���� ������
OWLNamedClass objectClass = owlModel.getOWLNamedClass("Object");
Collection objectClasses = objectClass.getInstances(false);
Iterator objectIter = objectClasses.iterator();
while(objectIter.hasNext())
{
RDFIndividual objectInd = (RDFIndividual)objectIter.next();
Collection objectEvents = objectInd.getPropertyValues(hasObjectEvent);
Iterator eventIter = objectEvents.iterator();
while( eventIter.hasNext())
{
RDFIndividual eventRDF = (RDFIndividual)eventIter.next();
objectInd.removePropertyValue(hasObjectEvent, eventRDF);
}
}
//��������
//�� OBJECT EPC���� ����
for( int i = 0 ; i < tempEpcs.length(); i++)
{
JSONObject tempEpc = tempEpcs.getJSONObject(i);
//epc ���ڿ�
String EPCObject = tempEpc.get("epc").toString();
RDFIndividual objectInd = null;
objectClasses = objectClass.getInstances(false);
Iterator objectClassIter = objectClasses.iterator();
isItSaved = false;
while( objectClassIter.hasNext())
{
objectInd = (RDFIndividual)objectClassIter.next();
if( objectInd.getBrowserText().equals(EPCObject))
{
isItSaved = true;
break;
}
}
if( isItSaved == false )
{
//���� ����ؾ���
//��������� ���
objectInd = objectClass.createRDFIndividual(EPCObject);
}
//���� ���������� hasObjectEvent�� �������ش�
//objectInd -> hasObjectEvent -> objectEventInd;
objectInd.setPropertyValue(hasObjectEvent, spaceEventInd);
epcLocationInd.setPropertyValue(hasObjectEventIn, spaceEventInd);
}
// JenaOWLModel jenaOWL = (JenaOWLModel)owlModel;
// jenaOWL.save(new URI("file:///d:/Eclipses/Lilliput_WorkspaceU/Lilliput/WebContent/OWLFile/IoTSocialGraph0531.owl"), FileUtils.langXMLAbbrev, new ArrayList());
p.dispose();
System.out.println("Object Event is processed");
return true;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}