package org.opennaas.extensions.gim.controller; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.opennaas.extensions.gim.controller.snmp.APCDriver_SNMP; import org.opennaas.extensions.gim.model.core.entities.pdu.PDU; import org.opennaas.extensions.gim.model.core.entities.pdu.PDUPort; import org.opennaas.extensions.gim.model.load.MeasuredLoad; import org.opennaas.extensions.gim.model.log.PowerMonitorLog; public class APCPDUPowerControllerDriver extends PDUPowerControllerDriver { private APCDriver_SNMP driver; private PDU pdu; /** * A Map used to translate from ports in the model to targetOutletIndexes known for the driver * <p/> * Key: Portid, Value: port targetOutletIndex known for the driver */ private Map<String, Integer> outletIndexes = new HashMap<String, Integer>(); /** * @return the pdu */ public PDU getPdu() { return pdu; } /** * @param pdu * the pdu to set */ public void setPdu(PDU pdu) { this.pdu = pdu; } public String getDeviceName() throws Exception { return driver.getDeviceName(); } public String getPortName(String portId) throws Exception { return driver.getOutletName(getOutletIndex(portId)); } public List<PDUPort> getPorts() throws Exception { // read outlets List<Integer> outlets = driver.getOutletIndexes(); // build ports List<PDUPort> ports = new ArrayList<PDUPort>(outlets.size()); PDUPort port; for (int i = 0; i < outlets.size(); i++) { port = new PDUPort(); port.setName(outlets.get(i).toString()); // FIXME port.getId() SHOULD MATCH THE ONES IN powernet model!!! port.setId(outlets.get(i).toString()); port.setOutletIndex(outlets.get(i)); port.setPowerMonitorLog(new PowerMonitorLog(1, 10)); ports.add(port); } // populate outletIndexes map Map<String, Integer> newOutletIndexes = new HashMap<String, Integer>(); for (int i = 0; i < outlets.size(); i++) { newOutletIndexes.put(ports.get(i).getId(), outlets.get(i)); } setOutletIndexes(newOutletIndexes); return ports; } @Override public boolean getPowerStatus(String portId) throws Exception { return driver.getOutletStatus(getOutletIndex(portId)); } @Override public boolean powerOn(String portId) throws Exception { return driver.powerOnPort(getOutletIndex(portId)); } @Override public boolean powerOff(String portId) throws Exception { return driver.powerOffPort(getOutletIndex(portId)); } @Override public MeasuredLoad getCurrentPowerMetrics(String portId) throws Exception { MeasuredLoad ml = getCurrentPowerMetrics(getOutletIndex(portId)); return ml; } @Override public PowerMonitorLog getPowerMetricsByTimeRange(String portId, Date from, Date to) throws Exception { // FIXME return a log filtered copy including only desired measures. return getPDUPort(portId).getPowerMonitorLog(); } /** * @return the driver */ public APCDriver_SNMP getDriver() { return driver; } /** * @param driver * the driver to set */ public void setDriver(APCDriver_SNMP driver) { this.driver = driver; } /** * @return the outletIndexes */ public Map<String, Integer> getOutletIndexes() { return outletIndexes; } /** * @param outletIndexes * the outletIndexes to set */ public void setOutletIndexes(Map<String, Integer> outletIndexes) { this.outletIndexes = outletIndexes; } private int getOutletIndex(String portId) throws Exception { if (!outletIndexes.containsKey(portId)) throw new Exception("Unknown port " + portId); return outletIndexes.get(portId); } private int getOutletIndex(PDUPort port) throws Exception { return getOutletIndex(port.getId()); } private MeasuredLoad getCurrentPowerMetrics(int targetOutletIndex) throws Exception { Double outletCurrent, outletVoltage, outletPower, outletEnergy; MeasuredLoad ml; Date currentTime; try { outletCurrent = driver.getCurrentCurrent(targetOutletIndex); outletVoltage = driver.getCurrentVoltage(targetOutletIndex); outletPower = driver.getCurrentPower(targetOutletIndex); outletEnergy = driver.getCurrentEnergy(targetOutletIndex); } catch (IOException ioe) { throw new Exception("Failed to read currentPowerMetrics. Error from APC Driver:", ioe); } ml = new MeasuredLoad(); ml.setCurrent(outletCurrent); ml.setPower(outletPower); ml.setVoltage(outletVoltage); ml.setEnergy(outletEnergy); currentTime = Calendar.getInstance().getTime(); ml.setReadingTime(currentTime); return ml; } @Override public List<PDUPort> listPorts() throws Exception { return getPorts(); } private PDUPort getPDUPort(String portId) throws ModelElementNotFoundException { return GIMController.getPortById(getPdu(), portId); } }