001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/model/table/DefaultTable.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2008 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstr. 19 030 53115 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 Department of Geography 036 University of Bonn 037 Meckenheimer Allee 166 038 53115 Bonn 039 Germany 040 E-Mail: greve@giub.uni-bonn.de 041 042 043 ---------------------------------------------------------------------------*/ 044 package org.deegree.model.table; 045 046 import java.util.ArrayList; 047 import java.util.HashMap; 048 049 /** 050 * 051 * 052 * 053 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 054 * @author last edited by: $Author: apoth $ 055 * 056 * @version. $Revision: 9343 $, $Date: 2007-12-27 14:30:32 +0100 (Do, 27 Dez 2007) $ 057 */ 058 public class DefaultTable implements Table { 059 060 private String tableName = ""; 061 062 private ArrayList<ArrayList<Object>> rows = null; 063 064 private String[] columnNames = null; 065 066 private int[] columnTypes = null; 067 068 private HashMap<String, Integer> columnNamesMap = new HashMap<String, Integer>(); 069 070 /** 071 * @param tableName 072 * @param columnNames 073 * @param columnTypes 074 * @throws TableException 075 */ 076 public DefaultTable( String tableName, String[] columnNames, int[] columnTypes ) throws TableException { 077 setTableName( tableName ); 078 079 if ( columnTypes == null ) 080 throw new TableException( "Invalid column types. Column types = null" ); 081 082 this.columnTypes = columnTypes; 083 084 if ( columnNames == null ) { 085 this.columnNames = new String[columnTypes.length]; 086 for ( int i = 0; i < this.columnNames.length; i++ ) { 087 this.columnNames[i] = ""; 088 } 089 } else { 090 this.columnNames = new String[columnNames.length]; 091 for ( int i = 0; i < columnNames.length; i++ ) { 092 this.columnNames[i] = columnNames[i].toUpperCase(); 093 columnNamesMap.put( this.columnNames[i], new Integer( i ) ); 094 } 095 } 096 097 if ( columnTypes.length != this.columnNames.length ) { 098 throw new TableException( "column names and types are not of the " + "same length" ); 099 } 100 101 rows = new ArrayList<ArrayList<Object>>( 1000 ); 102 } 103 104 /** 105 * @param tableName 106 * @param columnNames 107 * @param columnTypes 108 * @param data 109 * @throws TableException 110 */ 111 public DefaultTable( String tableName, String[] columnNames, int[] columnTypes, Object[][] data ) 112 throws TableException { 113 this( tableName, columnNames, columnTypes ); 114 115 rows = new ArrayList<ArrayList<Object>>( data.length ); 116 for ( int i = 0; i < data.length; i++ ) { 117 appendRow( data[i] ); 118 } 119 } 120 121 /** 122 * @param tableName 123 * @param columnNames 124 * @param columnTypes 125 * @param initialCapacity 126 * @throws TableException 127 */ 128 public DefaultTable( String tableName, String[] columnNames, int[] columnTypes, int initialCapacity ) 129 throws TableException { 130 this( tableName, columnNames, columnTypes ); 131 rows.ensureCapacity( initialCapacity ); 132 } 133 134 /** 135 * returns the name of the table. If the table hasn't a name an empty string ("") will be 136 * returned. 137 * 138 */ 139 public String getTableName() { 140 return tableName; 141 } 142 143 /** 144 * @see org.deegree.model.table.DefaultTable#getTableName() 145 * 146 */ 147 public void setTableName( String tableName ) { 148 this.tableName = tableName; 149 } 150 151 /** 152 * returns the value of the table field indexed by <tt>row</tt> and <tt>col</tt> 153 */ 154 public Object getValueAt( int row, int col ) { 155 ArrayList tmp = rows.get( row ); 156 return tmp.get( col ); 157 } 158 159 /** 160 * set a value at the table field indexed by <tt>row</tt> and <tt>col</tt> 161 */ 162 public void setValueAt( Object value, int row, int col ) { 163 ArrayList<Object> tmp = rows.get( row ); 164 tmp.set( col, value ); 165 } 166 167 /** 168 * returns the data of the row'th row of the table 169 */ 170 public Object[] getRow( int row ) { 171 ArrayList<Object> tmp = rows.get( row ); 172 return tmp.toArray(); 173 } 174 175 /** 176 * sets the data of the row'th row 177 */ 178 public void setRow( Object[] data, int row ) 179 throws TableException { 180 if ( this.getColumnCount() != data.length ) { 181 throw new TableException( "submitted row doesn't have the same length" + " as the table has columns." ); 182 } 183 ArrayList<Object> tmp = rows.get( row ); 184 185 for ( int i = 0; i < data.length; i++ ) { 186 tmp.set( i, data[i] ); 187 } 188 } 189 190 /** 191 * appends a row to the table and sets its data 192 */ 193 public void appendRow( Object[] data ) 194 throws TableException { 195 if ( this.getColumnCount() != data.length ) { 196 throw new TableException( "submitted row doesn't have the same length" + " as the table has columns." ); 197 } 198 ArrayList<Object> tmp = new ArrayList<Object>( data.length ); 199 for ( int i = 0; i < data.length; i++ ) { 200 tmp.add( data[i] ); 201 } 202 rows.add( tmp ); 203 } 204 205 /** 206 * returns the number rows of the table 207 */ 208 public int getRowCount() { 209 return rows.size(); 210 } 211 212 /** 213 * adds a new column to the table. for this a computional expensive operation this method should 214 * be used with care. 215 */ 216 public void addColumn( String name, int type ) { 217 String[] s1 = new String[columnNames.length + 1]; 218 int[] s2 = new int[columnNames.length + 1]; 219 for ( int i = 0; i < columnNames.length; i++ ) { 220 s1[i] = columnNames[i]; 221 s2[i] = columnTypes[i]; 222 } 223 s1[s1.length - 1] = name; 224 s2[s2.length - 1] = type; 225 columnNames = s1; 226 columnTypes = s2; 227 228 for ( int i = 0; i < rows.size(); i++ ) { 229 ArrayList<Object> tmp = rows.get( i ); 230 tmp.add( "" ); 231 } 232 233 } 234 235 /** 236 * returns the number columns of the table 237 */ 238 public int getColumnCount() { 239 return columnNames.length; 240 } 241 242 /** 243 * returns the names of all table columns. If a column hasn't a name a empty String ("") will be 244 * returned. 245 * 246 */ 247 public String[] getColumnNames() { 248 return columnNames; 249 } 250 251 /** 252 * returns the name of the specified column. If a column hasn't a name a empty String ("") will 253 * be returned. 254 */ 255 public String getColumnName( int col ) { 256 return columnNames[col]; 257 } 258 259 /** 260 * returns the names of all column types. For each column a type (name of a java class) has to 261 * be defined. 262 * 263 */ 264 public int[] getColumnTypes() { 265 return columnTypes; 266 } 267 268 /** 269 * returns the name of the type of the specifies column. For each column a type (name of a java 270 * class) has to be defined. 271 */ 272 public int getColumnType( int col ) { 273 return columnTypes[col]; 274 } 275 276 /** 277 * sets the type of a column. 278 */ 279 public void setColumnType( int col, int type ) 280 throws TableException { 281 columnTypes[col] = type; 282 } 283 284 /** 285 * sets the name of a column. 286 */ 287 public void setColumnName( int col, String name ) { 288 columnNames[col] = name; 289 } 290 291 /** 292 * removes a row from the table 293 * 294 * @param index 295 * @return removed row 296 */ 297 public Object[] removeRow( int index ) { 298 ArrayList<Object> list = rows.remove( index ); 299 return list.toArray(); 300 } 301 302 /** 303 * returns the index of the submitted columns name. If no column with that name if present -1 304 * will be returned. the test is not case sensitive 305 * 306 * @param columnName 307 */ 308 public int getColumnIndex( String columnName ) { 309 Integer index = columnNamesMap.get( columnName.toUpperCase() ); 310 return index.intValue(); 311 } 312 313 /** 314 * @return string representation 315 */ 316 public String toString() { 317 StringBuffer sb = new StringBuffer( 100000 ); 318 for ( int i = 0; i < getRowCount(); i++ ) { 319 sb.append( "row: " + i ); 320 for ( int c = 0; c < getColumnCount(); c++ ) { 321 sb.append( getColumnName( c ) + ": " + getValueAt( i, c ) ); 322 } 323 } 324 return sb.toString(); 325 } 326 }