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

    
228
	@Override
229
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs, BerlinModelImportState state) {
230
		String nameSpace;
231
		Class<?> cdmClass;
232
		Set<String> idSet;
233
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
234
		
235
		try{
236
			Set<String> nameIdSet = new HashSet<String>();
237
			Set<String> referenceIdSet = new HashSet<String>();
238
			while (rs.next()){
239
				handleForeignKey(rs, nameIdSet, "PTnameFk");
240
				handleForeignKey(rs, referenceIdSet, "nameFactRefFk");
241
	}
242
	
243
			//name map
244
			nameSpace = BerlinModelTaxonNameImport.NAMESPACE;
245
			cdmClass = TaxonNameBase.class;
246
			idSet = nameIdSet;
247
			Map<String, Person> objectMap = (Map<String, Person>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
248
			result.put(nameSpace, objectMap);
249

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

    
257

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

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

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

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

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

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

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