/** * The contents of this file are subject to the OpenMRS Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.module.reporting.web.controller; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; 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.evaluation.EvaluationContext; import org.openmrs.module.reporting.evaluation.MissingDependencyException; import org.openmrs.module.reporting.evaluation.parameter.Parameter; import org.openmrs.module.reporting.evaluation.parameter.ParameterException; import org.openmrs.module.reporting.evaluation.parameter.Parameterizable; import org.openmrs.module.reporting.evaluation.parameter.ParameterizableUtil; import org.openmrs.web.WebConstants; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller public class QueryParameterFormController { /* Logger */ private Log log = LogFactory.getLog(this.getClass()); /** * Allows us to bind a custom editor for a class. * @param binder */ @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor(Context.getDateFormat(), true)); } /** * Processes the form when a user submits. */ @RequestMapping("/module/reporting/parameters/queryParameter") public ModelAndView processForm( HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "uuid", required=false) String uuid, @RequestParam(value = "type", required=false) Class<Parameterizable> type, @RequestParam(value = "action", required=false) String action, @RequestParam(value = "format", required=false) String format, @RequestParam(value = "successView", required=false) String successView, @ModelAttribute("parameterizable") Parameterizable parameterizable, BindingResult bindingResult) throws Exception { if ( parameterizable == null ) { parameterizable = ParameterizableUtil.getParameterizable(uuid, type); } if (parameterizable != null && parameterizable.getParameters().isEmpty() && StringUtils.isEmpty(action)) { action = "preview"; } if (StringUtils.isEmpty(action)) { request.getSession().removeAttribute("results"); return new ModelAndView("/module/reporting/parameters/queryParameterForm"); } else { Object results = null; ModelAndView model = new ModelAndView(); if (parameterizable != null) { EvaluationContext evaluationContext = new EvaluationContext(); Map<String, Object> parameterValues = new HashMap<String, Object>(); if (parameterizable != null && parameterizable.getParameters() != null) { for (Parameter p : parameterizable.getParameters()) { Object paramVal = WidgetUtil.getFromRequest(request, p.getName(), p.getType(), p.getCollectionType()); parameterValues.put(p.getName(), paramVal); } } // Set parameter values evaluationContext.setParameterValues(parameterValues); model.addObject("evaluationContext", evaluationContext); try { long startTime = System.currentTimeMillis(); // Evaluate the parameterizable and populate the model results = ParameterizableUtil.evaluateParameterizable(parameterizable, evaluationContext); //model.addObject("results", results); request.getSession().setAttribute("results", results); long executionTime = System.currentTimeMillis() - startTime; model.addObject("executionTime", new Double(executionTime/1000)); // Use the success view if it's given, default view otherwise //successView = (!StringUtils.isEmpty(successView)) ? successView : defaultView; //successView += "?uuid=" + parameterizable.getUuid() + "&type=" + type + "&format=" + format; model.setViewName("/module/reporting/parameters/queryParameterForm"); } catch (ParameterException e) { log.error("unable to evaluate report: ", e); request.getSession().setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Unable to evaluate report: " + e.getMessage()); request.getSession().removeAttribute("results"); return new ModelAndView("/module/reporting/parameters/queryParameterForm"); } catch (MissingDependencyException ex) { request.getSession().setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "Missing dependency: " + ex.getMessage()); request.getSession().removeAttribute("results"); return new ModelAndView("/module/reporting/parameters/queryParameterForm"); } } log.debug("Returning model with view " + model.getViewName() + " and map " + model.getModelMap()); return model; } } /** * Retrieves/creates a form backing object. * * @param uuid * @param type * @param parameterName * @return */ @ModelAttribute("parameterizable") public Parameterizable formBackingObject( @RequestParam(value = "uuid", required=false) String uuid, @RequestParam(value = "type", required=false) Class<Parameterizable> type) { if (type == null || uuid == null) return null; else return ParameterizableUtil.getParameterizable(uuid, type); } }