/* ==================================================================
* 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.core.web.dispaly.grid;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.jinhe.tss.core.exception.BusinessException;
import com.jinhe.tss.core.util.DateUtil;
import com.jinhe.tss.core.util.MathUtil;
import com.jinhe.tss.core.util.XmlUtil;
/**
* <p> GridNode.java </p>
*
* 网格Grid行节点对象
*
*/
public class GridNode {
public static final int TYPE_NULL = -1; //此节点为空节点
public static final int TYPE_SIMPLE_NODE = 0; //数据为一个符合IGridNode接口的对象
public static final int TYPE_ARRAY = 1; //数据为一个数组
public static final int TYPE_JAVA_BEAN = 2; //数据为一个 Java Bean 对象
public static final int TYPE_COMPLEX_NODE = 3; //数据为一个符合IComplexGridNode接口的对象
private int dataType = TYPE_NULL; //数据类型
private GridColumn[] columns = null; //节点属性名称数组
private Object[] values; //节点属性值数组
private GridNode parent; //父节点,可用于合计(将合计信息放置到父节点)
private List<GridNode> children = new ArrayList<GridNode>(); //子节点:GridNode对象
private List<GridAttributesMap> details = new ArrayList<GridAttributesMap>(); //节点详细信息
private Map<String, Object> additionalAttibutes = new HashMap<String, Object>(); //附加属性
public GridNode() { }
/**
* 构造器
*
* @param object
* @param dataType
* @throws Exception
*/
public GridNode(Object item, GridColumn[] columns, int dataType) {
this.columns = columns;
if (this.columns == null) {
this.columns = new GridColumn[0];
}
// 解析数据
this.dataType = dataType;
switch (this.dataType) {
case TYPE_SIMPLE_NODE:
IGridNode node = (IGridNode) item;
values = node.getAttributes(new GridAttributesMap(getColumnNames())).getValues();
break;
case TYPE_COMPLEX_NODE:
IComplexGridNode complexNode = (IComplexGridNode) item;
details = complexNode.getNodeDetails();
values = complexNode.getAttributes(new GridAttributesMap(getColumnNames())).getValues();
break;
case TYPE_ARRAY:
throw new BusinessException("此类型的Grid数据尚未支持!");
case TYPE_JAVA_BEAN:
throw new BusinessException("此类型的Grid数据尚未支持!");
default:
throw new BusinessException("生成Gird的数据类型不符合要求!");
}
}
/**
* 处理合计子节点数据的情况 将节点的值,累加到父节点上
*
* @param values
*/
public void addValuesToParent(GridNode parent) {
for (int i = 0; i < columns.length; i++) {
addValueToParent(i, values[i], parent);
}
}
/**
* 处理合计子节点数据的情况 将节点的值,累加到父节点上
*/
private void addValueToParent(int index, Object value, GridNode parent) {
if (columns[index].isSum() && parent != null) {
if (GridColumn.GRID_COLUMN_CLASS_TYPE_DOUBLE.equals(columns[index].getClassType())) {
parent.addDoubleValue(index, (Double) value);
}
if (GridColumn.GRID_COLUMN_CLASS_TYPE_INTEGER.equals(columns[index].getClassType())) {
parent.addIntegerValue(index, (Integer) value);
}
}
}
/**
* 对相应的值做相加操作。
* 递归操作,parent再把值加到自己的parent上。
*
* @param index
* @param value
*/
private void addDoubleValue(int index, Double value) {
if (!isValid()) return;
values[index] = MathUtil.addDoubles((Double) values[index], value);
if (parent != null) {
parent.addDoubleValue(index, value);
}
}
/**
* 对相应的值做相加操作。
* 递归操作,parent再把值加到自己的parent上。
*
* @param index
* @param value
*/
public void addIntegerValue(int index, Integer value) {
if (!isValid()) return;
values[index] = MathUtil.addInteger((Integer) values[index], value);
if (parent != null) {
parent.addIntegerValue(index, value);
}
}
/**
* 增加子节点。并将child相应的列值累积到父节点上
*
* @param child
*/
public void addChild(GridNode child) {
this.children.add(child);
child.parent = this;
child.addValuesToParent(this);
}
/**
* 树型节点转换成xml
*/
public String toXml(String nodeName) {
return toXml(nodeName, 0);
}
/**
* 逐层将GridNode输出为XML数据格式。
* 按层次递归调用,每深一层,level ++
*
* @param nodeName
* @param level 层级
* @return
*/
public String toXml(String nodeName, int level) {
StringBuffer sb = new StringBuffer();
if (dataType != TYPE_NULL) {
sb.append("<").append(nodeName);
for (int index = 0; index < columns.length; index++) {
sb.append(" ").append(columns[index].getName()).append("=\"").append(getFormatedValue(index)).append("\"");
}
if (additionalAttibutes.size() > 0) {
for (Entry<String, Object> entry : additionalAttibutes.entrySet()) {
sb.append(" ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
}
}
sb.append(" _depth=\"").append(level).append("\">");
}
if (details != null) {
sb.append(getDetailNodesXML());
}
for (GridNode childNode : children) {
sb.append(childNode.toXml(nodeName, level + 1));
}
if (dataType != TYPE_NULL) {
sb.append("</").append(nodeName).append(">");
}
return sb.toString();
}
/**
* 获取格式化的数据
*
* @param index
* @return
*/
private String getFormatedValue(int index) {
GridColumn column = columns[index];
String pattern = column.getPattern();
String classType = column.getClassType();
if (GridColumn.GRID_COLUMN_CLASS_TYPE_DATE.equals(classType)) {
if (pattern == null || "".equals(pattern)) {
pattern = DateUtil.DEFAULT_DATE_PATTERN;
}
return DateUtil.format((Date) values[index], pattern);
}
if (GridColumn.GRID_COLUMN_CLASS_TYPE_DOUBLE.equals(classType) || GridColumn.GRID_COLUMN_CLASS_TYPE_INTEGER.equals(classType)) {
return formatNumber(values[index], pattern);
}
return XmlUtil.toFormXml(values[index]);
}
/**
* 根据给定的pattern格式化数字类数据为字符串
*/
private static String formatNumber(Object value, String pattern) {
if (value == null || Double.valueOf(value.toString()) == 0) {
return ""; // null 和 0 都不显示
}
if (pattern == null || "".equals(pattern)) {
return value.toString();
}
return new DecimalFormat(pattern).format(value);
}
/**
* 获取节点详细信息xml
*/
private String getDetailNodesXML() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < details.size(); i++) {
sb.append("<detail ");
sb.append(details.get(i).toString());
sb.append("/>");
}
return sb.toString();
}
/**
* 获取column.name 数组
*/
private String[] getColumnNames() {
String[] names = new String[columns.length];
for (int i = 0; i < columns.length; i++) {
names[i] = columns[i].getName();
}
return names;
}
/**
* 根据列名给本GridNode行的该列设值
*/
public boolean setColumnValue(String name, Object value) {
for (int i = 0; i < columns.length; i++) {
if (columns[i].getName().equals(name)) {
values[i] = value;
addValueToParent(i, value, this.parent);
return true;
}
}
return false;
}
/**
* 判断此节点是否无效(空节点)
*/
private boolean isValid() {
return dataType != TYPE_NULL;
}
}