Project

General

Profile

Download (46.8 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * 
3
 */
4
package eu.etaxonomy.cdm.io.berlinModel;
5

    
6
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_ARTICLE;
7
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_BOOK;
8
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_DATABASE;
9
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_INFORMAL;
10
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL;
11
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PART_OF_OTHER_TITLE;
12
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_UNKNOWN;
13
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_WEBSITE;
14
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PRINT_SERIES;
15
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_CONFERENCE_PROCEEDINGS;
16
import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL_VOLUME;
17

    
18
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.ALL;
19
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES;
20
import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.NOMENCLATURAL;
21
import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;
22
import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;
23

    
24
import java.sql.ResultSet;
25
import java.sql.SQLException;
26
import java.util.ArrayList;
27
import java.util.Arrays;
28
import java.util.HashMap;
29
import java.util.HashSet;
30
import java.util.Iterator;
31
import java.util.List;
32
import java.util.Map;
33
import java.util.Set;
34

    
35
import org.apache.log4j.Logger;
36

    
37
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
38
import eu.etaxonomy.cdm.api.service.IReferenceService;
39
import eu.etaxonomy.cdm.common.CdmUtils;
40
import eu.etaxonomy.cdm.io.common.CdmIoMapperBase;
41
import eu.etaxonomy.cdm.io.common.CdmIoMapping;
42
import eu.etaxonomy.cdm.io.common.ICdmIO;
43
import eu.etaxonomy.cdm.io.common.IImportConfigurator;
44
import eu.etaxonomy.cdm.io.common.ImportHelper;
45
import eu.etaxonomy.cdm.io.common.MapWrapper;
46
import eu.etaxonomy.cdm.io.common.Source;
47
import eu.etaxonomy.cdm.model.agent.Team;
48
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
49
import eu.etaxonomy.cdm.model.common.CdmBase;
50
import eu.etaxonomy.cdm.model.common.Marker;
51
import eu.etaxonomy.cdm.model.common.MarkerType;
52
import eu.etaxonomy.cdm.model.common.TimePeriod;
53
import eu.etaxonomy.cdm.model.reference.Article;
54
import eu.etaxonomy.cdm.model.reference.Book;
55
import eu.etaxonomy.cdm.model.reference.BookSection;
56
import eu.etaxonomy.cdm.model.reference.Database;
57
import eu.etaxonomy.cdm.model.reference.Generic;
58
import eu.etaxonomy.cdm.model.reference.Journal;
59
import eu.etaxonomy.cdm.model.reference.PrintSeries;
60
import eu.etaxonomy.cdm.model.reference.Proceedings;
61
import eu.etaxonomy.cdm.model.reference.ReferenceBase;
62
import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;
63
import eu.etaxonomy.cdm.model.reference.WebPage;
64

    
65
/**
66
 * @author a.mueller
67
 *
68
 */
69
public class BerlinModelReferenceIO extends BerlinModelIOBase {
70
	private static final Logger logger = Logger.getLogger(BerlinModelReferenceIO.class);
71

    
72
	private int modCount = 1000;
73
	
74
	public BerlinModelReferenceIO(){
75
		super();
76
	}
77
	
78
	
79
	protected static CdmIoMapperBase[] classMappers = new CdmIoMapperBase[]{
80
		new CdmStringMapper("edition", "edition"),
81
		new CdmStringMapper("volume", "volume"),
82
		new CdmStringMapper("publicationTown", "placePublished"),
83
		new CdmStringMapper("publisher", "publisher"),
84
		new CdmStringMapper("isbn", "isbn"),
85
		new CdmStringMapper("pageString", "pages"),
86
		new CdmStringMapper("series", "series"),
87
		new CdmStringMapper("issn", "issn"),
88
		new CdmStringMapper("url", "uri")
89
	};
90
	
91
	
92
	protected static String[] operationalAttributes = new String[]{
93
		"refId", "refCache", "nomRefCache", "preliminaryFlag", "inRefFk", "title", "nomTitleAbbrev",
94
		"refAuthorString", "nomAuthorTeamFk",
95
		"refCategoryFk", "thesisFlag", "informalRefCategory", "idInSource"
96
	};
97
	
98
	protected static String[] createdAndNotesAttributes = new String[]{
99
			"created_When", "updated_When", "created_Who", "updated_Who", "notes"
100
	};
101
	
102
	protected static String[] unclearMappers = new String[]{
103
			"dateString", "refYear", "nomStandard", 
104
			"refDepositedAt", "isPaper", "exportDate", 
105
			"refSourceFk"
106
	};
107
	
108
	
109
	protected boolean checkObligatoryAttributes(IImportConfigurator config){
110
		boolean result = true;
111
		
112
		try {
113
			String strQuery = " SELECT Reference.* " +
114
			    " FROM Reference " +
115
//            	" INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
116
			    " WHERE (1=0) ";
117
			BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
118
			Source source = bmiConfig.getSource();
119
			ResultSet rs = source.getResultSet(strQuery);
120
			int colCount = rs.getMetaData().getColumnCount();
121
			Set<String> existingAttributes = new HashSet<String>();
122
			for (int c = 0; c < colCount ; c++){
123
				existingAttributes.add(rs.getMetaData().getColumnLabel(c+1).toLowerCase());
124
			}
125
			Set<String> obligatoryAttributes = getObligatoryAttributes(true);
126
			
127
			obligatoryAttributes.removeAll(existingAttributes);
128
			for (String attr : obligatoryAttributes){
129
				logger.warn("Missing attribute: " + attr);
130
			}
131
			
132
			//additional Attributes
133
			obligatoryAttributes = getObligatoryAttributes(true);
134
			
135
			existingAttributes.removeAll(obligatoryAttributes);
136
			for (String attr : existingAttributes){
137
				logger.warn("Additional attribute: " + attr);
138
			}
139
		} catch (SQLException e) {
140
			logger.error(e);
141
			e.printStackTrace();
142
			result = false;
143
		}
144
		return result;
145
	}
146
	
147
	protected Set<String> getObligatoryAttributes(boolean lowerCase){
148
		Set<String> result = new HashSet<String>();
149
		result.addAll(Arrays.asList(unclearMappers));
150
		result.addAll(Arrays.asList(createdAndNotesAttributes));
151
		result.addAll(Arrays.asList(operationalAttributes));
152
		CdmIoMapping mapping = new CdmIoMapping();
153
		for (CdmIoMapperBase mapper : classMappers){
154
			mapping.addMapper(mapper);
155
		}
156
		result.addAll(mapping.getSourceAttributes());
157
		if (lowerCase){
158
			Set<String> lowerCaseResult = new HashSet<String>();
159
			for (String str : result){
160
				if (str != null){lowerCaseResult.add(str.toLowerCase());}
161
			}
162
			result = lowerCaseResult;
163
		}
164
		return result;
165
	}
166
	
167
	
168
	//type to count the references nomReferences that have been created and saved
169
	private class RefCounter{
170
		RefCounter() {nomRefCount = 0; referenceCount = 0;};
171
		int nomRefCount;
172
		int referenceCount;
173
		public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(referenceCount);};
174
	}
175
	
176
	/* (non-Javadoc)
177
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
178
	 */
179
	@Override
180
	protected boolean doCheck(IImportConfigurator config){
181
		boolean result = true;
182
		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
183
		result &= checkArticlesWithoutJournal(bmiConfig);
184
		result &= checkPartOfJournal(bmiConfig);
185
		result &= checkPartOfUnresolved(bmiConfig);
186
		result &= checkPartOfPartOf(bmiConfig);
187
		result &= checkPartOfArticle(bmiConfig);
188
		result &= checkJournalsWithSeries(bmiConfig);
189
		result &= checkObligatoryAttributes(bmiConfig);
190
		
191
		if (result == false ){System.out.println("========================================================");}
192
		
193
		
194
		return result;
195
	}
196
		
197

    
198
	
199
	private boolean doPreliminaryRefDetails(IImportConfigurator config, CdmApplicationController cdmApp,
200
			Map<String, MapWrapper<? extends CdmBase>> stores){
201
		
202
		MapWrapper<TeamOrPersonBase> authorMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.AUTHOR_STORE);
203
		MapWrapper<ReferenceBase> refDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REF_DETAIL_STORE);
