src/core/net/sf/basedb/util/bfs/AnnotationModel.java

Code
Comments
Other
Rev Date Author Line
5194 04 Dec 09 nicklas 1 /**
5194 04 Dec 09 nicklas 2   $Id$
5194 04 Dec 09 nicklas 3
5194 04 Dec 09 nicklas 4   Copyright (C) 2009 Nicklas Nordborg
5194 04 Dec 09 nicklas 5
5194 04 Dec 09 nicklas 6   This file is part of BASE - BioArray Software Environment.
5194 04 Dec 09 nicklas 7   Available at http://base.thep.lu.se/
5194 04 Dec 09 nicklas 8
5194 04 Dec 09 nicklas 9   BASE is free software; you can redistribute it and/or
5194 04 Dec 09 nicklas 10   modify it under the terms of the GNU General Public License
5194 04 Dec 09 nicklas 11   as published by the Free Software Foundation; either version 3
5194 04 Dec 09 nicklas 12   of the License, or (at your option) any later version.
5194 04 Dec 09 nicklas 13
5194 04 Dec 09 nicklas 14   BASE is distributed in the hope that it will be useful,
5194 04 Dec 09 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
5194 04 Dec 09 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
5194 04 Dec 09 nicklas 17   GNU General Public License for more details.
5194 04 Dec 09 nicklas 18
5194 04 Dec 09 nicklas 19   You should have received a copy of the GNU General Public License
5194 04 Dec 09 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
5194 04 Dec 09 nicklas 21 */
5194 04 Dec 09 nicklas 22 package net.sf.basedb.util.bfs;
5194 04 Dec 09 nicklas 23
5194 04 Dec 09 nicklas 24 import java.util.ArrayList;
5194 04 Dec 09 nicklas 25 import java.util.HashMap;
5194 04 Dec 09 nicklas 26 import java.util.List;
5194 04 Dec 09 nicklas 27 import java.util.Map;
5194 04 Dec 09 nicklas 28
5194 04 Dec 09 nicklas 29 import net.sf.basedb.util.Values;
5194 04 Dec 09 nicklas 30
5194 04 Dec 09 nicklas 31 /**
5194 04 Dec 09 nicklas 32   A model container for BFS annotation files. This class is primarily
5194 04 Dec 09 nicklas 33   intended to be used when parsing small annotation files. It is not
5194 04 Dec 09 nicklas 34   recommended to use this class with large files since it may use too
5194 04 Dec 09 nicklas 35   much memory.
5194 04 Dec 09 nicklas 36   <p>
5194 04 Dec 09 nicklas 37   Data may be retreived by either column name or index and by row id
5194 04 Dec 09 nicklas 38   or index. Lookup by index is a lot faster than by name or id.
5194 04 Dec 09 nicklas 39
5194 04 Dec 09 nicklas 40   @author Nicklas
5194 04 Dec 09 nicklas 41   @version 2.15
5194 04 Dec 09 nicklas 42   @base.modified $Date$
5194 04 Dec 09 nicklas 43 */
5194 04 Dec 09 nicklas 44 public class AnnotationModel
5194 04 Dec 09 nicklas 45   implements EventHandler
5194 04 Dec 09 nicklas 46 {
5194 04 Dec 09 nicklas 47   
5194 04 Dec 09 nicklas 48   private String[] headers;
5194 04 Dec 09 nicklas 49   private List<String[]> data;
5194 04 Dec 09 nicklas 50   
5194 04 Dec 09 nicklas 51   private Map<String, Integer> columnIndex;
5194 04 Dec 09 nicklas 52   private Map<Integer, Integer> rowIndex;
5194 04 Dec 09 nicklas 53
5194 04 Dec 09 nicklas 54   /**
5194 04 Dec 09 nicklas 55     Create a new annotation model.
5194 04 Dec 09 nicklas 56   */
5194 04 Dec 09 nicklas 57   public AnnotationModel()
5194 04 Dec 09 nicklas 58   {
5194 04 Dec 09 nicklas 59     this.data = new ArrayList<String[]>();
5194 04 Dec 09 nicklas 60     this.rowIndex = new HashMap<Integer, Integer>();
5194 04 Dec 09 nicklas 61   }
5194 04 Dec 09 nicklas 62   
5194 04 Dec 09 nicklas 63   /*
5194 04 Dec 09 nicklas 64     From the EventHandler interface
5194 04 Dec 09 nicklas 65     --------------------------------
5194 04 Dec 09 nicklas 66   */
5194 04 Dec 09 nicklas 67   @Override
5224 27 Jan 10 nicklas 68   public <T> void handleEvent(EventType<T> eventType, T eventData, BfsParser parser)
5194 04 Dec 09 nicklas 69   {
5194 04 Dec 09 nicklas 70     if (eventType == AnnotationParser.HEADER_EVENT)
5194 04 Dec 09 nicklas 71     {
5194 04 Dec 09 nicklas 72       setHeaders((String[])eventData);
5194 04 Dec 09 nicklas 73     }
5194 04 Dec 09 nicklas 74     else if (eventType == AnnotationParser.DATA_EVENT)
5194 04 Dec 09 nicklas 75     {
5194 04 Dec 09 nicklas 76       addRow((String[])eventData);
5194 04 Dec 09 nicklas 77     }
5194 04 Dec 09 nicklas 78   }
5194 04 Dec 09 nicklas 79   // ------------------------------------
5194 04 Dec 09 nicklas 80
5194 04 Dec 09 nicklas 81   
5194 04 Dec 09 nicklas 82   /**
5194 04 Dec 09 nicklas 83     Set the column headers. It is expected that each
5194 04 Dec 09 nicklas 84     array element is unique.
5194 04 Dec 09 nicklas 85     @param headers An array with the column headers
5194 04 Dec 09 nicklas 86   */
5194 04 Dec 09 nicklas 87   public void setHeaders(String... headers)
5194 04 Dec 09 nicklas 88   {
5194 04 Dec 09 nicklas 89     this.headers = headers;
5194 04 Dec 09 nicklas 90     this.columnIndex = new HashMap<String, Integer>(headers.length);
5194 04 Dec 09 nicklas 91     for (int i = 0; i < headers.length; ++i)
5194 04 Dec 09 nicklas 92     {
5194 04 Dec 09 nicklas 93       columnIndex.put(headers[i], i);
5194 04 Dec 09 nicklas 94     }
5194 04 Dec 09 nicklas 95   }
5194 04 Dec 09 nicklas 96   
5194 04 Dec 09 nicklas 97   /**
5194 04 Dec 09 nicklas 98     Get all column headers.
5194 04 Dec 09 nicklas 99   */
5194 04 Dec 09 nicklas 100   public String[] getHeaders()
5194 04 Dec 09 nicklas 101   {
5194 04 Dec 09 nicklas 102     return headers;
5194 04 Dec 09 nicklas 103   }
5194 04 Dec 09 nicklas 104   
5194 04 Dec 09 nicklas 105   /**
5194 04 Dec 09 nicklas 106     Add a row of data to the model. The number of array elements
5194 04 Dec 09 nicklas 107     in the array should be the same as the number of columns. The
5194 04 Dec 09 nicklas 108     first array element must be the ID of the row. This must be
5194 04 Dec 09 nicklas 109     a unique positive integer.
5194 04 Dec 09 nicklas 110   */
5194 04 Dec 09 nicklas 111   public void addRow(String... row)
5194 04 Dec 09 nicklas 112   {
5194 04 Dec 09 nicklas 113     int id = Values.getInt(row[0]);
5194 04 Dec 09 nicklas 114     data.add(row);
5384 13 Aug 10 nicklas 115     rowIndex.put(id, data.size()-1);
5194 04 Dec 09 nicklas 116   }
5194 04 Dec 09 nicklas 117   
5194 04 Dec 09 nicklas 118   /**
5194 04 Dec 09 nicklas 119     Get the number of column.
5194 04 Dec 09 nicklas 120   */
5194 04 Dec 09 nicklas 121   public int getColumnCount()
5194 04 Dec 09 nicklas 122   {
5194 04 Dec 09 nicklas 123     return headers.length;
5194 04 Dec 09 nicklas 124   }
5194 04 Dec 09 nicklas 125   
5194 04 Dec 09 nicklas 126   /**
5194 04 Dec 09 nicklas 127     Get the number of rows.
5194 04 Dec 09 nicklas 128   */
5194 04 Dec 09 nicklas 129   public int getRowCount()
5194 04 Dec 09 nicklas 130   {
5194 04 Dec 09 nicklas 131     return data.size();
5194 04 Dec 09 nicklas 132   }
5194 04 Dec 09 nicklas 133   
5194 04 Dec 09 nicklas 134   /**
5194 04 Dec 09 nicklas 135     Get the column index for a given header.
5194 04 Dec 09 nicklas 136     @param header The column header
5194 04 Dec 09 nicklas 137     @return The column index, or -1 if no column is found
5194 04 Dec 09 nicklas 138   */
5194 04 Dec 09 nicklas 139   public int getColumnIndex(String header)
5194 04 Dec 09 nicklas 140   {
5194 04 Dec 09 nicklas 141     Integer index = columnIndex.get(header);
5194 04 Dec 09 nicklas 142     return index == null ? -1 : index;
5194 04 Dec 09 nicklas 143   }
5194 04 Dec 09 nicklas 144   
5194 04 Dec 09 nicklas 145   /**
5194 04 Dec 09 nicklas 146     Get the column header for a given column index.
5194 04 Dec 09 nicklas 147     @param colIndex The index of the column, a value between
5194 04 Dec 09 nicklas 148       0 and {@link #getColumnCount()}-1
5194 04 Dec 09 nicklas 149     @return The column header
5194 04 Dec 09 nicklas 150   */
5194 04 Dec 09 nicklas 151   public String getHeader(int colIndex)
5194 04 Dec 09 nicklas 152   {
5194 04 Dec 09 nicklas 153     return headers[colIndex];
5194 04 Dec 09 nicklas 154   }
5194 04 Dec 09 nicklas 155   
5194 04 Dec 09 nicklas 156   /**
5194 04 Dec 09 nicklas 157     Get the row index for a given row id.
5194 04 Dec 09 nicklas 158     @param rowId The row id
5194 04 Dec 09 nicklas 159     @return The row index, or -1 if no row with the given id exists
5194 04 Dec 09 nicklas 160   */
5194 04 Dec 09 nicklas 161   public int getRowIndex(int rowId)
5194 04 Dec 09 nicklas 162   {
5194 04 Dec 09 nicklas 163     Integer index = rowIndex.get(rowId);
5194 04 Dec 09 nicklas 164     return index == null ? -1 : index;
5194 04 Dec 09 nicklas 165   }
5194 04 Dec 09 nicklas 166
5194 04 Dec 09 nicklas 167   /**
5194 04 Dec 09 nicklas 168     Get the row id for a given row.
5194 04 Dec 09 nicklas 169     @param rowIndex The index of the row, a value between 0 and 
5194 04 Dec 09 nicklas 170       {@link #getRowCount()}-1
5194 04 Dec 09 nicklas 171     @return The row id
5194 04 Dec 09 nicklas 172   */
5194 04 Dec 09 nicklas 173   public int getRowId(int rowIndex)
5194 04 Dec 09 nicklas 174   {
5194 04 Dec 09 nicklas 175     String[] row = getRowByIndex(rowIndex);
5194 04 Dec 09 nicklas 176     return Values.getInt(row[0]);
5194 04 Dec 09 nicklas 177   }
5194 04 Dec 09 nicklas 178   
5194 04 Dec 09 nicklas 179   /**
5194 04 Dec 09 nicklas 180     Get the data element at a given row and column index.
5194 04 Dec 09 nicklas 181     @param rowIndex The row index, a value between 0 and 
5194 04 Dec 09 nicklas 182       {@link #getRowCount()}-1
5194 04 Dec 09 nicklas 183     @param colIndex The column index, a value between
5194 04 Dec 09 nicklas 184       0 and {@link #getColumnCount()}-1
5194 04 Dec 09 nicklas 185     @return The data at the given location
5194 04 Dec 09 nicklas 186   */
5194 04 Dec 09 nicklas 187   public String getData(int rowIndex, int colIndex)
5194 04 Dec 09 nicklas 188   {
5194 04 Dec 09 nicklas 189     String[] row = getRowByIndex(rowIndex);
5194 04 Dec 09 nicklas 190     return row[colIndex];
5194 04 Dec 09 nicklas 191   }
5194 04 Dec 09 nicklas 192   
5194 04 Dec 09 nicklas 193   /**
5194 04 Dec 09 nicklas 194     Get the data element at a given row and column. 
5194 04 Dec 09 nicklas 195     Do not use this method repeatedly with the same
5194 04 Dec 09 nicklas 196     row id or column header. It is faster to use {@link
5194 04 Dec 09 nicklas 197     #getData(int, int)}.
5194 04 Dec 09 nicklas 198     @param rowId The row id
5194 04 Dec 09 nicklas 199     @param header The column header
5194 04 Dec 09 nicklas 200     @return The data at the given location, or null if the
5194 04 Dec 09 nicklas 201       location doesn't exists
5194 04 Dec 09 nicklas 202   */
5194 04 Dec 09 nicklas 203   public String getData(int rowId, String header)
5194 04 Dec 09 nicklas 204   {
5194 04 Dec 09 nicklas 205     String[] row = getRowById(rowId);
5194 04 Dec 09 nicklas 206     return row[getColumnIndex(header)];
5194 04 Dec 09 nicklas 207   }
5194 04 Dec 09 nicklas 208   
5194 04 Dec 09 nicklas 209   public String[] getRowById(int rowId)
5194 04 Dec 09 nicklas 210   {
5194 04 Dec 09 nicklas 211     int rowIndex = getRowIndex(rowId);
5194 04 Dec 09 nicklas 212     return getRowByIndex(rowIndex);
5194 04 Dec 09 nicklas 213   }
5194 04 Dec 09 nicklas 214   
5194 04 Dec 09 nicklas 215   public String[] getRowByIndex(int rowIndex)
5194 04 Dec 09 nicklas 216   {
5194 04 Dec 09 nicklas 217     return data.get(rowIndex);
5194 04 Dec 09 nicklas 218   }
5194 04 Dec 09 nicklas 219
5194 04 Dec 09 nicklas 220
5194 04 Dec 09 nicklas 221 }