Project

General

Profile

Download (5.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9
package eu.etaxonomy.cdm.io.excel.stream;
10

    
11
import java.util.HashMap;
12
import java.util.Map;
13
import java.util.Set;
14

    
15
import org.apache.commons.lang.StringUtils;
16
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
17
import org.apache.poi.ss.usermodel.Cell;
18
import org.apache.poi.ss.usermodel.Row;
19
import org.apache.poi.ss.usermodel.Sheet;
20

    
21
import eu.etaxonomy.cdm.common.ExcelUtils;
22
import eu.etaxonomy.cdm.io.common.events.IIoObserver;
23
import eu.etaxonomy.cdm.io.stream.IItemStream;
24
import eu.etaxonomy.cdm.io.stream.StreamItem;
25
import eu.etaxonomy.cdm.io.stream.terms.TermUri;
26

    
27
/**
28
 * @author a.oppermann
29
 * @since 16.05.2013
30
 *
31
 */
32
public class ExcelRecordStream  implements IItemStream{
33
	private static Logger logger = LogManager.getLogger(ExcelRecordStream.class);
34

    
35
	private ExcelStreamImportState state;
36

    
37
	private Sheet sheet;
38
//	private ArchiveEntryBase archiveEntry;
39
	private TermUri term;
40
	private int line = 0;
41

    
42
	private Map<Integer,String> mapping;
43

    
44
	private StreamItem next;
45

    
46

    
47

    
48

    
49
	/**
50
	 * Constructor.
51
	 * @param term
52
	 */
53
	public ExcelRecordStream(ExcelStreamImportState state, Sheet sheet, TermUri term) {
54
		this.state = state;
55
		this.sheet = sheet;
56
		this.term = term;
57
	}
58

    
59
	@Override
60
	public StreamItem read() {
61
		//FIXME:
62
		return readMe();
63
	}
64

    
65
	@Override
66
	public boolean hasNext() {
67
		if (next != null){
68
			return true;
69
		}else{
70
			next = readMe();
71
			return (next != null);
72
		}
73
	}
74

    
75
	private StreamItem readMe() {
76
		StreamItem resultItem;
77
		if (next != null){
78
			resultItem = next;
79
			next = null;
80
			return resultItem;
81
		}else{
82

    
83
			if (mapping == null){
84
				mapping = getHeaderMapping(sheet.getRow(line++));
85
			}
86
	//		int rows = sheet.getPhysicalNumberOfRows();
87
			Row row = sheet.getRow(line++);
88
			int i = 0;
89
			while (row == null && i++ < 10){
90
				row = sheet.getRow(line++);
91
				continue;
92
			}
93
			if (row == null){
94
				return null;
95
			}else{
96
				int cells = row.getPhysicalNumberOfCells();
97
				logger.info("\nROW " + row.getRowNum() + " has " + cells + " cell(s).");
98
				Map<String, String> map = new HashMap<String, String>();
99

    
100
				for (int c :mapping.keySet()){
101
					Cell cell = row.getCell(c);
102
					String value = ExcelUtils.getCellValue(cell);
103
					map.put(mapping.get(c), value);
104
					logger.info("CELL col=" + cell.getColumnIndex() + " VALUE=" + value);
105
				}
106

    
107
				resultItem = new StreamItem(term, map, String.valueOf(line));
108

    
109
				return resultItem;
110
			}
111
		}
112
	}
113

    
114
	private Map<Integer,String> getHeaderMapping(Row row) {
115
		Map<Integer,String> result = new HashMap<Integer, String>();
116

    
117
		int cells = row.getPhysicalNumberOfCells();
118
		logger.info("\nROW " + row.getRowNum() + " has " + cells + " cell(s).");
119
		for (int c = 0; c < cells; c++) {
120
			Cell cell = row.getCell(c);
121
			String value = ExcelUtils.getCellValue(cell);
122
			String termUri = convert2semanticKey(value);
123
			if (termUri != null){
124
				result.put(c, termUri);
125
			}else{
126
				//TODO fire Event
127
				String message = "No mapping defined for column %d '%s'";
128
				logger.warn(String.format(message, c + 1, value));
129
			}
130
		}
131

    
132
		return result;
133
	}
134

    
135
	/**
136
	 * @param value
137
	 * @return
138
	 */
139
	private String convert2semanticKey(String key) {
140
		if (key.equalsIgnoreCase("id")){
141
			return "id";
142
		}else if (key.equalsIgnoreCase("ParentId")){
143
			return TermUri.DWC_PARENT_NAME_USAGE_ID.getUriString();
144
		}else if (key.equalsIgnoreCase("NameStatus")){
145
			return TermUri.DWC_TAXONOMIC_STATUS.getUriString();
146
		}else if (key.equalsIgnoreCase("Rank")){
147
			return TermUri.DWC_TAXON_RANK.getUriString();
148
		}else if (key.equalsIgnoreCase("ScientificName")){
149
			return TermUri.DWC_SCIENTIFIC_NAME.getUriString();
150
		}else if (key.equalsIgnoreCase("Author")){
151
			return TermUri.DWC_SCIENTIFIC_NAME_AUTHORS.getUriString();
152
			//TODO Taxon Remarks
153
		}else if (key.equalsIgnoreCase("Comments")){
154
			return TermUri.DWC_TAXON_REMARKS.getUriString();
155
		}else if (key.equalsIgnoreCase("Language")){
156
			return TermUri.DC_LANGUAGE.getUriString();
157
		}else if (key.equalsIgnoreCase("TDWG_1")){
158
			return TermUri.DWC_COUNTRY_CODE.getUriString();
159
		}else if (key.equalsIgnoreCase("VernacularName")){
160
			return TermUri.DWC_VERNACULAR_NAME.getUriString();
161
		}else if (key.equalsIgnoreCase("ExternalId_sysCode")){
162
			return TermUri.CDM_SOURCE_IDINSOURCE.getUriString();
163
		}else if (key.equalsIgnoreCase("External_source")){
164
			return TermUri.CDM_SOURCE_REFERENCE.getUriString();
165
		}else if (key.equalsIgnoreCase("IdNamespace")){
166
			return TermUri.CDM_SOURCE_IDNAMESPACE.getUriString();
167
		}else{
168
			//TODO fire Event
169
			String message = "Key '%s' does not (yet) exist for import";
170
			logger.warn(String.format(message, key));
171
			return null;
172
		}
173

    
174
	//Language	TDWG_1	TDWG_2	VernacularName	SysCode
175

    
176
	}
177

    
178
	@Override
179
	public TermUri getTerm() {
180
		return this.term;
181
	}
182

    
183
	@Override
184
	public String getItemLocation() {
185
		// TODO Auto-generated method stub
186
		return null;
187
	}
188

    
189
	@Override
190
	public String getStreamLocation() {
191
		// TODO Auto-generated method stub
192
		return null;
193
	}
194

    
195
	@Override
196
	public void addObservers(Set<IIoObserver> observers) {
197
		// TODO Auto-generated method stub
198
		logger.warn("addObservers Not yet implemented");
199
	}
200

    
201
//******************** toString *******************************************
202

    
203
	@Override
204
	public String toString() {
205
		if (sheet != null && StringUtils.isNotBlank(sheet.getSheetName())){
206
			return sheet.getSheetName();
207
		}else{
208
			return super.toString();
209
		}
210
	}
211
}
(1-1/3)