204
		MapWrapper<ReferenceBase> nomRefDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_DETAIL_STORE);
205
		
206
		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
207
		Source source = bmiConfig.getSource();
208
		boolean success = true;
209
		logger.info("start makeRefDetails ...");
210
		
211
		IReferenceService referenceService = cdmApp.getReferenceService();
212
		
213
		try {
214
			//get data from database
215
			String strQuery = 
216
					" SELECT RefDetail.*, Reference.RefYear " +
217
                    " FROM RefDetail " +
218
                    	" INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
219
                    " WHERE (1=1) AND (RefDetail.PreliminaryFlag = 1)";
220
			
221
			ResultSet rs = source.getResultSet(strQuery);
222
			String namespace = "RefDetail";
223
			
224
			int i = 0;
225
			RefCounter refCounter  = new RefCounter();
226
			while (rs.next()){
227
				
228
				if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RefDetails handled: " + (i-1) );}
229
				int refDetailId = rs.getInt("refDetailId"); 
230
				String refYear = rs.getString("RefYear"); 
231
				
232
				//nomRef
233
				String fullNomRefCache = rs.getString("fullNomRefCache"); 
234
				if (! CdmUtils.Nz(fullNomRefCache).trim().equals("") ){
235
					Generic genericReference = Generic.NewInstance();
236
					genericReference.setTitleCache(fullNomRefCache);
237
					nomRefDetailMap.put(refDetailId, genericReference);
238
					//refId, created, notes
239
					doIdCreatedUpdatedNotes(bmiConfig, genericReference, rs, refDetailId, namespace );						
240
					//year
241
					genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); 
242
					refCounter.nomRefCount++;
243
				}	
244
				
245
				//biblioRef
246
				String fullRefCache = rs.getString("fullRefCache"); 
247
				if (! CdmUtils.Nz(fullRefCache).trim().equals("") && 
248
						fullRefCache.equals(fullNomRefCache)){
249
					Generic genericReference = Generic.NewInstance();
250
					genericReference.setTitleCache(fullRefCache);
251
					refDetailMap.put(refDetailId, genericReference);
252
					
253
					//refId, created, notes
254
					doIdCreatedUpdatedNotes(bmiConfig, genericReference, rs, refDetailId, namespace );						
255
					//year
256
					genericReference.setDatePublished(ImportHelper.getDatePublished(refYear)); 
257
					refCounter.referenceCount++;
258
				}
259

    
260
				
261
				//TODO
262
				//SecondarySources
263
				//IdInSource
264
			}
265
			//save and store in map
266
			logger.info("Save nomenclatural preliminary references (" + refCounter.nomRefCount + ")");
267
			referenceService.saveReferenceAll(nomRefDetailMap.objects());
268
			logger.info("Save bibliographical preliminary references (" + refCounter.referenceCount +")");
269
			referenceService.saveReferenceAll(refDetailMap.objects());
270
			
271
		} catch (SQLException e) {
272
			logger.error("SQLException:" +  e);
273
			return false;
274
		}
275
		return success;
276
	}
277
	
278
	
279

    
280
	@Override
281
	protected boolean doInvoke(IImportConfigurator config,
282
			Map<String, MapWrapper<? extends CdmBase>> stores){
283
		
284
		MapWrapper<TeamOrPersonBase> authorMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.AUTHOR_STORE);
