1
2
3
4
5
6
7
8
9
10 package eu.etaxonomy.cdm.io.berlinModel.in;
11
12 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_ARTICLE;
13 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_BOOK;
14 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_CONFERENCE_PROCEEDINGS;
15 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_DATABASE;
16 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_INFORMAL;
17 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL;
18 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_JOURNAL_VOLUME;
19 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PART_OF_OTHER_TITLE;
20 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_PRINT_SERIES;
21 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_UNKNOWN;
22 import static eu.etaxonomy.cdm.io.berlinModel.BerlinModelTransformer.REF_WEBSITE;
23 import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.ALL;
24 import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.CONCEPT_REFERENCES;
25 import static eu.etaxonomy.cdm.io.common.IImportConfigurator.DO_REFERENCES.NOMENCLATURAL;
26 import static eu.etaxonomy.cdm.io.common.ImportHelper.NO_OVERWRITE;
27 import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;
28 import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;
29
30 import java.sql.ResultSet;
31 import java.sql.SQLException;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.HashMap;
35 import java.util.HashSet;
36 import java.util.List;
37 import java.util.Map;
38 import java.util.Set;
39 import java.util.UUID;
40
41 import org.apache.log4j.Logger;
42 import org.springframework.stereotype.Component;
43
44 import eu.etaxonomy.cdm.common.CdmUtils;
45 import eu.etaxonomy.cdm.io.berlinModel.CdmOneToManyMapper;
46 import eu.etaxonomy.cdm.io.berlinModel.CdmStringMapper;
47 import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelReferenceImportValidator;
48 import eu.etaxonomy.cdm.io.common.ICdmIO;
49 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
50 import eu.etaxonomy.cdm.io.common.ImportHelper;
51 import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;
52 import eu.etaxonomy.cdm.io.common.Source;
53 import eu.etaxonomy.cdm.io.common.mapping.CdmAttributeMapperBase;
54 import eu.etaxonomy.cdm.io.common.mapping.CdmIoMapping;
55 import eu.etaxonomy.cdm.io.common.mapping.CdmSingleAttributeMapperBase;
56 import eu.etaxonomy.cdm.io.common.mapping.DbImportExtensionMapper;
57 import eu.etaxonomy.cdm.model.agent.Team;
58 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
59 import eu.etaxonomy.cdm.model.common.CdmBase;
60 import eu.etaxonomy.cdm.model.common.ExtensionType;
61 import eu.etaxonomy.cdm.model.common.IdentifiableSource;
62 import eu.etaxonomy.cdm.model.common.Marker;
63 import eu.etaxonomy.cdm.model.common.MarkerType;
64 import eu.etaxonomy.cdm.model.reference.IArticle;
65 import eu.etaxonomy.cdm.model.reference.IBook;
66 import eu.etaxonomy.cdm.model.reference.IBookSection;
67 import eu.etaxonomy.cdm.model.reference.IJournal;
68 import eu.etaxonomy.cdm.model.reference.IPrintSeries;
69 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
70 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
71 import eu.etaxonomy.cdm.model.reference.ReferenceType;
72
73
74
75
76
77
78 @Component
79 public class BerlinModelReferenceImport extends BerlinModelImportBase {
80 private static final Logger logger = Logger.getLogger(BerlinModelReferenceImport.class);
81
82 public static final String NOM_REFERENCE_NAMESPACE = "NomReference";
83 public static final String BIBLIO_REFERENCE_NAMESPACE = "BiblioReference";
84
85 public static final UUID REF_DEPOSITED_AT_UUID = UUID.fromString("23ca88c7-ce73-41b2-8ca3-2cb22f013beb");
86 public static final UUID REF_SOURCE = UUID.fromString("d6432582-2216-4b08-b0db-76f6c1013141");
87 public static final UUID DATE_STRING_UUID = UUID.fromString("e4130eae-606e-4b0c-be4f-e93dc161be7d");
88
89
90 private int modCount = 1000;
91 private static final String pluralString = "references";
92 private static final String dbTableName = "reference";
93
94
95 public BerlinModelReferenceImport(){
96 super();
97 }
98
99 protected boolean initializeMappers(BerlinModelImportState state){
100 for (CdmAttributeMapperBase mapper: classMappers){
101 if (mapper instanceof DbImportExtensionMapper){
102 ((DbImportExtensionMapper)mapper).initialize(state, ReferenceBase.class);
103 }
104 }
105 return true;
106 }
107
108 protected static CdmAttributeMapperBase[] classMappers = new CdmAttributeMapperBase[]{
109 new CdmStringMapper("edition", "edition"),
110 new CdmStringMapper("volume", "volume"),
111 new CdmStringMapper("publisher", "publisher"),
112 new CdmStringMapper("publicationTown", "placePublished"),
113 new CdmStringMapper("isbn", "isbn"),
114 new CdmStringMapper("isbn", "isbn"),
115 new CdmStringMapper("pageString", "pages"),
116 new CdmStringMapper("series", "series"),
117 new CdmStringMapper("issn", "issn"),
118 new CdmStringMapper("url", "uri"),
119 DbImportExtensionMapper.NewInstance("NomStandard", ExtensionType.NOMENCLATURAL_STANDARD()),
120 DbImportExtensionMapper.NewInstance("DateString", DATE_STRING_UUID, "Date String", "Date String", "dates"),
121 DbImportExtensionMapper.NewInstance("RefDepositedAt", REF_DEPOSITED_AT_UUID, "RefDepositedAt", "reference is deposited at", "at"),
122 DbImportExtensionMapper.NewInstance("RefSource", REF_SOURCE, "RefSource", "reference source", "source")
123 };
124
125
126 protected static String[] operationalAttributes = new String[]{
127 "refId", "refCache", "nomRefCache", "preliminaryFlag", "inRefFk", "title", "nomTitleAbbrev",
128 "refAuthorString", "nomAuthorTeamFk",
129 "refCategoryFk", "thesisFlag", "informalRefCategory", "idInSource"
130 };
131
132 protected static String[] createdAndNotesAttributes = new String[]{
133 "created_When", "updated_When", "created_Who", "updated_Who", "notes"
134 };
135
136 protected static String[] unclearMappers = new String[]{
137 "isPaper", "exportDate",
138 };
139
140
141
142
143
144
145
146 private class RefCounter{
147 RefCounter() {nomRefCount = 0; referenceCount = 0;};
148 int nomRefCount;
149 int referenceCount;
150 public String toString(){return String.valueOf(nomRefCount) + "," +String.valueOf(referenceCount);};
151 }
152
153
154
155
156
157 @Override
158 protected String getRecordQuery(BerlinModelImportConfigurator config) {
159 return null;
160 }
161
162
163 @Override
164 protected boolean doInvoke(BerlinModelImportState state){
165 boolean success = true;
166 logger.info("start make " + getPluralString() + " ...");
167
168 success &= initializeMappers(state);
169 BerlinModelImportConfigurator config = state.getConfig();
170 Source source = config.getSource();
171
172 String strSelectId = "Select Reference.RefId as refId";
173 String strSelectFull =
174 " SELECT Reference.* , InReference.RefId as InRefId, InReference.RefCategoryFk as InRefCategoryFk, " +
175 " InInReference.RefId as InInRefId, InInReference.RefCategoryFk as InInRefCategoryFk, " +
176 " InReference.InRefFk AS InRefInRefFk, InInReference.InRefFk AS InInRefInRefFk, RefSource.RefSource " ;
177 String strFrom = " FROM Reference AS InInReference " +
178 " RIGHT OUTER JOIN Reference AS InReference ON InInReference.RefId = InReference.InRefFk " +
179 " RIGHT OUTER JOIN Reference ON InReference.RefId = dbo.Reference.InRefFk " +
180 " LEFT OUTER JOIN RefSource ON Reference.RefSourceFk = RefSource.RefSourceId " +
181 " WHERE (1=1) ";
182 String strWherePartitioned = " AND (Reference.refId IN ("+ ID_LIST_TOKEN + ") ) ";
183
184
185 String strQueryTestMaxRecursion = strSelectId + strFrom +
186 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NOT NULL) ";
187 ResultSet testMaxRecursionResultSet = source.getResultSet(strQueryTestMaxRecursion);
188 try {
189 if (testMaxRecursionResultSet.next() == true){
190 logger.error("Maximum allowed InReference recursions exceeded in Berlin Model. Maximum recursion level is 2.");
191 return false;
192 }
193 } catch (SQLException e1) {
194 e1.printStackTrace();
195 logger.error("There are references with more then 2 in-reference recursion. Maximum number of allowed recursions is 2. Records will not be stored.");
196 success = false;
197 }
198
199 String strSelectIdBase = strSelectId + strFrom;
200
201 String strIdQueryNoInRef = strSelectIdBase +
202 " AND (Reference.InRefFk is NULL) ";
203 String strIdQuery1InRef = strSelectIdBase +
204 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NULL) ";
205 String strIdQuery2InRefs = strSelectIdBase +
206 " AND (Reference.InRefFk is NOT NULL) AND (InReference.InRefFk is NOT NULL) AND (InInReference.InRefFk is NULL) ";
207
208 if (config.getDoReferences() == CONCEPT_REFERENCES){
209 strIdQueryNoInRef += " AND ( Reference.refId IN ( SELECT ptRefFk FROM PTaxon) ) ";
210 }
211
212 String strRecordQuery = strSelectFull + strFrom + strWherePartitioned;
213
214 int recordsPerTransaction = config.getRecordsPerTransaction();
215 try{
216
217 ResultSetPartitioner partitioner = ResultSetPartitioner.NewInstance(source, strIdQueryNoInRef, strRecordQuery, recordsPerTransaction);
218 while (partitioner.nextPartition()){
219 partitioner.doPartition(this, state);
220 }
221 logger.info("end make references with no in-references ... " + getSuccessString(success));
222
223 if (config.getDoReferences() == ALL || config.getDoReferences() == NOMENCLATURAL){
224
225
226 partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery1InRef, strRecordQuery, recordsPerTransaction);
227 while (partitioner.nextPartition()){
228 partitioner.doPartition(this, state);
229 }
230 logger.info("end make references with no 1 in-reference ... " + getSuccessString(success));
231
232
233 partitioner = ResultSetPartitioner.NewInstance(source, strIdQuery2InRefs, strRecordQuery, recordsPerTransaction);
234 while (partitioner.nextPartition()){
235 partitioner.doPartition(this, state);
236 }
237 logger.info("end make references with no 2 in-reference ... " + getSuccessString(success));
238 }
239
240 } catch (SQLException e) {
241 logger.error("SQLException:" + e);
242 return false;
243 }
244 logger.info("end make " + getPluralString() + " ... " + getSuccessString(success));
245 return success;
246 }
247
248
249
250
251
252
253 public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {
254 boolean success = true;
255
256
257
258 Map<Integer, ReferenceBase> nomRefToSave = new HashMap<Integer, ReferenceBase>();
259 Map<Integer, ReferenceBase> biblioRefToSave = new HashMap<Integer, ReferenceBase>();
260
261 Map<String, ReferenceBase> relatedNomReferences = partitioner.getObjectMap(NOM_REFERENCE_NAMESPACE);
262 Map<String, ReferenceBase> relatedBiblioReferences = partitioner.getObjectMap(BIBLIO_REFERENCE_NAMESPACE);
263
264 BerlinModelImportConfigurator config = state.getConfig();
265
266 try {
267
268
269
270
271
272
273
274 int i = 0;
275 RefCounter refCounter = new RefCounter();
276
277
278 ResultSet rs = partitioner.getResultSet();
279
280 while (rs.next()){
281 if ((i++ % modCount) == 0 && i!= 1 ){ logger.info("References handled: " + (i-1) + " in round -" );}
282
283 success &= makeSingleReferenceRecord(rs, state, partitioner, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences, refCounter);
284 }
285
286
287 Integer sourceSecId = (Integer)config.getSourceSecId();
288 ReferenceBase<?> sec = biblioRefToSave.get(sourceSecId);
289 if (sec == null){
290 sec = nomRefToSave.get(sourceSecId);
291 }
292 if (sec != null){
293 sec.setUuid(config.getSecUuid());
294 logger.info("SecUuid changed to: " + config.getSecUuid());
295 }
296
297
298 logger.info("Save nomenclatural references (" + refCounter.nomRefCount + ")");
299 getReferenceService().save(nomRefToSave.values());
300 logger.info("Save bibliographical references (" + refCounter.referenceCount +")");
301 getReferenceService().save(biblioRefToSave.values());
302
303
304
305 logger.info("end makeReferences ..." + getSuccessString(success));;
306 return success;
307 } catch (SQLException e) {
308 logger.error("SQLException:" + e);
309 return false;
310 }
311 }
312
313
314
315
316
317
318 public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {
319 String nameSpace;
320 Class cdmClass;
321 Set<String> idSet;
322
323 Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();
324
325 try{
326 Set<String> teamIdSet = new HashSet<String>();
327 Set<String> referenceIdSet = new HashSet<String>();
328
329 while (rs.next()){
330 handleForeignKey(rs, teamIdSet, "NomAuthorTeamFk");
331 handleForeignKey(rs, referenceIdSet, "InRefFk");
332 }
333
334
335 nameSpace = BerlinModelAuthorTeamImport.NAMESPACE;
336 cdmClass = Team.class;
337 idSet = teamIdSet;
338 Map<String, Team> teamMap = (Map<String, Team>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
339 result.put(nameSpace, teamMap);
340
341
342
343 nameSpace = NOM_REFERENCE_NAMESPACE;
344 cdmClass = ReferenceBase.class;
345 idSet = referenceIdSet;
346 Map<String, ReferenceBase> nomRefMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
347 result.put(nameSpace, nomRefMap);
348
349
350 nameSpace = BIBLIO_REFERENCE_NAMESPACE;
351 cdmClass = ReferenceBase.class;
352 idSet = referenceIdSet;
353 Map<String, ReferenceBase> biblioRefMap = (Map<String, ReferenceBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);
354 result.put(nameSpace, biblioRefMap);
355
356 } catch (SQLException e) {
357 throw new RuntimeException(e);
358 }
359 return result;
360 }
361
362
363
364
365
366
367
368
369
370
371
372
373
374 private boolean makeSingleReferenceRecord(
375 ResultSet rs,
376 BerlinModelImportState state,
377 ResultSetPartitioner<BerlinModelImportState> partitioner,
378 Map<Integer, ReferenceBase> biblioRefToSave,
379 Map<Integer, ReferenceBase> nomRefToSave,
380 Map<String, ReferenceBase> relatedBiblioReferences,
381 Map<String, ReferenceBase> relatedNomReferences,
382 RefCounter refCounter){
383 boolean success = true;
384
385 Integer refId = null;
386 try {
387 Map<String, Object> valueMap = getValueMap(rs);
388
389 Integer categoryFk = (Integer)valueMap.get("refCategoryFk".toLowerCase());
390 refId = (Integer)valueMap.get("refId".toLowerCase());
391 Boolean thesisFlag = (Boolean)valueMap.get("thesisFlag".toLowerCase());
392
393
394 ReferenceBase<?> referenceBase;
395 logger.debug("RefCategoryFk: " + categoryFk);
396
397 if (thesisFlag){
398 referenceBase = makeThesis(valueMap);
399 }else if (categoryFk == REF_JOURNAL){
400 referenceBase = makeJournal(valueMap);
401 }else if(categoryFk == REF_BOOK){
402 referenceBase = makeBook(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
403 }else if(categoryFk == REF_DATABASE){
404 referenceBase = makeDatabase(valueMap);
405 }else if(categoryFk == REF_INFORMAL){
406 referenceBase = makeInformal(valueMap);
407 }else if(categoryFk == REF_WEBSITE){
408 referenceBase = makeWebSite(valueMap);
409 }else if(categoryFk == REF_UNKNOWN){
410 referenceBase = makeUnknown(valueMap);
411 }else if(categoryFk == REF_PRINT_SERIES){
412 referenceBase = makePrintSeries(valueMap);
413 }else if(categoryFk == REF_CONFERENCE_PROCEEDINGS){
414 referenceBase = makeProceedings(valueMap);
415 }else if(categoryFk == REF_ARTICLE){
416 referenceBase = makeArticle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
417 }else if(categoryFk == REF_JOURNAL_VOLUME){
418 referenceBase = makeJournalVolume(valueMap);
419 }else if(categoryFk == REF_PART_OF_OTHER_TITLE){
420 referenceBase = makePartOfOtherTitle(valueMap, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences);
421 }else{
422 logger.warn("Unknown categoryFk (" + categoryFk + "). Create 'Generic instead'");
423 referenceBase = ReferenceFactory.newGeneric();
424 success = false;
425 }
426
427
428 String refYear = (String)valueMap.get("refYear".toLowerCase());
429 referenceBase.setDatePublished(ImportHelper.getDatePublished(refYear));
430
431
432 doCreatedUpdatedNotes(state, referenceBase, rs);
433
434
435 if ((Boolean)valueMap.get("isPaper".toLowerCase())){
436 logger.warn("IsPaper is not yet implemented, but reference " + refId + " is paper");
437 }
438
439
440 String idInSource = (String)valueMap.get("IdInSource".toLowerCase());
441 if (CdmUtils.isNotEmpty(idInSource)){
442 IdentifiableSource source = IdentifiableSource.NewInstance(idInSource);
443 source.setIdNamespace("import to Berlin Model");
444 referenceBase.addSource(source);
445 }
446
447
448 success &= makeNomAndBiblioReference(rs, state, partitioner, refId, referenceBase, refCounter,
449 biblioRefToSave, nomRefToSave );
450
451
452 } catch (Exception e) {
453 logger.warn("Reference with BM refId '" + CdmUtils.Nz(refId) + "' threw Exception and could not be saved");
454 e.printStackTrace();
455 success = false;
456 }
457 return success;
458 }
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474 private boolean makeNomAndBiblioReference(
475 ResultSet rs,
476 BerlinModelImportState state,
477 ResultSetPartitioner partitioner,
478 int refId,
479 ReferenceBase<?> referenceBase,
480 RefCounter refCounter,
481 Map<Integer, ReferenceBase> biblioRefToSave,
482 Map<Integer, ReferenceBase> nomRefToSave
483 ) throws SQLException{
484
485 Map<String, Team> teamMap = partitioner.getObjectMap(BerlinModelAuthorTeamImport.NAMESPACE);
486
487 String refCache = rs.getString("refCache");
488 String nomRefCache = rs.getString("nomRefCache");
489 String title = rs.getString("title");
490 String nomTitleAbbrev = rs.getString("nomTitleAbbrev");
491 boolean isPreliminary = rs.getBoolean("PreliminaryFlag");
492 String refAuthorString = rs.getString("refAuthorString");
493 Integer nomAuthorTeamFk = rs.getInt("NomAuthorTeamFk");
494 String strNomAuthorTeamFk = String.valueOf(nomAuthorTeamFk);
495 TeamOrPersonBase<?> nomAuthor = teamMap.get(strNomAuthorTeamFk);
496 ReferenceBase nomReference = null;
497
498 boolean hasNomRef = false;
499 boolean hasBiblioRef = false;
500 ReferenceBase sourceReference = state.getConfig().getSourceReference();
501
502
503 if ( (CdmUtils.isNotEmpty(nomRefCache) && isPreliminary) || (CdmUtils.isNotEmpty(nomTitleAbbrev) && ! isPreliminary) ){
504 referenceBase.setTitle(nomTitleAbbrev);
505 TeamOrPersonBase<?> author = getAuthorTeam(refAuthorString , nomAuthor, true);
506 referenceBase.setAuthorTeam(author);
507
508 if (isPreliminary){
509 referenceBase.setTitleCache(nomRefCache, true);
510 }
511 if (! nomRefToSave.containsKey(refId)){
512 if (referenceBase == null){
513 logger.warn("refBase is null");
514 }
515 nomRefToSave.put(refId, referenceBase);
516 }else{
517 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
518 }
519
520
521
522 hasNomRef = true;
523 nomReference = referenceBase;
524 refCounter.nomRefCount++;
525 }
526
527 if ((CdmUtils.isNotEmpty(refCache) && isPreliminary && ! refCache.equalsIgnoreCase(nomRefCache))
528 || (CdmUtils.isNotEmpty(title) && ! isPreliminary && ! title.equalsIgnoreCase(nomTitleAbbrev))
529 || hasNomRef == false){
530 if (hasNomRef){
531 referenceBase = (ReferenceBase)referenceBase.clone();
532 copyCreatedUpdated(referenceBase, nomReference);
533 }
534 referenceBase.setTitle(title);
535 TeamOrPersonBase author = getAuthorTeam(refAuthorString , nomAuthor, false);
536 referenceBase.setAuthorTeam(author);
537 referenceBase.setNomenclaturallyRelevant(false);
538 if (isPreliminary){
539 referenceBase.setTitleCache(refCache, true);
540 }
541 if (! biblioRefToSave.containsKey(refId)){
542 biblioRefToSave.put(refId, referenceBase);
543 }else{
544 logger.warn("Duplicate refId in Berlin Model database. Second reference was not imported !!");
545 }
546 hasBiblioRef = true;
547
548
549
550 refCounter.referenceCount++;
551 }
552
553 if (hasNomRef){
554 ImportHelper.setOriginalSource(nomReference, sourceReference, refId, NOM_REFERENCE_NAMESPACE);
555 }
556 if (hasBiblioRef){
557 ImportHelper.setOriginalSource(referenceBase, sourceReference, refId, BIBLIO_REFERENCE_NAMESPACE);
558 }
559
560 return true;
561
562 }
563
564
565
566
567
568
569 private void copyCreatedUpdated(ReferenceBase<?> biblioReference, ReferenceBase nomReference) {
570 biblioReference.setCreatedBy(nomReference.getCreatedBy());
571 biblioReference.setCreated(nomReference.getCreated());
572 biblioReference.setUpdatedBy(nomReference.getUpdatedBy());
573 biblioReference.setUpdated(nomReference.getUpdated());
574
575 }
576
577 private ReferenceBase<?> makeArticle (Map<String, Object> valueMap, Map<Integer, ReferenceBase> biblioRefToSave, Map<Integer, ReferenceBase> nomRefToSave, Map<String, ReferenceBase> relatedBiblioReferences, Map<String, ReferenceBase> relatedNomReferences){
578
579 IArticle article = ReferenceFactory.newArticle();
580 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
581 Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
582 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
583
584 if (inRefFk != null){
585 if (inRefCategoryFk == REF_JOURNAL){
586 int inRefFkInt = (Integer)inRefFk;
587 if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
588 ReferenceBase<?> inJournal = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
589 if (inJournal == null){
590 inJournal = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
591 logger.info("inJournal (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
592 nomRefToSave.put(inRefFkInt, inJournal);
593 }
594 if (inJournal == null){
595 logger.warn("inJournal for " + inRefFkInt + " is null. "+
596 " InReference relation could not be set");
597
598 }else if (inJournal.getType().equals(ReferenceType.Journal)){
599 article.setInJournal((IJournal)inJournal);
600 }else{
601 logger.warn("InJournal is not of type journal but of type " + inJournal.getType() +
602 " Inreference relation could not be set");
603 }
604 }else{
605 logger.error("Journal (refId = " + inRefFkInt + " ) for Article (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
606
607 }
608 }else{
609 logger.warn("Wrong inrefCategory for Article (refID = " + refId +"). Type must be 'Journal' but was not (RefCategoryFk=" + inRefCategoryFk + "))." +
610 " InReference was not added to Article! ");
611 }
612 }
613 makeStandardMapper(valueMap, (ReferenceBase)article);
614 return (ReferenceBase)article;
615 }
616
617 private ReferenceBase<?> makePartOfOtherTitle (Map<String, Object> valueMap, Map<Integer, ReferenceBase> biblioRefToSave, Map<Integer, ReferenceBase> nomRefToSave, Map<String, ReferenceBase> relatedBiblioReferences, Map<String, ReferenceBase> relatedNomReferences){
618 ReferenceBase<?> result;
619 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
620 Integer inRefCategoryFk = (Integer)valueMap.get("inRefCategoryFk".toLowerCase());
621 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
622
623 if (inRefCategoryFk == null){
624
625 logger.warn("Part-Of-Other-Title has not inRefCategoryFk! RefId = " + refId + ". ReferenceType set to Generic.");
626 result = makeUnknown(valueMap);
627 }else if (inRefCategoryFk == REF_BOOK){
628
629 IBookSection bookSection = ReferenceFactory.newBookSection();
630 result = (ReferenceBase)bookSection;
631 if (inRefFk != null){
632 int inRefFkInt = (Integer)inRefFk;
633 if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
634 ReferenceBase<?> inBook = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
635 if (inBook == null){
636 inBook = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
637 logger.info("inBook (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
638 nomRefToSave.put(inRefFkInt, inBook);
639 }
640 if (inBook == null){
641 logger.warn("inBook for " + inRefFkInt + " is null. "+
642 " InReference relation could not be set");;
643
644 }else if (inBook.getType().equals(ReferenceType.Book)){
645 bookSection.setInBook((IBook)inBook);
646
647 }else{
648 logger.warn("InBook is not of type book but of type " + inBook.getClass().getSimpleName() +
649 " Inreference relation could not be set");
650 }
651 }else{
652 logger.error("Book (refId = " + inRefFkInt + ") for part_of_other_title (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
653
654 }
655 }
656 }else if (inRefCategoryFk == REF_ARTICLE){
657
658
659 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' is part of 'article'." +
660 " This type is not implemented yet. Generic reference created instead") ;
661 result = ReferenceFactory.newGeneric();
662 }else if (inRefCategoryFk == REF_JOURNAL){
663
664 logger.warn("Reference (refId = " + refId + ") of type 'part_of_other_title' has inReference of type 'journal'." +
665 " This is not allowed! Generic reference created instead") ;
666 result = ReferenceFactory.newGeneric();
667 result.addMarker(Marker.NewInstance(MarkerType.TO_BE_CHECKED(), true));
668 }else{
669 logger.warn("InReference type (catFk = " + inRefCategoryFk + ") of part-of-reference not recognized for refId " + refId + "." +
670 " Create 'Generic' reference instead");
671 result = ReferenceFactory.newGeneric();
672 }
673 makeStandardMapper(valueMap, result);
674 return result;
675 }
676
677
678
679
680
681
682
683
684
685
686 private boolean existsInMapOrToSave(Integer inRefFkInt, Map<Integer, ReferenceBase> biblioRefToSave, Map<Integer, ReferenceBase> nomRefToSave, Map<String, ReferenceBase> relatedBiblioReferences, Map<String, ReferenceBase> relatedNomReferences) {
687 boolean result = false;
688 if (inRefFkInt == null){
689 return false;
690 }
691 result |= nomRefToSave.containsKey(inRefFkInt);
692 result |= biblioRefToSave.containsKey(inRefFkInt);
693 result |= relatedBiblioReferences.containsKey(String.valueOf(inRefFkInt));
694 result |= relatedNomReferences.containsKey(String.valueOf(inRefFkInt));
695 return result;
696 }
697
698 private ReferenceBase<?> makeWebSite(Map<String, Object> valueMap){
699 if (logger.isDebugEnabled()){logger.debug("RefType 'Website'");}
700 ReferenceBase webPage = ReferenceFactory.newWebPage();
701 makeStandardMapper(valueMap, webPage);
702 return webPage;
703 }
704
705 private ReferenceBase<?> makeUnknown(Map<String, Object> valueMap){
706 if (logger.isDebugEnabled()){logger.debug("RefType 'Unknown'");}
707 ReferenceBase generic = ReferenceFactory.newGeneric();
708
709 makeStandardMapper(valueMap, generic);
710 return generic;
711 }
712
713 private ReferenceBase<?> makeInformal(Map<String, Object> valueMap){
714 if (logger.isDebugEnabled()){logger.debug("RefType 'Informal'");}
715 ReferenceBase generic = ReferenceFactory.newGeneric();
716
717 makeStandardMapper(valueMap, generic);
718 String informal = (String)valueMap.get("InformalRefCategory".toLowerCase());
719 if (CdmUtils.isNotEmpty(informal) ){
720 generic.addExtension(informal, ExtensionType.INFORMAL_CATEGORY());
721 }
722 return generic;
723 }
724
725 private ReferenceBase<?> makeDatabase(Map<String, Object> valueMap){
726 if (logger.isDebugEnabled()){logger.debug("RefType 'Database'");}
727 ReferenceBase database = ReferenceFactory.newDatabase();
728 makeStandardMapper(valueMap, database);
729 return database;
730 }
731
732 private ReferenceBase<?> makeJournal(Map<String, Object> valueMap){
733 if (logger.isDebugEnabled()){logger.debug("RefType 'Journal'");}
734 ReferenceBase journal = ReferenceFactory.newJournal();
735
736 Set<String> omitAttributes = new HashSet<String>();
737 String series = "series";
738
739
740 makeStandardMapper(valueMap, journal, omitAttributes);
741
742
743
744 return journal;
745 }
746
747 private ReferenceBase<?> makeBook(
748 Map<String, Object> valueMap,
749 Map<Integer, ReferenceBase> biblioRefToSave,
750 Map<Integer, ReferenceBase> nomRefToSave,
751 Map<String, ReferenceBase> relatedBiblioReferences,
752 Map<String, ReferenceBase> relatedNomReferences){
753 if (logger.isDebugEnabled()){logger.debug("RefType 'Book'");}
754 ReferenceBase book = ReferenceFactory.newBook();
755 Integer refId = (Integer)valueMap.get("refId".toLowerCase());
756
757
758
759 Set<String> omitAttributes = new HashSet<String>();
760 String attrSeries = "series";
761
762
763 makeStandardMapper(valueMap, book, omitAttributes);
764
765
766 IPrintSeries printSeries = null;
767 if (valueMap.get(attrSeries) != null){
768 String series = (String)valueMap.get("title".toLowerCase());
769 if (series == null){
770 String nomTitle = (String)valueMap.get("nomTitleAbbrev".toLowerCase());
771 series = nomTitle;
772 }
773 printSeries = ReferenceFactory.newPrintSeries(series);
774 logger.info("Implementation of printSeries is preliminary");
775 }
776 Object inRefFk = valueMap.get("inRefFk".toLowerCase());
777
778 if (inRefFk != null){
779 int inRefFkInt = (Integer)inRefFk;
780 if (existsInMapOrToSave(inRefFkInt, biblioRefToSave, nomRefToSave, relatedBiblioReferences, relatedNomReferences)){
781 ReferenceBase<?> inSeries = getReferenceFromMaps(inRefFkInt, nomRefToSave, relatedNomReferences);
782 if (inSeries == null){
783 inSeries = getReferenceFromMaps(inRefFkInt, biblioRefToSave, relatedBiblioReferences);
784 logger.info("inSeries (" + inRefFkInt + ") found in referenceStore instead of nomRefStore.");
785 nomRefToSave.put(inRefFkInt, inSeries);
786 }
787 if (inSeries == null){
788 logger.warn("inSeries for " + inRefFkInt + " is null. "+
789 " InReference relation could not be set");;
790
791 }else if (inSeries.getType().equals(ReferenceType.PrintSeries)){
792 book.setInSeries((IPrintSeries)inSeries);
793
794 }else{
795 logger.warn("inSeries is not of type PrintSeries but of type " + inSeries.getType().getMessage() +
796 ". In-reference relation could not be set for refId " + refId + " and inRefFk " + inRefFk);
797 }
798 }else{
799 logger.error("PrintSeries (refId = " + inRefFkInt + ") for book (refID = " + refId +") could not be found in nomRefStore. Inconsistency error. ");
800
801 }
802 }
803 if (book.getInSeries() != null && printSeries != null){
804 logger.warn("Book has series string and inSeries reference. Can not take both. Series string neglected");
805 }else{
806 book.setInSeries(printSeries);
807 }
808 book.setEditor(null);
809 return book;
810
811 }
812
813
814
815
816
817
818
819
820 private ReferenceBase<?> getReferenceFromMaps(
821 int inRefFkInt,
822 Map<Integer, ReferenceBase> refToSaveMap,
823 Map<String, ReferenceBase> relatedRefMap) {
824 ReferenceBase result = null;
825 result = refToSaveMap.get(inRefFkInt);
826 if (result == null){
827 result = relatedRefMap.get(String.valueOf(inRefFkInt));
828 }
829 return result;
830 }
831
832 private ReferenceBase<?> makePrintSeries(Map<String, Object> valueMap){
833 if (logger.isDebugEnabled()){logger.debug("RefType 'PrintSeries'");}
834 ReferenceBase printSeries = ReferenceFactory.newPrintSeries();
835 makeStandardMapper(valueMap, printSeries, null);
836 return printSeries;
837 }
838
839 private ReferenceBase<?> makeProceedings(Map<String, Object> valueMap){
840 if (logger.isDebugEnabled()){logger.debug("RefType 'Proceedings'");}
841 ReferenceBase proceedings = ReferenceFactory.newProceedings();
842 makeStandardMapper(valueMap, proceedings, null);
843 return proceedings;
844 }
845
846 private ReferenceBase<?> makeThesis(Map<String, Object> valueMap){
847 if (logger.isDebugEnabled()){logger.debug("RefType 'Thesis'");}
848 ReferenceBase thesis = ReferenceFactory.newThesis();
849 makeStandardMapper(valueMap, thesis, null);
850 return thesis;
851 }
852
853
854 private ReferenceBase<?> makeJournalVolume(Map<String, Object> valueMap){
855 if (logger.isDebugEnabled()){logger.debug("RefType 'JournalVolume'");}
856
857 ReferenceBase journalVolume = ReferenceFactory.newGeneric();
858 makeStandardMapper(valueMap, journalVolume, null);
859 logger.warn("Journal volumes not yet implemented. Generic created instead but with errors");
860 return journalVolume;
861 }
862
863 private boolean makeStandardMapper(Map<String, Object> valueMap, ReferenceBase<?> ref){
864 return makeStandardMapper(valueMap, ref, null);
865 }
866
867
868 private boolean makeStandardMapper(Map<String, Object> valueMap, CdmBase cdmBase, Set<String> omitAttributes){
869 boolean result = true;
870 for (CdmAttributeMapperBase mapper : classMappers){
871 if (mapper instanceof CdmSingleAttributeMapperBase){
872 result &= makeStandardSingleMapper(valueMap, cdmBase, (CdmSingleAttributeMapperBase)mapper, omitAttributes);
873 }else if (mapper instanceof CdmOneToManyMapper){
874 result &= makeMultipleValueAddMapper(valueMap, cdmBase, (CdmOneToManyMapper)mapper, omitAttributes);
875 }else{
876 logger.error("Unknown mapper type");
877 result = false;
878 }
879 }
880 return result;
881 }
882
883 private boolean makeStandardSingleMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmSingleAttributeMapperBase mapper, Set<String> omitAttributes){
884 boolean result = true;
885 if (omitAttributes == null){
886 omitAttributes = new HashSet<String>();
887 }
888 if (mapper instanceof DbImportExtensionMapper){
889 result &= ((DbImportExtensionMapper)mapper).invoke(valueMap, cdmBase);
890 }else{
891 String sourceAttribute = mapper.getSourceAttributeList().get(0).toLowerCase();
892 Object value = valueMap.get(sourceAttribute);
893 if (value != null){
894 String destinationAttribute = mapper.getDestinationAttribute();
895 if (! omitAttributes.contains(destinationAttribute)){
896 result &= ImportHelper.addValue(value, cdmBase, destinationAttribute, mapper.getTypeClass(), OVERWRITE, OBLIGATORY);
897 }
898 }
899 }
900 return result;
901 }
902
903
904 private boolean makeMultipleValueAddMapper(Map<String, Object> valueMap, CdmBase cdmBase, CdmOneToManyMapper<CdmBase, CdmBase, CdmSingleAttributeMapperBase> mapper, Set<String> omitAttributes){
905 if (omitAttributes == null){
906 omitAttributes = new HashSet<String>();
907 }
908 boolean result = true;
909 String destinationAttribute = mapper.getSingleAttributeName();
910 List<Object> sourceValues = new ArrayList<Object>();
911 List<Class> classes = new ArrayList<Class>();
912 for (CdmSingleAttributeMapperBase singleMapper : mapper.getSingleMappers()){
913 String sourceAttribute = singleMapper.getSourceAttribute();
914 Object value = valueMap.get(sourceAttribute);
915 sourceValues.add(value);
916 Class<?> clazz = singleMapper.getTypeClass();
917 classes.add(clazz);
918 }
919
920 result &= ImportHelper.addMultipleValues(sourceValues, cdmBase, destinationAttribute, classes, NO_OVERWRITE, OBLIGATORY);
921
922
923
924
925
926 return result;
927 }
928
929
930 private static TeamOrPersonBase<?> getAuthorTeam(String authorString, TeamOrPersonBase<?> nomAuthor, boolean preferNomeclaturalAuthor){
931 TeamOrPersonBase<?> result;
932 if (preferNomeclaturalAuthor){
933 if (nomAuthor != null){
934 result = nomAuthor;
935 }else{
936 if (CdmUtils.isEmpty(authorString)){
937 result = null;
938 }else{
939 TeamOrPersonBase<?> team = Team.NewInstance();
940
941 team.setNomenclaturalTitle(authorString);
942 team.setTitleCache(authorString, true);
943 result = team;
944 }
945 }
946 }else{
947 if (CdmUtils.isNotEmpty(authorString)){
948 TeamOrPersonBase<?> team = Team.NewInstance();
949
950 team.setNomenclaturalTitle(authorString);
951 team.setTitleCache(authorString, true);
952 result = team;
953 }else{
954 result = nomAuthor;
955 }
956 }
957 return result;
958 }
959
960
961
962
963
964
965
966 public Set<String> getObligatoryAttributes(boolean lowerCase, BerlinModelImportConfigurator config){
967 Set<String> result = new HashSet<String>();
968 Class<ICdmIO>[] ioClassList = config.getIoClassList();
969 logger.warn("getObligatoryAttributes has been commented because it still needs to be adapted to the new package structure");
970 result.addAll(Arrays.asList(unclearMappers));
971 result.addAll(Arrays.asList(createdAndNotesAttributes));
972 result.addAll(Arrays.asList(operationalAttributes));
973 CdmIoMapping mapping = new CdmIoMapping();
974 for (CdmAttributeMapperBase mapper : classMappers){
975 mapping.addMapper(mapper);
976 }
977 result.addAll(mapping.getSourceAttributes());
978 if (lowerCase){
979 Set<String> lowerCaseResult = new HashSet<String>();
980 for (String str : result){
981 if (str != null){lowerCaseResult.add(str.toLowerCase());}
982 }
983 result = lowerCaseResult;
984 }
985 return result;
986 }
987
988
989
990
991 @Override
992 protected boolean doCheck(BerlinModelImportState state){
993 BerlinModelReferenceImportValidator validator = new BerlinModelReferenceImportValidator();
994 return validator.validate(state, this);
995 }
996
997
998
999
1000
1001 @Override
1002 protected String getTableName() {
1003 return dbTableName;
1004 }
1005
1006
1007
1008
1009 @Override
1010 public String getPluralString() {
1011 return pluralString;
1012 }
1013
1014
1015
1016
1017 protected boolean isIgnore(BerlinModelImportState state){
1018 return (state.getConfig().getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
1019 }
1020
1021
1022
1023
1024 }