KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > calipso > reportgenerator > reportcalculator > DataTree


1 package com.calipso.reportgenerator.reportcalculator;
2
3 import com.calipso.reportgenerator.reportcalculator.*;
4
5 import java.util.Iterator JavaDoc;
6 import java.io.Serializable JavaDoc;
7
8 /**
9  * Representa los datos de un reporte de tipo estatico
10  * en una estructura de arbol.
11  */

12
13 public class DataTree implements Serializable JavaDoc, PivotClient {
14   private DataTreeDefinition defintion;
15   private StaticQuery query;
16   private DataTreeNode root;
17
18   /**
19    * Obtiene la definicion asignada al <code>DataTree</code>
20    * @return
21    */

22   public DataTreeDefinition getDefintion() {
23     return defintion;
24   }
25
26   /**
27    * Asigna una definicion al <code>DataTree</code>
28    * @param definition
29    */

30   public void setDefinition(DataTreeDefinition definition) {
31     this.defintion = definition;
32   }
33
34   public Iterator JavaDoc valuesFor(int dimension, int[] previousDimensions, Object JavaDoc[] values) {
35     return null;
36   }
37
38   /**
39    * Devuelve el iterador del <code>DataTree</code>
40    * @return
41    */

42   public DataTreeIterator iterator() {
43     return DataTreeIterator.on(this);
44   }
45
46   public Object JavaDoc[] measuresAtDimensionsValues(int[] dimensions, Object JavaDoc[] values) {
47     return new Object JavaDoc[0];
48   }
49
50   /**
51    * Asigna la <code>StaticQuery</code> al <code>DataTree</code>
52    * @param staticQuery
53    */

54   public void setQuery(StaticQuery staticQuery) {
55     this.query = staticQuery;
56   }
57
58   /**
59    * * Reinicializa el <code>DataTree</code>. Como efecto se pierden todos los datos actuales.
60    */

61   public void reset() {
62     root = null;
63   }
64
65   /**
66    * Devuelve la raiz del <code>DataTree</code>.
67    * @return
68    */

69   public DataTreeNode getRoot() {
70     if (root == null) {
71       root = new DataTreeNode(null, "Root", query.getMetrics().length, -1);
72     }
73     return root;
74   }
75
76   /**
77    * Crea una rama del arbol a partir del array que recibe por parametro.
78    * Por cada dimension que agrupa se crea u obtiene un ya creado
79    * <code>DataTreeNode</code>, excepto para la ultima dimension.
80    * A cada instancia de <code>DataTreeNode</code> de cada dimension que agrupa,
81    * se le actualizan las metricas, es decir, se recalcula el total de estas
82    * sumando las actuales mas las acumuladas, excepto para la ultima dimension,
83    * en tal caso se crea una instancia de <code>DataTreeSubItem</code>, que representan
84    * las hojas del arbol.
85    * @param row
86    */

87   public void fillWith(Object JavaDoc[] row) {
88     int[] groupDims = query.getGroupDimensions();
89     int[] noGroupDims = query.getNoGroupDimensions();
90
91     if(query.matches(row)) {
92       DataTreeNode currentNode = getRoot();
93       SharedFloat[] metricValues = new SharedFloat[query.getMetrics().length];
94       fillMetricValues(metricValues, row);
95       updateMetricValues(currentNode, metricValues);
96
97       for ( int i = 0; i < groupDims.length; i++) {
98         int index = groupDims[i];
99         currentNode = currentNode.getNodeFrom(row[index], index );
100         updateMetricValues(currentNode, metricValues);
101       }
102
103       String JavaDoc[] noGroupDimValues = new String JavaDoc[noGroupDims.length];
104       for (int i = 0; i < noGroupDims.length; i++) {
105         int index = noGroupDims[i];
106         noGroupDimValues[i] = row[index].toString();
107       }
108       DataTreeSubItem subItem = currentNode.getSubItem(noGroupDimValues);
109       subItem.updateMetricValues(metricValues);
110     }
111   }
112
113   /**
114    * Llena un array con los valores de las metricas correspondientes
115    * en el objeto Object[] row que recibe por parametro.
116    * @param metricValues
117    * @param row
118    */

119   private void fillMetricValues(SharedFloat[] metricValues, Object JavaDoc[] row) {
120     int[] metrics = query.getMetrics();
121     for (int i = 0; i < metrics.length; i++){
122       int index = metrics[i];
123       metricValues[i] = ((SharedFloat) row[index]);
124     }
125   }
126
127   /**
128    * Asigna para el nodo correspondiente los valores de las metricas
129    * del array recibido por parametro.
130    * @param node
131    * @param metricValues
132    */

133   private void updateMetricValues(DataTreeNode node, SharedFloat[] metricValues) {
134     for (int i = 0; i < metricValues.length; i++) {
135       node.updateMetricValue(i, metricValues[i]);
136     }
137   }
138
139
140   /**
141    * Devuelve la <code>StaticQuery</code> asignada al <code>DataTree</code>
142    * @return
143    */

144   public StaticQuery getQuery() {
145     return query;
146   }
147   /**
148    * Sirve para pasar el indice de la metrica en el DataSource al
149    * indice de la metrica en el array de metricValues del
150    * subItem.
151    */

152   public void afterFill() {
153     int[] metrics = query.getMetrics();
154     int[] accMetrics = query.getAccumulableMetrics();
155     int[] adjAccMetrics = new int[accMetrics.length];
156     for (int i = 0; i < accMetrics.length; i++) {
157       int metricIndex = -1;
158       for (int j = 0; j < metrics.length; j++) {
159         if (accMetrics[i] == metrics[j]){
160           metricIndex = j;
161           break;
162         }
163       }
164       adjAccMetrics[i] = metricIndex;
165     }
166     if (getDefintion().getAccumulable()){
167       root.calculateAccumulable(adjAccMetrics);
168     }
169   }
170 }
171
Popular Tags