package de.tum.pip; import java.util.Set; import android.util.Log; import de.tum.pip.structures.PDPEvent; import de.tum.pip.structures.PIPName; import de.tum.pip.structures.PIPSemantics; import de.tum.pip.structures.PIPStruct; public class PolicyInformationPoint implements IPIPCommunication { private static final String TAG ="PolicyInformationPoint"; private PIPStruct pipModel; private PIPSemantics pipSemantics; public static IPIPCommunication curInstance =null; private PolicyInformationPoint() {} public static IPIPCommunication getInstance() { if(curInstance == null) curInstance=new PolicyInformationPoint(); return curInstance; } @Override public boolean initializePIP() { pipModel=new PIPStruct(); pipSemantics=new PIPSemantics(); Log.d(TAG, "Initialize PIP" + "[PIPLib]"); return true; } @Override public String init(int PID, String rep) { if(pipSemantics == null | pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return "error"; } String initialDataID; int containerID=pipModel.getContainerByName(new PIPName(PID, rep)); if(containerID == -1) { int initialContainerID=pipModel.addContainer(null); pipModel.addName(new PIPName(PID, rep), initialContainerID); initialDataID=pipModel.addData(null); pipModel.addDataContainer(initialContainerID, initialDataID); } else initialDataID=(String)pipModel.getDataInContainer(containerID).toArray()[0]; return initialDataID; } @Override public String init(int PID, String rep, String initialDataID) { if(pipSemantics == null | pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return "error"; } int containerID=pipModel.getContainerByName(new PIPName(PID, rep)); String dataID; if(containerID == -1) { int initialContainerID=pipModel.addContainer(null); pipModel.addName(new PIPName(PID, rep), initialContainerID); Log.d(TAG, "adding data to model"); dataID=pipModel.addData(initialDataID); Log.d(TAG, "dataID=" + dataID); pipModel.addDataContainer(initialContainerID, dataID); } else dataID=(String)pipModel.getDataInContainer(containerID).toArray()[0]; return dataID; } @Override public String init(String rep) { return init(-1, rep); } public String init(String rep, String dataID) { Log.d(TAG, "[PIPHandler] received PIP request for initialization: param=" + rep + "; initialDataID=" + dataID); String ret=init(-1, rep, dataID); Log.d(TAG, "ret: " + ret); return ret; } @Override public int updatePIP(PDPEvent newEvent) { if(pipSemantics == null | pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return -1; } return pipSemantics.processEvent(newEvent, pipModel); } @Override public int eval(int PID, String rep, String dataID, boolean strict) { // overload setting for strict to make is always false => needed by // implementation for smart meter strict=false; if(pipSemantics == null | pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return -1; } int foundContainerID; if(strict) { foundContainerID=pipModel.getContainerByName(new PIPName(PID, rep)); } else { foundContainerID=pipModel.getContainerByNameRelaxed(new PIPName(PID, rep)); } if(pipModel.hasDataByID(dataID) & pipModel.getContainerOfData(dataID).contains(foundContainerID)) { return 1; } else { return 0; } } @Override public int eval(String rep, String dataID, boolean strict) { return eval(-1, rep, dataID, strict); } @Override public int eval(String rep, String dataID) { return eval(-1, rep, dataID, false); } @Override public Set getDataIDbyRepresentation(int PID, String rep, boolean strict) { if(pipSemantics == null | pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return null; } int foundContainerID; Set dataItems=null; if(strict) { foundContainerID=pipModel.getContainerByName(new PIPName(PID, rep)); dataItems=pipModel.getDataInContainer(foundContainerID); } else { foundContainerID=pipModel.getContainerByNameRelaxed(new PIPName(PID, rep)); dataItems=pipModel.getDataInContainer(foundContainerID); } return dataItems; } @Override public String printModel() { if(pipModel == null) { Log.d(TAG, "PIP not yet initialized => call initializePIP() first!" + "[PIPLib]"); return "error"; } String printedModel=pipModel.printModel(); return printedModel; } }