Ordered input for easier comparison
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / edaphobase / EdaphobaseTaxonImport.java
1 // $Id$
2 /**
3 * Copyright (C) 2015 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10 package eu.etaxonomy.cdm.io.edaphobase;
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.List;
17 import java.util.Map;
18 import java.util.Set;
19 import java.util.UUID;
20
21 import org.apache.log4j.Logger;
22 import org.codehaus.plexus.util.StringUtils;
23 import org.springframework.stereotype.Component;
24
25 import eu.etaxonomy.cdm.io.common.IPartitionedIO;
26 import eu.etaxonomy.cdm.io.common.ImportHelper;
27 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28 import eu.etaxonomy.cdm.io.common.mapping.UndefinedTransformerMethodException;
29 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
30 import eu.etaxonomy.cdm.model.common.CdmBase;
31 import eu.etaxonomy.cdm.model.name.Rank;
32 import eu.etaxonomy.cdm.model.name.ZoologicalName;
33 import eu.etaxonomy.cdm.model.reference.Reference;
34 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
35 import eu.etaxonomy.cdm.model.taxon.Synonym;
36 import eu.etaxonomy.cdm.model.taxon.Taxon;
37 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
38
39 /**
40 * @author a.mueller
41 * @date 18.12.2015
42 *
43 */
44 @Component
45 public class EdaphobaseTaxonImport extends EdaphobaseImportBase {
46 private static final long serialVersionUID = -9138378836474086070L;
47 private static final Logger logger = Logger.getLogger(EdaphobaseTaxonImport.class);
48
49 private static final String tableName = "tax_taxon";
50
51 private static final String pluralString = "taxa";
52
53 private static final Object AUTHOR_NAMESPACE = "tax_author_name";
54
55 /**
56 * @param tableName
57 * @param pluralString
58 */
59 public EdaphobaseTaxonImport() {
60 super(tableName, pluralString);
61 }
62
63 @Override
64 protected String getIdQuery(EdaphobaseImportState state) {
65 return "SELECT DISTINCT taxon_id FROM tax_taxon t "
66 + " ORDER BY taxon_id";
67 }
68
69 @Override
70 protected String getRecordQuery(EdaphobaseImportConfigurator config) {
71 String result = " SELECT DISTINCT t.*, r.value as rankStr, pr.value as parentRankStr, ppr.value as grandParentRankStr, "
72 + " pt.name as parentName, ppt.name as grandParentName "
73 + " FROM tax_taxon t "
74 + " LEFT JOIN tax_taxon pt ON t.parent_taxon_fk = pt.taxon_id "
75 + " LEFT JOIN tax_taxon ppt ON pt.parent_taxon_fk = ppt.taxon_id"
76 + " LEFT OUTER JOIN tax_rank_en r ON r.element_id = t.tax_rank_fk "
77 + " LEFT OUTER JOIN tax_rank_en pr ON pr.element_id = pt.tax_rank_fk "
78 + " LEFT OUTER JOIN tax_rank_en ppr ON pr.element_id = ppt.tax_rank_fk "
79 + " WHERE t.taxon_id IN (@IDSET)";
80 result = result.replace("@IDSET", IPartitionedIO.ID_LIST_TOKEN);
81 return result;
82 }
83
84 @Override
85 protected void doInvoke(EdaphobaseImportState state) {
86 super.doInvoke(state);
87 }
88
89
90 @Override
91 public boolean doPartition(ResultSetPartitioner partitioner, EdaphobaseImportState state) {
92 ResultSet rs = partitioner.getResultSet();
93 Set<TaxonBase> taxaToSave = new HashSet<>();
94 try {
95 while (rs.next()){
96 makeSingleTaxon(state, rs, taxaToSave);
97
98 }
99 } catch (SQLException e) {
100 // TODO Auto-generated catch block
101 e.printStackTrace();
102 }
103
104 getTaxonService().saveOrUpdate(taxaToSave);
105 return true;
106 }
107
108 /**
109 * @param state
110 * @param rs
111 * @param taxaToSave
112 * @throws SQLException
113 */
114 private void makeSingleTaxon(EdaphobaseImportState state, ResultSet rs, Set<TaxonBase> taxaToSave)
115 throws SQLException {
116 Integer id = nullSafeInt(rs, "taxon_id");
117 Integer year = nullSafeInt(rs, "tax_year");
118 boolean isBrackets = rs.getBoolean("tax_brackets");
119 String remark = rs.getString("remark");
120 String nameStr = rs.getString("name");
121 String authorName = rs.getString("tax_author_name");
122 //parentTaxonFk
123 //rankFk
124 Integer nomRefId = nullSafeInt(rs, "tax_document");
125 boolean isValid = rs.getBoolean("valid");
126 boolean idDeleted = rs.getBoolean("deleted");
127 String displayString = rs.getString("display_string");
128 Integer version = nullSafeInt(rs, "versionfield");
129 String pages = rs.getString("pages");
130 String treeIndex = rs.getString("path_to_root");
131 // Integer rankFk = nullSafeInt(rs, "tax_rank_fk");
132 String nameAddition = rs.getString("name_addition");
133 String officialRemark = rs.getString("official_remark");
134 boolean isGroup = rs.getBoolean("taxonomic_group");
135 String rankStr = rs.getString("rankStr");
136 String parentRankStr = rs.getString("parentRankStr");
137 String grandParentRankStr = rs.getString("grandParentRankStr");
138 String parentNameStr = rs.getString("parentName");
139 String grandParentNameStr = rs.getString("grandParentName");
140
141 TaxonBase<?> taxonBase;
142
143 //Name etc.
144 Rank rank = makeRank(state, rankStr);
145 ZoologicalName name = ZoologicalName.NewInstance(rank);
146 setNamePart(nameStr, rank, name);
147 Rank parentRank = makeRank(state, parentRankStr);
148 setNamePart(parentNameStr, parentRank, name);
149 Rank parentParentRank = makeRank(state, grandParentRankStr);
150 setNamePart(grandParentNameStr, parentParentRank, name);
151
152 //Authors
153 if (StringUtils.isNotBlank(authorName)){
154 TeamOrPersonBase<?> author = state.getRelatedObject(AUTHOR_NAMESPACE, authorName, TeamOrPersonBase.class);
155 if (author == null){
156 logger.warn("Author not found in state: " + authorName);
157 }else{
158 if (isBrackets){
159 name.setBasionymAuthorship(author);
160 name.setOriginalPublicationYear(year);
161 }else{
162 name.setCombinationAuthorship(author);
163 name.setPublicationYear(year);
164 }
165 }
166 }
167
168 //nomRef
169 if (nomRefId != null){
170 Reference<?> nomRef = state.getRelatedObject(REFERENCE_NAMESPACE, String.valueOf(nomRefId), Reference.class);
171 if (nomRef == null){
172 logger.warn("Reference " + nomRefId + " could not be found");
173 }
174 name.setNomenclaturalReference(nomRef);
175 }
176 name.setNomenclaturalMicroReference(StringUtils.isBlank(pages)? null : pages);
177
178
179 Reference<?> secRef = state.getRelatedObject(REFERENCE_NAMESPACE, state.getConfig().getSecUuid().toString(), Reference.class);
180 if (secRef == null){
181 secRef = makeSecRef(state);
182 }
183 if (isValid){
184 taxonBase = Taxon.NewInstance(name, secRef);
185 }else{
186 taxonBase = Synonym.NewInstance(name, secRef);
187 }
188 taxaToSave.add(taxonBase);
189
190 //remarks
191 doNotes(taxonBase, remark);
192
193 //id
194 ImportHelper.setOriginalSource(taxonBase, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
195 ImportHelper.setOriginalSource(name, state.getTransactionalSourceReference(), id, TAXON_NAMESPACE);
196 }
197
198
199 /**
200 * @param state
201 * @return
202 */
203 private Reference<?> makeSecRef(EdaphobaseImportState state) {
204 Reference<?> ref = ReferenceFactory.newDatabase();
205 ref.setTitle(state.getConfig().getEdaphobaseSecundumTitle());
206 ref.setUuid(state.getConfig().getSecUuid());
207 state.addRelatedObject(REFERENCE_NAMESPACE, ref.getUuid().toString(), ref);
208 getReferenceService().save(ref);
209 return ref;
210 }
211
212 @Override
213 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs,
214 EdaphobaseImportState state) {
215 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<>();
216 Map<String, TeamOrPersonBase<?>> authorMap = new HashMap<>();
217 Set<String> authorSet = new HashSet<>();
218 Set<String> referenceIdSet = new HashSet<String>();
219
220 try {
221 while (rs.next()){
222 String authorStr = rs.getString("tax_author_name");
223 authorSet.add(authorStr);
224 handleForeignKey(rs, referenceIdSet, "tax_document");
225 }
226 } catch (SQLException e) {
227 e.printStackTrace();
228 }
229
230 //Authors
231 Set<UUID> uuidSet = new HashSet<>();
232 for (String authorStr : authorSet){
233 UUID uuid = state.getAuthorUuid(authorStr);
234 uuidSet.add(uuid);
235 }
236 List<TeamOrPersonBase<?>> authors = (List)getAgentService().find(uuidSet);
237 Map<UUID, TeamOrPersonBase<?>> authorUuidMap = new HashMap<>();
238 for (TeamOrPersonBase<?> author : authors){
239 authorUuidMap.put(author.getUuid(), author);
240 }
241
242 for (String authorStr : authorSet){
243 UUID uuid = state.getAuthorUuid(authorStr);
244 TeamOrPersonBase<?> author = authorUuidMap.get(uuid);
245 authorMap.put(authorStr, author);
246 }
247 result.put(AUTHOR_NAMESPACE, authorMap);
248
249 //reference map
250 String nameSpace = REFERENCE_NAMESPACE;
251 Class<?> cdmClass = Reference.class;
252 Set<String> idSet = referenceIdSet;
253 Map<String, Reference<?>> referenceMap = (Map<String, Reference<?>>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
254 result.put(nameSpace, referenceMap);
255
256 //secundum
257 UUID secUuid = state.getConfig().getSecUuid();
258 Reference<?> secRef = getReferenceService().find(secUuid);
259 referenceMap.put(secUuid.toString(), secRef);
260
261 return result;
262 }
263
264 private void setNamePart(String nameStr, Rank rank, ZoologicalName name) {
265 if (rank != null){
266 if (rank.isSupraGeneric() || rank.isGenus()){
267 if (StringUtils.isBlank(name.getGenusOrUninomial())){
268 name.setGenusOrUninomial(nameStr);
269 }
270 }else if (rank.isInfraGeneric()){
271 if (StringUtils.isBlank(name.getInfraGenericEpithet())){
272 name.setInfraGenericEpithet(nameStr);
273 }
274 }else if (rank.isSpeciesAggregate() || rank.isSpecies()){
275 if (StringUtils.isBlank(name.getSpecificEpithet())){
276 name.setSpecificEpithet(nameStr);
277 }
278 }else if (rank.isInfraSpecific()){
279 if (StringUtils.isBlank(name.getInfraSpecificEpithet())){
280 name.setInfraSpecificEpithet(nameStr);
281 }
282 }
283 }
284 }
285
286 private Rank makeRank(EdaphobaseImportState state, String rankStr) {
287 Rank rank = null;
288 try {
289 rank = state.getTransformer().getRankByKey(rankStr);
290 } catch (UndefinedTransformerMethodException e) {
291 e.printStackTrace();
292 }
293 return rank;
294 }
295
296 @Override
297 protected boolean doCheck(EdaphobaseImportState state) {
298 return false;
299 }
300
301 @Override
302 protected boolean isIgnore(EdaphobaseImportState state) {
303 return ! state.getConfig().isDoTaxa();
304 }
305
306 }