source: trunk/grails-app/services/dbnp/importer/ImporterService.groovy @ 283

Last change on this file since 283 was 283, checked in by tabma, 9 years ago
  • final step in the wizard, implemented method in the ImporterService? to persist the entities into the database
  • Property svn:keywords set to Author Rev Date
File size: 8.3 KB
Line 
1/**
2 * Importer service
3 *
4 * The importer service handles the import of tabular, comma delimited and Excel format
5 * based files.
6 *
7 * @package     importer
8 * @author      t.w.abma@umcutrecht.nl
9 * @since       20100126
10 *
11 * Revision information:
12 * $Rev: 283 $
13 * $Author: tabma $
14 * $Date: 2010-03-18 09:17:02 +0000 (do, 18 mrt 2010) $
15 */
16
17package dbnp.importer
18import org.apache.poi.hssf.usermodel.*
19import org.apache.poi.poifs.filesystem.POIFSFileSystem
20import org.apache.poi.ss.usermodel.DataFormatter
21import org.apache.poi.hssf.usermodel.HSSFDateUtil
22import dbnp.studycapturing.TemplateFieldType
23import dbnp.studycapturing.Template
24import dbnp.studycapturing.Study
25import dbnp.studycapturing.Subject
26import dbnp.studycapturing.Event
27import dbnp.studycapturing.Protocol
28import dbnp.studycapturing.Sample
29
30
31class ImporterService {
32
33    boolean transactional = true
34
35    /**
36    * @param is input stream representing the (workbook) resource
37    * @return high level representation of the workbook
38    */
39    HSSFWorkbook getWorkbook(InputStream is) {
40        POIFSFileSystem fs = new POIFSFileSystem(is)
41        HSSFWorkbook    wb = new HSSFWorkbook(fs);
42        return wb;
43    }
44
45    /**
46     * @param wb high level representation of the workbook
47     * @return header representation as a MappingColumn hashmap
48     */
49    def getHeader(HSSFWorkbook wb, int sheetindex){
50
51        def sheet = wb.getSheetAt(sheetindex)
52        def datamatrix_start = sheet.getFirstRowNum() + 1
53        //def header = []
54        def header = [:]
55        def df = new DataFormatter()
56
57
58        for (HSSFCell c: sheet.getRow(datamatrix_start)) {
59            def datamatrix_celltype = sheet.getRow(datamatrix_start).getCell(c.getColumnIndex()).getCellType()
60            def headercell = sheet.getRow(sheet.getFirstRowNum()).getCell(c.getColumnIndex())
61
62            // Check for every celltype, currently redundant code, but possibly this will be
63            // a piece of custom code for every cell type like specific formatting
64               
65            switch (datamatrix_celltype) {
66                    case HSSFCell.CELL_TYPE_STRING:
67                            header[c.getColumnIndex()] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), templatefieldtype:TemplateFieldType.STRING);
68                            break
69                    case HSSFCell.CELL_TYPE_NUMERIC:                   
70                            if (HSSFDateUtil.isCellDateFormatted(c)) {
71                                header[c.getColumnIndex()] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), templatefieldtype:TemplateFieldType.DATE)
72                            }
73                            else
74                                header[c.getColumnIndex()] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), templatefieldtype:TemplateFieldType.INTEGER);
75                            break
76                    case HSSFCell.CELL_TYPE_BLANK:
77                            header[c.getColumnIndex()] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), templatefieldtype:TemplateFieldType.STRING);
78                            break
79                    default:
80                            header[c.getColumnIndex()] = new dbnp.importer.MappingColumn(name:df.formatCellValue(headercell), templatefieldtype:TemplateFieldType.STRING);
81                            break
82            }
83        }
84        return header
85    }
86
87    /**
88     * This method is meant to return a matrix of the rows and columns
89     * used in the preview
90     *
91     * @param wb workbook object
92     * @param sheetindex sheet index used
93     * @param rows amount of rows returned
94     * @return two dimensional array (matrix) of HSSFCell objects
95     */
96
97    HSSFCell[][] getDatamatrix(HSSFWorkbook wb, int sheetindex, int count) {
98        def sheet = wb.getSheetAt(sheetindex)
99        def rows  = []
100        def df = new DataFormatter()
101        def datamatrix_start = 1
102
103        // walk through all rows
104        (count <= sheet.getLastRowNum()) ?
105        ((datamatrix_start+sheet.getFirstRowNum())..count).each { rowindex ->
106            def row = []
107
108            // walk through every cell
109            for (HSSFCell c: sheet.getRow(rowindex))
110                row.add(c)
111                //row.add(df.formatCellValue(c))
112            rows.add(row)
113        } : 0
114
115        return rows
116    }
117
118    /**
119    * This method will move a file to a new location.
120    *
121    * @param file File object to move
122    * @param folderpath folder to move the file to
123    * @param filename (new) filename to give
124    * @return if file has been moved succesful, the new path and filename will be returned, otherwise an empty string will be returned
125    */
126    def moveFile(File file, String folderpath, String filename) {
127        try {
128                def rnd = ""; //System.currentTimeMillis()
129                file.transferTo(new File(folderpath, rnd+filename))
130                return folderpath + filename
131            } catch(Exception exception) {
132                log.error "File move error, ${exception}"
133                return ""
134                }
135    }
136
137    /**
138    * @return random numeric value
139    */
140    def random = {
141            return System.currentTimeMillis() + Runtime.runtime.freeMemory()
142        }
143
144    /**
145    * Method to read data from a workbook and to import data into the database
146    * by using mapping information
147    *
148    * @param template_id template identifier to use fields from
149    * @param wb POI horrible spreadsheet formatted workbook object
150    * @param mcmap linked hashmap (preserved order) of MappingColumns
151    * @param sheetindex sheet to use when using multiple sheets
152    * @param rowindex first row to start with reading the actual data (NOT the header)
153    * @return two dimensional array containing records (with entities)
154    *
155    * @see dbnp.importer.MappingColumn
156    */
157    def importdata(template_id, HSSFWorkbook wb, int sheetindex, int rowindex, mcmap) {
158        def sheet = wb.getSheetAt(sheetindex)
159        def table = []
160       
161        // walk through all rows       
162        (rowindex..sheet.getLastRowNum()).each { i ->
163            table.add(createRecord(template_id, sheet.getRow(i), mcmap))           
164        }
165
166        /*table.each {
167            it.each { entity ->
168                entity.giveFields().each { field ->
169                    print field.name + ":" + entity.getFieldValue(field.name) + "/"
170                }
171                println
172            }
173        }*/
174
175        return table   
176    }
177   
178    /**
179     * @param datamatrix two dimensional array containing entities with values read from Excel file
180     */   
181    def savedata(datamatrix) {
182        datamatrix.each { record ->
183            record.each { entity ->
184                switch (entity.getClass()) {
185                    case Study   :  print "Persisting Study `" + entity.title + "`: "
186                                    entity.save()
187                                    println "OK"
188                                    break
189                    case Subject :  print "Persisting Subject `" + entity.name + "`: "
190                                    entity.save()
191                                    println "OK"
192                                    break
193                    case Event   :  print "Persisting Event `" + entity.eventdescription + "`: "
194                                    entity.save()
195                                    println "OK"
196                                    break
197                    case Protocol:  print "Persisting Protocol `" + entity.name + "`: "
198                                    entity.save()
199                                    println "OK"
200                                    break
201                    case Sample  :  print "Persisting Sample `" + entity.name +"`: "
202                                    entity.save()
203                                    println "OK"
204                                    break
205                    default      :  println "Skipping persistance of `" + entity.getclass() +"`"
206                                    break
207                }
208            }
209        }
210    }
211
212    /**
213     * This method created a record (array) containing entities with values
214     *
215     * @param template_id template identifier
216     * @param excelrow POI based Excel row containing the cells
217     * @param mcmap map containing MappingColumn objects
218     */
219    def createRecord(template_id, HSSFRow excelrow, mcmap) {
220        def df = new DataFormatter()
221        def template = Template.get(template_id)
222        def record = []
223
224        def study = new Study(title:"New study", template:template)
225        def subject = new Subject(name:"New subject", template:template)
226        def event = new Event(eventdescription:"New event", template:template)
227        def protocol = new Protocol(name:"New protocol", template:template)
228        def sample = new Sample(name:"New sample", template:template)
229
230        for (HSSFCell cell: excelrow) {
231            def mc = mcmap[cell.getColumnIndex()]           
232
233            switch(mc.entity) {
234                case Study      :   (record.any {it.getClass()==mc.entity}) ? 0 : record.add(study)
235                                    study.setFieldValue(mc.property.name, df.formatCellValue(cell))
236                                    break
237                case Subject    :   (record.any {it.getClass()==mc.entity}) ? 0 : record.add(subject)
238                                    subject.setFieldValue(mc.property.name, df.formatCellValue(cell))
239                                    break
240                case Event      :   (record.any {it.getClass()==mc.entity}) ? 0 : record.add(event)
241                                    event.setFieldValue(mc.property.name, df.formatCellValue(cell))
242                                    break
243                case Protocol   :   (record.any {it.getClass()==mc.entity}) ? 0 : record.add(protocol)
244                                    protocol.setFieldValue(mc.property.name, df.formatCellValue(cell))
245                                    break
246                case Sample     :   (record.any {it.getClass()==mc.entity}) ? record.add(sample) : 0
247                                    sample.setFieldValue(mc.property.name, df.formatCellValue(cell))
248                                    break
249                case Object     :   // don't import
250                                    break
251            } // end switch
252        } // end for
253
254        return record
255    }
256}
Note: See TracBrowser for help on using the repository browser.