package org.openmrs.module.reporting.web.widget; import java.lang.reflect.Field; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.ServletOutputStream; 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.module.reporting.common.ReflectionUtil; import org.openmrs.module.reporting.evaluation.EvaluationUtil; import org.openmrs.module.reporting.evaluation.parameter.Mapped; 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.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; // I don't think this was ever completed, and I've created another AjaxController bean // @Controller public class AjaxController { protected static Log log = LogFactory.getLog(AjaxController.class); /** * Portlet Loading */ @RequestMapping("/module/reporting/widget/mappedProperty") public void loadWidget(ModelMap model, HttpServletRequest request, HttpServletResponse response, @RequestParam(required=true, value="id") String id, @RequestParam(required=true, value="type") Class<? extends Parameterizable> type, @RequestParam(required=true, value="property") String property, @RequestParam(required=false, value="currentKey") String currentKey, @RequestParam(required=false, value="uuid") String uuid, @RequestParam(required=false, value="mappedUuid") String mappedUuid) throws Exception { response.setContentType("text/html"); ServletOutputStream out = response.getOutputStream(); // Get parent if uuid supplied Parameterizable parent = null; if (StringUtils.isNotEmpty(uuid)) { parent = ParameterizableUtil.getParameterizable(uuid, type); } // Get generic type of the Mapped property Field f = ReflectionUtil.getField(type, property); Class<?> fieldType = ReflectionUtil.getFieldType(f); boolean isList = List.class.isAssignableFrom(fieldType); boolean isMap = Map.class.isAssignableFrom(fieldType); Class<? extends Parameterizable> mappedType = ParameterizableUtil.getMappedType(type, property); Parameterizable mappedChild = null; Map<String, Object> mappings = new HashMap<String, Object>(); if (StringUtils.isNotEmpty(uuid)) { if (StringUtils.isEmpty(mappedUuid)) { Mapped<Parameterizable> mapped = ParameterizableUtil.getMappedProperty(parent, property, currentKey); if (mapped != null) { mappedChild = mapped.getParameterizable(); mappings = mapped.getParameterMappings(); } } else if (mappedUuid != null) { mappedChild = ParameterizableUtil.getParameterizable(mappedUuid, mappedType); } Map<String, String> mappedParams = new HashMap<String, String>(); Map<String, String> complexParams = new HashMap<String, String>(); Map<String, String> fixedParams = new HashMap<String, String>(); Map<String, Set<String>> allowedParams = new HashMap<String, Set<String>>(); if (mappedChild != null) { for (Parameter p : mappedChild.getParameters()) { Object mappedObjVal = mappings.get(p.getName()); Set<String> allowed = new HashSet<String>(); for (Parameter parentParam : parent.getParameters()) { if (p.getType() == parentParam.getType()) { allowed.add(parentParam.getName()); } } allowedParams.put(p.getName(), allowed); if (mappedObjVal != null && mappedObjVal instanceof String) { String mappedVal = (String) mappedObjVal; if (EvaluationUtil.isExpression(mappedVal)) { mappedVal = EvaluationUtil.stripExpression(mappedVal); if (parent.getParameter(mappedVal) != null) { mappedParams.put(p.getName(), mappedVal); } else { complexParams.put(p.getName(), mappedVal); } } else { fixedParams.put(p.getName(), mappedVal); } } } } } /* out.print(mappedType.getSimpleName() + ":" ); Widget w = Widget <td><wgt:widget id="parameterizableSelector${model.id}" name="mappedUuid" type="${model.mappedType.name}" defaultValue="${model.mappedObj}"/></td> </tr> */ } }