#
# BusyB, an automated build utility.
#
# Copyright (C) 1997-2003
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#
from busybee.BusyBException import BusyBException
from busybee import SymbolManager
from Description import Description
from Dir import Dir
import os
import sys
import exceptions
class Base:
def __init__(self):
self.description = Description('')
self.dir=Dir()
self.onException = None
self.env=[]
self.saveEnv={}
self.__text = ''
self.logger = None
def setLogger(self, l):
self.logger = l
def setDescription(self, d):
self.description = d
def getDescription(self):
return self.description
def setText(self, text):
self.__text = text
def getText(self):
return SymbolManager.getInstance().expand(self.__text)
def setErrorHandler(self, exHandler):
self.onException = exHandler
def setDir(self,dir):
self.dir=dir
def pushDir(self):
self.getLogger().timeStamp( "Changing dir to: " + str(self.dir) )
self.dir.pushDir()
def popDir(self):
self.dir.popDir()
def setEnv(self, var):
self.env.append(var)
def pushEnv(self):
if len(self.env) > 0:
self.saveEnv={}
self.copyDict( os.environ, self.saveEnv )
for var in self.env:
var.execute()
def popEnv(self):
if ( len(self.saveEnv) > 0 ):
self.clearDict(os.environ)
self.copyDict( self.saveEnv, os.environ )
self.saveEnv={}
def dumpEnv(self, label, table):
print '--------------------------'
for k in table.keys():
print label, ': key: ', k, ' value: ', table[k]
def getLogger(self):
return self.logger
#
# Clear out the dict one item at a time -- needed because
# os.environ.clear() doesn't really work.
#
def clearDict(self, dict):
for k in dict.keys():
dict.__delitem__(k)
def copyDict(self, old, new):
for k in old.keys():
new[k]=old[k]
def handleException( self, ex ):
if ( not self.tryHandleException(ex) ):
raise ex
def tryHandleException( self, ex ):
print 'handle execption for ', self
if ( self.onException == None ):
print 'no exception handler defined for ', self
return 0
if isinstance( ex, BusyBException ):
SymbolManager.getInstance().setSymbol('ex_message', ex.message)
SymbolManager.getInstance().setSymbol('ex_details', ex.details)
SymbolManager.getInstance().setSymbol('ex', ex)
self.onException.setLogger( self.getLogger() )
exceptionHandled=self.onException.process()
return exceptionHandled
def preProcess(self):
try:
self.pushDir()
except BusyBException, ex:
self.handleException(ex)
return
try:
self.pushEnv()
except BusyBException, ex:
self.popDir()
self.handleException(ex)
return
def process(self):
self.preProcess()
try:
self.execute()
except BusyBException, ex:
self.postProcess()
self.handleException(ex)
else:
self.postProcess()
def postProcess(self):
self.popEnv()
self.popDir()
def execute(self):
pass
|