Changeset 6875


Ignore:
Timestamp:
21/05/10 10:28:26 (9 years ago)
Author:
sdonegan
Message:

Fixed some content bugs and handling of keywords/parameters as well as improve reporting

Location:
TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/ExtractISO.py

    r6865 r6875  
    101101                logging.info("") 
    102102                 
     103                #set processing message and processing docs 
     104                self.processingMsg = '' 
     105                self.validDoc = True 
    103106                 
    104107                self.root = self.getIsoXML(self.inputXMLfile) 
     
    117120                #get all the required information from the chosen xpath definition class 
    118121                self.datasetID = self.getElementVal(self.isoModel.datasetID()) 
     122                if self.datasetID == 'None': 
     123                        self.processingMsg = 'No entry for Dataset ID so record not valid and cannot/will not Ingest!' 
     124                        logging.error(self.processingMsg) 
     125                        self.validDoc = False 
     126                 
     127                else: 
     128                        #noticed some MEDIN centres allowing space characters in a unique id.. change to single underscore! (remember only 1 allowed!) 
     129                        self.datasetID[0][0] = self.datasetID[0][0].replace(" ", "_") 
     130                 
    119131                 
    120132                self.datasetName = self.getElementVal(self.isoModel.dataSetName()) 
     133                if self.datasetName == 'None': 
     134                        self.processingMsg = 'No entry for Dataset Name so record not valid and cannot/will not Ingest!' 
     135                        logging.error(self.processingMsg) 
     136                        self.validDoc = False 
    121137                 
    122138                self.datasetAbstract = self.getElementVal(self.isoModel.dataSetAbstract()) 
    123                  
    124                 self.datasetID = self.getElementVal(self.isoModel.datasetID()) 
    125                  
    126                 #noticed some MEDIN centres allowing space characters in a unique id.. change to single underscore! (remember only 1 allowed!) 
    127                 self.datasetID[0][0] = self.datasetID[0][0].replace(" ", "_") 
    128                  
    129          
     139                                 
    130140                self.revisionDate = self.getElementVal(self.isoModel.metadataRevisionDate()) 
    131141                 
     
    142152                self.authors = self.getElementVal(self.isoModel.authors()) 
    143153                 
    144                 #need to provide a list for updating relevant db column - keep distinct from other authors based vars just in case of problems..                 
    145                 self.authorOb = IsoIngestListUtilities(self.authors,True)                
    146                 self.authors_text = self.authorOb.getDelimitedStringFromList(self.authorOb.listVals)             
    147                 self.authors_ts_vector = self.authors_text 
    148                  
     154                if self.authors == 'None': 
     155                        self.processingMsg = 'No entry for Authors so record not valid and cannot/will not Ingest!' 
     156                        logging.error(self.processingMsg) 
     157                        self.validDoc = False 
     158                 
     159                else: 
     160                        #need to provide a list for updating relevant db column - keep distinct from other authors based vars just in case of problems..                 
     161                        self.authorOb = IsoIngestListUtilities(self.authors,True)                
     162                        self.authors_text = self.authorOb.getDelimitedStringFromList(self.authorOb.listVals)             
     163                        self.authors_ts_vector = self.authors_text 
     164                                 
    149165                self.datacentreName = self.getElementVal(self.isoModel.dataCentreName()) 
    150                  
    151                 self.parameters = self.getElementVal(self.isoModel.parameters()) 
    152                 self.parameters_text = self.parameters 
    153                 self.parameters_tsvector = self.parameters 
     166                                 
     167                if self.datacentreName == 'None': 
     168                        self.processingMsg = 'No entry for Data Centre name so record not valid and cannot/will not Ingest!' 
     169                        logging.error(self.processingMsg) 
     170                        self.validDoc = False 
     171                 
    154172                 
    155173                self.keywords = self.getElementVal(self.isoModel.keywords()) 
    156174                 
    157175                self.keywordsList = self.listify(self.keywords) 
     176                 
     177                if self.keywords == 'None': 
     178                        logging.warn("No parameter info for record!") 
     179                        self.parameters_text = '' 
     180                        self.parameters_tsvector = '' 
     181                else:            
     182                        self.parametersOb = IsoIngestListUtilities(self.keywords,True)                    
     183                        self.parameters_text = self.parametersOb.getDelimitedStringFromList(self.parametersOb.listVals) 
     184                        self.parameters_tsvector = self.parameters_text 
     185                 
     186                 
    158187                 
    159188                self.boundingBoxCoordinates = self.getElementVal(self.isoModel.coordinates())                            
     
    494523                logging.info("Extracting xpath information for data extraction type:" + keyMethod[0]) 
    495524                logging.info("******************************************************************************************") 
     525                 
    496526                                 
    497527                showValue = self.showXMLvalues 
     
    549579                        cnt = cnt + 1 
    550580                         
     581                #check theres any data.. 
     582                dataPresent=False 
     583                for values in valueList: 
     584                         
     585                        #as valueList is a list of lists, length of valueList will be > 1 even if no data in sub-lists.. 
     586                        #..so check through all subLists and if not data at all then can return None 
     587                        if len(values) > 0: 
     588                                dataPresent = True 
     589                                 
     590                if not dataPresent:                      
     591                        logging.warning("No data to extract from the xml for %s" %keyMethod[0]) 
     592                        return 'None' 
     593                         
    551594                #if ordering is required, create a corresponding dictionary of ordered values                                    
    552595                if ordering: 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/PostgresRecord.py

    r6865 r6875  
    3636                  
    3737                  
    38         logging.info("Setting up Postgres record for file, " + filename)              
    39          
     38        logging.info("Setting up Postgres record for file, " + filename) 
     39                 
    4040        self.isoDataModel = isoDataModel 
    4141         
     
    272272    def getParametersInfo(self): 
    273273        ''' 
    274         Extract parameters info from the moles file 
     274        Extract parameters info from the ISO file (note here we mean ISO keywords, but conversion done in extractISo.py...) 
    275275        ''' 
    276276        logging.info('Retrieving parameters info...') 
    277277         
    278         self.params = "" 
    279          
     278        self.params = self.isoDataModel.parameters_text 
     279                 
    280280        #remember the double list return style.. 
    281         if self.isoDataModel.parameters[0][0] == 'None': 
    282                 logging.info("No parameter information present") 
    283         else: 
    284                 for param in self.isoDataModel.parameters[0]: 
    285                         self.params = self.params + ' ' + param  
     281        #if self.isoDataModel.parameters[0][0] == 'None': 
     282        #       logging.info("No parameter information present") 
     283        #else: 
     284        #       for param in self.isoDataModel.parameters[0]: 
     285        #               self.params = self.params + ' ' + param  
    286286         
    287287        return self.params 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/Utilities.py

    r6865 r6875  
    537537                 
    538538                logging.info("ISO ingest utilities activated!") 
    539                                  
     539                 
    540540                self.singleVal = self.getSingleVal(inputList) 
    541541                self.listVals = self.getMultipleVal(inputList, unique) 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/abstractdocumentingester.py

    r6865 r6875  
    144144                self.recordAttemptToIngestDiscoveryID = "" 
    145145                 
     146                self.ingestProblemMessage = "" 
     147                 
    146148                #need to generate a local version of the iso data model (first call was to run through all available files 
    147149                #and convert & place into relevant dirs as necessary 
     
    149151                 
    150152                try: 
    151                                                                                                  
     153                                                                                                                         
    152154                        self.isoDataModel = ExtractISO(filename,self._isoClass[self._datacentre_format]) 
    153                                  
     155                         
     156                                                         
    154157                        if self.isoDataModel.createISOdataStructure() is True: 
    155158                                logging.info("ISO extractor worked fine!") 
     
    185188                try: 
    186189                         
    187                         #record whats bout to be ingestd                         
     190                        #if record is valid (vital elements checked in ExtractISO - validDoc is True if everything ok.. 
     191                         
     192                        #record whats bout to be ingested - if a problem this, error should already have been kicked out                                         
    188193                        self.recordAttemptToIngestDiscoveryID = self.isoDataModel.datasetID[0][0] 
    189                                                  
    190                         #In new ingest system all vals parsed from iso xml are returned as either lists of dictionaries 
    191                          
    192                         #record whats attempting to be ingested  
    193                         record = PostgresRecord(filename, self._NDG_dataProvider,self._datacentre_groups, self._datacentre_namespace, 
     194                         
     195                        if self.isoDataModel.validDoc is True:                   
     196                                                                                 
     197                                #record whats attempting to be ingested  
     198                                record = PostgresRecord(filename, self._NDG_dataProvider,self._datacentre_groups, self._datacentre_namespace, 
    194199                                                                self.isoDataModel,self._xq, self._datacentre_format, self._xqueryConversionsExceptions,  
    195200                                                                self._xqueryConversions,self._saxonJarFile, self._xqueryDocTypes, self.originalXMLdoc, self._currentMedinStandard, stubIso = self.isoXML)                        
    196201                         
    197                         # Now create the data access object to interface to the DB                       
    198                         dao = PostgresDAO(record, self.isoDataModel ,self.discovery_dir , pgClient = self.pgc ) 
    199                          
    200                         # Finally, write the new record 
    201                         # 0 if failed, 1 if update, 2 if create 
    202                         returnCode = dao.createOrUpdateRecord()  
     202                                # Now create the data access object to interface to the DB                       
     203                                dao = PostgresDAO(record, self.isoDataModel ,self.discovery_dir , pgClient = self.pgc ) 
     204                         
     205                                # Finally, write the new record 
     206                                # 0 if failed, 1 if update, 2 if create 
     207                                returnCode = dao.createOrUpdateRecord()  
    203208                                                 
    204                         if returnCode == 2: 
    205                                 self._no_files_ingested += 1 
    206                                  
    207                         elif returnCode == 1: 
    208                                 self._no_files_changed += 1 
    209                                  
     209                                if returnCode == 2: 
     210                                        self._no_files_ingested += 1 
     211                                 
     212                                elif returnCode == 1: 
     213                                        self._no_files_changed += 1 
     214                                         
     215                        else: 
     216                                self.ingestProblemMessage= "Content validity problems for record: %s (%s)" %(self.recordAttemptToIngestDiscoveryID,self.isoDataModel.processingMsg) 
     217                                 
     218                                logging.warn(self.ingestProblemMessage) 
     219                                 
     220                                #now raise error so can record this 
     221                                raise ValueError,ingestMessage 
    210222                         
    211223                except: 
     
    587599                                        return 
    588600                                else: 
    589                                         logging.error("Something SERIOUSELY wrong with extractor (couldnt get at ExtractISO class)")                     
    590                                                 #sys.exit() 
     601                                         
     602                                        logging.error("Something SERIOUSELY wrong with extractor (couldnt get at ExtractISO class)") 
     603                                         
     604                                        #if this is a simple content problem don't return just yet (will catch it next time round so can include in report! 
     605                                        #if isoDataModel.processingMsg != '':                    
     606                                        #       logging.error(" ") 
     607                                        #       logging.error("Failed with this reported error: %s" %isoDataModel.processingMsg ) 
     608                                        #       logging.error(" ") 
     609                                         
    591610                                        return 
    592611                                 
     
    632651                        self.inputFileOrigFinal[new_filename_short]=filename 
    633652                         
    634                         ''' 
    635                         TODO: do we need this namespace corrector anymore as not using MOLES? 
    636                  
    637                         # now correct any namespace issues 
    638                         try: 
    639                             SchemaNameSpace(original_filename, new_filename, self._datacentre_format) 
    640                         except Exception, detail: 
    641                                 logging.error("SchemaNameSpace failed on file %s" %original_filename) 
    642                                 logging.error("Detail: %s" %detail) 
    643                                 logging.info("Continue with next file") 
    644                                 continue 
    645                         ''' 
     653                         
    646654                        numfilesproc += 1 
    647655                 
     
    719727                 
    720728                filenames = os.listdir(self.discovery_dir) 
     729                 
     730                ingestProbMsg = "" 
    721731                                 
    722732                #generate a list of files ALREADY in database so can compare with what has been ingested 
     
    744754                                         
    745755                                thisIngestedID = self.addFileToPostgresDB(fullPath) 
     756                                 
     757                                #record all problem messages 
     758                                ingestProbMsg = ingestProbMsg + self.ingestProblemMessage + "\n" 
    746759                                 
    747760                                #remove this filename from the list of files for this DC already in list (whats left over is to be deleted)  
     
    781794                message = message + "DELETED " + str(self._no_files_deleted)  + "\n" 
    782795                message = message + "PROBLEM_FILES " + str(self._no_problem_files)  + "\n" 
    783                  
    784                  
     796                                 
    785797                for badFile in self.updateFailList: 
    786798                        #recOpFile.write("PROBLEM_FILE " + badFile + "\n")       
    787799                        message = message +"PROBLEM_FILE " + badFile + "\n" 
     800                         
     801                message = message +  "\nBelow are comments recorded on problem files...\n\n" 
     802                         
     803                #update with content from the problem messages recorded 
     804                message = message + ingestProbMsg + "\n"                 
    788805                          
    789806                recOpFile.write(message) 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/medin_2_3_ISO19139.py

    r6852 r6875  
    123123                ''' 
    124124                 
    125                 authors = (self.authors.__name__,{1:{'xpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString'}}) 
     125                authors = (self.authors.__name__,{1:{'xpath':'gmd:contact/gmd:CI_ResponsibleParty/gmd:individualName/gco:CharacterString'}},{2:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:pointOfContact/gmd:CI_ResponsibleParty/gmd:organisationName/gco:CharacterString'}}) 
    126126                                         
    127127                return authors 
     
    130130        def parameters(self): 
    131131                ''' 
    132                 See notes in metadataDates for tuple format 
     132                See notes in metadataDates for tuple format NOTE - USE KEYWORDS!! 
    133133                 
    134134                1. For MEDIN use the TopicCategories for parameters (not handled differently than in DIF's 
     
    136136                #Note that in StubISO same element structure is used for related_urls! 
    137137                 
    138                 parameters = (self.parameters.__name__, {1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:topicCategory/gmd:MD_TopicCategoryCode'}}) 
     138                parameters = (self.parameters.__name__, {1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:descriptiveKeywords/gmd:MD_TopicCategoryCode'}}) 
    139139                 
    140140                ''' 
     
    201201                ''' 
    202202                 
    203                 publicAccess = (self.publicAccessLimitations.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_Constraints/gmd:useLimitation/gco:CharacterString'}}) 
     203                publicAccess = (self.publicAccessLimitations.__name__,{1:{'xpath':'gmd:identificationInfo/gmd:MD_DataIdentification/gmd:resourceConstraints/gmd:MD_LegalConstraints/gmd:accessConstraints/gmd:MD_RestrictionCode'}}) 
    204204                 
    205205                return publicAccess 
  • TI01-discovery-Ingest/trunk/v4n_MEDIN/ingestAutomation-upgrade/OAIBatch/oai_document_ingester.py

    r6660 r6875  
    163163                logging.info(message) 
    164164                outMessage += message 
    165                  
     165                message = "Number of problem files = %s\n" %self._no_problem_files 
     166                logging.info(message) 
     167                logging.info(self.lineSeparator) 
    166168                #Changed message to include more detail (SJD) but also now add any errors 
    167169                if self._error_messages: 
Note: See TracChangeset for help on using the changeset viewer.