source: trunk/grails-app/controllers/dbnp/exporter/ExporterController.groovy @ 1112

Last change on this file since 1112 was 1112, checked in by adem.bilican@…, 10 years ago

SimpleTox? exporter + ZIP file for multiple studies + error handling

File size: 9.4 KB
Line 
1/**
2 * ExporterController Controler
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.*
18
19import org.apache.poi.hssf.util.HSSFColor
20import org.apache.poi.*
21import org.apache.poi.hssf.usermodel.*
22import org.apache.poi.poifs.filesystem.POIFSFileSystem
23import org.apache.poi.ss.usermodel.DataFormatter
24import java.util.zip.ZipEntry
25import java.util.zip.ZipOutputStream
26import java.util.zip.ZipInputStream
27import javax.servlet.ServletOutputStream
28
29import grails.plugins.springsecurity.Secured
30
31class ExporterController {
32
33    def AuthenticationService
34    def ImporterService
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
48        if( user == null ) {
49            studies = c.list {
50                maxResults(max)
51                and {
52                    eq( "published", true )
53                    eq( "publicstudy", true )
54                }
55            }
56        } else {
57            studies = c.list {
58                maxResults(max)
59                or {
60                    eq( "owner", user )
61                    writers {
62                        eq( "id", user.id )
63                    }
64                    and {
65                        readers {
66                            eq( "id", user.id )
67                        }
68                        eq( "published", true )
69                    }
70                }
71            }
72        }
73        [studyInstanceList: studies, studyInstanceTotal: studies.count()]
74    }
75
76    def print = {
77        render params
78        render "PRINTING"
79    }
80
81
82    def export = {
83
84        def studies = []
85        for ( j in dbnp.studycapturing.Study.list() ){
86            if (params.containsKey(j.title)){
87                studies.add(j)
88            }
89        }
90       
91        if(studies.size()>1){
92            // Create a ZIP file containing all the SimpleTox files
93            def files = []
94            for (studyInstance in studies){
95                downloadFile(studyInstance,false)
96                files.add(new File("web-app/fileuploads/"+studyInstance.title+"_SimpleTox.xls"))
97            }
98
99            response.setContentType( "application/zip" ) ;
100            response.addHeader( "Content-Disposition", "attachment; filename=\"GSCF_SimpleToxStudies.zip\"" ) ;
101
102            // get a ZipOutputStream, so we can zip our files together
103            ZipOutputStream outZip = new ZipOutputStream( response.getOutputStream() );
104
105            // add SimpleTox files to the zip
106            for (outFiles in files){
107
108                FileInputStream inStream = null
109                try
110                {
111                    // Add ZIP entry to output stream.
112                    outZip.putNextEntry( new ZipEntry( outFiles.getName() ) ) ;
113
114                    inStream = new FileInputStream( outFiles )
115
116                    // Transfer bytes from the file to the ZIP file
117                    byte[] buf = new byte[ 4096 ] ;
118                    int len
119                    while( ( len = inStream.read( buf ) ) > 0 )
120                    {
121                        outZip.write( buf, 0, len ) 
122                    }
123                }
124                catch( Exception ex ) {  }
125                finally
126                {
127                    // Complete the entry
128                    try{ outZip.closeEntry() } catch( Exception ex ) { }
129                    try{ inStream.close() } catch( Exception ex ) { }
130                }
131                outFiles.delete()
132            }
133            outZip.flush() 
134            outZip.close()
135        }
136
137
138        else {
139            def studyInstance = studies.getAt(0)
140            // make the file downloadable
141            if ((studyInstance!=null) && (studyInstance.samples.size()>0)){
142                downloadFile(studyInstance,true)
143            }
144            else {
145                flash.message= "Error while exporting the file, please try again or choose another file"
146                redirect(action:index)
147            }
148
149        }
150
151    }
152    /*
153     * the export method will create a SimpleTox format for the selected study
154     */
155    def downloadFile(studyInstance, boolean dl) {
156        // the attributes list for the SimpleTox format
157        def attributes_list = ["SubjectID","DataFile","HybName","SampleName","ArrayType","Label","StudyTitle","Array_ID",
158        "Species"]
159        println studyInstance.samples.size()
160        println "StudyInstance :" + studyInstance
161               
162        // The first row contains the attributes names
163        HSSFWorkbook wb = new HSSFWorkbook()
164        HSSFSheet sheet = wb.createSheet()
165        HSSFRow row     = sheet.createRow((short)0)
166        for (i in 0..attributes_list.size()){
167            row.createCell((short)i).setCellValue(attributes_list[i])
168        }
169
170        // Adding the next lines
171        for (s in 1..studyInstance.samples.size()){
172            // creating new line for every sample
173            HSSFRow sub     = sheet.createRow((short)s)
174            def sample = studyInstance.samples.getAt(s-1)
175           
176            writeMandatoryFields(sub,sample,studyInstance)
177
178            try {
179                // adding the subject domain + template properties
180                writeSubjectProperties(sub,sample,row)
181
182                // adding the samplingEvent domain + template properties
183                writeSamplingEventProperties(sub,sample,row)
184           
185                // adding EventGroup domain + template properties
186                //                writeEventGroupProperties(sub,sample,rows)
187
188                // adding Sample domain + template properties
189                writeSampleProperties(sub,sample,row)
190            }
191            catch (Exception e){
192                println "Error adding properties"
193            }
194        }
195
196        // Make the file downlodable
197        if(dl) {
198            println "Creation for downloading the file "+studyInstance.title+"_SimpleTox.xls"
199            response.setHeader("Content-disposition", "attachment;filename=\"${studyInstance.title}_SimpleTox.xls\"")
200            response.setContentType("application/octet-stream")
201            wb.write(response.outputStream)
202            response.outputStream.close()
203        }
204
205        // Create the file and save into ZIP
206        if(!dl){
207            FileOutputStream fileOut = new FileOutputStream("web-app/fileuploads/"+studyInstance.title+"_SimpleTox.xls", true)
208            wb.write(fileOut)
209            fileOut.close()
210        }
211    }
212
213    def writeMandatoryFields(sub,sample,study) {
214        // adding subject name in row 1
215        sample.parentSubject.name ? sub.createCell((short)0).setCellValue(sample.parentSubject.name) : "not defined"
216        // adding sample in row 4
217        sample.name!=null ? sub.createCell((short)3).setCellValue(sample.name) : "not defined"
218        // adding label (EventGroup) in row 6
219        for (ev in EventGroup.list()){
220            if ( (sample.parentSubject.name) && (ev.subjects.name.contains(sample.parentSubject.name))) {
221                sub.createCell((short)5).setCellValue(ev.name)
222                break
223            }
224            else {
225                sub.createCell((short)5).setCellValue(" ")
226            }
227        }
228        // adding study title in row 7
229        sub.createCell((short)6).setCellValue(study.title)
230        // Species row 9
231        sample.parentSubject.species.name!=null ? sub.createCell((short)8).setCellValue(sample.parentSubject.species.name) : "not defined"
232    }
233
234    // writing subject properties
235    def writeSubjectProperties(sub,sample,row) {
236        for (u in 0..sample.parentSubject.giveFields().unique().size()-1){
237            TemplateField tf = sample.parentSubject.giveFields().getAt(u)
238            row.createCell((short)9+u).setCellValue("subject-"+tf.name)
239            sample.parentSubject.getFieldValue(tf.name) ? sub.createCell((short)9+u).setCellValue(sample.parentSubject.getFieldValue(tf.name).toString()) : "not define"
240        }
241    }
242
243    // writing samplingEvent properties
244    def writeSamplingEventProperties(sub,sample,row){
245        for (t in 0..sample.parentEvent.giveFields().unique().size()-1){
246            TemplateField tf =sample.parentEvent.giveFields().getAt(t)
247            row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue("samplingEvent-"+tf.name)
248            sample.parentEvent.getFieldValue(tf.name) ? sub.createCell((short)9+sample.parentSubject.giveFields().unique().size()+t).setCellValue(sample.parentEvent.getFieldValue(tf.name).toString()) : "not define"
249        }
250    }
251
252    // writing EventGroup properties
253    def writeEventGroupProperties(sub,sample,row){
254     
255    }
256
257    // writing sample properties
258    def writeSampleProperties(sub,sample,row){
259        for (v in 0..sample.giveFields().unique().size()-1){
260            TemplateField tf =sample.giveFields().getAt(v)
261            row.createCell((short)9+sample.parentSubject.giveFields().unique().size()+v+sample.parentEvent.giveFields().unique().size()).setCellValue("sample-"+tf.name)
262            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"
263        }
264    }
265}
Note: See TracBrowser for help on using the repository browser.