package org.openmrs.module.reporting.web.controller.portlet;
import java.util.Collection;
import java.util.Date;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Location;
import org.openmrs.module.htmlwidgets.web.WidgetUtil;
import org.openmrs.module.reporting.common.ObjectUtil;
import org.openmrs.module.reporting.evaluation.parameter.Parameter;
import org.openmrs.module.reporting.evaluation.parameter.Parameterizable;
import org.openmrs.module.reporting.evaluation.parameter.ParameterizableUtil;
import org.openmrs.web.WebConstants;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class ParameterPortletFormController {
protected static Log log = LogFactory.getLog(ParameterPortletFormController.class);
/**
* Default Constructor
*/
public ParameterPortletFormController() { }
/**
* Saves mapped parameters
*/
@RequestMapping("/module/reporting/parameters/saveParameter")
public String saveParameter(ModelMap model, HttpServletRequest request,
@RequestParam(required=true, value="type") Class<? extends Parameterizable> parentType,
@RequestParam(required=true, value="uuid") String parentUuid,
@RequestParam(required=true, value="currentName") String currentName,
@RequestParam(required=true, value="newName") String newName,
@RequestParam(required=true, value="parameterType") Class<?> parameterType,
@RequestParam(required=false, value="label") String label,
@RequestParam(required=false, value="collectionType") Class<? extends Collection<?>> collectionType,
@RequestParam(required=false, value="widgetConfiguration") String widgetConfiguration,
@RequestParam(required=false, value="shortcut") String shortcut
) {
if (shortcut != null) {
if (shortcut.equals("date")) {
newName = "date";
label="Date";
parameterType = Date.class;
}
else if (shortcut.equals("startDate")) {
newName = "startDate";
label="Start Date";
parameterType = Date.class;
}
else if (shortcut.equals("endDate")) {
newName = "endDate";
label="End Date";
parameterType = Date.class;
}
else if (shortcut.equals("location")) {
newName = "location";
label="Location";
parameterType = Location.class;
}
}
Parameterizable parent = ParameterizableUtil.getParameterizable(parentUuid, parentType);
Properties widgetConfig = null;
if (ObjectUtil.notNull(widgetConfiguration)) {
widgetConfig = WidgetUtil.parseInput(widgetConfiguration, Properties.class);
}
Parameter p = new Parameter(newName, label, parameterType, collectionType, null, widgetConfig);
if (StringUtils.hasText(currentName)) {
int index = parent.getParameters().indexOf(parent.getParameter(currentName));
parent.getParameters().set(index, p);
}
else {
parent.addParameter(p);
}
ParameterizableUtil.saveParameterizable(parent);
return "redirect:/module/reporting/closeWindow.htm";
}
/**
* Remove mapped property
*/
@RequestMapping("/module/reporting/parameters/deleteParameter")
public String deleteParameter(ModelMap model, HttpServletRequest request,
@RequestParam(required=true, value="type") Class<? extends Parameterizable> parentType,
@RequestParam(required=true, value="uuid") String parentUuid,
@RequestParam(required=true, value="name") String name,
@RequestParam(required=true, value="returnUrl") String returnUrl) {
Parameterizable parent = ParameterizableUtil.getParameterizable(parentUuid, parentType);
parent.removeParameter(name);
ParameterizableUtil.saveParameterizable(parent);
String pathToRemove = "/" + WebConstants.WEBAPP_NAME;
if (returnUrl.startsWith(pathToRemove)) {
returnUrl = returnUrl.substring(pathToRemove.length());
}
returnUrl = returnUrl.replace("=uuid", "=" + parentUuid);
return "redirect:"+returnUrl;
}
}