source: trunk/grails-app/controllers/nl/tno/massSequencing/StudyController.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.6 KB
Line 
1package nl.tno.massSequencing
2
3import java.util.List;
4
5class StudyController {
6        def synchronizationService
7        def gscfService
8        def fileService
9        def trashService
10        def fastaService
11        def sampleExcelService
12       
13        def index = {
14                // Clean the upload directory
15                fileService.cleanDirectory();
16               
17                // Clean the trash if needed
18                trashService.cleanTrash();
19               
20                // Filter studies for the ones the user is allowed to see
21                def studies = Study.list();
22                [studies: studies.findAll { it.canRead( session.user ) }, 
23                        gscfAddUrl: gscfService.urlAddStudy(), 
24                        lastSynchronized: synchronizationService.lastFullSynchronization ] 
25        }
26       
27        def sequenceLengthHistogram = {
28                redirect( controller: "assaySample", action: "sequenceLengthHistogramForStudy", id: params.id );
29        }
30
31        /**
32         * Exports data about one or more studies in fasta format
33         */
34        def exportAsFasta = {
35                def assaySamples = getAssaySamples( params );
36                def name
37
38                if( assaySamples == null ) {
39                        return
40                } else if( assaySamples*.assay*.study.unique().size() == 1 ) {
41                        name = "Study_" + assaySamples[0].assay.study.name?.replace( ' ', '_' );
42                } else {
43                        name = "studies";
44                }
45
46                // Start the export in the background
47                def returnUrl = params.url ? params.url.toString() : createLink( controller: "study" ).toString()
48                def finishUrl = createLink( controller: "assaySample", action: 'downloadFasta', params: [ processId: '%s' ] ).toString();
49                def url = fastaService.startExportProcess( assaySamples, session, name, returnUrl, finishUrl )
50               
51                // Show a waiting screen
52                redirect( url: url );
53        }
54
55        /**
56         * Export metadata of one or more studies in excel format
57         */
58        def exportMetaData = {
59                def assaySamples = getAssaySamples( params );
60                def name
61
62                if( assaySamples == null ) {
63                        return
64                } else if( assaySamples*.assay*.study.unique().size() == 1 ) {
65                        name = "Study_" + assaySamples[0].assay.study.name?.replace( ' ', '_' );
66                } else {
67                        name = "studies";
68                }
69
70                // Export the metadata
71                response.setHeader "Content-disposition", "attachment; filename=${name}.xls"
72                try {
73                        // The export functionality needs a assaySample-tag list, but it
74                        // should be empty when only exporting metadata
75                        def tags = [];
76                        assaySamples.unique().each { assaySample ->
77                                tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: "-"]
78                        }
79
80                        sampleExcelService.sessionToken = session.sessionToken
81                       
82                        sampleExcelService.exportExcelSampleData( assaySamples.unique(), tags, response.getOutputStream() );
83                        response.outputStream.flush();
84                } catch( Exception e ) {
85                        log.error( "Exception occurred during export of metadata. Probably the user has cancelled the download." );
86                        e.printStackTrace();
87                }
88        }
89
90        /**
91         * Parse the given parameters and try to extract studies using ids and tokens
92         * @param params
93         * @return
94         */
95        protected List getAssaySamples( params ) {
96                def tokens = params.list( 'tokens' );
97                def ids = params.list( 'ids' );
98                def name;
99
100                ids = ids.findAll { it.isLong() }.collect { Long.parseLong( it ) }
101
102                if( !tokens && !ids ) {
103                        def message = "No assay tokens or ids given"
104                        flash.error = message
105                        redirect( action: "index" );
106                        return;
107                }
108
109                def assaySamples = [];
110
111                // Determine which assaySamples to export
112                def study;
113                tokens.each { token ->
114                        study = Study.findByStudyToken( token );
115                        if( study && study.canRead( session.user ) )
116                                assaySamples += study.assays*.assaySamples.flatten();
117                }
118                ids.each { id ->
119                        study = Study.get( id );
120                        if( study && study.canRead( session.user ) )
121                                assaySamples += study.assays*.assaySamples.flatten();
122                }
123
124                return assaySamples;
125        }
126
127}
Note: See TracBrowser for help on using the repository browser.