package org.openmrs.module.reporting.web.controller; import org.openmrs.api.context.Context; import org.openmrs.module.reporting.cohort.query.service.CohortQueryService; import org.openmrs.module.reporting.definition.DefinitionContext; import org.openmrs.module.reporting.definition.service.DefinitionService; import org.openmrs.module.reporting.evaluation.parameter.Parameter; import org.openmrs.module.reporting.query.BaseSqlQuery; 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; import javax.servlet.http.HttpSession; import java.util.List; @Controller public class SqlDefinitionController { @RequestMapping("/module/reporting/definition/sqlDefinition") public void showForm(ModelMap model, @RequestParam(value="type", required=true) Class<? extends BaseSqlQuery> type, @RequestParam(value="uuid", required=false) String uuid, @RequestParam(value="copyFromUuid", required=false) String copyFromUuid) throws Exception { Object definition = null; if (uuid == null) { definition = type.newInstance(); } else { definition = DefinitionContext.getDefinitionService(type).getDefinitionByUuid(uuid); } model.addAttribute("definition", definition); model.addAttribute("type", type); } @RequestMapping("/module/reporting/definition/sqlDefinitionAssignQueryString") public String saveQueryString( HttpSession httpSession, WebRequest webRequest, @RequestParam(value="type", required=false) Class<? extends BaseSqlQuery> type, @RequestParam("uuid") String uuid, @RequestParam("queryString") String queryString) { DefinitionService svc = DefinitionContext.getDefinitionService(type); BaseSqlQuery definition = (BaseSqlQuery)svc.getDefinitionByUuid(uuid); definition.setQuery(queryString); // Add all new named parameters to the definition before saving. List<Parameter> parameters = Context.getService(CohortQueryService.class).getNamedParameters(queryString); for (Parameter parameter : parameters) { if (definition.getParameter(parameter.getName()) == null) definition.addParameter(parameter); } // Save the sql cohort definition svc.saveDefinition(definition); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "reporting.saved"); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ARGS, queryString); return "redirect:sqlDefinition.form?type="+type.getName()+"&uuid=" + uuid; } /** * Copies the SQL cohort definition with the given uuid into another one with the same * parameters and searches, but blank name/description and SQL string */ @RequestMapping("/module/reporting/definition/sqlDefinitionClone") public String cloneDefinition(WebRequest request, @RequestParam("name") String name, @RequestParam(value="description", required=false) String description, @RequestParam(value="type", required=false) Class<? extends BaseSqlQuery> type, @RequestParam("copyFromUuid") String copyFromUuid) throws Exception { DefinitionService svc = DefinitionContext.getDefinitionService(type); BaseSqlQuery from = (BaseSqlQuery)svc.getDefinitionByUuid(copyFromUuid); BaseSqlQuery clone = type.newInstance(); clone.setName(name); clone.setDescription(description); clone.setParameters(from.getParameters()); clone.setQuery(from.getQuery()); svc.saveDefinition(clone); request.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Saved as a new copy", WebRequest.SCOPE_SESSION); return "redirect:sqlDefinition.form?type="+type.getName()+"&uuid=" + clone.getUuid(); } }