1
2
3
4
5 package com.hack23.cia.service.impl.common;
6
7 import gnu.trove.THashMap;
8 import gnu.trove.THashSet;
9
10 import java.awt.Color;
11 import java.awt.GradientPaint;
12 import java.io.ByteArrayOutputStream;
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import java.util.Date;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Set;
19
20 import org.apache.commons.logging.Log;
21 import org.apache.commons.logging.LogFactory;
22 import org.jfree.chart.ChartFactory;
23 import org.jfree.chart.ChartUtilities;
24 import org.jfree.chart.JFreeChart;
25 import org.jfree.chart.plot.PlotOrientation;
26 import org.jfree.data.category.CategoryDataset;
27 import org.jfree.data.category.DefaultCategoryDataset;
28 import org.jfree.data.time.Day;
29 import org.jfree.data.time.Hour;
30 import org.jfree.data.time.TimeSeries;
31 import org.jfree.data.time.TimeSeriesCollection;
32
33 import com.hack23.cia.model.application.impl.common.Agency;
34 import com.hack23.cia.model.application.impl.common.ImageContent;
35 import com.hack23.cia.model.application.impl.common.Language;
36 import com.hack23.cia.model.application.impl.common.LanguageContent;
37 import com.hack23.cia.model.application.impl.common.ParliamentChart;
38 import com.hack23.cia.model.sweden.impl.Ballot;
39 import com.hack23.cia.model.sweden.impl.ParliamentMember;
40 import com.hack23.cia.model.sweden.impl.PartyBallotResult;
41 import com.hack23.cia.model.sweden.impl.PoliticalParty;
42 import com.hack23.cia.model.sweden.impl.Vote;
43 import com.hack23.cia.model.sweden.impl.Vote.Position;
44
45
46 /***
47 * The Class ChartServiceImpl.
48 */
49 public class ChartServiceImpl implements ChartService {
50
51 /*** The Constant LOGGER. */
52 private static final Log LOGGER = LogFactory
53 .getLog(ChartServiceImpl.class);
54
55 /***
56 * Creates the bar3 d chart.
57 *
58 * @param dataset the dataset
59 * @param title the title
60 * @param xTitle the x title
61 * @param yTitle the y title
62 * @param fileName the file name
63 * @return the image content
64 */
65 private ImageContent createBar3DChart(final CategoryDataset dataset,final String title,final String xTitle,final String yTitle,final String fileName) {
66 final JFreeChart chart = ChartFactory.createBarChart3D(title,
67 xTitle,
68 yTitle,
69 dataset,
70 PlotOrientation.VERTICAL,
71 true,
72 true,
73 false
74 );
75 chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0,
76 1000, Color.blue));
77
78 try {
79 final ByteArrayOutputStream file = new ByteArrayOutputStream();
80 ChartUtilities.writeChartAsPNG(file, chart, 800,
81 600);
82 final ImageContent imageContent = new ImageContent();
83 imageContent.setFileName(fileName);
84 imageContent.setMimetype("image/png");
85 imageContent.setImageContent(file.toByteArray());
86 return imageContent;
87 } catch (final IOException e) {
88
89 e.printStackTrace();
90 return null;
91 }
92
93 }
94
95
96
97
98
99
100
101
102 @Override
103 @SuppressWarnings("unchecked")
104 public final ImageContent createRecentActionsGraph(final List actionEventHistory) {
105 final String title = "Actions during 24 hours";
106 final String timeAxisLabel = "Hours";
107 final String valueAxisLabel = "Actions";
108
109 final TimeSeries totalByHourData = new TimeSeries("Total");
110
111 final Day day = new Day(new Date());
112
113 for (final Object o : actionEventHistory) {
114 final Integer i = (Integer) ((Object[]) o)[0];
115 final Long total = (Long) ((Object[]) o)[1];
116
117 totalByHourData.add(new Hour(i, day), total);
118 }
119
120 final TimeSeriesCollection actionsByHourDataset = new TimeSeriesCollection(
121 totalByHourData);
122
123 return createTimeSeriesChart(title, timeAxisLabel, valueAxisLabel, "ActionsByHour.jpg", actionsByHourDataset);
124 }
125
126
127
128
129
130
131
132
133 @Override
134 @SuppressWarnings("unchecked")
135 public final ImageContent createResponseTimeGraph(final List responseTimeHistory) {
136 final String title = "Response Time during 24 hours";
137 final String timeAxisLabel = "Hours";
138 final String valueAxisLabel = "Response Time ms";
139
140 final TimeSeries avgResponseTimeByHourData = new TimeSeries("Average");
141 final TimeSeries minResponseTimeByHourData = new TimeSeries("Minimum");
142 final TimeSeries maxResponseTimeByHourData = new TimeSeries("Maximum");
143
144 final Day day = new Day(new Date());
145
146 for (final Object o : responseTimeHistory) {
147 final Integer i = (Integer) ((Object[]) o)[0];
148 final Double avg = (Double) ((Object[]) o)[1];
149 final Long min = (Long) ((Object[]) o)[2];
150 final Long max = (Long) ((Object[]) o)[3];
151
152 avgResponseTimeByHourData.add(new Hour(i, day), avg);
153 minResponseTimeByHourData.add(new Hour(i, day), min);
154 maxResponseTimeByHourData.add(new Hour(i, day), max);
155 }
156
157 final TimeSeriesCollection responseTimeByHourDataset = new TimeSeriesCollection(
158 avgResponseTimeByHourData);
159 responseTimeByHourDataset.addSeries(maxResponseTimeByHourData);
160 responseTimeByHourDataset.addSeries(minResponseTimeByHourData);
161
162 return createTimeSeriesChart(title, timeAxisLabel, valueAxisLabel, "responseTimeByHour.jpg", responseTimeByHourDataset);
163 }
164
165 /***
166 * Creates the time series chart.
167 *
168 * @param title the title
169 * @param timeAxisLabel the time axis label
170 * @param valueAxisLabel the value axis label
171 * @param fileName the file name
172 * @param responseTimeByHourDataset the response time by hour dataset
173 * @return the image content
174 */
175 private ImageContent createTimeSeriesChart(final String title,
176 final String timeAxisLabel, final String valueAxisLabel,final String fileName,
177 final TimeSeriesCollection responseTimeByHourDataset) {
178 final boolean legend = true;
179 final boolean tooltips = true;
180 final boolean urls = false;
181 final JFreeChart createTimeSeriesChart = ChartFactory.createTimeSeriesChart(
182 title, timeAxisLabel, valueAxisLabel,
183 responseTimeByHourDataset, legend, tooltips, urls);
184 createTimeSeriesChart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0,
185 1000, Color.blue));
186 try {
187 final ByteArrayOutputStream file = new ByteArrayOutputStream();
188 ChartUtilities.writeChartAsPNG(file, createTimeSeriesChart, 800,
189 600);
190 final ImageContent imageContent = new ImageContent();
191 imageContent.setFileName(fileName);
192 imageContent.setMimetype("image/png");
193 imageContent.setImageContent(file.toByteArray());
194 return imageContent;
195 } catch (final IOException e) {
196
197 e.printStackTrace();
198 return null;
199 }
200 }
201
202
203
204
205
206 @Override
207 public final List<ImageContent> generateBallotCharts(final Agency agency,
208 final Ballot ballot,final List<PoliticalParty> politicalParties,
209 final Language language) {
210 final CategoryDataset dataset = new DefaultCategoryDataset();
211
212 final ArrayList<ImageContent> imageContents = new ArrayList<ImageContent>();
213 final LanguageContent titleOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE_BY_PARTY, language);
214 final LanguageContent valueAxisLabelOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE, language);
215 final LanguageContent titlePresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENT_PERCENTAGE_BY_PARTY, language);
216 final LanguageContent valueAxisLabelPresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENCE_PERCENTAGE, language);
217 final LanguageContent titleLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENTAGE_BY_PARTY, language);
218 final LanguageContent valueAxisLabelLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENT, language);
219
220 final LanguageContent timeAxisLabel=agency.getLanguageContentByKey(Agency.LanguageContentKey.BALLOTS, language);
221
222 final Map<PoliticalParty,TimeSeries> partyTimeSeriesWinMap = new THashMap<PoliticalParty, TimeSeries>();
223 final Map<PoliticalParty,TimeSeries> partyTimeSeriesPresentMap = new THashMap<PoliticalParty, TimeSeries>();
224 final Map<PoliticalParty,TimeSeries> partyTimeSeriesLoyalMap = new THashMap<PoliticalParty, TimeSeries>();
225
226 final TimeSeriesCollection winningPartyOverTimeSeriesCollection = new TimeSeriesCollection();
227 final TimeSeriesCollection presentPartyOverTimeSeriesCollection = new TimeSeriesCollection();
228 final TimeSeriesCollection loyalPartyOverTimeSeriesCollection = new TimeSeriesCollection();
229
230 for (final PoliticalParty politicalParty : politicalParties) {
231 final TimeSeries winTimeSeries = new TimeSeries(politicalParty.getName());
232 winningPartyOverTimeSeriesCollection.addSeries(winTimeSeries);
233 partyTimeSeriesWinMap.put(politicalParty, winTimeSeries);
234
235 final TimeSeries presentTimeSeries = new TimeSeries(politicalParty.getName());
236 presentPartyOverTimeSeriesCollection.addSeries(presentTimeSeries);
237 partyTimeSeriesPresentMap.put(politicalParty, presentTimeSeries);
238
239 final TimeSeries loyalTimeSeries = new TimeSeries(politicalParty.getName());
240 loyalPartyOverTimeSeriesCollection.addSeries(loyalTimeSeries);
241 partyTimeSeriesLoyalMap.put(politicalParty, loyalTimeSeries);
242 }
243
244 for (final PoliticalParty politicalParty : politicalParties) {
245
246 final PartyBallotResult partyBallotResult = ballot.getPartyBallotResult(politicalParty.getShortCode());
247
248
249 }
250
251 imageContents.add(createBar3DChart(dataset, titleOutCome.getContent(), valueAxisLabelOutCome.getContent(),valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.Summary,ballot, language)));
252 imageContents.add(createBar3DChart(dataset, titleOutCome.getContent(), valueAxisLabelOutCome.getContent(),valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.Outcome,ballot, language)));
253 imageContents.add(createBar3DChart(dataset, titleOutCome.getContent(), valueAxisLabelOutCome.getContent(),valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.PoliticalPartyBehavior,ballot, language)));
254 imageContents.add(createBar3DChart(dataset, titleOutCome.getContent(), valueAxisLabelOutCome.getContent(),valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.ProffessionalBehavior,ballot, language)));
255
256 return imageContents;
257 }
258
259
260
261
262 @Override
263 public final List<ImageContent> generateCommitteeReportCharts(final Agency agency,
264 final List<Ballot> allBallots, final List<PoliticalParty> allPoliticalParties,
265 final Language language) {
266 return new ArrayList<ImageContent>();
267 }
268
269
270
271
272
273
274
275 @Override
276 public final List<ImageContent> generateParliamentCharts(final Agency agency, final List<Ballot> ballots,final List<PoliticalParty> politicalParties,final Language language) {
277 final LanguageContent titleOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE_BY_PARTY, language);
278 final LanguageContent valueAxisLabelOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE, language);
279 final LanguageContent titlePresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENT_PERCENTAGE_BY_PARTY, language);
280 final LanguageContent valueAxisLabelPresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENCE_PERCENTAGE, language);
281 final LanguageContent titleLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENTAGE_BY_PARTY, language);
282 final LanguageContent valueAxisLabelLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENT, language);
283
284 final LanguageContent timeAxisLabel=agency.getLanguageContentByKey(Agency.LanguageContentKey.BALLOTS, language);
285
286 final List<ImageContent> imageContents = new ArrayList<ImageContent>();
287 final Map<PoliticalParty,TimeSeries> partyTimeSeriesWinMap = new THashMap<PoliticalParty, TimeSeries>();
288 final Map<PoliticalParty,TimeSeries> partyTimeSeriesPresentMap = new THashMap<PoliticalParty, TimeSeries>();
289 final Map<PoliticalParty,TimeSeries> partyTimeSeriesLoyalMap = new THashMap<PoliticalParty, TimeSeries>();
290
291 final Map<String,Long> partyDayWinMap = new THashMap<String, Long>();
292 final Map<String,Long> partyDayPresentMap = new THashMap<String, Long>();
293 final Map<String,Long> partyDayLoyalMap = new THashMap<String, Long>();
294
295 final Map<Day,Long> dayBallotsTotalMap = new THashMap<Day, Long>();
296
297 final TimeSeriesCollection winningPartyOverTimeSeriesCollection = new TimeSeriesCollection();
298 final TimeSeriesCollection presentPartyOverTimeSeriesCollection = new TimeSeriesCollection();
299 final TimeSeriesCollection loyalPartyOverTimeSeriesCollection = new TimeSeriesCollection();
300
301 for (final PoliticalParty politicalParty : politicalParties) {
302 final TimeSeries winTimeSeries = new TimeSeries(politicalParty.getName());
303 winningPartyOverTimeSeriesCollection.addSeries(winTimeSeries);
304 partyTimeSeriesWinMap.put(politicalParty, winTimeSeries);
305
306 final TimeSeries presentTimeSeries = new TimeSeries(politicalParty.getName());
307 presentPartyOverTimeSeriesCollection.addSeries(presentTimeSeries);
308 partyTimeSeriesPresentMap.put(politicalParty, presentTimeSeries);
309
310 final TimeSeries loyalTimeSeries = new TimeSeries(politicalParty.getName());
311 loyalPartyOverTimeSeriesCollection.addSeries(loyalTimeSeries);
312 partyTimeSeriesLoyalMap.put(politicalParty, loyalTimeSeries);
313 }
314
315 final Set<Day> days = new THashSet<Day>();
316
317 for (final Ballot ballot : ballots) {
318
319 final Day day = new Day(ballot.getDatum());
320 days.add(day);
321 Long dayBallotsTotal = dayBallotsTotalMap.get(day);
322
323 if (dayBallotsTotal== null) {
324 dayBallotsTotal = 0L;
325 }
326
327 dayBallotsTotal++;
328
329 dayBallotsTotalMap.put(day,dayBallotsTotal);
330
331 for (final PoliticalParty politicalParty : politicalParties) {
332
333 Long dayPartyPartyWin = partyDayWinMap.get(day+ politicalParty.getShortCode());
334 Long dayPartyPresent = partyDayPresentMap.get(day+ politicalParty.getShortCode());
335 Long dayPartyLoyal = partyDayLoyalMap.get(day+ politicalParty.getShortCode());
336
337
338 if (dayPartyPartyWin == null) {
339 dayPartyPartyWin = 0L;
340 dayPartyPresent =0L;
341 dayPartyLoyal=0L;
342 }
343 final PartyBallotResult partyBallotResult = ballot.getPartyBallotResult(politicalParty.getShortCode());
344
345 if (partyBallotResult != null) {
346 dayPartyPresent = dayPartyPresent+ ((partyBallotResult.getTotalVotes() - partyBallotResult.getAbsentVotes()) * 100L / partyBallotResult.getTotalVotes());
347 dayPartyLoyal = dayPartyLoyal + ((partyBallotResult.getTotalVotes() - partyBallotResult.getOpponentVotes()) * 100L / partyBallotResult.getTotalVotes());
348
349 if (partyBallotResult.getWinningPosition().equals(ballot.getBallotResult().getWinningPosition())) {
350 dayPartyPartyWin = dayPartyPartyWin + (partyBallotResult.getWinningVotes() * 100 / partyBallotResult.getTotalVotes());
351 } else {
352 dayPartyPartyWin = dayPartyPartyWin + (partyBallotResult.getOpponentVotes() * 100 / partyBallotResult.getTotalVotes());
353 }
354 }
355
356 partyDayWinMap.put(day+ politicalParty.getShortCode(),dayPartyPartyWin);
357 partyDayPresentMap.put(day+ politicalParty.getShortCode(),dayPartyPresent);
358 partyDayLoyalMap.put(day+ politicalParty.getShortCode(),dayPartyLoyal);
359 }
360 }
361
362 for (final Day day: days) {
363 final Long dayBallotsTotal = dayBallotsTotalMap.get(day);
364
365 for (final PoliticalParty politicalParty : politicalParties) {
366
367 TimeSeries timeSeries = partyTimeSeriesWinMap.get(politicalParty);
368 final Long dayPartyWin = partyDayWinMap.get(day+ politicalParty.getShortCode());
369 timeSeries.add(day,dayPartyWin / dayBallotsTotal );
370
371 timeSeries = partyTimeSeriesPresentMap.get(politicalParty);
372 final Long dayPartyPresent = partyDayPresentMap.get(day+ politicalParty.getShortCode());
373 timeSeries.add(day,dayPartyPresent / dayBallotsTotal);
374
375 timeSeries = partyTimeSeriesLoyalMap.get(politicalParty);
376 final Long dayPartyLoyal = partyDayLoyalMap.get(day+ politicalParty.getShortCode());
377 timeSeries.add(day,dayPartyLoyal / dayBallotsTotal );
378 }
379 }
380
381 imageContents.add(createTimeSeriesChart(titleOutCome.getContent(), timeAxisLabel.getContent(), valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.Outcome, language), winningPartyOverTimeSeriesCollection));
382 imageContents.add(createTimeSeriesChart(titlePresent.getContent(), timeAxisLabel.getContent(), valueAxisLabelPresent.getContent(), ParliamentChart.getFileName(ParliamentChart.ProffessionalBehavior, language), presentPartyOverTimeSeriesCollection));
383 imageContents.add(createTimeSeriesChart(titleLoyal.getContent(), timeAxisLabel.getContent(), valueAxisLabelLoyal.getContent(), ParliamentChart.getFileName(ParliamentChart.PoliticalPartyBehavior, language), loyalPartyOverTimeSeriesCollection));
384
385 return imageContents;
386 }
387
388
389
390
391 @Override
392 public final List<ImageContent> generateParliamentMemberCharts(final Agency agency,
393 final List<Ballot> ballots,final ParliamentMember parliamentMember,final List<PoliticalParty> politicalParties,
394 final Language language) {
395
396 final LanguageContent titleOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.OUTCOME, language);
397 final LanguageContent valueAxisLabelOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE, language);
398 final LanguageContent titlePresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PROFFESSIONAL_BEHAVIOR, language);
399 final LanguageContent valueAxisLabelPresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENCE_PERCENTAGE, language);
400 final LanguageContent titleLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.POLITICAL_PARTY_BEHAVIOR, language);
401 final LanguageContent valueAxisLabelLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENT, language);
402
403 final LanguageContent timeAxisLabel=agency.getLanguageContentByKey(Agency.LanguageContentKey.BALLOTS, language);
404
405 final List<ImageContent> imageContents = new ArrayList<ImageContent>();
406 final TimeSeries winTimeSeries = new TimeSeries(titleOutCome.getContent());
407 final TimeSeries presentTimeSeries = new TimeSeries(titlePresent.getContent());
408 final TimeSeries loyalTimeSeries = new TimeSeries(titleLoyal.getContent());
409
410 final TimeSeriesCollection winningOverTimeSeriesCollection = new TimeSeriesCollection();
411 final TimeSeriesCollection presentOverTimeSeriesCollection = new TimeSeriesCollection();
412 final TimeSeriesCollection loyalOverTimeSeriesCollection = new TimeSeriesCollection();
413 final TimeSeriesCollection summaryOverTimeSeriesCollection = new TimeSeriesCollection();
414
415 winningOverTimeSeriesCollection.addSeries(winTimeSeries);
416
417 presentOverTimeSeriesCollection.addSeries(presentTimeSeries);
418
419 loyalOverTimeSeriesCollection.addSeries(loyalTimeSeries);
420 summaryOverTimeSeriesCollection.addSeries(winTimeSeries);
421 summaryOverTimeSeriesCollection.addSeries(presentTimeSeries);
422 summaryOverTimeSeriesCollection.addSeries(loyalTimeSeries);
423
424 final Set<Day> days = new THashSet<Day>();
425 final Map<Day,Long> dayBallotsTotalMap = new THashMap<Day, Long>();
426 final Map<Day,Long> dayWinMap = new THashMap<Day, Long>();
427 final Map<Day,Long> dayPresentMap = new THashMap<Day, Long>();
428 final Map<Day,Long> dayLoyalMap = new THashMap<Day, Long>();
429
430 for (final Ballot ballot : ballots) {
431
432 final Day day = new Day(ballot.getDatum());
433 days.add(day);
434 Long dayBallotsTotal = dayBallotsTotalMap.get(day);
435 Long dayWin = dayWinMap.get(day);
436 Long dayPresent = dayPresentMap.get(day);
437 Long dayLoyal = dayLoyalMap.get(day);
438
439 if (dayBallotsTotal== null) {
440 dayBallotsTotal = 0L;
441 dayWin = 0L;
442 dayPresent =0L;
443 dayLoyal=0L;
444 }
445
446
447 final PartyBallotResult partyBallotResult = ballot.getPartyBallotResult(parliamentMember.getPoliticalParty().getShortCode());
448 final Vote voteForParliamentMember = ballot.getVoteForParliamentMember(parliamentMember);
449 if (voteForParliamentMember != null) {
450 if (voteForParliamentMember.isWinning()) {
451 dayWin++;
452 }
453 if (!voteForParliamentMember.getPosition().equals(Position.Absent)) {
454 dayPresent++;
455 }
456
457 if (!partyBallotResult.isRebelVote(voteForParliamentMember)) {
458 dayLoyal++;
459 }
460 dayBallotsTotal++;
461 }
462 dayBallotsTotalMap.put(day,dayBallotsTotal);
463 dayWinMap.put(day,dayWin);
464 dayPresentMap.put(day,dayPresent);
465 dayLoyalMap.put(day,dayLoyal);
466 }
467
468 for (final Day day: days) {
469 final Long dayBallotsTotal = dayBallotsTotalMap.get(day);
470 if (dayBallotsTotal != 0) {
471 final Long dayWin = dayWinMap.get(day);
472 winTimeSeries.add(day,dayWin *100 / dayBallotsTotal );
473
474 final Long dayPresent = dayPresentMap.get(day);
475 presentTimeSeries.add(day,dayPresent * 100 / dayBallotsTotal );
476
477 final Long dayLoyal = dayLoyalMap.get(day);
478 loyalTimeSeries.add(day,dayLoyal * 100 / dayBallotsTotal );
479 }
480 }
481 LOGGER.info("Generate chart for " + parliamentMember.getName());
482 imageContents.add(createTimeSeriesChart(titleOutCome.getContent() +" "+ parliamentMember.getName(), timeAxisLabel.getContent(), valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.Outcome,parliamentMember, language), winningOverTimeSeriesCollection));
483 imageContents.add(createTimeSeriesChart(titlePresent.getContent() +" "+ parliamentMember.getName(), timeAxisLabel.getContent(), valueAxisLabelPresent.getContent(), ParliamentChart.getFileName(ParliamentChart.ProffessionalBehavior,parliamentMember, language), presentOverTimeSeriesCollection));
484 imageContents.add(createTimeSeriesChart(titleLoyal.getContent() +" "+ parliamentMember.getName(), timeAxisLabel.getContent(), valueAxisLabelLoyal.getContent(), ParliamentChart.getFileName(ParliamentChart.PoliticalPartyBehavior,parliamentMember, language), loyalOverTimeSeriesCollection));
485 imageContents.add(createTimeSeriesChart(parliamentMember.getName(), timeAxisLabel.getContent(), "%", ParliamentChart.getFileName(ParliamentChart.Summary,parliamentMember, language), summaryOverTimeSeriesCollection));
486
487 return imageContents;
488
489 }
490
491
492
493
494 @Override
495 public final List<ImageContent> generatePoliticalPartyCharts(final Agency agency,
496 final List<Ballot> ballots, final PoliticalParty politicalParty,
497 final Language language) {
498 final LanguageContent titleOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.OUTCOME, language);
499 final LanguageContent valueAxisLabelOutCome=agency.getLanguageContentByKey(Agency.LanguageContentKey.WINNING_PERCENTAGE, language);
500 final LanguageContent titlePresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PROFFESSIONAL_BEHAVIOR, language);
501 final LanguageContent valueAxisLabelPresent=agency.getLanguageContentByKey(Agency.LanguageContentKey.PRESENCE_PERCENTAGE, language);
502 final LanguageContent titleLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.POLITICAL_PARTY_BEHAVIOR, language);
503 final LanguageContent valueAxisLabelLoyal=agency.getLanguageContentByKey(Agency.LanguageContentKey.LOYAL_PERCENT, language);
504
505 final LanguageContent timeAxisLabel=agency.getLanguageContentByKey(Agency.LanguageContentKey.BALLOTS, language);
506
507 final List<ImageContent> imageContents = new ArrayList<ImageContent>();
508 final TimeSeries winTimeSeries = new TimeSeries(titleOutCome.getContent());
509 final TimeSeries presentTimeSeries = new TimeSeries(titlePresent.getContent());
510 final TimeSeries loyalTimeSeries = new TimeSeries(titleLoyal.getContent());
511
512 final TimeSeriesCollection winningOverTimeSeriesCollection = new TimeSeriesCollection();
513 final TimeSeriesCollection presentOverTimeSeriesCollection = new TimeSeriesCollection();
514 final TimeSeriesCollection loyalOverTimeSeriesCollection = new TimeSeriesCollection();
515 final TimeSeriesCollection summaryOverTimeSeriesCollection = new TimeSeriesCollection();
516
517 winningOverTimeSeriesCollection.addSeries(winTimeSeries);
518
519 presentOverTimeSeriesCollection.addSeries(presentTimeSeries);
520
521 loyalOverTimeSeriesCollection.addSeries(loyalTimeSeries);
522 summaryOverTimeSeriesCollection.addSeries(winTimeSeries);
523 summaryOverTimeSeriesCollection.addSeries(presentTimeSeries);
524 summaryOverTimeSeriesCollection.addSeries(loyalTimeSeries);
525
526 final Set<Day> days = new THashSet<Day>();
527 final Map<Day,Long> dayBallotsTotalMap = new THashMap<Day, Long>();
528 final Map<Day,Long> dayWinMap = new THashMap<Day, Long>();
529 final Map<Day,Long> dayPresentMap = new THashMap<Day, Long>();
530 final Map<Day,Long> dayLoyalMap = new THashMap<Day, Long>();
531
532 for (final Ballot ballot : ballots) {
533
534 final Day day = new Day(ballot.getDatum());
535 days.add(day);
536 Long dayBallotsTotal = dayBallotsTotalMap.get(day);
537 Long dayWin = dayWinMap.get(day);
538 Long dayPresent = dayPresentMap.get(day);
539 Long dayLoyal = dayLoyalMap.get(day);
540
541 if (dayBallotsTotal== null) {
542 dayBallotsTotal = 0L;
543 dayWin = 0L;
544 dayPresent =0L;
545 dayLoyal=0L;
546 }
547
548
549 final PartyBallotResult partyBallotResult = ballot.getPartyBallotResult(politicalParty.getShortCode());
550 if (partyBallotResult != null) {
551 dayWin = dayWin + (partyBallotResult.getWinningVotes() * 100L / partyBallotResult.getTotalVotes());
552 dayPresent = dayPresent + ((partyBallotResult.getTotalVotes() - partyBallotResult.getAbsentVotes()) * 100L / partyBallotResult.getTotalVotes());
553 dayLoyal = dayLoyal + ((partyBallotResult.getTotalVotes() - partyBallotResult.getOpponentVotes()) * 100L / partyBallotResult.getTotalVotes());
554 dayBallotsTotal++;
555 }
556 dayBallotsTotalMap.put(day,dayBallotsTotal);
557 dayWinMap.put(day,dayWin);
558 dayPresentMap.put(day,dayPresent);
559 dayLoyalMap.put(day,dayLoyal);
560 }
561
562 for (final Day day: days) {
563 final Long dayBallotsTotal = dayBallotsTotalMap.get(day);
564 if (dayBallotsTotal != 0) {
565 final Long dayWin = dayWinMap.get(day);
566 winTimeSeries.add(day,dayWin / dayBallotsTotal );
567
568 final Long dayPresent = dayPresentMap.get(day);
569 presentTimeSeries.add(day,dayPresent / dayBallotsTotal );
570
571 final Long dayLoyal = dayLoyalMap.get(day);
572 loyalTimeSeries.add(day,dayLoyal / dayBallotsTotal );
573 }
574 }
575 LOGGER.info("Generate chart for " + politicalParty.getName());
576 imageContents.add(createTimeSeriesChart(titleOutCome.getContent() +" "+ politicalParty.getName(), timeAxisLabel.getContent(), valueAxisLabelOutCome.getContent(), ParliamentChart.getFileName(ParliamentChart.Outcome,politicalParty, language), winningOverTimeSeriesCollection));
577 imageContents.add(createTimeSeriesChart(titlePresent.getContent() +" "+ politicalParty.getName(), timeAxisLabel.getContent(), valueAxisLabelPresent.getContent(), ParliamentChart.getFileName(ParliamentChart.ProffessionalBehavior,politicalParty, language), presentOverTimeSeriesCollection));
578 imageContents.add(createTimeSeriesChart(titleLoyal.getContent() +" "+ politicalParty.getName(), timeAxisLabel.getContent(), valueAxisLabelLoyal.getContent(), ParliamentChart.getFileName(ParliamentChart.PoliticalPartyBehavior,politicalParty, language), loyalOverTimeSeriesCollection));
579 imageContents.add(createTimeSeriesChart(politicalParty.getName(), timeAxisLabel.getContent(), "%", ParliamentChart.getFileName(ParliamentChart.Summary,politicalParty, language), summaryOverTimeSeriesCollection));
580
581 return imageContents;
582 }
583
584
585
586 }