Ignore:
Timestamp:
Apr 8, 2011, 11:30:32 AM (6 years ago)
Author:
robert@…
Message:

Fixed bug in simpletox exporter with exporting multiple studies.

File:
1 edited

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"
Note: See TracChangeset for help on using the changeset viewer.