Project

General

Profile

Download (40.7 KB) Statistics
| Branch: | Tag: | 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.REF_ARTICLE;
13
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_BOOK;
14
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_CONFERENCE_PROCEEDINGS;
15
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_DATABASE;
16
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_INFORMAL;
17
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL;
18
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL_VOLUME;
19
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PART_OF_OTHER_TITLE;
20
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PRINT_SERIES;
21
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_UNKNOWN;
22
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_WEBSITE;
23
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.ALL;
24
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES;
25
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.NOMENCLATURAL;
26
import static eu.etaxonomy.cdm.io.common.ImportHelper.NO_OVERWRITE;
27
import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;
28
import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;
29

    
30
import java.sql.ResultSet;
31
import java.sql.SQLException;
32
import java.util.ArrayList;
33
import java.util.Arrays;
34
import java.util.HashMap;
35
import java.util.HashSet;
36
import java.util.List;
37
import java.util.Map;
38
import java.util.Set;
39
import java.util.UUID;
40

    
41
import org.apache.log4j.Logger;
42
import org.springframework.stereotype.Component;
43

    
44
import eu.etaxonomy.cdm.common.CdmUtils;
45
import eu.etaxonomy.cdm.io.berlinModel.CdmOneToManyMapper;
46
import eu.etaxonomy.cdm.io.berlinModel.CdmStringMapper;
47
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelReferenceImportValidator;
48
import eu.etaxonomy.cdm.io.common.ICdmIO;
49
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
50
import eu.etaxonomy.cdm.io.common.ImportHelper;
51
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
52
import eu.etaxonomy.cdm.io.common.Source;
53
import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;
54
import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;
55
import eu.etaxonomy.cdm.io.common.mapping.CdmSingleAttributeMapperBase;
56
import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;
57
import eu.etaxonomy.cdm.model.agent.Team;
58
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
59
import eu.etaxonomy.cdm.model.common.CdmBase;
60
import eu.etaxonomy.cdm.model.common.ExtensionType;
61
import eu.etaxonomy.cdm.model.common.IdentifiableSource;
62
import eu.etaxonomy.cdm.model.common.Marker;
63
import eu.etaxonomy.cdm.model.common.MarkerType;
64
import eu.etaxonomy.cdm.model.reference.IArticle;
65
import eu.etaxonomy.cdm.model.reference.IBook;
66
import eu.etaxonomy.cdm.model.reference.IBookSection;
67
import eu.etaxonomy.cdm.model.reference.IJournal;
68
import eu.etaxonomy.cdm.model.reference.IPrintSeries;
69
import eu.etaxonomy.cdm.model.reference.Reference;
70
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
71
import eu.etaxonomy.cdm.model.reference.ReferenceType;
72

    
73
/**
74
 * @author a.mueller
75
 * @created 20.03.2008
76
 * @version 1.0
77
 */
78
@Component
79
public class BerlinModelReferenceImport extends BerlinModelImportBase {
80
	private static final Logger logger = Logger.getLogger(BerlinModelReferenceImport.class);
81

    
82
	public static final String NOM_REFERENCE_NAMESPACE = "NomReference";
83
	public static final String BIBLIO_REFERENCE_NAMESPACE = "BiblioReference";
84
	
85
	public static final UUID REF_DEPOSITED_AT_UUID = UUID.fromString("23ca88c7-ce73-41b2-8ca3-2cb22f013beb");
86
	public static final UUID REF_SOURCE = UUID.fromString("d6432582-2216-4b08-b0db-76f6c1013141");
87
	public static final UUID DATE_STRING_UUID = UUID.fromString("e4130eae-606e-4b0c-be4f-e93dc161be7d");
88
	
89
	
90
	private int modCount = 1000;
91
	private static final String pluralString = "references";
92
	private static final String dbTableName = "reference";
93

    
94
	
95
	public BerlinModelReferenceImport(){
96
		super();
97
	}
98
	
99
	protected void initializeMappers(BerlinModelImportState state){
100
		for (CdmAttributeMapperBase mapper: classMappers){
101
			if (mapper instanceof DbImportExtensionMapper){
102
				((DbImportExtensionMapper)mapper).initialize(state, Reference.class);
103
			}
104
		}
105
		return;
106
	}
107
	
108
	protected static CdmAttributeMapperBase[] classMappers = new CdmAttributeMapperBase[]{
109
		new CdmStringMapper("edition", "edition"),
110
		new CdmStringMapper("volume", "volume"),
111
		new CdmStringMapper("publisher", "publisher"),
112
		new CdmStringMapper("publicationTown", "placePublished"),
113
		new CdmStringMapper("isbn", "isbn"),
114
		new CdmStringMapper("isbn", "isbn"),
115
		new CdmStringMapper("pageString", "pages"),
116
		new CdmStringMapper("series", "series"),
117
		new CdmStringMapper("issn", "issn"),
118
		new CdmStringMapper("url", "uri"),
119
		DbImportExtensionMapper.NewInstance("NomStandard", ExtensionType.NOMENCLATURAL_STANDARD()),
120
		DbImportExtensionMapper.NewInstance("DateString", DATE_STRING_UUID, "Date String", "Date String", "dates"),
121
		DbImportExtensionMapper.NewInstance("RefDepositedAt", REF_DEPOSITED_AT_UUID, "RefDepositedAt", "reference is deposited at", "at"),
122
		DbImportExtensionMapper.NewInstance("RefSource", REF_SOURCE, "RefSource", "reference source", "source")
123
	};
124

    
125
	
126
	protected static String[] operationalAttributes = new String[]{
127
		"refId", "refCache", "nomRefCache", "preliminaryFlag", "inRefFk", "title", "nomTitleAbbrev",
128
		"refAuthorString", "nomAuthorTeamFk",
129
		"refCategoryFk", "thesisFlag", "informalRefCategory", "idInSource"
130
	};
131
	
132
	protected static String[] createdAndNotesAttributes = new String[]{
133
			"created_When", "updated_When", "created_Who", "updated_Who", "notes"
134
	};
135
	
136
	protected static String[] unclearMappers = new String[]{
137
			"isPaper", "exportDate", 
138
	};
139
	
140
	//TODO isPaper
141
	//
142
	
143
	
144
	
145
	//type to count the references nomReferences that have been created and saved
146
	private class RefCounter{
147
		RefCounter() {nomRefCount = 0; referenceCount = 0;};
148
		int nomRefCount;
149
		int referenceCount;
150
		public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(referenceCount);};
151
	}
