1
2
3
4
5
6
7
8
9
10 package eu.etaxonomy.cdm.io.berlinModel.in;
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.log4j.Logger;
20 import org.springframework.stereotype.Component;
21
22 import eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer;
23 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelNameStatusImportValidator;
24 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
25 import eu.etaxonomy.cdm.io.common.IOValidator;
26 import eu.etaxonomy.cdm.io.common.ImportHelper;
27 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
28 import eu.etaxonomy.cdm.model.agent.Person;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.common.Marker;
31 import eu.etaxonomy.cdm.model.common.MarkerType;
32 import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
33 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
34 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
35 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
36
37
38
39
40
41
42 @Component
43 public class BerlinModelNameStatusImport extends BerlinModelImportBase {
44 private static final Logger logger = Logger.getLogger(BerlinModelNameStatusImport.class);
45
46 private int modCount = 5000;
47 private static final String pluralString = "nomenclatural status";
48 private static final String dbTableName = "NomStatusRel";
49
50
51 public BerlinModelNameStatusImport(){
52 super();
53 }
54
55
56
57
58
59
60 @Override
61 protected String getIdQuery() {
62 return " SELECT RIdentifier FROM " + getTableName();
63 }
64
65
66
67
68
69
70 @Override
71 protected String getRecordQuery(BerlinModelImportConfigurator config) {
72 String strQuery =
73 " SELECT NomStatusRel.*, NomStatus.NomStatus, RefDetail.Details " +
74 " FROM NomStatusRel INNER JOIN " +
75 " NomStatus ON NomStatusRel.NomStatusFk = NomStatus.NomStatusId " +
76 " LEFT OUTER JOIN RefDetail ON NomStatusRel.NomStatusRefDetailFk = RefDetail.RefDetailId AND " +
77 " NomStatusRel.NomStatusRefFk = RefDetail.RefFk " +
78 " WHERE (RIdentifier IN (" + ID_LIST_TOKEN + "))";
79 return strQuery;
80 }
81
82
83
84
85 public boolean doPartition(ResultSetPartitioner partitioner,BerlinModelImportState state) {
86 boolean success = true;
87 String dbAttrName;
88 String cdmAttrName;
89
90 Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
91 BerlinModelImportConfigurator config = state.getConfig();
92 Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
93
94 ResultSet rs = partitioner.getResultSet();
95 try {
96
97
98 int i = 0;
99
100 while (rs.next()){
101
102 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("NomStatus handled: " + (i-1));}
103
104 int nomStatusRelId;
105 try {
106 nomStatusRelId = rs.getInt("RIdentifier");
107 } catch (Exception e) {
108 nomStatusRelId = -1;
109 }
110 int nomStatusFk = rs.getInt("NomStatusFk");
111 int nameId = rs.getInt("nameFk");
112
113 boolean doubtful = rs.getBoolean("DoubtfulFlag");
114 String nomStatusLabel = rs.getString("NomStatus");
115
116 TaxonNameBase taxonName = nameMap.get(String.valueOf(nameId));
117
118
119 if (taxonName != null ){
120 try{
121 NomenclaturalStatus nomStatus = BerlinModelTransformer.nomStatusFkToNomStatus(nomStatusFk, nomStatusLabel);
122 if (nomStatus.getType().getId() == 0){
123 getTermService().save(nomStatus.getType());
124 }
125
126
127 makeReference(config, nomStatus, nameId, rs, partitioner);
128
129
130 dbAttrName = "details";
131 cdmAttrName = "citationMicroReference";
132 success &= ImportHelper.addStringValue(rs, nomStatus, dbAttrName, cdmAttrName);
133
134
135 if (doubtful){
136 nomStatus.addMarker(Marker.NewInstance(MarkerType.IS_DOUBTFUL(), true));
137 }
138 taxonName.addStatus(nomStatus);
139 namesToSave.add(taxonName);
140 }catch (UnknownCdmTypeException e) {
141 logger.warn("NomStatusType " + nomStatusFk + " not yet implemented");
142 success = false;
143 }
144
145
146
147 }else{
148 logger.warn("TaxonName for NomStatus (" + nomStatusRelId + ") does not exist in store");
149 success = false;
150 }
151 }
152 logger.info("TaxonNames to save: " + namesToSave.size());
153 getNameService().save(namesToSave);
154
155 return success;
156 } catch (SQLException e) {
157 logger.error("SQLException:" + e);
158 return false;
159 }
160
161 }
162
163
164
165
166 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
167 String nameSpace;
168 Class cdmClass;
169 Set<String> idSet;
170 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
171
172 try{
173 Set<String> nameIdSet = new HashSet<String>();
174 Set<String> referenceIdSet = new HashSet<String>();
175 Set<String> refDetailIdSet = new HashSet<String>();
176 while (rs.next()){
177 handleForeignKey(rs, nameIdSet, "nameFk");
178 handleForeignKey(rs, referenceIdSet, "NomStatusRefFk");
179 handleForeignKey(rs, refDetailIdSet, "NomStatusRefDetailFk");
180 }
181
182
183 nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
184 cdmClass = TaxonNameBase.class;
185 idSet = nameIdSet;
186 Map<String, Person> nameMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
187 result.put(nameSpace, nameMap);
188
189
190 nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
191 cdmClass = ReferenceBase.class;
192 idSet = referenceIdSet;
193 Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
194 result.put(nameSpace, nomReferenceMap);
195
196
197 nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
198 cdmClass = ReferenceBase.class;
199 idSet = referenceIdSet;
200 Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
201 result.put(nameSpace, biblioReferenceMap);
202
203
204 nameSpace = BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE;
205 cdmClass = ReferenceBase.class;
206 idSet = refDetailIdSet;
207 Map<String, ReferenceBase> nomRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
208 result.put(nameSpace, nomRefDetailMap);
209
210
211 nameSpace = BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE;
212 cdmClass = ReferenceBase.class;
213 idSet = refDetailIdSet;
214 Map<String, ReferenceBase> biblioRefDetailMap= (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
215 result.put(nameSpace, biblioRefDetailMap);
216
217
218 } catch (SQLException e) {
219 throw new RuntimeException(e);
220 }
221 return result;
222 }
223
224 private boolean makeReference(IImportConfigurator config, NomenclaturalStatus nomStatus,
225 int nameId, ResultSet rs, ResultSetPartitioner partitioner)
226 throws SQLException{
227
228 Map<String, ReferenceBase> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
229 Map<String, ReferenceBase> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
230 Map<String, ReferenceBase> biblioDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.BIBLIO_REFDETAIL_NAMESPACE);
231 Map<String, ReferenceBase> nomRefDetailMap = partitioner.getObjectMap(BerlinModelRefDetailImport.NOM_REFDETAIL_NAMESPACE);
232
233 Object nomRefFkObj = rs.getObject("NomStatusRefFk");
234 Object nomRefDetailFkObj = rs.getObject("NomStatusRefDetailFk");
235
236
237
238 boolean success = true;
239
240 if (biblioRefMap != null){
241 if (nomRefFkObj != null){
242 String nomRefFk = String.valueOf(nomRefFkObj);
243 String nomRefDetailFk = String.valueOf(nomRefDetailFkObj);
244 ReferenceBase ref = getReferenceFromMaps(biblioRefMap,
245 nomRefMap, biblioDetailMap, nomRefDetailMap,
246 nomRefDetailFk, nomRefFk);
247
248
249 if (ref == null ){
250
251 if (! config.isIgnoreNull()){logger.warn("Reference (refFk = " + nomRefFk + ") for NomStatus of TaxonName (nameId = " + nameId + ")"+
252 " was not found in reference store. Nomenclatural reference was not set!!");}
253 }else{
254 nomStatus.setCitation(ref);
255 }
256 }
257 }
258 return success;
259 }
260
261
262
263
264
265
266
267 @Override
268 protected boolean doCheck(BerlinModelImportState state){
269 IOValidator<BerlinModelImportState> validator = new BerlinModelNameStatusImportValidator();
270 return validator.validate(state);
271 }
272
273
274
275
276 @Override
277 protected String getTableName() {
278 return dbTableName;
279 }
280
281
282
283
284 @Override
285 public String getPluralString() {
286 return pluralString;
287 }
288
289
290
291
292
293 protected boolean isIgnore(BerlinModelImportState state){
294 return ! state.getConfig().isDoNameStatus();
295 }
296
297
298 }