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

Revision 1219, 9.7 KB (checked in by adem.bilican@…, 3 years ago)

error in the SimpleTox? exporter for parentSubject attribut

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