package net.ion.craken.node.convert.rows;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import javax.sql.RowSetMetaData;
import net.ion.craken.node.ReadNode;
import net.ion.craken.node.ReadSession;
import net.ion.framework.db.RepositoryException;
import net.ion.framework.db.Rows;
import net.ion.framework.db.RowsImpl;
import net.ion.framework.db.procedure.Queryable;
import net.ion.framework.util.ListUtil;
public class CrakenNodeRows extends RowsImpl {
private static final long serialVersionUID = 5559980355928579198L;
private CrakenNodeRows(ReadSession session, Iterator<ReadNode> iterator) throws SQLException {
super(Queryable.Fake);
}
public static Rows create(ReadSession session, Iterator<ReadNode> iter, NodeColumns columns) {
try {
CrakenNodeRows result = new CrakenNodeRows(session, iter);
result.populate(session, iter, columns);
result.beforeFirst();
return result;
} catch (SQLException e) {
throw RepositoryException.throwIt(e) ;
}
}
private void populate(ReadSession session, Iterator<ReadNode> cursor, NodeColumns columns) throws SQLException {
if (cursor.hasNext()) {
ReadNode firstRow = cursor.next();
RowSetMetaData meta = makeMetaData(firstRow, columns);
setMetaData(meta);
appendRow(columns, firstRow, 0);
while (cursor.hasNext()) {
appendRow(columns, cursor.next(), 0);
}
} else {
setMetaData(ListUtil.EMPTY, columns);
}
}
private void setMetaData(List<ReadNode> destList, NodeColumns columns) throws SQLException {
setMetaData(columns.getMetaType(destList));
}
private RowSetMetaData makeMetaData(ReadNode node, NodeColumns columns) throws SQLException {
return columns.getMetaType(ListUtil.create(node));
}
private void appendRow(NodeColumns columns, ReadNode rnode, int screenSize) throws SQLException {
super.afterLast();
super.moveToInsertRow();
for (int i = 1; i <= columns.size(); i++) {
final IColumn column = columns.get(i);
super.updateObject(i, column.getValue(rnode));
}
super.insertRow();
super.moveToCurrentRow();
}
}