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; } }