Project

General

Profile

Download (16.5 KB) Statistics
| Branch: | Revision:
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.berlinModel.in;
11

    
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;
15

    
16
import java.io.File;
17
import java.io.IOException;
18
import java.net.MalformedURLException;
19
import java.net.URI;
20
import java.net.URISyntaxException;
21
import java.net.URL;
22
import java.sql.ResultSet;
23
import java.sql.SQLException;
24
import java.util.HashMap;
25
import java.util.HashSet;
26
import java.util.Map;
27
import java.util.Set;
28

    
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;
33

    
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;
52

    
53

    
54
/**
55
 * @author a.mueller
56
 * @since 20.03.2008
57
 */
58
@Component
59
public class BerlinModelNameFactsImport  extends BerlinModelImportBase  {
60
    private static final long serialVersionUID = 4174085686074314138L;
61

    
62
    private static final Logger logger = Logger.getLogger(BerlinModelNameFactsImport.class);
63

    
64
	public static final String NAMESPACE = "NameFact";
65

    
66
	/**
67
	 * write info message after modCount iterations
68
	 */
69
	private int modCount = 500;
70
	private static final String pluralString = "name facts";
71
	private static final String dbTableName = "NameFact";
72

    
73

    
74
	public BerlinModelNameFactsImport(){
75
		super(dbTableName, pluralString);
76
	}
77

    
78

    
79
	@Override
80
	protected String getIdQuery(BerlinModelImportState state) {
81
		if (StringUtils.isNotEmpty(state.getConfig().getNameIdTable())){
82
			String result = super.getIdQuery(state);
83
			result += " WHERE ptNameFk IN (SELECT NameId FROM " + state.getConfig().getNameIdTable() + ")";
84
			return result;
85
		}else{
86
			return super.getIdQuery(state);
87
		}
88
	}
89

    
90
	@Override
91
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
92
		String strQuery =
93
			" SELECT NameFact.*, Name.NameID as nameId, NameFactCategory.NameFactCategory " +
94
			" FROM NameFact INNER JOIN " +
95
              	" Name ON NameFact.PTNameFk = Name.NameId  INNER JOIN "+
96
              	" NameFactCategory ON NameFactCategory.NameFactCategoryID = NameFact.NameFactCategoryFK " +
97
            " WHERE (NameFactId IN ("+ ID_LIST_TOKEN+") )";
98
		return strQuery;
99
	}
100

    
101
	@Override
102
    public boolean doPartition(@SuppressWarnings("rawtypes") ResultSetPartitioner partitioner, BerlinModelImportState state) {
103
		boolean success = true ;
104
		BerlinModelImportConfigurator config = state.getConfig();
105
		Set<TaxonName> nameToSave = new HashSet<>();
106
		Map<String, TaxonName> nameMap = partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
107
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
108

    
109
		ResultSet rs = partitioner.getResultSet();
110

    
111
		Reference sourceRef = state.getTransactionalSourceReference();
112
		try {
113
			int i = 0;
114
			//for each reference
115
			while (rs.next() && (config.getMaximumNumberOfNameFacts() == 0 || i < config.getMaximumNumberOfNameFacts())){
116

    
117
				if ((i++ % modCount) == 0  && i!= 1 ){ logger.info("NameFacts handled: " + (i-1));}
118

    
119
				int nameFactId = rs.getInt("nameFactId");
120
				int nameId = rs.getInt("nameId");
121
				Object nameFactRefFkObj = rs.getObject("nameFactRefFk");
122
				String nameFactRefDetail = rs.getString("nameFactRefDetail");
123

    
124
				String category = CdmUtils.Nz(rs.getString("NameFactCategory"));
125
				String nameFact = CdmUtils.Nz(rs.getString("nameFact"));
126

    
127
				TaxonName taxonNameBase = nameMap.get(String.valueOf(nameId));
128
				String nameFactRefFk = String.valueOf(nameFactRefFkObj);
129
				Reference citation = refMap.get(nameFactRefFk);
130

    
131
				if (taxonNameBase != null){
132
					//PROTOLOGUE
133
					if (category.equalsIgnoreCase(NAME_FACT_PROTOLOGUE)){
134
						//Reference ref = (Reference)taxonNameBase.getNomenclaturalReference();
135
						//ref = Book.NewInstance();
136
						try{
137
							Media media = getMedia(nameFact, config.getMediaUrl(), config.getMediaPath());
138
							if (media.getRepresentations().size() > 0){
139
								TaxonNameDescription description = TaxonNameDescription.NewInstance();
140
								TextData protolog = TextData.NewInstance(Feature.PROTOLOGUE());
141
								protolog.addMedia(media);
142
								protolog.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null, null, null, null);
143
								description.addElement(protolog);
144
								taxonNameBase.addDescription(description);
145
								if (citation != null){
146
									description.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, null);
147
									protolog.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
148
								}
149
							}//end NAME_FACT_PROTOLOGUE
150
						}catch(NullPointerException e){
151
							logger.warn("MediaUrl and/or MediaPath not set. Could not get protologue.");
152
							success = false;
153
						}
154
					}else if (category.equalsIgnoreCase(NAME_FACT_ALSO_PUBLISHED_IN)){
155
						if (StringUtils.isNotBlank(nameFact)){
156
							TaxonNameDescription description = TaxonNameDescription.NewInstance();
157
							TextData additionalPublication = TextData.NewInstance(Feature.ADDITIONAL_PUBLICATION());
158
							//TODO language
159
							Language language = Language.DEFAULT();
160
							additionalPublication.putText(language, nameFact);
161
							additionalPublication.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null,null, null, null);
162
							if (citation != null || isNotBlank(nameFactRefDetail)){
163
								additionalPublication.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
164
							}
165
							description.addElement(additionalPublication);
166
							taxonNameBase.addDescription(description);
167
						}
168
					}else if (category.equalsIgnoreCase(NAME_FACT_BIBLIOGRAPHY)){
169
						if (isNotBlank(nameFact)){
170
							TaxonNameDescription description = TaxonNameDescription.NewInstance();
171
							TextData bibliography = TextData.NewInstance(Feature.CITATION());
172
							//TODO language
173
							Language language = Language.DEFAULT();
174
							bibliography.putText(language, nameFact);
175
							bibliography.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null,null, null, null);
176
							if (citation != null || isNotBlank(nameFactRefDetail)){
177
								bibliography.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
178
							}
179
							description.addElement(bibliography);
180
							taxonNameBase.addDescription(description);
181
						}
182
					}else {
183
						//TODO
184
						logger.warn("NameFactCategory '" + category + "' not yet implemented");
185
						success = false;
186
					}
187

    
188
					//TODO
189
//					DoubtfulFlag    bit        Checked
190
//					PublishFlag      bit        Checked
191
//					Created_When  datetime           Checked
192
//					Updated_When datetime           Checked
193
//					Created_Who    nvarchar(255)    Checked
194
//					Updated_Who  nvarchar(255)    Checked
195
//					Notes      nvarchar(1000)           Checked
196

    
197
					nameToSave.add(taxonNameBase);
198
				}else{
199
					//TODO
200
					logger.warn("TaxonName for NameFact " + nameFactId + " does not exist in store");
201
					success = false;
202
				}
203
				//put
204
			}
205
			if (config.getMaximumNumberOfNameFacts() != 0 && i >= config.getMaximumNumberOfNameFacts() - 1){
206
				logger.warn("ONLY " + config.getMaximumNumberOfNameFacts() + " NAMEFACTS imported !!!" )
207
			;};
208
			logger.info("Names to save: " + nameToSave.size());
209
			getNameService().save(nameToSave);
210
			return success;
211
		} catch (SQLException e) {
212
			logger.error("SQLException:" +  e);
213
			return false;
214
		}
215

    
216
	}
217

    
218

    
219
	@Override
220
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
221
		String nameSpace;
222
		Class<?> cdmClass;
223
		Set<String> idSet;
