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
47
48 public GraficoGanttPontosCriticos() {
49 this.logger = Logger.getLogger(this.getClass());
50 }
51
52
53
54
55
56
57
58
59
60
61
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
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
168
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 }
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,
224 "Descrição",
225 "Data",
226 dataSet,
227 true,
228 true,
229 false
230 );
231
232 chart.getCategoryPlot().getDomainAxis().setMaximumCategoryLabelWidthRatio(10.0f);
233
234 chart.setBackgroundPaint(Color.white);
235
236 CategoryPlot plot = chart.getCategoryPlot();
237
238
239 plot.setDomainGridlinePaint(Color.black);
240 plot.setRangeGridlinePaint(Color.black);
241 plot.setDomainGridlinesVisible(true);
242 plot.setRangeGridlinesVisible(true);
243
244
245 ValueAxis rangeAxis = (ValueAxis) plot.getRangeAxis();
246 rangeAxis.setUpperMargin(5.0 / (double) numeroPontosCriticos);
247
248
249 CategoryAxis domainAxis = (CategoryAxis) plot.getDomainAxis();
250 domainAxis.setLowerMargin(0.10);
251 domainAxis.setCategoryMargin(0.2);
252
253 CategoryItemRenderer renderer = plot.getRenderer();
254
255
256 Font labelFont = new Font("Times new Roman", 0, 10);
257 renderer.setItemLabelFont(labelFont);
258
259
260 renderer.setPositiveItemLabelPosition(new ItemLabelPosition(
261 ItemLabelAnchor.OUTSIDE2, TextAnchor.CENTER_LEFT), true);
262
263
264
265 renderer.setItemLabelsVisible(true);
266
267 return chart;
268 }
269
270
271 static class LabelGenerator implements CategoryItemLabelGenerator {
272
273
274
275
276
277
278
279
280
281
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
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 }