source: trunk/grails-app/controllers/nl/tno/massSequencing/files/ExportController.groovy @ 53

Last change on this file since 53 was 53, checked in by robert@…, 8 years ago

Implemented export possibility and bugfixes

File size: 4.5 KB
Line 
1package nl.tno.massSequencing.files
2
3import groovy.xml.MarkupBuilder
4import java.util.zip.ZipEntry
5import java.util.zip.ZipOutputStream
6import nl.tno.massSequencing.*;
7import org.codehaus.groovy.grails.commons.ConfigurationHolder
8
9class ExportController {
10        def fileService
11       
12        /**
13         * Exports all studies to XML
14         */
15        def zip = {
16                // Find all studies
17                def studies = Study.list().findAll { it.canRead( session.user ) };
18               
19                // Send the right headers
20                response.setHeader "Content-disposition", "attachment; filename=sequencing_studies.zip"
21               
22                // First create zip file
23                ZipOutputStream zipFile = new ZipOutputStream( new BufferedOutputStream( response.getOutputStream() ) );
24                BufferedWriter zipWriter = new BufferedWriter( new OutputStreamWriter( zipFile ) );
25               
26                // Add the study XML file
27                zipFile.putNextEntry( new ZipEntry( "studies.xml" ) );
28                createStudiesXML( zipWriter, studies )
29                zipWriter.flush();
30                zipFile.closeEntry();
31               
32                // Add all other files. These files are stored in the directory given in the configuration
33                def permanentDir = fileService.absolutePath( ConfigurationHolder.config.massSequencing.fileDir );
34                def buffer = new byte[ 1024 ];
35               
36                studies.each { study -> study.assays?.each { assay -> assay.assaySamples?.each { assaySample -> assaySample.sequenceData?.each { data ->
37                        if( data ) {
38                                // Loop through all sequence- and quality files.
39                                def files = [ data.sequenceFile, data.qualityFile ];
40                                files.each { filename ->
41                                        if( filename ) {
42                                                // Create a zip entry for each file
43                                                // All filenames are unique, so the filenames are taken just the way they are
44                                                zipFile.putNextEntry( new ZipEntry( filename ) );
45                                               
46                                                zipFile << new FileInputStream( fileService.get( filename, permanentDir ) )
47                                               
48                                                // Close the zip entry
49                                                zipWriter.flush();
50                                                zipFile.closeEntry();
51                                        } 
52                                }
53                        }
54                } } } }
55               
56                zipFile.close();
57               
58                response.outputStream.flush();
59        }
60
61        /**
62         * Exports all studies to XML
63         */
64        def xml = {
65                def writer = new PrintWriter( response.getOutputStream() );
66                createStudiesXML( writer )
67        }
68
69        protected void createStudiesXML( Writer w, def studies = null ) {
70                if( !studies )
71                        studies = Study.list().findAll { it.canRead( session.user ) };
72                       
73                def xml = new MarkupBuilder( w );
74                def gscfInstance = ConfigurationHolder.config.gscf.baseURL;
75                def sequencingInstance = ConfigurationHolder.config.grails.serverURL
76
77                xml.studies( application: 'dbNP Mass Sequencing', version: '1.0', time: new Date().dateTimeString, instance: sequencingInstance, gscfInstance: gscfInstance ) {
78                        studies.each { studyObject ->
79                                study( trash: studyObject.trashcan, numAssays: studyObject.assays?.size(), numSamples: studyObject.samples?.size() ) {
80                                        token( studyObject.studyToken )
81                                        name( studyObject.name )
82
83                                        // Export all study assays
84                                        assays {
85                                                studyObject.assays?.each { assayObject ->
86                                                        assay( numAssaySamples: assayObject.assaySamples?.size() ) {
87                                                                token( assayObject.assayToken )
88                                                                name( assayObject.name )
89                                                        }
90                                                }
91                                        }
92
93                                        // Export all study samples
94                                        samples {
95                                                studyObject.samples?.each { sampleObject ->
96                                                        sample( numAssaySamples: sampleObject.assaySamples?.size() ) {
97                                                                token( sampleObject.sampleToken )
98                                                                name( sampleObject.name )
99                                                        }
100                                                }
101                                        }
102
103                                        // Also export all assay samples
104                                        assaySamples {
105                                                studyObject.assays*.assaySamples?.flatten().each { assaySampleObject ->
106                                                        assaySample( numSequences: assaySampleObject.numSequences() ) {
107                                                                assayToken( assaySampleObject.assay?.assayToken )
108                                                                sampleToken( assaySampleObject.sample?.sampleToken )
109
110                                                                fwOligo( assaySampleObject.fwOligo )
111                                                                fwMidName( assaySampleObject.fwMidName )
112                                                                fwTotalSeq( assaySampleObject.fwTotalSeq )
113                                                                fwMidSeq( assaySampleObject.fwMidSeq )
114                                                                fwPrimerSeq( assaySampleObject.fwPrimerSeq )
115
116                                                                revOligo( assaySampleObject.revOligo )
117                                                                revMidName( assaySampleObject.revMidName )
118                                                                revTotalSeq( assaySampleObject.revTotalSeq )
119                                                                revMidSeq( assaySampleObject.revMidSeq )
120                                                                revPrimerSeq( assaySampleObject.revPrimerSeq )
121
122                                                                sequenceData {
123                                                                        if( assaySampleObject.sequenceData ) {
124                                                                                assaySampleObject.sequenceData.each { sequenceDataObject ->
125                                                                                        file( numSequences: sequenceDataObject.numSequences ) {
126                                                                                                sequenceFile( sequenceDataObject.sequenceFile )
127                                                                                                qualityFile( sequenceDataObject.qualityFile )
128                                                                                        }
129                                                                                }
130                                                                        }
131                                                                }
132                                                        }
133                                                }
134                                        } // End assay samples
135
136                                }
137                        }
138                } // End studies
139        }
140}
Note: See TracBrowser for help on using the repository browser.