package kr.ac.kaist.resl.lilliput.rest;
import java.io.IOException;
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.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import kr.ac.kaist.resl.lilliput.util.DisappearThread;
import kr.ac.kaist.resl.lilliput.util.EPCISHelper;
import kr.ac.kaist.resl.lilliput.util.JSONHelper;
import kr.ac.kaist.resl.lilliput.util.Util;
import org.bson.types.ObjectId;
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.restlet.ext.json.JsonRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.w3c.dom.Document;
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 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;
public class PlaceEvent extends ServerResource {
public JSONObject returnObject = null;
@SuppressWarnings("rawtypes")
@Get("json")
public JsonRepresentation toJson() throws JSONException {
try {
DatatypeFactory dataFactory = DatatypeFactory.newInstance();
String epc = (String)getRequest().getAttributes().get("uid");
//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();
RDFIndividual spaceInd = owlModel.getOWLIndividual(epc);
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;
}
}
//���������� �̹� ��������� recentObj
//���� object event�� �ƿ´�.
//Query to EPCIS repository
QueryControlClient client = new QueryControlClient("http://143.248.106.137/epcis-repository-0.4.2/query");
//Poll
EPCISHelper eHelper = new EPCISHelper();
Poll poll = eHelper.createRecentPoll(epc);
QueryResults results = client.poll(poll);
//Retrieve Document
Document result = QueryResultsParser.queryResultsToDocument(results);
//creating jsonobject
JSONHelper jHelper = new JSONHelper();
List<JSONObject> returnedEvent = jHelper.getJSONFromEPC(result);
JSONObject jsonEvent = returnedEvent.get(0);
String eventTime = jsonEvent.getString("eventTime");
XMLGregorianCalendar now = dataFactory.newXMLGregorianCalendar(new GregorianCalendar());
int nowSec = now.getSecond();
if( nowSec > 10 )
{
now.setSecond(now.getSecond()-10);
}
else
{
now.setSecond(0);
}
XMLGregorianCalendar returnTime = dataFactory.newXMLGregorianCalendar(eventTime);
returnTime.setHour(returnTime.getHour()+9);
boolean isClose = false;
if( returnTime.compare(now) > 0 )
{
isClose = true;
}
JSONArray jsonEPCList = jsonEvent.getJSONArray("epcList");
if( isClose == false )
{
System.out.println("recent event is nothing");
}
else
{
//Identify whethere there is this space or not
RDFIndividual indoorInd = owlModel.getRDFIndividual(epc);
OWLObjectProperty isIdentifying = owlModel.getOWLObjectProperty("isIdentifying");
List<String> destEPCs = new ArrayList<String>();
for(int i = 0 ; i < jsonEPCList.length() ; i ++ )
{
JSONObject tempEPCJson = jsonEPCList.getJSONObject(i);
String epcStr = tempEPCJson.getString("epc");
RDFIndividual epcInd = owlModel.getRDFIndividual(epcStr);
if( epcInd != null )
{
destEPCs.add(epcStr);
indoorInd.addPropertyValue(isIdentifying, epcInd);
}
}
DisappearThread disappearThread = new DisappearThread(epc, destEPCs,"isIdentifying",20);
disappearThread.start();
}
p.dispose();
JSONObject returnObj = new JSONObject();
if( recentObj != null )
{
returnObj.put("RoomStatus", recentObj);
}
if( jsonEvent != null && isClose == true )
{
returnObj.put("RoomEPC", jsonEvent);
}
System.out.println("Object Event is processed");
JsonRepresentation representation = new JsonRepresentation(returnObj);
return representation;
} catch (MongoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException 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();
}
JSONObject err = new JSONObject();
err.put("message", "error occured");
JsonRepresentation representation = new JsonRepresentation(err);
return representation;
}
}