package org.openmrs.module.reporting.web.datasets; 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.dataset.definition.DataSetDefinition; import org.openmrs.module.reporting.dataset.definition.SqlDataSetDefinition; import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService; import org.openmrs.module.reporting.evaluation.parameter.Parameter; 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 SqlDataSetEditor { @RequestMapping("/module/reporting/datasets/sqlDataSetEditor") 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 SqlDataSetDefinition()); } else { DataSetDefinition def = Context.getService(DataSetDefinitionService.class).getDefinitionByUuid(uuid); if (def instanceof SqlDataSetDefinition) { SqlDataSetDefinition definition = (SqlDataSetDefinition) def; model.addAttribute("definition", definition); } else { throw new RuntimeException("This definition is not of the right class"); } } } @RequestMapping("/module/reporting/datasets/sqlDataSetDefinitionAssignQueryString") public String saveQueryString( HttpSession httpSession, WebRequest webRequest, @RequestParam("uuid") String uuid, @RequestParam("queryString") String queryString) { DataSetDefinition def = Context.getService(DataSetDefinitionService.class).getDefinitionByUuid(uuid); SqlDataSetDefinition definition = (SqlDataSetDefinition) def; definition.setSqlQuery(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(DataSetDefinitionService.class).saveDefinition(definition); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "reporting.SqlDataSetDefinition.saved"); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ARGS, queryString); return "redirect:sqlDataSetEditor.form?uuid=" + uuid; } /** * Copies the SQL DataSet definition with the given uuid into another one with the same * parameters and searches, but blank name/description and SQL string * * @param uuid * @return */ @RequestMapping("/module/reporting/datasets/sqlDataSetDefinitionClone") public String cloneDefinition(WebRequest request, @RequestParam("name") String name, @RequestParam(value="description", required=false) String description, @RequestParam("copyFromUuid") String copyFromUuid) { DataSetDefinition def = Context.getService(DataSetDefinitionService.class).getDefinitionByUuid(copyFromUuid); SqlDataSetDefinition from = (SqlDataSetDefinition) def; SqlDataSetDefinition clone = new SqlDataSetDefinition(); clone.setId(null); clone.setUuid(null); clone.setName(name); clone.setDescription(description); clone.setParameters(from.getParameters()); clone.setSqlQuery(from.getSqlQuery()); Context.getService(DataSetDefinitionService.class).saveDefinition(clone); request.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Saved as a new copy", WebRequest.SCOPE_SESSION); return "redirect:sqlDataSetEditor.form?uuid=" + clone.getUuid(); } }