152

    
153

    
154
	/* (non-Javadoc)
155
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)
156
	 */
157
	@Override
158
	protected String getRecordQuery(BerlinModelImportConfigurator config) {
159
		return null;  //not needed
160
	}
161

    
162

    
163
	@Override
164
	protected void doInvoke(BerlinModelImportState state){
165
		logger.info("start make " + getPluralString() + " ...");
166

    
167
		boolean success = true;
168
		initializeMappers(state);
169
		BerlinModelImportConfigurator config = state.getConfig();
170
		Source source = config.getSource();
171

    
172
		String strSelectId = "Select Reference.RefId as refId";
173
		String strSelectFull = 
174
			" SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk,  " +
175
			" InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
176
			" InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk, RefSource.RefSource " ;
177
		String strFrom =  " FROM Reference AS InInReference " +
178
		    	" RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " + 
179
		    	" RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " + 
180
		    	" LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +
181
		    	" WHERE (1=1) ";
182
		String strWherePartitioned = " AND (Reference.refId IN ("+ ID_LIST_TOKEN + ") ) "; 
183

    
184
		//test max number of recursions
185
		String strQueryTestMaxRecursion = strSelectId + strFrom +  
186
			" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
187
		ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTestMaxRecursion);
188
		try {
189
			if (testMaxRecursionResultSet.next() == true){
190
				logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
191
				state.setUnsuccessfull();
192
				return;
193
			}
194
		} catch (SQLException e1) {
195
			e1.printStackTrace();
196
			logger.error("There are references with more then 2 in-reference recursion. Maximum number of allowed recursions is 2. Records will not be stored.");
197
			success = false;
198
		}
199

    
200
		String strSelectIdBase = strSelectId + strFrom;
201
		
202
		String strIdQueryNoInRef = strSelectIdBase + 
203
			" AND (Reference.InRefFk is NULL) ";
204
		String strIdQuery1InRef = strSelectIdBase + 
205
			" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
206
		String strIdQuery2InRefs = strSelectIdBase + 
207
			" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
208

    
209
		if (config.getDoReferences() == CONCEPT_REFERENCES){
210
			strIdQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) ";
211
		}
212

    
213
		String strRecordQuery = strSelectFull + strFrom + strWherePartitioned;
214
		
215
		int recordsPerTransaction = config.getRecordsPerTransaction();
216
		try{
217
			//NoInRefs
218
			ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQueryNoInRef, strRecordQuery, recordsPerTransaction);
219
			while (partitioner.nextPartition()){
220
				partitioner.doPartition(this, state);
221
			}
222
			logger.info("end make references with no in-references ... " + getSuccessString(success));
223

    
224
			if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){
225

    
226
				//1InRef
227
				partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery1InRef, strRecordQuery, recordsPerTransaction);
228
				while (partitioner.nextPartition()){
229
					partitioner.doPartition(this, state);
230
				}
231
				logger.info("end make references with no 1 in-reference ... " + getSuccessString(success));
232
	
233
				//2InRefs
234
				partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery2InRefs, strRecordQuery, recordsPerTransaction);
235
				while (partitioner.nextPartition()){
236
					partitioner.doPartition(this, state);
237
				}
238
				logger.info("end make references with no 2 in-reference ... " + getSuccessString(success));
239
			}
240

    
241
		} catch (SQLException e) {
242
			logger.error("SQLException:" +  e);
243
			state.setUnsuccessfull();
244
			return;
245
		}
246
		logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));
247
		if (! success){
248
			state.setUnsuccessfull();
249
		}
250
		return;
251
	}
252

    
253
	
254

    
255
	/* (non-Javadoc)
256
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
257
	 */
258
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
259
		boolean success = true;
260
//		MapWrapper<Reference> referenceStore= new MapWrapper<Reference>(null);
261
//		MapWrapper<Reference> nomRefStore= new MapWrapper<Reference>(null);
262

    
263
		Map<Integer, Reference> nomRefToSave = new HashMap<Integer, Reference>();
264
		Map<Integer, Reference> biblioRefToSave = new HashMap<Integer, Reference>();
265
		
