package com.mossle.model.support;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import com.mossle.api.form.FormConnector;
import com.mossle.api.form.FormDTO;
import com.mossle.api.humantask.HumanTaskConnector;
import com.mossle.api.humantask.HumanTaskDefinition;
import com.mossle.api.process.ProcessConnector;
import com.mossle.api.tenant.TenantConnector;
import com.mossle.api.tenant.TenantDTO;
import com.mossle.core.mapper.JsonMapper;
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 com.mossle.spi.humantask.TaskDefinitionConnector;
import org.activiti.engine.repository.ProcessDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ModelDeployer {
private Logger logger = LoggerFactory.getLogger(ModelDeployer.class);
private boolean autoDeploy;
private ProcessConnector processConnector;
private HumanTaskConnector humanTaskConnector;
private TaskDefinitionConnector taskDefinitionConnector;
private FormConnector formConnector;
private ModelInfoManager modelInfoManager;
private ModelFieldManager modelFieldManager;
private JsonMapper jsonMapper = new JsonMapper();
private String defaultTenantCode;
private TenantConnector tenantConnector;
@PostConstruct
public void init() {
if (!autoDeploy) {
return;
}
try {
TenantDTO tenantDto = tenantConnector.findByCode(defaultTenantCode);
Page page = processConnector.findProcessDefinitions(
tenantDto.getId(), new Page());
List<ProcessDefinition> processDefinitions = (List<ProcessDefinition>) page
.getResult();
for (ProcessDefinition processDefinition : processDefinitions) {
this.processBusiness(processDefinition);
}
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
}
}
public void processBusiness(ProcessDefinition processDefinition) {
String processDefinitionId = processDefinition.getId();
List<HumanTaskDefinition> humanTaskDefinitions = humanTaskConnector
.findHumanTaskDefinitions(processDefinitionId);
ModelInfo modelInfo = modelInfoManager.findUniqueBy("code",
processDefinitionId);
if (modelInfo == null) {
modelInfo = new ModelInfo();
modelInfo.setCode(processDefinitionId);
modelInfo.setName(processDefinition.getName());
modelInfo.setTenantId(processDefinition.getTenantId());
modelInfoManager.save(modelInfo);
}
Map<String, FormField> formFieldMap = new HashMap<String, FormField>();
for (HumanTaskDefinition humanTaskDefinition : humanTaskDefinitions) {
try {
com.mossle.spi.humantask.FormDTO formDto = taskDefinitionConnector
.findForm(humanTaskDefinition.getKey(),
processDefinitionId);
if (formDto == null) {
continue;
}
String formKey = formDto.getKey();
this.processForm(processDefinitionId, formKey,
modelInfo.getTenantId(), formFieldMap);
} catch (IOException ex) {
logger.error(ex.getMessage(), ex);
}
}
for (FormField formField : formFieldMap.values()) {
String hql = "from ModelField where name=? and modelInfo=?";
ModelField modelField = modelFieldManager.findUnique(hql,
formField.getName(), modelInfo);
if (modelField != null) {
continue;
}
modelField = new ModelField();
modelField.setModelInfo(modelInfo);
modelField.setCode(formField.getName());
modelField.setType(formField.getType());
modelField.setName(formField.getLabel());
modelField.setSearchable("true");
modelField.setDisplayable("true");
modelField.setViewForm("true");
modelField.setViewList("true");
modelField.setTenantId(modelInfo.getTenantId());
modelFieldManager.save(modelField);
}
}
public void processForm(String processDefinitionId, String formKey,
String tenantId, Map<String, FormField> formFieldMap)
throws IOException {
FormDTO formDto = formConnector.findForm(formKey, tenantId);
if (formDto == null) {
return;
}
if (formDto.isRedirect()) {
return;
}
Map<String, Object> formJson = jsonMapper.fromJson(
formDto.getContent(), Map.class);
List<Map<String, Object>> sections = (List<Map<String, Object>>) formJson
.get("sections");
for (Map<String, Object> section : sections) {
if (!"grid".equals(section.get("type"))) {
continue;
}
List<Map<String, Object>> fields = (List<Map<String, Object>>) section
.get("fields");
for (Map<String, Object> field : fields) {
String type = (String) field.get("type");
String name = (String) field.get("name");
String label = name;
if ("label".equals(type)) {
continue;
}
FormField formField = formFieldMap.get(name);
if (formField != null) {
continue;
}
formField = new FormField();
formField.setName(name);
formField.setLabel(label);
formField.setType(type);
formFieldMap.put(name, formField);
}
}
}
public void setAutoDeploy(boolean autoDeploy) {
this.autoDeploy = autoDeploy;
}
@Resource
public void setProcessConnector(ProcessConnector processConnector) {
this.processConnector = processConnector;
}
@Resource
public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) {
this.humanTaskConnector = humanTaskConnector;
}
@Resource
public void setTaskDefinitionConnector(
TaskDefinitionConnector taskDefinitionConnector) {
this.taskDefinitionConnector = taskDefinitionConnector;
}
@Resource
public void setFormConnector(FormConnector formConnector) {
this.formConnector = formConnector;
}
@Resource
public void setModelInfoManager(ModelInfoManager modelInfoManager) {
this.modelInfoManager = modelInfoManager;
}
@Resource
public void setModelFieldManager(ModelFieldManager modelFieldManager) {
this.modelFieldManager = modelFieldManager;
}
public void setDefaultTenantCode(String defaultTenantCode) {
this.defaultTenantCode = defaultTenantCode;
}
@Resource
public void setTenantConnector(TenantConnector tenantConnector) {
this.tenantConnector = tenantConnector;
}
}