bugfixing for moving mapper classes from io.common to io.common.mapping. NOT READY...
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelReferenceImport.java
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.Collection;
35 import java.util.HashSet;
36 import java.util.Iterator;
37 import java.util.List;
38 import java.util.Map;
39 import java.util.Set;
40 import java.util.UUID;
41
42 import org.apache.log4j.Logger;
43 import org.springframework.stereotype.Component;
44
45 import eu.etaxonomy.cdm.common.CdmUtils;
46 import eu.etaxonomy.cdm.io.berlinModel.CdmExtensionMapper;
47 import eu.etaxonomy.cdm.io.berlinModel.CdmOneToManyMapper;
48 import eu.etaxonomy.cdm.io.berlinModel.CdmStringMapper;
49 import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;
50 import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;
51 import eu.etaxonomy.cdm.io.common.ICdmIO;
52 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
53 import eu.etaxonomy.cdm.io.common.ImportHelper;
54 import eu.etaxonomy.cdm.io.common.MapWrapper;
55 import eu.etaxonomy.cdm.io.common.Source;
56 import eu.etaxonomy.cdm.io.common.mapping.CdmSingleAttributeMapperBase;
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.Article;
65 import eu.etaxonomy.cdm.model.reference.Book;
66 import eu.etaxonomy.cdm.model.reference.BookSection;
67 import eu.etaxonomy.cdm.model.reference.Database;
68 import eu.etaxonomy.cdm.model.reference.Generic;*/
69 import eu.etaxonomy.cdm.model.reference.IArticle;
70 import eu.etaxonomy.cdm.model.reference.IBook;
71 import eu.etaxonomy.cdm.model.reference.IBookSection;
72 import eu.etaxonomy.cdm.model.reference.IGeneric;
73 import eu.etaxonomy.cdm.model.reference.IJournal;
74 import eu.etaxonomy.cdm.model.reference.IPrintSeries;
75 import eu.etaxonomy.cdm.model.reference.IWebPage;
76 /*import eu.etaxonomy.cdm.model.reference.Journal;
77 import eu.etaxonomy.cdm.model.reference.PrintSeries;
78 import eu.etaxonomy.cdm.model.reference.Proceedings;*/
79 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
80 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
81 import eu.etaxonomy.cdm.model.reference.ReferenceType;
82 /*import eu.etaxonomy.cdm.model.reference.Thesis;
83 import eu.etaxonomy.cdm.model.reference.WebPage;*/
84
85 /**
86 * @author a.mueller
87 * @created 20.03.2008
88 * @version 1.0
89 */
90 @Component
91 public class BerlinModelReferenceImport extends BerlinModelImportBase {
92 private static final Logger logger = Logger.getLogger(BerlinModelReferenceImport.class);
93
94 public static final UUID REF_DEPOSITED_AT_UUID = UUID.fromString("23ca88c7-ce73-41b2-8ca3-2cb22f013beb");
95 public static final UUID REF_SOURCE = UUID.fromString("d6432582-2216-4b08-b0db-76f6c1013141");
96 public static final UUID DATE_STRING_UUID = UUID.fromString("e4130eae-606e-4b0c-be4f-e93dc161be7d");
97 ReferenceFactory refFactory;
98 private int modCount = 1000;
99
100 public BerlinModelReferenceImport(){
101 super();
102 refFactory = ReferenceFactory.newInstance();
103 }
104
105
106
107 protected boolean initializeMappers(BerlinModelImportState state, String tableName){
108 for (CdmAttributeMapperBase mapper: classMappers){
109 if (mapper instanceof CdmExtensionMapper){
110 ((CdmExtensionMapper)mapper).initialize(getTermService(), state, tableName);
111 }
112 }
113 return true;
114 }
115
116 protected static CdmAttributeMapperBase[] classMappers = new CdmAttributeMapperBase[]{
117 new CdmStringMapper("edition", "edition"),
118 new CdmStringMapper("volume", "volume"),
119 new CdmStringMapper("publisher", "publisher"),
120 new CdmStringMapper("publicationTown", "placePublished"),
121 new CdmStringMapper("isbn", "isbn"),
122 new CdmStringMapper("isbn", "isbn"),
123 new CdmStringMapper("pageString", "pages"),
124 new CdmStringMapper("series", "series"),
125 new CdmStringMapper("issn", "issn"),
126 new CdmStringMapper("url", "uri"),
127 new CdmExtensionMapper("NomStandard", ExtensionType.NOMENCLATURAL_STANDARD()),
128 new CdmExtensionMapper("DateString", DATE_STRING_UUID, "Date String", "Date String", "dates"),
129 new CdmExtensionMapper("RefDepositedAt", REF_DEPOSITED_AT_UUID, "RefDepositedAt", "reference is deposited at", "at"),
130 new CdmExtensionMapper("RefSource", REF_SOURCE, "RefSource", "reference source", "source")
131 };
132
133
134 protected static String[] operationalAttributes = new String[]{
135 "refId", "refCache", "nomRefCache", "preliminaryFlag", "inRefFk", "title", "nomTitleAbbrev",
136 "refAuthorString", "nomAuthorTeamFk",
137 "refCategoryFk", "thesisFlag", "informalRefCategory", "idInSource"
138 };
139
140 protected static String[] createdAndNotesAttributes = new String[]{
141 "created_When", "updated_When", "created_Who", "updated_Who", "notes"
142 };
143
144 protected static String[] unclearMappers = new String[]{
145 "isPaper", "exportDate",
146 };
147
148 //TODO isPaper
149 //
150
151
152
153 //type to count the references nomReferences that have been created and saved
154 private class RefCounter{
155 RefCounter() {nomRefCount = 0; referenceCount = 0;};
156 int nomRefCount;
157 int referenceCount;
158 public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(referenceCount);};
159 }
160
161 /* (non-Javadoc)
162 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)
163 */
164 @Override
165 protected boolean doCheck(BerlinModelImportState state){
166 boolean result = true;
167 BerlinModelImportConfigurator bmiConfig = state.getConfig();
168 result &= checkArticlesWithoutJournal(bmiConfig);
169 result &= checkPartOfJournal(bmiConfig);
170 result &= checkPartOfUnresolved(bmiConfig);
171 result &= checkPartOfPartOf(bmiConfig);
172 result &= checkPartOfArticle(bmiConfig);
173 result &= checkJournalsWithSeries(bmiConfig);
174 result &= checkObligatoryAttributes(bmiConfig);
175 result &= checkPartOfWithVolume(bmiConfig);
176 result &= checkArticleWithEdition(bmiConfig);
177
178 if (result == false ){System.out.println("========================================================");}
179
180
181 return result;
182 }
183
184
185
186 private boolean doPreliminaryRefDetails(BerlinModelImportState state, Map<String, MapWrapper<? extends CdmBase>> stores){
187
188 IImportConfigurator config = state.getConfig();
189 MapWrapper<TeamOrPersonBase> teamMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.TEAM_STORE);
190 MapWrapper<ReferenceBase> refDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REF_DETAIL_STORE);
191 MapWrapper<ReferenceBase> nomRefDetailMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_DETAIL_STORE);
192
193 BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
194 Source source = bmiConfig.getSource();
195 boolean success = true;
196 logger.info("start makeRefDetails ...");
197
198 try {
199 //get data from database
200 String strQuery =
201 " SELECT RefDetail.*, Reference.RefYear " +
202 " FROM RefDetail " +
203 " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
204 " WHERE (1=1) AND (RefDetail.PreliminaryFlag = 1)";
205
206 ResultSet rs = source.getResultSet(strQuery);
207 String namespace = "RefDetail";
208
209 int i = 0;
210 RefCounter refCounter = new RefCounter();
211 while (rs.next()){
212
213 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("RefDetails handled: " + (i-1) );}
214 int refDetailId = rs.getInt("refDetailId");
215 String refYear = rs.getString("RefYear");
216
217 //nomRef
218 String fullNomRefCache = rs.getString("fullNomRefCache");
219 if (! CdmUtils.Nz(fullNomRefCache).trim().equals("") ){
220 ReferenceBase genericReference = refFactory.newGeneric();
221 genericReference.setTitleCache(fullNomRefCache);
222 nomRefDetailMap.put(refDetailId, genericReference);
223 //refId, created, notes
224 doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, namespace );
225 //year
226 genericReference.setDatePublished(ImportHelper.getDatePublished(refYear));
227 refCounter.nomRefCount++;
228 }
229
230 //biblioRef
231 String fullRefCache = rs.getString("fullRefCache");
232 if (! CdmUtils.Nz(fullRefCache).trim().equals("") &&
233 fullRefCache.equals(fullNomRefCache)){
234 ReferenceBase genericReference = refFactory.newGeneric();
235 genericReference.setTitleCache(fullRefCache);
236 refDetailMap.put(refDetailId, genericReference);
237
238 //refId, created, notes
239 doIdCreatedUpdatedNotes(state, genericReference, rs, refDetailId, namespace );
240 //year
241 genericReference.setDatePublished(ImportHelper.getDatePublished(refYear));
242 refCounter.referenceCount++;
243 }
244 }
245 //save and store in map
246 logger.info("Save nomenclatural preliminary references (" + refCounter.nomRefCount + ")");
247 Collection<ReferenceBase> col = nomRefDetailMap.objects();
248 getReferenceService().save(col);
249 logger.info("Save bibliographical preliminary references (" + refCounter.referenceCount +")");
250 getReferenceService().save(refDetailMap.objects());
251
252 //TODO
253 //SecondarySources
254 //IdInSource
255
256 } catch (SQLException e) {
257 logger.error("SQLException:" + e);
258 return false;
259 }
260 return success;
261 }
262
263
264
265 @Override
266 protected boolean doInvoke(BerlinModelImportState state){
267 String teamStore = ICdmIO.TEAM_STORE;
268 MapWrapper<? extends CdmBase> store = state.getStore(teamStore);
269 MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
270 MapWrapper<ReferenceBase> nomRefStore= new MapWrapper<ReferenceBase>(null);
271
272 BerlinModelImportConfigurator config = state.getConfig();
273 Source source = config.getSource();
274
275 boolean success = true;
276
277 //preliminary RefDetails //TODO -> move to own class ?
278 doPreliminaryRefDetails(state, state.getStores());
279
280 success &= initializeMappers(state, "Reference");
281
282 logger.info("start makeReferences ...");
283
284 try {
285 //get data from database
286 String strQueryBase =
287 " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk, " +
288 " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
289 " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk, RefSource.RefSource " +
290 " FROM Reference AS InInReference " +
291 " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " +
292 " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " +
293 " LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +
294 " WHERE (1=1) ";
295 //strQueryBase += " AND Reference.refId = 1933 " ; //7000000
296 String strQueryNoInRef = strQueryBase +
297 " AND (Reference.InRefFk is NULL) ";
298
299 String strQuery1InRef = strQueryBase +
300 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
301
302 String strQuery2InRef = strQueryBase +
303 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
304
305 String strQueryTesMaxRecursion = strQueryBase +
306 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
307
308 ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTesMaxRecursion);
309 if (testMaxRecursionResultSet.next() == true){
310 logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
311 return false;
312 }
313
314 if (config.getDoReferences() == CONCEPT_REFERENCES){
315 strQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) ";
316 }
317
318 List<ResultSet> resultSetList = new ArrayList<ResultSet>();
319 resultSetList.add(source.getResultSet(strQueryNoInRef));
320 if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){
321 resultSetList.add(source.getResultSet(strQuery1InRef));
322 resultSetList.add(source.getResultSet(strQuery2InRef));
323 }
324
325 int j = 0;
326 Iterator<ResultSet> resultSetListIterator = resultSetList.listIterator();
327 //for each resultsetlist
328 while (resultSetListIterator.hasNext()){
329 int i = 0;
330 RefCounter refCounter = new RefCounter();
331
332 ResultSet rs = resultSetListIterator.next();
333 //for each resultset
334 while (rs.next()){
335 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round " + j);}
336
337 success &= makeSingleReferenceRecord(rs, state, referenceStore, nomRefStore, refCounter);
338 } // end resultSet
339
340 //for the concept reference a fixed uuid may be needed -> change uuid
341 ReferenceBase<?> sec = referenceStore.get(config.getSourceSecId());
342 if (sec == null){
343 sec = nomRefStore.get(config.getSourceSecId());
344 }
345 if (sec != null){
346 sec.setUuid(config.getSecUuid());
347 logger.info("SecUuid changed to: " + config.getSecUuid());
348 }
349
350 //save and store in map
351 logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");
352 getReferenceService().save(nomRefStore.objects());
353 logger.info("Save bibliographical references (" + refCounter.referenceCount +")");
354 getReferenceService().save(referenceStore.objects());
355 j++;
356 }//end resultSetList
357
358 logger.info("end makeReferences ..." + getSuccessString(success));;
359 return success;
360 } catch (SQLException e) {
361 logger.error("SQLException:" + e);
362 return false;
363 }
364 }
365
366
367 private boolean makeSingleReferenceRecord(ResultSet rs, BerlinModelImportState state, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore, RefCounter refCounter){
368 boolean success = true;
369 String namespace = "Reference";
370 String teamStore = ICdmIO.TEAM_STORE;
371 MapWrapper<? extends CdmBase> store = state.getStore(teamStore);
372 MapWrapper<TeamOrPersonBase> teamMap = (MapWrapper<TeamOrPersonBase>)store;
373
374 Integer refId = null;
375 try {
376 Map<String, Object> valueMap = getValueMap(rs);
377
378 Integer categoryFk = (Integer)valueMap.get("refCategoryFk".toLowerCase());
379 refId = (Integer)valueMap.get("refId".toLowerCase());
380 Boolean thesisFlag = (Boolean)valueMap.get("thesisFlag".toLowerCase());
381
382
383 ReferenceBase<?> referenceBase;
384 logger.debug("RefCategoryFk: " + categoryFk);
385
386 if (thesisFlag){
387 referenceBase = makeThesis(valueMap);
388 }else if (categoryFk == REF_JOURNAL){
389 referenceBase = makeJournal(valueMap);
390 }else if(categoryFk == REF_BOOK){
391 referenceBase = makeBook(valueMap, referenceStore, nomRefStore);
392 }else if(categoryFk == REF_DATABASE){
393 referenceBase = makeDatabase(valueMap);
394 }else if(categoryFk == REF_INFORMAL){
395 referenceBase = makeInformal(valueMap);
396 }else if(categoryFk == REF_WEBSITE){
397 referenceBase = makeWebSite(valueMap);
398 }else if(categoryFk == REF_UNKNOWN){
399 referenceBase = makeUnknown(valueMap);
400 }else if(categoryFk == REF_PRINT_SERIES){
401 referenceBase = makePrintSeries(valueMap);
402 }else if(categoryFk == REF_CONFERENCE_PROCEEDINGS){
403 referenceBase = makeProceedings(valueMap);
404 }else if(categoryFk == REF_ARTICLE){
405 referenceBase = makeArticle(valueMap, referenceStore, nomRefStore);
406 }else if(categoryFk == REF_JOURNAL_VOLUME){
407 referenceBase = makeJournalVolume(valueMap);
408 }else if(categoryFk == REF_PART_OF_OTHER_TITLE){
409 referenceBase = makePartOfOtherTitle(valueMap, referenceStore, nomRefStore);
410 }else{
411 logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
412 referenceBase = refFactory.newGeneric();
413 success = false;
414 }
415
416 //refId, created, notes
417 doIdCreatedUpdatedNotes(state, referenceBase, rs, refId, namespace );
418 //refYear
419 String refYear = (String)valueMap.get("refYear".toLowerCase());
420 referenceBase.setDatePublished(ImportHelper.getDatePublished(refYear));
421
422 //nom&BiblioReference
423 success &= makeNomAndBiblioReference(rs, refId, referenceBase, refCounter,
424 referenceStore, nomRefStore, teamMap, state.getStores() );
425
426 //idInSource
427 String idInSource = (String)valueMap.get("IdInSource".toLowerCase());
428 if (CdmUtils.isNotEmpty(idInSource)){
429 IdentifiableSource source = IdentifiableSource.NewInstance(idInSource);
430 source.setIdNamespace("import to Berlin Model");
431 referenceBase.addSource(source);
432 }
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 } catch (Exception e) {
440 logger.warn("Reference with BM refId '" + CdmUtils.Nz(refId) + "' threw Exception and could not be saved");
441 e.printStackTrace();
442 success = false;
443 }
444 return success;
445 }
446
447
448 private boolean makeNomAndBiblioReference(ResultSet rs,
449 int refId,
450 ReferenceBase<?> referenceBase,
451 RefCounter refCounter,
452 MapWrapper<ReferenceBase> referenceStore,
453 MapWrapper<ReferenceBase> nomRefStore,
454 MapWrapper<TeamOrPersonBase> teamMap,
455 Map<String, MapWrapper<? extends CdmBase>> stores
456 ) throws SQLException{
457
458 MapWrapper<ReferenceBase<?>> referenceMap = (MapWrapper<ReferenceBase<?>>)stores.get(ICdmIO.REFERENCE_STORE);
459 MapWrapper<ReferenceBase<?>> nomRefMap = (MapWrapper<ReferenceBase<?>>)stores.get(ICdmIO.NOMREF_STORE);
460
461
462 String refCache = rs.getString("refCache");
463 String nomRefCache = rs.getString("nomRefCache");
464 String title = rs.getString("title");
465 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
466 boolean isPreliminary = rs.getBoolean("PreliminaryFlag");
467 String refAuthorString = rs.getString("refAuthorString");
468 int nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");
469 TeamOrPersonBase<?> nomAuthor = teamMap.get(nomAuthorTeamFk);
470
471 boolean hasNomRef = false;
472 //is Nomenclatural Reference
473 if ( (CdmUtils.isNotEmpty(nomRefCache) && isPreliminary) || (CdmUtils.isNotEmpty(nomTitleAbbrev) && ! isPreliminary) ){
474 referenceBase.setTitle(nomTitleAbbrev);
475 TeamOrPersonBase<?> author = getAuthorTeam(refAuthorString , nomAuthor, true);
476 referenceBase.setAuthorTeam(author);
477 //referenceBase.setNomenclaturallyRelevant(true);
478 if (isPreliminary){
479 referenceBase.setTitleCache(nomRefCache);
480 }
481 if (! nomRefStore.containsId(refId)){
482 if (referenceBase == null){
483 logger.warn("refBase is null");
484 }
485 nomRefStore.put(refId, referenceBase);
486 }else{
487 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
488 }
489 nomRefMap.put(refId, referenceBase);
490 hasNomRef = true;
491 refCounter.nomRefCount++;
492 }
493 //is bibliographical Reference
494 if ((CdmUtils.isNotEmpty(refCache) && isPreliminary && ! refCache.equalsIgnoreCase(nomRefCache))
495 || (CdmUtils.isNotEmpty(title) && ! isPreliminary && ! title.equalsIgnoreCase(nomTitleAbbrev))
496 || hasNomRef == false){
497 if (hasNomRef){
498 referenceBase = (ReferenceBase)referenceBase.clone();
499 }
500 referenceBase.setTitle(title);
501 TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, false);
502 referenceBase.setAuthorTeam(author);
503 referenceBase.setNomenclaturallyRelevant(false);
504 if (isPreliminary){
505 referenceBase.setTitleCache(refCache);
506 }
507 if (! referenceStore.containsId(refId)){
508 referenceStore.put(refId, referenceBase);
509 }else{
510 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
511 }
512 referenceMap.put(refId, referenceBase);
513 refCounter.referenceCount++;
514 }
515 return true;
516
517 }
518
519 private ReferenceBase<?> makeArticle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
520
521 IArticle article = refFactory.newArticle();
522 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
523 Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
524 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
525
526 if (inRefFk != null){
527 if (inRefCategoryFk == REF_JOURNAL){
528 int inRefFkInt = (Integer)inRefFk;
529 if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
530 ReferenceBase<?> inJournal = nomRefStore.get(inRefFkInt);
531 if (inJournal == null){
532 inJournal = referenceStore.get(inRefFkInt);
533 logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
534 nomRefStore.put(inRefFkInt, inJournal);
535 }
536 if (inJournal == null){
537 logger.warn("inJournal for " + inRefFkInt + " is null. "+
538 " InReference relation could not be set");
539 //}else if (ReferenceBase.class.isAssignableFrom(inJournal.getClass())){
540 }else if (inJournal.getType().equals(ReferenceType.Journal)){
541 article.setInJournal((IJournal)inJournal);
542 }else{
543 logger.warn("InJournal is not of type journal but of type " + inJournal.getClass().getSimpleName() +
544 " Inreference relation could not be set");
545 }
546 }else{
547 logger.error("Journal (refId = " + inRefFkInt + " ) for Article (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
548 //success = false;;
549 }
550 }else{
551 logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not (RefCategoryFk=" + inRefCategoryFk + "))." +
552 " InReference was not added to Article! ");
553 }
554 }
555 makeStandardMapper(valueMap, (ReferenceBase)article); //url, pages, series, volume
556 return (ReferenceBase)article;
557 }
558
559 private ReferenceBase<?> makePartOfOtherTitle (Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
560 ReferenceBase<?> result;
561 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
562 Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
563 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
564
565 if (inRefCategoryFk == REF_BOOK){
566 //BookSection
567 IBookSection bookSection = refFactory.newBookSection();
568 result = (ReferenceBase)bookSection;
569 if (inRefFk != null){
570 int inRefFkInt = (Integer)inRefFk;
571 if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
572 ReferenceBase<?> inBook = nomRefStore.get(inRefFkInt);
573 if (inBook == null){
574 inBook = referenceStore.get(inRefFkInt);
575 logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
576 nomRefStore.put(inRefFkInt, inBook);
577 }
578 if (inBook == null){
579 logger.warn("inBook for " + inRefFkInt + " is null. "+
580 " InReference relation could not be set");;
581 //}else if (Book.class.isAssignableFrom(inBook.getClass())){
582 }else if (inBook.getType().equals(ReferenceType.Book)){
583 bookSection.setInBook((IBook)inBook);
584 //TODO
585 }else{
586 logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
587 " Inreference relation could not be set");
588 }
589 }else{
590 logger.error("Book (refId = " + inRefFkInt + ") for part_of_other_title (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
591 //success = false;
592 }
593 }
594 }else if (inRefCategoryFk == REF_ARTICLE){
595 //Article
596 //TODO
597 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
598 " This type is not implemented yet. Generic reference created instead") ;
599 result = refFactory.newGeneric();
600 }else if (inRefCategoryFk == REF_JOURNAL){
601 //TODO
602 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' has inReference of type 'journal'." +
603 " This is not allowed! Generic reference created instead") ;
604 result = refFactory.newGeneric();
605 result.addMarker(Marker.NewInstance(MarkerType.TO_BE_CHECKED(), true));
606 }else{
607 logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
608 " Create 'Generic' reference instead");
609 result = refFactory.newGeneric();
610 }
611 makeStandardMapper(valueMap, result); //url, pages
612 return result;
613 }
614
615 private ReferenceBase<?> makeWebSite(Map<String, Object> valueMap){
616 if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
617 ReferenceBase webPage = refFactory.newWebPage();
618 makeStandardMapper(valueMap, webPage); //placePublished, publisher
619 return webPage;
620 }
621
622 private ReferenceBase<?> makeUnknown(Map<String, Object> valueMap){
623 if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
624 ReferenceBase generic = refFactory.newGeneric();
625 // generic.setSeries(series);
626 makeStandardMapper(valueMap, generic); //pages, placePublished, publisher, series, volume
627 return generic;
628 }
629
630 private ReferenceBase<?> makeInformal(Map<String, Object> valueMap){
631 if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
632 ReferenceBase generic = refFactory.newGeneric();
633 // informal.setSeries(series);
634 makeStandardMapper(valueMap, generic);//editor, pages, placePublished, publisher, series, volume
635 String informal = (String)valueMap.get("InformalRefCategory".toLowerCase());
636 if (CdmUtils.isNotEmpty(informal) ){
637 generic.addExtension(informal, ExtensionType.INFORMAL_CATEGORY());
638 }
639 return generic;
640 }
641
642 private ReferenceBase<?> makeDatabase(Map<String, Object> valueMap){
643 if (logger.isDebugEnabled()){logger.debug("RefType 'Database'");}
644 ReferenceBase database = refFactory.newDatabase();
645 makeStandardMapper(valueMap, database); //?
646 return database;
647 }
648
649 private ReferenceBase<?> makeJournal(Map<String, Object> valueMap){
650 if (logger.isDebugEnabled()){logger.debug("RefType 'Journal'");}
651 ReferenceBase journal = refFactory.newJournal();
652
653 Set<String> omitAttributes = new HashSet<String>();
654 String series = "series";
655 // omitAttributes.add(series);
656
657 makeStandardMapper(valueMap, journal, omitAttributes); //issn,placePublished,publisher
658 // if (valueMap.get(series) != null){
659 // logger.warn("Series not yet implemented for journal!");
660 // }
661 return journal;
662 }
663
664 private ReferenceBase<?> makeBook(Map<String, Object> valueMap, MapWrapper<ReferenceBase> referenceStore, MapWrapper<ReferenceBase> nomRefStore){
665 if (logger.isDebugEnabled()){logger.debug("RefType 'Book'");}
666 ReferenceBase book = refFactory.newBook();
667 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
668
669 //Set bookAttributes = new String[]{"edition", "isbn", "pages","publicationTown","publisher","volume"};
670
671 Set<String> omitAttributes = new HashSet<String>();
672 String attrSeries = "series";
673 // omitAttributes.add(attrSeries);
674
675 makeStandardMapper(valueMap, book, omitAttributes);
676
677 //Series (as String)
678 IPrintSeries printSeries = null;
679 if (valueMap.get(attrSeries) != null){
680 String series = (String)valueMap.get("title".toLowerCase());
681 if (series == null){
682 String nomTitle = (String)valueMap.get("nomTitleAbbrev".toLowerCase());
683 series = nomTitle;
684 }
685 printSeries = refFactory.newPrintSeries(series);
686 //TODO only one for ref and nomRef
687 logger.warn("Implementation of printSeries is preliminary");
688 }
689 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
690 //Series (as Reference)
691 if (inRefFk != null){
692 int inRefFkInt = (Integer)inRefFk;
693 if (nomRefStore.containsId(inRefFkInt) || referenceStore.containsId(inRefFkInt)){
694 ReferenceBase<?> inSeries = nomRefStore.get(inRefFkInt);
695 if (inSeries == null){
696 inSeries = referenceStore.get(inRefFkInt);
697 logger.info("inSeries (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
698 nomRefStore.put(inRefFkInt, inSeries);
699 }
700 if (inSeries == null){
701 logger.warn("inSeries for " + inRefFkInt + " is null. "+
702 " InReference relation could not be set");;
703 //}else if (PrintSeries.class.isAssignableFrom(inSeries.getClass())){
704 }else if (inSeries.getType().equals(ReferenceType.PrintSeries)){
705 book.setInSeries((IPrintSeries)inSeries);
706 //TODO
707 }else{
708 logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getClass().getSimpleName() +
709 " Inreference relation could not be set");
710 }
711 }else{
712 logger.error("PrintSeries (refId = " + inRefFkInt + ") for book (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
713 //success = false;
714 }
715 }
716 if (book.getInSeries() != null && printSeries != null){
717 logger.warn("Book has series string and inSeries reference. Can not take both. Series string neglected");
718 }else{
719 book.setInSeries(printSeries);
720 }
721 book.setEditor(null);
722 return book;
723
724 }
725
726 private ReferenceBase<?> makePrintSeries(Map<String, Object> valueMap){
727 if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}
728 ReferenceBase printSeries = refFactory.newPrintSeries();
729 makeStandardMapper(valueMap, printSeries, null);
730 return printSeries;
731 }
732
733 private ReferenceBase<?> makeProceedings(Map<String, Object> valueMap){
734 if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}
735 ReferenceBase proceedings = refFactory.newProceedings();
736 makeStandardMapper(valueMap, proceedings, null);
737 return proceedings;
738 }
739
740 private ReferenceBase<?> makeThesis(Map<String, Object> valueMap){
741 if (logger.isDebugEnabled()){logger.debug("RefType 'Thesis'");}
742 ReferenceBase thesis = refFactory.newThesis();
743 makeStandardMapper(valueMap, thesis, null);
744 return thesis;
745 }
746
747
748 private ReferenceBase<?> makeJournalVolume(Map<String, Object> valueMap){
749 if (logger.isDebugEnabled()){logger.debug("RefType 'JournalVolume'");}
750 //Proceedings proceedings = Proceedings.NewInstance();
751 ReferenceBase journalVolume = refFactory.newGeneric();
752 makeStandardMapper(valueMap, journalVolume, null);
753 logger.warn("Journal volumes not yet implemented. Generic created instead but with errors");
754 return journalVolume;
755 }
756
757 private boolean makeStandardMapper(Map<String, Object> valueMap, ReferenceBase<?> ref){
758 return makeStandardMapper(valueMap, ref, null);
759 }
760
761
762 private boolean makeStandardMapper(Map<String, Object> valueMap, CdmBase cdmBase, Set<String> omitAttributes){
763 boolean result = true;
764 for (CdmAttributeMapperBase mapper : classMappers){
765 if (mapper instanceof CdmSingleAttributeMapperBase){
766 result &= makeStandardSingleMapper(valueMap, cdmBase, (CdmSingleAttributeMapperBase)mapper, omitAttributes);
767 }else if (mapper instanceof CdmOneToManyMapper){
768 result &= makeMultipleValueAddMapper(valueMap, cdmBase, (CdmOneToManyMapper)mapper, omitAttributes);
769 }else{
770 logger.error("Unknown mapper type");
771 result = false;
772 }
773 }
774 return result;
775 }
776
777 private boolean makeStandardSingleMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmSingleAttributeMapperBase mapper, Set<String> omitAttributes){
778 boolean result = true;
779 if (omitAttributes == null){
780 omitAttributes = new HashSet<String>();
781 }
782 if (mapper instanceof CdmExtensionMapper){
783 result &= ((CdmExtensionMapper)mapper).invoke(valueMap, cdmBase);
784 }else{
785 String sourceAttribute = mapper.getSourceAttributeList().get(0).toLowerCase();
786 Object value = valueMap.get(sourceAttribute);
787 if (value != null){
788 String destinationAttribute = mapper.getDestinationAttribute();
789 if (! omitAttributes.contains(destinationAttribute)){
790 result &= ImportHelper.addValue(value, cdmBase, destinationAttribute, mapper.getTypeClass(), OVERWRITE, OBLIGATORY);
791 }
792 }
793 }
794 return result;
795 }
796
797
798 private boolean makeMultipleValueAddMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmOneToManyMapper<CdmBase, CdmBase, CdmSingleAttributeMapperBase> mapper, Set<String> omitAttributes){
799 if (omitAttributes == null){
800 omitAttributes = new HashSet<String>();
801 }
802 boolean result = true;
803 String destinationAttribute = mapper.getSingleAttributeName();
804 List<Object> sourceValues = new ArrayList<Object>();
805 List<Class> classes = new ArrayList<Class>();
806 for (CdmSingleAttributeMapperBase singleMapper : mapper.getSingleMappers()){
807 String sourceAttribute = singleMapper.getSourceAttribute();
808 Object value = valueMap.get(sourceAttribute);
809 sourceValues.add(value);
810 Class<?> clazz = singleMapper.getTypeClass();
811 classes.add(clazz);
812 }
813
814 result &= ImportHelper.addMultipleValues(sourceValues, cdmBase, destinationAttribute, classes, NO_OVERWRITE, OBLIGATORY);
815 // //only for testing
816 // if (cdmBase instanceof PublicationBase){
817 // PublicationBase pub = ((PublicationBase)cdmBase);
818 // pub.addPublisher("A new publisher for " + pub.getTitleCache(), "A nice place");
819 // }
820 return result;
821 }
822
823
824 private static TeamOrPersonBase<?> getAuthorTeam(String authorString, TeamOrPersonBase<?> nomAuthor, boolean preferNomeclaturalAuthor){
825 TeamOrPersonBase<?> result;
826 if (preferNomeclaturalAuthor){
827 if (nomAuthor != null){
828 result = nomAuthor;
829 }else{
830 if (CdmUtils.Nz(authorString).equals("")){
831 result = null;
832 }else{
833 TeamOrPersonBase<?> team = Team.NewInstance();
834 //TODO which one to use??
835 team.setNomenclaturalTitle(authorString);
836 team.setTitleCache(authorString);
837 result = team;
838 }
839 }
840 }else{ //prefer bibliographic
841 if (! CdmUtils.Nz(authorString).equals("")){
842 TeamOrPersonBase<?> team = Team.NewInstance();
843 //TODO which one to use??
844 team.setNomenclaturalTitle(authorString);
845 team.setTitleCache(authorString);
846 result = team;
847 }else{
848 result = nomAuthor;
849 }
850 }
851 return result;
852 }
853
854
855
856 /* (non-Javadoc)
857 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
858 */
859 protected boolean isIgnore(BerlinModelImportState state){
860 return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
861 }
862
863
864
865 //******************************** CHECK *************************************************
866
867 private static boolean checkArticlesWithoutJournal(BerlinModelImportConfigurator bmiConfig){
868 try {
869 boolean result = true;
870 Source source = bmiConfig.getSource();
871 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 " +
872 " 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 " +
873 " WHERE (Reference.RefCategoryFk = 1) AND (InRef.RefCategoryFk <> 9) ";
874 ResultSet resulSetarticlesWithoutJournal = source.getResultSet(strQueryArticlesWithoutJournal);
875 boolean firstRow = true;
876 while (resulSetarticlesWithoutJournal.next()){
877 if (firstRow){
878 System.out.println("========================================================");
879 logger.warn("There are Articles with wrong inRef type!");
880 System.out.println("========================================================");
881 }
882 int refId = resulSetarticlesWithoutJournal.getInt("RefId");
883 //int categoryFk = resulSetarticlesWithoutJournal.getInt("RefCategoryFk");
884 String cat = resulSetarticlesWithoutJournal.getString("RefCategoryAbbrev");
885 int inRefFk = resulSetarticlesWithoutJournal.getInt("InRefId");
886 //int inRefCategoryFk = resulSetarticlesWithoutJournal.getInt("InRefCatFk");
887 String inRefCat = resulSetarticlesWithoutJournal.getString("InRefCat");
888 String refCache = resulSetarticlesWithoutJournal.getString("RefCache");
889 String nomRefCache = resulSetarticlesWithoutJournal.getString("nomRefCache");
890 String title = resulSetarticlesWithoutJournal.getString("title");
891 String inRefTitle = resulSetarticlesWithoutJournal.getString("InRefTitle");
892
893 System.out.println("RefID:" + refId + "\n cat: " + cat +
894 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache + "\n title: " + title +
895 "\n inRefFk: " + inRefFk + "\n inRefCategory: " + inRefCat +
896 "\n inRefTitle: " + inRefTitle );
897 result = firstRow = false;
898 }
899
900 return result;
901 } catch (SQLException e) {
902 e.printStackTrace();
903 return false;
904 }
905 }
906
907 private static boolean checkPartOfJournal(BerlinModelImportConfigurator bmiConfig){
908 try {
909 boolean result = true;
910 Source source = bmiConfig.getSource();
911 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 " +
912 " 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 " +
913 " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 9) ";
914 ResultSet rs = source.getResultSet(strQueryPartOfJournal);
915 boolean firstRow = true;
916 while (rs.next()){
917 if (firstRow){
918 System.out.println("========================================================");
919 logger.warn("There are part-of-references that have a Journal as in-reference!");
920 System.out.println("========================================================");
921 }
922 int refId = rs.getInt("RefId");
923 //int categoryFk = rs.getInt("RefCategoryFk");
924 String cat = rs.getString("RefCategoryAbbrev");
925 int inRefFk = rs.getInt("InRefId");
926 //int inRefCategoryFk = rs.getInt("InRefCatFk");
927 String inRefCat = rs.getString("InRefCat");
928 String refCache = rs.getString("RefCache");
929 String nomRefCache = rs.getString("nomRefCache");
930 String title = rs.getString("title");
931 String inRefTitle = rs.getString("InRefTitle");
932
933 System.out.println("RefID:" + refId + "\n cat: " + cat +
934 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache + "\n title: " + title +
935 "\n inRefFk: " + inRefFk + "\n inRefCategory: " + inRefCat +
936 "\n inRefTitle: " + inRefTitle );
937 result = firstRow = false;
938 }
939
940 return result;
941 } catch (SQLException e) {
942 e.printStackTrace();
943 return false;
944 }
945 }
946
947
948 private static boolean checkPartOfUnresolved(BerlinModelImportConfigurator bmiConfig){
949 try {
950 boolean result = true;
951 Source source = bmiConfig.getSource();
952 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 " +
953 " 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 " +
954 " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 10) ";
955 ResultSet rs = source.getResultSet(strQueryPartOfJournal);
956 boolean firstRow = true;
957 while (rs.next()){
958 if (firstRow){
959 System.out.println("========================================================");
960 logger.warn("There are part-of-references that have an 'unresolved' in-reference!");
961 System.out.println("========================================================");
962 }
963 int refId = rs.getInt("RefId");
964 //int categoryFk = rs.getInt("RefCategoryFk");
965 String cat = rs.getString("RefCategoryAbbrev");
966 int inRefFk = rs.getInt("InRefId");
967 //int inRefCategoryFk = rs.getInt("InRefCatFk");
968 String inRefCat = rs.getString("InRefCat");
969 String refCache = rs.getString("RefCache");
970 String nomRefCache = rs.getString("nomRefCache");
971 String title = rs.getString("title");
972 String inRefTitle = rs.getString("InRefTitle");
973
974 System.out.println("RefID:" + refId + "\n cat: " + cat +
975 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache + "\n title: " + title +
976 "\n inRefFk: " + inRefFk + "\n inRefCategory: " + inRefCat +
977 "\n inRefTitle: " + inRefTitle );
978 result = firstRow = false;
979 }
980 if (result == false){
981 System.out.println("\nChoose a specific type from the following reference types: \n" +
982 " 1) Article \n 2) Book \n 3) BookSection \n 4) CdDvd \n 5) ConferenceProceeding \n 6) Database\n" +
983 " 7) Generic \n 7) InProceedings \n 8) Journal \n 9) Map \n 10) Patent \n 11) PersonalCommunication\n" +
984 " 12) PrintSeries \n 13) Proceedings \n 14) Report \n 15) Thesis \n 16) WebPage");
985 }
986 return result;
987 } catch (SQLException e) {
988 e.printStackTrace();
989 return false;
990 }
991 }
992
993 private static boolean checkPartOfPartOf(BerlinModelImportConfigurator bmiConfig){
994 try {
995 boolean result = true;
996 Source source = bmiConfig.getSource();
997 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 " +
998 " FROM Reference " +
999 " INNER JOIN Reference AS InRef ON Reference.InRefFk = InRef.RefId " +
1000 " INNER JOIN RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId " +
1001 " INNER JOIN RefCategory AS InRefCategory ON InRef.RefCategoryFk = InRefCategory.RefCategoryId " +
1002 " INNER JOIN Reference AS InInRef ON InRef.InRefFk = InInRef.RefId " +
1003 " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 2) ";
1004 ResultSet rs = source.getResultSet(strQueryPartOfJournal);
1005 boolean firstRow = true;
1006 while (rs.next()){
1007 if (firstRow){
1008 System.out.println("========================================================");
1009 logger.warn("There are part-of-references that are part of an other 'part-of' reference!\n" +
1010 " This is invalid or ambigous. Please try to determine the reference types more detailed ");
1011 System.out.println("========================================================");
1012 }
1013 int refId = rs.getInt("RefId");
1014 //int categoryFk = rs.getInt("RefCategoryFk");
1015 String cat = rs.getString("RefCategoryAbbrev");
1016 int inRefFk = rs.getInt("InRefId");
1017 //int inRefCategoryFk = rs.getInt("InRefCatFk");
1018 String inRefCat = rs.getString("InRefCat");
1019 String refCache = rs.getString("RefCache");
1020 String nomRefCache = rs.getString("nomRefCache");
1021 String title = rs.getString("title");
1022 String inRefTitle = rs.getString("InRefTitle");
1023 int inInRefId = rs.getInt("InInRefId");
1024 String inInRefTitle = rs.getString("inInRefTitle");
1025 int inInRefCategory = rs.getInt("inInRefCategory");
1026
1027 System.out.println("RefID:" + refId + "\n cat: " + cat +
1028 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache + "\n title: " + title +
1029 "\n inRefFk: " + inRefFk + "\n inRefCategory: " + inRefCat +
1030 "\n inRefTitle: " + inRefTitle + "\n inInRefId: " + inInRefId + "\n inInRefTitle: " + inInRefTitle +
1031 "\n inInRefCategory: " + inInRefCategory );
1032 result = firstRow = false;
1033 }
1034 if (result == false){
1035 System.out.println("\nChoose a specific type from the following reference types: \n" +
1036 " 1) BookSection - Book - PrintSeries \n" +
1037 " 2) InProceedings - pProceedings - PrintSeries");
1038 }
1039 return result;
1040 } catch (SQLException e) {
1041 e.printStackTrace();
1042 return false;
1043 }
1044 }
1045
1046
1047 private static boolean checkPartOfArticle(BerlinModelImportConfigurator bmiConfig){
1048 try {
1049 boolean result = true;
1050 Source source = bmiConfig.getSource();
1051 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 " +
1052 " 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 " +
1053 " WHERE (Reference.RefCategoryFk = 2) AND (InRef.RefCategoryFk = 1) ";
1054 ResultSet rs = source.getResultSet(strQueryPartOfJournal);
1055 boolean firstRow = true;
1056 while (rs.next()){
1057 if (firstRow){
1058 System.out.println("========================================================");
1059 logger.warn("There are part-of-references that have an article as in-reference!");
1060 System.out.println("========================================================");
1061 }
1062 int refId = rs.getInt("RefId");
1063 //int categoryFk = rs.getInt("RefCategoryFk");
1064 String cat = rs.getString("RefCategoryAbbrev");
1065 int inRefFk = rs.getInt("InRefId");
1066 //int inRefCategoryFk = rs.getInt("InRefCatFk");
1067 String inRefCat = rs.getString("InRefCat");
1068 String refCache = rs.getString("RefCache");
1069 String nomRefCache = rs.getString("nomRefCache");
1070 String title = rs.getString("title");
1071 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1072 String inRefTitle = rs.getString("InRefTitle");
1073 String inRefnomTitleAbbrev = rs.getString("inRefnomTitleAbbrev");
1074 String inRefnomRefCache = rs.getString("inRefnomRefCache");
1075 String inRefCache = rs.getString("inRefCache");
1076
1077 System.out.println("RefID:" + refId + "\n cat: " + cat +
1078 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache + "\n title: " + title + "\n titleAbbrev: " + nomTitleAbbrev +
1079 "\n inRefFk: " + inRefFk + "\n inRefCategory: " + inRefCat +
1080 "\n inRefTitle: " + inRefTitle + "\n inRefTitleAbbrev: " + inRefnomTitleAbbrev +
1081 "\n inRefnomRefCache: " + inRefnomRefCache + "\n inRefCache: " + inRefCache
1082 );
1083 result = firstRow = false;
1084 }
1085
1086 return result;
1087 } catch (SQLException e) {
1088 e.printStackTrace();
1089 return false;
1090 }
1091 }
1092
1093 private static boolean checkJournalsWithSeries(BerlinModelImportConfigurator bmiConfig){
1094 try {
1095 boolean result = true;
1096 Source source = bmiConfig.getSource();
1097 String strQueryArticlesWithoutJournal = "SELECT Reference.RefId, Reference.RefCategoryFk, Reference.RefCache, Reference.NomRefCache, Reference.Title, Reference.NomTitleAbbrev, RefCategory.RefCategoryAbbrev " +
1098 " FROM Reference INNER JOIN " +
1099 " RefCategory ON Reference.RefCategoryFk = RefCategory.RefCategoryId " +
1100 " WHERE (Reference.RefCategoryFk = 9) AND ( Reference.series is not null OR Reference.series <>'') ";
1101 ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);
1102 boolean firstRow = true;
1103 while (rs.next()){
1104 if (firstRow){
1105 System.out.println("========================================================");
1106 logger.warn("There are Journals with series!");
1107 System.out.println("========================================================");
1108 }
1109 int refId = rs.getInt("RefId");
1110 //int categoryFk = rs.getInt("RefCategoryFk");
1111 String cat = rs.getString("RefCategoryAbbrev");
1112 String nomRefCache = rs.getString("nomRefCache");
1113 String refCache = rs.getString("refCache");
1114 String title = rs.getString("title");
1115 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1116
1117 System.out.println("RefID:" + refId + "\n cat: " + cat +
1118 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache +
1119 "\n title: " + title + "\n nomTitleAbbrev: " + nomTitleAbbrev +
1120 "" );
1121 result = firstRow = false;
1122 }
1123
1124 return result;
1125 } catch (SQLException e) {
1126 e.printStackTrace();
1127 return false;
1128 }
1129 }
1130
1131 private static boolean checkPartOfWithVolume(BerlinModelImportConfigurator bmiConfig){
1132 try {
1133 boolean result = true;
1134 Source source = bmiConfig.getSource();
1135 String strQueryArticlesWithoutJournal = "SELECT Ref.RefId as refId, RefCategory.RefCategoryAbbrev as refCategoryAbbrev, Ref.nomRefCache as nomRefCache, Ref.refCache as refCache,Ref.volume as volume, Ref.Series as series, Ref.Edition as edition, Ref.title as title, Ref.nomTitleAbbrev as nomTitleAbbrev,InRef.RefCache as inRefRefCache, InRef.NomRefCache as inRefNomRefCache, InRef.RefId as inRefId, InRef.Volume as inRefVol, InRef.Series as inRefSeries, InRef.Edition as inRefEdition" +
1136 " FROM Reference AS Ref " +
1137 " INNER JOIN RefCategory ON Ref.RefCategoryFk = RefCategory.RefCategoryId " +
1138 " LEFT OUTER JOIN Reference AS InRef ON Ref.InRefFk = InRef.RefId " +
1139 " WHERE (Ref.RefCategoryFk = 2) AND ((Ref.Volume IS NOT NULL) OR (Ref.Series IS NOT NULL) OR (Ref.Edition IS NOT NULL)) " ;
1140 ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);
1141 boolean firstRow = true;
1142 while (rs.next()){
1143 if (firstRow){
1144 System.out.println("========================================================");
1145 logger.warn("There are PartOfOtherTitles with volumes, editions or series !");
1146 System.out.println("========================================================");
1147 }
1148 int refId = rs.getInt("refId");
1149 String cat = rs.getString("refCategoryAbbrev");
1150 String nomRefCache = rs.getString("nomRefCache");
1151 String refCache = rs.getString("refCache");
1152 String title = rs.getString("title");
1153 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1154 String volume = rs.getString("volume");
1155 String edition = rs.getString("edition");
1156 String series = rs.getString("series");
1157 String inRefRefCache = rs.getString("inRefRefCache");
1158 String inRefNomRefCache = rs.getString("inRefNomRefCache");
1159 int inRefId = rs.getInt("inRefId");
1160 String inRefVolume = rs.getString("inRefVol");
1161 String inRefSeries = rs.getString("inRefSeries");
1162 String inRefEdition = rs.getString("inRefEdition");
1163
1164 System.out.println("RefID:" + refId + "\n cat: " + cat +
1165 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache +
1166 "\n title: " + title + "\n nomTitleAbbrev: " + nomTitleAbbrev + "\n volume: " + volume + "\n series: " + series +"\n edition: " + edition +
1167 "\n inRef-ID:" + inRefId + "\n inRef-cache: " + inRefRefCache +
1168 "\n inRef-nomCache: " + inRefNomRefCache + "\n inRef-volume: " + inRefVolume +"\n inRef-series: " + inRefSeries +"\n inRef-edition: " + inRefEdition +
1169 "" );
1170 result = firstRow = false;
1171 }
1172
1173 return result;
1174 } catch (SQLException e) {
1175 e.printStackTrace();
1176 return false;
1177 }
1178 }
1179
1180 private static boolean checkArticleWithEdition(BerlinModelImportConfigurator bmiConfig){
1181 try {
1182 boolean result = true;
1183 Source source = bmiConfig.getSource();
1184 String strQueryArticlesWithoutJournal = "SELECT Ref.RefId as refId, RefCategory.RefCategoryAbbrev as refCategoryAbbrev, Ref.nomRefCache as nomRefCache, Ref.refCache as refCache,Ref.edition as edition, Ref.title as title, Ref.nomTitleAbbrev as nomTitleAbbrev,InRef.RefCache as inRefRefCache, InRef.NomRefCache as inRefNomRefCache, InRef.RefId as inRefId, InRef.Edition as inRefEdition" +
1185 " FROM Reference AS Ref " +
1186 " INNER JOIN RefCategory ON Ref.RefCategoryFk = RefCategory.RefCategoryId " +
1187 " LEFT OUTER JOIN Reference AS InRef ON Ref.InRefFk = InRef.RefId " +
1188 " WHERE (Ref.RefCategoryFk = 1) AND (NOT (Ref.Edition IS NULL)) " +
1189 " ORDER BY InRef.RefId ";
1190 ResultSet rs = source.getResultSet(strQueryArticlesWithoutJournal);
1191 boolean firstRow = true;
1192 while (rs.next()){
1193 if (firstRow){
1194 System.out.println("========================================================");
1195 logger.warn("There are Articles with editions !");
1196 System.out.println("========================================================");
1197 }
1198 int refId = rs.getInt("refId");
1199 String cat = rs.getString("refCategoryAbbrev");
1200 String nomRefCache = rs.getString("nomRefCache");
1201 String refCache = rs.getString("refCache");
1202 String title = rs.getString("title");
1203 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
1204 String edition = rs.getString("edition");
1205 String inRefRefCache = rs.getString("inRefRefCache");
1206 String inRefNomRefCache = rs.getString("inRefNomRefCache");
1207 int inRefId = rs.getInt("inRefId");
1208 String inRefEdition = rs.getString("inRefEdition");
1209
1210 System.out.println("RefID:" + refId + "\n cat: " + cat +
1211 "\n refCache: " + refCache + "\n nomRefCache: " + nomRefCache +
1212 "\n title: " + title + "\n nomTitleAbbrev: " + nomTitleAbbrev + "\n edition: " + edition +
1213 "\n inRef-ID:" + inRefId + "\n inRef-cache: " + inRefRefCache +
1214 "\n inRef-nomCache: " + inRefNomRefCache + "\n inRef-edition: " + inRefEdition +
1215 "" );
1216 result = firstRow = false;
1217 }
1218
1219 return result;
1220 } catch (SQLException e) {
1221 e.printStackTrace();
1222 return false;
1223 }
1224 }
1225
1226 protected boolean checkObligatoryAttributes(IImportConfigurator config){
1227 boolean result = true;
1228
1229 try {
1230 String strQuery = " SELECT Reference.* " +
1231 " FROM Reference " +
1232 // " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
1233 " WHERE (1=0) ";
1234 BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
1235 Source source = bmiConfig.getSource();
1236 ResultSet rs = source.getResultSet(strQuery);
1237 int colCount = rs.getMetaData().getColumnCount();
1238 Set<String> existingAttributes = new HashSet<String>();
1239 for (int c = 0; c < colCount ; c++){
1240 existingAttributes.add(rs.getMetaData().getColumnLabel(c+1).toLowerCase());
1241 }
1242 Set<String> obligatoryAttributes = getObligatoryAttributes(true);
1243
1244 obligatoryAttributes.removeAll(existingAttributes);
1245 for (String attr : obligatoryAttributes){
1246 logger.warn("Missing attribute: " + attr);
1247 }
1248
1249 //additional Attributes
1250 obligatoryAttributes = getObligatoryAttributes(true);
1251
1252 existingAttributes.removeAll(obligatoryAttributes);
1253 for (String attr : existingAttributes){
1254 logger.warn("Additional attribute: " + attr);
1255 }
1256 } catch (SQLException e) {
1257 logger.error(e);
1258 e.printStackTrace();
1259 result = false;
1260 }
1261 return result;
1262 }
1263
1264 protected Set<String> getObligatoryAttributes(boolean lowerCase){
1265 Set<String> result = new HashSet<String>();
1266 result.addAll(Arrays.asList(unclearMappers));
1267 result.addAll(Arrays.asList(createdAndNotesAttributes));
1268 result.addAll(Arrays.asList(operationalAttributes));
1269 CdmIoMapping mapping = new CdmIoMapping();
1270 for (CdmAttributeMapperBase mapper : classMappers){
1271 mapping.addMapper(mapper);
1272 }
1273 result.addAll(mapping.getSourceAttributes());
1274 if (lowerCase){
1275 Set<String> lowerCaseResult = new HashSet<String>();
1276 for (String str : result){
1277 if (str != null){lowerCaseResult.add(str.toLowerCase());}
1278 }
1279 result = lowerCaseResult;
1280 }
1281 return result;
1282 }
1283
1284 protected boolean checkRefDetailUnimplementedAttributes(IImportConfigurator config){
1285 boolean result = true;
1286
1287 try {
1288 String strQuery = " SELECT Count(*) as n" +
1289 " FROM RefDetail " +
1290 // " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
1291 " WHERE SecondarySources is not NULL AND SecondarySources <> '' ";
1292 BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
1293 Source source = bmiConfig.getSource();
1294 ResultSet rs = source.getResultSet(strQuery);
1295
1296 rs.next();
1297 int count = rs.getInt("n");
1298 if (count > 0){
1299 System.out.println("========================================================");
1300 logger.warn("There are "+ count + " RefDetails with SecondarySources <> NULL ! Secondary sources are not yet implemented for Berlin Model Import");
1301 System.out.println("========================================================");
1302
1303 }
1304 strQuery = " SELECT Count(*) as n" +
1305 " FROM RefDetail " +
1306 // " INNER JOIN Reference ON Reference.RefId = RefDetail.RefFk " +
1307 " WHERE IdInSource is not NULL AND IdInSource <> '' ";
1308 rs = source.getResultSet(strQuery);
1309
1310 rs.next();
1311 count = rs.getInt("n");
1312 if (count > 0){
1313 System.out.println("========================================================");
1314 logger.warn("There are "+ count + " RefDetails with IdInSource <> NULL ! IdInSource are not yet implemented for Berlin Model Import");
1315 System.out.println("========================================================");
1316
1317 }
1318
1319 } catch (SQLException e) {
1320 logger.error(e);
1321 e.printStackTrace();
1322 result = false;
1323 }
1324 return result;
1325 }
1326
1327 }