266
		Map<String, Reference> relatedNomReferences = partitioner.getObjectMap(NOM_REFERENCE_NAMESPACE);
267
		Map<String, Reference> relatedBiblioReferences = partitioner.getObjectMap(BIBLIO_REFERENCE_NAMESPACE);
268
		
269
		BerlinModelImportConfigurator config = state.getConfig();
270
		
271
		try {
272
//			//get data from database
273
//				//strQueryBase += " AND Reference.refId = 1933 " ; //7000000
274
//			
275
//			int j = 0;
276
//			Iterator<ResultSet> resultSetListIterator =  resultSetList.listIterator();
277
//			//for each resultsetlist
278
//			while (resultSetListIterator.hasNext()){
279
				int i = 0;
280
				RefCounter refCounter  = new RefCounter();
281
				
282
//				ResultSet rs = resultSetListIterator.next();
283
				ResultSet rs = partitioner.getResultSet();
284
				//for each resultset
285
				while (rs.next()){
286
					if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round -" );}
287
				
288
					success &= makeSingleReferenceRecord(rs, state, partitioner, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences, refCounter);
289
				} // end resultSet
290
								
291
				//for the concept reference a fixed uuid may be needed -> change uuid
292
				Integer sourceSecId = (Integer)config.getSourceSecId();
293
				Reference<?> sec = biblioRefToSave.get(sourceSecId);
294
				if (sec == null){
295
					sec = nomRefToSave.get(sourceSecId);	
296
				}
297
				if (sec != null){
298
					sec.setUuid(config.getSecUuid());
299
					logger.info("SecUuid changed to: " + config.getSecUuid());
300
				}
301
				
302
				//save and store in map
303
				logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");
304
				getReferenceService().save(nomRefToSave.values());
305
				logger.info("Save bibliographical references (" + refCounter.referenceCount +")");
306
				getReferenceService().save(biblioRefToSave.values());
307
//				j++;
308
//			}//end resultSetList	
309

    
310
			logger.info("end makeReferences ..." + getSuccessString(success));;
311
			return success;
312
		} catch (SQLException e) {
313
			logger.error("SQLException:" +  e);
314
			return false;
315
		}
316
	}
317

    
318

    
319

    
320
	/* (non-Javadoc)
321
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)
322
	 */
323
	public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
324
		String nameSpace;
325
		Class cdmClass;
326
		Set<String> idSet;
327
		
328
		Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
329
		
