Project

General

Profile

Download (12.7 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

    
10
package eu.etaxonomy.cdm.io.tcsxml.in;
11

    
12
import java.util.ArrayList;
13
import java.util.HashSet;
14
import java.util.Iterator;
15
import java.util.List;
16
import java.util.Set;
17

    
18
import org.apache.log4j.Logger;
19
import org.jdom.Content;
20
import org.jdom.Element;
21
import org.jdom.Namespace;
22
import org.springframework.stereotype.Component;
23

    
24
import eu.etaxonomy.cdm.common.DoubleResult;
25
import eu.etaxonomy.cdm.common.ResultWrapper;
26
import eu.etaxonomy.cdm.common.XmlHelp;
27
import eu.etaxonomy.cdm.io.common.ICdmIO;
28
import eu.etaxonomy.cdm.io.common.MapWrapper;
29
import eu.etaxonomy.cdm.io.tcsxml.TcsXmlTransformer;
30
import eu.etaxonomy.cdm.model.name.NameRelationshipType;
31
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
32
import eu.etaxonomy.cdm.model.name.NomenclaturalStatusType;
33
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
34
import eu.etaxonomy.cdm.model.reference.Reference;
35
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
36

    
37
@Component
38
public class TcsXmlTaxonNameRelationsImport extends TcsXmlImportBase implements ICdmIO<TcsXmlImportState> {
39
	private static final Logger logger = Logger.getLogger(TcsXmlTaxonNameRelationsImport.class);
40

    
41
	private static int modCount = 5000;
42
	
43
	public TcsXmlTaxonNameRelationsImport(){
44
		super();
45
	}
46
	
47
	@Override
48
	public boolean doCheck(TcsXmlImportState state){
49
		boolean result = true;
50
		logger.warn("Checking for TaxonNameRelations not yet implemented");
51
		//result &= checkArticlesWithoutJournal(tcsConfig);
52
		//result &= checkPartOfJournal(tcsConfig);
53
		
54
		return result;
55
	}
56
	
57
	@Override
58
	public void doInvoke(TcsXmlImportState state){
59
		
60
		
61
		logger.info("start make taxon name relations ...");
62
		MapWrapper<TaxonNameBase<?,?>> taxonNameMap = (MapWrapper<TaxonNameBase<?,?>>)state.getStore(ICdmIO.TAXONNAME_STORE);
63
		MapWrapper<Reference> referenceMap = (MapWrapper<Reference>)state.getStore(ICdmIO.REFERENCE_STORE);
64

    
65
		Set<TaxonNameBase> nameStore = new HashSet<TaxonNameBase>();
66

    
67
		ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);
68
		String childName;
69
		boolean obligatory;
70
		String idNamespace = "TaxonName";
71

    
72
		TcsXmlImportConfigurator config = state.getConfig();
73
		Element elDataSet = super. getDataSetElement(config);
74
		Namespace tcsNamespace = config.getTcsXmlNamespace();
75
		
76
		DoubleResult<Element, Boolean> doubleResult;
77
		childName = "TaxonNames";
78
		obligatory = false;
79
		Element elTaxonNames = XmlHelp.getSingleChildElement(success, elDataSet, childName, tcsNamespace, obligatory);
80
		
81
		String tcsElementName = "TaxonName";
82
		List<Element> elTaxonNameList =  elTaxonNames == null ? new ArrayList<Element>() : elTaxonNames.getChildren(tcsElementName, tcsNamespace);
83

    
84
//		Element source = tcsConfig.getSourceRoot();
85
		
86
		int i = 0;
87
		int nameRelCount = 0;
88
		//for each taxonName
89
		for (Element elTaxonName : elTaxonNameList){
90
			
91
			if ((++i % modCount) == 0){ logger.info("Names handled: " + (i-1));}
92

    
93
			//Basionyms
94
			tcsElementName = "Basionym";
95
			List<Element> elBasionymList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
96
			
97
			for (Element elBasionym: elBasionymList){
98
				nameRelCount++;
99
				logger.debug("BASIONYM "+  nameRelCount);
100
				
101
				NameRelationshipType relType = NameRelationshipType.BASIONYM();
102
				boolean inverse = false;
103
				
104
				String id = elTaxonName.getAttributeValue("id");
105
//				TaxonNameBase<?,?> fromName = taxonNameMap.get(id);
106
				
107
				makeNomenclaturalNoteType(config, elBasionym, relType, taxonNameMap, nameStore, removeVersionOfRef(id), inverse);
108
			}// end Basionyms
109
			
110
			//SpellingCorrections
111
			tcsElementName = "SpellingCorrectionOf";
112
			List<Element> elSpellingCorrectionList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
113
			
114
			for (Element elSpellingCorrection: elSpellingCorrectionList){
115
				nameRelCount++;
116
				logger.debug("SpellingCorrectionOf "+  nameRelCount);
117
				
118
				NameRelationshipType relType = NameRelationshipType.ORTHOGRAPHIC_VARIANT();
119
				boolean inverse = true;
120
				
121
				String id = elTaxonName.getAttributeValue("id");
122
				makeNomenclaturalNoteType(config, elSpellingCorrection, relType, taxonNameMap, nameStore, id, inverse);
123
			}// end SpellingCorrections
124
			
125
			//LaterHomonymOf
126
			tcsElementName = "LaterHomonymOf";
127
			List<Element> elLaterHomonymList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
128
			for (Element elLaterHomonym: elLaterHomonymList){
129
				nameRelCount++;
130
				logger.debug("LaterHomonymOf "+  nameRelCount);
131
				
132
				NameRelationshipType relType = NameRelationshipType.LATER_HOMONYM();
133
				boolean inverse = false;
134
				
135
				String id = elTaxonName.getAttributeValue("id");
136
				makeNomenclaturalNoteType(config, elLaterHomonym, relType, taxonNameMap, nameStore, id, inverse);
137
			}// end LaterHomonymOf
138
			
139
			//ReplacementNameFor
140
			tcsElementName = "ReplacementNameFor";
141
			List<Element> elReplacementNameForList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
142
			for (Element elReplacementNameFor: elReplacementNameForList){
143
				nameRelCount++;
144
				logger.debug("LaterHomonymOf "+  nameRelCount);
145
				
146
				NameRelationshipType relType = NameRelationshipType.REPLACED_SYNONYM();
147
				boolean inverse = false;
148
				
149
				String id = elTaxonName.getAttributeValue("id");
150
				makeNomenclaturalNoteType(config, elReplacementNameFor, relType, taxonNameMap, nameStore, id, inverse);
151
			}// end ReplacementNameFor
152
			
153
			//ConservedAgainst
154
			tcsElementName = "ConservedAgainst";
155
			List<Element> elConservedAgainstList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
156
			for (Element elConservedAgainst: elConservedAgainstList){
157
				nameRelCount++;
158
				logger.debug("ConservedAgainst "+  nameRelCount);
159
				
160
				NameRelationshipType relType = NameRelationshipType.CONSERVED_AGAINST();
161
				boolean inverse = false;
162
				
163
				String id = elTaxonName.getAttributeValue("id");
164
				makeNomenclaturalNoteType(config, elConservedAgainst, relType, taxonNameMap, nameStore, id, inverse);
165
			}// end ConservedAgainst
166

    
167
			
168
			
169
			//Sanctioned
170
			tcsElementName = "Sanctioned";
171
			List<Element> elSanctionedList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
172
			for (Element elSanctioned: elSanctionedList){
173
				
174
				//nameRelCount++;
175
				//TODO sanctioned
176
				logger.warn("Sanctioned not yet implemented " );
177
				
178
				///NameRelationshipType relType = NameRelationshipType.XXX
179
				//boolean inverse = false;
180
				//
181
				//String id = elTaxonName.getAttributeValue("id");
182
				//makeNomenclaturalNoteType(tcsConfig, elSanctioned, relType, taxonNameMap, nameStore, id, inverse);
183
			}// end Sanctioned
184
			
185
			//PublicationStatus
186
			tcsElementName = "PublicationStatus";
187
			List<Element> elPublicationStatusList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
188
			for (Element elPublicationStatus: elPublicationStatusList){
189
				
190
				nameRelCount++;
191
				//TODO PublicationStatus
192
				//logger.warn("PublicationStatus not yet implemented " );
193
				NomenclaturalStatusType statusType = null;
194
				NameRelationshipType nameRelType = null;
195
				List<Content> content = elPublicationStatus.getContent();
196
				Element el = elPublicationStatus.getChild("Note");
197
				Iterator<Content> iterator = content.iterator();
198
				Content next;
199
				String ruleConsidered = null;
200
				String relatedName = null;
201
				while (iterator.hasNext()){
202
					next = iterator.next();
203
					String test = next.getClass().getName();
204
					if (next.getClass().getName().equals("org.jdom.Element")){
205
						Element element = (Element)next;
206
						NomenclaturalStatus status;
207
						try {
208
							if (element.getName().equals("Note")){
209
								Iterator<Content> iteratorNote = element.getContent().iterator();
210
								Content nextNote;
211
								while (iteratorNote.hasNext()){
212
									nextNote = iteratorNote.next();
213
									test = nextNote.getClass().getName();
214
									if (nextNote.getValue().startsWith("nom. inval.")){
215
										statusType =TcsXmlTransformer.nomStatusString2NomStatus("nom. inval.");
216
									} else if (nextNote.getValue().startsWith("nom. illeg.")){
217
										statusType =TcsXmlTransformer.nomStatusString2NomStatus("nom. illeg.");
218
									} else if (nextNote.getValue().startsWith("nom. superfl.")){
219
										statusType =TcsXmlTransformer.nomStatusString2NomStatus("nom. superfl.");
220
									} else if (nextNote.getValue().startsWith("[isonym]")){
221
										//in cdm NameRelationship
222
										nameRelType = NameRelationshipType.LATER_ISONYM();
223
									}
224
									
225
								}
226
							}else if (element.getName().equals("RuleConsidered")){
227
								Iterator<Content> iteratorNote = element.getContent().iterator();
228
								Content nextNote;
229
								while (iteratorNote.hasNext()){
230
									nextNote = iteratorNote.next();
231
									ruleConsidered = nextNote.getValue();
232
								}
233
							}else if (element.getName().equals("RelatedName")){
234
								Iterator<Content> iteratorNote = element.getContent().iterator();
235
								Content nextNote;
236
								while (iteratorNote.hasNext()){
237
									nextNote = iteratorNote.next();
238
									relatedName = nextNote.getValue();
239
								}
240
							}
241
						} catch (UnknownCdmTypeException e) {
242
							// TODO Auto-generated catch block
243
							logger.warn(e.getMessage());
244
						}
245
					}
246
						
247
				}
248
				TaxonNameBase taxonName = null;
249
				if (statusType != null || nameRelType != null){
250
					String id = elTaxonName.getAttributeValue("id");
251
					
252
					taxonName=  taxonNameMap.get(removeVersionOfRef(id));
253
				}
254
				if (taxonName != null){
255
					if (statusType != null){
256
						NomenclaturalStatus status = NomenclaturalStatus.NewInstance(statusType);
257
						if (ruleConsidered != null){
258
							status.setRuleConsidered(ruleConsidered);
259
						}
260
						taxonName.addStatus(status);
261
					}
262
					if (nameRelType != null){
263
						String id = elTaxonName.getAttributeValue("id");
264
						
265
						TaxonNameBase relatedTaxonName =  taxonNameMap.get(removeVersionOfRef(id));
266
						taxonName.addRelationshipFromName(relatedTaxonName, nameRelType, ruleConsidered);
267
					}
268
				}
269
				
270
				
271
				
272
				
273
			}// end PublicationStatus
274
			
275
			//BasedOn
276
			tcsElementName = "BasedOn";
277
			List<Element> elBasedOnList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
278
			for (Element elBasedOn: elBasedOnList){
279
				
280
				//nameRelCount++;
281
				//TODO BasedOn
282
				logger.debug("BasedOn not yet implemented " );
283
				/*
284
				 * <tcs:BasedOn>
285
						<tcs:RelatedName ref="urn:lsid:ipni.org:names:151372-1"></tcs:RelatedName>
286
					</tcs:BasedOn>
287
				 */
288
				///NameRelationshipType relType = NameRelationshipType.XXX
289
				//boolean inverse = false;
290
				//
291
				//String id = elTaxonName.getAttributeValue("id");
292
				//makeNomenclaturalNoteType(tcsConfig, elBasedOn, relType, taxonNameMap, nameStore, id, inverse);
293
			}// end BasedOn
294
			
295
			
296
			
297
			
298
		}	
299
		//Other Relations
300
		//TODO
301
		
302
		logger.info(nameRelCount + " nameRelations handled");
303
		getNameService().save(nameStore);
304
		logger.info("end make taxon name relationships ...");
305
		if (!success.getValue()){
306
			state.setUnsuccessfull();
307
		}
308
		return;
309
	}
310
	
311

    
312
	private  boolean makeNomenclaturalNoteType(TcsXmlImportConfigurator tcsConfig, Element elRelation, NameRelationshipType relType, MapWrapper<TaxonNameBase<?,?>> taxonNameMap, Set<TaxonNameBase> nameStore, String id, boolean inverse){
313
		if (elRelation == null){
314
			return false;
315
		}
316
		Namespace ns = elRelation.getNamespace();
317
		
318
		String ruleConsidered = elRelation.getChildText("RuleConsidered", ns);
319
		String note = elRelation.getChildText("Note", ns);
320
		String microReference = elRelation.getChildText("MicroReference", ns);
321
		Element elRelatedName = elRelation.getChild("RelatedName", ns);
322
		//TODO relType
323
		String relatedNameId = elRelatedName.getAttributeValue("ref");
324
		
325
		TaxonNameBase<?,?> fromName = taxonNameMap.get(removeVersionOfRef(id));
326
		
327
		TaxonNameBase<?,?> toName = taxonNameMap.get(removeVersionOfRef(relatedNameId));
328
		if (fromName == null){
329
			//logger.warn("fromName (" + id + ") not found in Map! Relationship not set!");
330
			return false;
331
		}
332
		if (toName == null){
333
			//logger.warn("toName (" + relatedNameId + ") not found in Map! Relationship not set!");
334
			return false;
335
		}
336

    
337
		
338
		//TODO note, microreference
339
		if (inverse == false){
340
			toName.addRelationshipToName(fromName, relType, ruleConsidered);
341
		}else{
342
			fromName.addRelationshipToName(toName, relType, ruleConsidered);
343
		}
344
		nameStore.add(fromName);
345
		return true;
346
	}
347
	
348
	@Override
349
	protected boolean isIgnore(TcsXmlImportState state){
350
		return ! state.getConfig().isDoRelNames();
351
	}
352

    
353
}
(10-10/11)