/**
* 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.datasets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.logic.LogicException;
import org.openmrs.module.reporting.common.LogicUtil;
import org.openmrs.module.reporting.dataset.definition.LogicDataSetDefinition;
import org.openmrs.module.reporting.dataset.definition.LogicDataSetDefinition.Column;
import org.openmrs.module.reporting.dataset.definition.service.DataSetDefinitionService;
import org.openmrs.web.WebConstants;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.request.WebRequest;
@Controller
public class LogicDataSetEditor {
Log log = LogFactory.getLog(getClass());
@RequestMapping("/module/reporting/datasets/logicDataSetEditor")
public void showDataset(ModelMap model, @RequestParam(required = false, value = "uuid") String uuid) {
DataSetDefinitionService svc = Context.getService(DataSetDefinitionService.class);
LogicDataSetDefinition definition = (LogicDataSetDefinition) svc.getDefinition(uuid, LogicDataSetDefinition.class);
List<String> tokens = new ArrayList<String>(Context.getLogicService().getAllTokens());
Collections.sort(tokens);
Map<Column, Exception> logicErrors = new HashMap<Column, Exception>();
for (Column col : definition.getColumns()) {
try {
LogicUtil.parse(col.getLogic());
}
catch (Exception ex) {
logicErrors.put(col, ex);
}
}
model.addAttribute("definition", definition);
model.addAttribute("logicErrors", logicErrors);
model.addAttribute("tokens", tokens);
model.addAttribute("conceptNameTags", Context.getConceptService().getAllConceptNameTags());
}
@RequestMapping("/module/reporting/datasets/logicDataSetEditorSave")
public String saveLogicDataset(ModelMap model, @RequestParam(required = false, value = "uuid") String uuid,
@RequestParam(required = false, value = "name") String name,
@RequestParam(required = false, value = "description") String description,
WebRequest request) {
DataSetDefinitionService svc = Context.getService(DataSetDefinitionService.class);
LogicDataSetDefinition definition = uuid == null ? new LogicDataSetDefinition() : (LogicDataSetDefinition) svc
.getDefinition(uuid, LogicDataSetDefinition.class);
definition.setName(name);
definition.setDescription(description);
definition.clearColumns();
int numColumns = request.getParameterValues("columnLogic").length;
for (int i = 0; i < numColumns; ++i) {
String columnName = request.getParameterValues("columnName")[i];
String columnLabel = request.getParameterValues("columnLabel")[i];
String columnLogic = request.getParameterValues("columnLogic")[i];
String columnFormat = request.getParameterValues("columnFormat")[i];
if (!StringUtils.isBlank(columnName) && !StringUtils.isBlank(columnLogic))
definition.addColumn(columnName, columnLabel, columnLogic, columnFormat);
}
try {
boolean foundInvalidExpression = false;
ArrayList<String> invalidTokens = null;
//validate each logic expression
for (Column col : definition.getColumns()) {
if (!LogicUtil.isValidLogicExpression(col.getLogic())) {
foundInvalidExpression = true;
if (invalidTokens == null)
invalidTokens = new ArrayList<String>();
invalidTokens.add(col.getLogic());
}
}
if (foundInvalidExpression) {
String dynamicText = (invalidTokens.size() == 1) ? "value is" : "values are";
request.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, "The following logic expression " + dynamicText
+ " invalid: " + StringUtils.join(invalidTokens, ", "), WebRequest.SCOPE_SESSION);
} else
svc.saveDefinition(definition);
}
catch (LogicException e) {
request.setAttribute(WebConstants.OPENMRS_ERROR_ATTR, e.getMessage(), WebRequest.SCOPE_SESSION);
log.error(e.getMessage(), e);
}
return "redirect:logicDataSetEditor.form?uuid=" + definition.getUuid();
}
}