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
.algaterra
;
12 import java
.sql
.ResultSet
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
15 import java
.util
.HashSet
;
19 import org
.apache
.log4j
.Logger
;
20 import org
.springframework
.stereotype
.Component
;
22 import eu
.etaxonomy
.cdm
.io
.algaterra
.validation
.AlgaTerraCollectionImportValidator
;
23 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.BerlinModelImportBase
;
24 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.BerlinModelImportConfigurator
;
25 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.BerlinModelImportState
;
26 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
27 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
28 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.DerivedUnit
;
31 import eu
.etaxonomy
.cdm
.model
.occurrence
.SpecimenOrObservationBase
;
32 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
40 public class AlgaTerraCollectionImport
extends BerlinModelImportBase
{
41 private static final Logger logger
= Logger
.getLogger(AlgaTerraCollectionImport
.class);
44 private static int modCount
= 5000;
45 private static final String pluralString
= "collections";
46 private static final String dbTableName
= "Collection"; //??
48 public static final String NAMESPACE_COLLECTION
= "Collection";
49 public static final String NAMESPACE_SUBCOLLECTION
= "Collection (Subcollection)";
52 public AlgaTerraCollectionImport(){
59 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
62 protected String
getIdQuery(BerlinModelImportState state
) {
63 String result
= " SELECT CollectionId " +
65 + " ORDER BY partOfFk, c.CollectionId ";
70 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
73 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
75 " SELECT CollectionId, Name, Town, IHCode, Subcollection, partOfFk, TDWGGazetteerFk, Address, CultCollFlag, " +
76 " Created_When, Updated_When, Created_Who, Updated_Who, Notes " +
77 " FROM Collection c " +
78 " WHERE c.CollectionId IN (" + ID_LIST_TOKEN
+ ") "
79 + " ORDER BY partOfFk, c.CollectionId "
85 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
87 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState bmState
) {
88 boolean success
= true;
90 AlgaTerraImportState state
= (AlgaTerraImportState
)bmState
;
91 Set
<Collection
> collectionsToSave
= new HashSet
<Collection
>();
94 Map
<String
, Collection
> collectionMap
= (Map
<String
, Collection
>) partitioner
.getObjectMap(NAMESPACE_COLLECTION
);
97 ResultSet rs
= partitioner
.getResultSet();
106 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info(pluralString
+ " handled: " + (i
-1));}
108 int collectionId
= rs
.getInt("CollectionId");
109 String name
= rs
.getString("Name");
110 String town
= rs
.getString("Town");
111 String ihCode
= rs
.getString("IHCode");
112 String subCollectionStr
= rs
.getString("Subcollection");
113 Integer partOfFk
= nullSafeInt(rs
, "PartOfFk");
115 // Integer tdwgArea = nullSafeInt(rs, "TDWGGazetteerFk"); //somehow redundant with town
116 // String address = rs.getString("Address"); //only available for BGBM
117 // Boolean cultCollFlag = rs.getBoolean("CultCollFlag"); //?? not really needed according to Henning
119 //TODO createdUpdates, NOtes
124 Reference
<?
> sourceRef
= state
.getTransactionalSourceReference();
128 Collection collection
;
129 if (partOfFk
== null){
130 collection
= makeCollection(collectionsToSave
,
131 collectionId
, name
, town
, ihCode
, sourceRef
, NAMESPACE_COLLECTION
, collectionMap
);
133 collection
= collectionMap
.get(String
.valueOf(partOfFk
));
134 if (collection
== null){
135 logger
.warn("PartOf collection not found");
141 if (isNotBlank(subCollectionStr
)){
142 Collection subCollection
= makeCollection(collectionsToSave
, collectionId
, subCollectionStr
, town
, ihCode
, sourceRef
, NAMESPACE_SUBCOLLECTION
, collectionMap
);
143 subCollection
.setSuperCollection(collection
);
147 //TODO movedToFk (extension ??)
150 } catch (Exception e
) {
151 logger
.warn("Exception in collection: CollectionId " + collectionId
+ ". " + e
.getMessage());
152 // e.printStackTrace();
157 logger
.warn(pluralString
+ " to save: " + collectionsToSave
.size());
158 getCollectionService().save(collectionsToSave
);
161 } catch (SQLException e
) {
162 logger
.error("SQLException:" + e
);
170 * @param collectionsToSave
171 * @param collectionId
176 * @param collectionMap
179 private Collection
makeCollection(Set
<Collection
> collectionsToSave
, int collectionId
,
180 String name
, String town
, String ihCode
, Reference
<?
> sourceRef
, String namespace
, Map
<String
, Collection
> collectionMap
) {
181 Collection collection
= Collection
.NewInstance();
182 collection
.setName(name
);
183 if (isNotBlank(ihCode
)){
184 collection
.setCode(ihCode
);
185 collection
.setCodeStandard("Index Herbariorum");
188 collection
.setTownOrLocation(town
);
189 collection
.addSource(String
.valueOf(collectionId
), namespace
, sourceRef
, null);
191 collectionMap
.put(String
.valueOf(collectionId
), collection
);
192 collectionsToSave
.add(collection
); //or subcollection ?
199 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
201 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
205 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
208 Set
<String
> collectionIdSet
= new HashSet
<String
>();
211 handleForeignKey(rs
, collectionIdSet
, "partOfFk");
215 nameSpace
= NAMESPACE_COLLECTION
;
216 cdmClass
= Collection
.class;
217 idSet
= collectionIdSet
;
218 Map
<String
, Collection
> collectionMap
= (Map
<String
, Collection
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
219 result
.put(nameSpace
, collectionMap
);
222 } catch (SQLException e
) {
223 throw new RuntimeException(e
);
231 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
234 protected boolean doCheck(BerlinModelImportState state
){
235 IOValidator
<BerlinModelImportState
> validator
= new AlgaTerraCollectionImportValidator();
236 return validator
.validate(state
);
240 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
243 protected String
getTableName() {
248 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
251 public String
getPluralString() {
256 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
258 protected boolean isIgnore(BerlinModelImportState bmState
){
259 AlgaTerraImportState state
= (AlgaTerraImportState
)bmState
;
260 return ! ( state
.getAlgaTerraConfigurator().isDoEcoFacts() || state
.getAlgaTerraConfigurator().isDoTypes() );