Project

General

Profile

Download (17 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.TaxonNameBase;
51
import eu.etaxonomy.cdm.model.reference.Reference;
52

    
53

    
54
/**
55
 * @author a.mueller
56
 * @created 20.03.2008
57
 * @version 1.0
58
 */
59
@Component
60
public class BerlinModelNameFactsImport  extends BerlinModelImportBase  {
61
	private static final Logger logger = Logger.getLogger(BerlinModelNameFactsImport.class);
62

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

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

    
72
	
73
	public BerlinModelNameFactsImport(){
74
		super(dbTableName, pluralString);
75
	}
76
	
77
	
78
	
79

    
80
	@Override
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() + ")";
85
			return result;
86
		}else{
87
			return super.getIdQuery(state);
88
		}
89
	}
90

    
91

    
92

    
93

    
94
	/* (non-Javadoc)
95
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
96
	 */
97
	@Override
98
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
99
		String strQuery = 
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+") )";
105
		return strQuery;
106
	}
107

    
108
	/* (non-Javadoc)
109
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
110
	 */
111
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
112
		boolean success = true ;
113
		BerlinModelImportConfigurator config = state.getConfig();
114
		Set<TaxonNameBase> nameToSave = new HashSet<TaxonNameBase>();
115
		Map<String, TaxonNameBase> nameMap = (Map<String, TaxonNameBase>) partitioner.getObjectMap(BerlinModelTaxonNameImport.NAMESPACE);
116
		Map<String, Reference> refMap = partitioner.getObjectMap(BerlinModelReferenceImport.REFERENCE_NAMESPACE);
117
		
118
		ResultSet rs = partitioner.getResultSet();
119
		
120
		Reference<?> sourceRef = state.getTransactionalSourceReference();
121
		try {
122
			int i = 0;
123
			//for each reference
124
			while (rs.next() && (config.getMaximumNumberOfNameFacts() == 0 || i < config.getMaximumNumberOfNameFacts())){
125
				
126
				if ((i++ % modCount) == 0  && i!= 1 ){ logger.info("NameFacts handled: " + (i-1));}
127
				
128
				int nameFactId = rs.getInt("nameFactId");
129
				int nameId = rs.getInt("nameId");
130
				Object nameFactRefFkObj = rs.getObject("nameFactRefFk");
131
				String nameFactRefDetail = rs.getString("nameFactRefDetail");
132
				
133
				String category = CdmUtils.Nz(rs.getString("NameFactCategory"));
134
				String nameFact = CdmUtils.Nz(rs.getString("nameFact"));
135
				
136
				TaxonNameBase<?,?> taxonNameBase = nameMap.get(String.valueOf(nameId));
137
				String nameFactRefFk = String.valueOf(nameFactRefFkObj);
138
				Reference<?> citation = refMap.get(nameFactRefFk);
139
				
140
				if (taxonNameBase != null){
141
					//PROTOLOGUE
142
					if (category.equalsIgnoreCase(NAME_FACT_PROTOLOGUE)){
143
						//Reference ref = (Reference)taxonNameBase.getNomenclaturalReference();
144
						//ref = Book.NewInstance();
145
						try{
146
							Media media = getMedia(nameFact, config.getMediaUrl(), config.getMediaPath());
147
							if (media.getRepresentations().size() > 0){
148
								TaxonNameDescription description = TaxonNameDescription.NewInstance();
149
								TextData protolog = TextData.NewInstance(Feature.PROTOLOGUE());
150
								protolog.addMedia(media);
151
								protolog.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null, null, null, null);
152
								description.addElement(protolog);
153
								taxonNameBase.addDescription(description);
154
								if (citation != null){
155
									description.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, null);
156
									protolog.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
157
								}
158
							}//end NAME_FACT_PROTOLOGUE
159
						}catch(NullPointerException e){
160
							logger.warn("MediaUrl and/or MediaPath not set. Could not get protologue.");
161
							success = false;
162
						}						
163
					}else if (category.equalsIgnoreCase(NAME_FACT_ALSO_PUBLISHED_IN)){
164
						if (StringUtils.isNotBlank(nameFact)){
165
							TaxonNameDescription description = TaxonNameDescription.NewInstance();
166
							TextData additionalPublication = TextData.NewInstance(Feature.ADDITIONAL_PUBLICATION());
167
							//TODO language
168
							Language language = Language.DEFAULT();
169
							additionalPublication.putText(language, nameFact);
170
							additionalPublication.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null,null, null, null);
171
							if (citation != null || isNotBlank(nameFactRefDetail)){
172
								additionalPublication.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
173
							}
174
							description.addElement(additionalPublication);
175
							taxonNameBase.addDescription(description);
176
						}
177
					}else if (category.equalsIgnoreCase(NAME_FACT_BIBLIOGRAPHY)){
178
						if (StringUtils.isNotBlank(nameFact)){
179
							TaxonNameDescription description = TaxonNameDescription.NewInstance();
180
							TextData bibliography = TextData.NewInstance(Feature.CITATION());
181
							//TODO language
182
							Language language = Language.DEFAULT();
183
							bibliography.putText(language, nameFact);
184
							bibliography.addSource(OriginalSourceType.Import, String.valueOf(nameFactId), NAMESPACE, null,null, null, null);
185
							if (citation != null || isNotBlank(nameFactRefDetail)){
186
								bibliography.addSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, nameFactRefDetail, null, null);
187
							}
188
							description.addElement(bibliography);
189
							taxonNameBase.addDescription(description);
190
						}
191
					}else {
192
						//TODO
193
						logger.warn("NameFactCategory '" + category + "' not yet implemented");
194
						success = false;
195
					}
196
					
197
					//TODO
198
//					DoubtfulFlag    bit        Checked
199
//					PublishFlag      bit        Checked
200
//					Created_When  datetime           Checked
201
//					Updated_When datetime           Checked
202
//					Created_Who    nvarchar(255)    Checked
203
//					Updated_Who  nvarchar(255)    Checked
204
//					Notes      nvarchar(1000)           Checked
205
					
206
					nameToSave.add(taxonNameBase);
207
				}else{
208
					//TODO
209
					logger.warn("TaxonName for NameFact " + nameFactId + " does not exist in store");
210
					success = false;
211
				}
212
				//put
213
			}
214
			if (config.getMaximumNumberOfNameFacts() != 0 && i >= config.getMaximumNumberOfNameFacts() - 1){ 
215
				logger.warn("ONLY " + config.getMaximumNumberOfNameFacts() + " NAMEFACTS imported !!!" )
216
			;};
217
			logger.info("Names to save: " + nameToSave.size());
218
			getNameService().save(nameToSave);	
219
			return success;
220
		} catch (SQLException e) {
221
			logger.error("SQLException:" +  e);
222
			return false;
223
		}
224

    
225
	}
226

    
227
	/* (non-Javadoc)
228
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
229
	 */
230
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
231
		String nameSpace;
232
		Class cdmClass;
233
		Set<String> idSet;
234
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
235
		
236
		try{
237
			Set<String> nameIdSet = new HashSet<String>();
238
			Set<String> referenceIdSet = new HashSet<String>();
239
			while (rs.next()){
240
				handleForeignKey(rs, nameIdSet, "PTnameFk");
241
				handleForeignKey(rs, referenceIdSet, "nameFactRefFk");
242
	}
243
	
244
			//name map
245
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
246
			cdmClass = TaxonNameBase.class;
247
			idSet = nameIdSet;
248
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
249
			result.put(nameSpace, objectMap);
250

    
251
			//reference map
252
			nameSpace = BerlinModelReferenceImport.REFERENCE_NAMESPACE;
253
			cdmClass = Reference.class;
254
			idSet = referenceIdSet;
255
			Map<String, Reference> referenceMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
256
			result.put(nameSpace, referenceMap);
257

    
258

    
259
		} catch (SQLException e) {
260
			throw new RuntimeException(e);
261
		}
262
		return result;
263
	}
264

    
265
	
266
	//FIXME gibt es da keine allgemeine Methode in common?
