2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
10 package eu
.etaxonomy
.cdm
.io
.berlinModel
.in
;
12 import java
.sql
.ResultSet
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
19 import org
.apache
.commons
.lang
.StringUtils
;
20 import org
.apache
.log4j
.Logger
;
21 import org
.springframework
.stereotype
.Component
;
23 import eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
;
24 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelNameStatusImportValidator
;
25 import eu
.etaxonomy
.cdm
.io
.common
.IImportConfigurator
;
26 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
27 import eu
.etaxonomy
.cdm
.io
.common
.ImportHelper
;
28 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
29 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
30 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
31 import eu
.etaxonomy
.cdm
.model
.common
.Marker
;
32 import eu
.etaxonomy
.cdm
.model
.common
.MarkerType
;
33 import eu
.etaxonomy
.cdm
.model
.name
.NomenclaturalStatus
;
34 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
35 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
36 import eu
.etaxonomy
.cdm
.strategy
.exceptions
.UnknownCdmTypeException
;
44 public class BerlinModelNameStatusImport
extends BerlinModelImportBase
{
45 private static final Logger logger
= Logger
.getLogger(BerlinModelNameStatusImport
.class);
47 private int modCount
= 5000;
48 private static final String pluralString
= "nomenclatural status";
49 private static final String dbTableName
= "NomStatusRel";
52 public BerlinModelNameStatusImport(){
53 super(dbTableName
, pluralString
);
59 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
62 protected String
getIdQuery(BerlinModelImportState state
) {
63 String result
= " SELECT RIdentifier FROM " + getTableName();
65 if (StringUtils
.isNotEmpty(state
.getConfig().getNameIdTable())){
66 result
+= " WHERE nameFk IN (SELECT NameId FROM " + state
.getConfig().getNameIdTable() + ")";
74 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
77 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
79 " SELECT NomStatusRel.*, NomStatus.NomStatus, RefDetail.Details " +
80 " FROM NomStatusRel INNER JOIN " +
81 " NomStatus ON NomStatusRel.NomStatusFk = NomStatus.NomStatusId " +
82 " LEFT OUTER JOIN RefDetail ON NomStatusRel.NomStatusRefDetailFk = RefDetail.RefDetailId AND " +
83 " NomStatusRel.NomStatusRefFk = RefDetail.RefFk " +
84 " WHERE (RIdentifier IN (" + ID_LIST_TOKEN
+ "))";
89 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
91 public boolean doPartition(ResultSetPartitioner partitioner
,BerlinModelImportState state
) {
92 boolean success
= true;
96 Set
<TaxonNameBase
> namesToSave
= new HashSet
<TaxonNameBase
>();
97 BerlinModelImportConfigurator config
= state
.getConfig();
98 Map
<String
, TaxonNameBase
> nameMap
= (Map
<String
, TaxonNameBase
>) partitioner
.getObjectMap(BerlinModelTaxonNameImport
.NAMESPACE
);
100 ResultSet rs
= partitioner
.getResultSet();
102 //get data from database
108 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("NomStatus handled: " + (i
-1));}
112 nomStatusRelId
= rs
.getInt("RIdentifier");
113 } catch (Exception e
) { //RIdentifier does not exist in BM database
116 int nomStatusFk
= rs
.getInt("NomStatusFk");
117 int nameId
= rs
.getInt("nameFk");
119 boolean doubtful
= rs
.getBoolean("DoubtfulFlag");
120 String nomStatusLabel
= rs
.getString("NomStatus");
122 TaxonNameBase taxonName
= nameMap
.get(String
.valueOf(nameId
));
125 if (taxonName
!= null ){
127 NomenclaturalStatus nomStatus
= BerlinModelTransformer
.nomStatusFkToNomStatus(nomStatusFk
, nomStatusLabel
);
128 if (nomStatus
== null){
129 String message
= "Nomenclatural status could not be defined for %s ; %s";
130 message
= String
.format(message
, nomStatusFk
, nomStatusLabel
);
131 logger
.warn(message
);
135 if (nomStatus
.getType() == null){
136 String message
= "Nomenclatural status type could not be defined for %s ; %s";
137 message
= String
.format(message
, nomStatusFk
, nomStatusLabel
);
138 logger
.warn(message
);
141 }else if(nomStatus
.getType().getId() == 0){
142 getTermService().save(nomStatus
.getType());
147 makeReference(config
, nomStatus
, nameId
, rs
, partitioner
);
150 dbAttrName
= "details";
151 cdmAttrName
= "citationMicroReference";
152 success
&= ImportHelper
.addStringValue(rs
, nomStatus
, dbAttrName
, cdmAttrName
, true);
156 nomStatus
.addMarker(Marker
.NewInstance(MarkerType
.IS_DOUBTFUL(), true));
158 taxonName
.addStatus(nomStatus
);
159 namesToSave
.add(taxonName
);
160 }catch (UnknownCdmTypeException e
) {
161 logger
.warn("NomStatusType " + nomStatusFk
+ " not yet implemented");
168 logger
.warn("TaxonName for NomStatusRel (" + nomStatusRelId
+ ") does not exist in store");
172 logger
.info("TaxonNames to save: " + namesToSave
.size());
173 getNameService().save(namesToSave
);
176 } catch (SQLException e
) {
177 logger
.error("SQLException:" + e
);
184 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
186 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
190 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
193 Set
<String
> nameIdSet
= new HashSet
<String
>();
194 Set
<String
> referenceIdSet
= new HashSet
<String
>();
195 Set
<String
> refDetailIdSet
= new HashSet
<String
>();
197 handleForeignKey(rs
, nameIdSet
, "nameFk");
198 handleForeignKey(rs
, referenceIdSet
, "NomStatusRefFk");
199 handleForeignKey(rs
, refDetailIdSet
, "NomStatusRefDetailFk");
203 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
204 cdmClass
= TaxonNameBase
.class;
206 Map
<String
, Person
> nameMap
= (Map
<String
, Person
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
207 result
.put(nameSpace
, nameMap
);
210 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
211 cdmClass
= Reference
.class;
212 idSet
= referenceIdSet
;
213 Map
<String
, Reference
> referenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
214 result
.put(nameSpace
, referenceMap
);
217 nameSpace
= BerlinModelRefDetailImport
.REFDETAIL_NAMESPACE
;
218 cdmClass
= Reference
.class;
219 idSet
= refDetailIdSet
;
220 Map
<String
, Reference
> refDetailMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
221 result
.put(nameSpace
, refDetailMap
);
223 } catch (SQLException e
) {
224 throw new RuntimeException(e
);
229 private boolean makeReference(IImportConfigurator config
, NomenclaturalStatus nomStatus
,
230 int nameId
, ResultSet rs
, ResultSetPartitioner partitioner
)
233 Map
<String
, Reference
> refMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
234 Map
<String
, Reference
> refDetailMap
= partitioner
.getObjectMap(BerlinModelRefDetailImport
.REFDETAIL_NAMESPACE
);
236 Object nomRefFkObj
= rs
.getObject("NomStatusRefFk");
237 Object nomRefDetailFkObj
= rs
.getObject("NomStatusRefDetailFk");
239 // boolean refDetailPrelim = rs.getBoolean("RefDetailPrelim");
241 boolean success
= true;
242 //nomenclatural Reference
244 if (nomRefFkObj
!= null){
245 String nomRefFk
= String
.valueOf(nomRefFkObj
);
246 String nomRefDetailFk
= String
.valueOf(nomRefDetailFkObj
);
247 Reference
<?
> ref
= getReferenceFromMaps(refDetailMap
, refMap
, nomRefDetailFk
, nomRefFk
);
252 if (! config
.isIgnoreNull()){logger
.warn("Reference (refFk = " + nomRefFk
+ ") for NomStatus of TaxonName (nameId = " + nameId
+ ")"+
253 " was not found in reference store. Nomenclatural status reference was not set!!");}
255 nomStatus
.setCitation(ref
);
263 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
266 protected boolean doCheck(BerlinModelImportState state
){
267 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelNameStatusImportValidator();
268 return validator
.validate(state
);
273 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
275 protected boolean isIgnore(BerlinModelImportState state
){
276 return ! state
.getConfig().isDoNameStatus();