Show
Ignore:
Timestamp:
08-04-11 11:30:32 (3 years ago)
Author:
robert@…
Message:

Fixed bug in simpletox exporter with exporting multiple studies.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/dbnp/exporter/ExporterController.groovy

    r1617 r1729  
    6262         
    6363        if(studies.size()>1){ 
    64             // Create a ZIP file containing all the SimpleTox files 
    65             def files = [] 
    66             for (studyInstance in studies){ 
    67                 downloadFile(studyInstance,false) 
    68                 files.add(new File("web-app/fileuploads/"+studyInstance.id+"_SimpleTox.xls")) 
    69             } 
    70  
    71             response.setContentType( "application/zip" ) ; 
    72             response.addHeader( "Content-Disposition", "attachment; filename=\"GSCF_SimpleToxStudies.zip\"" ) ; 
    73  
    74             // get a ZipOutputStream, so we can zip our files together 
    75             ZipOutputStream outZip = new ZipOutputStream( response.getOutputStream() ); 
    76  
    77             // add SimpleTox files to the zip 
    78             for (outFiles in files){ 
    79  
    80                 FileInputStream inStream = null 
    81                 try 
    82                 { 
    83                     // Add ZIP entry to output stream. 
    84                     outZip.putNextEntry( new ZipEntry( outFiles.getName() ) ) ; 
    85  
    86                     inStream = new FileInputStream( outFiles ) 
    87  
    88                     // Transfer bytes from the file to the ZIP file 
    89                     byte[] buf = new byte[ 4096 ] ; 
    90                     int len  
    91                     while( ( len = inStream.read( buf ) ) > 0 ) 
    92                     { 
    93                         outZip.write( buf, 0, len )  
    94                     } 
    95                 } 
    96                 catch( Exception ex ) {  } 
    97                 finally 
    98                 { 
    99                     // Complete the entry 
    100                     try{ outZip.closeEntry() } catch( Exception ex ) { } 
    101                     try{ inStream.close() } catch( Exception ex ) { } 
    102                 } 
    103                 outFiles.delete() 
    104             } 
    105             outZip.flush()  
    106             outZip.close() 
    107         } 
    108  
    109  
    110         else { 
     64 
     65                        // Send the right headers for the zip file to be downloaded 
     66                        response.setContentType( "application/zip" ) ; 
     67                        response.addHeader( "Content-Disposition", "attachment; filename=\"GSCF_SimpleToxStudies.zip\"" ) ; 
     68 
     69                        // Create a ZIP file containing all the SimpleTox files 
     70                        ZipOutputStream zipFile = new ZipOutputStream( new BufferedOutputStream( response.getOutputStream() ) ); 
     71                        BufferedWriter zipWriter = new BufferedWriter( new OutputStreamWriter( zipFile ) ); 
     72                         
     73                        // Loop through the given studies and export them 
     74                        for (studyInstance in studies){ 
     75                                if( studyInstance.samples?.size() ) { 
     76                                        try { 
     77                                                zipFile.putNextEntry( new ZipEntry( studyInstance.title + "_SimpleTox.xls" )); 
     78                                                downloadFile(studyInstance, zipFile); 
     79                                                zipWriter.flush(); 
     80                                                zipFile.closeEntry(); 
     81                                        } catch( Exception e ) { 
     82                                                log.error "Error while writing excelfile for zip for study " + studyInstance?.title + ": " + e.getMessage(); 
     83                                        } finally { 
     84                                                // Always close zip entry 
     85                                                try { 
     86                                                        zipWriter.flush(); 
     87                                                        zipFile.closeEntry(); 
     88                                                } catch( Exception e ) { 
     89                                                        log.error "Error while closing excelfile for zip for study: " + e.getMessage(); 
     90                                                } 
     91                                        } 
     92                                } else { 
     93                                        log.trace "Study " + studyInstance?.title + " doesn't contain any samples, so is not exported to simpleTox" 
     94                                         
     95                                        // Add a text file with explanation in the zip file 
     96                                        zipFile.putNextEntry(new ZipEntry( studyInstance.title + "_contains_no_samples.txt" ) ); 
     97                                        zipFile.closeEntry(); 
     98                                } 
     99                        } 
     100                         
     101                        // Close zipfile and flush to the user 
     102                        zipFile.close(); 
     103                        response.outputStream.flush(); 
     104                         
     105        } else { 
    111106            def studyInstance = studies.getAt(0) 
    112107            // make the file downloadable 
    113108            if ((studyInstance!=null) && (studyInstance.samples.size()>0)){ 
    114                 downloadFile(studyInstance,true) 
    115             } 
     109                    response.setHeader("Content-disposition", "attachment;filename=\"${studyInstance.title}_SimpleTox.xls\"") 
     110                    response.setContentType("application/octet-stream") 
     111                downloadFile(studyInstance, response.getOutputStream()) 
     112                                response.getOutputStream().close() 
     113            } else if( studyInstance.samples.size() == 0 ) { 
     114                                flash.message = "Given study doesn't contain any samples, so no excel file is created. Please choose another study."; 
     115                                redirect( action: 'index' ); 
     116                        } 
    116117            else { 
    117                 flash.message= "Error while exporting the file, please try again or choose another file" 
    118                 redirect(action:index) 
     118                flash.message= "Error while exporting the file, please try again or choose another study." 
     119                redirect( action: 'index' ) 
    119120            } 
    120121 
     
    123124    } 
    124125    /*  
    125      * the export method will create a SimpleTox format for the selected study 
     126     * the export method will create a SimpleTox format for the selected study  
     127     * and write the file to the given output stream 
    126128     */ 
    127     def downloadFile(studyInstance, boolean dl) { 
     129    def downloadFile(studyInstance, OutputStream outStream) { 
    128130        // the attributes list for the SimpleTox format 
    129131        def attributes_list = ["SubjectID","DataFile","HybName","SampleName","ArrayType","Label","StudyTitle","Array_ID", 
     
    166168        } 
    167169 
    168         // Make the file downlodable 
    169         if(dl) { 
    170             println "Creation for downloading the file "+studyInstance.title+"_SimpleTox.xls" 
    171             response.setHeader("Content-disposition", "attachment;filename=\"${studyInstance.title}_SimpleTox.xls\"") 
    172             response.setContentType("application/octet-stream") 
    173             wb.write(response.outputStream) 
    174             response.outputStream.close() 
    175         } 
    176  
    177         // Create the file and save into ZIP 
    178         if(!dl){ 
    179             FileOutputStream fileOut = new FileOutputStream("web-app/fileuploads/"+studyInstance.id+"_SimpleTox.xls", true) 
    180             wb.write(fileOut) 
    181             fileOut.close() 
    182         } 
     170                wb.write( outStream ); 
    183171    } 
    184172 
     
    211199    // writing subject properties 
    212200    def writeSubjectProperties(sub,sample,row) { 
    213         println "----- SUBJECT -----" 
    214         for (u in 0..sample.parentSubject.giveFields().unique().size()-1){ 
    215             TemplateField tf = sample.parentSubject.giveFields().getAt(u) 
    216             println tf.name 
    217             row.createCell((short)9+u).setCellValue(tf.name) 
    218             sample.parentSubject.getFieldValue(tf.name) ? sub.createCell((short)9+u).setCellValue(sample.parentSubject.getFieldValue(tf.name).toString()) : "not define" 
    219         } 
     201                if( sample.parentSubject ) { 
     202                        log.trace "----- SUBJECT -----" 
     203                for (u in 0..sample.parentSubject.giveFields().unique().size()-1){ 
     204                    TemplateField tf = sample.parentSubject.giveFields().getAt(u) 
     205                    log.trace tf.name 
     206                    row.createCell((short)9+u).setCellValue(tf.name) 
     207                    sample.parentSubject.getFieldValue(tf.name) ? sub.createCell((short)9+u).setCellValue(sample.parentSubject.getFieldValue(tf.name).toString()) : "not define" 
     208                } 
     209                } else { 
     210                        log.trace "------ NO SUBJECT FOR SAMPLE " + sample.name + "-----"; 
     211                } 
    220212    } 
    221213 
    222214    // writing samplingEvent properties 
    223215    def writeSamplingEventProperties(sub,sample,row){ 
    224         println "----- SAMPLING EVENT -----" 
    225         for (t in 0..sample.parentEvent.giveFields().unique().size()-1){ 
    226             TemplateField tf =sample.parentEvent.giveFields().getAt(t) 
    227             println tf.name 
    228             row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue("samplingEvent-"+tf.name) 
    229             sample.parentEvent.getFieldValue(tf.name) ? sub.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue(sample.parentEvent.getFieldValue(tf.name).toString()) : "not define" 
    230         } 
     216                if( sample.parentEvent ) { 
     217                log.trace "----- SAMPLING EVENT -----" 
     218                for (t in 0..sample.parentEvent.giveFields().unique().size()-1){ 
     219                    TemplateField tf =sample.parentEvent.giveFields().getAt(t) 
     220                    log.trace tf.name 
     221                    row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue("samplingEvent-"+tf.name) 
     222                    sample.parentEvent.getFieldValue(tf.name) ? sub.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue(sample.parentEvent.getFieldValue(tf.name).toString()) : "not define" 
     223                } 
     224                } else { 
     225                        log.trace "------ NO SAMPLING EVENT FOR SAMPLE " + sample.name + "-----"; 
     226                } 
    231227    } 
    232228 
     
    238234    // writing sample properties 
    239235    def writeSampleProperties(sub,sample,row){ 
    240         println "----- SAMPLE -----" 
     236        log.trace "----- SAMPLE -----" 
    241237        for (v in 0..sample.giveFields().unique().size()-1){ 
    242238            TemplateField tf =sample.giveFields().getAt(v) 
    243             println tf.name 
     239            log.trace tf.name 
    244240            row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+v+sample.parentEvent.giveFields().unique().size()).setCellValue("sample-"+tf.name) 
    245241            sample.getFieldValue(tf.name) ? sub.createCell((short)9+sample.parentSubject.giveFields().unique().size()+v+sample.parentEvent.giveFields().unique().size()).setCellValue(sample.getFieldValue(tf.name).toString()) : "not define"