Subversion Repositories DevTools

Rev

Rev 820 | Blame | Last modification | View Log | RSS feed

package com.erggroup.buildtool.daemon;

import com.erggroup.buildtool.daemon.BuildThread;
import com.erggroup.buildtool.ripple.MutableInt;
import com.erggroup.buildtool.ripple.MutableString;
import com.erggroup.buildtool.ripple.ReleaseManager;

import java.sql.SQLException;
import org.apache.log4j.Logger;

/**Slave Thread sub component
 */
public class SlaveThread
  extends BuildThread
{

  /**Logger
   * @attribute
   */
  private static final Logger mLogger = Logger.getLogger(SlaveThread.class);

  /**constructor
   */
  public SlaveThread(int rtag_id, int rcon_id, String gbebuildfilter)
  {
    mLogger.warn("SlaveThread rtag_id " + rtag_id + " rcon_id " + rcon_id);
    mRtagId = rtag_id;
    mRconId = rcon_id;
    mGbebuildfilter = gbebuildfilter;
  }

  /**implements the sequence diagrams consume build files, allowed to proceed, check environment
   */
  public void run()
  {
    Integer id = new Integer(mRtagId);
    setName(id.toString());
    mLogger.debug("run");
    boolean exit = false;
    MutableString buildFileContent = new MutableString();

    while(!exit)
    {
      try
      {
        if ( Thread.currentThread().isInterrupted() )
        {
          mLogger.warn("run is interrupted");
          // unit test technique
          throw new ExitException();
        }
        
        if ( mGbebuildfilter.compareTo("unit test spawn thread") == 0)
        {
          throw new Exception();
        }
        
        // allowed to proceed
        if ( mGbebuildfilter.compareTo("unit test consume build files") != 0)
        {
          mLogger.warn("run checking allowedToProceed");
          allowedToProceed();
          mLogger.info("run allowedToProceed returned");
        }
        
        // consume build files
        mLogger.warn("run consume build files");
        buildFileContent.value = "";
        boolean logWarning = true;
        
        // additional handshake
        // Master waits for Slave to be in state waiting
        // wait for the Master to signal we are active
        MutableInt rconId = new MutableInt();
        MutableInt current_run_level = new MutableInt();
        
        do
        {
          mReleaseManager.querySingleRunLevel(mRconId);
          mReleaseManager.getFirstRunLevel(rconId, current_run_level);
          
          if (current_run_level.value != ReleaseManager.DB_ACTIVE)
          {
            try
            {
              if ( logWarning )
              {
                mLogger.warn("run sleep 3 secs waiting for Master to set Slave run level ACTIVE");
                logWarning = false;
              }
              else
              {
                mLogger.info("run sleep 3 secs waiting for Master to set Slave run level ACTIVE");
              }
              // to do, sleep for periodicMs
              Thread.sleep(3000);
              mLogger.info("run sleep returned");
            }
            catch (InterruptedException e)
            {
              mLogger.warn("run caught InterruptedException");
            }
          }
        } while (current_run_level.value != ReleaseManager.DB_ACTIVE);

        mReleaseManager.queryRunLevel(mRconId, buildFileContent);
        
        if ( buildFileContent.value.compareTo("") == 0)
        {
          throw new Exception();
        }
        
        mLogger.info("run consumed build files");

        if ( mGbebuildfilter.compareTo("unit test consume build files") == 0 )
        {
          throw new ExitException();
        }

        // set CURRENT_BUILD_FILES to null
        mReleaseManager.clearBuildFile(mRconId);

        // check environment
        mLogger.warn("run checkEnvironment");
        checkEnvironment();
        mLogger.info("run checkEnvironment returned");
        
        mSleep = true;
        if ( buildFileContent.value.compareTo(mDummyBuildFileContent) != 0 )
        {
          // deliver change to product baseline
          mLogger.warn("run deliverChange");
          setViewUp(buildFileContent.value, false);
          deliverChange(null, null, false);
          tearViewDown();
          mLogger.info("run deliverChange returned");
          mSleep = false;
        }
        
      }
      catch( SQLException e )
      {
        // oracle connection issues        
         mLogger.warn("run oracle connection issues");
         mSleep = true;
      }
      catch( ExitException e )
      {
        mLogger.warn("run ExitException");
        exit = true;
      }
      catch( InterruptedException e )
      {
        mLogger.warn("run InterruptedException");
      }
      catch( Exception e )
      {
        mLogger.error("run indefinitePause");
        try
        {
          mReleaseManager.indefinitePause();
        }
        catch( Exception f )
        {
          mLogger.error("run indefinitePause failed");
        }
      }
    }
  }

  /**returns 'S'
   */
  protected char getMode()
  {
    mLogger.debug("getMode");
    return 'S';
  }
}