330
		try{
331
			Set<String> teamIdSet = new HashSet<String>();
332
			Set<String> referenceIdSet = new HashSet<String>();
333
			
334
			while (rs.next()){
335
				handleForeignKey(rs, teamIdSet, "NomAuthorTeamFk");
336
				handleForeignKey(rs, referenceIdSet, "InRefFk");
337
			}
338
			
339
			//team map
340
			nameSpace = BerlinModelAuthorTeamImport.NAMESPACE;
341
			cdmClass = Team.class;
342
			idSet = teamIdSet;
343
			Map<String, Team> teamMap = (Map<String, Team>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
344
			result.put(nameSpace, teamMap);
345

    
346
			
347
			//nom reference map
348
			nameSpace = NOM_REFERENCE_NAMESPACE;
349
			cdmClass = Reference.class;
350
			idSet = referenceIdSet;
351
			Map<String, Reference> nomRefMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
352
			result.put(nameSpace, nomRefMap);
353

    
354
			//biblio reference map
355
			nameSpace = BIBLIO_REFERENCE_NAMESPACE;
356
			cdmClass = Reference.class;
357
			idSet = referenceIdSet;
358
			Map<String, Reference> biblioRefMap = (Map<String, Reference>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
359
			result.put(nameSpace, biblioRefMap);
360
			
361
		} catch (SQLException e) {
362
			throw new RuntimeException(e);
363
		}
364
		return result;
365
	}
366
	
367
	
368
	/**
369
	 * Handles a single reference record
370
	 * @param rs
371
	 * @param state
372
	 * @param biblioRefToSave
373
	 * @param nomRefToSave
374
	 * @param relatedBiblioReferences
375
	 * @param relatedNomReferences
376
	 * @param refCounter
377
	 * @return
378
	 */
379
	private boolean makeSingleReferenceRecord(
380
				ResultSet rs, 
381
				BerlinModelImportState state,
382
				ResultSetPartitioner<BerlinModelImportState> partitioner,
383
				Map<Integer, Reference> biblioRefToSave, 
384
				Map<Integer, Reference> nomRefToSave, 
385
				Map<String, Reference> relatedBiblioReferences, 
386
				Map<String, Reference> relatedNomReferences, 
387
				RefCounter refCounter){
388
		boolean success = true;
389

    
390
		Integer refId = null;
391
		try {
392
			Map<String, Object> valueMap = getValueMap(rs);
393
			
394
			Integer categoryFk = (Integer)valueMap.get("refCategoryFk".toLowerCase());
395
			refId = (Integer)valueMap.get("refId".toLowerCase());
396
			Boolean thesisFlag = (Boolean)valueMap.get("thesisFlag".toLowerCase());
397
			
398
			
399
			Reference<?> referenceBase;
400
			logger.debug("RefCategoryFk: " + categoryFk);
401
			
402
			if (thesisFlag){
403
				referenceBase = makeThesis(valueMap);
404
			}else if (categoryFk == REF_JOURNAL){
405
				referenceBase = makeJournal(valueMap);
406
			}else if(categoryFk == REF_BOOK){
407
				referenceBase = makeBook(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
408
			}else if(categoryFk == REF_DATABASE){
409
				referenceBase = makeDatabase(valueMap);
410
			}else if(categoryFk == REF_INFORMAL){
411
				referenceBase = makeInformal(valueMap);
412
			}else if(categoryFk == REF_WEBSITE){
413
				referenceBase = makeWebSite(valueMap);
414
			}else if(categoryFk == REF_UNKNOWN){
415
				referenceBase = makeUnknown(valueMap);
416
			}else if(categoryFk == REF_PRINT_SERIES){
417
				referenceBase = makePrintSeries(valueMap);
418
			}else if(categoryFk == REF_CONFERENCE_PROCEEDINGS){
419
				referenceBase = makeProceedings(valueMap);
420
			}else if(categoryFk == REF_ARTICLE){
421
				referenceBase = makeArticle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
422
			}else if(categoryFk == REF_JOURNAL_VOLUME){
423
				referenceBase = makeJournalVolume(valueMap);
424
			}else if(categoryFk == REF_PART_OF_OTHER_TITLE){
425
				referenceBase = makePartOfOtherTitle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
426
			}else{
427
				logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
428
				referenceBase = ReferenceFactory.newGeneric();
429
				success = false;
430
			}
431
							
432
			//refYear
433
			String refYear = (String)valueMap.get("refYear".toLowerCase());
434
			referenceBase.setDatePublished(ImportHelper.getDatePublished(refYear)); 
435
			
436
			//created, updated, notes
437
			doCreatedUpdatedNotes(state, referenceBase, rs);						
438

    
439
			//isPaper
440
			if ((Boolean)valueMap.get("isPaper".toLowerCase())){
441
				logger.warn("IsPaper is not yet implemented, but reference " +  refId + " is paper");
442
			}
443
			
444
			//idInSource
445
			String idInSource = (String)valueMap.get("IdInSource".toLowerCase());
446
			if (CdmUtils.isNotEmpty(idInSource)){
447
				IdentifiableSource source = IdentifiableSource.NewInstance(idInSource);
448
				source.setIdNamespace("import to Berlin Model");
449
				referenceBase.addSource(source);
450
			}
451
			
452
			//nom&BiblioReference  - must be last because a clone is created
453
			success &= makeNomAndBiblioReference(rs, state, partitioner, refId, referenceBase, refCounter, 
454
					biblioRefToSave, nomRefToSave );
455

    
456

    
457
		} catch (Exception e) {
458
			logger.warn("Reference with BM refId '" + CdmUtils.Nz(refId) +  "' threw Exception and could not be saved");
459
			e.printStackTrace();
460
			success = false;
461
		}
462
		return success;
463
	}
464

    
465
	
466
	/**
467
	 * Creates and saves a nom. reference and a biblio. reference after checking necessity
468
	 * @param rs
469
	 * @param refId
470
	 * @param referenceBase
471
	 * @param refCounter
472
	 * @param biblioRefToSave
473
	 * @param nomRefToSave
474
	 * @param teamMap
475
	 * @param stores
476
	 * @return
477
	 * @throws SQLException
478
	 */
479
	private boolean makeNomAndBiblioReference(
480
				ResultSet rs, 
481
				BerlinModelImportState state,
482
				ResultSetPartitioner partitioner,
483
				int refId, 
484
				Reference<?> referenceBase,  
485
				RefCounter refCounter, 
486
				Map<Integer, Reference> biblioRefToSave, 
487
				Map<Integer, Reference> nomRefToSave
488
				) throws SQLException{
489
		
490
		Map<String, Team> teamMap = partitioner.getObjectMap(BerlinModelAuthorTeamImport.NAMESPACE);
491
		
492
		String refCache = rs.getString("refCache");
493
		String nomRefCache = rs.getString("nomRefCache");
494
		String title = rs.getString("title");
495
		String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
496
		boolean isPreliminary = rs.getBoolean("PreliminaryFlag");
497
		String refAuthorString = rs.getString("refAuthorString");
498
		Integer nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");
499
		String strNomAuthorTeamFk = String.valueOf(nomAuthorTeamFk);
500
		TeamOrPersonBase<?> nomAuthor = teamMap.get(strNomAuthorTeamFk);
501
		Reference nomReference = null;
502
		
503
		boolean hasNomRef = false;
504
		boolean hasBiblioRef = false;
505
		Reference sourceReference = state.getConfig().getSourceReference();
506
		
507
		//is Nomenclatural Reference
508
		if ( (CdmUtils.isNotEmpty(nomRefCache) && isPreliminary) || (CdmUtils.isNotEmpty(nomTitleAbbrev) && ! isPreliminary) ){
509
			referenceBase.setTitle(nomTitleAbbrev);
510
			TeamOrPersonBase<?> author = getAuthorTeam(refAuthorString , nomAuthor, true);
511
			referenceBase.setAuthorTeam(author);
512
			//referenceBase.setNomenclaturallyRelevant(true);
513
			if (isPreliminary){
514
				referenceBase.setTitleCache(nomRefCache, true);
515
			}
516
			if (! nomRefToSave.containsKey(refId)){
517
				if (referenceBase == null){
518
					logger.warn("refBase is null");
519
				}
520
				nomRefToSave.put(refId, referenceBase);
521
			}else{
522
				logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
523
			}
524
			
525
//			???
526
//			nomRefToSave.put(refId, referenceBase);
527
			hasNomRef = true;
528
			nomReference = referenceBase;
529
			refCounter.nomRefCount++;
530
		}
531
		//is bibliographical Reference
532
		if ((CdmUtils.isNotEmpty(refCache) && isPreliminary && ! refCache.equalsIgnoreCase(nomRefCache)) 
533
				|| (CdmUtils.isNotEmpty(title) && ! isPreliminary && ! title.equalsIgnoreCase(nomTitleAbbrev)) 
534
				|| hasNomRef == false){
535
			if (hasNomRef){
536
				referenceBase = (Reference)referenceBase.clone();
537
				copyCreatedUpdated(referenceBase, nomReference);
538
			}
539
			referenceBase.setTitle(title);
540
			TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, false);
541
			referenceBase.setAuthorTeam(author);
542
			referenceBase.setNomenclaturallyRelevant(false);
543
			if (isPreliminary){
544
				referenceBase.setTitleCache(refCache, true);
545
			}
546
			if (! biblioRefToSave.containsKey(refId)){
547
				biblioRefToSave.put(refId, referenceBase);
548
			}else{
549
				logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
550
			}
551
			hasBiblioRef = true;
552
			
553
			//??
554
			//biblioRefToSave.put(refId, referenceBase);
555
			refCounter.referenceCount++;
556
		}
557
		//refId
558
		if (hasNomRef){
559
			ImportHelper.setOriginalSource(nomReference, sourceReference, refId, NOM_REFERENCE_NAMESPACE);
560
		}
561
		if (hasBiblioRef){
562
			ImportHelper.setOriginalSource(referenceBase, sourceReference, refId, BIBLIO_REFERENCE_NAMESPACE);
563
		}
564
		
565
		return true;
566
		
567
	}
568
	
569
	/**
570
	 * Copies the created and updated information from the nomReference to the cloned bibliographic reference
571
	 * @param referenceBase
572
	 * @param nomReference
573
	 */
574
	private void copyCreatedUpdated(Reference<?> biblioReference, Reference nomReference) {
575
		biblioReference.setCreatedBy(nomReference.getCreatedBy());
576
		biblioReference.setCreated(nomReference.getCreated());
577
		biblioReference.setUpdatedBy(nomReference.getUpdatedBy());
578
		biblioReference.setUpdated(nomReference.getUpdated());
579
		
580
	}
581

    
582
	private Reference<?> makeArticle (Map<String, Object> valueMap, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences){
583
		
584
		IArticle article = ReferenceFactory.newArticle();
585
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
586
		Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
587
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
588
		
589
		if (inRefFk != null){
590
			if (inRefCategoryFk == REF_JOURNAL){
591
				int inRefFkInt = (Integer)inRefFk;
592
				if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
593
					Reference<?> inJournal = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
594
					if (inJournal == null){
595
						inJournal = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
596
						logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
597
						nomRefToSave.put(inRefFkInt, inJournal);
598
					}
599
					if (inJournal == null){
600
						logger.warn("inJournal for " + inRefFkInt + " is null. "+
601
							" InReference relation could not be set");
602
					//}else if (Reference.class.isAssignableFrom(inJournal.getClass())){
603
					}else if (inJournal.getType().equals(ReferenceType.Journal)){
604
						article.setInJournal((IJournal)inJournal);
605
					}else{
606
						logger.warn("InJournal is not of type journal but of type " + inJournal.getType() +
607
							" Inreference relation could not be set");
608
					}
609
				}else{
610
					logger.error("Journal (refId = " + inRefFkInt + " ) for Article (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
611
					//success = false;;
612
				}
613
			}else{
614
				logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not (RefCategoryFk=" + inRefCategoryFk + "))." +
615
					" InReference was not added to Article! ");
616
			}
617
		}
