View Javadoc

1   package ecar.servlet.grafico;
2   
3   import java.awt.Color;
4   import java.awt.Font;
5   import java.io.IOException;
6   import java.util.ArrayList;
7   import java.util.Calendar;
8   import java.util.Date;
9   import java.util.Iterator;
10  import java.util.List;
11  
12  import javax.servlet.ServletException;
13  import javax.servlet.http.HttpServlet;
14  import javax.servlet.http.HttpServletRequest;
15  import javax.servlet.http.HttpServletResponse;
16  import javax.servlet.http.HttpSession;
17  
18  import org.apache.log4j.Logger;
19  import org.jfree.chart.ChartFactory;
20  import org.jfree.chart.ChartUtilities;
21  import org.jfree.chart.JFreeChart;
22  import org.jfree.chart.axis.CategoryAxis;
23  import org.jfree.chart.axis.ValueAxis;
24  import org.jfree.chart.labels.CategoryItemLabelGenerator;
25  import org.jfree.chart.labels.ItemLabelAnchor;
26  import org.jfree.chart.labels.ItemLabelPosition;
27  import org.jfree.chart.plot.CategoryPlot;
28  import org.jfree.chart.renderer.category.CategoryItemRenderer;
29  import org.jfree.data.category.CategoryDataset;
30  import org.jfree.data.category.IntervalCategoryDataset;
31  import org.jfree.data.gantt.Task;
32  import org.jfree.data.gantt.TaskSeries;
33  import org.jfree.data.gantt.TaskSeriesCollection;
34  import org.jfree.ui.TextAnchor;
35  
36  import comum.util.Data;
37  import comum.util.Pagina;
38  
39  import ecar.pojo.PontoCriticoPtc;
40  
41  public class GraficoGanttPontosCriticos extends HttpServlet {
42  
43  	private Logger logger = null;
44  	
45  	/**
46  	 * Constructor of the object.
47  	 */
48      public GraficoGanttPontosCriticos() {
49          this.logger = Logger.getLogger(this.getClass());
50       }
51  	
52      /**
53       * Gera Grafico de Previsao dos Indicadores de Resultado.<br>
54       * 
55       * @author N/C
56       * @since N/C
57       * @version N/C
58       * @param HttpServletRequest request
59       * @param HttpServletResponse response
60       * @throws ServletException
61       * @throws IOException
62       */
63      public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64          
65  	    try {
66  	    	
67  	    	HttpSession session = request.getSession();
68  	        session.setAttribute("lang","pt");
69  	    	
70  	    	List pontosCriticosSolucionados =  (ArrayList) request.getSession().getAttribute("listPontosCriticos");
71  	    	
72  	    	String labelPontosCriticos = Pagina.getParamStr(request, "labelPontosCriticos");
73  	    
74  	    	Date dataBase = new Date(Pagina.getParamStr(request, "dataBase"));
75  	    	
76  	    	IntervalCategoryDataset dataSet = criarDataSetSolucionadoAteDataBase(pontosCriticosSolucionados, dataBase);
77  	    	
78  	    	if (dataSet != null){
79  		    	
80  	    		JFreeChart grafico = gerarGrafico(dataSet, labelPontosCriticos, pontosCriticosSolucionados.size());
81  		    		    	
82  		    	response.setContentType("image/jpeg");        
83  
84  		    	ChartUtilities.writeChartAsJPEG(response.getOutputStream(), grafico, 1200, 120 + (pontosCriticosSolucionados.size() *35));
85  			    response.getOutputStream().flush();
86  			    response.getOutputStream().close();
87  	    	}	    	
88  	    	
89  	    } catch (IOException e) {
90  			this.logger.error(e);
91  			throw new ServletException(e);
92  		} catch (Exception e) {
93  			this.logger.error(e);
94  			throw new ServletException(e);
95  		}
96      }
97      
98      private static IntervalCategoryDataset criarDataSet(List pontosCriticosSolucionados, Date dataBase){
99      	    	
100     	TaskSeries sDatasPrevistas = new TaskSeries("Data Limite");
101     	TaskSeries sDatasFim = new TaskSeries("Data Fim");
102     	    	    	
103     	Iterator itPontosCriticosSolucionados = pontosCriticosSolucionados.iterator();
104     	boolean possuiAlgumaDataSolucao = false;	
105     	
106     	while (itPontosCriticosSolucionados.hasNext()){
107     		
108     		PontoCriticoPtc pontoCriticoSolucionado = (PontoCriticoPtc) itPontosCriticosSolucionados.next();
109     			    		
110     		//Verificar data base
111     		if (pontoCriticoSolucionado.getDataSolucaoPtc() != null && pontoCriticoSolucionado.getDataSolucaoPtc().compareTo(dataBase) <= 0){
112     			
113     			Date dataLimite = pontoCriticoSolucionado.getDataLimitePtc();
114     			possuiAlgumaDataSolucao = true;
115     			
116     			if (pontosCriticosSolucionados.size() == 1){
117     				
118     				sDatasPrevistas.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
119 							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite)-1),
120 							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite) + 1)));
121 			
122 					Date dataFim = pontoCriticoSolucionado.getDataSolucaoPtc();
123 					
124 					sDatasFim.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
125     					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim)-1),
126     					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim) + 1)));
127     			}
128     			else{
129 	    			sDatasPrevistas.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
130 	    							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite)-1),
131 	    							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite) + pontosCriticosSolucionados.size()/2)));
132 	    			
133 	    			Date dataFim = pontoCriticoSolucionado.getDataSolucaoPtc();
134 	    			
135 	    			sDatasFim.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
136 		    					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim)-1),
137 		    					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim) + pontosCriticosSolucionados.size()/2)));
138     			}
139     			
140     		}
141     	}
142     	
143     	TaskSeriesCollection colecao = new TaskSeriesCollection();
144     	
145     	
146     	if (possuiAlgumaDataSolucao){    	
147 	    	
148 	    	colecao.add(sDatasPrevistas);
149 	    	colecao.add(sDatasFim);
150     	}
151     	
152         return colecao;
153     }
154     
155         private static IntervalCategoryDataset criarDataSetSolucionadoAteDataBase(List pontosCriticosSolucionados, Date dataBase){
156     	    	
157     	TaskSeries sDatasPrevistas = new TaskSeries("Data Limite");
158     	TaskSeries sDatasFim = new TaskSeries("Data Fim");
159     	    	    	
160     	Iterator itPontosCriticosSolucionados = pontosCriticosSolucionados.iterator();
161     	boolean possuiAlgumaDataSolucao = false;	
162     	
163     	while (itPontosCriticosSolucionados.hasNext()){
164     		
165     		PontoCriticoPtc pontoCriticoSolucionado = (PontoCriticoPtc) itPontosCriticosSolucionados.next();
166     			    		
167 //    		//Verificar data base
168 //    		if (pontoCriticoSolucionado.getDataSolucaoPtc() != null && pontoCriticoSolucionado.getDataSolucaoPtc().compareTo(dataBase) <= 0){
169     			
170 			Date dataLimite = pontoCriticoSolucionado.getDataLimitePtc();
171 			Date dataFim = pontoCriticoSolucionado.getDataSolucaoPtc();
172 			possuiAlgumaDataSolucao = true;
173 			
174 			if (pontosCriticosSolucionados.size() == 1){
175 				
176 				sDatasPrevistas.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
177 						date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite)-1),
178 						date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite) + 1)));
179 		
180 				if (dataFim != null && dataFim.compareTo(dataBase) <= 0){
181 					sDatasFim.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
182     					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim)-1),
183     					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim) + 1)));
184 				}
185 			}
186 			else{
187     			sDatasPrevistas.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
188     							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite)-1),
189     							date(Data.getAno(dataLimite), Data.getMes(dataLimite), Data.getDia(dataLimite) + pontosCriticosSolucionados.size()/2)));
190     			
191     			if (dataFim != null && dataFim.compareTo(dataBase) <= 0){
192 	    			sDatasFim.add(new Task(pontoCriticoSolucionado.getDescricaoPtc(),
193 		    					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim)-1),
194 		    					date(Data.getAno(dataFim), Data.getMes(dataFim), Data.getDia(dataFim) + pontosCriticosSolucionados.size()/2)));
195     			}
196 			}
197     	} //fim while
198     	
199     	TaskSeriesCollection colecao = new TaskSeriesCollection();
200     	
201     	
202     	if (possuiAlgumaDataSolucao){    	
203 	    	
204 	    	colecao.add(sDatasPrevistas);
205 	    	colecao.add(sDatasFim);
206     	}
207     	
208         return colecao;
209     }
210     
211     private static Date date(int year, int month, int day) {
212 
213         final Calendar calendar = Calendar.getInstance();
214         calendar.set(year, month, day);
215         final Date result = calendar.getTime();
216         return result;
217 
218     }
219     
220     private JFreeChart gerarGrafico(IntervalCategoryDataset dataSet, String labelPontosCriticos, int numeroPontosCriticos) {
221         
222     	JFreeChart chart = ChartFactory.createGanttChart(
223     		labelPontosCriticos,  // chart title
224             "Descrição",         // domain axis label
225             "Data",              // range axis label
226             dataSet,             // data
227             true,                // include legend
228             true,                // tooltips
229             false                // urls
230         );
231     	    	    	    	
232         chart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelWidthRatio(10.0f);
233     	    	
234         chart.setBackgroundPaint(Color.white);
235         
236         CategoryPlot plot = chart.getCategoryPlot();
237         
238         //barras verticais e horizontais do gráfico
239         plot.setDomainGridlinePaint(Color.black);
240         plot.setRangeGridlinePaint(Color.black);   
241         plot.setDomainGridlinesVisible(true);
242         plot.setRangeGridlinesVisible(true);
243         
244         //eixo das datas
245         ValueAxis rangeAxis = (ValueAxis) plot.getRangeAxis();
246         rangeAxis.setUpperMargin(5.0 / (double) numeroPontosCriticos);
247                 
248         //eixo das descrições
249         CategoryAxis domainAxis = (CategoryAxis) plot.getDomainAxis();
250         domainAxis.setLowerMargin(0.10);
251         domainAxis.setCategoryMargin(0.2);
252                                 
253         CategoryItemRenderer renderer = plot.getRenderer();
254         
255         //Fonte das datas
256         Font labelFont = new Font("Times new Roman", 0, 10);
257         renderer.setItemLabelFont(labelFont);
258         
259         //Posições das datas
260         renderer.setPositiveItemLabelPosition(new ItemLabelPosition(   
261         		ItemLabelAnchor.OUTSIDE2, TextAnchor.CENTER_LEFT), true);
262         
263         //renderer.setLabelGenerator(new LabelGenerator());
264         
265         renderer.setItemLabelsVisible(true);
266              	
267     	return chart;
268     }
269     
270     
271     static class LabelGenerator implements CategoryItemLabelGenerator {
272     	    	
273     	/**
274     	* Generates a label for the specified item. The label is typically a
275     	* formatted version of the data value, but any text can be used.
276     	*
277     	* @param dataset the dataset (<code>null</code> not permitted).
278     	* @param series the series index (zero-based).
279     	* @param category the category index (zero-based).
280     	*
281     	* @return The label (possibly <code>null</code>).
282     	*/    	
283 		public String generateLabel(CategoryDataset dataSet, int series, int category) {
284 			
285 			String result = null;
286 	    	Number value = dataSet.getValue(series, category);
287 	    	
288 	    	if (value != null) {
289 	    		
290 		    	long v = value.longValue()+1;
291 		    	Date date = new Date(v);
292 		    	date = Data.addDias(1, date);
293 //		    	date = Data.addMeses(1, date);
294 		    	int dia = Data.getDia(date);
295 		    	if (dia == 32 || dia == 0)
296 		    		dia = 1;
297 		    	int mes = Data.getMes(date) + 1;		    	
298 		    	if (mes == 0 || mes == 13)
299 		    		mes = 1;
300 		    	result = dia + "/" + 
301 		    			mes + "/" + Data.getAno(date);
302 		    	
303 	    	}
304 	    	return result;
305 		}
306 
307 		public String generateColumnLabel(CategoryDataset arg0, int arg1) {
308 			return null;
309 		}
310 
311 		public String generateRowLabel(CategoryDataset arg0, int arg1) {
312 			return null;
313 		}
314     }
315 }