from PackageBuilder import PackageBuilder
import threading
import Scheduler
import ThreadPool
 
class WorkerThread(threading.Thread):
    
    def __init__(self,event,name,mapPackageToCycle,listAvailableCyclicPackages,logger,listBuildOptionPackages,pkgBuildOptionFile):
        threading.Thread.__init__(self)
        self.statusEvent=event
        self.name=name
        self.mapPackageToCycle=mapPackageToCycle
        self.listAvailableCyclicPackages=listAvailableCyclicPackages
        self.logger=logger
        self.listBuildOptionPackages=listBuildOptionPackages
        self.pkgBuildOptionFile=pkgBuildOptionFile
        
    def run(self):
        buildThreadFailed=False
        ThreadPool.ThreadPool.makeWorkerThreadActive(self.name)
        self.logger.info("Thread "+self.name +" is starting now")
        while True:
            outputMap={}
            pkg = Scheduler.Scheduler.getNextPackageToBuild()
            if pkg is None:
                break
            self.logger.info("Thread "+self.name+" is building package:"+ pkg)
            pkgBuilder = PackageBuilder(self.mapPackageToCycle,self.listAvailableCyclicPackages,self.listBuildOptionPackages,self.pkgBuildOptionFile,"build-"+pkg)
            t = threading.Thread(target=pkgBuilder.buildPackageThreadAPI,args=(pkg,outputMap,pkg))
            t.start()
            t.join()
            if outputMap.has_key(pkg):
                if outputMap[pkg] == False:
                    buildThreadFailed = True
                    Scheduler.Scheduler.notifyPackageBuildFailed(pkg)
                    self.logger.info("Thread "+self.name +" stopped building the "+pkg +" package")
                    break
            else:
                buildThreadFailed = True
                Scheduler.Scheduler.notifyPackageBuildFailed(pkg)
                self.logger.info("Thread "+self.name +" stopped building the "+pkg +" package")
                break
            
            Scheduler.Scheduler.notifyPackageBuildCompleted(pkg)
        
        if buildThreadFailed:
            self.statusEvent.set()
        
        ThreadPool.ThreadPool.makeWorkerThreadInActive(self.name)
        self.logger.info("Thread "+self.name +" is going to rest")