source: trunk/grails-app/services/dbnp/studyexport/ExportService.groovy @ 1545

Last change on this file since 1545 was 1545, checked in by work@…, 11 years ago
  • removed obsolete bgdt imports
File size: 3.7 KB
Line 
1/**
2 *  ExporterService
3 * 
4 *  @author Jahn
5 * 
6 *  This service for exporting a Study and all domain objects depending on it to XML.
7 */ 
8
9
10
11package dbnp.studyexport
12
13import dbnp.authentication.*
14import dbnp.studycapturing.*
15import grails.converters.XML
16import org.codehaus.groovy.grails.web.converters.configuration.ConvertersConfigurationHolder
17import org.dbnp.gdt.*
18
19
20class ExportService 
21{
22
23    static transactional = true
24    static scope = "session"
25
26
27    def grailsApplication
28    /**
29     *  List of classes that recursion does not go further into when building an XML 
30     *  document.
31         * 
32         *  @see #getRelatedObjects().
33     */ 
34        def static IgnoredClasses = [ String, long, Date, Boolean, SecUser, Publication, SecUser ]
35
36
37    /**
38     *  List of classes that recursion does not go further into when building an XML 
39     *  document; the elements are still included.
40         * 
41         *  @see #getRelatedObjects().
42     */ 
43        def static TerminalClasses = [ AssayModule, Identity, Ontology, PersonAffiliation, 
44                        PersonRole, Template, TemplateField, 
45                        TemplateFieldListItem, TemplateFieldType, Term ] 
46
47
48        /**
49         *  Returns a list of all Grails domain objects relevant for creating a full
50         *  XML representation of a Study.
51         * 
52         *  The actual XML is then created by the controller using Grails' XML converter.
53         * 
54         *  @param Study
55         *
56         *  @return List of all Grails domain objects
57         */ 
58
59        def getDependentObjects( Study study ) {
60                return getRelatedObjects( study )
61        }
62
63
64        /**
65         *  Returns a list of Grails domain objects. 
66         * 
67         *  Helper method for getDependentObjects().
68         * 
69         *  This method produces a list of all objects that need to be
70         *  written out in order to get an XML representation of a Study object.
71         * 
72         *  This is achieved by recursion. The recursion stops at objects whose
73         *  class is member of IgnoredClasses or TerminalClasses.
74         * 
75         *      Example call:
76         * 
77         *              def objects = getDependentObjects( Study.get(1) )
78         *              (objects*.class).unique().sort().each { println it }
79         * 
80         *  @param domainObject  A grails domain object.
81         * 
82         *  @return List of all Grails domain objects
83         */ 
84
85        def     getRelatedObjects( domainObject ) {
86
87                if(domainObject==null) {
88                        return []
89                }
90
91                def domainClass = domainObject.class
92                def objects = []
93
94                if( IgnoredClasses.contains(domainClass) )   {
95                        return objects
96                }
97
98                if( domainClass.toString()==~/class dbnp.authentication.SecUser.+/ || 
99                    domainClass.toString()==~/class dbnp.studycapturing.Publication.+/ ) {
100                        println "${domainClass} -- ${domainObject}"
101                        return objects
102                }
103
104
105
106                if( TerminalClasses.contains(domainClass) )  {
107                        return [domainObject]
108                }
109
110                objects = [domainObject]
111
112                                                                                                // enter recursion with regular domain fields
113                domainObject.getProperties().domainFields.each { field ->
114                        objects.addAll( getRelatedObjects(field) )
115                }
116
117                                                                                                // enter recursion with hasMany fields
118                domainObject.getProperties().hasMany.each { property, theClass ->
119
120                        boolean isTemplateField = ( domainObject instanceof TemplateEntity  && 
121                                property==~/template(.+)Fields/ ) 
122                        if( !isTemplateField ) {
123                                domainObject."$property".each { 
124                                                objects.addAll( getRelatedObjects(it) )
125                                }
126                        }
127
128                }
129                return objects.unique()
130        }
131
132
133        /**
134         *  Returns Study object from List of objects created by
135         *  XML representation of a Study.
136         * 
137         *  @param List of objects
138         *
139         *  @return Study object that has to be saved
140         *
141         *  @see getDependentObjects()
142         */ 
143
144        def     getStudy( Collection objectList ) {
145        }
146
147
148
149        /**
150         *  Parse XML object to List of objects to be translated into
151         *  a Study by getStudy().
152         * 
153         *  @param Study
154         *
155         *  @return List of all Grails domain objects
156         *
157         *  @see getStudy()
158         */ 
159
160        def     parseXMLStudy( XML xml ) {
161        }
162
163}
Note: See TracBrowser for help on using the repository browser.