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
.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
;
39 * Import for AlgaTerra images from table
44 public class AlgaTerraPictureImport
extends AlgaTerraImageImportBase
{
45 private static final Logger logger
= Logger
.getLogger(AlgaTerraPictureImport
.class);
48 private static int modCount
= 5000;
49 private static final String pluralString
= "pictures";
50 private static final String dbTableName
= "Picture"; //??
52 public AlgaTerraPictureImport(){
53 super(dbTableName
, pluralString
);
58 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()
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 ";
70 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
73 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
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 ";
85 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
87 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState bmState
) {
88 boolean success
= true;
90 AlgaTerraImportState state
= (AlgaTerraImportState
)bmState
;
92 // Set<SpecimenOrObservationBase> specimenToSave = new HashSet<SpecimenOrObservationBase>();
93 Set
<TaxonBase
> taxaToSave
= new HashSet
<TaxonBase
>();
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
);
99 ResultSet rs
= partitioner
.getResultSet();
108 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info(pluralString
+ " handled: " + (i
-1));}
110 int pictureId
= rs
.getInt("PictureID");
111 int taxonId
= rs
.getInt("RIdentifier");
112 int factId
= rs
.getInt("FactId");
115 //TODO etc. Created, Notes, Copyright, TermsOfUse etc.
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
);
126 Taxon taxon
= CdmBase
.deproxy(taxonBase
, Taxon
.class);
128 Media media
= handleSingleImage(rs
, taxon
, state
, partitioner
);
130 handlePictureSpecificFields(rs
, media
, state
, specimenMap
);
132 taxaToSave
.add(taxon
);
136 } catch (Exception e
) {
137 logger
.warn("Exception in " + getTableName() + ": PictureId " + pictureId
+ ". " + e
.getMessage());
143 // logger.warn("Specimen: " + countSpecimen + ", Descriptions: " + countDescriptions );
145 logger
.warn(pluralString
+ " to save: " + taxaToSave
.size());
146 // getOccurrenceService().save(taxaToSave);
147 getTaxonService().save(taxaToSave
);
150 } catch (SQLException e
) {
151 logger
.error("SQLException:" + e
);
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
);
166 DerivedUnitFacade facade
= DerivedUnitFacade
.NewInstance(specimen
);
167 facade
.addDerivedUnitMedia(media
);
168 getOccurrenceService().saveOrUpdate(specimen
);
169 } catch (DerivedUnitFacadeNotSupportedException e
) {
171 logger
.error(e
.getMessage());
180 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
182 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
) {
186 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
189 Set
<String
> taxonIdSet
= new HashSet
<String
>();
190 Set
<String
> specimenIdSet
= new HashSet
<String
>();
193 handleForeignKey(rs
, taxonIdSet
, "RIdentifier");
194 handleForeignKey(rs
, specimenIdSet
, "FactFk");
198 nameSpace
= BerlinModelTaxonImport
.NAMESPACE
;
199 cdmClass
= TaxonBase
.class;
201 Map
<String
, TaxonBase
> taxonMap
= (Map
<String
,TaxonBase
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
202 result
.put(nameSpace
, taxonMap
);
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
);
212 } catch (SQLException e
) {
213 throw new RuntimeException(e
);
222 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
225 protected boolean doCheck(BerlinModelImportState state
){
226 IOValidator
<BerlinModelImportState
> validator
= new AlgaTerraTypeImportValidator();
227 return validator
.validate(state
);
231 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
233 protected boolean isIgnore(BerlinModelImportState bmState
){
234 AlgaTerraImportConfigurator config
= ((AlgaTerraImportState
) bmState
).getAlgaTerraConfigurator();
235 return ! ( config
.isDoTypes() && config
.isDoImages()) ;