285
				
286
		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
287
		Source source = bmiConfig.getSource();
288
	    CdmApplicationController cdmApp = config.getCdmAppController();
289
		boolean success = true;
290
		MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
291
		MapWrapper<ReferenceBase> nomRefStore= new MapWrapper<ReferenceBase>(null);
292
		
293
		//preliminary RefDetails  //TODO -> move to own class ?
294
		doPreliminaryRefDetails(config, cdmApp, stores);
295
		
296
		logger.info("start makeReferences ...");
297
		IReferenceService referenceService = cdmApp.getReferenceService();
298
		
299
		try {
300
			//get data from database
301
			String strQueryBase = 
302
					" SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk,  " +
303
						" InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
304
						" InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk " +
305
                    " FROM Reference AS InInReference " +
306
                    	" RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " + 
307
                    	" RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " + 
308
					" WHERE (1=1)  "; 
309
				//strQueryBase += " AND Reference.refId = 1933 " ; //7000000
310
			String strQueryNoInRef = strQueryBase + 
311
				" AND (Reference.InRefFk is NULL) ";
312
			
313
			String strQuery1InRef = strQueryBase + 
314
				" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
315

    
316
			String strQuery2InRef = strQueryBase + 
317
				" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
318

    
319
			String strQueryTesMaxRecursion = strQueryBase + 
320
				" AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
321

    
322
			ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);
323
			if (testMaxRecursionResultSet.next() == true){
324
				logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
325
				return false;
326
			}
327

    
328
			if (bmiConfig.getDoReferences() == CONCEPT_REFERENCES){
329
				strQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) ";
330
			}
331
			
332
			List<ResultSet> resultSetList = new ArrayList<ResultSet>();
333
			resultSetList.add(source.getResultSet(strQueryNoInRef));
334
			if (bmiConfig.getDoReferences() == ALL || bmiConfig.getDoReferences() == NOMENCLATURAL){
335
				resultSetList.add(source.getResultSet(strQuery1InRef));
336
				resultSetList.add(source.getResultSet(strQuery2InRef));
337
			}
338
			
339
			String namespace = "Reference";
340
			
341
			int j = 0;
342
			Iterator<ResultSet> resultSetListIterator =  resultSetList.listIterator();
343
			//for each resultsetlist
344
			while (resultSetListIterator.hasNext()){
345
				int i = 0;
346
				RefCounter refCounter  = new RefCounter();
347
				
348
				ResultSet rs = resultSetListIterator.next();
349
				//for each resultset
350
				while (rs.next()){
351
					
352
					if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round " + j);}
353

    
354
					Map<String, Object> valueMap = new HashMap<String, Object>();
355
					int colCount = rs.getMetaData().getColumnCount();
356
					for (int c = 0; c < colCount ; c++){
357
						Object value = rs.getObject(c+1);
358
						String label = rs.getMetaData().getColumnLabel(c+1).toLowerCase();
359
						if (value != null && ! CdmUtils.Nz(value.toString()).trim().equals("")){
360
							valueMap.put(label, value);
361
						}
362
					}
363
					
364
					Integer categoryFk = (Integer)valueMap.get("refCategoryFk".toLowerCase());
365
					Integer refId = (Integer)valueMap.get("refId".toLowerCase());
366
					
367
					
368
					StrictReferenceBase referenceBase;
369
					try {
370
						logger.debug("RefCategoryFk: " + categoryFk);
371
						
372
						if (categoryFk == REF_JOURNAL){
373
							referenceBase = makeJournal(valueMap);
374
						}else if(categoryFk == REF_BOOK){
375
							referenceBase = makeBook(valueMap, referenceStore, nomRefStore);
376
						}else if(categoryFk == REF_DATABASE){
377
							referenceBase = makeDatabase(valueMap);
378
						}else if(categoryFk == REF_INFORMAL){
379
							referenceBase = makeInformal(valueMap);
380
						}else if(categoryFk == REF_WEBSITE){
381
							referenceBase = makeWebSite(valueMap);
382
						}else if(categoryFk == REF_UNKNOWN){
383
							referenceBase = makeUnknown(valueMap);
384
						}else if(categoryFk == REF_PRINT_SERIES){
385
							referenceBase = makePrintSeries(valueMap);
386
						}else if(categoryFk == REF_CONFERENCE_PROCEEDINGS){
387
							referenceBase = makeProceedings(valueMap);
388
						}else if(categoryFk == REF_ARTICLE){
389
							referenceBase = makeArticle(valueMap, referenceStore, nomRefStore);
390
						}else if(categoryFk == REF_JOURNAL_VOLUME){
391
							referenceBase = makeJournalVolume(valueMap);
392
						}else if(categoryFk == REF_PART_OF_OTHER_TITLE){
393
							referenceBase = makePartOfOtherTitle(valueMap, referenceStore, nomRefStore);
394
						}else{
395
							logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
396
							referenceBase = Generic.NewInstance();
397
						}
398
										
399
						
400
						String refYear = (String)valueMap.get("refYear".toLowerCase());
401
						
402
						//refId, created, notes
403
						doIdCreatedUpdatedNotes(bmiConfig, referenceBase, rs, refId, namespace );						
404
						//refYear
405
						referenceBase.setDatePublished(ImportHelper.getDatePublished(refYear)); 
406
						
407
						//
408
						success &= makeNomAndBiblioReference(rs, refId, referenceBase, refCounter, 
409
								referenceStore, nomRefStore, authorMap, stores );
410

    
411
					} catch (Exception e) {
412
						logger.warn("Reference with BM refId " + refId +  " threw Exception and could not be saved");
413
						e.printStackTrace();
414
						success = false;
415
						return success;
416
					}
417
				} // end resultSet
418
				
419
				//for the concept reference a fixed uuid may be needed -> change uuid
420
				ReferenceBase sec = referenceStore.get(bmiConfig.getSourceSecId());
421
				if (sec == null){
422
					sec = nomRefStore.get(bmiConfig.getSourceSecId());	
423
				}
424
				if (sec != null){
425
					sec.setUuid(bmiConfig.getSecUuid());
426
					logger.info("SecUuid changed to: " + bmiConfig.getSecUuid());
427
				}
428
				
429
				//save and store in map
430
				logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");
431
				referenceService.saveReferenceAll(nomRefStore.objects());
432
				logger.info("Save bibliographical references (" + refCounter.referenceCount +")");
433
				referenceService.saveReferenceAll(referenceStore.objects());
434
				j++;
435
			}//end resultSetList	
