View Javadoc

1   /*
2    * Criado em 25/05/2005
3    *
4    */
5   package ecar.servlet.grafico;
6   
7   import java.awt.Font;
8   import java.io.IOException;
9   import java.util.ArrayList;
10  import java.util.Iterator;
11  import java.util.List;
12  import java.util.Map;
13  import java.util.Set;
14  
15  import javax.servlet.ServletException;
16  import javax.servlet.http.HttpServlet;
17  import javax.servlet.http.HttpServletRequest;
18  import javax.servlet.http.HttpServletResponse;
19  
20  import org.apache.log4j.Logger;
21  import org.jfree.chart.ChartFactory;
22  import org.jfree.chart.ChartUtilities;
23  import org.jfree.chart.JFreeChart;
24  import org.jfree.chart.axis.CategoryAxis;
25  import org.jfree.chart.axis.ValueAxis;
26  import org.jfree.chart.labels.CategoryItemLabelGenerator;
27  import org.jfree.chart.labels.ItemLabelAnchor;
28  import org.jfree.chart.labels.ItemLabelPosition;
29  import org.jfree.chart.plot.CategoryPlot;
30  import org.jfree.chart.plot.PlotOrientation;
31  import org.jfree.chart.renderer.category.CategoryItemRenderer;
32  import org.jfree.chart.title.TextTitle;
33  import org.jfree.data.category.CategoryDataset;
34  import org.jfree.data.category.DefaultCategoryDataset;
35  import org.jfree.ui.TextAnchor;
36  
37  import comum.util.Data;
38  import comum.util.Pagina;
39  
40  import ecar.dao.AcompRealFisicoDao;
41  import ecar.dao.AcompReferenciaItemDao;
42  import ecar.dao.ExercicioDao;
43  import ecar.dao.ItemEstrtIndResulDao;
44  import ecar.exception.ECARException;
45  import ecar.pojo.AcompRealFisicoArf;
46  import ecar.pojo.AcompReferenciaItemAri;
47  import ecar.pojo.ExercicioExe;
48  import ecar.pojo.ItemEstrtIndResulIettr;
49  
50  /**
51   * @author evandro
52   *
53   */
54  public class GraficoRealizadoNoExercicio extends HttpServlet{
55  
56  	/**
57  	 * 
58  	 */
59  	private static final long serialVersionUID = -7922981954605986999L;
60  	private Logger logger = null;
61  	
62  	
63  	/**
64  	 * Construtor
65  	 *
66  	 * @author N/C
67       * @since N/C
68       * @version N/C
69  	 */
70      public GraficoRealizadoNoExercicio() {
71          this.logger = Logger.getLogger(this.getClass());
72          
73       }
74      
75      /**
76       * Gera Grafico dos valores realizados no exercicio.<br>
77       * 
78       * @author N/C
79       * @since N/C
80       * @version N/C
81       * @param HttpServletRequest request
82       * @param HttpServletResponse response
83       * @throws ServletException
84       * @throws IOException
85       */
86      public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
87          
88  	    try {
89  	        JFreeChart grafico;
90  	        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
91  	        
92  	        String categoria = "Total Realizado";
93  	        String serie = "";
94  	        String indicador = "";
95  	        String titulo = "Valores Realizado no Exercício";
96  	        int numMeses = 0;
97  	        boolean existeLabelGrupo = false;
98  	        
99  	        AcompReferenciaItemDao acompRefItemDao = new AcompReferenciaItemDao(null);
100 	        AcompReferenciaItemAri acompRefItem = (AcompReferenciaItemAri) acompRefItemDao.buscar(AcompReferenciaItemAri.class, Long.valueOf(Pagina.getParamStr(request, "codAri")));
101 	        
102 	        if(!"".equals(Pagina.getParamStr(request, "codExe"))){
103 	        	ExercicioDao exercicioDao = new ExercicioDao(null);
104 	        	ExercicioExe exercicio = (ExercicioExe) exercicioDao.buscar(ExercicioExe.class, Long.valueOf(Pagina.getParamStr(request, "codExe")));
105 	        	
106 	        	titulo = titulo + " " + exercicio.getDescricaoExe() ;
107 	        	
108 	        	if(!"".equals(Pagina.getParamStr(request, "codIettir"))){
109 	        		ItemEstrtIndResulDao indResulDao = new ItemEstrtIndResulDao(null);
110 	        		ItemEstrtIndResulIettr indResul = (ItemEstrtIndResulIettr) indResulDao.buscar(ItemEstrtIndResulIettr.class, Long.valueOf(Pagina.getParamStr(request, "codIettir")));
111 	        		
112 	        		indicador = indResul.getNomeIettir();
113 	        		
114 	        		AcompRealFisicoDao acompRealFisicoDao = new AcompRealFisicoDao(null);
115 	        		
116 	        		List meses = new ArrayList();
117 	        		if(exercicio.equals(acompRefItem.getAcompReferenciaAref().getExercicioExe())){
118 	        			int mesRef = Integer.valueOf(acompRefItem.getAcompReferenciaAref().getMesAref()).intValue();
119 	        			int anoRef = Integer.valueOf(acompRefItem.getAcompReferenciaAref().getAnoAref()).intValue();	
120 	        			meses = new ExercicioDao(null).getMesesDentroDoExercicio(exercicio,mesRef,anoRef);
121 	        		}else{
122 	        			meses = new ExercicioDao(null).getMesesDentroDoExercicio(exercicio);
123 	        		}
124 	        		
125 	        		Map mapMeses = acompRealFisicoDao.getQtdRealizadaExercicioPorMes(exercicio, indResul);			
126 	        		
127 	        		Iterator it = meses.iterator();
128 	        		
129 	        		while(it.hasNext()){
130 	        			String mes = it.next().toString();
131 	        			String abrvMes = mes.split("-")[0];
132 	        			serie = Data.getAbreviaturaMes(Integer.valueOf(abrvMes).intValue()); //Abreviatura do mês
133 	        			
134 	        			double valor = 0;
135 	        			
136 	        			if(mapMeses.get(mes) != null) {
137 	        				valor = Double.parseDouble(mapMeses.get(mes).toString());
138 	        			}
139 						
140 	        			dataset.addValue(valor, categoria, serie);
141 	        			numMeses++;
142 	        		}
143 
144 	        		int anoRefIndicador = Data.getAno(exercicio.getDataInicialExe());
145 	        		int mesRefIndicador = numMeses;
146 
147 	        		//Verifica, através da opção "Nome do agrupamento para o Gráfico de Grupos" da tela de cadastro de metas/indicadores, se o indicador pertence a algum grupo.
148 	        		//Retorna um DefaultCategoryDataet com todas as metas/indicadores do item que participam do mesmo "Gráfico de Grupo do Indicador" e/ou que foram cadastradas como públicas
149 	        	    //e que participam do mesmo Gráfico de Grupo do Indicador.
150 	        		existeLabelGrupo = indResul.getLabelGraficoGrupoIettir() != null;
151 	        		if(existeLabelGrupo){
152 	        			indicador = "";
153 	        			dataset = imprimeIndicadoresMesmoGrupo(indResul, exercicio, mesRefIndicador, anoRefIndicador, request);
154 	        		}
155 
156 	        	}else{
157 	        		serie = exercicio.getDescricaoExe();
158 	        		dataset.addValue(0, categoria, serie);
159 	        	}
160 	        }else{
161 	            dataset.addValue(0, categoria, serie);
162 	        }
163 	
164 	        grafico = ChartFactory.createBarChart3D(titulo,
165 	                                               "",
166 	                                               indicador,
167 	                                               dataset,
168 	                                               PlotOrientation.VERTICAL,
169 	                                               true,
170 	                                               true,
171 	                                               false);
172 	                
173 	        CategoryPlot plot = grafico.getCategoryPlot();
174 	        
175 	        //Cria o renderer que será utilizado para apresentar o valor de cada barra no gráfico.
176 	        CategoryItemRenderer renderer = plot.getRenderer();
177 	        ItemLabelPosition posicao = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BOTTOM_CENTER,TextAnchor.CENTER,0);
178 	        renderer.setPositiveItemLabelPosition(posicao);
179 	        renderer.setItemLabelsVisible(true);
180 	        Font labelFont = new Font("Times new Roman", 0, 15);
181 	        renderer.setItemLabelFont(labelFont);
182 	        //renderer.setLabelGenerator(new LabelGenerator());
183 	        
184 	        
185 	        TextTitle title = new TextTitle();
186 	        title.setFont(new Font("Arial", Font.PLAIN, 15));
187 	        title.setText(titulo);
188 	        
189 	        grafico.setTitle(title);        
190 	        
191 	        CategoryAxis categoryaxis = plot.getDomainAxis();
192 	        categoryaxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 8)); 
193 	
194 	        ValueAxis valueaxis = plot.getRangeAxis();
195 	        valueaxis.setTickLabelFont(new Font("Arial", Font.PLAIN, 8)); 
196 	                
197 	        //CategoryDataset catDataset = plot.getDataset();
198 	                
199 	        // Renderer modifica propriedades
200 	        //CategoryItemRenderer renderer = plot.getRenderer();
201 	               
202 	        //renderer.setSeriesPaint(0, Color.GREEN);
203 	        //renderer.setSeriesPaint(1, Color.YELLOW);        
204 	        //renderer.setSeriesPaint(2, Color.RED);      
205 	        
206 	        //para o tamanho do gráfico é bom ser maior q 2
207 	        if(numMeses < 3){
208 	        	numMeses = 3;
209 	        }
210 	        
211 	        response.setContentType("image/jpeg");
212 	        int aumentaComp = 0;
213 	        if(existeLabelGrupo){
214 	        	aumentaComp = dataset.getRowCount() * 50;
215 	        }
216 	        int comp = (numMeses * 50 + aumentaComp);
217 	        int altura = 400;
218 	        ChartUtilities.writeChartAsPNG(response.getOutputStream(), grafico, comp, altura);
219 	        response.getOutputStream().flush();
220 	        response.getOutputStream().close();
221 	        
222 	    }catch (IOException e) {            
223             this.logger.error(e);
224 	    }catch (ECARException e) {            
225             this.logger.error(e);
226 	    }
227     }
228     
229     /**
230      *  Retorna um DefaultCategoryDataet com todas as metas/indicadores do item que participam do mesmo "Gráfico de Grupo do Indicador" e/ou que foram cadastradas como públicas
231      *  e que participam do mesmo Gráfico de Grupo do Indicador.
232      * 
233      * @param indResul
234      * @param exercicio 
235      * @param mesRef
236      * @param anoRef
237      * @param request
238      * @return
239      * @throws ECARException
240      */
241     private DefaultCategoryDataset imprimeIndicadoresMesmoGrupo(ItemEstrtIndResulIettr indResul,ExercicioExe exercicio, int mesRef, int anoRef, HttpServletRequest request) throws ECARException{
242     	
243     	ItemEstrtIndResulDao indResulDao = new ItemEstrtIndResulDao(null);
244     	AcompRealFisicoDao acompRealFisicoDao = new AcompRealFisicoDao(null);
245     	DefaultCategoryDataset dataset = new DefaultCategoryDataset();
246     	List listaIndicadoresGrupo = indResulDao.retornaIndicadoresGraficoGrupo(indResul);
247 		Iterator itListaIndicadoresGrupo = listaIndicadoresGrupo.iterator();
248 		String serie = "";
249 		
250 		//Percorre a lista de indicadores que pertencem ao mesmo Grupo indicador.
251 		while(itListaIndicadoresGrupo.hasNext()){
252 			ItemEstrtIndResulIettr itemIndicadorIettr = (ItemEstrtIndResulIettr) itListaIndicadoresGrupo.next();
253 			
254 			Set listaIndicadorAcompRealFisico = itemIndicadorIettr.getAcompRealFisicoArfs();
255 			Iterator itListaIndicadorAcompRealFisico = listaIndicadorAcompRealFisico.iterator();
256 			
257 			//Percorre os acompanhamentos físicos realizados de cada indicador.
258 			while(itListaIndicadorAcompRealFisico.hasNext()){
259 				AcompRealFisicoArf indicadorAcompRealFisico = (AcompRealFisicoArf) itListaIndicadorAcompRealFisico.next();
260 				
261 				List exerciciosAnterioresIndicador = new ExercicioDao(request).getExerciciosProjecaoByExercicio(indicadorAcompRealFisico.getItemEstruturaIett().getCodIett(),exercicio.getCodExe());
262 				Iterator itExAnterioresIndicador = exerciciosAnterioresIndicador.iterator();
263 					
264 				//Percorre todos os exercícios do acompanhamento físico em questão.
265 				while(itExAnterioresIndicador.hasNext()){
266 				
267 					ExercicioExe exercicioIndicador = (ExercicioExe) itExAnterioresIndicador.next();
268 					
269 					List meses = new ArrayList();
270 					
271 					//Verifica se o exercício do indicador é o mesmo exercício do item a partir do qual o gráfico será gerado.
272 					if(exercicio.getCodExe().equals(exercicioIndicador.getCodExe())){
273 		    			meses = new ExercicioDao(null).getMesesDentroDoExercicio(exercicio,mesRef,anoRef);
274 		    			
275 		    			Map mapMesesIndicadorGrupo = acompRealFisicoDao.getQtdRealizadaExercicioPorMes(exercicioIndicador, indicadorAcompRealFisico.getItemEstrtIndResulIettr());			
276 			    		
277 			    		Iterator it = meses.iterator();
278 			    		
279 			    		//Verifica nos acompanhamentos físicos os valores informados até o mês atual e os adiciona ao dataset. 
280 			    		while(it.hasNext()){
281 			    			String mes = it.next().toString();
282 			    			String abrvMes = mes.split("-")[0];
283 			    			
284 			    			if(Integer.parseInt(abrvMes) <= mesRef){
285 				    			
286 				    			serie = Data.getAbreviaturaMes(Integer.valueOf(abrvMes).intValue()); //Abreviatura do mês
287 				    			double valor = 0;
288 				    			if(mapMesesIndicadorGrupo.get(mes) != null) {
289 				    				valor = Double.parseDouble(mapMesesIndicadorGrupo.get(mes).toString());
290 				    			}				
291 				    			dataset.addValue(valor, itemIndicadorIettr.getNomeIettir(), serie);
292 			    			}
293 			    		}
294 		    		}
295 				}
296 			}
297 		}
298 		return dataset;
299     }
300     
301     /**
302      * Classe responsável pela geração do label utilizado no gráfico.
303      */
304     static class LabelGenerator implements CategoryItemLabelGenerator {
305     	
306     	/**
307     	* Gera o label para o item especificado
308     	*
309     	* @param dataset
310     	* @param series
311     	* @param category
312     	*
313     	* @return O label que será utilizado no gráfico
314     	*/    	
315 		public String generateLabel(CategoryDataset dataSet, int series, int category) {
316 			
317 	    	int valor = dataSet.getValue(series, category).intValue();
318 	    	if(valor == 0){
319 	    		return "";
320 	    	}else{
321 	    		return String.valueOf(valor);
322 	    	}
323 		}
324 
325 		public String generateColumnLabel(CategoryDataset arg0, int arg1) {
326 			// TODO Auto-generated method stub
327 			return null;
328 		}
329 
330 		public String generateRowLabel(CategoryDataset arg0, int arg1) {
331 			// TODO Auto-generated method stub
332 			return null;
333 		}
334     }
335 }