change doSpecimen to doEcoFacts
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraCollectionImport.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.algaterra;
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.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;
33
34
35 /**
36 * @author a.mueller
37 * @created 01.09.2012
38 */
39 @Component
40 public class AlgaTerraCollectionImport extends BerlinModelImportBase {
41 private static final Logger logger = Logger.getLogger(AlgaTerraCollectionImport.class);
42
43
44 private static int modCount = 5000;
45 private static final String pluralString = "collections";
46 private static final String dbTableName = "Collection"; //??
47
48 public static final String NAMESPACE_COLLECTION = "Collection";
49 public static final String NAMESPACE_SUBCOLLECTION = "Collection (Subcollection)";
50
51
52 public AlgaTerraCollectionImport(){
53 super();
54 }
55
56
57
58 /* (non-Javadoc)
59 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
60 */
61 @Override
62 protected String getIdQuery(BerlinModelImportState state) {
63 String result = " SELECT CollectionId " +
64 " FROM Collection c "
65 + " ORDER BY partOfFk, c.CollectionId ";
66 return result;
67 }
68
69 /* (non-Javadoc)
70 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
71 */
72 @Override
73 protected String getRecordQuery(BerlinModelImportConfigurator config) {
74 String strQuery =
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 "
80 ;
81 return strQuery;
82 }
83
84 /* (non-Javadoc)
85 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
86 */
87 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState bmState) {
88 boolean success = true;
89
90 AlgaTerraImportState state = (AlgaTerraImportState)bmState;
91 Set<Collection> collectionsToSave = new HashSet<Collection>();
92
93
94 Map<String, Collection> collectionMap = (Map<String, Collection>) partitioner.getObjectMap(NAMESPACE_COLLECTION);
95
96
97 ResultSet rs = partitioner.getResultSet();
98
99 try {
100
101 int i = 0;
102
103 //for each reference
104 while (rs.next()){
105
106 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info(pluralString + " handled: " + (i-1));}
107
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");
114
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
118
119 //TODO createdUpdates, NOtes
120
121 try {
122
123 //source ref
124 Reference<?> sourceRef = state.getTransactionalSourceReference();
125
126
127 //collection
128 Collection collection;
129 if (partOfFk == null){
130 collection = makeCollection(collectionsToSave,
131 collectionId, name, town, ihCode, sourceRef, NAMESPACE_COLLECTION, collectionMap);
132 }else{
133 collection = collectionMap.get(String.valueOf(partOfFk));
134 if (collection == null){
135 logger.warn("PartOf collection not found");
136 }
137 }
138
139
140 //subcollection
141 if (isNotBlank(subCollectionStr)){
142 Collection subCollection = makeCollection(collectionsToSave, collectionId, subCollectionStr, town, ihCode, sourceRef, NAMESPACE_SUBCOLLECTION, collectionMap);
143 subCollection.setSuperCollection(collection);
144 }
145
146
147 //TODO movedToFk (extension ??)
148
149
150 } catch (Exception e) {
151 logger.warn("Exception in collection: CollectionId " + collectionId + ". " + e.getMessage());
152 // e.printStackTrace();
153 }
154
155 }
156
157 logger.warn(pluralString + " to save: " + collectionsToSave.size());
158 getCollectionService().save(collectionsToSave);
159
160 return success;
161 } catch (SQLException e) {
162 logger.error("SQLException:" + e);
163 return false;
164 }
165 }
166
167
168
169 /**
170 * @param collectionsToSave
171 * @param collectionId
172 * @param name
173 * @param town
174 * @param ihCode
175 * @param sourceRef
176 * @param collectionMap
177 * @return
178 */
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");
186 }
187
188 collection.setTownOrLocation(town);
189 collection.addSource(String.valueOf(collectionId), namespace, sourceRef, null);
190
191 collectionMap.put(String.valueOf(collectionId), collection);
192 collectionsToSave.add(collection); //or subcollection ?
193 return collection;
194 }
195
196
197
198 /* (non-Javadoc)
199 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
200 */
201 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
202 String nameSpace;
203 Class cdmClass;
204 Set<String> idSet;
205 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
206
207 try{
208 Set<String> collectionIdSet = new HashSet<String>();
209
210 while (rs.next()){
211 handleForeignKey(rs, collectionIdSet, "partOfFk");
212 }
213
214 //type specimen map
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);
220
221
222 } catch (SQLException e) {
223 throw new RuntimeException(e);
224 }
225 return result;
226
227 }
228
229
230 /* (non-Javadoc)
231 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
232 */
233 @Override
234 protected boolean doCheck(BerlinModelImportState state){
235 IOValidator<BerlinModelImportState> validator = new AlgaTerraCollectionImportValidator();
236 return validator.validate(state);
237 }
238
239 /* (non-Javadoc)
240 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
241 */
242 @Override
243 protected String getTableName() {
244 return dbTableName;
245 }
246
247 /* (non-Javadoc)
248 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
249 */
250 @Override
251 public String getPluralString() {
252 return pluralString;
253 }
254
255 /* (non-Javadoc)
256 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
257 */
258 protected boolean isIgnore(BerlinModelImportState bmState){
259 AlgaTerraImportState state = (AlgaTerraImportState)bmState;
260 return ! ( state.getAlgaTerraConfigurator().isDoEcoFacts() || state.getAlgaTerraConfigurator().isDoTypes() );
261 }
262
263 }