View Javadoc

1   // %1854600010:hoplugins.trainingExperience.dao%
2   package hoplugins.trainingExperience.dao;
3   
4   import gui.UserParameter;
5   
6   import hoplugins.Commons;
7   
8   import hoplugins.commons.utils.HTCalendar;
9   import hoplugins.commons.utils.HTCalendarFactory;
10  
11  import hoplugins.trainingExperience.OldTrainingManager;
12  import hoplugins.trainingExperience.vo.PlayerValues;
13  import hoplugins.trainingExperience.vo.TrainWeekEffect;
14  
15  import plugins.IJDBCAdapter;
16  import plugins.ISkillup;
17  import plugins.ISpieler;
18  
19  import java.sql.ResultSet;
20  import java.sql.Timestamp;
21  
22  import java.util.Calendar;
23  import java.util.Collections;
24  import java.util.Comparator;
25  import java.util.HashMap;
26  import java.util.Iterator;
27  import java.util.List;
28  import java.util.Map;
29  import java.util.Vector;
30  
31  
32  /***
33   * This class is used to collect all required data and fill the lists of values with instances of
34   * value objects.
35   *
36   * @author NetHyperon
37   */
38  public class EffectDAO {
39      //~ Static fields/initializers -----------------------------------------------------------------
40  
41      private static List trainWeeks = new Vector();
42  
43      //~ Methods ------------------------------------------------------------------------------------
44  
45      /***
46       * Return list of TrainingEffects for each week
47       *
48       * @return
49       */
50      public static List getTrainEffect() {
51          return trainWeeks;
52      }
53  
54      /***
55       * Calculates the training weeks and returns a list of TrainWeek instances. These value object
56       * contain the last hrf id before the training update and the first hrf id after the update.
57       */
58      public static void reload() {
59          try {
60              Map weeklySkillups = new HashMap();
61  
62              // Loop through all player (also old players) to get all trained skillups.
63              // Group these skillups by season and week.
64              List players = new Vector(Commons.getModel().getAllSpieler());
65  
66              players.addAll(Commons.getModel().getAllOldSpieler());
67  
68              for (Iterator iterPlayers = players.iterator(); iterPlayers.hasNext();) {
69                  ISpieler player = (ISpieler) iterPlayers.next();
70                  OldTrainingManager otm = new OldTrainingManager(player);
71                  List skillups = otm.getTrainedSkillups();
72  
73                  for (Iterator iterSkillups = skillups.iterator(); iterSkillups.hasNext();) {
74                      ISkillup skillup = (ISkillup) iterSkillups.next();
75                      String key = skillup.getHtSeason() + "-" + skillup.getHtWeek(); //$NON-NLS-1$
76                      List collectedSkillups = (List) weeklySkillups.get(key);
77  
78                      if (collectedSkillups == null) {
79                          collectedSkillups = new Vector();
80                          weeklySkillups.put(key, collectedSkillups);
81                      }
82  
83                      collectedSkillups.add(skillup);
84                  }
85              }
86  
87              IJDBCAdapter db = Commons.getModel().getAdapter();
88  
89              trainWeeks.clear();
90  
91              Calendar date = Calendar.getInstance();
92              date.add(Calendar.HOUR, UserParameter.instance().TimeZoneDifference);
93  
94              Timestamp datum = new Timestamp(date.getTimeInMillis());
95              ResultSet tDateset = db.executeQuery("SELECT DISTINCT trainingdate FROM xtradata WHERE trainingdate < '"
96                                                   + datum.toString() + "'");
97              List trainingDates = new Vector();
98  
99              try {
100                 while (tDateset.next()) {
101                     trainingDates.add(tDateset.getTimestamp("trainingdate"));
102                 }
103 
104                 tDateset.close();
105             } catch (Exception e) {
106             }
107 
108             Collections.sort(trainingDates,
109                              new Comparator() {
110                     public int compare(Object o1, Object o2) {
111                         Timestamp t1 = (Timestamp) o1;
112                         Timestamp t2 = (Timestamp) o2;
113 
114                         return t2.compareTo(t1);
115                     }
116                 });
117 
118             HTCalendar trainCalendar = HTCalendarFactory.createEconomyCalendar(Commons.getModel());
119 
120             for (Iterator iter = trainingDates.iterator(); iter.hasNext();) {
121                 Timestamp trainDate = (Timestamp) iter.next();
122 
123                 trainCalendar.setTime(trainDate);
124 
125                 StringBuffer minHrf_SQLStmt = new StringBuffer("SELECT hrf.hrf_id FROM hrf, xtradata");
126 
127                 minHrf_SQLStmt.append(" WHERE hrf.hrf_id=xtradata.hrf_id");
128                 minHrf_SQLStmt.append(" AND datum = (SELECT MAX(datum) FROM hrf WHERE datum < '"
129                                       + trainDate.toString() + "')");
130                 minHrf_SQLStmt.append(" AND trainingdate = '" + trainDate.toString() + "'");
131 
132                 ResultSet minHRFSet = db.executeQuery(minHrf_SQLStmt.toString());
133 
134                 int hrfBeforeUpdate = 0;
135 
136                 try {
137                     minHRFSet.next();
138                     hrfBeforeUpdate = minHRFSet.getInt("hrf_id"); //$NON-NLS-1$
139                     minHRFSet.close();
140                 } catch (Exception e) {
141                     hrfBeforeUpdate = 0;
142                 }
143 
144                 TrainWeekEffect week = null;
145 
146                 if (hrfBeforeUpdate > 0) {
147                     StringBuffer maxHrf_SQLStmt = new StringBuffer("SELECT hrf.hrf_id FROM hrf, xtradata");
148 
149                     maxHrf_SQLStmt.append(" WHERE hrf.hrf_id=xtradata.hrf_id");
150                     maxHrf_SQLStmt.append(" AND datum = (SELECT MIN(datum) FROM hrf WHERE datum > '"
151                                           + trainDate.toString() + "')");
152                     maxHrf_SQLStmt.append(" AND trainingdate > '" + trainDate.toString() + "'");
153 
154                     ResultSet maxHRFSet = db.executeQuery(maxHrf_SQLStmt.toString());
155 
156                     int hrfAfterUpdate = 0;
157 
158                     try {
159                         maxHRFSet.next();
160                         hrfAfterUpdate = maxHRFSet.getInt("hrf_id"); //$NON-NLS-1$
161                         maxHRFSet.close();
162                     } catch (Exception e) {
163                         hrfAfterUpdate = 0;
164                     }
165 
166                     if (hrfAfterUpdate > 0) {
167                         week = new TrainWeekEffect(trainCalendar.getHTWeek(),
168                                                    trainCalendar.getHTSeason(), hrfBeforeUpdate,
169                                                    hrfAfterUpdate);
170 
171                         ResultSet set = db.executeQuery("SELECT SUM(marktwert) as totaltsi, AVG(marktwert) as avgtsi , SUM(form) as form, COUNT(form) as number FROM spieler WHERE trainer = 0 AND hrf_id = " //$NON-NLS-1$
172                                                         + Integer.toString(week.getHRFafterUpdate()));
173 
174                         if (set != null) {
175                             set.next();
176                             week.setTotalTSI(set.getInt("totaltsi")); //$NON-NLS-1$
177                             week.setAverageTSI(set.getInt("avgtsi")); //$NON-NLS-1$
178 
179                             double avgForm = 0.0d;
180 
181                             if (set.getInt("number") != 0) { //$NON-NLS-1$
182                                 avgForm = set.getDouble("form") / set.getInt("number"); //$NON-NLS-1$ //$NON-NLS-2$
183                             }
184 
185                             week.setAverageForm(avgForm);
186                             set.close();
187                         }
188 
189                         Map valuesBeforeUpdate = new HashMap();
190 
191                         set = db.executeQuery("SELECT * FROM spieler WHERE trainer = 0 AND hrf_id = " //$NON-NLS-1$
192                                               + Integer.toString(week.getHRFbeforeUpdate()));
193 
194                         if (set != null) {
195                             while (set.next()) {
196                                 PlayerValues result = new PlayerValues(set.getInt("marktwert"), //$NON-NLS-1$
197                                                                        set.getInt("form")); //$NON-NLS-1$
198 
199                                 valuesBeforeUpdate.put(new Integer(set.getInt("spielerid")), result); //$NON-NLS-1$
200                             }
201 
202                             set.close();
203                         }
204 
205                         set = db.executeQuery("SELECT * FROM spieler, basics WHERE trainer = 0 AND spieler.hrf_id = basics.hrf_id AND spieler.hrf_id = " //$NON-NLS-1$
206                                               + Integer.toString(week.getHRFafterUpdate()));
207 
208                         if (set != null) {
209                             while (set.next()) {
210                                 Integer playerID = new Integer(set.getInt("spielerid")); //$NON-NLS-1$
211 
212                                 if (valuesBeforeUpdate.containsKey(playerID)) {
213                                     PlayerValues before = (PlayerValues) valuesBeforeUpdate.get(playerID);
214 
215                                     week.addTSI(set.getInt("marktwert") - before.getTsi()); //$NON-NLS-1$
216                                     week.addForm(set.getInt("form") - before.getForm()); //$NON-NLS-1$
217                                 }
218                             }
219 
220                             set.close();
221                         }
222                     }
223                 }
224 
225                 // Set amount of skillups for this training week
226                 String key = trainCalendar.getHTSeason() + "-" + trainCalendar.getHTWeek(); //$NON-NLS-1$
227 
228                 if (weeklySkillups.containsKey(key)) {
229                     if (week == null) {
230                         week = new TrainWeekEffect(trainCalendar.getHTWeek(),
231                                                    trainCalendar.getHTSeason(), 0, 0);
232                     }
233 
234                     week.setAmountSkillups(((List) weeklySkillups.get(key)).size());
235                 }
236 
237                 if (week != null) {
238                     trainWeeks.add(week);
239                 }
240             }
241         } catch (Exception e) {
242             e.printStackTrace();
243         }
244     }
245 }