source: trunk/grails-app/controllers/dbnp/studycapturing/TemplateController.groovy @ 1503

Last change on this file since 1503 was 1503, checked in by j.saito@…, 9 years ago

Added missing import line.

  • Property svn:keywords set to Rev Author Date
File size: 4.2 KB
Line 
1/**
2 * TemplateController Controler
3 *
4 * An overview of
5 *
6 * @author  Kees van Bochove
7 * @since       20100726
8 * @package     dbnp.studycapturing
9 *
10 * Revision information:
11 * $Rev: 1503 $
12 * $Author: j.saito@maastrichtuniversity.nl $
13 * $Date: 2011-02-08 09:30:56 +0000 (di, 08 feb 2011) $
14 */
15package dbnp.studycapturing
16
17// Automatic marshalling of XML and JSON
18import org.dbnp.gdt.*
19import grails.converters.*
20import grails.plugins.springsecurity.Secured
21import dbnp.authentication.AuthenticationService
22
23@Secured(['IS_AUTHENTICATED_REMEMBERED'])
24class TemplateController {
25        def authenticationService
26
27        /**
28         * Shows a form to pick a file to import templates
29         */
30        def importTemplate = {
31        }
32
33        /**
34         * Handles file import
35         */
36        def handleImportedFile = {
37                if( !request.getFile("file") ) {
38                        flash.message = "No file given.";
39                        redirect( action: 'importTemplate' );
40                        return;
41                }
42
43                // Parse XML
44                def xml
45               
46                try {
47                        xml = XML.parse( request.getFile("file").inputStream.text )
48                } catch( Exception e ) {
49                        // Error in parsing. Probably the file is not a XML file
50                        flash.message = "Imported file could not be read. Please specify an XML template file.";
51                        redirect( action: 'importTemplate' );
52                }
53               
54                def numTemplates = xml.@count;
55
56                if( !xml.template ) {
57                        flash.message = "No templates could be found in the imported file. Please specify an XML template file.";
58                        redirect( action: 'importTemplate' );
59                }
60
61                // Check whether the templates already exist
62                def templates = []
63                def id = 0;
64                xml.template.each { template ->
65                        try {
66                                def t = Template.parse( template, authenticationService.getLoggedInUser() );
67
68                                def templateData = [:]
69                                templateData.key = id++;
70                                templateData.template = t
71                                templateData.alternatives = []
72
73                                // If a template exists that equals this xml template , return it.
74                                for( def otherTemplate in Template.findAllByEntity( t.entity ) ) {
75                                        if( t.contentEquals( otherTemplate ) ) {
76                                                templateData.alternatives << otherTemplate;
77                                        }
78                                }
79
80                                templates << templateData
81                        } catch (Exception e) {
82                                templates << [ template: null, error: "Template " + ( template.name ?: " without name" ) + " could not be parsed: " + e ];
83                        }
84                }
85
86                // Save templates in session in order to have data available in the next (import) step
87                session.templates = templates
88               
89                [templates: templates]
90        }
91
92        /**
93         * Saves the imported templates that the user has chosen
94         */
95        def saveImportedTemplates = {
96                def ids = params.selectedTemplate
97                def templates = session.templates
98                def messages = []
99               
100                // Save all selected templates
101                ids.each { id ->
102                        def templateData = templates.find { template -> template.key == id.toLong() }
103                        def importTemplate = templateData?.template
104
105                        if( !importTemplate ) {
106                                messages << "Template with id " + id + " could not be found."
107                        } else {
108                                def originalName = importTemplate.name
109                                def newName = null
110
111                                // Check whether a new name has been given
112                                if( params[ 'templateNames_' + id ] && params[ 'templateNames_' + id ] != importTemplate.name ) {
113                                        importTemplate.name = params[ 'templateNames_' + id ]
114                                        newName = params[ 'templateNames_' + id ]
115                                }
116
117                                if( importTemplate.save() ) {
118                                        messages << "Template " + originalName + " saved" + ( newName ? " as " + newName : "" )
119                                } else {
120                                        messages << "Template " + originalName + " could not be saved"
121                                }
122                        }
123                }
124
125                // Remove templates from the session
126                session.templates = null
127
128                [messages: messages]
129        }
130
131        /**
132         * Shows a form to select templates for export
133         */
134        def export = {
135                // If the templates are already selected, export them
136                if( params.templates ) {
137                        if( !( params.templates instanceof String ) ) {
138                                params.templates = params.templates.join(",")
139                        }
140
141                        switch( params.type ) {
142                                case "xml":
143                                default:
144                                        xml();
145                                        return
146                        }
147                        return;
148                } else {
149                        [templates: Template.findAll()]
150                }
151        }
152
153        /**
154         * XML Export of given templates, or all templates if no templates are given
155         */
156        def xml = {
157                def templates
158                if( params.templates ) {
159                        def ids = [];
160                        params.templates.split(",").each { ids << it.toLong() }
161
162                        def c = Template.createCriteria()
163                        templates = c {
164                                'in'("id", ids)
165                        }
166                } else {
167                        templates = Template.findAll()
168                }
169               
170                response.setHeader "Content-disposition", "attachment; filename=templates.xml"
171
172                render(view: 'xml', contentType:"text/xml", model: [templates: templates])
173        }
174
175}
Note: See TracBrowser for help on using the repository browser.