618
		makeStandardMapper(valueMap, (Reference)article); //url, pages, series, volume
619
		return (Reference)article;
620
	}
621
	
622
	private Reference<?> makePartOfOtherTitle (Map<String, Object> valueMap, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences){
623
		Reference<?> result;
624
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
625
		Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
626
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
627
		
628
		if (inRefCategoryFk == null){
629
			//null -> error
630
			logger.warn("Part-Of-Other-Title has not inRefCategoryFk! RefId = " + refId + ". ReferenceType set to Generic.");
631
			result = makeUnknown(valueMap);
632
		}else if (inRefCategoryFk == REF_BOOK){
633
			//BookSection
634
			IBookSection bookSection = ReferenceFactory.newBookSection();
635
			result = (Reference)bookSection;
636
			if (inRefFk != null){
637
				int inRefFkInt = (Integer)inRefFk;
638
				if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
639
					Reference<?> inBook = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
640
					if (inBook == null){
641
						inBook = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
642
						logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
643
						nomRefToSave.put(inRefFkInt, inBook);
644
					}
645
					if (inBook == null){
646
						logger.warn("inBook for " + inRefFkInt + " is null. "+
647
						" InReference relation could not be set");;
648
					//}else if (Book.class.isAssignableFrom(inBook.getClass())){
649
					}else if (inBook.getType().equals(ReferenceType.Book)){
650
						bookSection.setInBook((IBook)inBook);
651
						//TODO
652
					}else{
653
						logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
654
								" Inreference relation could not be set");
655
					}
656
				}else{
657
					logger.error("Book (refId = " + inRefFkInt + ") for part_of_other_title (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
658
					//success = false;
659
				}
660
			}
661
		}else if (inRefCategoryFk == REF_ARTICLE){
662
			//Article
663
			//TODO 
664
			logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
665
					" This type is not implemented yet. Generic reference created instead") ;
666
			result = ReferenceFactory.newGeneric();
667
		}else if (inRefCategoryFk == REF_JOURNAL){
668
			//TODO 
669
			logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' has inReference of type 'journal'." +
670
					" This is not allowed! Generic reference created instead") ;
671
			result = ReferenceFactory.newGeneric();
672
			result.addMarker(Marker.NewInstance(MarkerType.TO_BE_CHECKED(), true));
673
		}else{
674
			logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
675
				" Create 'Generic' reference instead");
676
			result = ReferenceFactory.newGeneric();
677
		}
678
		makeStandardMapper(valueMap, result); //url, pages
679
		return result;
680
	}
681
	
682

    
683
	/**
684
	 * @param inRefFkInt
685
	 * @param biblioRefToSave
686
	 * @param nomRefToSave
687
	 * @param relatedBiblioReferences
688
	 * @param relatedNomReferences
689
	 * @return
690
	 */
691
	private boolean existsInMapOrToSave(Integer inRefFkInt, Map<Integer, Reference> biblioRefToSave, Map<Integer, Reference> nomRefToSave, Map<String, Reference> relatedBiblioReferences, Map<String, Reference> relatedNomReferences) {
692
		boolean result = false;
693
		if (inRefFkInt == null){
694
			return false;
695
		}
696
		result |= nomRefToSave.containsKey(inRefFkInt);
697
		result |= biblioRefToSave.containsKey(inRefFkInt);
698
		result |= relatedBiblioReferences.containsKey(String.valueOf(inRefFkInt));
699
		result |= relatedNomReferences.containsKey(String.valueOf(inRefFkInt));
700
		return result;
701
	}
702

    
703
	private Reference<?> makeWebSite(Map<String, Object> valueMap){
704
		if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
705
		Reference webPage = ReferenceFactory.newWebPage();
706
		makeStandardMapper(valueMap, webPage); //placePublished, publisher
707
		return webPage;
708
	}
709
	
710
	private Reference<?> makeUnknown(Map<String, Object> valueMap){
711
		if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
712
		Reference generic = ReferenceFactory.newGeneric();
713
//		generic.setSeries(series);
714
		makeStandardMapper(valueMap, generic); //pages, placePublished, publisher, series, volume
715
		return generic;
716
	}
717

    
718
	private Reference<?> makeInformal(Map<String, Object> valueMap){
719
		if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
720
		Reference generic = ReferenceFactory.newGeneric();
721
//		informal.setSeries(series);
722
		makeStandardMapper(valueMap, generic);//editor, pages, placePublished, publisher, series, volume
723
		String informal = (String)valueMap.get("InformalRefCategory".toLowerCase());
724
		if (CdmUtils.isNotEmpty(informal) ){
725
			generic.addExtension(informal, ExtensionType.INFORMAL_CATEGORY());
726
		}
727
		return generic;
728
	}
729
	
730
	private Reference<?> makeDatabase(Map<String, Object> valueMap){
731
		if (logger.isDebugEnabled()){logger.debug("RefType 'Database'");}
732
		Reference database =  ReferenceFactory.newDatabase();
733
		makeStandardMapper(valueMap, database); //?
734
		return database;
735
	}
736
	
737
	private Reference<?> makeJournal(Map<String, Object> valueMap){
738
		if (logger.isDebugEnabled()){logger.debug("RefType 'Journal'");}
739
		Reference journal = ReferenceFactory.newJournal();
740
		
741
		Set<String> omitAttributes = new HashSet<String>();
742
		String series = "series";
743
//		omitAttributes.add(series);
744
		
745
		makeStandardMapper(valueMap, journal, omitAttributes); //issn,placePublished,publisher
746
//		if (valueMap.get(series) != null){
747
//			logger.warn("Series not yet implemented for journal!");
748
//		}
749
		return journal;
750
	}
751
	
752
	private Reference<?> makeBook(
753
				Map<String, Object> valueMap, 
754
				Map<Integer, Reference> biblioRefToSave, 
755
				Map<Integer, Reference> nomRefToSave, 
756
				Map<String, Reference> relatedBiblioReferences, 
757
				Map<String, Reference> relatedNomReferences){
758
		if (logger.isDebugEnabled()){logger.debug("RefType 'Book'");}
759
		Reference book = ReferenceFactory.newBook();
760
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
761
		
762
		//Set bookAttributes = new String[]{"edition", "isbn", "pages","publicationTown","publisher","volume"};
763
		
764
		Set<String> omitAttributes = new HashSet<String>();
765
		String attrSeries = "series";
766
//		omitAttributes.add(attrSeries);
767
		
768
		makeStandardMapper(valueMap, book, omitAttributes);
769
		
770
		//Series (as String)
771
		IPrintSeries printSeries = null;
772
		if (valueMap.get(attrSeries) != null){
773
			String series = (String)valueMap.get("title".toLowerCase());
774
			if (series == null){
775
				String nomTitle = (String)valueMap.get("nomTitleAbbrev".toLowerCase());
776
				series = nomTitle;
777
			}
778
			printSeries = ReferenceFactory.newPrintSeries(series);
779
			logger.info("Implementation of printSeries is preliminary");
780
		}
781
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
782
		//Series (as Reference)
783
		if (inRefFk != null){
784
			int inRefFkInt = (Integer)inRefFk;
785
			if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
786
				Reference<?> inSeries = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
787
				if (inSeries == null){
788
					inSeries = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
789
					logger.info("inSeries (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
790
					nomRefToSave.put(inRefFkInt, inSeries);
791
				}
792
				if (inSeries == null){
793
					logger.warn("inSeries for " + inRefFkInt + " is null. "+
794
					" InReference relation could not be set");;
795
				//}else if (PrintSeries.class.isAssignableFrom(inSeries.getClass())){
796
				}else if (inSeries.getType().equals(ReferenceType.PrintSeries)){
797
					book.setInSeries((IPrintSeries)inSeries);
798
					//TODO
799
				}else{
800
					logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getType().getMessage() +
801
							". In-reference relation could not be set for refId " + refId + " and inRefFk " + inRefFk);
802
				}
803
			}else{
804
				logger.error("PrintSeries (refId = " + inRefFkInt + ") for book (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
805
				//success = false;
806
			}
807
		}
808
		if (book.getInSeries() != null && printSeries != null){
809
			logger.warn("Book has series string and inSeries reference. Can not take both. Series string neglected");
810
		}else{
811
			book.setInSeries(printSeries);
812
		}
813
		book.setEditor(null);
814
		return book;
815
		
816
	}
817
	
818
	/**
819
	 * Returns the requested object if it exists in one of both maps. Prefers the refToSaveMap in ambigious cases.
820
	 * @param inRefFkInt
821
	 * @param nomRefToSave
822
	 * @param relatedNomReferences
823
	 * @return
824
	 */
825
	private Reference<?> getReferenceFromMaps(
826
			int inRefFkInt,
827
			Map<Integer, Reference> refToSaveMap,
828
			Map<String, Reference> relatedRefMap) {
829
		Reference result = null;
830
		result = refToSaveMap.get(inRefFkInt);
831
		if (result == null){
832
			result = relatedRefMap.get(String.valueOf(inRefFkInt));
833
		}
834
		return result;
835
	}
836

    
837
	private Reference<?> makePrintSeries(Map<String, Object> valueMap){
838
		if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}
839
		Reference printSeries = ReferenceFactory.newPrintSeries();
840
		makeStandardMapper(valueMap, printSeries, null);
841
		return printSeries;
842
	}
843
	
844
	private Reference<?> makeProceedings(Map<String, Object> valueMap){
845
		if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}
846
		Reference proceedings = ReferenceFactory.newProceedings();
847
		makeStandardMapper(valueMap, proceedings, null);	
848
		return proceedings;
849
	}
850

    
851
	private Reference<?> makeThesis(Map<String, Object> valueMap){
852
		if (logger.isDebugEnabled()){logger.debug("RefType 'Thesis'");}
853
		Reference thesis = ReferenceFactory.newThesis();
854
		makeStandardMapper(valueMap, thesis, null);	
855
		return thesis;
856
	}
857

    
858
	
859
	private Reference<?> makeJournalVolume(Map<String, Object> valueMap){
860
		if (logger.isDebugEnabled()){logger.debug("RefType 'JournalVolume'");}
861
		//Proceedings proceedings = Proceedings.NewInstance();
862
		Reference journalVolume = ReferenceFactory.newGeneric();
863
		makeStandardMapper(valueMap, journalVolume, null);	
864
		logger.warn("Journal volumes not yet implemented. Generic created instead but with errors");
865
		return journalVolume;
866
	}
867
	
868
	private boolean makeStandardMapper(Map<String, Object> valueMap, Reference<?> ref){
869
		return makeStandardMapper(valueMap, ref, null);
870
	}
871

    
872
	
873
	private boolean makeStandardMapper(Map<String, Object> valueMap, CdmBase cdmBase, Set<String> omitAttributes){
874
		boolean result = true;	
875
		for (CdmAttributeMapperBase mapper : classMappers){
876
			if (mapper instanceof CdmSingleAttributeMapperBase){
877
				result &= makeStandardSingleMapper(valueMap, cdmBase, (CdmSingleAttributeMapperBase)mapper, omitAttributes);
878
			}else if (mapper instanceof CdmOneToManyMapper){
879
				result &= makeMultipleValueAddMapper(valueMap, cdmBase, (CdmOneToManyMapper)mapper, omitAttributes);
880
			}else{
881
				logger.error("Unknown mapper type");
882
				result = false;
883
			}
884
		}
885
		return result;
886
	}
887
	