436

    
437
			logger.info("end makeReferences ...");
438
			return success;
439
		} catch (SQLException e) {
440
			logger.error("SQLException:" +  e);
441
			return false;
442
		}
443
	}
444
	
445
	private boolean makeNomAndBiblioReference(ResultSet rs, 
446
				int refId, 
447
				StrictReferenceBase referenceBase,  
448
				RefCounter refCounter, 
449
				MapWrapper<ReferenceBase> referenceStore, 
450
				MapWrapper<ReferenceBase> nomRefStore, 
451
				MapWrapper<TeamOrPersonBase> authorMap,
452
				Map<String, MapWrapper<? extends CdmBase>> stores				
453
				) throws SQLException{
454
		
455
		MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);
456
		MapWrapper<ReferenceBase> nomRefMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_STORE);
457
		
458
		
459
		String refCache = rs.getString("refCache");
460
		String nomRefCache = rs.getString("nomRefCache");
461
		String title = rs.getString("title");
462
		String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
463
		boolean isPreliminary = rs.getBoolean("PreliminaryFlag");
464
		String refAuthorString = rs.getString("refAuthorString");
465
		int nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");
466
		TeamOrPersonBase nomAuthor = authorMap.get(nomAuthorTeamFk);
467
		
468
		boolean hasNomRef = false;
469
		//is Nomenclatural Reference
470
		if ( (! CdmUtils.Nz(nomRefCache).equals("") && isPreliminary) || (! CdmUtils.Nz(nomTitleAbbrev).equals("") && ! isPreliminary) ){
471
			referenceBase.setTitle(nomTitleAbbrev);
472
			TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, true);
473
			referenceBase.setAuthorTeam(author);
474
			//referenceBase.setNomenclaturallyRelevant(true);
475
			if (isPreliminary){
476
				referenceBase.setTitleCache(nomRefCache);
477
			}
478
			if (! nomRefStore.containsId(refId)){
479
				if (referenceBase == null){
480
					logger.warn("refBase is null");
481
				}
482
				nomRefStore.put(refId, referenceBase);
483
			}else{
484
				logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
485
			}
486
			nomRefMap.put(refId, referenceBase);
487
			hasNomRef = true;
488
			refCounter.nomRefCount++;
489
		}
490
		//is bibliographical Reference
491
		if ((! CdmUtils.Nz(refCache).equals("") && isPreliminary) || (! CdmUtils.Nz(title).equals("") && ! isPreliminary) || hasNomRef == false){
492
			if (hasNomRef){
493
				referenceBase = (StrictReferenceBase)referenceBase.clone();
494
			}
495
			referenceBase.setTitle(title);
496
			TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, false);
497
			referenceBase.setAuthorTeam(author);
498
			referenceBase.setNomenclaturallyRelevant(false);
499
			if (isPreliminary){
500
				referenceBase.setTitleCache(refCache);
501
			}
502
			if (! referenceStore.containsId(refId)){
503
				referenceStore.put(refId, referenceBase);
504
			}else{
505
				logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
506
			}
507
			referenceMap.put(refId, referenceBase);
508
			refCounter.referenceCount++;
509
		}
510
		return true;
511
		
512
	}
513

    
514
	
515
	
516
	private StrictReferenceBase makeArticle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
517
		Article article = Article.NewInstance();
518
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
519
		Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
520
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
521
//		
522
//		//FIXME pages
523
//		String pages = (String)valueMap.get("pages".toLowerCase());
524
//		String series = (String)valueMap.get("series".toLowerCase());
525
//		String volume = (String)valueMap.get("volume".toLowerCase());
526
//		String url = (String)valueMap.get("url".toLowerCase());
527
		
528
		
529
		if (inRefFk != null){
530
			if (inRefCategoryFk == REF_JOURNAL){
531
				int inRefFkInt = (Integer)inRefFk;
532
				if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
533
					ReferenceBase inJournal = nomRefStore.get(inRefFkInt);
534
					if (inJournal == null){
535
						inJournal = referenceStore.get(inRefFkInt);
536
						logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
537
						nomRefStore.put(inRefFkInt, inJournal);
538
					}
539
					if (inJournal == null){
540
						logger.warn("inJournal for " + inRefFkInt + " is null. "+
541
						" InReference relation could not be set");
542
					}else if (Journal.class.isAssignableFrom(inJournal.getClass())){
543
						article.setInJournal((Journal)inJournal);
544
//						article.setPages(pages);
545
//						article.setSeries(series);
546
//						article.setVolume(volume);
547
//						article.setUri(url);
548
						//logger.info("InJournal success " + inRefFkInt);
549
					}else{
550
						logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +
551
							" Inreference relation could not be set");
552
					}
553
				}else{
554
					logger.error("Journal (refId = " + inRefFkInt + " ) for Article (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
555
					//success = false;;
556
				}
557
			}else{
558
				logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not (RefCategoryFk=" + inRefCategoryFk + "))." +
559
					" InReference was not added to Article! ");
560
			}
561
		}
562
		makeStandardMapper(valueMap, article); //url, pages, series, volume
