package kr.ac.kaist.resl.lilliput.util;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
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;
public class SaveSpaceEvent {
String EPCLocation;
JSONObject sensorJson;
MongoHelper mHelper;
public SaveSpaceEvent(String EPCLocation, JSONObject sensorJson)
{
this.EPCLocation = EPCLocation;
this.sensorJson = sensorJson;
this.mHelper = new MongoHelper();
}
public void save()
{
try {
//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();
// OWLModel owlModel = ProtegeOWL.createJenaOWLModelFromURI(SensorIntegration.owlURI);
OWLNamedClass indoorSpaceClass = owlModel.getOWLNamedClass("IndoorSpace");
OWLNamedClass spaceEventClass = owlModel.getOWLNamedClass("SpaceEvent");
List<String> queryTypes = new ArrayList<String>();
//Identify whethere there is this space or not
RDFIndividual epcLocation = owlModel.getRDFIndividual(EPCLocation);
OWLObjectProperty hasSpaceEvent = owlModel.getOWLObjectProperty("hasSpaceEvent");
RDFIndividual spaceEventInd;
String sensingObjectID;
if( epcLocation == null )
{
//���� ����ؾ���
//��������� ���
epcLocation = indoorSpaceClass.createRDFIndividual(EPCLocation);
JSONObject spaceEvent = new JSONObject();
spaceEvent.put("epc", EPCLocation);
JSONArray events = new JSONArray();
spaceEvent.put("Events", events);
queryTypes.add("epc");
//epc�� �����ϰ� objectID�� ������
sensingObjectID = mHelper.saveToDB("SpaceEvent", spaceEvent, queryTypes);
//spaceEvent�� ��������� objectID�� ������
spaceEventInd = spaceEventClass.createRDFIndividual(sensingObjectID);
//������
epcLocation.setPropertyValue(hasSpaceEvent, spaceEventInd);
}
else
{
//���� ����ϴ°� �ƴ϶�� spaceeventind�� ���
//space�� �ִ�. ������ event�� ���� �� �ִ�.
System.out.println(epcLocation.getPropertyValueCount(hasSpaceEvent));
spaceEventInd = (RDFIndividual)epcLocation.getPropertyValue(hasSpaceEvent);
if( spaceEventInd == null )
{
JSONObject spaceEvent = new JSONObject();
spaceEvent.put("epc", EPCLocation);
JSONArray events = new JSONArray();
spaceEvent.put("Events", events);
queryTypes.add("epc");
//epc�� �����ϰ� objectID�� ������
sensingObjectID = mHelper.saveToDB("SpaceEvent", spaceEvent, queryTypes);
//spaceEvent�� ��������� objectID�� ������
spaceEventInd = spaceEventClass.createRDFIndividual(sensingObjectID);
//������
epcLocation.setPropertyValue(hasSpaceEvent, spaceEventInd);
}
else
{
//objectID�� �����´�
String[] objectIDs = spaceEventInd.getBrowserText().split("#");
sensingObjectID = objectIDs[1];
}
}
//���� �����ؾ��� objectID�� �ȴ�
mHelper.saveToDBInArray("SpaceEvent", sensingObjectID , sensorJson, "Events");
p.dispose();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}