Changeset 4714 for TI01-discovery


Ignore:
Timestamp:
24/12/08 10:42:13 (11 years ago)
Author:
sdonegan
Message:

SJD cock up (4712)- put Calums latest (4664) back as head revision!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery/branches/ingestAutomation-upgrade/OAIBatch/oai_document_ingester.py

    r4712 r4714  
    99from time import strftime 
    1010from SchemaNameSpace import SchemaNameSpace 
    11 from DIF import DIF 
    12 from MDIP import MDIP 
    13 import ndgUtils 
    1411from ndgUtils.ndgXqueries import ndgXqueries 
    15 from FileUtilities import FileUtilities 
     12import ndgUtils.lib.fileutilities as FileUtilities 
    1613from PostgresRecord import PostgresRecord 
    1714from PostgresDAO import PostgresDAO 
    18 from datetime import date 
     15from Utilities import idget 
    1916import db_funcs 
    2017 
    21 class oai_document_ingester: 
     18class oai_document_ingester(object): 
    2219        ''' 
    2320        Class to handle the ingest of files from the OAI harvester to the discovery service postgres DB 
     
    2724 
    2825        def getID(self, filename): 
    29                 '''  
    30                 Gets the identifier out of an input metadata xml record.  
    31                 Copes with DIF and MDIP currently. 
    32                 @param filename - name of document file being processed 
    33                 @return: ID - id to use to refer to the document 
    34                 ''' 
    35                 logging.info("Retrieving identifier for metadata record " + filename) 
    36                 xml=file(filename).read() 
    37                 if self._datacentre_format == "DIF": 
    38                     d=DIF(xml) 
    39                     ID=d.entryID 
    40                 elif self._datacentre_format == "MDIP": 
    41                     d=MDIP(xml) 
    42                     ID=d.id 
    43                 else: 
    44                     raise TypeError, "Only handles DIF or MDIP here." 
    45          
    46                 logging.info("Found identifier: " + ID) 
    47                 return ID 
     26                ''' 
     27                Gets the identifier out of an input metadata xml record.  
     28                @param filename - name of document file being processed 
     29                @return: ID - id to use to refer to the document 
     30                ''' 
     31                logging.info("Retrieving identifier for metadata record " + filename) 
     32                xml=file(filename).read() 
     33                ID = idget(xml) 
     34                return ID 
    4835         
    4936         
     
    5441                @param filename: full path of file to add to postgres DB  
    5542                ''' 
    56                  
    57                 #filename = self.discDir + actualFilename 
    58                  
    5943                if not os.path.isfile(filename): 
    6044                        logging.info("Skipping, %s - not a valid file" %filename) 
     
    6246                 
    6347                logging.info("Adding file, " + filename + ", to postgres DB") 
    64                  
    65                 numSlash = len(filename.split('/')) 
    66                 shortFilename = filename.split('/')[numSlash - 1] 
    6748                 
    6849                # first of all create a PostgresRecord - this object represents all the data required 
     
    7051                dao = None 
    7152                try: 
    72                          
    7353                        discoveryID = self.getID(filename) 
    74                          
    7554                        record = PostgresRecord(filename, self._NDG_dataProvider, \ 
    7655                                                            self._datacentre_groups, self._datacentre_namespace, \ 
    7756                                                            discoveryID, self._xq, self._datacentre_format) 
    7857         
    79                          
    8058                        # Now create the data access object to interface to the DB 
    8159                        dao = PostgresDAO(record, self._dbConnection) 
    82                          
     60                 
    8361                        # Finally, write the new record 
    84                         if dao.createOrUpdateRecord():                           
     62                        if dao.createOrUpdateRecord(): 
    8563                                self._no_files_ingested += 1 
    86                                  
    87                          
    8864                except: 
    89                          
    90                         #if error encountered, add to failure lisr 
    91                         logging.error("Could not update: " + filename) 
    92                          
    93                         originalRecordFilename = self.inputFileOrigFinal[shortFilename] 
    94                         self.updateFailList.append(originalRecordFilename) 
    95                          
    9665                        logging.error("Exception thrown - detail: ") 
    9766                        logging.error(sys.exc_info()) 
     
    143112                    if words[0] == 'namespace': 
    144113                        self._datacentre_namespace = words[1] 
    145                     if words[0] == 'self._NDG_dataProvider': 
     114                    if words[0] == 'NDG_dataProvider': 
    146115                        self._NDG_dataProvider = True 
    147116                 
     
    234203                if datacentre is None: 
    235204                        self.usage() 
    236                          
    237                 #create list to to hold files ingest failed on. 
    238                 self.updateFailList = [] 
    239                  
    240                 # create file utils object to do various file related stuff 
    241                 fileUtils = FileUtilities() 
    242205                 
    243206                numfilesproc = 0 
     
    279242                 
    280243                # Create/clear the 'in' directory pristine copy of the discovery records 
    281                 fileUtils.setUpDir(originals_dir) 
     244                FileUtilities.setUpDir(originals_dir) 
    282245                commandline = "find " + self._harvest_home + " -type f -print | xargs -i cp \{\} " + originals_dir 
    283246                logging.info("Executing : " + commandline) 
     
    288251                 
    289252                # Create/clear the directory for the 'out' processed copy of the discovery records. 
    290                 fileUtils.setUpDir(discovery_dir) 
     253                FileUtilities.setUpDir(discovery_dir) 
    291254                     
    292255                #Execute the script which processes/renames the files (changed 08/01/07 to get id from inside file) 
    293256                # - also replace any namespace declarations with a standard one which we know works in NDG 
    294                 # NB, this copies files from the original dir to the discovery dir               
    295                 self.inputFileOrigFinal = {} 
    296                  
     257                # NB, this copies files from the original dir to the discovery dir 
    297258                logging.info(self.lineSeparator) 
    298259                logging.info("Renaming files:") 
    299          
    300260                for filename in os.listdir(originals_dir): 
    301                         if filename.endswith('.xml'):                            
     261                        if filename.endswith('.xml'): 
    302262                                original_filename = originals_dir + filename 
    303                                                                  
    304263                                try: 
    305264                                        ident=self.getID(original_filename) 
    306                                          
    307265                                except Exception, detail: 
    308266                                        logging.error("Could not retrieve ID from file, %s" %filename) 
     
    317275                                                ident = ident.replace("/","-") 
    318276                                                new_filename = discovery_dir + "/" +self._datacentre_namespace+ "__"+self._datacentre_format+ "__"+ ident +".xml" 
    319                                                 new_filename_short = self._datacentre_namespace+ "__"+self._datacentre_format+ "__"+ ident +".xml" 
    320277                                                logging.info("original file = " + original_filename) 
    321278                                                logging.info("newfile = " + new_filename) 
    322                                                  
    323                                                 #create list of all ORIGINAL filenames for ingest reporting (use actual filename) 
    324                                                 #this links a derived filename in processing dir with original filename 
    325                                                 #get basic filename from the path+filename passed to this function to use as key                 
    326                                                 self.inputFileOrigFinal[new_filename_short]=filename 
    327                                                                                                                  
     279                                 
    328280                                # now correct any namespace issues 
    329281                                try: 
     
    337289                        else: 
    338290                                logging.warning('File %s is not xml format. Not processed'  %(filename)) 
    339                                  
    340                          
    341291                 
    342292                logging.info(self.lineSeparator) 
     
    346296                self._xq=ndgXqueries() 
    347297                for libFile in self._xq.xqlib: 
    348                         fileUtils.createFile(libFile, self._xq.xqlib[libFile]) 
     298                        FileUtilities.createFile(libFile, self._xq.xqlib[libFile]) 
    349299                 
    350300                # Process the resulting files and put the data into the postgres DB 
     
    353303                self._getDBConnection() 
    354304                 
    355                 #add this to self so can produce list of failed files 
    356                 #self.discDir = discovery_dir 
    357                  
    358305                filenames = os.listdir(discovery_dir) 
    359306                for filename in filenames: 
     
    364311                 
    365312                this_backupdir = backupdir_base + "_originals/" 
    366                 #fileUtils.makeBackUp(originals_dir, this_backupdir) 
     313                FileUtilities.makeBackUp(originals_dir, this_backupdir) 
    367314                 
    368315                #Clear out the original harvest records area and discovery dir 
    369                 fileUtils.cleanDir(originals_dir) 
    370                 #fileUtils.cleanDir(discovery_dir) 
    371                  
    372                 #create a summary file for each data centre ingest 
    373                 data_dir = self._base_dir + "data/" 
    374                 recOpFileName = data_dir + datacentre + "_ingestSummary.txt"             
    375                 recOpFile = open(recOpFileName,'w') 
     316                FileUtilities.cleanDir(originals_dir) 
     317                FileUtilities.cleanDir(discovery_dir) 
    376318                 
    377319                logging.info("oai_document_ingest processing complete:") 
    378                  
    379                 recOpFile.write("Ingest report for data centre: " + datacentre + "\n") 
    380                 recOpFile.write("Ingest date: " + str(date.today()) + "\n") 
    381                 recOpFile.write("Original metadata directory: " + self._harvest_home + "\n\n") 
    382                 recOpFile.write("PROCESSED " + str(numfilesproc) + "\n") 
    383                 recOpFile.write("INGESTED " + str(self._no_files_ingested)  + "\n") 
    384                  
    385320                if self._no_problem_files == 0: 
    386321                        logging.info("All files successfully processed - cleaning harvest directory") 
    387                         #fileUtils.cleanDir(self._harvest_home) 
     322                        FileUtilities.cleanDir(self._harvest_home) 
    388323                else: 
    389324                        logging.error("Problems experienced with %s files" %self._no_problem_files) 
    390325                        logging.error("- harvest directory will not be cleared until these have been fixed and the script has been reran") 
    391                          
    392                         logging.info("INFO: Could not ingest the following files into the Discovery Database: ") 
    393                          
    394                         recOpFile.write("PROBLEM_NUM "  + str(self._no_problem_files)  + "\n") 
    395                          
    396                         for badFile in self.updateFailList: 
    397                                 logging.info("INFO: Could not ingest = %s" %badFile) 
    398                                 recOpFile.write("PROBLEM_FILE " + badFile + "\n")                                        
    399326                 
    400327                logging.info(self.lineSeparator) 
     
    402329                logging.info("INFO: Number of files ingested = %s" %self._no_files_ingested) 
    403330                logging.info(self.lineSeparator) 
    404                  
    405                 recOpFile.close() 
    406                                  
    407                  
    408                 print "\nScript finished running." 
     331                print "Script finished running." 
     332                 
    409333         
    410334if __name__=="__main__": 
Note: See TracChangeset for help on using the changeset viewer.