root/trunk/grails-app/controllers/dbnp/exporter/ExporterController.groovy @ 1798

Revision 1798, 9.4 KB (checked in by robert@…, 3 years ago)

After searching, several actions can be performed on search results. These actions are called by sending data to a URL. This was done using the HTTP GET method, but that resulted in error with the length of the query string (see #422). This is solved by sending all data using the HTTP POST method.

  • Property svn:keywords set to Rev Author Date
Line 
1/**
2 * ExporterController Controller
3 *
4 * Description of my controller
5 *
6 * @author  your email (+name?)
7 * @since       2010mmdd
8 * @package     ???
9 *
10 * Revision information:
11 * $Rev$
12 * $Author$
13 * $Date$
14 */
15package dbnp.exporter
16
17import dbnp.studycapturing.*
18import org.dbnp.gdt.*
19
20import org.apache.poi.hssf.util.HSSFColor
21import org.apache.poi.*
22import org.apache.poi.hssf.usermodel.*
23import org.apache.poi.poifs.filesystem.POIFSFileSystem
24import org.apache.poi.ss.usermodel.DataFormatter
25import java.util.zip.ZipEntry
26import java.util.zip.ZipOutputStream
27import java.util.zip.ZipInputStream
28import javax.servlet.ServletOutputStream
29
30import grails.plugins.springsecurity.Secured
31
32class ExporterController {
33
34    def authenticationService
35
36    /*
37     * List of all studies for selection the study to export
38     * Using the same code as 'list' into StudyController
39     */
40    def index = {
41
42        def user = authenticationService.getLoggedInUser()
43        def max = Math.min(params.max ? params.int('max') : 10, 100)
44
45        def c = dbnp.studycapturing.Study.createCriteria()
46
47        def studies = Study.giveReadableStudies(user, max);
48        [studyInstanceList: studies, studyInstanceTotal: studies.count()]
49    }
50
51    def export = {
52                def ids = params.list( 'ids' );
53                def tokens = params.list( 'tokens' );
54        def studies = []
55               
56                ids.each {
57                        if( it.toString().isLong() ) {
58                                def study = Study.get( Long.valueOf( it ) );
59                                if( study )
60                                        studies << study
61                        }
62                }
63               
64                // Also accept tokens for defining studies
65                tokens.each {
66                        def study = Study.findByStudyUUID( it );
67                        if( study )
68                                studies << study;
69                }
70       
71        if(studies.size()>1){
72
73                        // Send the right headers for the zip file to be downloaded
74                        response.setContentType( "application/zip" ) ;
75                        response.addHeader( "Content-Disposition", "attachment; filename=\"GSCF_SimpleToxStudies.zip\"" ) ;
76
77                        // Create a ZIP file containing all the SimpleTox files
78                        ZipOutputStream zipFile = new ZipOutputStream( new BufferedOutputStream( response.getOutputStream() ) );
79                        BufferedWriter zipWriter = new BufferedWriter( new OutputStreamWriter( zipFile ) );
80                       
81                        // Loop through the given studies and export them
82                        for (studyInstance in studies){
83                                if( studyInstance.samples?.size() ) {
84                                        try {
85                                                zipFile.putNextEntry( new ZipEntry( studyInstance.title + "_SimpleTox.xls" ));
86                                                downloadFile(studyInstance, zipFile);
87                                                zipWriter.flush();
88                                                zipFile.closeEntry();
89                                        } catch( Exception e ) {
90                                                log.error "Error while writing excelfile for zip for study " + studyInstance?.title + ": " + e.getMessage();
91                                        } finally {
92                                                // Always close zip entry
93                                                try {
94                                                        zipWriter.flush();
95                                                        zipFile.closeEntry();
96                                                } catch( Exception e ) {
97                                                        log.error "Error while closing excelfile for zip for study: " + e.getMessage();
98                                                }
99                                        }
100                                } else {
101                                        log.trace "Study " + studyInstance?.title + " doesn't contain any samples, so is not exported to simpleTox"
102                                       
103                                        // Add a text file with explanation in the zip file
104                                        zipFile.putNextEntry(new ZipEntry( studyInstance.title + "_contains_no_samples.txt" ) );
105                                        zipFile.closeEntry();
106                                }
107                        }
108                       
109                        // Close zipfile and flush to the user
110                        zipFile.close();
111                        response.outputStream.flush();
112                       
113        } else {
114            def studyInstance = studies.getAt(0)
115            // make the file downloadable
116            if ((studyInstance!=null) && (studyInstance.samples.size()>0)){
117                    response.setHeader("Content-disposition", "attachment;filename=\"${studyInstance.title}_SimpleTox.xls\"")
118                    response.setContentType("application/octet-stream")
119                downloadFile(studyInstance, response.getOutputStream())
120                                response.getOutputStream().close()
121            } else if( studyInstance.samples.size() == 0 ) {
122                                flash.message = "Given study doesn't contain any samples, so no excel file is created. Please choose another study.";
123                                redirect( action: 'index' );
124                        }
125            else {
126                flash.message= "Error while exporting the file, please try again or choose another study."
127                redirect( action: 'index' )
128            }
129
130        }
131
132    }
133    /*
134     * the export method will create a SimpleTox format for the selected study
135     * and write the file to the given output stream
136     */
137    def downloadFile(studyInstance, OutputStream outStream) {
138        // the attributes list for the SimpleTox format
139        def attributes_list = ["SubjectID","DataFile","HybName","SampleName","ArrayType","Label","StudyTitle","Array_ID",
140        "Species"]
141        //println studyInstance.samples.size()
142        //println "StudyInstance :" + studyInstance
143               
144        // The first row contains the attributes names
145        HSSFWorkbook wb = new HSSFWorkbook()
146        HSSFSheet sheet = wb.createSheet()
147        HSSFRow row     = sheet.createRow((short)0)
148        for (i in 0..attributes_list.size()){
149            row.createCell((short)i).setCellValue(attributes_list[i])
150        }
151
152        // Adding the next lines
153        for (s in 1..studyInstance.samples.size()){
154            // creating new line for every sample
155            HSSFRow sub     = sheet.createRow((short)s)
156            def sample = studyInstance.samples.getAt(s-1)
157           
158            writeMandatoryFields(sub,sample,studyInstance)
159
160            try {
161                // adding the subject domain + template properties
162                writeSubjectProperties(sub,sample,row)
163
164                // adding the samplingEvent domain + template properties
165                writeSamplingEventProperties(sub,sample,row)
166           
167                // adding EventGroup domain + template properties
168                //                writeEventGroupProperties(sub,sample,rows)
169
170                // adding Sample domain + template properties
171                writeSampleProperties(sub,sample,row)
172            }
173            catch (Exception e){
174                //println "Error adding properties"
175            }
176        }
177
178                wb.write( outStream );
179    }
180
181    def writeMandatoryFields(sub,sample,study) {
182        // adding subject name in row 1
183        sample.parentSubject ? sub.createCell((short)0).setCellValue(sample.parentSubject.name) : "not defined"
184        // adding sample in row 4
185        sample.name!=null ? sub.createCell((short)3).setCellValue(sample.name) : "not defined"
186        // adding label (EventGroup) in row 6
187        for (ev in EventGroup.list()){
188            if(sample.parentSubject){
189                if ( (sample.parentSubject.name) && (ev.subjects.name.contains(sample.parentSubject.name))) {
190                    sub.createCell((short)5).setCellValue(ev.name)
191                    break
192                }
193                else {
194                    sub.createCell((short)5).setCellValue(" ")
195                }}
196            else {
197                sub.createCell((short)5).setCellValue(" ")
198            }
199        }
200        // adding study title in row 7
201        sub.createCell((short)6).setCellValue(study.title)
202        // Species row 9
203//        sample.parentSubject.species.name!=null ? sub.createCell((short)8).setCellValue(sample.parentSubject.species.name) : "not defined"
204        sample.parentSubject ? sub.createCell((short)8).setCellValue(sample.parentSubject.species.name) : "not defined"
205    }
206
207    // writing subject properties
208    def writeSubjectProperties(sub,sample,row) {
209                if( sample.parentSubject ) {
210                        log.trace "----- SUBJECT -----"
211                for (u in 0..sample.parentSubject.giveFields().unique().size()-1){
212                    TemplateField tf = sample.parentSubject.giveFields().getAt(u)
213                    log.trace tf.name
214                    row.createCell((short)9+u).setCellValue(tf.name)
215                    sample.parentSubject.getFieldValue(tf.name) ? sub.createCell((short)9+u).setCellValue(sample.parentSubject.getFieldValue(tf.name).toString()) : "not define"
216                }
217                } else {
218                        log.trace "------ NO SUBJECT FOR SAMPLE " + sample.name + "-----";
219                }
220    }
221
222    // writing samplingEvent properties
223    def writeSamplingEventProperties(sub,sample,row){
224                if( sample.parentEvent ) {
225                log.trace "----- SAMPLING EVENT -----"
226                for (t in 0..sample.parentEvent.giveFields().unique().size()-1){
227                    TemplateField tf =sample.parentEvent.giveFields().getAt(t)
228                    log.trace tf.name
229                    row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue("samplingEvent-"+tf.name)
230                    sample.parentEvent.getFieldValue(tf.name) ? sub.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue(sample.parentEvent.getFieldValue(tf.name).toString()) : "not define"
231                }
232                } else {
233                        log.trace "------ NO SAMPLING EVENT FOR SAMPLE " + sample.name + "-----";
234                }
235    }
236
237    // writing EventGroup properties
238    def writeEventGroupProperties(sub,sample,row){
239     
240    }
241
242    // writing sample properties
243    def writeSampleProperties(sub,sample,row){
244        log.trace "----- SAMPLE -----"
245        for (v in 0..sample.giveFields().unique().size()-1){
246            TemplateField tf =sample.giveFields().getAt(v)
247            log.trace tf.name
248            row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+v+sample.parentEvent.giveFields().unique().size()).setCellValue("sample-"+tf.name)
249            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"
250        }
251    }
252}
Note: See TracBrowser for help on using the browser.