DepositoryLatestValueServerResource.java
package org.wattdepot.server.http.api;
import org.restlet.data.Status;
import org.restlet.resource.ResourceException;
import org.wattdepot.common.domainmodel.CollectorProcessDefinition;
import org.wattdepot.common.domainmodel.Depository;
import org.wattdepot.common.domainmodel.InterpolatedValue;
import org.wattdepot.common.domainmodel.Labels;
import org.wattdepot.common.domainmodel.Sensor;
import org.wattdepot.common.domainmodel.SensorGroup;
import org.wattdepot.common.exception.IdNotFoundException;
import org.wattdepot.common.exception.MisMatchedOwnerException;
import org.wattdepot.common.exception.NoMeasurementException;
import org.wattdepot.common.http.api.DepositoryLatestValueResource;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
/**
* DepositoryLatestValueServerResource - Returns the latest value for the sensor or sensor group stored in the
* depository as an InterpolatedValue with missing sensors.
*
* @author Cam Moore
*/
public class DepositoryLatestValueServerResource extends WattDepotServerResource implements DepositoryLatestValueResource {
private String depositoryId;
private String sensorId;
private String window;
/*
* (non-Javadoc)
*
* @see org.restlet.resource.Resource#doInit()
*/
@Override
protected void doInit() throws ResourceException {
super.doInit();
this.sensorId = getQuery().getValues(Labels.SENSOR);
this.window = getQuery().getValues(Labels.WINDOW);
this.depositoryId = getAttribute(Labels.DEPOSITORY_ID);
}
@Override
public InterpolatedValue retrieve() {
getLogger().log(
Level.INFO,
"GET /wattdepot/{" + orgId + "}/" + Labels.DEPOSITORY + "/{" + depositoryId + "}/"
+ Labels.LATEST + "/" + Labels.VALUE + "/?" + Labels.SENSOR + "={" + sensorId + "}&"
+ Labels.WINDOW + "={" + window + "}");
int width = 5;
if (window != null && !window.equals("")) {
try {
width = Integer.parseInt(window);
}
catch (NumberFormatException nfe) {
width = 5;
}
}
if (isInRole(orgId)) {
try {
Depository depository = depot.getDepository(depositoryId, orgId, true);
Sensor sensor = depot.getSensor(sensorId, orgId, false);
InterpolatedValue value = new InterpolatedValue(sensorId, 0.0, depository.getMeasurementType(), new Date());
if (sensor != null) {
value.addDefinedSensor(sensorId);
CollectorProcessDefinition cpd = findCPD(depositoryId, sensorId, orgId);
try {
if (cpd != null) {
return depot.getLatestMeasuredValue(depositoryId, orgId, sensorId, width * cpd.getPollingInterval(), false);
}
else {
return depot.getLatestMeasuredValue(depositoryId, orgId, sensorId, false);
}
}
catch (NoMeasurementException e) {
return value;
}
}
else {
SensorGroup group = depot.getSensorGroup(sensorId, orgId, false);
if (group != null) {
for (String s : group.getSensors()) {
sensor = depot.getSensor(s, orgId, false);
value.addDefinedSensor(s);
if (sensor != null) {
CollectorProcessDefinition cpd = findCPD(depositoryId, s, orgId);
try {
InterpolatedValue latest;
if (cpd != null) {
latest = depot.getLatestMeasuredValue(depositoryId, orgId, s, width * cpd.getPollingInterval(), false);
}
else {
latest = depot.getLatestMeasuredValue(depositoryId, orgId, s, false);
}
value.setValue(value.getValue() + latest.getValue());
value.addReportingSensor(s);
value.setStart(latest.getStart());
value.setEnd(latest.getEnd());
}
catch (NoMeasurementException e) { //NOPMD
}
}
}
return value;
}
}
}
catch (IdNotFoundException e) {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST, depositoryId + " is not a Depository id.");
return null;
}
catch (MisMatchedOwnerException e) {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST, depositoryId + " is not in organization " + orgId + ".");
return null;
}
}
return null;
}
/**
* @param depositoryId The depository id.
* @param sensorId The sensor id.
* @param orgId The orgainzation id.
* @return The CollectorProcessDefinition for the depository and sensor, or null if not defined.
*/
private CollectorProcessDefinition findCPD(String depositoryId, String sensorId, String orgId) {
try {
List<CollectorProcessDefinition> cpds = depot.getCollectorProcessDefinitions(orgId, false);
for (CollectorProcessDefinition cpd : cpds) {
if (cpd.getDepositoryId().equals(depositoryId) && cpd.getSensorId().equals(sensorId)) {
return cpd;
}
}
}
catch (IdNotFoundException e) {
e.printStackTrace();
}
return null;
}
}