Project

General

Profile

Download (6.07 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.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.dwca.TermUri;
24
import eu.etaxonomy.cdm.io.stream.IItemStream;
25
import eu.etaxonomy.cdm.io.stream.StreamItem;
26

    
27
/**
28
 * @author a.oppermann
29
 * @date 16.05.2013
30
 *
31
 */
32
public class ExcelRecordStream  implements IItemStream{
33
	private static Logger logger = Logger.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
	/* (non-Javadoc)
60
	 * @see eu.etaxonomy.cdm.io.dwca.in.IReader#read()
61
	 */
62
	@Override
63
	public StreamItem read() {
64
		//FIXME:
65
		return readMe();
66
	}
67

    
68
	/* (non-Javadoc)
69
	 * @see eu.etaxonomy.cdm.io.dwca.in.IReader#hasNext()
70
	 */
71
	@Override
72
	public boolean hasNext() {
73
		if (next != null){
74
			return true;
75
		}else{
76
			next = readMe();
77
			return (next != null);
78
		}
79
	}
80

    
81

    
82
	private StreamItem readMe() {
83
		StreamItem resultItem;
84
		if (next != null){
85
			resultItem = next;
86
			next = null;
87
			return resultItem;
88
		}else{
89
		
90
			if (mapping == null){
91
				mapping = getHeaderMapping(sheet.getRow(line++));
92
			}
93
	//		int rows = sheet.getPhysicalNumberOfRows();
94
			Row row = sheet.getRow(line++);
95
			int i = 0;
96
			while (row == null && i++ < 10){
97
				row = sheet.getRow(line++);
98
				continue;
99
			}
100
			if (row == null){
101
				return null;
102
			}else{
103
				int cells = row.getPhysicalNumberOfCells();
104
				logger.info("\nROW " + row.getRowNum() + " has " + cells + " cell(s).");
105
				Map<String, String> map = new HashMap<String, String>();
106
				
107
				for (int c :mapping.keySet()){
108
					Cell cell = row.getCell(c);
109
					String value = ExcelUtils.getCellValue(cell);
110
					map.put(mapping.get(c), value);
111
					logger.info("CELL col=" + cell.getColumnIndex() + " VALUE=" + value);
112
				}
113
				
114
				resultItem = new StreamItem(term, map, String.valueOf(line));
115
				
116
				return resultItem;
117
			}
118
		}
119
	}
120
	
121
	/**
122
	 * @param row
123
	 * @return
124
	 */
125
	private Map<Integer,String> getHeaderMapping(Row row) {
126
		Map<Integer,String> result = new HashMap<Integer, String>();
127
		
128
		int cells = row.getPhysicalNumberOfCells();
129
		logger.info("\nROW " + row.getRowNum() + " has " + cells + " cell(s).");
130
		for (int c = 0; c < cells; c++) {
131
			Cell cell = row.getCell(c);
132
			String value = ExcelUtils.getCellValue(cell);
133
			String termUri = convert2semanticKey(value);
134
			if (termUri != null){
135
				result.put(c, termUri);
136
			}else{
137
				//TODO fire Event
138
				String message = "No mapping defined for column %d '%s'";
139
				logger.warn(String.format(message, c + 1, value));
140
			}
141
		}
142
		
143
		return result;
144
	}
145

    
146
	/**
147
	 * @param value
148
	 * @return
149
	 */
150
	private String convert2semanticKey(String key) {
151
		if (key.equalsIgnoreCase("id")){
152
			return "id";
153
		}else if (key.equalsIgnoreCase("ParentId")){
154
			return TermUri.DWC_PARENT_NAME_USAGE_ID.getUriString();
155
		}else if (key.equalsIgnoreCase("NameStatus")){
156
			return TermUri.DWC_TAXONOMIC_STATUS.getUriString();
157
		}else if (key.equalsIgnoreCase("Rank")){
158
			return TermUri.DWC_TAXON_RANK.getUriString();
159
		}else if (key.equalsIgnoreCase("ScientificName")){
160
			return TermUri.DWC_SCIENTIFIC_NAME.getUriString();
161
		}else if (key.equalsIgnoreCase("Author")){
162
			return TermUri.DWC_SCIENTIFIC_NAME_AUTHORS.getUriString();
163
			//TODO Taxon Remarks
164
		}else if (key.equalsIgnoreCase("Comments")){
165
			return TermUri.DWC_TAXON_REMARKS.getUriString();
166
		}else if (key.equalsIgnoreCase("Language")){
167
			return TermUri.DC_LANGUAGE.getUriString();
168
		}else if (key.equalsIgnoreCase("TDWG_1")){
169
			return TermUri.DWC_COUNTRY_CODE.getUriString();
170
		}else if (key.equalsIgnoreCase("VernacularName")){
171
			return TermUri.DWC_VERNACULAR_NAME.getUriString();
172
		}else if (key.equalsIgnoreCase("ExternalId_sysCode")){
173
			return TermUri.CDM_SOURCE_IDINSOURCE.getUriString();
174
		}else if (key.equalsIgnoreCase("External_source")){
175
			return TermUri.CDM_SOURCE_REFERENCE.getUriString();
176
		}else if (key.equalsIgnoreCase("IdNamespace")){
177
			return TermUri.CDM_SOURCE_IDNAMESPACE.getUriString();
178
		}else{
179
			//TODO fire Event
180
			String message = "Key '%s' does not (yet) exist for import";
181
			logger.warn(String.format(message, key));
182
			return null;
183
		}
184
		
185
	//Language	TDWG_1	TDWG_2	VernacularName	SysCode
186
	
187
	}
188

    
189
	/* (non-Javadoc)
190
	 * @see eu.etaxonomy.cdm.io.stream.IItemStream#getTerm()
191
	 */
192
	@Override
193
	public TermUri getTerm() {
194
		return this.term;
195
	}
196

    
197
	/* (non-Javadoc)
198
	 * @see eu.etaxonomy.cdm.io.stream.IItemStream#getItemLocation()
199
	 */
200
	@Override
201
	public String getItemLocation() {
202
		// TODO Auto-generated method stub
203
		return null;
204
	}
205

    
206
	/* (non-Javadoc)
207
	 * @see eu.etaxonomy.cdm.io.stream.IItemStream#getStreamLocation()
208
	 */
209
	@Override
210
	public String getStreamLocation() {
211
		// TODO Auto-generated method stub
212
		return null;
213
	}
214

    
215
	/* (non-Javadoc)
216
	 * @see eu.etaxonomy.cdm.io.stream.IItemStream#addObservers(java.util.Set)
217
	 */
218
	@Override
219
	public void addObservers(Set<IIoObserver> observers) {
220
		// TODO Auto-generated method stub
221
		logger.warn("addObservers Not yet implemented");
222
	}
223
	
224
//******************** toString *******************************************
225

    
226
	/* (non-Javadoc)
227
	 * @see java.lang.Object#toString()
228
	 */
229
	@Override
230
	public String toString() {
231
		if (sheet != null && StringUtils.isNotBlank(sheet.getSheetName())){
232
			return sheet.getSheetName();
233
		}else{
234
			return super.toString();
235
		}
236
	}
237
	
238
	
239
	
240

    
241
}
(2-2/6)