bugfix for picture import
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / io / algaterra / AlgaTerraPictureImport.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.api.facade.DerivedUnitFacade;
23 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;
24 import eu.etaxonomy.cdm.io.algaterra.validation.AlgaTerraTypeImportValidator;
25 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
26 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
27 import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelTaxonImport;
28 import eu.etaxonomy.cdm.io.common.IOValidator;
29 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
30 import eu.etaxonomy.cdm.model.common.CdmBase;
31 import eu.etaxonomy.cdm.model.media.Media;
32 import eu.etaxonomy.cdm.model.occurrence.DerivedUnitBase;
33 import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
34 import eu.etaxonomy.cdm.model.taxon.Taxon;
35 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
36
37
38 /**
39 * Import for AlgaTerra images from table
40 * @author a.mueller
41 * @created 18.01.2013
42 */
43 @Component
44 public class AlgaTerraPictureImport extends AlgaTerraImageImportBase {
45 private static final Logger logger = Logger.getLogger(AlgaTerraPictureImport.class);
46
47
48 private static int modCount = 5000;
49 private static final String pluralString = "pictures";
50 private static final String dbTableName = "Picture"; //??
51
52 public AlgaTerraPictureImport(){
53 super(dbTableName, pluralString);
54 }
55
56
57 /* (non-Javadoc)
58 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
59 */
60 @Override
61 protected String getIdQuery(BerlinModelImportState state) {
62 String result = " SELECT p.PictureId "
63 + " FROM Picture p INNER JOIN Fact f ON p.PictureId = f.ExtensionFk LEFT OUTER JOIN PTaxon pt ON f.PTNameFk = pt.PTNameFk AND f.PTRefFk = pt.PTRefFk "
64 + " WHERE f.FactCategoryFk = 205 AND p.RestrictedFlag = 0 "
65 + " ORDER BY p.PictureId ";
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
76 " SELECT p.*, f.*, pt.RIdentifier, p.PicturePhrase as FigurePhrase, p.PictureFile as fileName, p.PicturePath as filePath " +
77 " FROM Picture p INNER JOIN Fact f ON p.PictureId = f.ExtensionFk LEFT OUTER JOIN PTaxon pt ON f.PTNameFk = pt.PTNameFk AND f.PTRefFk = pt.PTRefFk "
78 + " WHERE f.FactCategoryFk = 205 AND ( p.PictureID IN (" + ID_LIST_TOKEN + ") )"
79 + " ORDER BY p.PictureId, f.factId, pt.RIdentifier ";
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
92 // Set<SpecimenOrObservationBase> specimenToSave = new HashSet<SpecimenOrObservationBase>();
93 Set<TaxonBase> taxaToSave = new HashSet<TaxonBase>();
94
95 // Map<String, DerivedUnitBase> ecoFactMap = (Map<String, DerivedUnitBase>) partitioner.getObjectMap(AlgaTerraSpecimenImportBase.ECO_FACT_DERIVED_UNIT_NAMESPACE);
96 Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) partitioner.getObjectMap(BerlinModelTaxonImport.NAMESPACE);
97 Map<String, DerivedUnitBase<?>> specimenMap = (Map<String, DerivedUnitBase<?>>) partitioner.getObjectMap(AlgaTerraFactEcologyImport.FACT_ECOLOGY_NAMESPACE);
98
99 ResultSet rs = partitioner.getResultSet();
100
101 try {
102
103 int i = 0;
104
105 //for each reference
106 while (rs.next()){
107
108 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info(pluralString + " handled: " + (i-1));}
109
110 int pictureId = rs.getInt("PictureID");
111 int taxonId = rs.getInt("RIdentifier");
112 int factId = rs.getInt("FactId");
113
114
115 //TODO etc. Created, Notes, Copyright, TermsOfUse etc.
116
117 try {
118
119 TaxonBase<?> taxonBase = taxonMap.get(String.valueOf(taxonId));
120 if (taxonBase == null){
121 logger.warn("Could not find taxon (" + taxonId +") for picture fact " + factId);
122 }else if (! taxonBase.isInstanceOf(Taxon.class)){
123 logger.warn("Taxon is not of class Taxon but " + taxonBase.getClass() + ". RIdentifier: " + taxonId + " PictureId: " + pictureId + ", FactId: "+ factId);
124
125 }else{
126 Taxon taxon = CdmBase.deproxy(taxonBase, Taxon.class);
127
128 Media media = handleSingleImage(rs, taxon, state, partitioner);
129
130 handlePictureSpecificFields(rs, media, state, specimenMap);
131
132 taxaToSave.add(taxon);
133 }
134
135
136 } catch (Exception e) {
137 logger.warn("Exception in " + getTableName() + ": PictureId " + pictureId + ". " + e.getMessage());
138 e.printStackTrace();
139 }
140
141 }
142
143 // logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
144
145 logger.warn(pluralString + " to save: " + taxaToSave.size());
146 // getOccurrenceService().save(taxaToSave);
147 getTaxonService().save(taxaToSave);
148
149 return success;
150 } catch (SQLException e) {
151 logger.error("SQLException:" + e);
152 return false;
153 }
154 }
155
156
157
158 private void handlePictureSpecificFields(ResultSet rs, Media media, AlgaTerraImportState state, Map<String, DerivedUnitBase<?>> specimenMap) throws SQLException {
159 Integer specimenFactId = nullSafeInt(rs, "FactFk");
160 if (specimenFactId != null){
161 DerivedUnitBase<?> specimen = specimenMap.get(String.valueOf(specimenFactId));
162 if (specimen == null){
163 logger.warn("Specimen not found for FactFK: " + specimenFactId);
164 }else{
165 try {
166 DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(specimen);
167 facade.addDerivedUnitMedia(media);
168 getOccurrenceService().saveOrUpdate(specimen);
169 } catch (DerivedUnitFacadeNotSupportedException e) {
170 e.printStackTrace();
171 logger.error(e.getMessage());
172 }
173 }
174 }
175
176 }
177
178
179 /* (non-Javadoc)
180 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
181 */
182 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
183 String nameSpace;
184 Class cdmClass;
185 Set<String> idSet;
186 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
187
188 try{
189 Set<String> taxonIdSet = new HashSet<String>();
190 Set<String> specimenIdSet = new HashSet<String>();
191
192 while (rs.next()){
193 handleForeignKey(rs, taxonIdSet, "RIdentifier");
194 handleForeignKey(rs, specimenIdSet, "FactFk");
195 }
196
197 //taxon map
198 nameSpace = BerlinModelTaxonImport.NAMESPACE;
199 cdmClass = TaxonBase.class;
200 idSet = taxonIdSet;
201 Map<String, TaxonBase> taxonMap = (Map<String,TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
202 result.put(nameSpace, taxonMap);
203
204 //fact specimen map
205 nameSpace = AlgaTerraFactEcologyImport.FACT_ECOLOGY_NAMESPACE;
206 cdmClass = SpecimenOrObservationBase.class;
207 idSet = specimenIdSet;
208 Map<String, SpecimenOrObservationBase> specimenMap = (Map<String,SpecimenOrObservationBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
209 result.put(nameSpace, specimenMap);
210
211
212 } catch (SQLException e) {
213 throw new RuntimeException(e);
214 }
215 return result;
216 }
217
218
219
220
221 /* (non-Javadoc)
222 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
223 */
224 @Override
225 protected boolean doCheck(BerlinModelImportState state){
226 IOValidator<BerlinModelImportState> validator = new AlgaTerraTypeImportValidator();
227 return validator.validate(state);
228 }
229
230 /* (non-Javadoc)
231 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
232 */
233 protected boolean isIgnore(BerlinModelImportState bmState){
234 AlgaTerraImportConfigurator config = ((AlgaTerraImportState) bmState).getAlgaTerraConfigurator();
235 return ! ( config.isDoTypes() && config.isDoImages()) ;
236 }
237
238 }