package org.openmrs.module.reporting.web.indicator;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.openmrs.api.context.Context;
import org.openmrs.module.reporting.cohort.query.service.CohortQueryService;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.module.reporting.indicator.Indicator;
import org.openmrs.module.reporting.indicator.SqlIndicator;
import org.openmrs.module.reporting.indicator.service.IndicatorService;
import org.openmrs.web.WebConstants;
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 org.springframework.web.context.request.WebRequest;
@Controller
public class EditSqlIndicatorController {
@RequestMapping("/module/reporting/indicators/editSqlIndicator")
public void showForm(ModelMap model,
@RequestParam(value="uuid", required=false) String uuid,
@RequestParam(value="copyFromUuid", required=false) String copyFromUuid) {
if (uuid == null) {
model.addAttribute("definition", new SqlIndicator());
}
else {
Indicator def = Context.getService(IndicatorService.class).getDefinitionByUuid(uuid);
if (def instanceof SqlIndicator) {
SqlIndicator definition = (SqlIndicator) def;
model.addAttribute("definition", definition);
}
else {
throw new RuntimeException("This definition is not of the right class");
}
}
}
@RequestMapping("/module/reporting/indicators/saveSqlIndicatorQueryString")
public String saveQueryString(
HttpSession httpSession,
WebRequest webRequest,
@RequestParam("uuid") String uuid,
@RequestParam("queryString") String queryString) {
Indicator def = Context.getService(IndicatorService.class).getDefinitionByUuid(uuid);
SqlIndicator definition = (SqlIndicator) def;
definition.setSql(queryString);
List<Parameter> parameters = Context.getService(CohortQueryService.class).getNamedParameters(queryString);
for (Parameter parameter : parameters) {
if (definition.getParameter(parameter.getName()) == null) {
definition.addParameter(parameter);
}
}
// Save the definition
Context.getService(IndicatorService.class).saveDefinition(definition);
httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "reporting.saved");
httpSession.setAttribute(WebConstants.OPENMRS_MSG_ARGS, queryString);
return "redirect:editSqlIndicator.form?uuid=" + uuid;
}
/**
* Copies the SQL Indicator with the given uuid into another one with the same
* parameters and searches, but blank name/description and SQL string
*/
@RequestMapping("/module/reporting/indicators/cloneSqlIndicator")
public String cloneDefinition(WebRequest request,
@RequestParam("name") String name,
@RequestParam(value="description", required=false) String description,
@RequestParam("copyFromUuid") String copyFromUuid) {
Indicator def = Context.getService(IndicatorService.class).getDefinitionByUuid(copyFromUuid);
SqlIndicator from = (SqlIndicator) def;
SqlIndicator clone = new SqlIndicator();
clone.setId(null);
clone.setUuid(null);
clone.setName(name);
clone.setDescription(description);
clone.setParameters(from.getParameters());
clone.setSql(from.getSql());
Context.getService(IndicatorService.class).saveDefinition(clone);
request.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Saved as a new copy", WebRequest.SCOPE_SESSION);
return "redirect:editSqlIndicator.form?uuid=" + clone.getUuid();
}
}