563
		return article;
564
	}
565
	
566
	private StrictReferenceBase makePartOfOtherTitle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
567
		StrictReferenceBase result;
568
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
569
		Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
570
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
571
		
572
		if (inRefCategoryFk == REF_BOOK){
573
			//BookSection
574
			BookSection bookSection = BookSection.NewInstance();
575
			result = bookSection;
576
			if (inRefFk != null){
577
				int inRefFkInt = (Integer)inRefFk;
578
				if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
579
					ReferenceBase inBook = nomRefStore.get(inRefFkInt);
580
					if (inBook == null){
581
						inBook = referenceStore.get(inRefFkInt);
582
						logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
583
						nomRefStore.put(inRefFkInt, inBook);
584
					}
585
					if (inBook == null){
586
						logger.warn("inBook for " + inRefFkInt + " is null. "+
587
						" InReference relation could not be set");;
588
					}else if (Book.class.isAssignableFrom(inBook.getClass())){
589
						bookSection.setInBook((Book)inBook);
590
						//TODO
591
					}else{
592
						logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
593
								" Inreference relation could not be set");
594
					}
595
				}else{
596
					logger.error("Book (refId = " + inRefFkInt + ") for part_of_other_title (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
597
					//success = false;
598
				}
599
			}
600
		}else if (inRefCategoryFk == REF_ARTICLE){
601
			//Article
602
			//TODO 
603
			logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
604
					" This type is not implemented yet. Generic reference created instead") ;
605
			result = Generic.NewInstance();
606
		}else if (inRefCategoryFk == REF_JOURNAL){
607
			//TODO 
608
			logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' has inReference of type 'journal'." +
609
					" This is not allowed! Generic reference created instead") ;
610
			result = Generic.NewInstance();
611
			result.addMarker(Marker.NewInstance(MarkerType.TO_BE_CHECKED(), true));
612
		}else{
613
			logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
614
				" Create 'Generic' reference instead");
615
			result = Generic.NewInstance();
616
		}
617
		makeStandardMapper(valueMap, result); //url, pages
618
		return result;
619
	}
620
	
621
	private StrictReferenceBase makeWebSite(Map<String, Object> valueMap){
622
		if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
623
		WebPage webPage = WebPage.NewInstance();
624
		makeStandardMapper(valueMap, webPage); //placePublished, publisher
625
		return webPage;
626
	}
627
	
628
	private StrictReferenceBase makeUnknown(Map<String, Object> valueMap){
629
		if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
630
		Generic generic = Generic.NewInstance();
631
//		generic.setSeries(series);
632
		makeStandardMapper(valueMap, generic); //pages, placePublished, publisher, series, volume
633
		return generic;
634
	}
635

    
636
	private StrictReferenceBase makeInformal(Map<String, Object> valueMap){
637
		if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
638
		Generic generic =  Generic.NewInstance();
639
//		informal.setSeries(series);
640
		makeStandardMapper(valueMap, generic);//editor, pages, placePublished, publisher, series, volume
641
		return generic;
642
	}
643
	
644
	private StrictReferenceBase makeDatabase(Map<String, Object> valueMap){
645
		if (logger.isDebugEnabled()){logger.debug("RefType 'Database'");}
646
		Database database =  Database.NewInstance();
647
		makeStandardMapper(valueMap, database); //?
648
		return database;
649
	}
650
	
651
	private StrictReferenceBase makeJournal(Map<String, Object> valueMap){
652
		if (logger.isDebugEnabled()){logger.debug("RefType 'Journal'");}
653
		Journal journal = Journal.NewInstance();
654
		
655
		Set<String> omitAttributes = new HashSet<String>();
656
		String series = "series";
657
//		omitAttributes.add(series);
658
		
659
		makeStandardMapper(valueMap, journal, omitAttributes); //issn,placePublished,publisher
660
//		if (valueMap.get(series) != null){
661
//			logger.warn("Series not yet implemented for journal!");
662
//		}
663
		return journal;
664
	}
665
	
666
	private StrictReferenceBase makeBook(Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
667
		if (logger.isDebugEnabled()){logger.debug("RefType 'Book'");}
668
		Book book = Book.NewInstance();
669
		Integer refId = (Integer)valueMap.get("refId".toLowerCase());
670
		
671
		//Set bookAttributes = new String[]{"edition", "isbn", "pages","publicationTown","publisher","volume"};
672
		
673
		Set<String> omitAttributes = new HashSet<String>();
674
		String attrSeries = "series";
675
//		omitAttributes.add(attrSeries);
676
		
677
		makeStandardMapper(valueMap, book, omitAttributes);
678
		
679
		//Series (as String)
680
		PrintSeries printSeries = null;
681
		if (valueMap.get(attrSeries) != null){
682
			String series = (String)valueMap.get("title".toLowerCase());
683
			if (series == null){
684
				String nomTitle = (String)valueMap.get("nomTitleAbbrev".toLowerCase());
685
				series = nomTitle;
686
			}
687
			printSeries = PrintSeries.NewInstance(series);
688
			//TODO only one for ref and nomRef
689
			logger.warn("Implementation of printSeries is preliminary");
690
		}
691
		Object inRefFk = valueMap.get("inRefFk".toLowerCase());
692
		//Series (as Reference)
693
		if (inRefFk != null){
694
			int inRefFkInt = (Integer)inRefFk;
695
			if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
696
				ReferenceBase inSeries = nomRefStore.get(inRefFkInt);
697
				if (inSeries == null){
698
					inSeries = referenceStore.get(inRefFkInt);
699
					logger.info("inSeries (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
700
					nomRefStore.put(inRefFkInt, inSeries);
701
				}
702
				if (inSeries == null){
703
					logger.warn("inSeries for " + inRefFkInt + " is null. "+
704
					" InReference relation could not be set");;
705
				}else if (PrintSeries.class.isAssignableFrom(inSeries.getClass())){
706
					book.setInSeries((PrintSeries)inSeries);
707
					//TODO
708
				}else{
709
					logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getClass().getSimpleName() +
710
							" Inreference relation could not be set");
711
				}
712
			}else{
713
				logger.error("PrintSeries (refId = " + inRefFkInt + ") for book (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
714
				//success = false;
715
			}
716
		}
717
		if (book.getInSeries() != null && printSeries != null){
718
			logger.warn("Book has series string and inSeries reference. Can not take both. Series string neglected");
719
		}else{
720
			book.setInSeries(printSeries);
721
		}
722
		book.setEditor(null);
723
		return book;
724
		
725
	}
