Project

General

Profile

Download (11.5 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 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

    
10
package eu.etaxonomy.cdm.io.erms;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Map;
17
import java.util.Set;
18
import java.util.UUID;
19

    
20
import org.apache.log4j.Logger;
21
import org.springframework.stereotype.Component;
22

    
23
import eu.etaxonomy.cdm.common.CdmUtils;
24
import eu.etaxonomy.cdm.io.common.IOValidator;
25
import eu.etaxonomy.cdm.io.common.mapping.DbIgnoreMapper;
26
import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;
27
import eu.etaxonomy.cdm.io.common.mapping.DbImportMapping;
28
import eu.etaxonomy.cdm.io.common.mapping.DbImportObjectCreationMapper;
29
import eu.etaxonomy.cdm.io.common.mapping.DbImportStringMapper;
30
import eu.etaxonomy.cdm.io.common.mapping.DbNotYetImplementedMapper;
31
import eu.etaxonomy.cdm.io.common.mapping.IMappingImport;
32
import eu.etaxonomy.cdm.io.erms.validation.ErmsTaxonImportValidator;
33
import eu.etaxonomy.cdm.model.common.CdmBase;
34
import eu.etaxonomy.cdm.model.common.ExtensionType;
35
import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
36
import eu.etaxonomy.cdm.model.name.NonViralName;
37
import eu.etaxonomy.cdm.model.name.Rank;
38
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
39
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
40
import eu.etaxonomy.cdm.model.taxon.Synonym;
41
import eu.etaxonomy.cdm.model.taxon.Taxon;
42
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
43

    
44

    
45
/**
46
 * @author a.mueller
47
 * @created 20.02.2010
48
 * @version 1.0
49
 */
50
@Component
51
public class ErmsTaxonImport  extends ErmsImportBase<TaxonBase> implements IMappingImport<TaxonBase, ErmsImportState>{
52
	private static final Logger logger = Logger.getLogger(ErmsTaxonImport.class);
53
	
54
	public static final UUID TNS_EXT_UUID = UUID.fromString("41cb0450-ac84-4d73-905e-9c7773c23b05");
55
	
56
	private DbImportMapping mapping;
57
	
58
	//TODO store in state or somehow else
59
	private boolean isSecondPath = false;
60
	
61
	private int modCount = 10000;
62
	private static final String pluralString = "taxa";
63
	private static final String dbTableName = "tu";
64
	private static final Class cdmTargetClass = TaxonBase.class;
65

    
66
	public ErmsTaxonImport(){
67
		super(pluralString, dbTableName, cdmTargetClass);
68
	}
69
	
70
	
71

    
72
//	/* (non-Javadoc)
73
//	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getIdQuery()
74
//	 */
75
//	@Override
76
//	protected String getIdQuery() {
77
//		String strQuery = " SELECT id FROM tu WHERE id < 300000 " ;
78
//		return strQuery;
79
//	}
80

    
81

    
82
	/* (non-Javadoc)
83
	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#getMapping()
84
	 */
85
	protected DbImportMapping getMapping() {
86
		if (mapping == null){
87
			mapping = new DbImportMapping();
88
			
89
			//TODO create original source
90
			mapping.addMapper(DbImportObjectCreationMapper.NewInstance(this, "id", TAXON_NAMESPACE)); //id + tu_status
91
			//FIXME extension type
92
			mapping.addMapper(DbImportExtensionMapper.NewInstance("tsn", ExtensionType.ABBREVIATION()));
93
			mapping.addMapper(DbImportStringMapper.NewInstance("tu_name", "(NonViralName)name.nameCache"));
94
			//FIXME extension type
95
			mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_displayname", ExtensionType.ABBREVIATION()));
96
			mapping.addMapper(DbImportExtensionMapper.NewInstance("tu_fuzzyname", ExtensionType.ABBREVIATION()));
97
			mapping.addMapper(DbImportStringMapper.NewInstance("tu_authority", "(NonViralName)name.authorshipCache"));
98
			
99
			//ignore
100
			mapping.addMapper(DbIgnoreMapper.NewInstance("tu_marine"));
101
			mapping.addMapper(DbIgnoreMapper.NewInstance("tu_brackish"));
102
			mapping.addMapper(DbIgnoreMapper.NewInstance("tu_fresh"));
103
			mapping.addMapper(DbIgnoreMapper.NewInstance("tu_terrestrial"));
104
			
105
			//not yet implemented or ignore
106
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_unacceptreason"));
107
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_credibility")); //Werte: null, unknown, marked for deletion
108
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_completeness")); //null, unknown, tmpflag, tmp2, tmp3, complete
109
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_qualitystatus")); //checked by Tax Editor ERMS1.1, Added by db management team (2x), checked by Tax Editor
110
			
111
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_fossil"));
112
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_hidden"));
113
			mapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_sp"));  //included in object creation
114
			mapping.addMapper(DbIgnoreMapper.NewInstance("cache_citation"));
115
			
116
//			//second path
117
//			DbImportMapping secondPathMapping = new DbImportMapping();
118
//			secondPathMapping.addMapper(DbImportTaxIncludedInMapper.NewInstance("id", "tu_parent", TAXON_NAMESPACE, null)); //there is only one tree
119
//			secondPathMapping.addMapper(DbImportSynonymMapper.NewInstance("id", "tu_acctaxon", TAXON_NAMESPACE, null)); 			
120
//			secondPathMapping.addMapper(DbImportNameTypeDesignationMapper.NewInstance("id", "tu_typetaxon", NAME_NAMESPACE, "tu_typedesignationstatus"));
121
//			secondPathMapping.addMapper(DbNotYetImplementedMapper.NewInstance("tu_acctaxon"));
122
//			mapping.setSecondPathMapping(secondPathMapping);
123
			
124
		}
125
		return mapping;
126
	}
127

    
128
	/* (non-Javadoc)
129
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
130
	 */
131
	@Override
132
	protected String getRecordQuery(ErmsImportConfigurator config) {
133
		String strRecordQuery = 
134
			" SELECT * " + 
135
			" FROM tu INNER JOIN status ON tu.tu_status = status.status_id " +
136
			" WHERE ( tu.id IN (" + ID_LIST_TOKEN + ") )";
137
		return strRecordQuery;
138
	}
139
	
140

    
141
//	/**
142
//	 * @param config
143
//	 * @return
144
//	 */
145
//	private String getSecondPathRecordQuery(ErmsImportConfigurator config) {
146
//		//TODO get automatic by second path mappers
147
//		String selectAttributes = "id, tu_parent, tu_typetaxon, tu_typetaxon, tu_typedesignation, tu_acctaxon, tu_status"; 
148
//		String strRecordQuery = 
149
//			" SELECT  " + selectAttributes + 
150
//			" FROM tu " +
151
//			" WHERE ( tu.id IN (" + ID_LIST_TOKEN + ") )";
152
//		return strRecordQuery;
153
//	}
154

    
155

    
156
//	private String getSecondPathIdQuery(){
157
//		return getIdQuery();
158
//	}
159
	
160
	/* (non-Javadoc)
161
	 * @see eu.etaxonomy.cdm.io.erms.ErmsImportBase#doInvoke(eu.etaxonomy.cdm.io.erms.ErmsImportState)
162
	 */
163
	@Override
164
	protected boolean doInvoke(ErmsImportState state) {
165
		//first path
166
		boolean success = super.doInvoke(state);
167
		
168
//		//second path
169
//		isSecondPath = true;
170
//		ErmsImportConfigurator config = state.getConfig();
171
//		Source source = config.getSource();
172
//			
173
//		String strIdQuery = getSecondPathIdQuery();
174
//		String strRecordQuery = getSecondPathRecordQuery(config);
175
//
176
//		int recordsPerTransaction = config.getRecordsPerTransaction();
177
//		try{
178
//			ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery, strRecordQuery, recordsPerTransaction);
179
//			while (partitioner.nextPartition()){
180
//				partitioner.doPartition(this, state);
181
//			}
182
//		} catch (SQLException e) {
183
//			logger.error("SQLException:" +  e);
184
//			return false;
185
//		}
186
//		
187
//		isSecondPath = false;
188
//
189
//		logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));
190
		return success;
191

    
192
	}
193

    
194

    
195

    
196
	/* (non-Javadoc)
197
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
198
	 */
199
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
200
		String nameSpace;
201
		Class cdmClass;
202
		Set<String> idSet;
203
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
204
		
205
		try{
206
				Set<String> nameIdSet = new HashSet<String>();
207
				Set<String> referenceIdSet = new HashSet<String>();
208
				while (rs.next()){
209
	//				handleForeignKey(rs, nameIdSet, "PTNameFk");
210
	//				handleForeignKey(rs, referenceIdSet, "PTRefFk");
211
				}
212

    
213
			//reference map
214
//			nameSpace = "Reference";
215
//			cdmClass = ReferenceBase.class;
216
//			Map<String, Person> referenceMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(Person.class, teamIdSet, nameSpace);
217
//			result.put(ReferenceBase.class, referenceMap);
218

    
219
		} catch (SQLException e) {
220
			throw new RuntimeException(e);
221
		}
222
		return result;
223
	}
224
	
225

    
226
	/* (non-Javadoc)
227
	 * @see eu.etaxonomy.cdm.io.common.mapping.IMappingImport#createObject(java.sql.ResultSet)
228
	 */
229
	public TaxonBase createObject(ResultSet rs, ErmsImportState state) throws SQLException {
230
		int statusId = rs.getInt("status_id");
231
		String tuName = rs.getString("tu_name");
232
		TaxonNameBase taxonName = getTaxonName(rs, state);
233
		//add original source
234
		ReferenceBase citation = state.getConfig().getSourceReference();
235
		addOriginalSource(rs, taxonName, "id", NAME_NAMESPACE, citation);
236
		
237
//		taxonName.setNameCache("Test");
238
		
239
		ErmsImportConfigurator config = state.getConfig();
240
		ReferenceBase sec = config.getSourceReference();
241
		if (statusId == 1){
242
			return Taxon.NewInstance(taxonName, sec);
243
		}else{
244
			return Synonym.NewInstance(taxonName, sec);
245
		}
246
	}
247

    
248
	/**
249
	 * @param rs
250
	 * @return
251
	 * @throws SQLException 
252
	 */
253
	private TaxonNameBase getTaxonName(ResultSet rs, ErmsImportState state) throws SQLException {
254
		TaxonNameBase result;
255
		Integer kingdomId = parseKingdomId(rs);
256
		Integer intRank = rs.getInt("tu_rank");
257
		
258
		NomenclaturalCode nc = ErmsTransformer.kingdomId2NomCode(kingdomId);
259
		Rank rank = null;
260
		if (kingdomId != null){
261
			rank = state.getRank(intRank, kingdomId);
262
		}
263
		if (nc != null){
264
			result = nc.getNewTaxonNameInstance(rank);
265
		}else{
266
			result = NonViralName.NewInstance(rank);
267
		}
268
		
269
		return result;
270
	}
271

    
272
	/**
273
	 * Returns the kingdom id by extracting it from the second character in the <code>tu_sp</code> 
274
	 * attribute. If the attribute can not be parsed to a valid id <code>null</code>
275
	 * is returned. If the attribute is <code>null</code> the id of the record is returned.
276
	 * @param rs
277
	 * @return
278
	 * @throws SQLException
279
	 */
280
	private int parseKingdomId(ResultSet rs) throws SQLException {
281
		Integer result = null;
282
		String treeString = rs.getString("tu_sp");
283
		if (treeString != null){
284
			if (CdmUtils.isNotEmpty(treeString) && treeString.length() > 1){
285
				String strKingdom = treeString.substring(1,2);
286
				
287
				if (! treeString.substring(0, 1).equals("#") && ! treeString.substring(2, 3).equals("#") ){
288
					logger.warn("Tree string " + treeString + " has no recognized format");
289
				}else{
290
					try {
291
						result = Integer.valueOf(strKingdom);
292
					} catch (NumberFormatException e) {
293
						logger.warn("Kingdom string " + strKingdom + "could not be recognized as a valid number");
294
					}
295
				}
296
			}
297
		}else{
298
			Integer tu_id = rs.getInt("id");
299
			result = tu_id;
300
		}
301
		return result;
302
	}
303

    
304
	
305
	/* (non-Javadoc)
306
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
307
	 */
308
	@Override
309
	protected boolean doCheck(ErmsImportState state){
310
		IOValidator<ErmsImportState> validator = new ErmsTaxonImportValidator();
311
		return validator.validate(state);
312
	}
313
	
314
	
315
	/* (non-Javadoc)
316
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
317
	 */
318
	protected boolean isIgnore(ErmsImportState state){
319
		return ! state.getConfig().isDoTaxa();
320
	}
321

    
322

    
323

    
324
}
(13-13/18)