Project

General

Profile

Download (41 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.ReferenceBase;
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 boolean initializeMappers(BerlinModelImportState state){
100
		for (CdmAttributeMapperBase mapper: classMappers){
101
			if (mapper instanceof DbImportExtensionMapper){
102
				((DbImportExtensionMapper)mapper).initialize(state, ReferenceBase.class);
103
			}
104
		}
105
		return true;
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 boolean doInvoke(BerlinModelImportState state){
165
		boolean success = true;
166
		logger.info("start make " + getPluralString() + " ...");
167

    
168
		success &= 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
				return false;
192
			}
193
		} catch (SQLException e1) {
194
			e1.printStackTrace();
195
			logger.error("There are references with more then 2 in-reference recursion. Maximum number of allowed recursions is 2. Records will not be stored.");
196
			success = false;
197
		}
198

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

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

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

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

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

    
240
		} catch (SQLException e) {
241
			logger.error("SQLException:" +  e);
242
			return false;
243
		}
244
		logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));
245
		return success;
246
	}
247

    
248
	
249

    
250
	/* (non-Javadoc)
251
	 * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)
252
	 */
253
	public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
254
		boolean success = true;
255
//		MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
256
//		MapWrapper<ReferenceBase> nomRefStore= new MapWrapper<ReferenceBase>(null);
257

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

    
305
			logger.info("end makeReferences ..." + getSuccessString(success));;
306
			return success;
307
		} catch (SQLException e) {
308
			logger.error("SQLException:" +  e);
309
			return false;
310
		}
311
	}
312

    
313

    
314

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

    
341
			
342
			//nom reference map
343
			nameSpace = NOM_REFERENCE_NAMESPACE;
344
			cdmClass = ReferenceBase.class;
345
			idSet = referenceIdSet;
346
			Map<String, ReferenceBase> nomRefMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
347
			result.put(nameSpace, nomRefMap);
348

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

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

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

    
451

    
452
		} catch (Exception e) {
453
			logger.warn("Reference with BM refId '" + CdmUtils.Nz(refId) +  "' threw Exception and could not be saved");
454
			e.printStackTrace();
455
			success = false;
456
		}
457
		return success;
458
	}
459

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

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

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

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

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

    
832
	private ReferenceBase<?> makePrintSeries(Map<String, Object> valueMap){
833
		if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}
834
		ReferenceBase printSeries = ReferenceFactory.newPrintSeries();
835
		makeStandardMapper(valueMap, printSeries, null);
836
		return printSeries;
837
	}
838
	
839
	private ReferenceBase<?> makeProceedings(Map<String, Object> valueMap){
840
		if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}
841
		ReferenceBase proceedings = ReferenceFactory.newProceedings();
842
		makeStandardMapper(valueMap, proceedings, null);	
843
		return proceedings;
844
	}
845

    
846
	private ReferenceBase<?> makeThesis(Map<String, Object> valueMap){
847
		if (logger.isDebugEnabled()){logger.debug("RefType 'Thesis'");}
848
		ReferenceBase thesis = ReferenceFactory.newThesis();
849
		makeStandardMapper(valueMap, thesis, null);	
850
		return thesis;
851
	}
852

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

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

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

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

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

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

    
1021
	
1022

    
1023

    
1024
}
(13-13/21)