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;
820 mhunt 114
            boolean logWarning2 = true;
814 mhunt 115
 
116
            while ( !allSlaveThreadsWaiting )
117
            {
118
              mReleaseManager.queryRunLevel(mRtagId);
119
 
120
              // anything but WAITING
121
              current_run_level.value = ReleaseManager.DB_IDLE;
122
              boolean moreRunLevelsConfigured = mReleaseManager.getFirstRunLevel(rconId, current_run_level);
123
 
124
              // attempt to exit loop
125
              allSlaveThreadsWaiting = true;
126
 
127
              do
128
              {
129
                if (moreRunLevelsConfigured)
130
                {
131
                  if (current_run_level.value != ReleaseManager.DB_WAITING)
132
                  {
816 mhunt 133
                    if ( logWarning )
134
                    {
135
                      mLogger.warn("run waiting for rcon id " + rconId.value);
136
                      logWarning = false;
137
                    }
138
                    else
139
                    {
140
                      mLogger.info("run waiting for rcon id " + rconId.value);                      
141
                    }
814 mhunt 142
                    allSlaveThreadsWaiting = false;
143
                  }
144
                  else
145
                  {
146
                    moreRunLevelsConfigured = mReleaseManager.getNextRunLevel(rconId, current_run_level);
147
                  }
148
                }
149
              }
150
              while (moreRunLevelsConfigured && allSlaveThreadsWaiting);
151
 
152
              if ( !allSlaveThreadsWaiting )
153
              {
154
                // to do, sleep for periodicMs
155
                if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
156
                {
157
                  Thread.currentThread().interrupt();
158
                }
159
                else
160
                {
820 mhunt 161
                  if ( logWarning2 )
162
                  {
163
                    mLogger.warn("run sleeping 3 secs waiting for slave threads");
164
                    logWarning2 = false;
165
                  }
166
                  else
167
                  {
168
                    mLogger.info("run sleeping 3 secs waiting for slave threads");
169
                  }
814 mhunt 170
                  Thread.sleep(3000);
171
                  mLogger.info("run sleep returned");
172
                }
173
              }
174
            }
175
 
176
            if ( mGbebuildfilter.compareTo("unit test coordinate slave threads") == 0 )
177
            {
178
              throw new ExitException();
179
            }
180
 
181
            deliverChange(null, "AbtPublish", false);
182
 
183
            // Publishing is done outside ant by design
184
            // The preference is to do all release manager work outside ant
185
            MutableString packageName = new MutableString();
186
            MutableString packageExtension = new MutableString();
187
            MutableString packageVersion = new MutableString();
188
            MutableString packageDepends = new MutableString();
189
            MutableString isRipple = new MutableString();
190
            MutableString packageVersionId = new MutableString();
191
            MutableString fullyPublished = new MutableString();
192
            MutableString newLabel = new MutableString();
193
            boolean buildOccurred = retrieveLastPackage(mRtagId,
194
                                                        packageName, 
195
                                                        packageExtension, 
196
                                                        packageVersion, 
197
                                                        packageDepends, 
198
                                                        isRipple,
199
                                                        packageVersionId, 
200
                                                        fullyPublished,
201
                                                        newLabel);
202
            if ( buildOccurred )
