source: trunk/grails-app/controllers/nl/tno/massSequencing/SampleController.groovy @ 70

Last change on this file since 70 was 70, checked in by robert@…, 8 years ago
  • Installed templates (in order to extend session lifetime to 2 hours)
  • Implemented background worker to do work outside the HTTP request
File size: 3.1 KB
Line 
1package nl.tno.massSequencing
2
3import java.util.List;
4
5import org.codehaus.groovy.grails.commons.ConfigurationHolder
6
7class SampleController {
8        def fastaService
9        def sampleExcelService
10
11        def index = {
12                redirect( controller: 'study' );
13        }
14
15        /**
16         * Exports data about one or more studies in fasta format
17         */
18        def exportAsFasta = {
19                def assaySamples = getAssaySamples( params );
20                def name
21
22                if( assaySamples == null ) {
23                        return
24                } else if( assaySamples*.sample.unique().size() == 1 ) {
25                        name = "Sample_" + assaySamples[0].sample.name?.replace( ' ', '_' );
26                } else {
27                        name = "samples";
28                }
29
30                // Start the export in the background
31                def returnUrl = params.url ? params.url.toString() : createLink( controller: "run" ).toString()
32                def finishUrl = createLink( controller: "assaySample", action: 'downloadFasta', params: [ processId: '%s' ] ).toString();
33                def url = fastaService.startExportProcess( assaySamples, session, name, returnUrl, finishUrl )
34               
35                // Show a waiting screen
36                redirect( url: url );
37        }
38
39        /**
40         * Export metadata of one or more studies in excel format
41         */
42        def exportMetaData = {
43                def assaySamples = getAssaySamples( params );
44                def name
45
46                if( assaySamples == null ) {
47                        return
48                } else if( assaySamples*.sample.unique().size() == 1 ) {
49                        name = "Sample_" + assaySamples[0].sample.name?.replace( ' ', '_' );
50                } else {
51                        name = "samples";
52                }
53
54                // Export the metadata
55                response.setHeader "Content-disposition", "attachment; filename=${name}.xls"
56                try {
57                        // The export functionality needs a assaySample-tag list, but it
58                        // should be empty when only exporting metadata
59                        def tags = [];
60                        assaySamples.unique().each { assaySample ->
61                                tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: "-"]
62                        }
63
64                        sampleExcelService.sessionToken = session.sessionToken
65
66                        sampleExcelService.exportExcelSampleData( assaySamples.unique(), tags, response.getOutputStream() );
67                        response.outputStream.flush();
68                } catch( Exception e ) {
69                        log.error( "Exception occurred during export of metadata. Probably the user has cancelled the download." );
70                        e.printStackTrace();
71                }
72        }
73
74
75
76
77        /**
78         * Parse the given parameters and try to extract assaysamples using ids and tokens of samples
79         * @param params
80         * @return
81         */
82        protected List getAssaySamples( params ) {
83                def tokens = params.list( 'tokens' );
84                def ids = params.list( 'ids' );
85                def name;
86
87                ids = ids.findAll { it.isLong() }.collect { Long.parseLong( it ) }
88
89                if( !tokens && !ids ) {
90                        def message = "No sample tokens or ids given"
91                        flash.error = message
92                        redirect( action: "index" );
93                        return;
94                }
95
96                def assaySamples = [];
97
98                // Determine which assaySamples to export
99                def sample;
100                tokens.each { token ->
101                        sample = Sample.findBySampleToken( token );
102                        if( sample?.study?.canRead( session.user ) ) {
103                                if( sample && sample.assaySamples )
104                                        assaySamples += sample.assaySamples;
105                        }
106                }
107                ids.each { id ->
108                        sample = Sample.get( id );
109                        if( sample?.study?.canRead( session.user ) ) {
110                                if( sample && sample.assaySamples )
111                                        assaySamples += sample.assaySamples;
112                        }
113                }
114
115                return assaySamples;
116        }
117
118
119}
Note: See TracBrowser for help on using the repository browser.