View Javadoc

1   ////////////////////////////////////////////////////////////////////////////////
2   //CabaWeb
3   //Copyright (C) 2004  Thomas Vogt <Thomas.Vogt@TVC-Software.com>
4   //
5   //This library is free software; you can redistribute it and/or
6   //modify it under the terms of the GNU Lesser General Public
7   //License as published by the Free Software Foundation; either
8   //version 2.1 of the License, or (at your option) any later version.
9   //
10  //This library is distributed in the hope that it will be useful,
11  //but WITHOUT ANY WARRANTY; without even the implied warranty of
12  //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  //Lesser General Public License for more details.
14  //
15  //You should have received a copy of the GNU Lesser General Public
16  //License along with this library; if not, write to the Free Software
17  //Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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      /* ----- Konstruktoren / Destruktoren ----- */
51  
52      /***
53       * Standardkonstruktor der nicht zug&auml;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      /* ----- Thread Methode ----- */
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                 // Inkrementiere Semaphore, Warte auf Freigabe, Vater wartet bis semaphor == Threadcount - 1
247                 lock.incrementSemaphore();
248                 // Warte auf NotifyAll bzw 60 Minuten.
249                 lock.wait(3600000);
250                 // Dekrementiere Semaphore, Arbeite weiter
251                 lock.decrementSemaphore();
252 
253                 if (log.isDebugEnabled())
254                 {
255                     log.debug(" FINALIZING THREAD. " + getName());
256                 }
257 
258                 // Dekrementiere FinishSemaphore, ICH BIN FERTIG
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     /* ----- SET und GET Methoden ----- */
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 }