package com.mossle.android.rs;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.mossle.api.form.FormDTO;
import com.mossle.api.humantask.HumanTaskConnector;
import com.mossle.api.humantask.HumanTaskDTO;
import com.mossle.api.keyvalue.KeyValueConnector;
import com.mossle.api.keyvalue.Record;
import com.mossle.api.process.ProcessConnector;
import com.mossle.api.store.StoreConnector;
import com.mossle.api.tenant.TenantHolder;
import com.mossle.bpm.persistence.manager.BpmProcessManager;
import com.mossle.core.auth.CurrentUserHolder;
import com.mossle.core.mapper.JsonMapper;
import com.mossle.model.support.FormField;
import com.mossle.pim.persistence.manager.PimDeviceManager;
import com.mossle.xform.Xform;
import com.mossle.xform.XformBuilder;
import org.activiti.engine.ProcessEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
@Path("android/form")
public class AndroidFormResource {
private static Logger logger = LoggerFactory
.getLogger(AndroidFormResource.class);
private JsonMapper jsonMapper = new JsonMapper();
private ProcessEngine processEngine;
private BpmProcessManager bpmProcessManager;
private CurrentUserHolder currentUserHolder;
private TenantHolder tenantHolder;
private PimDeviceManager pimDeviceManager;
private ProcessConnector processConnector;
private HumanTaskConnector humanTaskConnector;
private KeyValueConnector keyValueConnector;
private StoreConnector storeConnector;
@POST
@Path("viewStartForm")
@Produces(MediaType.APPLICATION_JSON)
public String viewStartForm(
@FormParam("processDefinitionId") String processDefinitionId)
throws Exception {
logger.info("start : {}", processDefinitionId);
FormDTO formDto = processConnector.findStartForm(processDefinitionId);
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");
List<FormField> formFields = new ArrayList<FormField>();
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 items = (String) field.get("items");
String label = name;
Boolean readOnly = (Boolean) field.get("readOnly");
if (readOnly == null) {
readOnly = false;
}
if ("label".equals(type)) {
continue;
}
FormField formField = null;
formField = new FormField();
formField.setName(name);
formField.setLabel(label);
formField.setType(type);
formField.setItems(items);
formField.setReadOnly(readOnly);
formFields.add(formField);
}
}
StringBuilder buff = new StringBuilder();
buff.append("<xmlgui>")
.append("<form id='1' name='form' submitTo='http://192.168.1.106:8080/mossle-app-lemon/rs/android/bpm/startProcess' >");
// .append("<field name='fname' label='First Name' type='text' required='Y' options=''/>")
// .append("<field name='lname' label='Last Name' type='text' required='Y' options=''/>")
// .append("<field name='gender' label='Gender' type='choice' required='Y' options='Male|Female'/>")
// .append("<field name='age' label='Age on 15 Oct. 2010' type='numeric' required='N' options=''/>")
for (FormField formField : formFields) {
String type = "text";
String options = "";
if ("radio".equals(formField.getType())
|| "checkbox".equals(formField.getType())
|| "select".equals(formField.getType())) {
type = "choice";
options = formField.getItems().replaceAll(",", "|");
} else if ("datepicker".equals(formField.getType())) {
type = "datepicker";
}
buff.append("<field name='" + formField.getName() + "'");
buff.append(" label='" + formField.getName() + "'");
buff.append(" type='" + type + "'");
buff.append(" required='" + (formField.isReadOnly() ? "N" : "Y")
+ "'");
buff.append(" readOnly='" + (formField.isReadOnly() ? "Y" : "N")
+ "'");
buff.append(" options='" + options + "'/>");
}
buff.append("</form>").append("</xmlgui>");
return buff.toString();
}
@POST
@Path("viewTaskForm")
@Produces(MediaType.APPLICATION_JSON)
public String viewTaskForm(@FormParam("taskId") String taskId)
throws Exception {
logger.info("start : {}", taskId);
HumanTaskDTO humanTaskDto = humanTaskConnector.findHumanTask(taskId);
if (humanTaskDto == null) {
return "";
}
FormDTO formDto = this.findTaskForm(humanTaskDto);
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");
List<FormField> formFields = new ArrayList<FormField>();
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 items = (String) field.get("items");
String label = name;
Boolean readOnly = (Boolean) field.get("readOnly");
if (readOnly == null) {
readOnly = false;
}
if ("complete".equals(humanTaskDto.getStatus())) {
readOnly = true;
}
if ("label".equals(type)) {
continue;
}
FormField formField = null;
formField = new FormField();
formField.setName(name);
formField.setLabel(label);
formField.setType(type);
formField.setItems(items);
formField.setReadOnly(readOnly);
formFields.add(formField);
}
}
// 如果是任务草稿,直接通过processInstanceId获得record,更新数据
// TODO: 分支肯定有问题
String processInstanceId = humanTaskDto.getProcessInstanceId();
Record record = keyValueConnector.findByRef(processInstanceId);
Xform xform = new XformBuilder().setStoreConnector(storeConnector)
.setContent(formDto.getContent()).setRecord(record).build();
StringBuilder buff = new StringBuilder();
buff.append("<xmlgui>")
.append("<form id='1' name='form' submitTo='http://192.168.1.106:8080/mossle-app-lemon/rs/android/task/completeTask'")
.append(" readOnly='")
.append("complete".equals(humanTaskDto.getStatus()))
.append("'").append(" >");
// .append("<field name='fname' label='First Name' type='text' required='Y' options=''/>")
// .append("<field name='lname' label='Last Name' type='text' required='Y' options=''/>")
// .append("<field name='gender' label='Gender' type='choice' required='Y' options='Male|Female'/>")
// .append("<field name='age' label='Age on 15 Oct. 2010' type='numeric' required='N' options=''/>")
for (FormField formField : formFields) {
String name = formField.getName();
String type = "text";
String options = "";
String value = "";
try {
if (xform.findXformField(name).getValue() != null) {
value = xform.findXformField(name).getValue().toString();
}
} catch (Exception ex) {
ex.printStackTrace();
}
if ("radio".equals(formField.getType())
|| "checkbox".equals(formField.getType())) {
type = "choice";
options = formField.getItems().replaceAll(",", "|");
}
buff.append("<field name='" + formField.getName() + "'");
buff.append(" label='" + formField.getName() + "'");
buff.append(" type='" + type + "'");
buff.append(" required='" + (formField.isReadOnly() ? "N" : "Y")
+ "'");
buff.append(" readOnly='" + (formField.isReadOnly() ? "Y" : "N")
+ "'");
buff.append(" options='" + options + "'");
buff.append(" value='" + value + "'/>");
}
buff.append("</form>").append("</xmlgui>");
logger.info("{}", buff);
return buff.toString();
}
public FormDTO findTaskForm(HumanTaskDTO humanTaskDto) {
FormDTO formDto = humanTaskConnector.findTaskForm(humanTaskDto.getId());
return formDto;
}
// ~ ======================================================================
@Resource
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
@Resource
public void setBpmProcessManager(BpmProcessManager bpmProcessManager) {
this.bpmProcessManager = bpmProcessManager;
}
@Resource
public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) {
this.currentUserHolder = currentUserHolder;
}
@Resource
public void setTenantHolder(TenantHolder tenantHolder) {
this.tenantHolder = tenantHolder;
}
@Resource
public void setPimDeviceManager(PimDeviceManager pimDeviceManager) {
this.pimDeviceManager = pimDeviceManager;
}
@Resource
public void setProcessConnector(ProcessConnector processConnector) {
this.processConnector = processConnector;
}
@Resource
public void setHumanTaskConnector(HumanTaskConnector humanTaskConnector) {
this.humanTaskConnector = humanTaskConnector;
}
@Resource
public void setKeyValueConnector(KeyValueConnector keyValueConnector) {
this.keyValueConnector = keyValueConnector;
}
@Resource
public void setStoreConnector(StoreConnector storeConnector) {
this.storeConnector = storeConnector;
}
}