package com.mossle.xform; import java.util.HashMap; import java.util.List; import java.util.Map; import com.mossle.api.keyvalue.Prop; import com.mossle.api.keyvalue.Record; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.api.user.UserConnector; import com.mossle.api.user.UserDTO; import com.mossle.core.mapper.JsonMapper; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class XformBuilder { private static Logger logger = LoggerFactory.getLogger(XformBuilder.class); private Xform xform = new Xform(); private JsonMapper jsonMapper = new JsonMapper(); private StoreConnector storeConnector; private UserConnector userConnector; public XformBuilder setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; return this; } public XformBuilder setUserConnector(UserConnector userConnector) { this.userConnector = userConnector; return this; } public XformBuilder setContent(String content) { xform.setContent(content); logger.debug("content : {}", content); try { this.handleStructure(); } catch (Exception ex) { logger.error(ex.getMessage(), ex); } return this; } public XformBuilder setRecord(Record record) throws Exception { if (record == null) { logger.info("record is null"); return this; } for (Prop prop : record.getProps().values()) { String name = prop.getCode(); String value = prop.getValue(); XformField xformField = xform.findXformField(name); if (xformField == null) { continue; } String type = xformField.getType(); if ("fileupload".equals(type)) { StoreDTO storeDto = storeConnector.getStore("form", value, record.getTenantId()); xformField.setValue(storeDto.getKey()); xformField.setContentType(storeDto.getDataSource() .getContentType()); xformField.setLabel(storeDto.getDisplayName()); } else if ("userpicker".equals(type)) { xformField.setValue(value); StringBuilder buff = new StringBuilder(); for (String userId : value.split(",")) { if (StringUtils.isBlank(userId)) { continue; } UserDTO userDto = userConnector.findById(userId); if (userDto == null) { continue; } buff.append(userDto.getDisplayName()).append(","); } if (buff.length() > 0) { buff.deleteCharAt(buff.length() - 1); } xformField.setLabel(buff.toString()); } else { xformField.setValue(value); } } return this; } public Xform build() { return xform; } public void handleStructure() throws Exception { if (xform.getContent() == null) { logger.info("cannot find xform content"); return; } Map map = jsonMapper.fromJson(xform.getContent(), Map.class); logger.debug("map : {}", map); if (map == null) { logger.info("cannot find map"); return; } List<Map> sections = (List<Map>) map.get("sections"); logger.debug("sections : {}", sections); Map<String, String> formTypeMap = new HashMap<String, String>(); for (Map section : sections) { if (!"grid".equals(section.get("type"))) { continue; } List<Map> fields = (List<Map>) section.get("fields"); for (Map field : fields) { this.handleField(field); } } } public void handleField(Map map) { XformField xformField = new XformField(); xformField.setName((String) map.get("name")); xformField.setType((String) map.get("type")); xform.addXformField(xformField); } }