d228c30496cf629e529d0c2f9ba589e7a123ee27
[cdmlib-apps.git] / cdm-pesi / src / main / java / eu / etaxonomy / cdm / io / pesi / indexFungorum / IndexFungorumSpeciesImport.java
1 /**
2 * Copyright (C) 2007 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.pesi.indexFungorum;
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.Map;
17 import java.util.Set;
18
19 import org.apache.commons.lang.StringUtils;
20 import org.apache.log4j.Logger;
21 import org.springframework.stereotype.Component;
22
23 import eu.etaxonomy.cdm.common.CdmUtils;
24 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
25 import eu.etaxonomy.cdm.io.pesi.out.PesiTransformer;
26 import eu.etaxonomy.cdm.model.common.CdmBase;
27 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
28 import eu.etaxonomy.cdm.model.name.NonViralName;
29 import eu.etaxonomy.cdm.model.name.Rank;
30 import eu.etaxonomy.cdm.model.reference.Reference;
31 import eu.etaxonomy.cdm.model.taxon.Classification;
32 import eu.etaxonomy.cdm.model.taxon.Taxon;
33 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
34 import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
35
36
37 /**
38 * @author a.mueller
39 * @created 27.02.2012
40 */
41 @Component
42 public class IndexFungorumSpeciesImport extends IndexFungorumImportBase {
43 private static final Logger logger = Logger.getLogger(IndexFungorumSpeciesImport.class);
44
45 private static final String pluralString = "species";
46 private static final String dbTableName = "[tblPESIfungi-IFdata]";
47
48 public IndexFungorumSpeciesImport(){
49 super(pluralString, dbTableName, null);
50 }
51
52
53
54
55 @Override
56 protected String getIdQuery() {
57 String result = " SELECT RECORD_NUMBER FROM " + getTableName() +
58 " ORDER BY PreferredName ";
59 return result;
60 }
61
62
63
64
65 /* (non-Javadoc)
66 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
67 */
68 @Override
69 protected String getRecordQuery(IndexFungorumImportConfigurator config) {
70 String strRecordQuery =
71 " SELECT DISTINCT distribution.PreferredNameFDCnumber, species.* " +
72 " FROM tblPESIfungi AS distribution RIGHT OUTER JOIN dbo.[tblPESIfungi-IFdata] AS species ON distribution.PreferredNameIFnumber = species.RECORD_NUMBER " +
73 " WHERE ( species.RECORD_NUMBER IN (" + ID_LIST_TOKEN + ") )" +
74 "";
75 return strRecordQuery;
76 }
77
78
79 @Override
80 public boolean doPartition(ResultSetPartitioner partitioner, IndexFungorumImportState state) {
81 boolean success = true;
82 Reference<?> sourceReference = state.getRelatedObject(NAMESPACE_REFERENCE, SOURCE_REFERENCE, Reference.class);
83 ResultSet rs = partitioner.getResultSet();
84
85 Classification classification = getClassification(state);
86 try {
87 while (rs.next()){
88
89 //TODO
90 //DisplayName, NomRefCache
91
92 Integer id = (Integer)rs.getObject("RECORD_NUMBER");
93
94 String preferredName = rs.getString("PreferredName");
95 if (StringUtils.isBlank(preferredName)){
96 logger.warn("Preferred name is blank. This case is not yet handled by IF import. RECORD_NUMBER" + CdmUtils.Nz(id));
97 }
98
99 Rank rank = Rank.SPECIES();
100
101 NonViralNameParserImpl parser = NonViralNameParserImpl.NewInstance();
102 NonViralName<?> name = parser.parseSimpleName(preferredName, NomenclaturalCode.ICBN, rank);
103
104 Taxon taxon = Taxon.NewInstance(name, sourceReference);
105 Taxon parent = getParentTaxon(state, rs);
106 classification.addParentChild(parent, taxon, null, null);
107
108 //author + publication
109 makeAuthorAndPublication(state, rs, name);
110 //source
111 makeSource(state, taxon, id, NAMESPACE_SPECIES );
112
113 getTaxonService().saveOrUpdate(taxon);
114 }
115
116
117 } catch (Exception e) {
118 e.printStackTrace();
119 logger.error(e.getMessage());
120 state.setSuccess(false);
121 success = false;
122 }
123 return success;
124 }
125
126
127 private Taxon getParentTaxon(IndexFungorumImportState state, ResultSet rs) throws SQLException {
128 Integer genusId = rs.getInt("PreferredNameFDCnumber");
129
130 Taxon taxon = state.getRelatedObject(NAMESPACE_GENERA, String.valueOf(genusId), Taxon.class);
131 if (taxon == null){
132 logger.warn("Taxon not found for " + genusId);
133 }
134 return taxon;
135 }
136
137 /* (non-Javadoc)
138 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
139 */
140 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
141 String nameSpace;
142 Class cdmClass;
143 Set<String> idSet;
144 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
145
146 try{
147 Set<String> taxonIdSet = new HashSet<String>();
148 while (rs.next()){
149 handleForeignKey(rs, taxonIdSet,"PreferredNameFDCnumber" );
150 }
151
152 //taxon map
153 nameSpace = NAMESPACE_GENERA;
154 cdmClass = TaxonBase.class;
155 idSet = taxonIdSet;
156 Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
157 result.put(nameSpace, taxonMap);
158
159 //sourceReference
160 Reference<?> sourceReference = getReferenceService().find(PesiTransformer.uuidSourceRefIndexFungorum);
161 Map<String, Reference> referenceMap = new HashMap<String, Reference>();
162 referenceMap.put(SOURCE_REFERENCE, sourceReference);
163 result.put(NAMESPACE_REFERENCE, referenceMap);
164
165 } catch (SQLException e) {
166 throw new RuntimeException(e);
167 }
168 return result;
169 }
170
171
172
173 /* (non-Javadoc)
174 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
175 */
176 @Override
177 protected boolean doCheck(IndexFungorumImportState state){
178 return true;
179 }
180
181 /* (non-Javadoc)
182 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
183 */
184 protected boolean isIgnore(IndexFungorumImportState state){
185 return ! state.getConfig().isDoTaxa();
186 }
187
188
189
190
191
192 }