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
.berlinModel
.in
;
12 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_FACT_ALSO_PUBLISHED_IN
;
13 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_FACT_BIBLIOGRAPHY
;
14 import static eu
.etaxonomy
.cdm
.io
.berlinModel
.BerlinModelTransformer
.NAME_FACT_PROTOLOGUE
;
17 import java
.io
.IOException
;
18 import java
.net
.MalformedURLException
;
20 import java
.net
.URISyntaxException
;
22 import java
.sql
.ResultSet
;
23 import java
.sql
.SQLException
;
24 import java
.util
.HashMap
;
25 import java
.util
.HashSet
;
29 import org
.apache
.commons
.lang
.StringUtils
;
30 import org
.apache
.http
.HttpException
;
31 import org
.apache
.log4j
.Logger
;
32 import org
.springframework
.stereotype
.Component
;
34 import eu
.etaxonomy
.cdm
.common
.CdmUtils
;
35 import eu
.etaxonomy
.cdm
.common
.media
.ImageInfo
;
36 import eu
.etaxonomy
.cdm
.io
.berlinModel
.in
.validation
.BerlinModelNameFactsImportValidator
;
37 import eu
.etaxonomy
.cdm
.io
.common
.IOValidator
;
38 import eu
.etaxonomy
.cdm
.io
.common
.ResultSetPartitioner
;
39 import eu
.etaxonomy
.cdm
.model
.agent
.Person
;
40 import eu
.etaxonomy
.cdm
.model
.common
.CdmBase
;
41 import eu
.etaxonomy
.cdm
.model
.common
.Language
;
42 import eu
.etaxonomy
.cdm
.model
.common
.OriginalSourceType
;
43 import eu
.etaxonomy
.cdm
.model
.description
.Feature
;
44 import eu
.etaxonomy
.cdm
.model
.description
.TaxonNameDescription
;
45 import eu
.etaxonomy
.cdm
.model
.description
.TextData
;
46 import eu
.etaxonomy
.cdm
.model
.media
.ImageFile
;
47 import eu
.etaxonomy
.cdm
.model
.media
.Media
;
48 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentation
;
49 import eu
.etaxonomy
.cdm
.model
.media
.MediaRepresentationPart
;
50 import eu
.etaxonomy
.cdm
.model
.name
.TaxonName
;
51 import eu
.etaxonomy
.cdm
.model
.reference
.Reference
;
60 public class BerlinModelNameFactsImport
extends BerlinModelImportBase
{
61 private static final Logger logger
= Logger
.getLogger(BerlinModelNameFactsImport
.class);
63 public static final String NAMESPACE
= "NameFact";
66 * write info message after modCount iterations
68 private int modCount
= 500;
69 private static final String pluralString
= "name facts";
70 private static final String dbTableName
= "NameFact";
73 public BerlinModelNameFactsImport(){
74 super(dbTableName
, pluralString
);
81 protected String
getIdQuery(BerlinModelImportState state
) {
82 if (StringUtils
.isNotEmpty(state
.getConfig().getNameIdTable())){
83 String result
= super.getIdQuery(state
);
84 result
+= " WHERE ptNameFk IN (SELECT NameId FROM " + state
.getConfig().getNameIdTable() + ")";
87 return super.getIdQuery(state
);
95 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
98 protected String
getRecordQuery(BerlinModelImportConfigurator config
) {
100 " SELECT NameFact.*, Name.NameID as nameId, NameFactCategory.NameFactCategory " +
101 " FROM NameFact INNER JOIN " +
102 " Name ON NameFact.PTNameFk = Name.NameId INNER JOIN "+
103 " NameFactCategory ON NameFactCategory.NameFactCategoryID = NameFact.NameFactCategoryFK " +
104 " WHERE (NameFactId IN ("+ ID_LIST_TOKEN
+") )";
109 public boolean doPartition(ResultSetPartitioner partitioner
, BerlinModelImportState state
) {
110 boolean success
= true ;
111 BerlinModelImportConfigurator config
= state
.getConfig();
112 Set
<TaxonName
> nameToSave
= new HashSet
<>();
113 Map
<String
, TaxonName
> nameMap
= partitioner
.getObjectMap(BerlinModelTaxonNameImport
.NAMESPACE
);
114 Map
<String
, Reference
> refMap
= partitioner
.getObjectMap(BerlinModelReferenceImport
.REFERENCE_NAMESPACE
);
116 ResultSet rs
= partitioner
.getResultSet();
118 Reference sourceRef
= state
.getTransactionalSourceReference();
122 while (rs
.next() && (config
.getMaximumNumberOfNameFacts() == 0 || i
< config
.getMaximumNumberOfNameFacts())){
124 if ((i
++ % modCount
) == 0 && i
!= 1 ){ logger
.info("NameFacts handled: " + (i
-1));}
126 int nameFactId
= rs
.getInt("nameFactId");
127 int nameId
= rs
.getInt("nameId");
128 Object nameFactRefFkObj
= rs
.getObject("nameFactRefFk");
129 String nameFactRefDetail
= rs
.getString("nameFactRefDetail");
131 String category
= CdmUtils
.Nz(rs
.getString("NameFactCategory"));
132 String nameFact
= CdmUtils
.Nz(rs
.getString("nameFact"));
134 TaxonName taxonNameBase
= nameMap
.get(String
.valueOf(nameId
));
135 String nameFactRefFk
= String
.valueOf(nameFactRefFkObj
);
136 Reference citation
= refMap
.get(nameFactRefFk
);
138 if (taxonNameBase
!= null){
140 if (category
.equalsIgnoreCase(NAME_FACT_PROTOLOGUE
)){
141 //Reference ref = (Reference)taxonNameBase.getNomenclaturalReference();
142 //ref = Book.NewInstance();
144 Media media
= getMedia(nameFact
, config
.getMediaUrl(), config
.getMediaPath());
145 if (media
.getRepresentations().size() > 0){
146 TaxonNameDescription description
= TaxonNameDescription
.NewInstance();
147 TextData protolog
= TextData
.NewInstance(Feature
.PROTOLOGUE());
148 protolog
.addMedia(media
);
149 protolog
.addSource(OriginalSourceType
.Import
, String
.valueOf(nameFactId
), NAMESPACE
, null, null, null, null);
150 description
.addElement(protolog
);
151 taxonNameBase
.addDescription(description
);
152 if (citation
!= null){
153 description
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, citation
, null);
154 protolog
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, citation
, nameFactRefDetail
, null, null);
156 }//end NAME_FACT_PROTOLOGUE
157 }catch(NullPointerException e
){
158 logger
.warn("MediaUrl and/or MediaPath not set. Could not get protologue.");
161 }else if (category
.equalsIgnoreCase(NAME_FACT_ALSO_PUBLISHED_IN
)){
162 if (StringUtils
.isNotBlank(nameFact
)){
163 TaxonNameDescription description
= TaxonNameDescription
.NewInstance();
164 TextData additionalPublication
= TextData
.NewInstance(Feature
.ADDITIONAL_PUBLICATION());
166 Language language
= Language
.DEFAULT();
167 additionalPublication
.putText(language
, nameFact
);
168 additionalPublication
.addSource(OriginalSourceType
.Import
, String
.valueOf(nameFactId
), NAMESPACE
, null,null, null, null);
169 if (citation
!= null || isNotBlank(nameFactRefDetail
)){
170 additionalPublication
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, citation
, nameFactRefDetail
, null, null);
172 description
.addElement(additionalPublication
);
173 taxonNameBase
.addDescription(description
);
175 }else if (category
.equalsIgnoreCase(NAME_FACT_BIBLIOGRAPHY
)){
176 if (StringUtils
.isNotBlank(nameFact
)){
177 TaxonNameDescription description
= TaxonNameDescription
.NewInstance();
178 TextData bibliography
= TextData
.NewInstance(Feature
.CITATION());
180 Language language
= Language
.DEFAULT();
181 bibliography
.putText(language
, nameFact
);
182 bibliography
.addSource(OriginalSourceType
.Import
, String
.valueOf(nameFactId
), NAMESPACE
, null,null, null, null);
183 if (citation
!= null || isNotBlank(nameFactRefDetail
)){
184 bibliography
.addSource(OriginalSourceType
.PrimaryTaxonomicSource
, null, null, citation
, nameFactRefDetail
, null, null);
186 description
.addElement(bibliography
);
187 taxonNameBase
.addDescription(description
);
191 logger
.warn("NameFactCategory '" + category
+ "' not yet implemented");
196 // DoubtfulFlag bit Checked
197 // PublishFlag bit Checked
198 // Created_When datetime Checked
199 // Updated_When datetime Checked
200 // Created_Who nvarchar(255) Checked
201 // Updated_Who nvarchar(255) Checked
202 // Notes nvarchar(1000) Checked
204 nameToSave
.add(taxonNameBase
);
207 logger
.warn("TaxonName for NameFact " + nameFactId
+ " does not exist in store");
212 if (config
.getMaximumNumberOfNameFacts() != 0 && i
>= config
.getMaximumNumberOfNameFacts() - 1){
213 logger
.warn("ONLY " + config
.getMaximumNumberOfNameFacts() + " NAMEFACTS imported !!!" )
215 logger
.info("Names to save: " + nameToSave
.size());
216 getNameService().save(nameToSave
);
218 } catch (SQLException e
) {
219 logger
.error("SQLException:" + e
);
227 public Map
<Object
, Map
<String
, ?
extends CdmBase
>> getRelatedObjectsForPartition(ResultSet rs
, BerlinModelImportState state
) {
231 Map
<Object
, Map
<String
, ?
extends CdmBase
>> result
= new HashMap
<Object
, Map
<String
, ?
extends CdmBase
>>();
234 Set
<String
> nameIdSet
= new HashSet
<String
>();
235 Set
<String
> referenceIdSet
= new HashSet
<String
>();
237 handleForeignKey(rs
, nameIdSet
, "PTnameFk");
238 handleForeignKey(rs
, referenceIdSet
, "nameFactRefFk");
242 nameSpace
= BerlinModelTaxonNameImport
.NAMESPACE
;
243 cdmClass
= TaxonName
.class;
245 Map
<String
, Person
> objectMap
= (Map
<String
, Person
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
246 result
.put(nameSpace
, objectMap
);
249 nameSpace
= BerlinModelReferenceImport
.REFERENCE_NAMESPACE
;
250 cdmClass
= Reference
.class;
251 idSet
= referenceIdSet
;
252 Map
<String
, Reference
> referenceMap
= (Map
<String
, Reference
>)getCommonService().getSourcedObjectsByIdInSource(cdmClass
, idSet
, nameSpace
);
253 result
.put(nameSpace
, referenceMap
);
256 } catch (SQLException e
) {
257 throw new RuntimeException(e
);
263 //FIXME gibt es da keine allgemeine Methode in common?
264 public Media
getMedia(String nameFact
, URL mediaUrl
, File mediaPath
){
265 if (mediaUrl
== null){
266 logger
.warn("Media Url should not be null");
269 String mimeTypeTif
= "image/tiff";
270 String mimeTypeJpg
= "image/jpeg";
271 String mimeTypePng
= "image/png";
272 String mimeTypePdf
= "application/pdf";
273 String suffixTif
= "tif";
274 String suffixJpg
= "jpg";
275 String suffixPng
= "png";
276 String suffixPdf
= "pdf";
278 String sep
= File
.separator
;
281 logger
.debug("Getting media for NameFact: " + nameFact
);
283 Media media
= Media
.NewInstance();
285 String mediaUrlString
= mediaUrl
.toString();
288 String urlStringTif
= mediaUrlString
+ "tif/" + nameFact
+ "." + suffixTif
;
289 File file
= new File(mediaPath
, "tif" + sep
+ nameFact
+ "." + suffixTif
);
290 MediaRepresentation representationTif
= MediaRepresentation
.NewInstance(mimeTypeTif
, suffixTif
);
292 representationTif
.addRepresentationPart(makeImage(urlStringTif
, size
, file
));
294 if(representationTif
.getParts().size() > 0){
295 media
.addRepresentation(representationTif
);
299 boolean fileExists
= true;
301 MediaRepresentation representationJpg
= MediaRepresentation
.NewInstance(mimeTypeJpg
, suffixJpg
);
303 String urlStringJpeg
= mediaUrlString
+ "cmd_jpg/" + nameFact
+ "_page_000" + jpgCount
+ "." + suffixJpg
;
304 file
= new File(mediaPath
, "cmd_jpg" + sep
+ nameFact
+ "_page_000" + jpgCount
+ "." + suffixJpg
);
307 representationJpg
.addRepresentationPart(makeImage(urlStringJpeg
, size
, file
));
312 if(representationJpg
.getParts().size() > 0){
313 media
.addRepresentation(representationJpg
);
317 String urlStringPng
= mediaUrlString
+ "png/" + nameFact
+ "." + suffixPng
;
318 file
= new File(mediaPath
, "png" + sep
+ nameFact
+ "." + suffixPng
);
319 MediaRepresentation representationPng
= MediaRepresentation
.NewInstance(mimeTypePng
, suffixPng
);
321 representationPng
.addRepresentationPart(makeImage(urlStringPng
, size
, file
));
327 urlStringPng
= mediaUrlString
+ "png/" + nameFact
+ "00" + pngCount
+ "." + suffixPng
;
328 file
= new File(mediaPath
, "png" + sep
+ nameFact
+ "00" + pngCount
+ "." + suffixPng
);
331 representationPng
.addRepresentationPart(makeImage(urlStringPng
, size
, file
));
337 if(representationPng
.getParts().size() > 0){
338 media
.addRepresentation(representationPng
);
342 String urlStringPdf
= mediaUrlString
+ "pdf/" + nameFact
+ "." + suffixPdf
;
345 uriPdf
= new URI(urlStringPdf
);
346 file
= new File(mediaPath
, "pdf" + sep
+ nameFact
+ "." + suffixPdf
);
347 MediaRepresentation representationPdf
= MediaRepresentation
.NewInstance(mimeTypePdf
, suffixPdf
);
349 representationPdf
.addRepresentationPart(MediaRepresentationPart
.NewInstance(uriPdf
, size
));
355 urlStringPdf
= mediaUrlString
+ "pdf/" + nameFact
+ "00" + pdfCount
+ "." + suffixPdf
;
356 file
= new File(mediaPath
, "pdf/" + sep
+ nameFact
+ "00" + pdfCount
+ "." + suffixPdf
);
359 representationPdf
.addRepresentationPart(MediaRepresentationPart
.NewInstance(uriPdf
, size
));
365 if(representationPdf
.getParts().size() > 0){
366 media
.addRepresentation(representationPdf
);
368 } catch (URISyntaxException e
) {
370 logger
.error("URISyntaxException" + urlStringPdf
);
374 if(logger
.isDebugEnabled()){
375 for (MediaRepresentation rep
: media
.getRepresentations()){
376 for (MediaRepresentationPart part
: rep
.getParts()){
377 logger
.debug("in representation: " + part
.getUri());
386 private ImageFile
makeImage(String imageUri
, Integer size
, File file
){
387 ImageInfo imageMetaData
= null;
390 uri
= new URI(imageUri
);
392 imageMetaData
= ImageInfo
.NewInstance(uri
, 0);
393 } catch (IOException e
) {
394 logger
.error("IOError reading image metadata." , e
);
395 } catch (HttpException e
) {
396 logger
.error("HttpException reading image metadata." , e
);
398 ImageFile image
= ImageFile
.NewInstance(uri
, size
, imageMetaData
);
400 } catch (URISyntaxException e1
) {
401 logger
.warn("URISyntaxException: " + imageUri
);
409 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
412 protected boolean doCheck(BerlinModelImportState state
){
413 IOValidator
<BerlinModelImportState
> validator
= new BerlinModelNameFactsImportValidator();
414 return validator
.validate(state
);
419 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
422 protected boolean isIgnore(BerlinModelImportState state
){
423 return ! state
.getConfig().isDoNameFacts();
429 public static void main(String
[] args
) {
431 BerlinModelNameFactsImport nf
= new BerlinModelNameFactsImport();
435 url
= new URL("http://wp5.e-taxonomy.eu/dataportal/cichorieae/media/protolog/");
436 File path
= new File("/Volumes/protolog/protolog/");
438 String fact
= "Acanthocephalus_amplexifolius";
439 // make getMedia public for this to work
440 Media media
= nf
.getMedia(fact
, url
, path
);
442 for (MediaRepresentation rep
: media
.getRepresentations()){
443 logger
.info(rep
.getMimeType());
444 for (MediaRepresentationPart part
: rep
.getParts()){
445 logger
.info(part
.getUri());
449 } catch (MalformedURLException e
) {