package clientdata.visitors; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.MalformedInputException; import org.apache.mina.core.buffer.IoBuffer; import clientdata.VisitorInterface; public class DatatableVisitor implements VisitorInterface { String[] columnNames; byte[] columnTypes; Object[][] table; public int getRowCount() { if(table == null) return 0; return table.length; } public int getColumnCount() { if(table == null) return 0; return columnNames.length; } public Object getObject(int row, int column) { return table[row][column]; } public Object[] getRowsByColumnName(String columnName) { for(int i = 0; i < table.length; i++) { for(int j=0; j < columnTypes.length; ++j) { String currentName = columnNames[j]; if(currentName.equals(columnName)) return table[i]; } } return null; } public Object getObjectByColumnNameAndIndex(String columnName, int rowIndex) { for(int j=0; j < columnTypes.length; ++j) { String currentName = columnNames[j]; if(currentName.equals(columnName)) return table[rowIndex][j]; } return null; } @Override public void parseData(String nodename, IoBuffer data, int depth, int size) throws Exception { if("0001COLS".equals(nodename)) { columnNames = new String[data.getInt()]; CharsetDecoder cd = Charset.forName("US-ASCII").newDecoder(); for(int i=0; i < columnNames.length; ++i) { columnNames[i] = data.getString(Charset.forName("US-ASCII").newDecoder()); cd.reset(); } } else if("TYPE".equals(nodename)) { columnTypes = new byte[columnNames.length]; for(int i=0; i < columnTypes.length; ++i) { columnTypes[i] = (byte) data.getString(Charset.forName("US-ASCII").newDecoder()).charAt(0); } } else if("ROWS".equals(nodename)) { int rowCount = data.getInt(); table = new Object[rowCount][columnTypes.length]; CharsetDecoder cd = Charset.forName("US-ASCII").newDecoder(); for(int i=0; i < rowCount; ++i) { for(int j=0; j < columnTypes.length; ++j) { switch(columnTypes[j]) { case 's': case 'S': try { table[i][j] = data.getString(Charset.forName("US-ASCII").newDecoder()); cd.reset(); } catch(MalformedInputException e) { cd.reset(); } break; case 'f': case 'F': table[i][j] = data.getFloat(); break; case 'h': case 'z': case 'p': case 'c': case 'e': case 'E': case 'I': case 'i': table[i][j] = data.getInt(); break; case 'b': case 'B': table[i][j] = data.getInt() != 0; break; default: table[i][j] = data.getInt(); break; } } } } } @Override public void notifyFolder(String nodeName, int depth) throws Exception { } }