726
	
727
	private StrictReferenceBase makePrintSeries(Map<String, Object> valueMap){
728
		if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}
729
		PrintSeries printSeries = PrintSeries.NewInstance();
730
		makeStandardMapper(valueMap, printSeries, null);
731
		return printSeries;
732
	}
733
	
734
	private StrictReferenceBase makeProceedings(Map<String, Object> valueMap){
735
		if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}
736
		Proceedings proceedings = Proceedings.NewInstance();
737
		makeStandardMapper(valueMap, proceedings, null);	
738
		return proceedings;
739
	}
740
	
741
	private StrictReferenceBase makeJournalVolume(Map<String, Object> valueMap){
742
		if (logger.isDebugEnabled()){logger.debug("RefType 'JournalVolume'");}
743
		//Proceedings proceedings = Proceedings.NewInstance();
744
		Generic journalVolume = Generic.NewInstance();
745
		makeStandardMapper(valueMap, journalVolume, null);	
746
		logger.warn("Journal volumes not yet implemented. Generic created instead but with errors");
747
		return journalVolume;
748
	}
749
	
750
	private boolean makeStandardMapper(Map<String, Object> valueMap, StrictReferenceBase ref){
751
		return makeStandardMapper(valueMap, ref, null);
752
	}
753

    
754
	
755
	private boolean makeStandardMapper(Map<String, Object> valueMap, StrictReferenceBase ref, Set<String> omitAttributes){
756
		if (omitAttributes == null){
757
			omitAttributes = new HashSet<String>();
758
		}
759
		boolean result = true;	
760
		for (CdmIoMapperBase mapper : classMappers){
761
			String sourceAttribute = mapper.getSourceAttribute().toLowerCase();
762
			Object value = valueMap.get(sourceAttribute);
763
			if (value != null){
764
				String destinationAttribute = mapper.getDestinationAttribute();
765
				if (! omitAttributes.contains(destinationAttribute)){
766
					result &= ImportHelper.addValue(value, ref, destinationAttribute, mapper.getTypeClass(), OVERWRITE, OBLIGATORY);
767
				}
768
			}
769
		}
770
		return true;
771
	}
772
	
773
	private static TeamOrPersonBase getAuthorTeam(String authorString, TeamOrPersonBase nomAuthor, boolean preferNomeclaturalAuthor){
774
		TeamOrPersonBase result;
775
		if (preferNomeclaturalAuthor){
776
			if (nomAuthor != null){
777
				result = nomAuthor;
778
			}else{
779
				if (CdmUtils.Nz(authorString).equals("")){
780
					result = null;
781
				}else{
782
					TeamOrPersonBase team = Team.NewInstance();
783
					//TODO which one to use??
784
					team.setNomenclaturalTitle(authorString);
785
					team.setTitleCache(authorString);
786
					result = team;
787
				}
788
			}
789
		}else{ //prefer bibliographic
790
			if (! CdmUtils.Nz(authorString).equals("")){
791
				TeamOrPersonBase team = Team.NewInstance();
792
				//TODO which one to use??
793
				team.setNomenclaturalTitle(authorString);
794
				team.setTitleCache(authorString);
795
				result = team;
796
			}else{
797
				result = nomAuthor;
798
			}
799
		}
800
		return result;
801
	}
802

    
803

    
804
	
805
	/* (non-Javadoc)
806
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
807
	 */
808
	protected boolean isIgnore(IImportConfigurator config){
809
		return (config.getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
810
	}
811

    
812
	
813
	
814
//******************************** CHECK *************************************************
815
	
816
	private static boolean checkArticlesWithoutJournal(BerlinModelImportConfigurator bmiConfig){
817
		try {
818
			boolean result = true;
819
			Source source = bmiConfig.getSource();
820
			String strQueryArticlesWithoutJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + 
821
						" FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
822
						" WHERE (Reference.RefCategoryFk = 1) AND (InRef.RefCategoryFk <> 9) ";
823
			ResultSet resulSetarticlesWithoutJournal = source.getResultSet(strQueryArticlesWithoutJournal);
824
			boolean firstRow = true;
825
			while (resulSetarticlesWithoutJournal.next()){
826
				if (firstRow){
827
					System.out.println("========================================================");
828
					logger.warn("There are Articles with wrong inRef type!");
829
					System.out.println("========================================================");
830
				}
831
				int refId = resulSetarticlesWithoutJournal.getInt("RefId");
832
				int categoryFk = resulSetarticlesWithoutJournal.getInt("RefCategoryFk");
833
				String cat = resulSetarticlesWithoutJournal.getString("RefCategoryAbbrev");
834
				int inRefFk = resulSetarticlesWithoutJournal.getInt("InRefId");
835
				int inRefCategoryFk = resulSetarticlesWithoutJournal.getInt("InRefCatFk");
836
				String inRefCat = resulSetarticlesWithoutJournal.getString("InRefCat");
837
				String refCache = resulSetarticlesWithoutJournal.getString("RefCache");
838
				String nomRefCache = resulSetarticlesWithoutJournal.getString("nomRefCache");
839
				String title = resulSetarticlesWithoutJournal.getString("title");
840
				String inRefTitle = resulSetarticlesWithoutJournal.getString("InRefTitle");
841
				
842
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
843
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + 
844
						"\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + 
845
						"\n  inRefTitle: " + inRefTitle );
846
				result = firstRow = false;
847
			}
848
			
849
			return result;
850
		} catch (SQLException e) {
851
			e.printStackTrace();
852
			return false;
853
		}
854
	}
