/**
*
*/
package binky.reportrunner.ui.actions.dashboard;
import java.math.BigDecimal;
import java.sql.Types;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import binky.reportrunner.data.DashboardData;
import binky.reportrunner.data.RunnerDashboardItem;
import binky.reportrunner.data.RunnerDashboardThreshold;
import binky.reportrunner.ui.actions.dashboard.base.BaseDashboardAction;
/**
* @author Daniel Grout
*
*/
public class DashboardWidgetAction extends BaseDashboardAction {
/*
* (non-Javadoc)
*
* @see binky.reportrunner.ui.actions.base.StandardRunnerAction#execute()
*/
private static final long serialVersionUID = 0L;
private Map<String, ThresholdItem> thresholdData;
private Integer itemId;
private RunnerDashboardItem item;
private long random;
private List<Map<String, Object>> values;
@Override
public String execute() throws Exception {
RunnerDashboardItem item = super.getDashboardService().getItem(itemId);
// noddy security check
if (!doesUserHaveGroup(item.getGroup().getGroupName())) {
return ERROR;
}
this.item = item;
values = new LinkedList<Map<String, Object>>();
// populate the values
if (item.getData() != null) {
int currentRowNumber = 0;
Map<String, Object> currentRow = new HashMap<String, Object>();
for (DashboardData d : item.getData()) {
if (d.getRowNumber() > currentRowNumber) {
if (currentRowNumber>0) {
values.add(currentRow);
currentRow = new HashMap<String, Object>();
}
currentRowNumber = d.getRowNumber();
}
Object value;
switch (d.getDataType()) {
case Types.BIGINT:
case Types.DECIMAL:
case Types.FLOAT:
case Types.DOUBLE:
case Types.INTEGER:
case Types.REAL:
case Types.SMALLINT:
case Types.TINYINT:
value = new BigDecimal(d.getValue());
break;
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
value = new Date(Long.parseLong(d.getValue()));
break;
default:
value = d.getValue();
}
currentRow.put(d.getColumnName(), value);
}
}
if ((item instanceof RunnerDashboardThreshold)) {
Map<String, ThresholdItem> data = new HashMap<String, ThresholdItem>();
for (Map<String, Object> row : values) {
String label = row.get(
((RunnerDashboardThreshold) item).getLabelColumn())
.toString();
Number value = (Number) row
.get(((RunnerDashboardThreshold) item).getValueColumn());
Integer result = 2;
switch (((RunnerDashboardThreshold) item).getType()) {
case GreaterThan:
if (value.floatValue() <= ((RunnerDashboardThreshold) item)
.getLowerValue()) {
result = 1;
}
if (value.floatValue() >= ((RunnerDashboardThreshold) item)
.getUpperValue()) {
result = 3;
}
break;
case LessThan:
if (value.floatValue() <= ((RunnerDashboardThreshold) item)
.getLowerValue()) {
result = 3;
}
if (value.floatValue() >= ((RunnerDashboardThreshold) item)
.getUpperValue()) {
result = 1;
}
break;
}
data.put(label, new ThresholdItem(value, result));
}
this.thresholdData = data;
}
this.random = Math.round(Math.random() * 100000);
return SUCCESS;
}
public Map<String, ThresholdItem> getThresholdData() {
return this.thresholdData;
}
public Integer getItemId() {
return itemId;
}
public void setItemId(Integer itemId) {
this.itemId = itemId;
}
public RunnerDashboardItem getItem() {
return item;
}
public void setItem(RunnerDashboardItem item) {
this.item = item;
}
public long getRandom() {
return random;
}
public List<Map<String, Object>> getValues() {
return values;
}
public void setValues(List<Map<String, Object>> values) {
this.values = values;
}
public void setThresholdData(Map<String, ThresholdItem> thresholdData) {
this.thresholdData = thresholdData;
}
public void setRandom(long random) {
this.random = random;
}
}