View Javadoc

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 }