View Javadoc

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.HashSet;
13  import java.util.List;
14  import java.util.Map;
15  import java.util.Set;
16  
17  import org.apache.log4j.Logger;
18  import org.jdom.Element;
19  import org.jdom.Namespace;
20  import org.springframework.stereotype.Component;
21  
22  import eu.etaxonomy.cdm.api.service.INameService;
23  import eu.etaxonomy.cdm.common.DoubleResult;
24  import eu.etaxonomy.cdm.common.ResultWrapper;
25  import eu.etaxonomy.cdm.common.XmlHelp;
26  import eu.etaxonomy.cdm.io.common.ICdmIO;
27  import eu.etaxonomy.cdm.io.common.IImportConfigurator;
28  import eu.etaxonomy.cdm.io.common.MapWrapper;
29  import eu.etaxonomy.cdm.model.common.CdmBase;
30  import eu.etaxonomy.cdm.model.name.NameRelationshipType;
31  import eu.etaxonomy.cdm.model.name.TaxonNameBase;
32  import eu.etaxonomy.cdm.model.reference.ReferenceBase;
33  
34  @Component
35  public class TcsXmlTaxonNameRelationsImport extends TcsXmlImportBase implements ICdmIO<TcsXmlImportState> {
36  	private static final Logger logger = Logger.getLogger(TcsXmlTaxonNameRelationsImport.class);
37  
38  	private static int modCount = 5000;
39  	
40  	public TcsXmlTaxonNameRelationsImport(){
41  		super();
42  	}
43  	
44  	@Override
45  	public boolean doCheck(TcsXmlImportState state){
46  		boolean result = true;
47  		logger.warn("Checking for TaxonNameRelations not yet implemented");
48  		//result &= checkArticlesWithoutJournal(tcsConfig);
49  		//result &= checkPartOfJournal(tcsConfig);
50  		
51  		return result;
52  	}
53  	
54  	@Override
55  	public boolean doInvoke(TcsXmlImportState state){
56  		
57  		
58  		logger.info("start make taxon name relations ...");
59  		MapWrapper<TaxonNameBase<?,?>> taxonNameMap = (MapWrapper<TaxonNameBase<?,?>>)state.getStore(ICdmIO.TAXONNAME_STORE);
60  		MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)state.getStore(ICdmIO.REFERENCE_STORE);
61  
62  		Set<TaxonNameBase> nameStore = new HashSet<TaxonNameBase>();
63  
64  		ResultWrapper<Boolean> success = ResultWrapper.NewInstance(true);
65  		String childName;
66  		boolean obligatory;
67  		String idNamespace = "TaxonName";
68  
69  		TcsXmlImportConfigurator config = state.getConfig();
70  		Element elDataSet = super. getDataSetElement(config);
71  		Namespace tcsNamespace = config.getTcsXmlNamespace();
72  		
73  		DoubleResult<Element, Boolean> doubleResult;
74  		childName = "TaxonNames";
75  		obligatory = false;
76  		Element elTaxonNames = XmlHelp.getSingleChildElement(success, elDataSet, childName, tcsNamespace, obligatory);
77  		
78  		String tcsElementName = "TaxonName";
79  		List<Element> elTaxonNameList = elTaxonNames.getChildren(tcsElementName, tcsNamespace);
80  
81  //		Element source = tcsConfig.getSourceRoot();
82  		
83  		int i = 0;
84  		int nameRelCount = 0;
85  		//for each taxonName
86  		for (Element elTaxonName : elTaxonNameList){
87  			
88  			if ((++i % modCount) == 0){ logger.info("Names handled: " + (i-1));}
89  
90  			//Basionyms
91  			tcsElementName = "Basionym";
92  			List<Element> elBasionymList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
93  			
94  			for (Element elBasionym: elBasionymList){
95  				nameRelCount++;
96  				logger.debug("BASIONYM "+  nameRelCount);
97  				
98  				NameRelationshipType relType = NameRelationshipType.BASIONYM();
99  				boolean inverse = false;
100 				
101 				String id = elTaxonName.getAttributeValue("id");
102 //				TaxonNameBase<?,?> fromName = taxonNameMap.get(id);
103 				
104 				makeNomenclaturalNoteType(config, elBasionym, relType, taxonNameMap, nameStore, id, inverse);
105 			}// end Basionyms
106 			
107 			//SpellingCorrections
108 			tcsElementName = "SpellingCorrectionOf";
109 			List<Element> elSpellingCorrectionList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
110 			
111 			for (Element elSpellingCorrection: elSpellingCorrectionList){
112 				nameRelCount++;
113 				logger.debug("SpellingCorrectionOf "+  nameRelCount);
114 				
115 				NameRelationshipType relType = NameRelationshipType.ORTHOGRAPHIC_VARIANT();
116 				boolean inverse = true;
117 				
118 				String id = elTaxonName.getAttributeValue("id");
119 				makeNomenclaturalNoteType(config, elSpellingCorrection, relType, taxonNameMap, nameStore, id, inverse);
120 			}// end SpellingCorrections
121 			
122 			//LaterHomonymOf
123 			tcsElementName = "LaterHomonymOf";
124 			List<Element> elLaterHomonymList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
125 			for (Element elLaterHomonym: elLaterHomonymList){
126 				nameRelCount++;
127 				logger.debug("LaterHomonymOf "+  nameRelCount);
128 				
129 				NameRelationshipType relType = NameRelationshipType.LATER_HOMONYM();
130 				boolean inverse = false;
131 				
132 				String id = elTaxonName.getAttributeValue("id");
133 				makeNomenclaturalNoteType(config, elLaterHomonym, relType, taxonNameMap, nameStore, id, inverse);
134 			}// end LaterHomonymOf
135 			
136 			//ReplacementNameFor
137 			tcsElementName = "ReplacementNameFor";
138 			List<Element> elReplacementNameForList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
139 			for (Element elReplacementNameFor: elReplacementNameForList){
140 				nameRelCount++;
141 				logger.debug("LaterHomonymOf "+  nameRelCount);
142 				
143 				NameRelationshipType relType = NameRelationshipType.REPLACED_SYNONYM();
144 				boolean inverse = false;
145 				
146 				String id = elTaxonName.getAttributeValue("id");
147 				makeNomenclaturalNoteType(config, elReplacementNameFor, relType, taxonNameMap, nameStore, id, inverse);
148 			}// end ReplacementNameFor
149 			
150 			//ConservedAgainst
151 			tcsElementName = "ConservedAgainst";
152 			List<Element> elConservedAgainstList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
153 			for (Element elConservedAgainst: elConservedAgainstList){
154 				nameRelCount++;
155 				logger.debug("ConservedAgainst "+  nameRelCount);
156 				
157 				NameRelationshipType relType = NameRelationshipType.CONSERVED_AGAINST();
158 				boolean inverse = false;
159 				
160 				String id = elTaxonName.getAttributeValue("id");
161 				makeNomenclaturalNoteType(config, elConservedAgainst, relType, taxonNameMap, nameStore, id, inverse);
162 			}// end ConservedAgainst
163 
164 			
165 			
166 			//Sanctioned
167 			tcsElementName = "Sanctioned";
168 			List<Element> elSanctionedList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
169 			for (Element elSanctioned: elSanctionedList){
170 				
171 				//nameRelCount++;
172 				//TODO sanctioned
173 				logger.warn("Sanctioned not yet implemented " );
174 				
175 				///NameRelationshipType relType = NameRelationshipType.XXX
176 				//boolean inverse = false;
177 				//
178 				//String id = elTaxonName.getAttributeValue("id");
179 				//makeNomenclaturalNoteType(tcsConfig, elSanctioned, relType, taxonNameMap, nameStore, id, inverse);
180 			}// end Sanctioned
181 			
182 			//PublicationStatus
183 			tcsElementName = "PublicationStatus";
184 			List<Element> elPublicationStatusList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
185 			for (Element elPublicationStatus: elPublicationStatusList){
186 				
187 				//nameRelCount++;
188 				//TODO PublicationStatus
189 				logger.warn("PublicationStatus not yet implemented " );
190 				
191 				///NameRelationshipType relType = NameRelationshipType.XXX
192 				//boolean inverse = false;
193 				//
194 				//String id = elTaxonName.getAttributeValue("id");
195 				//makeNomenclaturalNoteType(tcsConfig, elPublicationStatus, relType, taxonNameMap, nameStore, id, inverse);
196 			}// end PublicationStatus
197 			
198 			//BasedOn
199 			tcsElementName = "BasedOn";
200 			List<Element> elBasedOnList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
201 			for (Element elBasedOn: elBasedOnList){
202 				
203 				//nameRelCount++;
204 				//TODO BasedOn
205 				logger.warn("BasedOn not yet implemented " );
206 				
207 				///NameRelationshipType relType = NameRelationshipType.XXX
208 				//boolean inverse = false;
209 				//
210 				//String id = elTaxonName.getAttributeValue("id");
211 				//makeNomenclaturalNoteType(tcsConfig, elBasedOn, relType, taxonNameMap, nameStore, id, inverse);
212 			}// end BasedOn
213 			
214 			
215 			
216 			
217 		}	
218 		//Other Relations
219 		//TODO
220 		
221 		logger.info(nameRelCount + " nameRelations handled");
222 		getNameService().save(nameStore);
223 		logger.info("end make taxon name relationships ...");
224 		return success.getValue();
225 	}
226 	
227 	private  boolean makeNomenclaturalNoteType(TcsXmlImportConfigurator tcsConfig, Element elRelation, NameRelationshipType relType, MapWrapper<TaxonNameBase<?,?>> taxonNameMap, Set<TaxonNameBase> nameStore, String id, boolean inverse){
228 		if (elRelation == null){
229 			return false;
230 		}
231 		Namespace ns = elRelation.getNamespace();
232 		
233 		String ruleConsidered = elRelation.getChildText("RuleConsidered", ns);
234 		String note = elRelation.getChildText("Note", ns);
235 		String microReference = elRelation.getChildText("MicroReference", ns);
236 		Element elRelatedName = elRelation.getChild("RelatedName", ns);
237 		//TODO relType
238 		String relatedNameId = elRelatedName.getAttributeValue("ref");
239 		
240 		TaxonNameBase<?,?> fromName = taxonNameMap.get(id);
241 		TaxonNameBase<?,?> toName = taxonNameMap.get(relatedNameId);
242 		if (fromName == null){
243 			logger.warn("fromName (" + id + ") not found in Map! Relationship not set!");
244 			return false;
245 		}
246 		if (toName == null){
247 			logger.warn("toName (" + id + ") not found in Map! Relationship not set!");
248 			return false;
249 		}
250 
251 		
252 		//TODO note, microreference
253 		if (inverse == false){
254 			toName.addRelationshipToName(fromName, relType, ruleConsidered);
255 		}else{
256 			fromName.addRelationshipToName(toName, relType, ruleConsidered);
257 		}
258 		nameStore.add(fromName);
259 		return true;
260 	}
261 	
262 	/* (non-Javadoc)
263 	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
264 	 */
265 	protected boolean isIgnore(TcsXmlImportState state){
266 		return ! state.getConfig().isDoRelNames();
267 	}
268 
269 }