source: trunk/grails-app/controllers/nl/tno/metagenomics/SampleController.groovy @ 14

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

Implemented improved authorization (#16)
Built in select all checkboxes (#25)

File size: 3.2 KB
Line 
1package nl.tno.metagenomics
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           // Export the sequences and quality scores
31           response.setHeader "Content-disposition", "attachment; filename=" + name.trim() + ".zip"
32           try {
33                   fastaService.export( assaySamples.unique(), response.getOutputStream(), name );
34                   response.outputStream.flush();
35           } catch( Exception e ) {
36                   log.error( "Exception occurred during export of sequences. Probably the user has cancelled the download." );
37           }
38   }
39
40   /**
41        * Export metadata of one or more studies in excel format
42        */
43   def exportMetaData = {
44           def assaySamples = getAssaySamples( params );
45           def name
46
47           if( assaySamples == null ) {
48                   return
49           } else if( assaySamples*.sample.unique().size() == 1 ) {
50                   name = "Sample_" + assaySamples[0].sample.name?.replace( ' ', '_' );
51           } else {
52                   name = "samples";
53           }
54
55           // Export the metadata
56           response.setHeader "Content-disposition", "attachment; filename=${name}.xls"
57           try {
58                   // The export functionality needs a assaySample-tag list, but it
59                   // should be empty when only exporting metadata
60                   def tags = [];
61                   assaySamples.unique().each { assaySample ->
62                           tags << [assaySampleId: assaySample.id, sampleName: assaySample.sample.name, assayName: assaySample.assay.name, studyName: assaySample.assay.study.name, tag: "-"]
63                   }
64                   sampleExcelService.exportExcelSampleData( assaySamples.unique(), tags, response.getOutputStream() );
65                   response.outputStream.flush();
66           } catch( Exception e ) {
67                   log.error( "Exception occurred during export of metadata. Probably the user has cancelled the download." );
68                   e.printStackTrace();
69           }
70   }
71               
72       
73       
74               
75        /**
76         * Parse the given parameters and try to extract assaysamples using ids and tokens of samples
77         * @param params
78         * @return
79         */
80        protected List getAssaySamples( params ) {
81                def tokens = params.list( 'tokens' );
82                def ids = params.list( 'ids' );
83                def name;
84
85                ids = ids.findAll { it.isLong() }.collect { Long.parseLong( it ) }
86
87                if( !tokens && !ids ) {
88                        def message = "No sample tokens or ids given"
89                        flash.error = message
90                        redirect( action: "index" );
91                        return;
92                }
93
94                def assaySamples = [];
95
96                // Determine which assaySamples to export
97                def sample;
98                tokens.each { token ->
99                        sample = Sample.findBySampleToken( token );
100                        if( sample.study.canRead( session.user ) ) {
101                                if( sample && sample.assaySamples )
102                                        assaySamples += sample.assaySamples;
103                        }
104                }
105                ids.each { id ->
106                        sample = Sample.get( id );
107                        if( sample.study.canRead( session.user ) ) {
108                                if( sample && sample.assaySamples )
109                                        assaySamples += sample.assaySamples;
110                        }
111                }
112
113                return assaySamples;
114        }
115
116       
117}
Note: See TracBrowser for help on using the repository browser.