package org.openmrs.module.reporting.web.controller; import org.apache.commons.lang.StringUtils; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.module.reporting.common.ObjectUtil; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Enumeration; import java.util.List; @Controller public class ViewPortletController { private static final List<String> ACCEPTED_URLS = Arrays.asList( "baseCohortIndicator", "baseMetadata", "cohortIndicatorAndDimensionSpecification", "currentReportHeader", "errorReports", "manageReportQueue", "mappedProperty", "multiParameterIterationParameterEdit", "parameter", "queuedReports", "reportDesignForm", "reportHistory", "reportList", "reportProcessorForm", "reportRequests", "runReport", "savedReports", "scheduledReports" ); @RequestMapping("/module/reporting/viewPortlet.htm") public void view(Model model, HttpServletRequest request, @RequestParam("id") String id, @RequestParam("url") String url, @RequestParam(value="parameters", required=false) String parameters) { if (Context.isAuthenticated() && ACCEPTED_URLS.contains(url)) { model.addAttribute("id", id); model.addAttribute("url", url); // For backwards compatibility, we support passing in a pipe-delimited string of name=value paramaters StringBuilder paramConfig = new StringBuilder(); if (StringUtils.isNotBlank(parameters)) { paramConfig.append(parameters); } // In later versions of Tomcat, the pipe is not an allowed character, so we support normal prefixed parameters Enumeration<String> requestParameterNames = request.getParameterNames(); while (requestParameterNames.hasMoreElements()) { String requestParameterName = requestParameterNames.nextElement(); if (requestParameterName.startsWith("parameters.")) { String paramName = requestParameterName.substring(11); String paramValue = request.getParameter(requestParameterName); if (paramConfig.length() > 0) { paramConfig.append("|"); } paramConfig.append(paramName).append("=").append(ObjectUtil.nvlStr(paramValue, "")); } } model.addAttribute("parameters", paramConfig.toString()); } else { throw new APIException("Error trying to view portlet at url: " + url); } } }