package com.mossle.model.web; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mossle.api.keyvalue.KeyValueConnector; import com.mossle.api.tenant.TenantHolder; import com.mossle.core.export.Exportor; import com.mossle.core.export.TableModel; import com.mossle.core.page.Page; import com.mossle.model.persistence.domain.ModelField; import com.mossle.model.persistence.domain.ModelInfo; import com.mossle.model.persistence.manager.ModelFieldManager; import com.mossle.model.persistence.manager.ModelInfoManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("model") public class ModelController { private static Logger logger = LoggerFactory .getLogger(ModelController.class); private ModelInfoManager modelInfoManager; private ModelFieldManager modelFieldManager; private JdbcTemplate jdbcTemplate; private KeyValueConnector keyValueConnector; private Exportor exportor; private TenantHolder tenantHolder; @RequestMapping("index") public String index(Model model) { String tenantId = tenantHolder.getTenantId(); List<ModelInfo> modelInfos = modelInfoManager.findBy("tenantId", tenantId); model.addAttribute("modelInfos", modelInfos); return "model/index"; } @RequestMapping("list") public String list(@RequestParam("id") Long id, @ModelAttribute Page page, @RequestParam(value = "q", required = false) String q, Model model) { String tenantId = tenantHolder.getTenantId(); logger.debug("q : {}", q); logger.debug("orderBy : {}", page.getOrderBy()); logger.debug("order : {}", page.getOrder()); List<ModelInfo> modelInfos = modelInfoManager.findBy("tenantId", tenantId); model.addAttribute("modelInfos", modelInfos); ModelInfo modelInfo = modelInfoManager.get(id); model.addAttribute("searchableFields", this.findSearchableFields(modelInfo)); List<ModelField> listFields = this.findListFields(modelInfo); model.addAttribute("listFields", listFields); this.findList(modelInfo, listFields, page, q); model.addAttribute("page", page); return "model/list"; } @RequestMapping("export") public void export(@RequestParam("id") Long id, @ModelAttribute Page page, @RequestParam(value = "q", required = false) String q, HttpServletRequest request, HttpServletResponse response) throws Exception { ModelInfo modelInfo = modelInfoManager.get(id); List<ModelField> modelFields = this.findListFields(modelInfo); Map<String, String> headers = new HashMap<String, String>(); for (ModelField modelField : modelFields) { headers.put(modelField.getCode(), modelField.getName()); } this.findList(modelInfo, modelFields, page, q); List<Map<String, Object>> list = (List<Map<String, Object>>) page .getResult(); TableModel tableModel = new TableModel(); tableModel.setName(modelInfo.getName()); tableModel.addHeaders(headers.keySet().toArray(new String[0])); tableModel.setData(list); exportor.export(request, response, tableModel); } public List<ModelField> findSearchableFields(ModelInfo modelInfo) { return modelFieldManager .find("from ModelField where searchable='true' and modelInfo=? order by priority", modelInfo); } public List<ModelField> findListFields(ModelInfo modelInfo) { return modelFieldManager .find("from ModelField where viewList='true' and modelInfo=? order by priority", modelInfo); } public void findList(ModelInfo modelInfo, List<ModelField> modelFields, Page page, String q) { String tenantId = tenantHolder.getTenantId(); Map<String, String> headers = new HashMap<String, String>(); for (ModelField modelField : modelFields) { headers.put(modelField.getCode(), modelField.getName()); } String processId = this.findProcessId(modelInfo.getCode()); page.setTotalCount(this.keyValueConnector.findTotalCount(processId, tenantId, q)); page.setResult(this.keyValueConnector.findResult(page, processId, tenantId, headers, q)); } public String findProcessId(String processDefinitionId) { String sql = "select p.ID from BPM_PROCESS p, BPM_CONF_BASE cb where p.CONF_BASE_ID=cb.ID and cb.PROCESS_DEFINITION_ID=?"; String processId = jdbcTemplate.queryForObject(sql, String.class, processDefinitionId); return processId; } // ~ ====================================================================== @Resource public void setModelInfoManager(ModelInfoManager modelInfoManager) { this.modelInfoManager = modelInfoManager; } @Resource public void setModelFieldManager(ModelFieldManager modelFieldManager) { this.modelFieldManager = modelFieldManager; } @Resource public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Resource public void setKeyValueConnector(KeyValueConnector keyValueConnector) { this.keyValueConnector = keyValueConnector; } @Resource public void setExportor(Exportor exportor) { this.exportor = exportor; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } }