Project

General

Profile

Download (16.6 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 (isNotBlank(state.getConfig().getNameIdTable())){
82
			String result = super.getIdQuery(state);
83
			result += " WHERE ptNameFk IN (SELECT NameId FROM " + state.getConfig().getNameIdTable() + ")";
84
			if (state.getConfig().isEuroMed()){
85
			    result += " AND NOT (NameFactCategoryFk = 3 AND NameFactRefFk = 8500000) ";  //#7796#note-11
86
			}
87
			return result;
88
		}else{
89
			return super.getIdQuery(state);
90
		}
91
	}
92

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

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

    
112
		ResultSet rs = partitioner.getResultSet();
113

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

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

    
122
				int nameFactId = rs.getInt("nameFactId");
123
				int nameId = rs.getInt("nameId");
124
				Object nameFactRefFkObj = rs.getObject("nameFactRefFk");
125
				String nameFactRefDetail = rs.getString("nameFactRefDetail");
126

    
127
				String category = CdmUtils.Nz(rs.getString("NameFactCategory"));
128
				String nameFact = CdmUtils.Nz(rs.getString("nameFact"));
129

    
130
				TaxonName taxonNameBase = nameMap.get(String.valueOf(nameId));
131
				String nameFactRefFk = String.valueOf(nameFactRefFkObj);
132
				Reference citation = refMap.get(nameFactRefFk);
133

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

    
191
					//TODO
192
//					DoubtfulFlag    bit        Checked
193
//					PublishFlag      bit        Checked
194
//					Created_When  datetime           Checked
195
//					Updated_When datetime           Checked
196
//					Created_Who    nvarchar(255)    Checked
197
//					Updated_Who  nvarchar(255)    Checked
198
//					Notes      nvarchar(1000)           Checked
199

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

    
219
	}
220

    
221

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

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

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

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

    
251

    
252
		} catch (SQLException e) {
253
			throw new RuntimeException(e);
254
		}
255
		return result;
256
	}
257

    
258

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

    
274
		String sep = File.separator;
275
		Integer size = null;
276

    
277
		logger.debug("Getting media for NameFact: " + nameFact);
278

    
279
		Media media = Media.NewInstance();
280

    
281
		String mediaUrlString = mediaUrl.toString();
282

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

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

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

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

    
378
		return media;
379
	}
380

    
381

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

    
401
	}
402

    
403

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

    
413

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

    
422

    
423

    
424
	//for testing only
425
	public static void main(String[] args) {
426

    
427
		BerlinModelNameFactsImport nf = new BerlinModelNameFactsImport();
428

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