Index: trunk/ippToPsps/jython/cleanup.py
===================================================================
--- trunk/ippToPsps/jython/cleanup.py	(revision 33265)
+++ trunk/ippToPsps/jython/cleanup.py	(revision 33351)
@@ -9,116 +9,130 @@
 import logging.config
 
-from config import Config
-from pslogger import PSLogger
-from ipptopspsdb import IppToPspsDb
+from ipptopsps import IppToPsps
 from batch import Batch
 from datastore import Datastore
 from dxlayer import DXLayer
 
-'''
-Finds stuff to delete for this batch type, then:
-
-- removes from the datastore
-- deletes from local disk
-- deletes files from DXLayer
 
 '''
-def clean(batchType):
+Cleanup class
+'''
+class Cleanup(IppToPsps):
 
-    logger.infoSeparator()
-    logger.infoTitle("Cleaning up batch type %s" % batchType)
+    '''
+    Constructor
+    '''
+    def __init__(self, argv):
+        super(Cleanup, self).__init__(argv)
 
-    loadedDatastoreIDs = ippToPspsDb.getLoadedToODMButNotDeletedFromDatastore(batchType, config.epoch, config.dvoLabel)
-    loadedDxlayerIDs = ippToPspsDb.getLoadedToODMButNotDeletedFromDXLayer(batchType, config.epoch, config.dvoLabel)
-    mergedLocalIDs = ippToPspsDb.getMergedButNotDeletedFromLocalDisk(batchType, config.epoch, config.dvoLabel)
+        if len(argv) > 2: self.parsePollTimeArg(sys.argv[2]) 
 
-    purgedDatastoreIDs = ippToPspsDb.getPurgedButNotDeletedFromDatastore(batchType, config.epoch, config.dvoLabel)
-    purgedLocalIDs = ippToPspsDb.getPurgedButNotDeletedFromLocalDisk(batchType, config.epoch, config.dvoLabel)
 
-    logger.infoPair("Loaded to ODM but still on datastore", "%d" % len(loadedDatastoreIDs))
-    logger.infoPair("Loaded to ODM but still in DXLayer", "%d" % len(loadedDxlayerIDs))
-    logger.infoPair("Merged but still on local disk", "%d" % len(mergedLocalIDs))
-    logger.infoPair("Purged but still on datastore", "%d" % len(purgedDatastoreIDs))
-    logger.infoPair("Purged but still on local disk", "%d" % len(purgedLocalIDs))
+    '''
+    Overrides base-class version
+    '''
+    def refreshConfig(self):
+        ret = super(Cleanup, self).refreshConfig()
+        self.dxlayer = DXLayer(self.logger)
+        self.datastore = Datastore(self.logger, self.config, self.ippToPspsDb)
+        return ret
 
-    if config.deleteLocal:
-        logger.infoSeparator()
-        count = 0
-        ids = mergedLocalIDs + purgedLocalIDs
-        for id in ids:
+    '''
+    Runs...
+    '''
+    def run(self):
+
+        if self.SECONDS: self.logger.infoPair("Performing clean-up every", "%f hours" % (self.SECONDS/60.0/60.0))
+        while True:
+
+            self.config.printDeletionPolicy()
+            self.clean("P2")
+            self.clean("ST")
+
+            self.checkClientStatus()
+            if not self.waitForPollTime(): break
+   
+    '''
+    Finds stuff to delete for this batch type, then:
+
+    - removes from the datastore
+    - deletes from local disk
+    - deletes files from DXLayer
+
+    '''
+    def clean(self, batchType):
+
+        self.logger.infoSeparator()
+        self.logger.infoTitle("Cleaning up batch type %s" % batchType)
+
+        loadedDatastoreIDs = self.ippToPspsDb.getLoadedToODMButNotDeletedFromDatastore(batchType, self.config.epoch, self.config.dvoLabel)
+        loadedDxlayerIDs = self.ippToPspsDb.getLoadedToODMButNotDeletedFromDXLayer(batchType, self.config.epoch, self.config.dvoLabel)
+        mergedLocalIDs = self.ippToPspsDb.getMergedButNotDeletedFromLocalDisk(batchType, self.config.epoch, self.config.dvoLabel)
+
+        purgedDatastoreIDs = self.ippToPspsDb.getPurgedButNotDeletedFromDatastore(batchType, self.config.epoch, self.config.dvoLabel)
+        purgedLocalIDs = self.ippToPspsDb.getPurgedButNotDeletedFromLocalDisk(batchType, self.config.epoch, self.config.dvoLabel)
+
+        self.logger.infoPair("Loaded to ODM but still on datastore", "%d" % len(loadedDatastoreIDs))
+        self.logger.infoPair("Loaded to ODM but still in DXLayer", "%d" % len(loadedDxlayerIDs))
+        self.logger.infoPair("Merged but still on local disk", "%d" % len(mergedLocalIDs))
+        self.logger.infoPair("Purged but still on datastore", "%d" % len(purgedDatastoreIDs))
+        self.logger.infoPair("Purged but still on local disk", "%d" % len(purgedLocalIDs))
     
-            if Batch.deleteFromDisk(logger, config.basePath, batchType, config.dvoLabel, id):
-                ippToPspsDb.updateDeletedLocal(id, 1)
-                count = count + 1
+        if self.config.deleteLocal:
+            self.logger.infoSeparator()
+            count = 0
+            ids = mergedLocalIDs + purgedLocalIDs
+            for id in ids:
+        
+                if Batch.deleteFromDisk(self.logger, self.config.basePath, batchType, self.config.dvoLabel, id):
+                    self.ippToPspsDb.updateDeletedLocal(id, 1)
+                    count = count + 1
+    
+            self.logger.infoSeparator()
+            self.logger.infoPair("Removed from local disk", "%d" % count)
+            self.logger.infoPair("Remaining on local disk", "%d" % (len(ids) - count))
+        
+    
+        if self.config.deleteDatastore:
+            self.logger.infoSeparator()
+            count = 0
+            ids = loadedDatastoreIDs + purgedDatastoreIDs
+            for id in ids:
+        
+                batchName = Batch.getNameFromID(id)
+    
+                if self.datastore.remove(batchName):
+                    count = count + 1
+    
+            self.logger.infoSeparator()
+            self.logger.infoPair("Removed from datastore", "%d" % count)
+            self.logger.infoPair("Remaining on datastore", "%d" % (len(ids) - count))
+        
+        if self.config.deleteDxLayer:
+            self.logger.infoSeparator()
+            count = 0
+            for id in loadedDxlayerIDs:
+        
+                if self.dxlayer.deleteBatch(id):
+                    self.ippToPspsDb.updateDeletedDxlayer(id, 1)
+                    count = count + 1
+    
+            self.logger.infoSeparator()
+            self.logger.infoPair("Removed from DXLayer", "%d" % count)
+            self.logger.infoPair("Remaining on DXLayer", "%d" % (len(loadedDxlayerIDs) - count))
+       
 
-        logger.infoSeparator()
-        logger.infoPair("Removed from local disk", "%d" % count)
-        logger.infoPair("Remaining on local disk", "%d" % (len(ids) - count))
-    
+    '''
+    Overrides base-class version
+    '''
+    def printUsage(self):
+        super(Cleanup, self).printUsage()
+        print " [<poll time in hours>]"
 
-    if config.deleteDatastore:
-        logger.infoSeparator()
-        count = 0
-        ids = loadedDatastoreIDs + purgedDatastoreIDs
-        for id in ids:
-    
-            batchName = Batch.getNameFromID(id)
-
-            if datastore.remove(batchName):
-                count = count + 1
-
-        logger.infoSeparator()
-        logger.infoPair("Removed from datastore", "%d" % count)
-        logger.infoPair("Remaining on datastore", "%d" % (len(ids) - count))
-    
-    if config.deleteDxLayer:
-        logger.infoSeparator()
-        count = 0
-        for id in loadedDxlayerIDs:
-    
-            if dxlayer.deleteBatch(id):
-                ippToPspsDb.updateDeletedDxlayer(id, 1)
-                count = count + 1
-
-        logger.infoSeparator()
-        logger.infoPair("Removed from DXLayer", "%d" % count)
-        logger.infoPair("Remaining on DXLayer", "%d" % (len(loadedDxlayerIDs) - count))
-    
 
 '''
 Start of program
 '''
-
-if len(sys.argv) > 1: CONFIGPATH  = sys.argv[1]
-else:
-    print "\n** Usage: " + sys.argv[0] + " <configPath> [hours]\n"
-    sys.exit(1)
-
-if len(sys.argv) > 2: 
-    HOURS = float(sys.argv[2])
-    SECONDS = HOURS * 60.0 * 60.0
-else: 
-    SECONDS = None
-
-# create objects
-config = Config(CONFIGPATH)
-logger = config.getLogger(sys.argv[0])
-ippToPspsDb = IppToPspsDb(logger, config)
-datastore = Datastore(logger, config, ippToPspsDb)
-dxlayer = DXLayer(logger)
-
-
-logger.infoTitle("ippToPsps clean-up")
-if SECONDS: logger.infoPair("Performing clean-up every", "%f hours" % (SECONDS/60.0/60.0))
-while True:
-
-    config.printDeletionPolicy()
-    clean("P2")
-    clean("ST")
-
-    if SECONDS:
-        logger.infoPair("Waiting for", "%f hours" % HOURS)
-        time.sleep(SECONDS)
-    else: break
-    config.refresh()
-    
+cleanup = Cleanup(sys.argv)
+cleanup.run()
+cleanup.exitProgram("finished")