224
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
225

    
226
		try{
227
			Set<String> nameIdSet = new HashSet<String>();
228
			Set<String> referenceIdSet = new HashSet<String>();
229
			while (rs.next()){
230
				handleForeignKey(rs, nameIdSet, "PTnameFk");
231
				handleForeignKey(rs, referenceIdSet, "nameFactRefFk");
232
	}
233

    
234
			//name map
235
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
236
			cdmClass = TaxonName.class;
237
			idSet = nameIdSet;
238
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
239
			result.put(nameSpace, objectMap);
240

    
241
			//reference map
242
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
243
			cdmClass = Reference.class;
244
			idSet = referenceIdSet;
245
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
246
			result.put(nameSpace, referenceMap);
247

    
248

    
249
		} catch (SQLException e) {
250
			throw new RuntimeException(e);
251
		}
252
		return result;
253
	}
254

    
255

    
256
	//FIXME gibt es da keine allgemeine Methode in common?
257
	public Media getMedia(String nameFact, URL mediaUrl, File mediaPath){
258
		if (mediaUrl == null){
259
			logger.warn("Media Url should not be null");
260
			return null;
261
		}
262
		String mimeTypeTif = "image/tiff";
263
		String mimeTypeJpg = "image/jpeg";
264
		String mimeTypePng = "image/png";
265
		String mimeTypePdf = "application/pdf";
266
		String suffixTif = "tif";
267
		String suffixJpg = "jpg";
268
		String suffixPng = "png";
269
		String suffixPdf = "pdf";
270

    
271
		String sep = File.separator;
272
		Integer size = null;
273

    
274
		logger.debug("Getting media for NameFact: " + nameFact);
275

    
276
		Media media = Media.NewInstance();
277

    
278
		String mediaUrlString = mediaUrl.toString();
279

    
280
		//tiff
281
		String urlStringTif = mediaUrlString + "tif/" + nameFact + "." + suffixTif;
282
		File file = new File(mediaPath, "tif" + sep + nameFact + "." + suffixTif);
283
		MediaRepresentation representationTif = MediaRepresentation.NewInstance(mimeTypeTif, suffixTif);
284
		if (file.exists()){
285
			representationTif.addRepresentationPart(makeImage(urlStringTif, size, file));
286
		}
287
		if(representationTif.getParts().size() > 0){
288
			media.addRepresentation(representationTif);
289
		}
290
		// end tif
291
		// jpg
292
		boolean fileExists = true;
293
		int jpgCount = 0;
294
		MediaRepresentation representationJpg = MediaRepresentation.NewInstance(mimeTypeJpg, suffixJpg);
295
		while(fileExists){
296
			String urlStringJpeg = mediaUrlString + "cmd_jpg/" + nameFact + "_page_000" + jpgCount + "." + suffixJpg;
297
			file = new File(mediaPath, "cmd_jpg" + sep + nameFact + "_page_000" + jpgCount + "." + suffixJpg);
298
			jpgCount++;
299
			if (file.exists()){
300
				representationJpg.addRepresentationPart(makeImage(urlStringJpeg, size, file));
301
			}else{
302
				fileExists = false;
303
			}
304
		}
305
		if(representationJpg.getParts().size() > 0){
306
			media.addRepresentation(representationJpg);
307
		}
308
		// end jpg
309
		//png
310
		String urlStringPng = mediaUrlString + "png/" + nameFact + "." + suffixPng;
311
		file = new File(mediaPath, "png" + sep + nameFact + "." + suffixPng);
312
		MediaRepresentation representationPng = MediaRepresentation.NewInstance(mimeTypePng, suffixPng);
313
		if (file.exists()){
314
			representationPng.addRepresentationPart(makeImage(urlStringPng, size, file));
315
		}else{
316
			fileExists = true;
317
			int pngCount = 0;
318
			while (fileExists){
319
				pngCount++;
320
				urlStringPng = mediaUrlString + "png/" + nameFact + "00" + pngCount + "." + suffixPng;
321
				file = new File(mediaPath, "png" + sep + nameFact + "00" + pngCount + "." + suffixPng);
322

    
323
				if (file.exists()){
324
					representationPng.addRepresentationPart(makeImage(urlStringPng, size, file));
325
				}else{
326
					fileExists = false;
327
				}
328
			}
329
		}
330
		if(representationPng.getParts().size() > 0){
331
			media.addRepresentation(representationPng);
332
		}
333
		//end png
334
        //pdf
335
        String urlStringPdf = mediaUrlString + "pdf/" + nameFact + "." + suffixPdf;
336
        URI uriPdf;
337
		try {
338
			uriPdf = new URI(urlStringPdf);
339
			file = new File(mediaPath, "pdf" + sep + nameFact + "." + suffixPdf);
340
	        MediaRepresentation representationPdf = MediaRepresentation.NewInstance(mimeTypePdf, suffixPdf);
341
	        if (file.exists()){
342
	                representationPdf.addRepresentationPart(MediaRepresentationPart.NewInstance(uriPdf, size));
343
	        }else{
344
	                fileExists = true;
345
	                int pdfCount = 0;
346
	                while (fileExists){
347
	                        pdfCount++;
348
	                        urlStringPdf = mediaUrlString + "pdf/" + nameFact + "00" + pdfCount + "." + suffixPdf;
349
	                        file = new File(mediaPath, "pdf/" + sep + nameFact + "00" + pdfCount + "." + suffixPdf);
350

    
351
	                        if (file.exists()){
352
	                                representationPdf.addRepresentationPart(MediaRepresentationPart.NewInstance(uriPdf, size));
353
	                        }else{
354
	                                fileExists = false;
355
	                        }
356
	                }
357
	        }
358
			if(representationPdf.getParts().size() > 0){
359
	        	media.addRepresentation(representationPdf);
360
	        }
361
		} catch (URISyntaxException e) {
362
			e.printStackTrace();
363
			logger.error("URISyntaxException" + urlStringPdf);
364
		}
365
        //end pdf
366

    
367
		if(logger.isDebugEnabled()){
368
			for (MediaRepresentation rep : media.getRepresentations()){
369
				for (MediaRepresentationPart part : rep.getParts()){
370
					logger.debug("in representation: " + part.getUri());
371
				}
372
			}
373
		}
374

    
375
		return media;
376
	}
