Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
814 mhunt 1
package com.erggroup.buildtool.daemon;
2
 
3
import com.erggroup.buildtool.daemon.BuildThread;
4
import com.erggroup.buildtool.ripple.MutableInt;
5
import com.erggroup.buildtool.ripple.MutableString;
6
import com.erggroup.buildtool.ripple.Package;
7
import com.erggroup.buildtool.ripple.ReleaseManager;
8
import com.erggroup.buildtool.ripple.RippleEngine;
9
 
10
import java.io.BufferedReader;
11
import java.io.File;
12
 
13
import java.io.FileReader;
14
 
15
import java.io.IOException;
16
 
17
import java.sql.SQLException;
18
 
19
import java.util.Iterator;
20
 
21
import java.util.Vector;
22
 
23
import org.apache.log4j.Logger;
24
import org.apache.tools.ant.taskdefs.Execute;
25
 
26
/**Master Thread sub component
27
 */
28
public class MasterThread
29
  extends BuildThread
30
{
31
 
32
  /**Logger
33
   * @attribute
34
   */
35
  private static final Logger mLogger = Logger.getLogger(MasterThread.class);
36
 
37
  /**
38
   * @attribute
39
   */
40
  private String[] command = new String[100];
41
 
42
  /**
43
   * @attribute
44
   */
45
  private int commandIndex = 0;
46
 
47
  /**
48
   * @attribute
49
   */
50
  private Execute thread = new Execute();
51
 
52
  /**constructor
53
   */
54
  public MasterThread(int rtag_id, int rcon_id, String gbebuildfilter)
55
  {
818 mhunt 56
    mLogger.warn("MasterThread rtag_id " + rtag_id + " rcon_id " + rcon_id);
814 mhunt 57
    mRtagId = rtag_id;
58
    mRconId = rcon_id;
59
    mGbebuildfilter = gbebuildfilter;
60
  }
61
 
62
  /**implements the sequence diagrams coordinate slave threads, generate build files, allowed to proceed, check environment
63
   */
64
  public void run()
65
  {
66
    Integer id = new Integer(mRtagId);
67
    setName(id.toString());
68
    mLogger.debug("run");
69
    boolean exit = false;
70
    RippleEngine rippleEngine = new RippleEngine(mReleaseManager, mRtagId, true);
71
    MutableInt rconId = new MutableInt();
72
    MutableInt current_run_level = new MutableInt();
73
    MutableString addendum = new MutableString();
74
 
75
    while(!exit)
76
    {
77
      try
78
      {
79
        if ( Thread.currentThread().isInterrupted() )
80
        {
81
          mLogger.warn("run is interrupted");
82
          // unit test technique
83
          throw new ExitException();
84
        }
85
 
86
        if ( mGbebuildfilter.compareTo("unit test spawn thread") == 0)
87
        {
88
          throw new Exception();
89
        }
90
 
91
        // allowed to proceed
92
        MutableString buildFileContent = new MutableString();
93
 
94
        if ( mGbebuildfilter.compareTo("unit test check environment") != 0)
95
        {
96
          if ( mGbebuildfilter.compareTo("unit test generate build files") != 0)
97
          {
98
            if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") != 0 )
99
            {
100
              mLogger.warn("run checking allowedToProceed");
101
              allowedToProceed();
102
              mLogger.info("run allowedToProceed returned");
103
 
104
              if ( mGbebuildfilter.compareTo("unit test allowed to proceed") == 0 )            
105
              {
106
                throw new ExitException();
107
              }
108
            }
109
 
110
            // coordinate slave threads
111
            mLogger.warn("run coordinate slave threads");
112
            boolean allSlaveThreadsWaiting = false;
816 mhunt 113
            boolean logWarning = true;
814 mhunt 114
 
115
            while ( !allSlaveThreadsWaiting )
116
            {
117
              mReleaseManager.queryRunLevel(mRtagId);
118
 
119
              // anything but WAITING
120
              current_run_level.value = ReleaseManager.DB_IDLE;
121
              boolean moreRunLevelsConfigured = mReleaseManager.getFirstRunLevel(rconId, current_run_level);
122
 
123
              // attempt to exit loop
124
              allSlaveThreadsWaiting = true;
125
 
126
              do
127
              {
128
                if (moreRunLevelsConfigured)
129
                {
130
                  if (current_run_level.value != ReleaseManager.DB_WAITING)
131
                  {
816 mhunt 132
                    if ( logWarning )
133
                    {
134
                      mLogger.warn("run waiting for rcon id " + rconId.value);
135
                      logWarning = false;
136
                    }
137
                    else
138
                    {
139
                      mLogger.info("run waiting for rcon id " + rconId.value);                      
140
                    }
814 mhunt 141
                    allSlaveThreadsWaiting = false;
142
                  }
143
                  else
144
                  {
145
                    moreRunLevelsConfigured = mReleaseManager.getNextRunLevel(rconId, current_run_level);
146
                  }
147
                }
148
              }
149
              while (moreRunLevelsConfigured && allSlaveThreadsWaiting);
150
 
151
              if ( !allSlaveThreadsWaiting )
152
              {
153
                // to do, sleep for periodicMs
154
                if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
155
                {
156
                  Thread.currentThread().interrupt();
157
                }
158
                else
159
                {
160
                  mLogger.warn("run sleeping 3 secs waiting for slave threads");
161
                  Thread.sleep(3000);
162
                  mLogger.info("run sleep returned");
163
                }
164
              }
165
            }
166
 
167
            if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
168
            {
169
              throw new ExitException();
170
            }
171
 
172
            deliverChange(null, "AbtPublish", false);
173
 
174
            // Publishing is done outside ant by design
175
            // The preference is to do all release manager work outside ant
176
            MutableString packageName = new MutableString();
177
            MutableString packageExtension = new MutableString();
178
            MutableString packageVersion = new MutableString();
179
            MutableString packageDepends = new MutableString();
180
            MutableString isRipple = new MutableString();
181
            MutableString packageVersionId = new MutableString();
182
            MutableString fullyPublished = new MutableString();
183
            MutableString newLabel = new MutableString();
184
            boolean buildOccurred = retrieveLastPackage(mRtagId,
185
                                                        packageName, 
186
                                                        packageExtension, 
187
                                                        packageVersion, 
188
                                                        packageDepends, 
189
                                                        isRipple,
190
                                                        packageVersionId, 
191
                                                        fullyPublished,
192
                                                        newLabel);
193
            if ( buildOccurred )
194
            {
816 mhunt 195
              // buildOccurred simply means a dummy build file did not apply ie the build file had attempted a build
196
              // by now it has been labelled
197
              tearViewDown();
198
 
814 mhunt 199
              boolean buildErrorOccurred = true;
200
              try
201
              {
202
 
203
                if ( fullyPublished.value.compareTo("yes") == 0 )
204
                {
205
                  buildErrorOccurred = false;
206
 
207
                  if ( newLabel.value.length() > 0 )
208
                  {
209
                    // labelled in ClearCase                
210
                    Integer rtagId = new Integer(mRtagId);
211
                    mReleaseManager.autoMakeRelease(rtagId.toString(), packageName.value, packageExtension.value, packageVersion.value, newLabel.value, packageDepends.value, isRipple.value);
212
                  }
213
                  else
214
                  {
215
                    mLogger.info("run package not labelled in ClearCase on " + packageName.value + packageVersion.value);
216
                    throw new Exception();
217
                  }
218
                }
816 mhunt 219
                else
814 mhunt 220
                {
221
                  mLogger.info("run build error occurred on " + packageName.value + packageVersion.value);
222
                  throw new Exception();
223
                }
224
 
225
              }
226
              catch( Exception e)
227
              {
228
                // an error occurred publishing to ClearCase or Release Manager
229
                // take out the archive entry first
230
                String fs = System.getProperty( "file.separator" );
231
                String dpkgArchiveEntry = new String(Package.mGbeDpkg + fs + packageName.value + fs + packageVersion.value);
232
                File dpkgArchiveEntryFile = new File(dpkgArchiveEntry);
233
                mLogger.info("run checking existence of " + dpkgArchiveEntry);
234
 
235
                if ( dpkgArchiveEntryFile.exists() )
236
                {
237
                  if ( dpkgArchiveEntryFile.isDirectory() )
238
                  {
239
                    mLogger.warn("run deleting " + dpkgArchiveEntryFile.getName());
240
                    deleteDirectory(dpkgArchiveEntryFile);
241
                  }
242
                }
243
                else
244
                {
245
                  String dplyArchiveEntry = new String(Package.mGbeDply + fs + packageName.value + fs + packageVersion.value);
246
                  File dplyArchiveEntryFile = new File(dplyArchiveEntry);
247
                  mLogger.info("run checking existence of " + dplyArchiveEntry);
248
 
249
                  if ( dplyArchiveEntryFile.exists() )
250
                  {
251
                    if ( dplyArchiveEntryFile.isDirectory() )
252
                    {
253
                      mLogger.warn("run deleting " + dplyArchiveEntryFile.getName());
254
                      deleteDirectory(dplyArchiveEntryFile);
255
                    }
256
                  }
257
                }
258
 
259
                if ( buildErrorOccurred )
260
                {
261
                  Integer rtagId = new Integer(mRtagId);
262
                  mReleaseManager.excludeFromBuild(packageVersionId.value, packageVersion.value, rtagId.toString());
263
                }
264
                else
265
                {
266
                  mLogger.fatal("an error occurred publishing to ClearCase or Release Manager");
267
                  tearViewDown();
268
                  throw new Exception();
269
                }
270
              }
271
            }
272
 
273
            mLogger.info("run coordinate slave threads returned");
274
 
275
            // generate build files
276
            mLogger.warn("run generating build files");
277
            rippleEngine.planRelease();
278
 
279
            // get the build file from the ripple engine
280
            rippleEngine.getFirstBuildFileContent(buildFileContent, addendum);
281
 
282
            if ( addendum.value.compareTo("non generic") == 0 )
283
            {
284
              // publish the build file
285
              mLogger.warn("run publishing build file");
286
              mReleaseManager.publishBuildFile(mRtagId, buildFileContent.value);
287
            }
288
            else
289
            {
290
              // publish a dummy build file for either generic or dummy cases
291
              // this results in the slave not running ant
292
              mLogger.warn("run publishing dummy build file");
293
              mReleaseManager.publishBuildFile(mRtagId, mDummyBuildFileContent);
294
            }
295
          }
296
          mLogger.info("run generated build files");
297
 
298
          // change the run level for all threads in associated with the baseline
299
          mLogger.warn("run change the run level for all threads in associated with the baseline");
300
          mReleaseManager.queryReleaseConfig(mRtagId);
301
          rconId.value = -1;
302
          boolean moreBuildThreadsConfigured = mReleaseManager.getFirstReleaseConfig(rconId);
303
          mRunLevel = RunLevel.ACTIVE;
304
 
305
          do
306
          {
307
            if (moreBuildThreadsConfigured)
308
            {
816 mhunt 309
                mLogger.warn("run changing run level to ACTIVE for rcon_id " + rconId.value);
814 mhunt 310
                mRunLevel.persist(mReleaseManager, rconId.value);
311
                moreBuildThreadsConfigured = mReleaseManager.getNextReleaseConfig(rconId);
312
            }
313
          }
314
          while (moreBuildThreadsConfigured);
315
 
316
          if ( mGbebuildfilter.compareTo("unit test generate build files") == 0 )
317
          {
318
            throw new ExitException();
319
          }
320
        }
321
 
322
        mLogger.info("run changed run levels");
323
 
324
        // check environment
325
        mLogger.warn("run checkEnvironment");
326
        checkEnvironment();
327
        mLogger.info("run checkEnvironment returned");
328
 
329
        if ( mGbebuildfilter.compareTo("unit test check environment") == 0 )
330
        {
331
          throw new ExitException();
332
        }
333
 
334
        // deliver change to product baseline
335
        mLogger.warn("run deliverChange");
336
        setViewUp(buildFileContent.value, true);
337
        deliverChange(null, null, false);
338
        mLogger.info("run deliverChange returned");
339
      }
340
      catch( SQLException e )
341
      {
342
        // oracle connection issues        
343
        mLogger.warn("run oracle connection issues");
344
      }
345
      catch( ExitException e )
346
      {
347
        mLogger.fatal("run ExitException");
348
        exit = true;
349
      }
350
      catch( InterruptedException e )
351
      {
352
        mLogger.warn("run InterruptedException");
353
      }
354
      catch( Exception e )
355
      {
356
        mLogger.error("run indefinitePause");
357
        try
358
        {
359
          mReleaseManager.indefinitePause();
360
        }
361
        catch( Exception f )
362
        {
363
          mLogger.error("run indefinitePause failed");
364
        }
365
      }
366
 
367
      mSleep = false;
368
      if ( addendum.value.compareTo("dummy") == 0 )
369
      {
370
        // no build requirement, so let things settle
371
        mLogger.warn("run no build requirement, so let things settle");
372
        mSleep = true;
373
      }
374
    }
375
  }
376
 
377
  /**returns 'M'
378
   */
379
  protected char getMode()
380
  {
381
    mLogger.debug("getMode");
382
    return 'M';
383
  }
384
 
385
  /**retrieves details concerning the last package built for an rtag_id
386
   * isRipple = "0" (a WIP or direct change) or "1"
387
   * generic = "generic" or not
388
   * buildStandard = "JATS" or "ANT"
389
   */
390
  boolean retrieveLastPackage(int rtagId, MutableString packageName, 
391
                              MutableString packageExtension, 
392
                              MutableString packageVersion, 
393
                              MutableString packageDepends, 
394
                              MutableString isRipple, 
395
                              MutableString packageVersionId, 
396
                              MutableString fullyPublished,
397
                              MutableString newLabel) throws IOException
398
  {
399
    mLogger.debug("retrieveLastPackage");
400
    boolean retVal = false;
401
    Integer rtag = new Integer(rtagId);
402
    File rtagIdOfficial = new File(rtag + "official");
403
 
404
    if ( rtagIdOfficial.exists() )
405
    {
406
      // read <rtagId>offical
407
      FileReader rtagIdOfficialFileReader = new FileReader(rtagIdOfficial);
408
      BufferedReader rtagIdOfficialBufferedReader = new BufferedReader(rtagIdOfficialFileReader);
409
      String line;
410
 
411
      while( ( line = rtagIdOfficialBufferedReader.readLine() ) != null)
412
      {
413
        String []keyVal = line.split("=", 2);
414
        if (keyVal[0].compareTo("packageName") == 0)
415
        {
416
          packageName.value = keyVal[1];
417
          mLogger.info("retrieveLastPackage packageName " + packageName.value);
418
        }
419
        else
420
        if (keyVal[0].compareTo("packageExtension") == 0)
421
        {
422
          packageExtension.value = keyVal[1];
423
          mLogger.info("retrieveLastPackage packageExtension " + packageExtension.value);
424
        }
425
        else
426
        if (keyVal[0].compareTo("packageVersion") == 0)
427
        {
428
          packageVersion.value = keyVal[1];
429
          mLogger.info("retrieveLastPackage packageVersion " + packageVersion.value);
430
        }
431
        else
432
        if (keyVal[0].compareTo("packageDepends") == 0)
433
        {
434
          packageDepends.value = keyVal[1];
435
          mLogger.info("retrieveLastPackage packageDepends " + packageDepends.value);
436
        }
437
        else
438
        if (keyVal[0].compareTo("packageRipple") == 0)
439
        {
440
          isRipple.value = keyVal[1];
441
          mLogger.info("retrieveLastPackage packageRipple " + isRipple.value);
442
        }
443
        else
444
        if (keyVal[0].compareTo("packageVersionID") == 0)
445
        {
446
          packageVersionId.value = keyVal[1];
447
          mLogger.info("retrieveLastPackage packageVersionID " + packageVersionId.value);
448
        }
449
        else
450
        if (keyVal[0].compareTo("fullyPublished") == 0)
451
        {
452
          fullyPublished.value = keyVal[1];
453
          mLogger.info("retrieveLastPackage fullyPublished " + fullyPublished.value);
454
        }
455
        else
456
        if (keyVal[0].compareTo("newLabel") == 0)
457
        {
458
          newLabel.value = keyVal[1];
459
          mLogger.info("retrieveLastPackage newLabel " + newLabel.value);
460
        }
461
      }
462
      rtagIdOfficialBufferedReader.close();
463
      retVal = true;
464
    }
465
 
466
    rtagIdOfficial.delete();
467
 
468
    mLogger.info("retrieveLastPackage returned " + retVal);
469
    return retVal;
470
  }
471
}