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