1
2
3
4
5
6
7
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
49
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
82
83 int i = 0;
84 int nameRelCount = 0;
85
86 for (Element elTaxonName : elTaxonNameList){
87
88 if ((++i % modCount) == 0){ logger.info("Names handled: " + (i-1));}
89
90
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
103
104 makeNomenclaturalNoteType(config, elBasionym, relType, taxonNameMap, nameStore, id, inverse);
105 }
106
107
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 }
121
122
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 }
135
136
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 }
149
150
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 }
163
164
165
166
167 tcsElementName = "Sanctioned";
168 List<Element> elSanctionedList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
169 for (Element elSanctioned: elSanctionedList){
170
171
172
173 logger.warn("Sanctioned not yet implemented " );
174
175
176
177
178
179
180 }
181
182
183 tcsElementName = "PublicationStatus";
184 List<Element> elPublicationStatusList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
185 for (Element elPublicationStatus: elPublicationStatusList){
186
187
188
189 logger.warn("PublicationStatus not yet implemented " );
190
191
192
193
194
195
196 }
197
198
199 tcsElementName = "BasedOn";
200 List<Element> elBasedOnList = elTaxonName.getChildren(tcsElementName, tcsNamespace);
201 for (Element elBasedOn: elBasedOnList){
202
203
204
205 logger.warn("BasedOn not yet implemented " );
206
207
208
209
210
211
212 }
213
214
215
216
217 }
218
219
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
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
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
263
264
265 protected boolean isIgnore(TcsXmlImportState state){
266 return ! state.getConfig().isDoRelNames();
267 }
268
269 }