1
2
3
4
5
6
7
8
9
10 package eu.etaxonomy.cdm.io.berlinModel.in;
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.berlinModel.BerlinModelTransformer;
23 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelTypesImportValidator;
24 import eu.etaxonomy.cdm.io.common.IOValidator;
25 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
26 import eu.etaxonomy.cdm.io.common.Source;
27 import eu.etaxonomy.cdm.model.agent.Person;
28 import eu.etaxonomy.cdm.model.common.Annotation;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.common.Language;
31 import eu.etaxonomy.cdm.model.media.ImageFile;
32 import eu.etaxonomy.cdm.model.media.Media;
33 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignation;
34 import eu.etaxonomy.cdm.model.name.SpecimenTypeDesignationStatus;
35 import eu.etaxonomy.cdm.model.name.TaxonNameBase;
36 import eu.etaxonomy.cdm.model.occurrence.Specimen;
37 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
38 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
39
40
41
42
43
44
45 @Component
46 public class BerlinModelTypesImport extends BerlinModelImportBase
47 private static final Logger logger = Logger.getLogger(BerlinModelTypesImport.class);
48
49 private static int modCount = 10000;
50 private static final String pluralString = "types";
51 private static final String dbTableName = "TypeDesignation";
52
53
54 public BerlinModelTypesImport(){
55 super();
56 }
57
58
59
60
61
62 @Override
63 protected String getRecordQuery(BerlinModelImportConfigurator config) {
64 String strRecordQuery =
65 " SELECT TypeDesignation.*, TypeStatus.Status " +
66 " FROM TypeDesignation LEFT OUTER JOIN " +
67 " TypeStatus ON TypeDesignation.TypeStatusFk = TypeStatus.TypeStatusId " +
68 " WHERE (TypeDesignationId IN ("+ ID_LIST_TOKEN + ") )";
69 return strRecordQuery;
70 }
71
72
73
74
75 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
76 boolean result = true;
77 Set<TaxonNameBase> namesToSave = new HashSet<TaxonNameBase>();
78 Map<Integer, Specimen> typeMap = new HashMap<Integer, Specimen>();
79
80 Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
81 Map<String, ReferenceBase> biblioRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE);
82 Map<String, ReferenceBase> nomRefMap = partitioner.getObjectMap(BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE);
83
84 BerlinModelImportConfigurator config = state.getConfig();
85 Source source = config.getSource();
86
87 ResultSet rs = partitioner.getResultSet();
88
89 try {
90
91 int i = 0;
92
93 while (rs.next()){
94
95 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("Types handled: " + (i-1));}
96
97 int typeDesignationId = rs.getInt("typeDesignationId");
98 int nameId = rs.getInt("nameFk");
99 int typeStatusFk = rs.getInt("typeStatusFk");
100 Object refFkObj = rs.getObject("refFk");
101 String refDetail = rs.getString("refDetail");
102 String status = rs.getString("Status");
103 String typePhrase = rs.getString("typePhrase");
104 String notes = rs.getString("notes");
105
106
107 boolean isNotDesignated = false;
108
109
110
111
112
113
114
115 TaxonNameBase<?,?> taxonNameBase = nameMap.get(String.valueOf(nameId));
116
117 if (taxonNameBase != null){
118 try{
119 SpecimenTypeDesignationStatus typeDesignationStatus = BerlinModelTransformer.typeStatusId2TypeStatus(typeStatusFk);
120 ReferenceBase<?> citation = null;
121 if (refFkObj != null){
122 String relRefFk = String.valueOf(refFkObj);
123
124 citation = getReferenceOnlyFromMaps(biblioRefMap, nomRefMap, relRefFk);
125 }
126
127 Specimen specimen = Specimen.NewInstance();
128 specimen.addDefinition(typePhrase, Language.DEFAULT());
129 if (typePhrase.length()> 255){
130 typePhrase = typePhrase.substring(0, 255);
131 }
132 specimen.setTitleCache(typePhrase, true);
133 boolean addToAllNames = true;
134 String originalNameString = null;
135 SpecimenTypeDesignation type = taxonNameBase.addSpecimenTypeDesignation(specimen, typeDesignationStatus, citation, refDetail, originalNameString, isNotDesignated, addToAllNames);
136 this.doNotes(type, notes);
137
138 typeMap.put(typeDesignationId, specimen);
139 namesToSave.add(taxonNameBase);
140
141 }catch (UnknownCdmTypeException e) {
142 logger.warn("TypeStatus '" + status + "' not yet implemented");
143 result = false;
144 }
145 }else{
146
147 logger.warn("TaxonName for TypeDesignation " + typeDesignationId + " does not exist in store");
148 result = false;
149 }
150
151 }
152
153 result &= makeFigures(typeMap, source);
154 logger.info("Names to save: " + namesToSave.size());
155 getNameService().save(namesToSave);
156 return result;
157 } catch (SQLException e) {
158 logger.error("SQLException:" + e);
159 return false;
160 }
161 }
162
163
164
165
166 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
167 String nameSpace;
168 Class cdmClass;
169 Set<String> idSet;
170 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
171
172 try{
173 Set<String> nameIdSet = new HashSet<String>();
174 Set<String> referenceIdSet = new HashSet<String>();
175 while (rs.next()){
176 handleForeignKey(rs, nameIdSet, "NameFk");
177 handleForeignKey(rs, referenceIdSet, "RefFk");
178 }
179
180
181 nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
182 cdmClass = TaxonNameBase.class;
183 idSet = nameIdSet;
184 Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
185 result.put(nameSpace, objectMap);
186
187
188 nameSpace = BerlinModelReferenceImport.NOM_REFERENCE_NAMESPACE;
189 cdmClass = ReferenceBase.class;
190 idSet = referenceIdSet;
191 Map<String, ReferenceBase> nomReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
192 result.put(nameSpace, nomReferenceMap);
193
194
195 nameSpace = BerlinModelReferenceImport.BIBLIO_REFERENCE_NAMESPACE;
196 cdmClass = ReferenceBase.class;
197 idSet = referenceIdSet;
198 Map<String, ReferenceBase> biblioReferenceMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
199 result.put(nameSpace, biblioReferenceMap);
200
201 } catch (SQLException e) {
202 throw new RuntimeException(e);
203 }
204 return result;
205 }
206
207
208 private static boolean makeFigures(Map<Integer, Specimen> typeMap, Source source){
209 boolean success = true;
210 try {
211
212 String strQuery =
213 " SELECT * " +
214 " FROM TypeFigure " +
215 " WHERE (1=1) ";
216 ResultSet rs = source.getResultSet(strQuery) ;
217
218 int i = 0;
219
220 while (rs.next()){
221
222 if ((i++ % modCount) == 0){ logger.info("TypesFigures handled: " + (i-1));}
223
224 Integer typeFigureId = rs.getInt("typeFigureId");
225 Integer typeDesignationFk = rs.getInt("typeDesignationFk");
226 Integer collectionFk = rs.getInt("collectionFk");
227 String filename = rs.getString("filename");
228 String figurePhrase = rs.getString("figurePhrase");
229
230 String mimeType = null;
231 String suffix = null;
232 Media media = ImageFile.NewMediaInstance(null, null, filename, mimeType, suffix, null, null, null);
233 if (figurePhrase != null) {
234 media.addAnnotation(Annotation.NewDefaultLanguageInstance(figurePhrase));
235 }
236 Specimen typeSpecimen = typeMap.get(typeDesignationFk);
237 if (typeSpecimen != null) {
238 typeSpecimen.addMedia(media);
239 }
240
241
242
243
244
245
246
247
248
249
250 }
251 } catch (SQLException e) {
252 logger.error("SQLException:" + e);
253 return false;
254 }
255
256 return success;
257 }
258
259
260
261
262 @Override
263 protected boolean doCheck(BerlinModelImportState state){
264 IOValidator<BerlinModelImportState> validator = new BerlinModelTypesImportValidator();
265 return validator.validate(state);
266 }
267
268
269
270
271
272 @Override
273 protected String getTableName() {
274 return dbTableName;
275 }
276
277
278
279
280 @Override
281 public String getPluralString() {
282 return pluralString;
283 }
284
285
286
287
288 protected boolean isIgnore(BerlinModelImportState state){
289 return ! state.getConfig().isDoTypes();
290 }
291
292 }