/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.component.dynproperty; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.springframework.beans.factory.annotation.Autowired; import com.jinhe.tss.component.dynproperty.entity.DynableEntity; import com.jinhe.tss.component.dynproperty.entity.GridTemplate; import com.jinhe.tss.component.dynproperty.entity.PropertyDef; import com.jinhe.tss.component.dynproperty.entity.PropertyTab; import com.jinhe.tss.component.dynproperty.entity.XFormTemplate; import com.jinhe.tss.component.dynproperty.entity.XFormTemplateTab; import com.jinhe.tss.core.cachepool.CacheManager; import com.jinhe.tss.core.cachepool.Cacheable; import com.jinhe.tss.core.cachepool.IPool; import com.jinhe.tss.core.cachepool.strategy.CacheConstants; import com.jinhe.tss.core.exception.BusinessException; import com.jinhe.tss.core.persistence.IEntity; import com.jinhe.tss.core.util.BeanUtil; import com.jinhe.tss.core.util.XMLDocUtil; public class PropertyServiceImpl implements PropertyService { @Autowired private PropertyDao dao; public List<?> getDynableEntities(boolean isOnlyGroup) { if(isOnlyGroup) { return dao.getEntities("from DynableEntity o where o.entityCode is null order by o.id"); } List<?> entities = dao.getEntities("from DynableEntity o order by o.id"); List<?> properties = dao.getEntities("select o from PropertyDef o order by o.seqNo"); List<?> xformTemplates = dao.getEntities("from XFormTemplate o "); List<?> tabs = dao.getEntities("from XFormTemplateTab o "); List<?> gridTemplates = dao.getEntities("from GridTemplate o"); Map<String, DynableEntity> entityMap = new HashMap<String, DynableEntity>(); Map<Long, XFormTemplate> xformTemplateMap = new HashMap<Long, XFormTemplate>(); for(Iterator<?> it = entities.iterator(); it.hasNext(); ){ DynableEntity entity = (DynableEntity) it.next(); //判断是否是实体组 if(!entity.isGroup()){ entityMap.put(entity.getEntityCode(), entity); } } for(Iterator<?> it = properties.iterator(); it.hasNext(); ){ PropertyDef property = (PropertyDef) it.next(); ((DynableEntity)entityMap.get(property.getEntityCode())).getProperties().add(property); } for(Iterator<?> it = xformTemplates.iterator(); it.hasNext(); ){ XFormTemplate template = (XFormTemplate) it.next(); xformTemplateMap.put(template.getId(), template); ((DynableEntity)entityMap.get(template.getEntityCode())).getXformTemplates().add(template); } for(Iterator<?> it = gridTemplates.iterator(); it.hasNext(); ){ GridTemplate template = (GridTemplate) it.next(); ((DynableEntity)entityMap.get(template.getEntityCode())).getGridTemplates().add(template); } for(Iterator<?> it = tabs.iterator(); it.hasNext(); ){ XFormTemplateTab tab = (XFormTemplateTab) it.next(); ((XFormTemplate)xformTemplateMap.get(tab.getXformTemplateId())).getTabs().add(tab); } return entities; } public DynableEntity getGroupOrEntityById(Long id) { return (DynableEntity) dao.getEntity(DynableEntity.class, id); } public DynableEntity saveGroup(DynableEntity group) { if(group.getId() == null) group.setSeqNo(dao.getNextOrderByPId(group.getParentId())); return (DynableEntity) dao.create(group); } public void deleteGroupOrEntity(Long id) { DynableEntity obj = getGroupOrEntityById(id); if(obj.isGroup()){ List<?> sons = dao.getEntities("select o.id from DynableEntity o where o.parentId = ?", id); for(Iterator<?> it = sons.iterator(); it.hasNext();){ Long childId = (Long) it.next(); moveGroupOrEntity(childId, DynableEntity.DYN_ROOT_ID); } dao.delete(obj); } else { this.deleteDynableEntity(obj.getEntityCode()); } } public List<?> getCanMoveToGroups(Long id){ return dao.getEntities("from DynableEntity o where o.entityCode is null order by o.id"); } public void moveGroupOrEntity(Long id, Long targetId) { targetId = targetId == null ? DynableEntity.DYN_ROOT_ID : targetId; DynableEntity obj = getGroupOrEntityById(id); obj.setParentId(targetId); obj.setSeqNo(dao.getNextOrderByPId(targetId)); dao.moveGroupOrEntity(obj); } public PropertyDef getPropertyById(Long propertyId) { return (PropertyDef) dao.getEntity(PropertyDef.class, propertyId); } public PropertyDef saveProperty(PropertyDef property) { String entityCode = property.getEntityCode(); if(property.getId() == null){ //新增的都为动态属性,修改的有可能是基本属性 property.setIsdyn(new Integer(1)); List<?> entities = dao.getEntities("from PropertyDef o where o.key = ? and o.entityCode = ?", property.getKey(), entityCode); if(entities != null && entities.size() > 0) { throw new BusinessException("EntityCode为" + entityCode + "的实体下名为 " + property.getKey() + " 的动态属性已经存在,新增失败!"); } property.setSeqNo( dao.getNextSeqNo(entityCode) ); } return (PropertyDef) dao.create(property); } public void deleteProperty(Long id) { XFormTemplateTab tab; if((tab = checkPropertyInUse(id)) != null) throw new BusinessException("属性正被表单页:" + tab.getName() + " 使用中,删除失败!"); PropertyDef property = (PropertyDef) dao.loadEntity(PropertyDef.class, id); if(!property.isdyn()){ throw new BusinessException("属性为基本属性,非动态属性不能删除,删除失败!"); } dao.deleteAll(dao.getEntities("from PropertyEntry o where o.defId = ?", id)); dao.delete(property); } /** * 验证属性是否正备某个XForm模板引用到 * @param id * @return */ private XFormTemplateTab checkPropertyInUse(Long id){ List<?> list = dao.getEntities("from PropertyTab o where o.id.defId = ? ", id); if(!list.isEmpty()){ PropertyTab pt = (PropertyTab) list.get(0); return (XFormTemplateTab) dao.getEntity(XFormTemplateTab.class, pt.getId().getTabId()); } return null; } public PropertyDef copyProperty(Long id) { PropertyDef property = (PropertyDef) dao.loadEntity(PropertyDef.class, id); dao.evict(property); property.setId(null); property.setIsdyn(new Integer(1)); property.setKey("Copy_" + property.getKey()); return saveProperty(property); } public PropertyDef copyPropertyTo(Long id, Long targetId) { PropertyDef property = (PropertyDef) dao.loadEntity(PropertyDef.class, id); DynableEntity entity = (DynableEntity) dao.loadEntity(DynableEntity.class, targetId); dao.evict(property); property.setId(null); property.setIsdyn(new Integer(1)); property.setEntityCode(entity.getEntityCode()); property.setEntityName(entity.getName()); return saveProperty(property); } public void sortProperty(Long propertyId, Long targetId, int direction) { PropertyDef sourceItem = (PropertyDef) dao.getEntity(PropertyDef.class, propertyId); PropertyDef targetItem = (PropertyDef) dao.getEntity(PropertyDef.class, targetId); if(targetItem == null) throw new BusinessException("只能在属性之间进行排序"); Integer seqNo1 = sourceItem.getSeqNo(); Integer seqNo2 = targetItem.getSeqNo(); int tag = seqNo1.compareTo(seqNo2) < 0 ? 1 : -1; String hql = "from PropertyDef o where o.entityCode = ? and o.seqNo > ? and o.seqNo < ?"; String entityCode = sourceItem.getEntityCode(); List<?> list = dao.getEntities(hql, seqNo1.compareTo(seqNo2) > 0 ? new Object[] {entityCode, seqNo2, seqNo1 } : new Object[] { entityCode, seqNo1, seqNo2 }); for (Iterator<?> it = list.iterator(); it.hasNext();) { PropertyDef item = (PropertyDef) it.next(); item.setSeqNo(item.getSeqNo() - tag); } sourceItem.setSeqNo(seqNo2 + (direction - tag) / 2); targetItem.setSeqNo(seqNo2 - (direction + tag) / 2); dao.create(sourceItem); } public void saveXForm(String layoutStr){ Element formsNode = (Element) XMLDocUtil.dataXml2Doc(layoutStr).selectSingleNode("//forms"); String entityCode = formsNode.attributeValue("entityCode"); String xCode = formsNode.attributeValue("code"); XFormTemplate template = getXFormTemplateByCodeNoCache(entityCode, xCode); dao.evict(template); Element firstLayoutNode = (Element)formsNode.selectSingleNode("//layout"); Long firstTabId = Long.valueOf(firstLayoutNode.attributeValue("id")); List<?> properties = dao.getEntities("from PropertyDef o where o.entityCode = ?", entityCode); Map<String, PropertyDef> propertiesMap = new HashMap<String, PropertyDef>(); List<Long> hiddenProperties = new ArrayList<Long>(); for(Iterator<?> iter = properties.iterator(); iter.hasNext(); ){ PropertyDef property = (PropertyDef) iter.next(); // 如果是隐藏属性,则先将其Id存放起来 if(property.isHidden()) hiddenProperties.add(property.getId()); propertiesMap.put(property.getKey(), property); } template.getTabs().clear(); for(Iterator<?> it = formsNode.elementIterator("layout"); it.hasNext();){ Element layoutNode = (Element)it.next(); Long tabId = Long.valueOf(layoutNode.attributeValue("id")); XFormTemplateTab tab = (XFormTemplateTab) dao.getEntity(XFormTemplateTab.class, tabId); dao.evict(tab); StringBuffer layout = new StringBuffer(); for(Iterator<?> iter = layoutNode.elementIterator(); iter.hasNext();){ Element temp = (Element)iter.next(); layout.append("\n").append(temp == null ? "" : temp.asXML()); } tab.setLayout(layout.toString()); //根据生成的layout设置每个属性具体为哪个tab所用 Document doc = XMLDocUtil.dataXml2Doc("<layout>" + layout.toString() + "</layout>"); List<?> list = doc.selectNodes("//layout/*/*/label"); for(Iterator<?> iter = list.iterator(); iter.hasNext(); ){ Element element = (Element) iter.next(); String key = element.attributeValue("binding"); PropertyDef property = (PropertyDef) propertiesMap.get(key); tab.getPropertyIds().add(property.getId()); } //将隐藏属性全部放到第一个tab中(非查询表单) if(tabId.equals(firstTabId) && "0".equals(template.getIsQueryForm())){ tab.getPropertyIds().addAll(hiddenProperties); } template.getTabs().add(tab); } saveXFormTemplate(template); } public XFormTemplate saveXFormTemplate(XFormTemplate xTemplate) { if(!xTemplate.getTabs().isEmpty()){ for(Iterator<?> it = xTemplate.getTabs().iterator(); it.hasNext();){ saveXFormTemplateTab((XFormTemplateTab) it.next(), xTemplate.getEntityCode()); } } xTemplate = (XFormTemplate) dao.create(xTemplate); //更新缓存 String key = xTemplate.getEntityCode() + "_" + xTemplate.getCode(); CacheManager.getInstance().getCachePool(CacheConstants.XFORM_TEMPLATE_POOL).putObject(key, xTemplate); return xTemplate; } public XFormTemplateTab saveXFormTemplateTab(XFormTemplateTab tab, String entityCode) { //如果tab已经在数据库中存在,则先删除PropertyTab表中该tab页对应property的记录 if(tab.getId() != null){ dao.deleteAll( dao.getEntities("from PropertyTab o where o.id.tabId = ? ", tab.getId()) ); dao.flush(); } else { tab.setSeqNo(dao.getTabNextSeqNo(tab.getXformTemplateId())); } tab = (XFormTemplateTab) dao.create(tab); List<Long> propertyIds = tab.getPropertyIds(); if(!propertyIds.isEmpty()){ //将PropertyTab 表补齐 //有这样的可能,属性在tab页布局中,但是属性已经被设置为了隐藏,这样的会导致propertyIds中有重复的值 //用HashSet来消除重复的值。 Collection<Long> c = new HashSet<Long>(propertyIds); for(Long propertyId : c){ PropertyTab pt = new PropertyTab(); pt.getId().setTabId(tab.getId()); pt.getId().setDefId(propertyId); dao.create(pt); } //生成declare节点 List<?> properties = dao.getEntities("from PropertyDef t where t.id in (:propertyIds)", new Object[]{"propertyIds"}, new Object[]{propertyIds.toArray()}); StringBuffer sb = new StringBuffer("<xform>"); DynableEntity entity = getDynableEntity(entityCode); String className = entity.getClassName(); sb.append("<declare prefix=\"" + className.substring(className.lastIndexOf(".") + 1).toLowerCase() + "\">"); for(Iterator<?> iter = properties.iterator(); iter.hasNext();){ PropertyDef property = (PropertyDef) iter.next(); sb.append("\n").append(property.genColumn()); } sb.append("\n").append("</declare>"); //declare和layout一起保存到了layout字段里(一张表只能有一个Long字段) tab.setLayout(sb.append("<layout>").append(tab.getLayout()).append("</layout></xform>").toString()); } return tab; } public XFormTemplateTab saveXFormTemplateTab(XFormTemplateTab tab) { tab = (XFormTemplateTab) dao.create(tab); return tab; } public void deleteXFormTemplate(Long xTemplateId) { XFormTemplate template = (XFormTemplate) dao.getEntity(XFormTemplate.class, xTemplateId); List<?> tabIds = dao.getEntities("select o.id from XFormTemplateTab o where o.xformTemplateId = ?", template.getId()); for(Iterator<?> it = tabIds.iterator(); it.hasNext();){ deleteXFormTemplateTab((Long) it.next()); } dao.delete(template); } @SuppressWarnings("unchecked") public void deleteXFormTemplateTab(Long tabId) { XFormTemplateTab tab = (XFormTemplateTab) dao.getEntity(XFormTemplateTab.class, tabId); List<?> relations = dao.getEntities("from PropertyTab o where o.id.tabId = ? ", tab.getId()); dao.deleteAll((Collection<IEntity>) relations); dao.delete(tab); } public Object[] getXFormTempalteInfo(String entityCode, String xCode) { XFormTemplate xformTemplate = getXFormTemplateByCodeNoCache(entityCode, xCode); List<?> tabs = dao.getEntities("from XFormTemplateTab o where o.xformTemplateId = ? ", xformTemplate.getId()); dao.evict(xformTemplate); for(Iterator<?> it = tabs.iterator(); it.hasNext();){ dao.evict((XFormTemplateTab) it.next()); } return new Object[]{tabs, getProperties(entityCode, false), xformTemplate}; } public GridTemplate saveGridTemplate(GridTemplate gTemplate) { gTemplate = (GridTemplate) dao.create(gTemplate); //更新缓存 String key = gTemplate.getEntityCode() + "_" + gTemplate.getCode(); CacheManager.getInstance().getCachePool(CacheConstants.GRID_TEMPLATE_POOL).putObject(key, gTemplate); return gTemplate; } public void deleteGridTemplate(Long gTemplateId) { dao.delete(GridTemplate.class, gTemplateId); } public String getGridTemplateInfo(String entityCode, String gCode) { List<?> properties = getProperties(entityCode, false); StringBuffer sb = new StringBuffer("<declare>"); for(Iterator<?> it = properties.iterator(); it.hasNext(); ){ PropertyDef property = (PropertyDef) it.next(); if(property.isSpare()) continue; sb.append("\n").append("<column name=\"").append(property.getKey()).append("\" caption=\"").append(property.getName()); sb.append("\" mode=\"string\" editable=\"false\" align=\"center\""); if(property.getEditor().equals("2")) { sb.append(property.genEditor()); } if(property.isHidden()) { sb.append(" display=\"none\" "); } sb.append("/>"); } return sb.append("\n").append("</declare><data/>").toString(); } public void importDynableEntity(String docXmlStr) { importDynableEntity(docXmlStr, DynableEntity.DYN_ROOT_ID); } public void importDynableEntity(String docXmlStr, Long groupId) { Element classNode = (Element) XMLDocUtil.dataXml2Doc(docXmlStr).selectSingleNode("/class"); String entityCode = classNode.attributeValue("code"); DynableEntity entity = new DynableEntity(); entity.setEntityCode(entityCode); entity.setParentId(groupId); entity.setName(classNode.attributeValue("name")); entity.setClassName(classNode.attributeValue("className")); entity.setSeqNo(dao.getNextOrderByPId(entity.getParentId())); List<?> list = dao.getEntities("from DynableEntity o where o.entityCode = ?", entityCode); if(list != null && list.size() > 0) throw new BusinessException("相同实体代码的类型已经存在,请修改code后再保存。"); entity = (DynableEntity) dao.create(entity); List<?> propertyNodes = classNode.selectNodes("//properties/property"); for(Iterator<?> it = propertyNodes.iterator(); it.hasNext();){ createPropertyDef(entityCode, entity, (Element)it.next()); //导入属性定义 } List<?> spareProptertyNodes = XMLDocUtil.createDoc(DynConstants.SPARE_PROPERTIES) .selectSingleNode(DynConstants.SPARE_NODE_NAME).selectNodes("//properties/property"); for(Iterator<?> it = spareProptertyNodes.iterator(); it.hasNext();){ createPropertyDef(entityCode, entity, (Element)it.next()); //导入备用属性定义 } Element xformTemplatesNode = (Element) classNode.selectSingleNode("//xformTemplates"); for(Iterator<?> it = xformTemplatesNode.elementIterator("xformTemplate"); it.hasNext();){ createXFormTemplate(entityCode, (Element)it.next()); //导入XFrom模板 } Element gridTemplatesNode = (Element) classNode.selectSingleNode("//gridTemplates"); for(Iterator<?> it = gridTemplatesNode.elementIterator("gridTemplate"); it.hasNext();){ createGridTemplate(entityCode, (Element)it.next()); //导入grid模板 } } private void createGridTemplate(String entityCode, Element gridTemplateNode) { GridTemplate grid = new GridTemplate(); BeanUtil.setDataToBean(grid, XMLDocUtil.dataNode2Map(gridTemplateNode)); grid.setEntityCode(entityCode); String defaultTemplatePath = gridTemplateNode.attributeValue("defaultTemplatePath"); if(defaultTemplatePath != null) grid.setDeclare(XMLDocUtil.createDoc(defaultTemplatePath).selectSingleNode("//grid/declare").asXML()); dao.create(grid); } private void createXFormTemplate(String entityCode, Element xformTemplateNode) { XFormTemplate xform = new XFormTemplate(); BeanUtil.setDataToBean(xform, XMLDocUtil.dataNode2Map(xformTemplateNode)); xform.setEntityCode(entityCode); xform = (XFormTemplate) dao.create(xform); for(Iterator<?> iter = xformTemplateNode.elementIterator("tab"); iter.hasNext();){ Element tabNode = (Element)iter.next(); XFormTemplateTab tab = new XFormTemplateTab(); BeanUtil.setDataToBean(tab, XMLDocUtil.dataNodes2Map(tabNode)); tab.setXformTemplateId(xform.getId()); String defaultTemplatePath = tabNode.attributeValue("defaultTemplatePath"); if(defaultTemplatePath != null) tab.setLayout(XMLDocUtil.createDoc(defaultTemplatePath).getRootElement().asXML()); dao.create(tab); } } private void createPropertyDef(String entityCode, DynableEntity entity, Element propertyNode) { PropertyDef property = new PropertyDef(); BeanUtil.setDataToBean(property, XMLDocUtil.dataNodes2Map(propertyNode)); property.setEntityCode(entityCode); property.setEntityName(entity.getClassName()); property.setIsdyn(new Integer(0)); if(property.getKey().startsWith("spare")){ property.setIsSpare(new Integer(1)); } property.setSeqNo(dao.getNextSeqNo(entityCode)); dao.create(property); } public void deleteDynableEntity(String entityCode) { DynableEntity entity = getDynableEntity(entityCode); List<?> properties = getProperties(entityCode, false); for(Iterator<?> it = properties.iterator(); it.hasNext(); ){ PropertyDef property = (PropertyDef) it.next(); //如果是动态属性,则先删除动态属性值 if(property.isdyn()){ dao.deleteAll(dao.getEntities("from PropertyEntry o where o.defId = ?", property.getId())); } } List<?> tabIds = dao.getEntities("select o.id from XFormTemplateTab o, XFormTemplate t " + " where o.xformTemplateId = t.id and t.entityCode = ? ", entityCode); for(Iterator<?> it = tabIds.iterator(); it.hasNext();){ deleteXFormTemplateTab((Long) it.next()); } dao.deleteAll(dao.getEntities("from GridTemplate o where o.entityCode = ? ", entityCode)); dao.deleteAll(dao.getEntities("from XFormTemplate o where o.entityCode = ? ", entityCode)); dao.deleteAll(properties); dao.delete(entity); } public void copyDynableEntity(String entityCode, String newEntityCode) { DynableEntity entity = getDynableEntity(entityCode); dao.evict(entity); entity.setId(null); entity.setEntityCode(newEntityCode); entity.setName("副本_" + entity.getName()); entity = (DynableEntity) dao.create(entity); List<PropertyDef> properties = getProperties(entityCode, false); Map<Long, Long> old2new = new HashMap<Long, Long>(); for(PropertyDef property : properties){ Long oldPropertyId = property.getId(); dao.evict(property); property.setId(null); property.setEntityCode(newEntityCode); property = (PropertyDef) dao.create(property); old2new.put(oldPropertyId, property.getId()); } // 复制模板信息 List<?> list = dao.getEntities("from XFormTemplate o where o.entityCode = ? ", entityCode); for(Iterator<?> it = list.iterator();it.hasNext();){ XFormTemplate template = (XFormTemplate) it.next(); List<?> tabs = dao.getEntities("from XFormTemplateTab o where o.xformTemplateId = ? ", template.getId()); dao.evict(template); template.setId(null); template.setEntityCode(newEntityCode); template = (XFormTemplate) dao.create(template); for(Iterator<?> ite = tabs.iterator();ite.hasNext();){ XFormTemplateTab tab = (XFormTemplateTab) ite.next(); List<?> relations = dao.getEntities("from PropertyTab o where o.id.tabId = ? ", tab.getId()); dao.evict(tab); tab.setId(null); tab.setXformTemplateId(template.getId()); tab = (XFormTemplateTab) dao.create(tab); for(Iterator<?> iter = relations.iterator();iter.hasNext();){ PropertyTab pt = (PropertyTab) it.next(); pt.getId().setTabId(tab.getId()); pt.getId().setDefId((Long) old2new.get(pt.getId().getDefId())); dao.create(pt); } } } list = dao.getEntities("from GridTemplate o where o.entityCode = ? ", entityCode); for(Iterator<?> it = list.iterator();it.hasNext();){ GridTemplate template = (GridTemplate) it.next(); dao.evict(template); template.setId(null); template.setEntityCode(newEntityCode); dao.create(template); } } public void updateDynableEntityName(String entityCode, String newName) { DynableEntity entity = getDynableEntity(entityCode); entity.setName(newName); dao.create(entity); } public Map<String, String> getXFormTemplate(String entityCode, String xCode) { //(远程) XFormTemplate template = getXFormTemplateByCode(entityCode, xCode); List<?> tabs = dao.getEntities("from XFormTemplateTab o where o.xformTemplateId = ?", template.getId()); Map<String, String> tabsMap = new HashMap<String, String>(); for(Iterator<?> it = tabs.iterator(); it.hasNext();){ StringBuffer sb = new StringBuffer(); XFormTemplateTab tab = (XFormTemplateTab) it.next(); sb.append("<xform>").append(tab.getDeclare()).append("<layout>").append(tab.getLayoutOnly()).append("</layout><data "); List<?> properties = dao.getEntities("select p from PropertyDef p, PropertyTab o " + "where p.id = o.id.defId and o.id.tabId = ? ", tab.getId()); Map<String, Object> defaultValues = new HashMap<String, Object>(); for(Iterator<?> iter = properties.iterator(); iter.hasNext();){ PropertyDef property = (PropertyDef) iter.next(); //将动态属性特殊放入data节点,以利于提交数据时可以设置到AbstractDynEntity.dynpropertiesMap中 if(property.isdyn()){ sb.append(property.getKey()).append("=\"").append(property.genDynKey()).append("\" "); } //如果属性有默认值,则加载 if(property.getDefaultValue() != null){ defaultValues.put(property.getKey(), property.getDefaultValue()); } } sb.append(">").append(XMLDocUtil.map2DataNode(defaultValues, "row").asXML()).append("</data></xform>"); tabsMap.put(tab.getCode(), sb.toString()); } return tabsMap; } public String getGridTemplate(String entityCode, String gCode) { //(远程) GridTemplate template = getGridTemplateByCode(entityCode, gCode); if(template.getDeclare() == null){ List<?> properties = getProperties(entityCode, false); StringBuffer sb = new StringBuffer("<declare>"); for(Iterator<?> it = properties.iterator(); it.hasNext(); ){ PropertyDef property = (PropertyDef) it.next(); if(property.isSpare()) continue; sb.append("\n").append("<column name=\"").append(property.getKey()); sb.append("\" caption=\"").append(property.getName()); sb.append("\" mode=\"string\" editable=\"false\" align=\"center\""); if(property.getEditor().equals("2"))//2为下拉列表 sb.append(property.genEditor()); if(property.isHidden()) sb.append(" display=\"none\" "); sb.append("/>"); } template.setDeclare(sb.append("\n").append("</declare>").toString()); } return "<grid version=\"2\">" + template.getDeclare() + "<data/></grid>"; } @SuppressWarnings("unchecked") public List<PropertyDef> getProperties(String entityCode, boolean isOnlyDyn) { String hql = "from PropertyDef o where o.entityCode = ?" + (isOnlyDyn ? " and o.isdyn = 1 " : "") + " order by o.seqNo"; return (List<PropertyDef>) dao.getEntities(hql, entityCode); } public void copyProperties(String[] ids, String entityCode) { for(int i = 0; i < ids.length; i++){ PropertyDef def = (PropertyDef) dao.getEntity(PropertyDef.class, Long.valueOf(ids[i])); dao.evict(def); def.setId(null); def.setIsdyn(new Integer(1)); def.setEntityCode(entityCode); saveProperty(def); } } /** * 根据code值获取对应的动态实体对象 * @param entityCode * @return */ public DynableEntity getDynableEntity(String entityCode) throws BusinessException{ List<?> list = dao.getEntities("from DynableEntity o where o.entityCode = ?", entityCode); if(list.size() == 0) { throw new BusinessException("实体代码有误,找不到相应动态属性实体。"); } return (DynableEntity)list.get(0); } /** * 根据动态实体的code值和XForm模板的code值获取对象XForm模板 * @param entityCode * @param xCode * @return */ public XFormTemplate getXFormTemplateByCode(String entityCode, String xCode) throws BusinessException{ IPool pool = CacheManager.getInstance().getCachePool(CacheConstants.XFORM_TEMPLATE_POOL); String key = entityCode + "_" + xCode; Cacheable item = pool.getObject(key); if(item != null) { return (XFormTemplate) item.getValue(); } XFormTemplate template = getXFormTemplateByCodeNoCache(entityCode, xCode); pool.putObject(key, template); return template; } private XFormTemplate getXFormTemplateByCodeNoCache(String entityCode, String xCode) throws BusinessException{ List<?> list = dao.getEntities("from XFormTemplate o where o.entityCode = ? and o.code = ? ", entityCode, xCode); if(list.isEmpty()) { throw new BusinessException("根据(entityCode:" + entityCode + ",code:" + xCode + ")找不到相应的xform模板," + "请检查两code值是否有误,或者模板是否已经生成!"); } return (XFormTemplate) list.get(0); } /** * 根据动态实体的code值和Grid模板的code值获取对象Grid模板 * @param entityCode * @param gCode * @return * @throws BusinessException */ public GridTemplate getGridTemplateByCode(String entityCode, String gCode) throws BusinessException{ IPool pool = CacheManager.getInstance().getCachePool(CacheConstants.GRID_TEMPLATE_POOL); String key = entityCode + "_" + gCode; Cacheable item = pool.getObject(key); if(item != null) { return (GridTemplate) item.getValue(); } List<?> list = dao.getEntities("from GridTemplate o where o.entityCode = ? and o.code = ? ", entityCode, gCode); if(list.isEmpty()) { throw new BusinessException("根据(entityCode:" + entityCode + ",code:" + gCode + ")找不到相应的grid模板," + "请检查两code值是否有误,或者模板是否已经生成!"); } GridTemplate template = (GridTemplate) list.get(0); pool.putObject(key, template); return template; } public Object getEntity(Class<?> clazz, Long id) { return dao.getEntity(clazz, id); } }