855
	
856
	private static boolean checkPartOfJournal(BerlinModelImportConfigurator bmiConfig){
857
		try {
858
			boolean result = true;
859
			Source source = bmiConfig.getSource();
860
			String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + 
861
			" FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
862
						" WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 9) ";
863
			ResultSet rs = source.getResultSet(strQueryPartOfJournal);
864
			boolean firstRow = true;
865
			while (rs.next()){
866
				if (firstRow){
867
					System.out.println("========================================================");
868
					logger.warn("There are part-of-references that have a Journal as in-reference!");
869
					System.out.println("========================================================");
870
				}
871
				int refId = rs.getInt("RefId");
872
				int categoryFk = rs.getInt("RefCategoryFk");
873
				String cat = rs.getString("RefCategoryAbbrev");
874
				int inRefFk = rs.getInt("InRefId");
875
				int inRefCategoryFk = rs.getInt("InRefCatFk");
876
				String inRefCat = rs.getString("InRefCat");
877
				String refCache = rs.getString("RefCache");
878
				String nomRefCache = rs.getString("nomRefCache");
879
				String title = rs.getString("title");
880
				String inRefTitle = rs.getString("InRefTitle");
881
				
882
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
883
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + 
884
						"\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + 
885
						"\n  inRefTitle: " + inRefTitle );
886
				result = firstRow = false;
887
			}
888
			
889
			return result;
890
		} catch (SQLException e) {
891
			e.printStackTrace();
892
			return false;
893
		}
894
	}
895
	
896
	
897
	private static boolean checkPartOfUnresolved(BerlinModelImportConfigurator bmiConfig){
898
		try {
899
			boolean result = true;
900
			Source source = bmiConfig.getSource();
901
			String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle " + 
902
			" FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
903
						" WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 10) ";
904
			ResultSet rs = source.getResultSet(strQueryPartOfJournal);
905
			boolean firstRow = true;
906
			while (rs.next()){
907
				if (firstRow){
908
					System.out.println("========================================================");
909
					logger.warn("There are part-of-references that have an 'unresolved' in-reference!");
910
					System.out.println("========================================================");
911
				}
912
				int refId = rs.getInt("RefId");
913
				int categoryFk = rs.getInt("RefCategoryFk");
914
				String cat = rs.getString("RefCategoryAbbrev");
915
				int inRefFk = rs.getInt("InRefId");
916
				int inRefCategoryFk = rs.getInt("InRefCatFk");
917
				String inRefCat = rs.getString("InRefCat");
918
				String refCache = rs.getString("RefCache");
919
				String nomRefCache = rs.getString("nomRefCache");
920
				String title = rs.getString("title");
921
				String inRefTitle = rs.getString("InRefTitle");
922
				
923
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
924
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + 
925
						"\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + 
926
						"\n  inRefTitle: " + inRefTitle );
927
				result = firstRow = false;
928
			}
929
			if (result == false){
930
				System.out.println("\nChoose a specific type from the following reference types: \n" +
931
						"  1) Article \n  2) Book \n  3) BookSection \n  4) CdDvd \n  5) ConferenceProceeding \n  6) Database\n" + 
932
						"  7) Generic \n  7) InProceedings \n  8) Journal \n  9) Map \n 10) Patent \n 11) PersonalCommunication\n" +
933
						" 12) PrintSeries \n 13) Proceedings \n 14) Report \n 15) Thesis \n 16) WebPage");
934
			}
935
			return result;
936
		} catch (SQLException e) {
937
			e.printStackTrace();
938
			return false;
939
		}
940
	}
941
	
942
	private static boolean checkPartOfPartOf(BerlinModelImportConfigurator bmiConfig){
943
		try {
944
			boolean result = true;
945
			Source source = bmiConfig.getSource();
946
			String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle, InRef.InRefFk as InInRefId, InInRef.Title as inInRefTitle, InInRef.RefCategoryFk as inInRefCategory " + 
947
						" FROM Reference " +
948
							" INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId " + 
949
							" INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId " + 
950
							" INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
951
							" INNER JOIN Reference AS InInRef ON InRef.InRefFk = InInRef.RefId " + 
952
						" WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 2) ";
953
			ResultSet rs = source.getResultSet(strQueryPartOfJournal);
954
			boolean firstRow = true;
955
			while (rs.next()){
956
				if (firstRow){
957
					System.out.println("========================================================");
958
					logger.warn("There are part-of-references that are part of an other 'part-of' reference!\n" + 
959
							"         This is invalid or ambigous. Please try to determine the reference types more detailed ");
960
					System.out.println("========================================================");
961
				}
962
				int refId = rs.getInt("RefId");
963
				int categoryFk = rs.getInt("RefCategoryFk");
964
				String cat = rs.getString("RefCategoryAbbrev");
965
				int inRefFk = rs.getInt("InRefId");
966
				int inRefCategoryFk = rs.getInt("InRefCatFk");
967
				String inRefCat = rs.getString("InRefCat");
968
				String refCache = rs.getString("RefCache");
969
				String nomRefCache = rs.getString("nomRefCache");
970
				String title = rs.getString("title");
971
				String inRefTitle = rs.getString("InRefTitle");
972
				int inInRefId = rs.getInt("InInRefId");
973
				String inInRefTitle = rs.getString("inInRefTitle");
974
				int inInRefCategory = rs.getInt("inInRefCategory");
975
				
976
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
977
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + 
978
						"\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + 
979
						"\n  inRefTitle: " + inRefTitle + "\n  inInRefId: " + inInRefId + "\n  inInRefTitle: " + inInRefTitle +
980
						"\n  inInRefCategory: " + inInRefCategory );
981
				result = firstRow = false;
982
			}
983
			if (result == false){
984
				System.out.println("\nChoose a specific type from the following reference types: \n" +
985
						"  1) BookSection - Book - PrintSeries \n" +
986
						"  2) InProceedings - pProceedings  - PrintSeries");
987
			}
988
			return result;
989
		} catch (SQLException e) {
990
			e.printStackTrace();
991
			return false;
992
		}
