source: trunk/grails-app/taglib/dbnp/importer/ImporterTagLib.groovy @ 1511

Last change on this file since 1511 was 1511, checked in by t.w.abma@…, 10 years ago
  • added initial property manager (load/save import mappings) just in case
  • Property svn:keywords set to Rev Author Date
File size: 7.2 KB
Line 
1/**
2 * Importer tag library
3 *
4 * The importer tag library gives support for automating several 'components'
5 *
6 * @package importer
7 * @author t.w.abma@umcutrecht.nl
8 * @since 20100202
9 *
10 * Revision information:
11 * $Rev: 1511 $
12 * $Author: t.w.abma@umcutrecht.nl $
13 * $Date: 2011-02-09 19:55:29 +0000 (wo, 09 feb 2011) $
14 */
15
16package dbnp.importer
17import org.dbnp.gdt.*
18import org.dbnp.gdt.*
19
20import org.dbnp.gdt.*
21
22import org.apache.poi.ss.usermodel.Cell
23import org.apache.poi.ss.usermodel.DataFormatter
24
25class ImporterTagLib {
26        static namespace = 'importer'
27        def ImporterService
28        def GdtService
29
30        /**
31         * @param header string array containing header
32         * @param datamatrix two dimensional array containing actual data
33         * @return preview of the data with the ability to adjust the datatypes
34         */
35        def preview = { attrs ->
36
37                def header = attrs['header']
38                def datamatrix = attrs['datamatrix']
39
40                out << render(template: "common/preview", model: [header: header, datamatrix: datamatrix])
41        }
42
43        /**
44         * @param datamatrix two dimensional array containing entities with read values
45         * @return postview of the imported data
46         */
47        def postview = { attrs ->
48                def datamatrix = attrs['datamatrix']
49
50                out << render(template: "common/postview", model: [datamatrix: datamatrix])
51        }
52
53        def entity = { attrs ->
54                out << entities[attrs['index']].name
55        }
56
57        def datapreview = { attrs ->
58                def datamatrix = attrs['datamatrix']
59                out << render(template: "common/datapreview", model: [datamatrix: datamatrix])
60        }
61
62        /**
63         * Show missing properties
64         */
65        def missingProperties = { attrs ->
66                def datamatrix = attrs['datamatrix']
67                def failedcells = attrs['failedcells']
68                out << render(template: "common/missingproperties", model: [datamatrix: datamatrix, failedcells: failedcells])
69        }
70
71        /**
72         * Show failed cells
73         */
74        def failedCells = { attrs ->
75                def failedcells = attrs['failedcells']
76                out << render(template: "common/failedcells", model: [failedcells: failedcells])
77        }
78
79        /**
80         * @param entities array containing selected entities
81         * @param header array containing mappingcolumn objects
82         * @param allfieldtypes if set, show all fields
83         */
84        def properties = { attrs ->
85                def header = attrs['header']
86                def entities = attrs['entities']
87
88                out << render(template: "common/properties_horizontal")
89        }
90
91        /**
92         * Possibly this will later on return an AJAX-like autocompletion chooser for the fields?
93         *
94         * @param name name for the property chooser element
95         * @param importtemplate_id template identifier where fields are retrieved from
96         * @param matchvalue value which will be looked up via fuzzy matching against the list of options and will be selected
97         * @param MappingColumn object containing all required information
98     * @param fuzzymatching boolean true if fuzzy matching should be used, otherwise false
99         * @param allfieldtypes boolean true if all templatefields should be listed, otherwise only show filtered templatefields
100         * @return chooser object
101         * */
102        def propertyChooser = { attrs ->
103                // TODO: this should be changed to retrieving fields per entity instead of from one template
104                //       and session variables should not be used inside the service, migrate to controller
105
106                def t = Template.get(attrs['template_id'])
107                def mc = attrs['mappingcolumn']
108                def allfieldtypes = attrs['allfieldtypes']             
109        def matchvalue = (attrs['fuzzymatching']=="true") ? attrs['matchvalue'] : ""
110
111        def domainfields = mc.entity.giveDomainFields().findAll { it.type == mc.templatefieldtype }
112                domainfields = domainfields.findAll { it.preferredIdentifier != mc.identifier}
113
114                //def templatefields = (allfieldtypes=="true") ? t.fields : t.fields.findAll { it.type == mc.templatefieldtype }
115                /*def templatefields = (allfieldtypes == "true") ?
116                        t.fields + mc.entity.giveDomainFields() :
117                        t.fields.findAll { it.type == mc.templatefieldtype } + domainfields*/
118        def templatefields = t.fields + mc.entity.giveDomainFields()
119
120                // map identifier to preferred column
121                def prefcolumn = mc.entity.giveDomainFields().findAll { it.preferredIdentifier == true }
122
123                /*(mc.identifier) ? out << createPropertySelect(attrs['name'], prefcolumn, matchvalue, mc.index) :
124                        out << createPropertySelect(attrs['name'], templatefields, matchvalue, mc.index)*/
125         out << createPropertySelect(attrs['name'], templatefields, matchvalue, mc.index)
126        }
127
128        /**
129         * Create the property chooser select element
130         *
131         * @param name name of the HTML select object
132         * @param options list of options (fields) to be used
133         * @param matchvalue value which will be looked up via fuzzy matching against the list of options and will be selected
134         * @param columnIndex column identifier (corresponding to position in header of the Excel sheet)
135         * @return HTML select object
136         */
137        def createPropertySelect(String name, options, matchvalue, Integer columnIndex) {
138                // Determine which field in the options list matches the best with the matchvalue
139                def mostsimilar = (matchvalue) ? ImporterService.mostSimilar(matchvalue, options) : ""
140
141                def res = "<select style=\"font-size:10px\" id=\"${name}.index.${columnIndex}\" name=\"${name}.index.${columnIndex}\">"
142
143                res += "<option value=\"dontimport\">Don't import</option>"
144
145                options.each { f ->
146                        res += "<option value=\"${f.name}\""
147
148                        res += (mostsimilar.toString().toLowerCase() == f.name.toLowerCase()) ?
149                                " selected>" :
150                                ">"
151
152                        res += (f.preferredIdentifier) ?
153                                "${f.name} (IDENTIFIER)</option>" :
154                                "${f.name}</option>"
155                }
156
157                res += "</select>"
158                return res
159        }
160
161        /**
162         * @param selected selected TemplateFieldType
163         * @param custval custom value to be combined in the option(s) of the selector
164         * @param name name of the HTML select object
165         * @return HTML select object
166         *
167         * @see org.dbnp.gdt.TemplateFieldType
168         */
169
170        def entitySelect = { attrs ->
171                def sel = (attrs['selected'] == null) ? -1 : attrs['selected']
172                def custval = (attrs['customvalue'] == null) ? "" : attrs['customvalue']
173                def name = (attrs['name'] == null) ? -1 : attrs['name']
174
175                def res = "<select style=\"font-size:10px\" name=\"${name}.index.${custval}\">"
176
177                GdtService.getTemplateEntities().each { e ->
178                        res += "<option value\"${e.name}\""
179                        res += ">${e.name} bla</option>"
180                }
181
182                res += "</select>"
183                out << res
184        }
185
186        /**
187         * Create a templatefieldtype selector
188         *
189         * @param selected selected TemplateFieldType
190         * @param customvalue custom value to be combined in the option(s) of the selector
191         * @param name name of the HTML select object
192         * @return HTML select object
193         *
194         * @see org.dbnp.gdt.TemplateFieldType
195         */
196        def templatefieldtypeSelect = { attrs ->
197                def selected = (attrs['selected'] == null) ? -1 : attrs['selected']
198                def custval = (attrs['customvalue'] == null) ? "" : attrs['customvalue']
199                def name = (attrs['name'] == null) ? "" : attrs['name']
200
201                def res = "<select style=\"font-size:10px\" name=\"${name}.index.${custval}\">"
202
203                TemplateFieldType.list().each { e ->
204                        res += "<option value=\"${e}\""
205                        res += (e == selected) ? " selected" : ""
206                        res += ">${e}</option>"
207                }
208
209                res += "</select>"
210
211                out << res
212        }
213
214        /**
215         * @param cell Cell variable
216         * @return good representation of variable (instead of toString())
217         */
218        def displayCell = { attrs ->
219                def cell = attrs['cell']
220                def df = new DataFormatter()
221
222                switch (cell.getCellType()) {
223                        case Cell.CELL_TYPE_STRING: out << cell.getStringCellValue()
224                                break
225                        case Cell.CELL_TYPE_NUMERIC: out << df.formatCellValue(cell)
226                                break
227                }
228        }
229}
Note: See TracBrowser for help on using the repository browser.