267
	public Media getMedia(String nameFact, URL mediaUrl, File mediaPath){
268
		if (mediaUrl == null){
269
			logger.warn("Media Url should not be null");
270
			return null;
271
		}
272
		String mimeTypeTif = "image/tiff";
273
		String mimeTypeJpg = "image/jpeg";
274
		String mimeTypePng = "image/png";
275
		String mimeTypePdf = "application/pdf"; 
276
		String suffixTif = "tif";
277
		String suffixJpg = "jpg";
278
		String suffixPng = "png";
279
		String suffixPdf = "pdf"; 
280
		
281
		String sep = File.separator;
282
		Integer size = null;
283
		
284
		logger.debug("Getting media for NameFact: " + nameFact);
285
		
286
		Media media = Media.NewInstance();
287
		
288
		String mediaUrlString = mediaUrl.toString();
289

    
290
		//tiff
291
		String urlStringTif = mediaUrlString + "tif/" + nameFact + "." + suffixTif;
292
		File file = new File(mediaPath, "tif" + sep + nameFact + "." + suffixTif);
293
		MediaRepresentation representationTif = MediaRepresentation.NewInstance(mimeTypeTif, suffixTif);
294
		if (file.exists()){
295
			representationTif.addRepresentationPart(makeImage(urlStringTif, size, file));
296
		}
297
		if(representationTif.getParts().size() > 0){
298
			media.addRepresentation(representationTif);
299
		}
300
		// end tif
301
		// jpg
302
		boolean fileExists = true;
303
		int jpgCount = 0;
304
		MediaRepresentation representationJpg = MediaRepresentation.NewInstance(mimeTypeJpg, suffixJpg);
305
		while(fileExists){
306
			String urlStringJpeg = mediaUrlString + "cmd_jpg/" + nameFact + "_page_000" + jpgCount + "." + suffixJpg;		
307
			file = new File(mediaPath, "cmd_jpg" + sep + nameFact + "_page_000" + jpgCount + "." + suffixJpg);
308
			jpgCount++;
309
			if (file.exists()){ 
310
				representationJpg.addRepresentationPart(makeImage(urlStringJpeg, size, file));
311
			}else{
312
				fileExists = false;
313
			}
314
		}
315
		if(representationJpg.getParts().size() > 0){
316
			media.addRepresentation(representationJpg);
317
		}
318
		// end jpg
319
		//png
320
		String urlStringPng = mediaUrlString + "png/" + nameFact + "." + suffixPng;
321
		file = new File(mediaPath, "png" + sep + nameFact + "." + suffixPng);
322
		MediaRepresentation representationPng = MediaRepresentation.NewInstance(mimeTypePng, suffixPng);
323
		if (file.exists()){ 
324
			representationPng.addRepresentationPart(makeImage(urlStringPng, size, file));
325
		}else{
326
			fileExists = true;
327
			int pngCount = 0;
328
			while (fileExists){
329
				pngCount++;
330
				urlStringPng = mediaUrlString + "png/" + nameFact + "00" + pngCount + "." + suffixPng;
331
				file = new File(mediaPath, "png" + sep + nameFact + "00" + pngCount + "." + suffixPng);
332
				
333
				if (file.exists()){ 
334
					representationPng.addRepresentationPart(makeImage(urlStringPng, size, file));
335
				}else{
336
					fileExists = false;
337
				}
338
			}
339
		} 
340
		if(representationPng.getParts().size() > 0){
341
			media.addRepresentation(representationPng);
342
		}
343
		//end png
344
        //pdf 
345
        String urlStringPdf = mediaUrlString + "pdf/" + nameFact + "." + suffixPdf; 
346
        URI uriPdf;
347
		try {
348
			uriPdf = new URI(urlStringPdf);
349
			file = new File(mediaPath, "pdf" + sep + nameFact + "." + suffixPdf); 
350
	        MediaRepresentation representationPdf = MediaRepresentation.NewInstance(mimeTypePdf, suffixPdf); 
351
	        if (file.exists()){  
352
	                representationPdf.addRepresentationPart(MediaRepresentationPart.NewInstance(uriPdf, size)); 
353
	        }else{ 
354
	                fileExists = true; 
355
	                int pdfCount = 0; 
356
	                while (fileExists){ 
357
	                        pdfCount++; 
358
	                        urlStringPdf = mediaUrlString + "pdf/" + nameFact + "00" + pdfCount + "." + suffixPdf; 
359
	                        file = new File(mediaPath, "pdf/" + sep + nameFact + "00" + pdfCount + "." + suffixPdf); 
360
	                         
361
	                        if (file.exists()){  
362
	                                representationPdf.addRepresentationPart(MediaRepresentationPart.NewInstance(uriPdf, size)); 
363
	                        }else{ 
364
	                                fileExists = false; 
365
	                        } 
366
	                } 
367
	        }
368
			if(representationPdf.getParts().size() > 0){
369
	        	media.addRepresentation(representationPdf);
370
	        }
371
		} catch (URISyntaxException e) {
372
			e.printStackTrace();
373
			logger.error("URISyntaxException" + urlStringPdf);
374
		}
375
        //end pdf 
376
		
377
		if(logger.isDebugEnabled()){
378
			for (MediaRepresentation rep : media.getRepresentations()){
379
				for (MediaRepresentationPart part : rep.getParts()){
380
					logger.debug("in representation: " + part.getUri());
381
				}
382
			}
383
		}
384
		
385
		return media;
386
	}
387

    
388
	
389
	private ImageFile makeImage(String imageUri, Integer size, File file){
390
		ImageInfo imageMetaData = null;
391
		URI uri;
392
		try {
393
			uri = new URI(imageUri);
394
			try {
395
				imageMetaData = ImageInfo.NewInstance(uri, 0);
396
			} catch (IOException e) {
397
				logger.error("IOError reading image metadata." , e);
398
			} catch (HttpException e) {
399
				logger.error("HttpException reading image metadata." , e);
400
			}
401
			ImageFile image = ImageFile.NewInstance(uri, size, imageMetaData);
402
			return image;
403
		} catch (URISyntaxException e1) {
404
			logger.warn("URISyntaxException: " + imageUri);
405
			return null;
406
		}
407
		
408
	}
409

    
410
	
411
	/* (non-Javadoc)
412
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
413
	 */
414
	@Override
415
	protected boolean doCheck(BerlinModelImportState state){
416
		IOValidator<BerlinModelImportState> validator = new BerlinModelNameFactsImportValidator();
417
		return validator.validate(state);
418
	}
419

    
420
	
421
	/* (non-Javadoc)
422
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
423
	 */
424
	protected boolean isIgnore(BerlinModelImportState state){
425
		return ! state.getConfig().isDoNameFacts();
426
	}
427
	
428

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