377

    
378

    
379
	private ImageFile makeImage(String imageUri, Integer size, File file){
380
		ImageInfo imageMetaData = null;
381
		URI uri;
382
		try {
383
			uri = new URI(imageUri);
384
			try {
385
				imageMetaData = ImageInfo.NewInstance(uri, 0);
386
			} catch (IOException e) {
387
				logger.error("IOError reading image metadata." , e);
388
			} catch (HttpException e) {
389
				logger.error("HttpException reading image metadata." , e);
390
			}
391
			ImageFile image = ImageFile.NewInstance(uri, size, imageMetaData);
392
			return image;
393
		} catch (URISyntaxException e1) {
394
			logger.warn("URISyntaxException: " + imageUri);
395
			return null;
396
		}
397

    
398
	}
399

    
400

    
401
	/* (non-Javadoc)
402
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
403
	 */
404
	@Override
405
	protected boolean doCheck(BerlinModelImportState state){
406
		IOValidator<BerlinModelImportState> validator = new BerlinModelNameFactsImportValidator();
407
		return validator.validate(state);
408
	}
409

    
410

    
411
	/* (non-Javadoc)
412
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
413
	 */
414
	@Override
415
    protected boolean isIgnore(BerlinModelImportState state){
416
		return ! state.getConfig().isDoNameFacts();
417
	}
418

    
419

    
420

    
421
	//for testing only
422
	public static void main(String[] args) {
423

    
424
		BerlinModelNameFactsImport nf = new BerlinModelNameFactsImport();
425

    
426
		URL url;
427
		try {
428
			url = new URL("http://wp5.e-taxonomy.eu/dataportal/cichorieae/media/protolog/");
429
			File path = new File("/Volumes/protolog/protolog/");
430
			if(path.exists()){
431
				String fact = "Acanthocephalus_amplexifolius";
432
				// make getMedia public for this to work
433
				Media media = nf.getMedia(fact, url, path);
434
				logger.info(media);
435
				for (MediaRepresentation rep : media.getRepresentations()){
436
					logger.info(rep.getMimeType());
437
					for (MediaRepresentationPart part : rep.getParts()){
438
						logger.info(part.getUri());
439
					}
440
				}
441
			}
442
		} catch (MalformedURLException e) {
443
			e.printStackTrace();
444
		}
445
	}
446
}
(9-9/22)