203
            {
816 mhunt 204
              // buildOccurred simply means a dummy build file did not apply ie the build file had attempted a build
205
              // by now it has been labelled
206
              tearViewDown();
207
 
814 mhunt 208
              boolean buildErrorOccurred = true;
209
              try
210
              {
211
 
212
                if ( fullyPublished.value.compareTo("yes") == 0 )
213
                {
214
                  buildErrorOccurred = false;
215
 
216
                  if ( newLabel.value.length() > 0 )
217
                  {
218
                    // labelled in ClearCase                
219
                    Integer rtagId = new Integer(mRtagId);
220
                    mReleaseManager.autoMakeRelease(rtagId.toString(), packageName.value, packageExtension.value, packageVersion.value, newLabel.value, packageDepends.value, isRipple.value);
221
                  }
222
                  else
223
                  {
224
                    mLogger.info("run package not labelled in ClearCase on " + packageName.value + packageVersion.value);
225
                    throw new Exception();
226
                  }
227
                }
816 mhunt 228
                else
814 mhunt 229
                {
230
                  mLogger.info("run build error occurred on " + packageName.value + packageVersion.value);
231
                  throw new Exception();
232
                }
233
 
234
              }
235
              catch( Exception e)
236
              {
237
                // an error occurred publishing to ClearCase or Release Manager
238
                // take out the archive entry first
239
                String fs = System.getProperty( "file.separator" );
240
                String dpkgArchiveEntry = new String(Package.mGbeDpkg + fs + packageName.value + fs + packageVersion.value);
241
                File dpkgArchiveEntryFile = new File(dpkgArchiveEntry);
242
                mLogger.info("run checking existence of " + dpkgArchiveEntry);
243
 
244
                if ( dpkgArchiveEntryFile.exists() )
245
                {
246
                  if ( dpkgArchiveEntryFile.isDirectory() )
247
                  {
248
                    mLogger.warn("run deleting " + dpkgArchiveEntryFile.getName());
249
                    deleteDirectory(dpkgArchiveEntryFile);
250
                  }
251
                }
252
                else
253
                {
254
                  String dplyArchiveEntry = new String(Package.mGbeDply + fs + packageName.value + fs + packageVersion.value);
255
                  File dplyArchiveEntryFile = new File(dplyArchiveEntry);
256
                  mLogger.info("run checking existence of " + dplyArchiveEntry);
257
 
258
                  if ( dplyArchiveEntryFile.exists() )
259
                  {
260
                    if ( dplyArchiveEntryFile.isDirectory() )
261
                    {
262
                      mLogger.warn("run deleting " + dplyArchiveEntryFile.getName());
263
                      deleteDirectory(dplyArchiveEntryFile);
264
                    }
265
                  }
266
                }
267
 
820 mhunt 268
                Integer rtagId = new Integer(mRtagId);
269
                mReleaseManager.excludeFromBuild(packageVersionId.value, packageVersion.value, rtagId.toString());
270
 
271
                if ( !buildErrorOccurred )
814 mhunt 272
                {
273
                  mLogger.fatal("an error occurred publishing to ClearCase or Release Manager");
274
                  throw new Exception();
275
                }
276
              }
277
            }
278
 
279
            mLogger.info("run coordinate slave threads returned");
280
 
281
            // generate build files
282
            mLogger.warn("run generating build files");
283
            rippleEngine.planRelease();
284
 
285
            // get the build file from the ripple engine
286
            rippleEngine.getFirstBuildFileContent(buildFileContent, addendum);
287
 
288
            if ( addendum.value.compareTo("non generic") == 0 )
289
            {
290
              // publish the build file
291
              mLogger.warn("run publishing build file");
292
              mReleaseManager.publishBuildFile(mRtagId, buildFileContent.value);
293
            }
294
            else
295
            {
296
              // publish a dummy build file for either generic or dummy cases
297
              // this results in the slave not running ant
298
              mLogger.warn("run publishing dummy build file");
299
              mReleaseManager.publishBuildFile(mRtagId, mDummyBuildFileContent);
300
            }
301
          }
302
          mLogger.info("run generated build files");
303
 
304
          // change the run level for all threads in associated with the baseline
305
          mLogger.warn("run change the run level for all threads in associated with the baseline");
306
          mReleaseManager.queryReleaseConfig(mRtagId);
307
          rconId.value = -1;
308
          boolean moreBuildThreadsConfigured = mReleaseManager.getFirstReleaseConfig(rconId);
309
          mRunLevel = RunLevel.ACTIVE;
310
 
311
          do
312
          {
313
            if (moreBuildThreadsConfigured)
314
            {
816 mhunt 315
                mLogger.warn("run changing run level to ACTIVE for rcon_id " + rconId.value);
814 mhunt 316
                mRunLevel.persist(mReleaseManager, rconId.value);
317
                moreBuildThreadsConfigured = mReleaseManager.getNextReleaseConfig(rconId);
318
            }
319
          }
320
          while (moreBuildThreadsConfigured);
321
 
322
          if ( mGbebuildfilter.compareTo("unit test generate build files") == 0 )
323
          {
324
            throw new ExitException();
325
          }
326
        }
327
 
328
        mLogger.info("run changed run levels");
329
 
330
        // check environment
331
        mLogger.warn("run checkEnvironment");
332
        checkEnvironment();
333
        mLogger.info("run checkEnvironment returned");
334
 
335
        if ( mGbebuildfilter.compareTo("unit test check environment") == 0 )
336
        {
337
          throw new ExitException();
338
        }
339
 
340
        // deliver change to product baseline
341
        mLogger.warn("run deliverChange");
342
        setViewUp(buildFileContent.value, true);
343
        deliverChange(null, null, false);
344
        mLogger.info("run deliverChange returned");
345
      }
346
      catch( SQLException e )
347
      {
348
        // oracle connection issues        
349
        mLogger.warn("run oracle connection issues");
820 mhunt 350
        mSleep = true;
814 mhunt 351
      }
