abefdcb81bbda2051be4a257e05ac8220bf952f3
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / tcs / TcsTaxonIO.java
1 /**
2 *
3 */
4 package eu.etaxonomy.cdm.io.tcs;
5
6 import java.util.HashSet;
7 import java.util.Iterator;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11
12 import org.apache.log4j.Logger;
13 import org.jdom.Attribute;
14 import org.jdom.Element;
15 import org.jdom.Namespace;
16 import org.jdom.filter.ElementFilter;
17 import org.jdom.filter.Filter;
18
19 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
20 import eu.etaxonomy.cdm.api.service.INameService;
21 import eu.etaxonomy.cdm.api.service.ITaxonService;
22 import eu.etaxonomy.cdm.common.XmlHelp;
23 import eu.etaxonomy.cdm.io.common.CdmIoBase;
24 import eu.etaxonomy.cdm.io.common.ICdmIO;
25 import eu.etaxonomy.cdm.io.common.IIO;
26 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
27 import eu.etaxonomy.cdm.io.common.MapWrapper;
28 import eu.etaxonomy.cdm.model.common.CdmBase;
29 import eu.etaxonomy.cdm.model.common.RelationshipTermBase;
30 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
31 import eu.etaxonomy.cdm.model.reference.Generic;
32 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
33 import eu.etaxonomy.cdm.model.taxon.Synonym;
34 import eu.etaxonomy.cdm.model.taxon.SynonymRelationshipType;
35 import eu.etaxonomy.cdm.model.taxon.Taxon;
36 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
37 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;
38 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
39
40
41 /**
42 * @author a.mueller
43 *
44 */
45 public class TcsTaxonIO extends CdmIoBase implements ICdmIO {
46 private static final Logger logger = Logger.getLogger(TcsTaxonIO.class);
47
48 private static int modCount = 30000;
49 private static final String ioNameLocal = "TcsTaxonIO";
50
51 public TcsTaxonIO(boolean ignore){
52 super(ioNameLocal, ignore);
53 }
54
55
56 @Override
57 public boolean doCheck(IImportConfigurator config){
58 boolean result = true;
59 logger.warn("Checking for Taxa not yet implemented");
60 //result &= checkArticlesWithoutJournal(bmiConfig);
61 //result &= checkPartOfJournal(bmiConfig);
62
63 return result;
64 }
65
66 @Override
67 public boolean doInvoke(IImportConfigurator config, CdmApplicationController cdmApp, Map<String, MapWrapper<? extends CdmBase>> stores){
68
69 MapWrapper<TaxonBase> taxonMap = (MapWrapper<TaxonBase>)stores.get(ICdmIO.TAXON_STORE);
70 MapWrapper<TaxonNameBase> taxonNameMap = (MapWrapper<TaxonNameBase>)stores.get(ICdmIO.TAXONNAME_STORE);
71 MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);
72
73 String xmlElementName;
74 String xmlAttributeName;
75 Namespace elementNamespace;
76 Namespace attributeNamespace;
77 String cdmAttrName;
78 String value;
79
80 logger.info("start makeTaxa ...");
81
82 TcsImportConfigurator tcsConfig = (TcsImportConfigurator)config;
83 Element root = tcsConfig.getSourceRoot();
84 boolean success =true;
85 INameService nameService = cdmApp.getNameService();
86
87 String prefix;
88 Namespace rdfNamespace = root.getNamespace();
89 prefix = "tc";
90 Namespace taxonConceptNamespace = root.getNamespace(prefix);
91 prefix = "tcom";
92 Namespace commonNamespace = root.getNamespace(prefix);
93
94 xmlElementName = "TaxonConcept";
95 elementNamespace = taxonConceptNamespace;
96 List<Element> elTaxonConcepts = root.getChildren(xmlElementName, elementNamespace);
97
98 ITaxonService taxonService = cdmApp.getTaxonService();
99
100 int i = 0;
101 //for each taxonName
102 for (Element elTaxonConcept : elTaxonConcepts){
103 if ((i++ % modCount) == 0){ logger.info("Taxa handled: " + (i-1));}
104
105 //
106 String taxonAbout = elTaxonConcept.getAttributeValue("about", rdfNamespace);
107
108 //hasName
109 xmlElementName = "hasName";
110 elementNamespace = taxonConceptNamespace;
111 xmlAttributeName = "resource";
112 attributeNamespace = rdfNamespace;
113 String strNameResource= XmlHelp.getChildAttributeValue(elTaxonConcept, xmlElementName, elementNamespace, xmlAttributeName, attributeNamespace);
114 TaxonNameBase taxonNameBase = taxonNameMap.get(strNameResource);
115
116 //accordingTo
117 xmlElementName = "accordingTo";
118 elementNamespace = taxonConceptNamespace;
119 String strAccordingTo = elTaxonConcept.getChildTextTrim(xmlElementName, elementNamespace);
120 //FIXME
121 Generic sec = Generic.NewInstance();
122 sec.setTitleCache(strAccordingTo);
123
124 //FIXME or synonym
125 TaxonBase taxonBase;
126 if (hasIsSynonymRelation(elTaxonConcept, rdfNamespace)){
127 taxonBase = Synonym.NewInstance(taxonNameBase, sec);
128 }else{
129 taxonBase = Taxon.NewInstance(taxonNameBase, sec);
130 }
131
132 //primary
133 // xmlElementName = "primary";
134 // elementNamespace = taxonConceptNamespace;
135 // cdmAttrName = "isPrimary";
136 // Boolean primary = ImportHelper.addXmlBooleanValue(elTaxonConcept, taxon, xmlElementName, elementNamespace, cdmAttrName);
137
138 taxonMap.put(taxonAbout, taxonBase);
139
140 }
141 //invokeRelations(source, cdmApp, deleteAll, taxonMap, referenceMap);
142 logger.info("saving taxa ...");
143 taxonService.saveTaxonAll(taxonMap.objects());
144 logger.info("end makeTaxa ...");
145 return success;
146 }
147
148
149 private static boolean hasIsSynonymRelation(Element taxonConcept, Namespace rdfNamespace){
150 boolean result = false;
151 if (taxonConcept == null || ! "TaxonConcept".equalsIgnoreCase(taxonConcept.getName()) ){
152 return false;
153 }
154
155 String elName = "relationshipCategory";
156 Filter filter = new ElementFilter(elName, taxonConcept.getNamespace());
157 Iterator<Element> relationshipCategories = taxonConcept.getDescendants(filter);
158 while (relationshipCategories.hasNext()){
159 Element relationshipCategory = relationshipCategories.next();
160 Attribute resource = relationshipCategory.getAttribute("resource", rdfNamespace);
161 String isSynonymFor = "http://rs.tdwg.org/ontology/voc/TaxonConcept#IsSynonymFor";
162 if (resource != null && isSynonymFor.equalsIgnoreCase(resource.getValue()) ){
163 return true;
164 }
165 }
166 return result;
167 }
168
169 }