package net.ion.craken.node.convert.rows; import java.sql.Date; import java.sql.SQLException; import java.sql.Types; import java.util.List; import java.util.Map; import javax.sql.RowSetMetaData; import net.ion.craken.node.ReadNode; import net.ion.framework.db.RepositoryException; import net.ion.framework.db.rowset.RowSetMetaDataImpl; import net.ion.framework.util.ListUtil; import net.ion.framework.util.MapUtil; public class NodeColumns { private List<IColumn> columnList = ListUtil.newList(); private static Map<Class, Integer> TypeMappingMap = makeMapping(); private static Map makeMapping() { Map<Class, Integer> result = MapUtil.newMap(); result.put(String.class, Types.LONGVARCHAR); result.put(Integer.class, Types.INTEGER); result.put(Long.class, Types.BIGINT); result.put(Double.class, Types.DOUBLE); result.put(Boolean.class, Types.BOOLEAN); result.put(Date.class, Types.DATE); result.put(java.util.Date.class, Types.DATE); return result; } public PropertyColumn[] getColumns() { return columnList.toArray(new PropertyColumn[0]); } private NodeColumns() { } public static NodeColumns create(IColumn... columns) { if (columns == null || columns.length == 0) { throw RepositoryException.throwIt("columns not exist"); } NodeColumns result = new NodeColumns(); for (IColumn col : columns) { result.columnList.add(col); } return result; } public NodeColumns append(IColumn col) { this.columnList.add(col); return this ; } public int size() { return columnList.size(); } public IColumn get(int columnIndex) { return columnList.get(columnIndex - 1); } public boolean contains(String key) { for (IColumn col : columnList) { if (key.equalsIgnoreCase(col.getLabel())) { return true; } } return false; } private int getColumnSize(ReadNode node) { int sumSize = 0; for (int i = 1; i <= size(); i++) { sumSize += columnList.get(i - 1).getColumnCount(node); } return sumSize; } public RowSetMetaData getMetaType(List<ReadNode> destList) throws SQLException { if (destList.size() > 0) { return getMetaType(destList.get(0)); } else { return defaultMetaType(); } } private RowSetMetaData getMetaType(ReadNode node) throws SQLException { RowSetMetaData meta = new RowSetMetaDataImpl(); int sumSize = getColumnSize(node); meta.setColumnCount(sumSize); int appendIndex = 0; for (int i = 1; i <= size(); i++) { IColumn column = columnList.get(i - 1); appendIndex += column.setMeta(node, appendIndex + i, meta, TypeMappingMap); } return meta; } private RowSetMetaData defaultMetaType() throws SQLException { RowSetMetaData meta = new RowSetMetaDataImpl(); meta.setColumnCount(size()); for (int i = 1; i <= size(); i++) { IColumn column = columnList.get(i - 1); meta.setColumnName(i, column.getLabel()); meta.setColumnLabel(i, column.getLabel()); meta.setColumnType(i, Types.OTHER); meta.setColumnTypeName(i, "other"); } return meta; } }