View Javadoc

1   /*
2   Copyright 2010 James Pether Sörling Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 
3   	$Id
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, // chart title
67  				xTitle, 
68  				yTitle, 
69  				dataset,
70  				PlotOrientation.VERTICAL, // orientation
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  	            // TODO Auto-generated catch block
89  	            e.printStackTrace();
90  	            return null;
91  	        }
92  		
93  	}
94  
95      /*
96       * (non-Javadoc)
97       * 
98       * @see
99       * com.hack23.cia.service.GraphService#createRecentActionsGraph(java.util
100      * .List)
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      * (non-Javadoc)
128      * 
129      * @see
130      * com.hack23.cia.service.GraphService#createResponseTimeGraph(java.util
131      * .List)
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             // TODO Auto-generated catch block
197             e.printStackTrace();
198             return null;
199         }
200 	}
201 
202     
203     /* (non-Javadoc)
204 	 * @see com.hack23.cia.service.impl.common.ChartService#generateBallotCharts(com.hack23.cia.model.application.impl.common.Agency, java.util.List, java.util.List, com.hack23.cia.model.application.impl.common.Language)
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 	/* (non-Javadoc)
260 	 * @see com.hack23.cia.service.impl.common.ChartService#generateCommitteeReportCharts(com.hack23.cia.model.application.impl.common.Agency, java.util.List, java.util.List, com.hack23.cia.model.application.impl.common.Language)
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      * (non-Javadoc)
271      * 
272      * @see
273      * com.hack23.cia.service.GraphService#createShowWinningPartyOverTimeGraph()
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 	/* (non-Javadoc)
389 	 * @see com.hack23.cia.service.impl.common.ChartService#generateParliamentMemberCharts(com.hack23.cia.model.application.impl.common.Agency, java.util.List, java.util.List, java.util.List, com.hack23.cia.model.application.impl.common.Language)
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 	/* (non-Javadoc)
492 	 * @see com.hack23.cia.service.impl.common.ChartService#generatePoliticalPartyCharts(com.hack23.cia.model.application.impl.common.Agency, java.util.List, java.util.List, java.util.List, com.hack23.cia.model.application.impl.common.Language)
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 }