1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.fhw.cabaweb.calculation.threads;
21
22 import java.util.Collection;
23 import java.util.Iterator;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.fhw.cabaweb.data.DataInterfaceErgebnissdaten;
28 import org.fhw.cabaweb.data.constants.Constants;
29 import org.fhw.cabaweb.data.dataobjects.Ergebniss;
30
31 /***
32 * Die Klasse checkt die Entscheidungen auf Inhalt / Existenz und korrigiert sie / legt sie an.
33 *
34 * @author <a href="mailto:thomas.vogt@tvc-software.com">Thomas Vogt</a>
35 * @version Version 1.0 12.08.2004
36 */
37 public final class CheckEntscheidungen extends Thread
38 {
39 /*** Commons Logging Instanz */
40 private Log log = LogFactory.getLog("org.fhw.cabaweb.calculation.threads.CheckEntscheidungen");
41 /*** Das LOCK Objekt */
42 private Lock lock;
43 /*** Die Projektnummer */
44 private Integer projektnummer;
45 /*** Die Gruppennummer */
46 private Integer gruppennummer;
47 /*** Das Quartal */
48 private Integer quartal;
49
50
51
52 /***
53 * Standardkonstruktor der nicht zugänglich sein soll
54 */
55 private CheckEntscheidungen()
56 {
57 log.error("!!! DEFAULT CONSTRUCTOR NOT TO BE USED !!!");
58 }
59
60 /***
61 * Standardkonstruktor der das "Lock" Objekt übergeben bekommt
62 *
63 * @param lock Das Lock Objekt
64 */
65 public CheckEntscheidungen(Lock lock)
66 {
67 this.lock = lock;
68 }
69
70 /***
71 * Standardkonstruktor der das "Lock" Objekt übergeben bekommt
72 * Zusätzlich auch noch die nötigen Parameter
73 *
74 * @param lock Das Lock Objekt
75 * @param projektnummer Die Projektnummer
76 * @param gruppennummer Die Gruppennummer
77 * @param quartal Das Quartal
78 */
79 public CheckEntscheidungen(Lock lock, Integer projektnummer, Integer gruppennummer, Integer quartal)
80 {
81 this.lock = lock;
82 this.projektnummer = projektnummer;
83 this.gruppennummer = gruppennummer;
84 this.quartal = quartal;
85 }
86
87
88
89 /***
90 * Methode die beim Start des Threads ausgeführt wird
91 *
92 * Aufruf:
93 *
94 * Object lock = new Object ();
95 * CheckEntscheidungen mt1 = new CheckEntscheidungen (lock, PROJEKTNUMMER, GRUPPENNUMMER, QUARTAL);
96 * mt1.setName ("Name XYZ");
97 * // DEFAULT PRIORITY IS 5, MIN(IDLE) = 1, MAX(REALTIME) = 10
98 * mt1.setPriority(5);
99 * mt1.start();
100 *
101 * while(Thread.activeCount() > 1)
102 * {
103 * synchronized (lock)
104 * {
105 * try
106 * {
107 * lock.wait();
108 * }
109 * catch (Exception e)
110 * {
111 * // Error Handling
112 * }
113 * }
114 * }
115 */
116 public synchronized void run()
117 {
118 if (lock != null && projektnummer != null && gruppennummer != null && quartal != null)
119 {
120
121 if (log.isDebugEnabled())
122 {
123 log.debug(" THREAD NAME : " + getName());
124 log.debug(" THREAD PRIO : " + getPriority());
125 log.debug(" (S) Start der Verarbeitung \"CheckEntscheidungen\" fuer Gruppe \"" + gruppennummer + "\", Quartal \"" + quartal + "\" THREAD NAME : " + getName());
126 }
127
128 try
129 {
130 /*** Data Interface (indirekter Zugriff auf die OJB Ebene) initialisieren */
131 DataInterfaceErgebnissdaten die = new DataInterfaceErgebnissdaten();
132
133 Collection entscheidungen = die.sucheKombination_Gruppierung(projektnummer, gruppennummer, quartal, Constants.EG_ENTSCHEIDUNGEN_KEY);
134
135 Iterator entscheidungsiterator = entscheidungen.iterator();
136 while (entscheidungsiterator.hasNext())
137 {
138 Ergebniss entscheidung = (Ergebniss) entscheidungsiterator.next();
139
140 if (entscheidung == null)
141 {
142 entscheidungsiterator.remove();
143 }
144 }
145
146 if (log.isDebugEnabled())
147 {
148 log.debug(" SIZE ENTSCHEIDUNGEN '" + entscheidungen.size() + "'");
149 }
150
151 if (entscheidungen.size() == 0)
152 {
153 die.editieren(new Integer(1), gruppennummer, quartal, "0");
154 die.editieren(new Integer(2), gruppennummer, quartal, "0");
155
156 entscheidungen = die.sucheKombination_Gruppierung(projektnummer, gruppennummer, quartal, Constants.EG_ENTSCHEIDUNGEN_KEY);
157
158 entscheidungsiterator = entscheidungen.iterator();
159 while (entscheidungsiterator.hasNext())
160 {
161 Ergebniss entscheidung = (Ergebniss) entscheidungsiterator.next();
162
163 if (entscheidung == null)
164 {
165 entscheidungsiterator.remove();
166 }
167 }
168
169 if (log.isDebugEnabled())
170 {
171 log.debug(" SIZE ENTSCHEIDUNGEN '" + entscheidungen.size() + "'");
172 }
173 }
174
175 entscheidungsiterator = entscheidungen.iterator();
176 while (entscheidungsiterator.hasNext())
177 {
178 Ergebniss entscheidung = (Ergebniss) entscheidungsiterator.next();
179 boolean returnvalue;
180
181 if (entscheidung.getObjectWert() == null)
182 {
183 Ergebniss vorquartalsentscheidung = (Ergebniss) die.sucheKombination_Feld(projektnummer, gruppennummer, new Integer(quartal.intValue() - 1), entscheidung.getFeldnummer());
184
185 if (vorquartalsentscheidung != null && vorquartalsentscheidung.getObjectWert() != null)
186 {
187 if (log.isDebugEnabled())
188 {
189 log.debug(" Entscheidung bekommt Wert vom VORQUARTAL zugewiesen");
190 }
191
192 returnvalue = die.editieren(entscheidung.getFeldnummer(), entscheidung.getGruppennummer(), entscheidung.getQuartal(), vorquartalsentscheidung.getObjectWert().toString());
193 }
194 else
195 {
196 if (log.isDebugEnabled())
197 {
198 log.debug(" Entscheidung bekommt Wert 0 zugewiesen");
199 }
200
201 returnvalue = die.editieren(entscheidung.getFeldnummer(), entscheidung.getGruppennummer(), entscheidung.getQuartal(), "0");
202 }
203
204 if (!returnvalue)
205 {
206 if (log.isDebugEnabled())
207 {
208 log.debug(" Entscheidung saving failed");
209 }
210 }
211 }
212 else
213 {
214 if (log.isDebugEnabled())
215 {
216 log.debug(" Entscheidung hat Wert " + entscheidung.getObjectWert().toString() + " - NOTHING TO DO");
217 }
218 }
219 }
220 }
221 catch (Exception e)
222 {
223 log.error("THREAD NAME : " + getName());
224 log.error(e.getMessage(), e);
225 }
226
227 if (log.isDebugEnabled())
228 {
229 log.debug(" (F) Verarbeitung \"CheckEntscheidungen\" fuer Gruppe \"" + gruppennummer + "\", Quartal \"" + quartal + "\" abgeschlossen");
230 }
231 }
232 else
233 {
234 log.error(" WICHTIGE DATEN FUER DEN THREAD WURDEN NICHT FESTGELEGT. STOPPE VERARBEITUNG !!! ");
235 }
236
237 synchronized (lock)
238 {
239 try
240 {
241 if (log.isDebugEnabled())
242 {
243 log.debug(" Waiting for other Threads to finish. " + getName());
244 }
245
246
247 lock.incrementSemaphore();
248
249 lock.wait(3600000);
250
251 lock.decrementSemaphore();
252
253 if (log.isDebugEnabled())
254 {
255 log.debug(" FINALIZING THREAD. " + getName());
256 }
257
258
259 lock.decrementFinishSemaphore();
260 }
261 catch (Exception e)
262 {
263 log.error("THREAD NAME : " + getName());
264 log.error(e.getMessage(), e);
265 }
266 }
267 }
268
269
270
271 /***
272 * GET Methode
273 *
274 * @return Gruppennummer
275 */
276 public Integer getGruppennummer()
277 {
278 return gruppennummer;
279 }
280
281 /***
282 * GET Methode
283 *
284 * @return Projektnummer
285 */
286 public Integer getProjektnummer()
287 {
288 return projektnummer;
289 }
290
291 /***
292 * GET Methode
293 *
294 * @return Quartal
295 */
296 public Integer getQuartal()
297 {
298 return quartal;
299 }
300
301 /***
302 * SET Methode
303 *
304 * @param gruppennummer Die Gruppennummer
305 */
306 public void setGruppennummer(Integer gruppennummer)
307 {
308 this.gruppennummer = gruppennummer;
309 }
310
311 /***
312 * SET Methode
313 *
314 * @param projektnummer Die Projektnummer
315 */
316 public void setProjektnummer(Integer projektnummer)
317 {
318 this.projektnummer = projektnummer;
319 }
320
321 /***
322 * SET Methode
323 *
324 * @param quartal Das Quartal
325 */
326 public void setQuartal(Integer quartal)
327 {
328 this.quartal = quartal;
329 }
330 }