001: /*
002:
003: */
004: package com.calipso.reportgenerator.reportcalculator;
005:
006: import com.calipso.reportgenerator.common.LanguageTraslator;
007: import com.calipso.reportgenerator.common.InfoException;
008:
009: import java.util.Collection;
010: import java.util.Vector;
011: import java.util.Iterator;
012:
013: /**
014: * Almacena y permite modificar datos en una matriz de objetos de dos dimensiones.
015: * Sólo permite introducir valores fila a fila. No permite introducir filas de longitud
016: * variable.
017: * El nombre de las columnas tienen que ser objetos de tipo String y no pueden ser valores nulos
018: * El objeto DataSource se contruye a partir de un número de columnas o a partir de una collection de strings que
019: * identifica los nombres de cada columna.
020: *
021: */
022: public class DataSource implements IDataSource {
023:
024: private Vector names;
025: private Vector rows;
026: private int columsCount = 0;
027: private final String COLUMNS_DEFAULT_NAME = "NONAME";
028:
029: /**
030: * Inicializa el objeto matriz de dos dimensiones con el número de columnas indicado en el parámetro
031: * No se indica nombre para las columnas.
032: * @param columns - número de columnas
033: * @throws InfoException - Si el número de columnas es <= 0
034: */
035: public DataSource(int columns) throws InfoException {
036: if (columns <= 0) {
037: throw new InfoException(
038: "INFO - No se puede crear una matriz DataSource. "
039: + columns + "<=0");
040: } else {
041: this .columsCount = columns;
042: this .names = this .generateVector(this .COLUMNS_DEFAULT_NAME,
043: columns);
044: this .rows = new Vector(this .columsCount);
045: }
046: }
047:
048: /**
049: * Inicializa el objeto matriz de dos dimensiones con el mismo número de columnas
050: * que el tamaño de la collection de nombres.
051: * El nombre de las columnas es el que se indica en el parámetro names manteniendo el orden.
052: * @param names - Nombres de las columnas
053: * @throws InfoException - Si la colección de nombre es nula, contiene elementos nulos o no contiene objetos de tipo String
054: */
055: public DataSource(Collection names) throws InfoException {
056: if (names == null) {
057: throw new InfoException(
058: "INFO - No se puede construir una matriz DataSource a partir de una colección de nombres nula");
059: } else if (this .namesEmpty(names)) {
060: throw new InfoException(
061: "INFO - No se puede construir una matriz DataSource a partir de un names vacío");
062: } else if (this .namesWithNullElements(names)) {
063: throw new InfoException(
064: "INFO - No se puede construir una matriz DataSource con elementos null en los nombres");
065: } else if (this .namesWithNoStringElements(names)) {
066: throw new InfoException(
067: "INFO - No se puede construir una matriz DataSource con nombres que no son de tipo String");
068: } else {
069: this .columsCount = names.size();
070: this .names = new Vector(names);
071: this .rows = new Vector(this .columsCount);
072: }
073:
074: }
075:
076: /**
077: * Devuelve el número de filas de esta matriz de objetos
078: * @return número de filas
079: */
080: public int getRowCount() {
081: return this .rows.size();
082: }
083:
084: /**
085: * Devuelve el número de columnas de esta matriz de objetos
086: * @return número de columnas
087: */
088: public int getColumCount() {
089: return this .columsCount;
090: }
091:
092: /**
093: * Devuelve el nombre de la columna
094: * @param colum - número de columna
095: * @return Nombre de la columna
096: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
097: */
098: public String getColumName(int colum)
099: throws IndexOutOfBoundsException {
100: if (!this .validateColumNumber(colum)) {
101: throw new IndexOutOfBoundsException(
102: "INFO - La columna "
103: + colum
104: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
105: + (this .columsCount - 1) + "]");
106: } else {
107: return this .names.elementAt(colum).toString();
108: }
109: }
110:
111: /**
112: * Asigna un nombre a una columna
113: * @param colum - número de columna
114: * @param name - nombre que se asigna a la columna
115: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
116: * @throws InfoException - Si el nombre que se desea asignar a la columna es null
117: */
118: public void setColumName(int colum, String name)
119: throws IndexOutOfBoundsException, InfoException {
120: if (!this .validateColumNumber(colum)) {
121: throw new IndexOutOfBoundsException(
122: "INFO - La columna "
123: + colum
124: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
125: + (this .columsCount - 1) + "]");
126: } else if (name == null) {
127: throw new InfoException(
128: "INFO - Las columnas no permiten valores nulos");
129: } else {
130: this .names.setElementAt(name, colum);
131: }
132: }
133:
134: /**
135: * Devuelve el objeto posicionado en la fila y columna especificada
136: * @param row - Número de fila
137: * @param colum - Número de columna
138: * @return Object posicionado en la fila row y columna colum
139: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
140: */
141: public Object getValueAt(int row, int colum)
142: throws IndexOutOfBoundsException {
143: if (this .validateRowNumber(row)
144: && this .validateColumNumber(colum)) {
145: return ((Vector) this .rows.elementAt(row)).elementAt(colum);
146: } else {
147: throw new IndexOutOfBoundsException(
148: "INFO - La fila "
149: + row
150: + " y la columna "
151: + colum
152: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
153: + (this .getRowCount() - 1) + "],[0.."
154: + (this .columsCount - 1) + "]");
155: }
156: }
157:
158: /**
159: * Devuelve los objetos posicionados en la columna especificada
160: * @param colum - número de columna
161: * @return Collection con los objetos seleccionados
162: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
163: */
164: public Collection getColumValues(int colum)
165: throws IndexOutOfBoundsException {
166: if (this .validateColumNumber(colum)) {
167: Vector data;
168: Vector values = new Vector();
169:
170: for (int i = 0; i < this .rows.size(); i++) {
171: data = (Vector) this .rows.elementAt(i);
172: values.addElement(data.elementAt(colum));
173: }
174:
175: return values;
176: } else {
177: throw new IndexOutOfBoundsException(
178: "INFO - La columna "
179: + colum
180: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
181: + (this .columsCount - 1) + "]");
182: }
183: }
184:
185: /**
186: * Devuelve los objetos posicionados en la columna especificada
187: * @param row - número de fila
188: * @return Collection con los objetos seleccionados
189: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
190: */
191: public Collection getRowValues(int row)
192: throws IndexOutOfBoundsException {
193: if (this .validateRowNumber(row)) {
194: return (Vector) this .rows.elementAt(row);
195: } else {
196: throw new IndexOutOfBoundsException(
197: "INFO - La fila "
198: + row
199: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
200: + (this .getRowCount() - 1) + "]");
201: }
202: }
203:
204: /**
205: * Modifica el objeto posicionado en la coordenada solicitada
206: * @param row - número de fila
207: * @param colum - número de columna
208: * @param newValue - nuevo valor a posicionar en la coordenada solicitada
209: * @throws IndexOutOfBoundsException - Si la posición solicitada no se encuadra en las dimensiones de la matriz
210: */
211: public void updateValueAt(int row, int colum, Object newValue)
212: throws IndexOutOfBoundsException {
213: if (this .validateRowNumber(row)
214: && this .validateColumNumber(colum)) {
215: ((Vector) this .rows.elementAt(row)).setElementAt(newValue,
216: colum);
217: } else {
218: throw new IndexOutOfBoundsException(
219: "INFO - La fila "
220: + row
221: + " y la columna "
222: + colum
223: + " esta fuera de las coordenadas de este DataSource. Rango permitido [0.."
224: + (this .getRowCount() - 1) + "],[0.."
225: + (this .columsCount - 1) + "]");
226: }
227: }
228:
229: /**
230: * Añade una nueva fila a la matriz
231: * @param row - Fila a insertar
232: * @throws InfoException - Si la fila que se desea introducir no tiene el mismo número de columnas que la matriz
233: */
234: public void addRow(Collection row) throws InfoException {
235: if (row == null) {
236: throw new InfoException(LanguageTraslator.traslate("380"));
237: } else if (row.size() != this .columsCount) {
238: throw new InfoException(LanguageTraslator.traslate("381")
239: + this .columsCount
240: + LanguageTraslator.traslate("382") + row.size());
241: } else {
242: this .rows.addElement(new Vector(row));
243: }
244: }
245:
246: /**
247: * Genera un vector de tamaño elements con elementos value
248: * @param value - Valor que se quiere replicar en el vector
249: * @param elements - número de elementos que se desea que tenga el vector
250: * @return Vector de tamañan elements con valores value
251: */
252: private Vector generateVector(Object value, int elements) {
253: Vector vector = new Vector();
254:
255: for (int i = 0; i < elements; i++) {
256: vector.addElement(value);
257: }
258: return vector;
259: }
260:
261: /**
262: * Valida que el número de columna esté en el rango permitido.
263: * El rango deberá estar comprendido entre [1..n]
264: * @param number - número de columna
265: * @return true si el número de columna es válido. False en caso contrario
266: */
267: private boolean validateColumNumber(int number) {
268: if ((number < 0) || (number >= this .columsCount)) {
269: return false;
270: } else {
271: return true;
272: }
273: }
274:
275: /**
276: * Valida que el número de fila esté en el rango permitido.
277: * El rango deberá estar comprendido entre [1..n]
278: * @param number - número de fila
279: * @return true si el número de fila es válido. False en caso contrario
280: */
281: private boolean validateRowNumber(int number) {
282: if ((number < 0) || (number >= this .rows.size())) {
283: return false;
284: } else {
285: return true;
286: }
287: }
288:
289: /**
290: * Valida que la collection no sea vacía
291: * @param coll - Collection a evaluar
292: * @return true si es vacia, false en caso contrario
293: */
294: private boolean namesEmpty(Collection coll) {
295: return coll.isEmpty();
296: }
297:
298: /**
299: * Valida que la collection de nombres no contiene elementos nulos.
300: * @param coll - Collection a evaluar
301: * @return true si contiene elementos nulos, false en caso contrario.
302: */
303: private boolean namesWithNullElements(Collection coll) {
304: boolean withNulls = false;
305:
306: Iterator it = coll.iterator();
307:
308: while ((it.hasNext()) && (!withNulls)) {
309: if (it.next() == null) {
310: withNulls = true;
311: }
312: }
313: return withNulls;
314: }
315:
316: /**
317: * Valida que la collection tenga elementos de tipo String.
318: * @param coll - Collection a evaluar
319: * @return true si la collection contiene objetos que no sean de tipo String, false si todos son de tipo String
320: */
321: private boolean namesWithNoStringElements(Collection coll) {
322: boolean withNoStringElements = false;
323:
324: Iterator it = coll.iterator();
325:
326: while ((it.hasNext()) && (!withNoStringElements)) {
327: if (!(it.next() instanceof String)) {
328: withNoStringElements = true;
329: }
330: }
331: return withNoStringElements;
332: }
333:
334: }
|