888
	private boolean makeStandardSingleMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmSingleAttributeMapperBase mapper, Set<String> omitAttributes){
889
		boolean result = true;
890
		if (omitAttributes == null){
891
			omitAttributes = new HashSet<String>();
892
		}
893
		if (mapper instanceof DbImportExtensionMapper){
894
			result &= ((DbImportExtensionMapper)mapper).invoke(valueMap, cdmBase);
895
		}else{
896
			String sourceAttribute = mapper.getSourceAttributeList().get(0).toLowerCase();
897
			Object value = valueMap.get(sourceAttribute);
898
			if (value != null){
899
				String destinationAttribute = mapper.getDestinationAttribute();
900
				if (! omitAttributes.contains(destinationAttribute)){
901
					result &= ImportHelper.addValue(value, cdmBase, destinationAttribute, mapper.getTypeClass(), OVERWRITE, OBLIGATORY);
902
				}
903
			}
904
		}
905
		return result;
906
	}
907

    
908
	
909
	private boolean makeMultipleValueAddMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmOneToManyMapper<CdmBase, CdmBase, CdmSingleAttributeMapperBase> mapper, Set<String> omitAttributes){
910
		if (omitAttributes == null){
911
			omitAttributes = new HashSet<String>();
912
		}
913
		boolean result = true;
914
		String destinationAttribute = mapper.getSingleAttributeName();
915
		List<Object> sourceValues = new ArrayList<Object>();
916
		List<Class> classes = new ArrayList<Class>();
917
		for (CdmSingleAttributeMapperBase singleMapper : mapper.getSingleMappers()){
918
			String sourceAttribute = singleMapper.getSourceAttribute();
919
			Object value = valueMap.get(sourceAttribute);
920
			sourceValues.add(value);
921
			Class<?> clazz = singleMapper.getTypeClass();
922
			classes.add(clazz);
923
		}
924
		
925
		result &= ImportHelper.addMultipleValues(sourceValues, cdmBase, destinationAttribute, classes, NO_OVERWRITE, OBLIGATORY);
926
//		//only for testing
927
//		if (cdmBase instanceof PublicationBase){
928
//			PublicationBase pub = ((PublicationBase)cdmBase);
929
//			pub.addPublisher("A new publisher for " + pub.getTitleCache(), "A nice place");
930
//		}
931
		return result;
932
	}
933

    
934
	
935
	private static TeamOrPersonBase<?> getAuthorTeam(String authorString, TeamOrPersonBase<?> nomAuthor, boolean preferNomeclaturalAuthor){
936
		TeamOrPersonBase<?> result;
937
		if (preferNomeclaturalAuthor){
938
			if (nomAuthor != null){
939
				result = nomAuthor;
940
			}else{
941
				if (CdmUtils.isEmpty(authorString)){
942
					result = null;
943
				}else{
944
					TeamOrPersonBase<?> team = Team.NewInstance();
945
					//TODO which one to use??
946
					team.setNomenclaturalTitle(authorString);
947
					team.setTitleCache(authorString, true);
948
					result = team;
949
				}
950
			}
951
		}else{ //prefer bibliographic
952
			if (CdmUtils.isNotEmpty(authorString)){
953
				TeamOrPersonBase<?> team = Team.NewInstance();
954
				//TODO which one to use??
955
				team.setNomenclaturalTitle(authorString);
956
				team.setTitleCache(authorString, true);
957
				result = team;
958
			}else{
959
				result = nomAuthor;
960
			}
961
		}
962
		return result;
963
	}
964
	
965
	
966
	/**
967
	 * @param lowerCase
968
	 * @param config
969
	 * @return
970
	 */
971
	public Set<String> getObligatoryAttributes(boolean lowerCase, BerlinModelImportConfigurator config){
972
		Set<String> result = new HashSet<String>();
973
		Class<ICdmIO>[] ioClassList = config.getIoClassList();
974
		logger.warn("getObligatoryAttributes has been commented because it still needs to be adapted to the new package structure");
975
		result.addAll(Arrays.asList(unclearMappers));
976
		result.addAll(Arrays.asList(createdAndNotesAttributes));
977
		result.addAll(Arrays.asList(operationalAttributes));
978
		CdmIoMapping mapping = new CdmIoMapping();
979
		for (CdmAttributeMapperBase mapper : classMappers){
980
			mapping.addMapper(mapper);
981
		}
982
		result.addAll(mapping.getSourceAttributes());
983
		if (lowerCase){
984
			Set<String> lowerCaseResult = new HashSet<String>();
985
			for (String str : result){
986
				if (str != null){lowerCaseResult.add(str.toLowerCase());}
987
			}
988
			result = lowerCaseResult;
989
		}
990
		return result;
991
	}
992

    
993
	/* (non-Javadoc)
994
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)
995
	 */
996
	@Override
997
	protected boolean doCheck(BerlinModelImportState state){
998
		BerlinModelReferenceImportValidator validator = new BerlinModelReferenceImportValidator();
999
		return validator.validate(state, this);
1000
	}
1001
	
1002
	
1003
	/* (non-Javadoc)
1004
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getTableName()
1005
	 */
1006
	@Override
1007
	protected String getTableName() {
1008
		return dbTableName;
1009
	}
1010

    
1011
	/* (non-Javadoc)
1012
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getPluralString()
1013
	 */
1014
	@Override
1015
	public String getPluralString() {
1016
		return pluralString;
1017
	}
1018
	
1019
	/* (non-Javadoc)
1020
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
1021
	 */
1022
	protected boolean isIgnore(BerlinModelImportState state){
1023
		return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
1024
	}
1025

    
1026
	
1027

    
1028

    
1029
}
(13-13/21)