source: trunk/grails-app/domain/dbnp/studycapturing/TemplateEntity.groovy @ 224

Last change on this file since 224 was 224, checked in by keesvb, 10 years ago

revised templating system: templates are now per entity rather than per study, moved samples to Study

File size: 4.0 KB
Line 
1package dbnp.studycapturing
2
3import dbnp.data.Term
4import org.codehaus.groovy.runtime.NullObject
5
6class TemplateEntity {
7
8        Template template
9
10        Map templateStringFields
11        Map templateStringListFields
12        Map templateIntegerFields
13        Map templateFloatFields
14        Map templateDoubleFields
15        Map templateDateFields
16        Map templateTermFields
17
18        static hasMany = [
19                templateStringFields: String,
20                templateStringListFields: TemplateFieldListItem,
21                templateIntegerFields: int,
22                templateFloatFields: float,
23                templateDoubleFields: double,
24                templateDateFields: Date,
25                templateTermFields: Term
26        ]
27
28        static constraints = {
29        }
30
31        /**
32         * Find a template field by its name and return its value for this subject
33         * @param fieldName The name of the template subject field
34         * @return the value of the field (class depends on the field type)
35         * @throws NoSuchFieldException If the field is not found or the field type is not supported
36         */
37        def getFieldValue(String fieldName) {
38                TemplateFieldType fieldType = template.getFieldType(fieldName)
39                if (!fieldType) throw new NoSuchFieldException("Field name ${fieldName} not recognized")
40                switch(fieldType) {
41                        case [TemplateFieldType.STRING, TemplateFieldType.STRINGLIST]:
42                                return templateStringFields[fieldName]
43                        case [TemplateFieldType.STRINGLIST]:
44                                return templateStringListFields[fieldName]
45                        case TemplateFieldType.INTEGER:
46                                return templateIntegerFields[fieldName]
47                        case TemplateFieldType.DATE:
48                                return templateDateFields[fieldName]
49                        case TemplateFieldType.FLOAT:
50                                return templateFloatFields[fieldName]
51                        case TemplateFieldType.DOUBLE:
52                                return templateDoubleFields[fieldName]
53                        case TemplateFieldType.ONTOLOGYTERM:
54                                return templateTermFields[fieldName]
55                        default:
56                                throw new NoSuchFieldException("Field type ${fieldType} not recognized")
57                }
58        }
59
60        def setFieldValue(String fieldName, value) {
61                if (this.properties.containsKey(fieldName)) {
62                        this[fieldName] = value
63                }
64                else
65                if (template == null) {
66                        throw new NoSuchFieldException("Field ${fieldName} not found in class properties")
67                }
68                else {
69                        if (templateStringFields.containsKey(fieldName) && value.class == String) {
70                                this.templateStringFields[fieldName] = value
71                        }
72                        if (templateStringListFields.containsKey(fieldName) && value.class == TemplateFieldListItem) {
73                                this.templateStringFields[fieldName] = value
74                        }
75                        else if (templateIntegerFields.containsKey(fieldName) && value.class == Integer) {
76                                this.templateIntegerFields[fieldName] = value
77                        }
78                        else if (templateFloatFields.containsKey(fieldName) && value.class == Float) {
79                                this.templateFloatFields[fieldName] = value
80                        }
81                        else if (templateDoubleFields.containsKey(fieldName) && value.class == Double) {
82                                this.templateDoubleFields[fieldName] = value
83                        }
84                        else if (templateDateFields.containsKey(fieldName) && value.class == Date) {
85                                this.templateDateFields[fieldName] = value
86                        }
87                        else if (templateTermFields.containsKey(fieldName) && value.class == Term) {
88                                this.templateTermFields[fieldName] = value
89                        }
90                        else {
91                                throw new NoSuchFieldException("Field ${fieldName} not found in class properties or template fields")
92                        }
93                }
94        }
95
96        def Set<TemplateField> giveFields() {
97                return this.template.fields;
98        }
99
100        @Override
101        void setTemplate(Template newTemplate) {
102
103                // Contrary to expectation, this method does not cause an infinite loop but calls the super method
104                // whereas super.setTemplate(newTemplate) leads to errors concerning NullObject values
105                this.template = newTemplate
106
107                // TODO: initialize all template fields with the necessary keys and null values
108
109                println "Setting template " + newTemplate
110                /*if (template == null || template instanceof NullObject) {} else{ // negation doesn't seem to work well
111                        def stringFields = template.getFieldsByType(TemplateFieldType.STRINGLIST)
112                        println stringFields*.name
113                        if (stringFields.size() > 0) {
114                                templateStringFields = new HashMap<String,String>()
115                                templateStringFields.keyset.add stringFields*.name;
116                                println templateStringFields
117                        }
118                }*/
119        }
120
121}
Note: See TracBrowser for help on using the repository browser.