package org.openmrs.module.reporting.web.datasets;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.api.context.Context;
import org.openmrs.module.htmlwidgets.web.WidgetUtil;
import org.openmrs.module.reporting.common.ObjectUtil;
import org.openmrs.module.reporting.common.ReflectionUtil;
import org.openmrs.module.reporting.dataset.definition.DataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService;
import org.openmrs.module.reporting.definition.DefinitionUtil;
import org.openmrs.module.reporting.definition.configuration.Property;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@Controller
public class ManageDatasetsController {
protected Log log = LogFactory.getLog(this.getClass());
/**
* Controller for the edit data set page
*/
@RequestMapping("/module/reporting/datasets/editDataSet")
public String editDataSet(
@RequestParam(required=false, value="uuid") String uuid,
@RequestParam(required=false, value="type") Class<? extends DataSetDefinition> type,
@RequestParam(required=false, value="cohortSize") Integer cohortSize,
@RequestParam(required=false, value="action") String action,
ModelMap model) {
DataSetDefinitionService service = Context.getService(DataSetDefinitionService.class);
DataSetDefinition dsd = service.getDefinition(uuid, type);
model.addAttribute("dataSetDefinition", dsd);
List<Property> properties = DefinitionUtil.getConfigurationProperties(dsd);
model.addAttribute("configurationProperties", properties);
Map<String, List<Property>> groups = new LinkedHashMap<String, List<Property>>();
for (Property p : properties) {
List<Property> l = groups.get(p.getGroup());
if (l == null) {
l = new ArrayList<Property>();
groups.put(p.getGroup(), l);
}
l.add(p);
}
model.addAttribute("groupedProperties", groups);
return "/module/reporting/datasets/datasetEditor";
}
/**
* Save DataSetDefinition
*/
@RequestMapping("/module/reporting/datasets/saveDataSet")
@SuppressWarnings("unchecked")
public String saveDataSet(
@RequestParam(required=false, value="uuid") String uuid,
@RequestParam(required=false, value="type") Class<? extends DataSetDefinition> type,
@RequestParam(required=true, value="name") String name,
@RequestParam("description") String description,
HttpServletRequest request,
ModelMap model
) {
DataSetDefinitionService service = Context.getService(DataSetDefinitionService.class);
DataSetDefinition dataSetDefinition = service.getDefinition(uuid, type);
dataSetDefinition.setName(name);
dataSetDefinition.setDescription(description);
dataSetDefinition.getParameters().clear();
for (Property p : DefinitionUtil.getConfigurationProperties(dataSetDefinition)) {
String fieldName = p.getField().getName();
String prefix = "parameter." + fieldName;
String valParamName = prefix + ".value";
boolean isParameter = "t".equals(request.getParameter(prefix+".allowAtEvaluation"));
Object valToSet = WidgetUtil.getFromRequest(request, valParamName, p.getField());
Class<? extends Collection<?>> collectionType = null;
Class<?> fieldType = p.getField().getType();
if (ReflectionUtil.isCollection(p.getField())) {
collectionType = (Class<? extends Collection<?>>)p.getField().getType();
fieldType = (Class<?>)ReflectionUtil.getGenericTypes(p.getField())[0];
}
if (isParameter) {
ReflectionUtil.setPropertyValue(dataSetDefinition, p.getField(), null);
String paramLabel = ObjectUtil.nvlStr(request.getParameter(prefix + ".label"), fieldName);
Parameter param = new Parameter(fieldName, paramLabel, fieldType, collectionType, valToSet);
dataSetDefinition.addParameter(param);
}
else {
ReflectionUtil.setPropertyValue(dataSetDefinition, p.getField(), valToSet);
}
}
log.debug("Saving: " + dataSetDefinition);
Context.getService(DataSetDefinitionService.class).saveDefinition(dataSetDefinition);
return "redirect:/module/reporting/definition/manageDefinitions.form?type=org.openmrs.module.reporting.dataset.definition.DataSetDefinition";
}
}