package org.openmrs.module.reporting.web.controller; import java.io.PrintStream; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openmrs.api.context.Context; import org.openmrs.api.db.SerializedObject; import org.openmrs.module.reporting.definition.converter.ConverterUtil; import org.openmrs.module.reporting.definition.converter.DefinitionConverter; import org.openmrs.module.reporting.definition.service.SerializedDefinitionService; import org.openmrs.module.reporting.evaluation.Definition; import org.openmrs.serialization.OpenmrsSerializer; import org.openmrs.util.HandlerUtil; import org.openmrs.util.OpenmrsClassLoader; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class InvalidSerializedDefinitionController { protected Log log = LogFactory.getLog(this.getClass()); /** * View Invalid Serialized Definition Page */ @RequestMapping("/module/reporting/definition/invalidSerializedDefinitions") public void invalidSerializedDefinitions(ModelMap model) { SerializedDefinitionService service = Context.getService(SerializedDefinitionService.class); Map<SerializedObject, Class<? extends DefinitionConverter>> m = new LinkedHashMap<SerializedObject, Class<? extends DefinitionConverter>>(); for (SerializedObject so : service.getInvalidDefinitions(true)) { m.put(so, null); } ConverterUtil.refreshConversionStatus(); for (DefinitionConverter c : HandlerUtil.getHandlersForType(DefinitionConverter.class, null)) { for (SerializedObject o : c.getInvalidDefinitions()) { m.put(o, c.getClass()); } } model.addAttribute("serializedDefinitions", m); } /** * Edit Invalid Serialized Definition Page */ @RequestMapping("/module/reporting/definition/editInvalidSerializedDefinition") public void editInvalidSerializedDefinition( @RequestParam(required=true, value="type") Class<? extends Definition> type, @RequestParam(required=true, value="uuid") String uuid, ModelMap model) { SerializedDefinitionService service = Context.getService(SerializedDefinitionService.class); SerializedObject definition = service.getSerializedDefinitionByUuid(uuid); model.addAttribute("type", type); model.addAttribute("definition", definition); } /** * Edit Invalid Serialized Definition Page */ @RequestMapping("/module/reporting/definition/saveSerializedDefinition") public String saveSerializedDefinition(ModelMap model, HttpServletRequest request, HttpServletResponse response, @RequestParam(required=true, value="uuid") String uuid, @RequestParam(required=true, value="name") String name, @RequestParam(required=false, value="description") String description, @RequestParam(required=true, value="type") String type, @RequestParam(required=true, value="subtype") String subtype, @RequestParam(required=true, value="serializationClass") Class<? extends OpenmrsSerializer> serializationClass, @RequestParam(required=true, value="serializedData") String serializedData) throws Exception { SerializedDefinitionService service = Context.getService(SerializedDefinitionService.class); SerializedObject definition = service.getSerializedDefinitionByUuid(uuid); definition.setName(name); definition.setDescription(description); definition.setType(type); definition.setSubtype(subtype); definition.setSerializationClass(serializationClass); definition.setSerializedData(serializedData); service.saveSerializedDefinition(definition); return "redirect:/module/reporting/definition/invalidSerializedDefinitions.form?type="+type; } /** * Edit Invalid Serialized Definition Page */ @RequestMapping("/module/reporting/definition/testSerializedDefinition") @SuppressWarnings("unchecked") public void testSerializedDefinition(ModelMap model, HttpServletRequest request, HttpServletResponse response, @RequestParam(required=true, value="type") String type, @RequestParam(required=true, value="serializationClass") String serializationClass, @RequestParam(required=true, value="data") String data) throws Exception { Thread.currentThread().setContextClassLoader(OpenmrsClassLoader.getInstance()); response.setContentType("text/plain"); ServletOutputStream out = response.getOutputStream(); try { Class<? extends Definition> typeClass = (Class<? extends Definition>)Context.loadClass(type); Class<? extends OpenmrsSerializer> s = (Class<? extends OpenmrsSerializer>)Context.loadClass(serializationClass); Context.getSerializationService().deserialize(data, typeClass, s); out.print("Success"); } catch (Exception e) { e.printStackTrace(new PrintStream(out)); } } /** * Purges the definition represented by the given uuid. */ @RequestMapping("/module/reporting/definition/purgeSerializedDefinition") public String purgeSerializedDefinition(@RequestParam(required=true, value="uuid") String uuid) { SerializedDefinitionService sds = Context.getService(SerializedDefinitionService.class); sds.purgeDefinition(uuid); return "redirect:/module/reporting/definition/invalidSerializedDefinitions.form"; } /** * Converts the definition represented by the given uuid using the given converter */ @RequestMapping("/module/reporting/definition/convertDefinition") public String convertDefinition(@RequestParam(required=true, value="uuid") String uuid, @RequestParam(required=true, value="converter") Class<? extends DefinitionConverter> converter) throws Exception { SerializedDefinitionService sds = Context.getService(SerializedDefinitionService.class); SerializedObject so = sds.getSerializedDefinitionByUuid(uuid); DefinitionConverter c = converter.newInstance(); c.convertDefinition(so); return "redirect:/module/reporting/definition/invalidSerializedDefinitions.form"; } }