Project

General

Profile

« Previous | Next » 

Revision f2be28b3

Added by Andreas Müller over 11 years ago

latest globis

View differences:

app-import/src/main/java/eu/etaxonomy/cdm/io/globis/GlobisImageImport.java
18 18
import java.util.HashSet;
19 19
import java.util.Map;
20 20
import java.util.Set;
21
import java.util.UUID;
22
import java.util.regex.Matcher;
23
import java.util.regex.Pattern;
21 24

  
22 25
import org.apache.http.client.ClientProtocolException;
23 26
import org.apache.log4j.Logger;
......
28 31
import eu.etaxonomy.cdm.io.common.IOValidator;
29 32
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
30 33
import eu.etaxonomy.cdm.io.globis.validation.GlobisImageImportValidator;
34
import eu.etaxonomy.cdm.model.common.Annotation;
31 35
import eu.etaxonomy.cdm.model.common.CdmBase;
32 36
import eu.etaxonomy.cdm.model.common.Language;
37
import eu.etaxonomy.cdm.model.common.Marker;
38
import eu.etaxonomy.cdm.model.common.MarkerType;
33 39
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
34
import eu.etaxonomy.cdm.model.description.SpecimenDescription;
40
import eu.etaxonomy.cdm.model.description.Feature;
41
import eu.etaxonomy.cdm.model.description.TaxonDescription;
35 42
import eu.etaxonomy.cdm.model.description.TextData;
36 43
import eu.etaxonomy.cdm.model.media.Media;
44
import eu.etaxonomy.cdm.model.name.ZoologicalName;
45
import eu.etaxonomy.cdm.model.occurrence.Collection;
46
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
37 47
import eu.etaxonomy.cdm.model.occurrence.Specimen;
38 48
import eu.etaxonomy.cdm.model.reference.Reference;
49
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
39 50
import eu.etaxonomy.cdm.model.taxon.Taxon;
51
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
40 52

  
41 53

  
42 54
/**
......
49 61
	private static final Logger logger = Logger.getLogger(GlobisImageImport.class);
50 62
	
51 63
	private int modCount = 10000;
64

  
65
	private UUID uuidArtNonSpecTaxMarkerType = UUID.fromString("be362085-0f5b-4314-96d1-78b9b129ef6d") ;
52 66
	private static final String pluralString = "images";
53 67
	private static final String dbTableName = "Einzelbilder";
54
	private static final Class cdmTargetClass = Media
55
	.class;  //not needed
68
	private static final Class cdmTargetClass = Media.class;  //not needed
56 69
	
57 70
	private static final String IMAGE_NAMESPACE = "Einzelbilder";
71
	private static UUID uuidGartRef = UUID.fromString("af85470f-6e54-4304-9d29-fd117cd56161"); 
58 72
	
59 73
	public GlobisImageImport(){
60 74
		super(pluralString, dbTableName, cdmTargetClass);
......
105 119
		Map<String, Specimen> typeMap = (Map<String, Specimen>) partitioner.getObjectMap(GlobisSpecTaxImport.TYPE_NAMESPACE);
106 120
		
107 121
		Map<String, Taxon> taxonMap = (Map<String, Taxon>) partitioner.getObjectMap(TAXON_NAMESPACE);
108
//		Map<String, DerivedUnit> ecoFactDerivedUnitMap = (Map<String, DerivedUnit>) partitioner.getObjectMap(ECO_FACT_DERIVED_UNIT_NAMESPACE);
122
		Map<String, ZoologicalName> specTaxNameMap = (Map<String, ZoologicalName>) partitioner.getObjectMap(GlobisSpecTaxImport.SPEC_TAX_NAMESPACE);
109 123
		
110 124
		ResultSet rs = partitioner.getResultSet();
111 125
		
126
		Reference<?> refGart = getReferenceService().find(uuidGartRef);
127
		
128
		
112 129
		try {
113 130
			
114 131
			int i = 0;
115 132

  
116
			//for each reference
133
			//for each record
117 134
            while (rs.next()){
118 135
                
119 136
        		if ((i++ % modCount) == 0 && i!= 1 ){ logger.info(pluralString + " handled: " + (i-1));}
120 137
				
121 138
        		Integer bildID = rs.getInt("BildID");
122
        		
123 139
        		Integer spectaxID = nullSafeInt(rs, "spectaxID");
124
        		
125 140
        		Integer taxonID = nullSafeInt(rs, "SpecCurrspecID");
126
        		
127 141
        		String copyright = rs.getString("copyright");
142
        		String specimenId = rs.getString("specimenID");
143
        		String bemerkungen = rs.getString("Bemerkungen");
144
        		String artNotSpecTax = rs.getString("Art non spectax");
145
        		String motiv = rs.getString("Motiv");
128 146
        		
129 147
        		//ignore: 
130 148
        		//	[file lab2], same as Dateiname04 but less data
131 149
        		//	Dateipfad
150

  
132 151
        		Set<Media> recordMedia = new HashSet<Media>();
133 152
        		
134 153
        		try {
135 154
					
136
        			//make image path
137
					String pathShort = rs.getString("Dateipfad_kurz");
138
					String fileOS = rs.getString("file OS");
139
					pathShort= pathShort.replace(fileOS, "");
140
					String newPath = state.getConfig().getImageBaseUrl();
141
					String path = pathShort.replace("image:Webversionen/", newPath);
142
					
143
					Media singleMedia = makeMedia(state, rs, "file OS", "Legende 1", path, objectsToSave );
144
					recordMedia.add(singleMedia);
145
					singleMedia = makeMedia(state, rs, "Dateinamen02", "Legende 2", path, objectsToSave );
146
					recordMedia.add(singleMedia);
147
					singleMedia = makeMedia(state, rs, "Dateinamen03", "Legende 3", path, objectsToSave );
148
					recordMedia.add(singleMedia);
149
					singleMedia = makeMedia(state, rs, "Dateinamen04", "Legende 4", path, objectsToSave );
150
					recordMedia.add(singleMedia);
151
					
152
					if (spectaxID != null){
155
        			makeAllMedia(state, rs, recordMedia, objectsToSave);
156
        			
157
        			String title = null;
158
        			
159
        			Specimen specimen = null;
160
        			if (spectaxID != null){
161
        				//try to find type specimen
162
        				if (isNotBlank(motiv) && (motiv.startsWith("type specimen"))){
163
	        				String collectionCode = transformCopyright2CollectionCode(copyright);
164
	    					String id = GlobisSpecTaxImport.getTypeId(spectaxID, collectionCode);
165
	    					specimen = typeMap.get(id);
166
        				}
167
        				
168
    					//try to find specTaxName
169
        				ZoologicalName specTaxTaxonName = specTaxNameMap.get(String.valueOf(spectaxID));
170
            			if (specTaxTaxonName != null){
171
            				title = " taxon name " + specTaxTaxonName.getTitleCache();
172
            			}else{
173
            				title = " spectaxID " + spectaxID;
174
            			}
175
    				}else{
176
    					title = " name " + getNameFromFileOs(rs) + (isBlank(specimenId)? "" : " (specimenId: " + specimenId + ")");
177
    				}
178
        			
179
        			//not type specimen
180
        			if (specimen == null){
181
						specimen = Specimen.NewInstance();
182
						specimen.setTitleCache("Specimen for " + title );
153 183
						String collectionCode = transformCopyright2CollectionCode(copyright);
154
						String id = GlobisSpecTaxImport.getTypeId(spectaxID, collectionCode);
155
						Specimen typeSpecimen = typeMap.get(id);
156
						if (typeSpecimen != null){
157
							DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(typeSpecimen);
158
							for (Media media: recordMedia){
159
								facade.addDerivedUnitMedia(media);
160
							}
161
						}else{
162
							//TODO
163
						}
164
					}else{
165 184
						//TODO
185
						Collection collection = getCollection(collectionCode);
186
						specimen.setCollection(collection);
166 187
					}
167 188
					
168 189
					
190
					//source
191
					specimen.addSource(String.valueOf(bildID), IMAGE_NAMESPACE, state.getTransactionalSourceReference(), null);
169 192
					
193
					//GART id (specimenID)
194
					if (isNotBlank(specimenId)){
195
						specimen.addSource(specimenId, "", refGart, null);
196
					}
197
					//bemerkungen
198
					if (isNotBlank(bemerkungen)){
199
						Annotation annotation = Annotation.NewInstance(bemerkungen, null, null);
200
						specimen.addAnnotation(annotation);
201
					}
202
					//media
203
					DerivedUnitFacade facade = DerivedUnitFacade.NewInstance(specimen);
204
					for (Media media: recordMedia){
205
						facade.addDerivedUnitMedia(media);
206
					}
207
					//art non spectax
208
					if (isNotBlank(artNotSpecTax)){
209
						if (artNotSpecTax.equalsIgnoreCase("ja")){
210
							MarkerType artNotSpecTaxMarker = getMarkerType(state, uuidArtNonSpecTaxMarkerType  , "Art non spectax", "This marker is true if in the orginal data the 'Art non spectax' was 'ja'", null) ;
211
							specimen.addMarker(Marker.NewInstance(artNotSpecTaxMarker, true));
212
						}else{
213
							logger.warn(artNotSpecTax + " is not a valid value for 'Art non spectax' (BildID: " + bildID + ")" );
214
						}
215
					}
216
        			
217
					if (spectaxID != null){
218
						
219
						//add to image gallery (discuss if this is also needed if taxon is already added to type specimen
220
//						Taxon taxon = taxonMap.get(String.valueOf(taxonID));
221
						ZoologicalName specTaxTaxonName = specTaxNameMap.get(String.valueOf(spectaxID));
222
						
223
//						
224
//						if (taxon == null){
225
////							taxon = specTaxMap.get(String.valueOf(spectaxID));
226
////							specTaxName = specTaxMap.g
227
//						}
228
//						if (taxon == null){
229
//							logger.warn("No taxon available for specTaxID: " +  spectaxID);
230
//						}else{
231
//							name = CdmBase.deproxy(taxon.getName(), ZoologicalName.class);
232
//						}
233
						
234
						//TODO FIXME
235
						
236
						if (specTaxTaxonName == null){
237
							logger.warn("Name could not be found for spectaxID: " + spectaxID +  " in BildID: " + bildID);
238
						}else{
239
							Taxon taxon = null;
240
							for (Taxon specTaxTaxon: specTaxTaxonName.getTaxa()){
241
								taxon = specTaxTaxon;
242
							}
243
							if (taxon == null){
244
								//FIXME
245
								Reference undefinedSec = null;
246
								taxon = Taxon.NewInstance(specTaxTaxonName, undefinedSec);
247
							}
248
							
249
							DeterminationEvent determinationEvent = DeterminationEvent.NewInstance();
250
							determinationEvent.setTaxon(taxon);
251
							determinationEvent.setIdentifiedUnit(specimen);
252
						}
253
						
254
						
255

  
256
						
257
//						if (taxon != null){
258
//							TaxonDescription taxonDescription = getTaxonDescription(taxon, true, true);
259
//							if (taxonDescription.getElements().size() == 0){
260
//								TextData textData = TextData.NewInstance(Feature.IMAGE());
261
//								taxonDescription.addElement(textData);
262
//							}
263
//							Set<DescriptionElementBase> elements = taxonDescription.getElements();
264
//							TextData textData = CdmBase.deproxy(elements.iterator().next(), TextData.class);
265
//							for (Media media: recordMedia){
266
//								textData.addMedia(media);
267
//							}
268
//						}
269
					}
170 270
					
171 271
				} catch (Exception e) {
172 272
					logger.warn("Exception in Einzelbilder: bildID " + bildID + ". " + e.getMessage());
......
184 284
			return false;
185 285
		}
186 286
	}
287
	
288
	private Collection getCollection(String collectionCode) {
289
		//TODO
290
		return null;
291
	}
292

  
293

  
294

  
295

  
296
	private String getNameFromFileOs(ResultSet rs) throws SQLException {
297
		String fileOS = rs.getString("file OS");
298
		Pattern pattern = Pattern.compile("(.+)(_...._..\\.jpg)");
299
		Matcher matcher = pattern.matcher(fileOS);
300
		if (matcher.matches()){
301
			String match = matcher.group(1);
302
			return match;
303
		}else{
304
			logger.warn("FileOS does not match: " +  fileOS);
305
			return fileOS;
306
		}
307
	}
308

  
309

  
310

  
311

  
312
	private void makeAllMedia(GlobisImportState state, ResultSet rs, Set<Media> recordMedia, Set<Media> objectsToSave) throws SQLException{
313
			//make image path
314
		String pathShort = rs.getString("Dateipfad_kurz");
315
		String fileOS = rs.getString("file OS");
316
		pathShort= pathShort.replace(fileOS, "");
317
		String newPath = state.getConfig().getImageBaseUrl();
318
		String path = pathShort.replace("image:Webversionen/", newPath);
319
		
320
		Media singleMedia = makeMedia(state, rs, "file OS", "Legende 1", path, objectsToSave );
321
		recordMedia.add(singleMedia);
322
		singleMedia = makeMedia(state, rs, "Dateinamen02", "Legende 2", path, objectsToSave );
323
		recordMedia.add(singleMedia);
324
		singleMedia = makeMedia(state, rs, "Dateinamen03", "Legende 3", path, objectsToSave );
325
		recordMedia.add(singleMedia);
326
		singleMedia = makeMedia(state, rs, "Dateinamen04", "Legende 4", path, objectsToSave );
327
		recordMedia.add(singleMedia);
328

  
329
	}
187 330

  
188 331
	private Media makeMedia(GlobisImportState state, ResultSet rs, String fileNameAttr, String legendAttr, String path, Set<Media> objectsToSave) throws SQLException {
189 332
		Media media = null;
......
191 334
		String legend = rs.getString(legendAttr);
192 335
		Integer bildID = rs.getInt("BildID");
193 336
		
194
		URI uri = URI.create(path+fileName); 
337
		String uriStr = path+fileName;
338
		uriStr = uriStr.replace(" ", "%20");
339
		
340
		URI uri = URI.create(uriStr); 
195 341
		
196 342
//		Media media = ImageInfo.NewInstanceWithMetaData(uri, null);
197 343
		
......
283 429
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
284 430
		try{
285 431
			Set<String> currSpecIdSet = new HashSet<String>();
432
			Set<String> specTaxIdSet = new HashSet<String>();
286 433
			Set<String> typeIdSet = new HashSet<String>();
287 434
			
288 435
			while (rs.next()){
......
290 437
				handleTypeKey(rs, typeIdSet, "spectaxID", "copyright");
291 438
			}
292 439
			
440
			//specTax map
441
			nameSpace = GlobisSpecTaxImport.SPEC_TAX_NAMESPACE;
442
			cdmClass = TaxonBase.class;
443
			idSet = specTaxIdSet;
444
			Map<String, TaxonBase> specTaxMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
445
			result.put(nameSpace, specTaxMap);
446

  
293 447
			//taxon map
294 448
			nameSpace = TAXON_NAMESPACE;
295 449
			cdmClass = Taxon.class;
......
297 451
			Map<String, Taxon> taxonMap = (Map<String, Taxon>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
298 452
			result.put(nameSpace, taxonMap);
299 453

  
454
			
300 455
			//type map
301 456
			nameSpace = GlobisSpecTaxImport.TYPE_NAMESPACE;
302 457
			cdmClass = Specimen.class;
......
343 498

  
344 499

  
345 500

  
501
	/* (non-Javadoc)
502
	 * @see eu.etaxonomy.cdm.io.globis.GlobisImportBase#doInvoke(eu.etaxonomy.cdm.io.globis.GlobisImportState)
503
	 */
504
	@Override
505
	protected void doInvoke(GlobisImportState state) {
506
		Reference refGart = ReferenceFactory.newGeneric();
507
		refGart.setTitleCache("GART");
508
		refGart.setUuid(uuidGartRef);
509
		getReferenceService().saveOrUpdate(refGart);
510
		super.doInvoke(state);
511
	}
512

  
513

  
514

  
515

  
346 516

  
347 517
}

Also available in: Unified diff