Ignore:
Timestamp:
Dec 16, 2010, 3:42:15 PM (11 years ago)
Author:
t.w.abma@…
Message:
  • rewrite of the Importer Wizard into an Ajaxflow
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/services/dbnp/importer/ImporterService.groovy

    r1223 r1277  
    1717package dbnp.importer
    1818import org.apache.poi.ss.usermodel.*
     19import org.apache.poi.hssf.usermodel.HSSFCell
    1920
    2021import dbnp.studycapturing.TemplateFieldType
     
    5051        //def header = []
    5152        def header = [:]
    52         def df = new DataFormatter()
     53    def df = new DataFormatter()
    5354        def property = new String()
    5455
     
    6162            def datamatrix_celldata = df.formatCellValue(sheet.getRow(datamatrix_start).getCell(columnindex))
    6263            def datamatrix_cell     = sheet.getRow(datamatrix_start).getCell(columnindex)           
    63             def headercell = sheet.getRow(headerrow-1+sheet.getFirstRowNum()).getCell(columnindex)
     64        def headercell = sheet.getRow(headerrow-1+sheet.getFirstRowNum()).getCell(columnindex)
    6465            def tft = TemplateFieldType.STRING //default templatefield type
    6566
    66             // Check for every celltype, currently redundant code, but possibly this will be
     67        // Check for every celltype, currently redundant code, but possibly this will be
    6768            // a piece of custom code for every cell type like specific formatting         
    6869               
    6970            switch (datamatrix_celltype) {
    70                     case Cell.CELL_TYPE_STRING:
    71                             //parse cell value as double
    72                             def doubleBoolean = true
    73                             def fieldtype = TemplateFieldType.STRING
    74 
    75                             // is this string perhaps a double?
    76                             try {
    77                                 formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE)
    78                             } catch (NumberFormatException nfe) { doubleBoolean = false }
    79                             finally {
    80                                 if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE
    81                             }
    82 
    83                             header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
     71                case Cell.CELL_TYPE_STRING:
     72                    //parse cell value as double
     73                    def doubleBoolean = true
     74                    def fieldtype = TemplateFieldType.STRING
     75
     76                    // is this string perhaps a double?
     77                    try {
     78                        formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE)
     79                    } catch (NumberFormatException nfe) { doubleBoolean = false }
     80                    finally {
     81                        if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE
     82                    }
     83
     84                    header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
    8485                                                                            templatefieldtype:fieldtype,
    8586                                                                            index:columnindex,
     
    8788                                                                            property:property);
    8889
    89                             break
    90                     case Cell.CELL_TYPE_NUMERIC:
    91                             def fieldtype = TemplateFieldType.LONG
    92                             def doubleBoolean = true
    93                             def longBoolean = true
    94 
    95                             // is this cell really an integer?
    96                             try {
    97                                 Long.valueOf(datamatrix_celldata)
    98                             } catch (NumberFormatException nfe) { longBoolean = false }
    99                             finally {
    100                                 if (longBoolean) fieldtype = TemplateFieldType.LONG
    101                             }
    102 
    103                             // it's not an long, perhaps a double?
    104                             if (!longBoolean)
    105                                 try {
    106                                     formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE)
    107                                 } catch (NumberFormatException nfe) { doubleBoolean = false }
    108                                 finally {
    109                                     if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE
    110                                 }
    111 
    112                             if (DateUtil.isCellDateFormatted(datamatrix_cell)) fieldtype = TemplateFieldType.DATE
    113 
    114                             header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
     90                    break
     91                case Cell.CELL_TYPE_NUMERIC:
     92                    def fieldtype = TemplateFieldType.LONG
     93                    def doubleBoolean = true
     94                    def longBoolean = true
     95
     96                    // is this cell really an integer?
     97                    try {
     98                        Long.valueOf(datamatrix_celldata)
     99                    } catch (NumberFormatException nfe) { longBoolean = false }
     100                    finally {
     101                        if (longBoolean) fieldtype = TemplateFieldType.LONG
     102                    }
     103
     104                    // it's not an long, perhaps a double?
     105                    if (!longBoolean)
     106                    try {
     107                                    formatValue(datamatrix_celldata, TemplateFieldType.DOUBLE)
     108                                } catch (NumberFormatException nfe) { doubleBoolean = false }
     109                                finally {
     110                                    if (doubleBoolean) fieldtype = TemplateFieldType.DOUBLE
     111                                }
     112
     113                    if (DateUtil.isCellDateFormatted(datamatrix_cell)) fieldtype = TemplateFieldType.DATE
     114
     115                    header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
    115116                                                                            templatefieldtype:fieldtype,
    116117                                                                            index:columnindex,
    117118                                                                            entity:theEntity,
    118119                                                                            property:property);
    119                             break
    120                     case Cell.CELL_TYPE_BLANK:
    121                             header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
     120                    break
     121                case Cell.CELL_TYPE_BLANK:
     122                    header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
    122123                                                                            templatefieldtype:TemplateFieldType.STRING,
    123124                                                                            index:columnindex,
    124125                                                                            entity:theEntity,
    125126                                                                            property:property);
    126                             break
    127                     default:
    128                             header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
     127                    break
     128                default:
     129                    header[columnindex] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell),
    129130                                                                            templatefieldtype:TemplateFieldType.STRING,
    130131                                                                            index:columnindex,
    131132                                                                            entity:theEntity,
    132133                                                                            property:property);
    133                             break
    134             } // end of switch
    135         } // end of cell loop
     134                    break
     135                } // end of switch
     136        } // end of cell loop
    136137        return header
    137138    }
     
    147148     */
    148149
    149     Cell[][] getDatamatrix(Workbook wb, header, int sheetindex, int datamatrix_start, int count) {
     150    HSSFCell[][] getDatamatrix(Workbook wb, header, int sheetindex, int datamatrix_start, int count) {
    150151        def sheet = wb.getSheetAt(sheetindex)
    151152        def rows  = []
     
    165166           
    166167            (0..header.size()-1).each { columnindex ->
    167                 def c = sheet.getRow(rowindex).getCell(columnindex, Row.CREATE_NULL_AS_BLANK)
    168                 //row.add(df.formatCellValue(c))
    169                 row.add(c)
     168            def c = sheet.getRow(rowindex).getCell(columnindex, Row.CREATE_NULL_AS_BLANK)           
     169            row.add(c)
    170170            }
    171171            rows.add(row)
     
    281281    def saveDatamatrix(Study study, datamatrix) {
    282282        def validatedSuccesfully = 0
    283         def entitystored = null
    284         def failedtopersist = []
    285         def persisterrors = []
    286         def updatedentities = []
    287         study.refresh()
     283    def entitystored = null
     284    def failedtopersist = []
     285    def persisterrors = []
     286    def updatedentities = []
     287    study.refresh()
    288288       
    289289        // go through the data matrix, read every record and validate the entity and try to persist it
    290290        datamatrix.each { record ->
    291             record.each { entity ->
     291            record.each { entity ->           
    292292                        switch (entity.getClass()) {
    293                         case Study       :  print "Persisting Study `" + entity + "`: "
    294                                                 entity.owner = AuthenticationService.getLoggedInUser()
    295                                                 println "storing study" + entity
    296                                                 println "dump=" + entity.dump()
    297                                                 println "validate=" + entity.validate()
     293                        case Study       :  log.info "Persisting Study `" + entity + "`: "
     294                                                entity.owner = AuthenticationService.getLoggedInUser()                                             
    298295                                                if (persistEntity(entity)) validatedSuccesfully++;
    299296                                                    else failedtopersist.add(entity)
    300                                                 break
    301                         case Subject     :  print "Persisting Subject `" + entity + "`: "
    302                                                 entity.parent = study
     297                                        break
     298                        case Subject :  log.info "Persisting Subject `" + entity + "`: "
     299                                        entity.parent = study
     300
     301                                        // is the current entity not already in the database?
     302                                        entitystored = isEntityStored(entity)
    303303                                               
    304                                                 // is the current entity not already in the database?
    305                                                 entitystored = isEntityStored(entity)
     304                                        // this entity is new, so add it to the study
     305                                        if (entitystored==null) study.addToSubjects(entity)
     306                                            else { // existing entity, so update it
     307                                                updateEntity(entitystored, entity)
     308                                                updatedentities.add(entity)
     309                                            }
     310
     311                                        if (persistEntity(study)) validatedSuccesfully++;
     312                                            else failedtopersist.add(entity)
     313                                        break
     314                        case Event       :  log.info "Persisting Event `" + entity + "`: "
     315                                        entity.parent = study
     316                                        study.addToEvents(entity)
     317                                        if (persistEntity(entity)) validatedSuccesfully++;
     318                                            else failedtopersist.add(entity)
     319                                        break
     320                        case Sample      :  log.info "Persisting Sample `" + entity +"`: "
     321                                        entity.parent = study
    306322                                               
    307                                                 // this entity is new, so add it to the study
    308                                                 if (entitystored==null) study.addToSubjects(entity)
    309                                                 else { // existing entity, so update it
    310                                                     updateEntity(entitystored, entity)
    311                                                     updatedentities.add(entity)
    312                                                 }
    313 
     323                                        // is this sample validatable (sample name unique for example?)
     324                                        if (entity.validate()) {
     325                                            study.addToSamples(entity)
    314326                                                if (persistEntity(study)) validatedSuccesfully++;
    315                                                     else failedtopersist.add(entity)
    316                                                 break
    317                         case Event       :  print "Persisting Event `" + entity + "`: "
    318                                                 entity.parent = study
    319                                                 study.addToEvents(entity)
    320                                                 if (persistEntity(entity)) validatedSuccesfully++;
    321                                                     else failedtopersist.add(entity)
    322                                                 break
    323                         case Sample      :  print "Persisting Sample `" + entity +"`: "                                               
    324                                                 entity.parent = study
    325                                                
    326                                                 // is this sample validatable (sample name unique for example?)
    327                                                 if (entity.validate()) {
    328                                                     study.addToSamples(entity)
    329                                                     if (persistEntity(study)) validatedSuccesfully++;                                                       
    330                                                 } else {
    331                                                     failedtopersist.add(entity)
    332                                                 }
    333                                                
    334                                                 break
    335                         case SamplingEvent: print "Persisting SamplingEvent `" + entity + "`: "
    336                                                 entity.parent = study
    337                                                 study.addToSamplingEvents(entity)
    338                                                 if (persistEntity(entity)) validatedSuccesfully++;
    339                                                     else failedtopersist.add(entity)
    340                                                 break
    341                         default          :  println "Skipping persisting of `" + entity.getclass() +"`"
    342                                                 failedtopersist.add(entity)
    343                                                 break
     327                                        } else {
     328                                            failedtopersist.add(entity)
     329                                        }
     330                                        break
     331                    case SamplingEvent: log.info "Persisting SamplingEvent `" + entity + "`: "
     332                                        entity.parent = study
     333                                        study.addToSamplingEvents(entity)
     334                                        if (persistEntity(entity)) validatedSuccesfully++;
     335                                            else failedtopersist.add(entity)
     336                                        break
     337                        default          :  log.info "Skipping persisting of `" + entity.getclass() +"`"
     338                                        failedtopersist.add(entity)
     339                                        break
    344340                        } // end switch
    345341            } // end record
    346         } // end datamatrix
     342        } // end datamatrix   
    347343        return [validatedSuccesfully, updatedentities, failedtopersist]
    348344    }
     
    360356                        case Study          :  return Study.findByCode(entity.code)
    361357                                               break
    362                         case Subject        :  return Subject.findByParentAndName(entity.parent, entity.name)
     358                        case Subject        :  return Subject.findByParentAndName(entity.parent, entity.name)
    363359                                               break
    364360                        case Event          :  break
     
    383379        switch (entity.getClass()) {
    384380                        case Study          :  break
    385                         case Subject        :  entitystored.properties = entity.properties
     381                        case Subject        :  entitystored.properties = entity.properties
    386382                                               entitystored.save()
    387383                                               break
     
    434430                def df = new DataFormatter()
    435431                def template = Template.get(template_id)
    436                 def tft = TemplateFieldType
     432        def tft = TemplateFieldType
    437433                def record = [] // list of entities and the read values
    438                 def failed = new ImportRecord() // map with entity identifier and failed mappingcolumn
     434        def failed = new ImportRecord() // map with entity identifier and failed mappingcolumn
    439435
    440436                // Initialize all possible entities with the chosen template
     
    459455                                }
    460456
    461                                 try {
    462                                 // which entity does the current cell (field) belong to?
    463                                     switch (mc.entity) {
    464                                         case Study: // does the entity already exist in the record? If not make it so.
    465                                                 (record.any {it.getClass() == mc.entity}) ? 0 : record.add(study)
     457                try {
     458                    // which entity does the current cell (field) belong to?
     459                    switch (mc.entity) {
     460                        case Study: // does the entity already exist in the record? If not make it so.
     461                        (record.any {it.getClass() == mc.entity}) ? 0 : record.add(study)
    466462                                                study.setFieldValue(mc.property, value)
    467463                                                break
    468                                         case Subject: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(subject)
     464                        case Subject: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(subject)
    469465                                                subject.setFieldValue(mc.property, value)
    470466                                                break
    471                                         case SamplingEvent: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(samplingEvent)
     467                        case SamplingEvent: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(samplingEvent)
    472468                                                samplingEvent.setFieldValue(mc.property, value)
    473469                                                break
    474                                         case Event: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(event)
     470                        case Event: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(event)
    475471                                                event.setFieldValue(mc.property, value)
    476472                                                break
    477                                         case Sample: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(sample)
     473                        case Sample: (record.any {it.getClass() == mc.entity}) ? 0 : record.add(sample)
    478474                                                sample.setFieldValue(mc.property, value)
    479475                                                break
    480                                         case Object:   // don't import
     476                        case Object:   // don't import
    481477                                                break
    482                                     } // end switch
    483                                 } catch (IllegalArgumentException iae) {
    484                                     // store the mapping column and value which failed
    485                                     def identifier
    486 
    487                                     switch (mc.entity) {
    488                                         case Study:  identifier = study.getIdentifier()
    489                                                 break
    490                                         case Subject: identifier = subject.getIdentifier()
    491                                                 break
    492                                         case SamplingEvent: identifier = samplingEvent.getIdentifier()
    493                                                 break
    494                                         case Event: identifier = event.getIdentifier()                                         
    495                                                 break
    496                                         case Sample: identifier = sample.getIdentifier()
    497                                                 break
    498                                         case Object:   // don't import
    499                                                 break
    500                                     }
     478                    } // end switch
     479                } catch (IllegalArgumentException iae) {
     480                    // store the mapping column and value which failed
     481                    def identifier
     482
     483                    switch (mc.entity) {
     484                        case Study:  identifier = study.getIdentifier()
     485                        break
     486                        case Subject: identifier = subject.getIdentifier()
     487                        break
     488                        case SamplingEvent: identifier = samplingEvent.getIdentifier()
     489                        break
     490                        case Event: identifier = event.getIdentifier()
     491                        break
     492                        case Sample: identifier = sample.getIdentifier()
     493                        break
     494                        case Object:   // don't import
     495                        break
     496                    }
    501497                                   
    502                                     def mcInstance = new MappingColumn()
    503                                     mcInstance.properties = mc.properties
    504                                     failed.addToImportcells(new ImportCell(mappingcolumn:mcInstance, value:value, entityidentifier:identifier))
    505                                 }
     498                    def mcInstance = new MappingColumn()
     499                    mcInstance.properties = mc.properties
     500                    failed.addToImportcells(new ImportCell(mappingcolumn:mcInstance, value:value, entityidentifier:identifier))
     501                }
    506502                        } // end
    507503                } // end for
     
    515511    * @return object corresponding to the TemplateFieldType
    516512    */
    517     def formatValue(String value, TemplateFieldType type) throws NumberFormatException {
     513   def formatValue(String value, TemplateFieldType type) throws NumberFormatException {
    518514            switch (type) {
    519                 case TemplateFieldType.STRING       :   return value.trim()
    520                 case TemplateFieldType.TEXT         :   return value.trim()
    521                 case TemplateFieldType.LONG         :   return (long) Double.valueOf(value)
    522                 //case TemplateFieldType.FLOAT      :   return Float.valueOf(value.replace(",","."));
    523                 case TemplateFieldType.DOUBLE       :   return Double.valueOf(value.replace(",","."));
    524                 case TemplateFieldType.STRINGLIST   :   return value.trim()
    525                 case TemplateFieldType.ONTOLOGYTERM :   return value.trim()
    526                 case TemplateFieldType.DATE         :   return value
    527                 default                             :   return value
     515            case TemplateFieldType.STRING           :   return value.trim()
     516            case TemplateFieldType.TEXT         :   return value.trim()
     517            case TemplateFieldType.LONG         :   return (long) Double.valueOf(value)
     518            //case TemplateFieldType.FLOAT          :   return Float.valueOf(value.replace(",","."));
     519            case TemplateFieldType.DOUBLE           :   return Double.valueOf(value.replace(",","."));
     520            case TemplateFieldType.STRINGLIST   :   return value.trim()
     521            case TemplateFieldType.ONTOLOGYTERM :   return value.trim()
     522            case TemplateFieldType.DATE         :   return value
     523            default                             :   return value
    528524            }
    529525    }
Note: See TracChangeset for help on using the changeset viewer.