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
.common
.OriginalSourceType
;
30 import eu
.etaxonomy
.cdm
.model
.occurrence
.Collection
;
31 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
39 public class AlgaTerraCollectionImport
extends BerlinModelImportBase
{
40 private static final Logger logger
= Logger
.getLogger(AlgaTerraCollectionImport
.class);
43 private static int modCount
= 5000;
44 private static final String pluralString
= "collections";
45 private static final String dbTableName
= "Collection"; //??
47 public static final String NAMESPACE_COLLECTION
= "Collection";
48 public static final String NAMESPACE_SUBCOLLECTION
= "Collection (Subcollection)";
51 public AlgaTerraCollectionImport(){
52 super(dbTableName
, pluralString
);
57 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
60 protected String
getIdQuery(BerlinModelImportState state
) {
61 String result
= " SELECT CollectionId " +
63 + " ORDER BY partOfFk, c.CollectionId ";
68 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
71 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
73 " SELECT CollectionId, Name, Town, IHCode, Subcollection, partOfFk, TDWGGazetteerFk, Address, CultCollFlag, " +
74 " Created_When, Updated_When, Created_Who, Updated_Who, Notes " +
75 " FROM Collection c " +
76 " WHERE c.CollectionId IN (" + ID_LIST_TOKEN
+ ") "
77 + " ORDER BY partOfFk, c.CollectionId "
83 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
85 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState bmState
) {
86 boolean success
= true;
88 AlgaTerraImportState state
= (AlgaTerraImportState
)bmState
;
89 Set
<Collection
> collectionsToSave
= new HashSet
<Collection
>();
92 Map
<String
, Collection
> collectionMap
= (Map
<String
, Collection
>) partitioner
.getObjectMap(NAMESPACE_COLLECTION
);
95 ResultSet rs
= partitioner
.getResultSet();
104 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info(pluralString
+ " handled: " + (i
-1));}
106 int collectionId
= rs
.getInt("CollectionId");
107 String name
= rs
.getString("Name");
108 String town
= rs
.getString("Town");
109 String ihCode
= rs
.getString("IHCode");
110 String subCollectionStr
= rs
.getString("Subcollection");
111 Integer partOfFk
= nullSafeInt(rs
, "PartOfFk");
113 // Integer tdwgArea = nullSafeInt(rs, "TDWGGazetteerFk"); //somehow redundant with town
114 // String address = rs.getString("Address"); //only available for BGBM
115 // Boolean cultCollFlag = rs.getBoolean("CultCollFlag"); //?? not really needed according to Henning
117 //TODO createdUpdates, NOtes
122 Reference
<?
> sourceRef
= state
.getTransactionalSourceReference();
126 Collection collection
;
127 if (partOfFk
== null){
128 collection
= makeCollection(collectionsToSave
,
129 collectionId
, name
, town
, ihCode
, sourceRef
, NAMESPACE_COLLECTION
, collectionMap
);
131 collection
= collectionMap
.get(String
.valueOf(partOfFk
));
132 if (collection
== null){
133 logger
.warn("PartOf collection not found");
139 if (isNotBlank(subCollectionStr
)){
140 Collection subCollection
= makeCollection(collectionsToSave
, collectionId
, subCollectionStr
, town
, ihCode
, sourceRef
, NAMESPACE_SUBCOLLECTION
, collectionMap
);
141 subCollection
.setSuperCollection(collection
);
145 //TODO movedToFk (extension ??)
148 } catch (Exception e
) {
149 logger
.warn("Exception in collection: CollectionId " + collectionId
+ ". " + e
.getMessage());
150 // e.printStackTrace();
155 logger
.warn(pluralString
+ " to save: " + collectionsToSave
.size());
156 getCollectionService().save(collectionsToSave
);
159 } catch (SQLException e
) {
160 logger
.error("SQLException:" + e
);
168 * @param collectionsToSave
169 * @param collectionId
174 * @param collectionMap
177 private Collection
makeCollection(Set
<Collection
> collectionsToSave
, int collectionId
,
178 String name
, String town
, String ihCode
, Reference
<?
> sourceRef
, String namespace
, Map
<String
, Collection
> collectionMap
) {
179 Collection collection
= Collection
.NewInstance();
180 collection
.setName(name
);
181 if (isNotBlank(ihCode
) && ! "--".equals(ihCode
)){
182 collection
.setCode(ihCode
);
183 collection
.setCodeStandard("Index Herbariorum");
186 collection
.setTownOrLocation(town
);
187 collection
.addSource(OriginalSourceType
.Import
, String
.valueOf(collectionId
), namespace
, sourceRef
, null);
189 collectionMap
.put(String
.valueOf(collectionId
), collection
);
190 collectionsToSave
.add(collection
); //or subcollection ?
198 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
, BerlinModelImportState state
) {
202 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
205 Set
<String
> collectionIdSet
= new HashSet
<String
>();
208 handleForeignKey(rs
, collectionIdSet
, "partOfFk");
212 nameSpace
= NAMESPACE_COLLECTION
;
213 cdmClass
= Collection
.class;
214 idSet
= collectionIdSet
;
215 Map
<String
, Collection
> collectionMap
= (Map
<String
, Collection
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
216 result
.put(nameSpace
, collectionMap
);
219 } catch (SQLException e
) {
220 throw new RuntimeException(e
);
228 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
231 protected boolean doCheck(BerlinModelImportState state
){
232 IOValidator
<BerlinModelImportState
> validator
= new AlgaTerraCollectionImportValidator();
233 return validator
.validate(state
);
237 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
239 protected boolean isIgnore(BerlinModelImportState bmState
){
240 AlgaTerraImportState state
= (AlgaTerraImportState
)bmState
;
241 return ! ( state
.getAlgaTerraConfigurator().isDoEcoFacts() || state
.getAlgaTerraConfigurator().isDoTypes() );