352
      catch( ExitException e )
353
      {
354
        mLogger.fatal("run ExitException");
355
        exit = true;
356
      }
357
      catch( InterruptedException e )
358
      {
359
        mLogger.warn("run InterruptedException");
360
      }
361
      catch( Exception e )
362
      {
363
        mLogger.error("run indefinitePause");
364
        try
365
        {
366
          mReleaseManager.indefinitePause();
367
        }
368
        catch( Exception f )
369
        {
370
          mLogger.error("run indefinitePause failed");
371
        }
372
      }
373
 
374
      mSleep = false;
375
      if ( addendum.value.compareTo("dummy") == 0 )
376
      {
377
        // no build requirement, so let things settle
378
        mLogger.warn("run no build requirement, so let things settle");
379
        mSleep = true;
380
      }
381
    }
382
  }
383
 
384
  /**returns 'M'
385
   */
386
  protected char getMode()
387
  {
388
    mLogger.debug("getMode");
389
    return 'M';
390
  }
391
 
392
  /**retrieves details concerning the last package built for an rtag_id
393
   * isRipple = "0" (a WIP or direct change) or "1"
394
   * generic = "generic" or not
395
   * buildStandard = "JATS" or "ANT"
396
   */
397
  boolean retrieveLastPackage(int rtagId, MutableString packageName, 
398
                              MutableString packageExtension, 
399
                              MutableString packageVersion, 
400
                              MutableString packageDepends, 
401
                              MutableString isRipple, 
402
                              MutableString packageVersionId, 
403
                              MutableString fullyPublished,
404
                              MutableString newLabel) throws IOException
405
  {
406
    mLogger.debug("retrieveLastPackage");
407
    boolean retVal = false;
408
    Integer rtag = new Integer(rtagId);
409
    File rtagIdOfficial = new File(rtag + "official");
410
 
411
    if ( rtagIdOfficial.exists() )
412
    {
413
      // read <rtagId>offical
414
      FileReader rtagIdOfficialFileReader = new FileReader(rtagIdOfficial);
415
      BufferedReader rtagIdOfficialBufferedReader = new BufferedReader(rtagIdOfficialFileReader);
416
      String line;
417
 
418
      while( ( line = rtagIdOfficialBufferedReader.readLine() ) != null)
419
      {
420
        String []keyVal = line.split("=", 2);
421
        if (keyVal[0].compareTo("packageName") == 0)
422
        {
423
          packageName.value = keyVal[1];
424
          mLogger.info("retrieveLastPackage packageName " + packageName.value);
425
        }
426
        else
427
        if (keyVal[0].compareTo("packageExtension") == 0)
428
        {
429
          packageExtension.value = keyVal[1];
430
          mLogger.info("retrieveLastPackage packageExtension " + packageExtension.value);
431
        }
432
        else
433
        if (keyVal[0].compareTo("packageVersion") == 0)
434
        {
435
          packageVersion.value = keyVal[1];
436
          mLogger.info("retrieveLastPackage packageVersion " + packageVersion.value);
437
        }
438
        else
439
        if (keyVal[0].compareTo("packageDepends") == 0)
440
        {
441
          packageDepends.value = keyVal[1];
442
          mLogger.info("retrieveLastPackage packageDepends " + packageDepends.value);
443
        }
444
        else
445
        if (keyVal[0].compareTo("packageRipple") == 0)
446
        {
447
          isRipple.value = keyVal[1];
448
          mLogger.info("retrieveLastPackage packageRipple " + isRipple.value);
449
        }
450
        else
451
        if (keyVal[0].compareTo("packageVersionID") == 0)
452
        {
453
          packageVersionId.value = keyVal[1];
454
          mLogger.info("retrieveLastPackage packageVersionID " + packageVersionId.value);
455
        }
456
        else
457
        if (keyVal[0].compareTo("fullyPublished") == 0)
458
        {
459
          fullyPublished.value = keyVal[1];
460
          mLogger.info("retrieveLastPackage fullyPublished " + fullyPublished.value);
461
        }
462
        else
463
        if (keyVal[0].compareTo("newLabel") == 0)
464
        {
465
          newLabel.value = keyVal[1];
466
          mLogger.info("retrieveLastPackage newLabel " + newLabel.value);
467
        }
468
      }
469
      rtagIdOfficialBufferedReader.close();
470
      retVal = true;
471
    }
472
 
473
    rtagIdOfficial.delete();
474
 
475
    mLogger.info("retrieveLastPackage returned " + retVal);
476
    return retVal;
477
  }
478
}