993
	}
994

    
995
	
996
	private static boolean checkPartOfArticle(BerlinModelImportConfigurator bmiConfig){
997
		try {
998
			boolean result = true;
999
			Source source = bmiConfig.getSource();
1000
			String strQueryPartOfJournal = "SELECT Reference.RefId, InRef.RefId AS InRefID, Reference.RefCategoryFk, InRef.RefCategoryFk AS InRefCatFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, Reference.NomTitleAbbrev as nomTitleAbbrev, RefCategory.RefCategoryAbbrev, InRefCategory.RefCategoryAbbrev AS InRefCat, InRef.Title AS InRefTitle, InRef.nomTitleAbbrev AS inRefnomTitleAbbrev, InRef.refCache AS inRefCache, InRef.nomRefCache AS inRefnomRefCache " + 
1001
			" FROM Reference INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
1002
						" WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 1) ";
1003
			ResultSet rs = source.getResultSet(strQueryPartOfJournal);
1004
			boolean firstRow = true;
1005
			while (rs.next()){
1006
				if (firstRow){
1007
					System.out.println("========================================================");
1008
					logger.warn("There are part-of-references that have an article as in-reference!");
1009
					System.out.println("========================================================");
1010
				}
1011
				int refId = rs.getInt("RefId");
1012
				int categoryFk = rs.getInt("RefCategoryFk");
1013
				String cat = rs.getString("RefCategoryAbbrev");
1014
				int inRefFk = rs.getInt("InRefId");
1015
				int inRefCategoryFk = rs.getInt("InRefCatFk");
1016
				String inRefCat = rs.getString("InRefCat");
1017
				String refCache = rs.getString("RefCache");
1018
				String nomRefCache = rs.getString("nomRefCache");
1019
				String title = rs.getString("title");
1020
				String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1021
				String inRefTitle = rs.getString("InRefTitle");
1022
				String inRefnomTitleAbbrev = rs.getString("inRefnomTitleAbbrev");
1023
				String inRefnomRefCache = rs.getString("inRefnomRefCache");
1024
				String inRefCache = rs.getString("inRefCache");
1025
				
1026
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
1027
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + "\n  title: " + title + "\n  titleAbbrev: " + nomTitleAbbrev + 
1028
						"\n  inRefFk: " + inRefFk + "\n  inRefCategory: " + inRefCat + 
1029
						"\n  inRefTitle: " + inRefTitle + "\n  inRefTitleAbbrev: " + inRefnomTitleAbbrev +
1030
						"\n  inRefnomRefCache: " + inRefnomRefCache + "\n  inRefCache: " + inRefCache 
1031
						);
1032
				result = firstRow = false;
1033
			}
1034
			
1035
			return result;
1036
		} catch (SQLException e) {
1037
			e.printStackTrace();
1038
			return false;
1039
		}
1040
	}
1041
	
1042
	private static boolean checkJournalsWithSeries(BerlinModelImportConfigurator bmiConfig){
1043
		try {
1044
			boolean result = true;
1045
			Source source = bmiConfig.getSource();
1046
			String strQueryArticlesWithoutJournal = "SELECT Reference.RefId, Reference.RefCategoryFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, Reference.NomTitleAbbrev, RefCategory.RefCategoryAbbrev  " + 
1047
						" FROM Reference INNER JOIN " +
1048
								" RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId  " +
1049
						" WHERE (Reference.RefCategoryFk = 9)  AND ( Reference.series is not null OR Reference.series <>'') ";
1050
			ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);
1051
			boolean firstRow = true;
1052
			while (rs.next()){
1053
				if (firstRow){
1054
					System.out.println("========================================================");
1055
					logger.warn("There are Journals with series!");
1056
					System.out.println("========================================================");
1057
				}
1058
				int refId = rs.getInt("RefId");
1059
				int categoryFk = rs.getInt("RefCategoryFk");
1060
				String cat = rs.getString("RefCategoryAbbrev");
1061
				String nomRefCache = rs.getString("nomRefCache");
1062
				String refCache = rs.getString("refCache");
1063
				String title = rs.getString("title");
1064
				String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1065
				
1066
				System.out.println("RefID:" + refId + "\n  cat: " + cat + 
1067
						"\n  refCache: " + refCache + "\n  nomRefCache: " + nomRefCache + 
1068
						"\n  title: " + title +  "\n  nomTitleAbbrev: " + nomTitleAbbrev +
1069
						"" );
1070
				result = firstRow = false;
1071
			}
1072
			
1073
			return result;
1074
		} catch (SQLException e) {
1075
			e.printStackTrace();
1076
			return false;
1077
		}
1078
	}
1079
	
1080
	
1081
//********************************** MAIN ************************************************
1082

    
1083
	
1084
	/**
1085
	 * @param args
1086
	 */
1087
	public static void main(String[] args) {
1088
		TimePeriod timePeriod = ImportHelper.getDatePublished("1756 - 1783");
1089
		System.out.println(timePeriod.getYear());
1090
	}
1091

    
1092
}
(8-8/16)