ref #10324 Adapt CaucasusExportActivator to latest changes
[cdmlib-apps.git] / app-import / src / main / java / eu / etaxonomy / cdm / app / euromed / CaucasusAreaVocabularyMigrationActivator.java
1 /**
2 * Copyright (C) 2019 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 package eu.etaxonomy.cdm.app.euromed;
10
11 import java.util.HashSet;
12 import java.util.Set;
13 import java.util.UUID;
14 import java.util.function.Function;
15 import java.util.stream.Collectors;
16
17 import org.apache.logging.log4j.LogManager;
18 import org.apache.logging.log4j.Logger;
19
20 import eu.etaxonomy.cdm.app.common.CdmDestinations;
21 import eu.etaxonomy.cdm.common.DoubleResult;
22 import eu.etaxonomy.cdm.database.DbSchemaValidation;
23 import eu.etaxonomy.cdm.database.ICdmDataSource;
24 import eu.etaxonomy.cdm.filter.TaxonNodeFilter;
25 import eu.etaxonomy.cdm.filter.VocabularyFilter;
26 import eu.etaxonomy.cdm.io.cdm2cdm.Cdm2CdmImportConfigurator;
27 import eu.etaxonomy.cdm.io.common.CdmDefaultImport;
28 import eu.etaxonomy.cdm.io.common.IImportConfigurator.CHECK;
29 import eu.etaxonomy.cdm.model.description.Distribution;
30 import eu.etaxonomy.cdm.model.description.Feature;
31 import eu.etaxonomy.cdm.model.description.PresenceAbsenceTerm;
32 import eu.etaxonomy.cdm.model.location.NamedArea;
33 import eu.etaxonomy.cdm.model.reference.Reference;
34 import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
35 import eu.etaxonomy.cdm.model.taxon.Taxon;
36 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
37
38 /**
39 * Import for area vocabularies in the caucasus context.
40 * For imports from a preliminary to a final (or more recent preliminary) version.
41 * Usually running after {@link EuroMedCaucasusChecklistExportActivator}.
42 *
43 * @author a.mueller
44 * @since 2023-12-13
45 */
46 public class CaucasusAreaVocabularyMigrationActivator {
47
48 @SuppressWarnings("unused")
49 private static final Logger logger = LogManager.getLogger();
50
51 // static final ICdmDataSource source = CdmDestinations.cdm_local_azerbaijan_old();
52 static final ICdmDataSource source = CdmDestinations.cdm_production_azerbaijan_old();
53
54 static boolean isProduction = true;
55 static final DB db = DB.AZERBAIJAN;
56
57 static final UUID areaVocabulary = UUID.fromString("c839f88f-c04b-481e-badc-384773b649d0");
58
59 static ICdmDataSource cdmDestination = !isProduction ?
60 (db == DB.GEORGIA ? CdmDestinations.cdm_local_georgia() :
61 db == DB.ARMENIA ? CdmDestinations.cdm_local_armenia() :
62 CdmDestinations.cdm_local_azerbaijan()
63 ):(db == DB.GEORGIA ? CdmDestinations.cdm_production_georgia() :
64 db == DB.ARMENIA ? CdmDestinations.cdm_production_armenia() :
65 CdmDestinations.cdm_production_azerbaijan());
66
67 //check - import
68 static final CHECK check = CHECK.IMPORT_WITHOUT_CHECK;
69
70 private enum DB{GEORGIA, ARMENIA,AZERBAIJAN}
71
72 static final int partitionSize = 5000;
73
74 static final boolean includeAbsentDistributions = true;
75
76 static final DbSchemaValidation schemaValidation = DbSchemaValidation.VALIDATE;
77
78 static final boolean removeImportSources = true;
79 static final boolean addSource = false;
80 //TODO needed?
81 static final String sourceRefTitle = "Azerbaijan area trees";
82 static final UUID sourceRefUuid = UUID.fromString("30583931-5f5d-40cb-8198-10dc9e7fb9ef");
83
84 //auditing
85 static final boolean registerAuditing = true;
86
87 // ***************** ALL ************************************************//
88
89
90 private void doImportVocs(ICdmDataSource source, ICdmDataSource destination, DbSchemaValidation hbm2dll){
91 String importFrom = " import from "+ source.getDatabase() + " to "+ destination.getDatabase() + " ...";
92 System.out.println("Start" + importFrom);
93
94 Cdm2CdmImportConfigurator config = Cdm2CdmImportConfigurator.NewInstace(source, destination);
95 config.setDoTaxa(false);
96 config.setDoDescriptions(false);
97 config.setDoVocabularies(true);
98 config.setSourceReference(getSourceRef());
99
100 config.setRemoveImportSources(removeImportSources);
101 config.setAddSources(addSource);
102
103 VocabularyFilter vocFilter = VocabularyFilter.NewInstance();
104 vocFilter.orVocabulary(areaVocabulary);
105 config.setVocabularyFilter(vocFilter);
106
107 // }else {
108 // //vocFilter.orVocabulary(UUID.fromString("625a4962-c211-4597-816e-5804083efe26")); //E+M areas
109 // List<UUID> trees = Arrays.asList(new UUID[] {
110 // UUID.fromString("23970e4d-9da3-4416-86f7-5ae4f4307065"), //Caucasus area tree
111 // UUID.fromString("6a5e1c2b-ec0d-46c8-9c7d-a2059267ffb7")}); //feature tree
112 // config.setGraphFilter(trees);
113 // }
114
115 // invoke import
116 CdmDefaultImport<Cdm2CdmImportConfigurator> myImport = new CdmDefaultImport<>();
117 myImport.invoke(config);
118 }
119
120 private void doImport(ICdmDataSource source, ICdmDataSource destination, DbSchemaValidation hbm2dll) throws NoSuchMethodException, SecurityException{
121
122 String importFrom = " import from "+ source.getDatabase() + " to "+ destination.getDatabase() + " ...";
123 System.out.println("Start" + importFrom);
124
125 Cdm2CdmImportConfigurator config = Cdm2CdmImportConfigurator.NewInstace(source, destination);
126 config.setDoTaxa(false);
127 config.setDoDescriptions(false);
128 config.setDoVocabularies(false);
129 config.setSourceReference(getSourceRef());
130
131 config.setRemoveImportSources(removeImportSources);
132 config.setAddSources(addSource);
133
134 config.setDbSchemaValidation(hbm2dll);
135
136 config.setCheck(check);
137 config.setRegisterAuditing(registerAuditing);
138
139 // invoke import
140 CdmDefaultImport<Cdm2CdmImportConfigurator> myImport = new CdmDefaultImport<>();
141 myImport.invoke(config);
142
143 System.out.println("End" + importFrom);
144 }
145
146 // private Reference getEndemismReference() {
147 // Reference ref = ReferenceFactory.newWebPage();
148 // ref.setTitle("Euro+Med PlantBase");
149 // ref.setAccessed(DateTime.now());
150 // ref.setUuid(endemismReferenceUuid);
151 // return ref;
152 // }
153
154 private Function<DoubleResult<Taxon,DefinedTermBase<?>[]>,Distribution> getEndemismHandler(TaxonNodeFilter taxonNodeFilter) {
155 Set<UUID> emAreas = new HashSet<>();
156 emAreas.add(UUID.fromString("111bdf38-7a32-440a-9808-8af1c9e54b51")); //EM
157 emAreas.add(UUID.fromString("865e0fcc-bfb5-4af2-8822-08c90c7ba61e")); //Europe
158 Set<UUID> largerCaucasusAreas = new HashSet<>();
159 emAreas.add(UUID.fromString("904c3980-b98d-422e-a195-95f4f41fc734")); //Tcs
160 emAreas.add(UUID.fromString("05b0dd06-30f8-477d-bf4c-30d9def56320")); //Cc
161
162
163 Set<UUID> relevantAreas = taxonNodeFilter.getAreaFilter().stream().map(f->f.getUuid()).collect(Collectors.toSet());
164
165 Function<DoubleResult<Taxon,DefinedTermBase<?>[]>,Distribution> function = input->{
166 Taxon t = input.getFirstResult();
167 DefinedTermBase<?>[] params = input.getSecondResult();
168 NamedArea relevantArea = (NamedArea)params[0];
169
170 PresenceAbsenceTerm endemic = (PresenceAbsenceTerm)params[1];
171 PresenceAbsenceTerm notEndemic = (PresenceAbsenceTerm)params[2];
172 PresenceAbsenceTerm unknownEndemic = (PresenceAbsenceTerm)params[3];
173 Feature distributionFeature = (Feature)params[4];
174
175 boolean isNativeInRelevantArea = false;
176 boolean isEndemicInEuroMed = false;
177
178 Distribution result = Distribution.NewInstance(relevantArea, unknownEndemic);
179 result.setFeature(distributionFeature);
180 Set<Distribution> distributions = t.getDescriptionItems(Feature.DISTRIBUTION(), Distribution.class);
181 if (distributions.isEmpty()) {
182 return null;
183 }
184
185 for (Distribution distribution : distributions) {
186 NamedArea area = distribution.getArea();
187 PresenceAbsenceTerm status = distribution.getStatus();
188 if (area == null || status == null) {
189 continue;
190 } else if (emAreas.contains(area.getUuid())) {
191 if (status.equals(notEndemic)) {
192 result.setStatus(notEndemic);
193 return result;
194 }else if (status.equals(endemic)) {
195 isEndemicInEuroMed = true;
196 }
197 } else if (relevantAreas.contains(area.getUuid())) {
198 if (isNative(status)) {
199 isNativeInRelevantArea = true;
200 }
201 } else if (largerCaucasusAreas.contains(area.getUuid())) {
202 System.out.println("Larger Cc area for " + t.getName().getTitleCache() + " with status " + distribution.getStatus().getTitleCache());
203 } else {
204 //other areas
205 if (isNative(status)) {
206 result.setStatus(notEndemic);
207 return result;
208 }
209 }
210 }
211 if (isNativeInRelevantArea && isEndemicInEuroMed) {
212 result.setStatus(endemic);
213 }
214
215 return result;
216 };
217 return function;
218 }
219
220 private boolean isNative(PresenceAbsenceTerm status) {
221 return status.equals(PresenceAbsenceTerm.NATIVE())
222 || status.equals(PresenceAbsenceTerm.ENDEMIC_FOR_THE_RELEVANT_AREA()) ;
223 }
224
225 private Reference getSourceRef() {
226 Reference ref = ReferenceFactory.newDatabase();
227 ref.setTitle(sourceRefTitle);
228 // ref.setDatePublished(VerbatimTimePeriod.NewVerbatimInstance(Calendar.getInstance()));
229 // ref.setAccessed(DateTime.now());
230 ref.setUuid(sourceRefUuid);
231 return ref;
232 }
233
234 public static void main(String[] args) {
235 ICdmDataSource cdmDB = CdmDestinations.chooseDestination(args) != null ? CdmDestinations.chooseDestination(args) : cdmDestination;
236 CaucasusAreaVocabularyMigrationActivator myImport = new CaucasusAreaVocabularyMigrationActivator();
237 myImport.doImportVocs(source, cdmDB, schemaValidation);
238 System.exit(0);
239 }
240 }