/* ==================================================================
* 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.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
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.XFormTemplate;
import com.jinhe.tss.component.dynproperty.entity.XFormTemplateTab;
import com.jinhe.tss.component.support.web.webwork.PTActionSupport;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.web.dispaly.tree.ITreeTranslator;
import com.jinhe.tss.core.web.dispaly.tree.LevelTreeParser;
import com.jinhe.tss.core.web.dispaly.tree.TreeEncoder;
import com.jinhe.tss.core.web.dispaly.tree.TreeNode;
import com.jinhe.tss.core.web.dispaly.xform.IXForm;
import com.jinhe.tss.core.web.dispaly.xform.XFormEncoder;
public class PropertyAction extends PTActionSupport {
private static final long serialVersionUID = -3331309268490849846L;
private Long id;
private Long parentId;
private Long targetId;
private int direction;
private String entityCode;
private String entityName;
private PropertyDef property = new PropertyDef();
private DynableEntity entity = new DynableEntity();
private File file;
private XFormTemplate xTemplate = new XFormTemplate();
private XFormTemplateTab tab = new XFormTemplateTab();
private GridTemplate gTemplate = new GridTemplate();
private String code;
private int type; //1: 动态实体组 2: 动态实体 3:属性 4:GridTemplate 5:XFormTemplate 6:XFormTemplateTab
private PropertyService service;
/*****************************************************************************************************
*************************************** 基本的增删该维护 ******************************************
******************************************************************************************************/
public String getObjectInfo(){
XFormEncoder encoder = null;
type = (type == 0 ? 3 : type);
switch(type){
case DynConstants.GROUP_TYPE:
case DynConstants.ENTITY_TYPE:
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
map.put("parentId", parentId == null ? new Long(0) : parentId);
encoder = new XFormEncoder(DynConstants.DYN_ENTITY_XFORM_TEMPLET_PATH, map);
} else {
DynableEntity group = service.getGroupOrEntityById(id);
encoder = new XFormEncoder(DynConstants.DYN_ENTITY_XFORM_TEMPLET_PATH, (IXForm) group);
}
return print("TreeInfo", encoder);
case DynConstants.PROPERTY_TYPE:
return getPropertyInfo();
case DynConstants.GRID_TEMPLATE_TYPE:
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
DynableEntity entity = (DynableEntity) service.getEntity(DynableEntity.class, parentId);
map.put("entityCode", entity.getEntityCode());
encoder = new XFormEncoder(DynConstants.GRID_XFORM_TEMPLET_PATH, map);
}else{
GridTemplate gTemplate = (GridTemplate) service.getEntity(GridTemplate.class, id);
encoder = new XFormEncoder(DynConstants.GRID_XFORM_TEMPLET_PATH, (IXForm) gTemplate);
}
return print("TreeInfo", encoder);
case DynConstants.XFORM_TEMPLATE_TYPE:
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
DynableEntity entity = (DynableEntity) service.getEntity(DynableEntity.class, parentId);
map.put("entityCode", entity.getEntityCode());
encoder = new XFormEncoder(DynConstants.XFORM_XFORM_TEMPLET_PATH, map);
}else{
XFormTemplate xTemplate = (XFormTemplate) service.getEntity(XFormTemplate.class, id);
encoder = new XFormEncoder(DynConstants.XFORM_XFORM_TEMPLET_PATH, (IXForm) xTemplate);
}
return print("TreeInfo", encoder);
case DynConstants.TAB_TYPE:
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
map.put("xformTemplateId", parentId);
encoder = new XFormEncoder(DynConstants.TAB_XFORM_TEMPLET_PATH, map);
}else{
XFormTemplateTab tab = (XFormTemplateTab) service.getEntity(XFormTemplateTab.class, id);
encoder = new XFormEncoder(DynConstants.TAB_XFORM_TEMPLET_PATH, (IXForm) tab);
}
return print("TreeInfo", encoder);
}
return XML;
}
public String saveObject(){
boolean isNew = false;
type = (type == 0 ? 3 : type);
switch(type){
case DynConstants.GROUP_TYPE:
isNew = entity.getId() == null ? true : false;
entity = service.saveGroup(entity);
return doAfterSave(isNew, entity, "DynamicPropertyTree");
//case DynConstants.ENTITY_TYPE: never 出现,动态实体只能通过导入的方式新增
case DynConstants.PROPERTY_TYPE:
return saveProperty();
case DynConstants.GRID_TEMPLATE_TYPE:
isNew = gTemplate.getId() == null ? true : false;
gTemplate = service.saveGridTemplate(gTemplate); //新增或修改一个Grid模板,只有code,name两项内容
return doAfterSave(isNew, gTemplate, "DynamicPropertyTree");
case DynConstants.XFORM_TEMPLATE_TYPE:
isNew = xTemplate.getId() == null ? true : false;
xTemplate = service.saveXFormTemplate(xTemplate); //新增或修改一个XForm模板,只有code,name两项内容
return doAfterSave(isNew, xTemplate, "DynamicPropertyTree");
case DynConstants.TAB_TYPE:
isNew = tab.getId() == null ? true : false;
tab = service.saveXFormTemplateTab(tab); //新增或修改一个XForm模板Tab页,只有code,name两项内容(修改布局时不针对单个tab页,修改的是一组表单).
return doAfterSave(isNew, tab, "DynamicPropertyTree");
default:
return XML;
}
}
/**
* 根据类型删除对象
* @return
*/
public String removeObject(){
type = (type == 0 ? 3 : type);
switch(type){
case DynConstants.PROPERTY_TYPE:
service.deleteProperty(id); //移除一个动态属性,基本属性不允许删除。
break;
case DynConstants.GRID_TEMPLATE_TYPE:
service.deleteGridTemplate(id); //删除一个Grid模板包括其下所有的Tab页
break;
case DynConstants.XFORM_TEMPLATE_TYPE:
service.deleteXFormTemplate(id); //删除一个XForm模板包括其下所有的Tab页
break;
case DynConstants.TAB_TYPE:
service.deleteXFormTemplateTab(id); //删除一个XForm模板Tab页
break;
case DynConstants.GROUP_TYPE:
case DynConstants.ENTITY_TYPE:
default:
service.deleteGroupOrEntity(id); //移除一个动态实体或者动态实体组
//如果是删除组,则重新刷新树。因为组下的实体及子组不会一并被删除,会默认放到根目录下。
if(DynConstants.GROUP_TYPE == type)
return print("script", "parent.loadInitData();alert(\"删除成功!!!\");");
break;
}
return printSuccessMessage();
}
/**
* 新增、查看或者修改一个动态属性
* @return
*/
private String getPropertyInfo(){
XFormEncoder encoder = null;
if(isCreateNew()){
Map<String, Object> map = new HashMap<String, Object>();
map.put("entityCode", entityCode);
map.put("entityName", entityName);
map.put("allowNull", new Integer(1));
encoder = new XFormEncoder(DynConstants.DYN_PROPERTY_XFORM_TEMPLET_PATH, map);
}else{
PropertyDef info = service.getPropertyById(id);
if(info.isdyn()){
encoder = new XFormEncoder(DynConstants.DYN_PROPERTY_XFORM_TEMPLET_PATH, (IXForm) info);
}else if(info.isSpare() || info.getKey().startsWith("spare")){
encoder = new XFormEncoder(DynConstants.SPARE_PROPERTY_XFORM_TEMPLET_PATH, (IXForm) info);
}else{
encoder = new XFormEncoder(DynConstants.BASE_PROPERTY_XFORM_TEMPLET_PATH, (IXForm) info);
}
}
return print("DynamicPropertyInfo", encoder);
}
/**
* 修改一个属性,或者新增一个动态属性。
* @return
*/
private String saveProperty(){
boolean isNew = (property.getId() == null);
property = service.saveProperty(property);
return doAfterSave(isNew, property, "DynamicPropertyTree", "动态属性已经修改,请重新编辑表单布局!");
}
/****************************************************************************************************/
/****************************************************************************************************/
/****************************************************************************************************/
/**
* 属性展示
* @return
*/
public String getDynableEntities4Tree(){
List<?> entities = service.getDynableEntities(false);
TreeEncoder encoder = new TreeEncoder(entities, new DynPropertyTreeParser());
return print("DynamicPropertyTree", encoder);
}
public String getCanMoveToGroups4Tree(){
List<?> canSeeGroups = service.getDynableEntities(true);
List<?> targets = service.getCanMoveToGroups(id);
final Long[] targetIds = new Long[targets.size()];
for(int i = 0; i < targets.size(); i++){
DynableEntity target = (DynableEntity) targets.get(i);
targetIds[i] = target.getId();
}
TreeEncoder encoder = new TreeEncoder(canSeeGroups, new LevelTreeParser());
encoder.setTranslator(new ITreeTranslator(){
public Map<String, Object> translate(Map<String, Object> attributes) {
Map<String, Object> map = new HashMap<String, Object>(attributes);
if(Arrays.asList(targetIds).contains(map.get("id")) && !id.equals(map.get("id"))){
map.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "1");
}else{
map.put(TreeNode.TREENODE_ATTRIBUTE_CANSELECTED, "0");
}
return map;
}
});
encoder.setRootCanSelect(false);
return print("SiteTree", encoder);
}
/**
* 移动组或者动态实体到其他的组下
* @return
*/
public String moveGroupOrEntity(){
targetId = targetId == null ? new Long(0) : targetId;
service.moveGroupOrEntity(id, targetId);
return printSuccessMessage();
}
public String getUploadForm(){
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("parentId", parentId == null ? new Long(0) : parentId);
XFormEncoder encoder = new XFormEncoder(DynConstants.IMPORT_XFORM_TEMPLET_PATH, map);
return print("ImportEntity", encoder);
}
/**
* 导入动态实体
* @return
*/
public String importDynableEntity(){
if (null == file) {
throw new BusinessException("导入文件为空!");
}
SAXReader reader = new SAXReader();
Document document = null;
try {
document = reader.read(file);
if(!document.getRootElement().getName().equals("class")){
throw new BusinessException("xml文件根节点不是<class/>,导入文件可能不是规定的动态属性配置导入文件");
}
} catch (DocumentException e) {
throw new BusinessException("导入文件可能不是规定的动态属性配置导入文件", e);
}
service.importDynableEntity(document.asXML(), parentId == null ? new Long(0) : parentId);
// return print("script", "parent.loadInitData();alert(\"导入成功!!!\");var ws = parent.$(\"ws\");ws.closeActiveTab();");
return print("script", "var response={};response.type='Success';response.msg='导入成功';response.description='导入成功';");
}
/**
* 拷贝一个属性出来为动态属性
* @return
*/
public String copyProperty(){
service.copyProperty(id);
return printSuccessMessage();
}
/**
* 将属性复制到其他的动态实体下做为动态属性
* @return
*/
public String copyPropertyTo(){
service.copyPropertyTo(id, targetId);
return XML;
}
/**
* 属性排序
* @return
*/
public String sortProperty(){
service.sortProperty(id, targetId, direction);
return printSuccessMessage();
}
/****************************************************************************************************
********************************************* 模板维护 ********************************************
*****************************************************************************************************/
/**
* 获取某个动态对象实体所有的属性、某组XForm模板及其所有tab页信息。
* 编辑xform模板布局的时候用。
* @return
*/
public String editXForm(){
Object[] objs = service.getXFormTempalteInfo(entityCode, code);
StringBuffer layoutBuf = new StringBuffer("<forms entityCode=\"");
layoutBuf.append(entityCode).append("\">");
List<?> tabs = (List<?>) objs[0];
if(tabs.isEmpty()) {
throw new BusinessException("表单布局下必须包含至少一个表单页,请先创建表单页。");
}
for(Iterator<?> it = tabs.iterator(); it.hasNext();){
XFormTemplateTab tab = (XFormTemplateTab) it.next();
layoutBuf.append("<layout id=\"").append(tab.getId()).append("\" code=\"").append(tab.getCode());
layoutBuf.append("\" name=\"").append(tab.getName()).append("\">");
if(tab.getLayout() != null)
layoutBuf.append(tab.getLayoutOnly());
layoutBuf.append("</layout>");
}
layoutBuf.append("</forms>");
StringBuffer columnBuf = new StringBuffer("<declare>");
for(Iterator<?> it = ((List<?>) objs[1]).iterator(); it.hasNext();){
PropertyDef property = (PropertyDef) it.next();
if(!property.isHidden() && !property.isSpare()){ //非隐藏项传到前台
columnBuf.append(property.genColumn());
}
}
columnBuf.append("</declare>");
return print(new String[]{"FormLayout", "ColumnList"}, new Object[]{layoutBuf, columnBuf});
}
private String layoutStr;
/**
* 保存表单布局。多个tab页分开编辑,但一起保存.
* 编辑表单后,保存XForm模板declare节点(方法中需生成)和layout节点信息,并记录实体属性值保存到了哪个tab中.
*/
public String saveXForm(){
service.saveXForm(layoutStr);
return printSuccessMessage("布局已经保存成功!");
}
/**
* 获取某个指定的Grid模板,编辑grid列表模板的时候用。
* @param entityCode
* @param templateCode
* 模板code
* @return
*/
public String editGrid(){
String columnList = service.getGridTemplateInfo(entityCode, code);
GridTemplate gt = service.getGridTemplateByCode(entityCode, code);
String layout = gt.getDeclare() != null ? gt.getDeclare() : columnList;
String requiredProperties = gt.getRequiredProperties() != null ? gt.getRequiredProperties() : "";
return print(new String[]{"ListLayout", "ColumnList", "RequiredProperties"}, new Object[]{layout, columnList, requiredProperties});
}
/**
* 保存Grid布局
*/
public String saveGrid(){
GridTemplate t = (GridTemplate) service.getEntity(GridTemplate.class, id);
t.setDeclare(layoutStr);
service.saveGridTemplate(t);
return printSuccessMessage();
}
/****************************************************************************************************
************************************************ End *********************************************
*****************************************************************************************************/
public PropertyDef getProperty() {
return property;
}
public void setEntityCode(String entityCode) {
this.entityCode = entityCode;
}
public void setService(PropertyService service) {
this.service = service;
}
public void setDirection(int direction) {
this.direction = direction;
}
public void setTargetId(Long targetId) {
this.targetId = targetId;
}
public void setFile(File file) {
this.file = file;
}
public void setCode(String code) {
this.code = code;
}
public void setEntityName(String entityName) {
this.entityName = entityName;
}
public void setId(Long id) {
this.id = id;
}
public void setType(int type) {
this.type = type;
}
public DynableEntity getEntity() {
return entity;
}
public GridTemplate getGTemplate() {
return gTemplate;
}
public XFormTemplateTab getTab() {
return tab;
}
public XFormTemplate getXTemplate() {
return xTemplate;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
public void setLayoutStr(String layoutStr) {
this.layoutStr = layoutStr;
}
}