2 * Copyright (C) 2019 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.app
.euromed
;
11 import java
.util
.HashSet
;
13 import java
.util
.UUID
;
14 import java
.util
.function
.Function
;
15 import java
.util
.stream
.Collectors
;
17 import org
.apache
.logging
.log4j
.LogManager
;
18 import org
.apache
.logging
.log4j
.Logger
;
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
;
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}.
46 public class CaucasusAreaVocabularyMigrationActivator
{
48 @SuppressWarnings("unused")
49 private static final Logger logger
= LogManager
.getLogger();
51 // static final ICdmDataSource source = CdmDestinations.cdm_local_azerbaijan_old();
52 static final ICdmDataSource source
= CdmDestinations
.cdm_production_azerbaijan_old();
54 static boolean isProduction
= true;
55 static final DB db
= DB
.AZERBAIJAN
;
57 static final UUID areaVocabulary
= UUID
.fromString("c839f88f-c04b-481e-badc-384773b649d0");
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());
68 static final CHECK check
= CHECK
.IMPORT_WITHOUT_CHECK
;
70 private enum DB
{GEORGIA
, ARMENIA
,AZERBAIJAN
}
72 static final int partitionSize
= 5000;
74 static final boolean includeAbsentDistributions
= true;
76 static final DbSchemaValidation schemaValidation
= DbSchemaValidation
.VALIDATE
;
78 static final boolean removeImportSources
= true;
79 static final boolean addSource
= false;
81 static final String sourceRefTitle
= "Azerbaijan area trees";
82 static final UUID sourceRefUuid
= UUID
.fromString("30583931-5f5d-40cb-8198-10dc9e7fb9ef");
85 static final boolean registerAuditing
= true;
87 // ***************** ALL ************************************************//
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
);
94 Cdm2CdmImportConfigurator config
= Cdm2CdmImportConfigurator
.NewInstace(source
, destination
);
95 config
.setDoTaxa(false);
96 config
.setDoDescriptions(false);
97 config
.setDoVocabularies(true);
98 config
.setSourceReference(getSourceRef());
100 config
.setRemoveImportSources(removeImportSources
);
101 config
.setAddSources(addSource
);
103 VocabularyFilter vocFilter
= VocabularyFilter
.NewInstance();
104 vocFilter
.orVocabulary(areaVocabulary
);
105 config
.setVocabularyFilter(vocFilter
);
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);
116 CdmDefaultImport
<Cdm2CdmImportConfigurator
> myImport
= new CdmDefaultImport
<>();
117 myImport
.invoke(config
);
120 private void doImport(ICdmDataSource source
, ICdmDataSource destination
, DbSchemaValidation hbm2dll
) throws NoSuchMethodException
, SecurityException
{
122 String importFrom
= " import from "+ source
.getDatabase() + " to "+ destination
.getDatabase() + " ...";
123 System
.out
.println("Start" + importFrom
);
125 Cdm2CdmImportConfigurator config
= Cdm2CdmImportConfigurator
.NewInstace(source
, destination
);
126 config
.setDoTaxa(false);
127 config
.setDoDescriptions(false);
128 config
.setDoVocabularies(false);
129 config
.setSourceReference(getSourceRef());
131 config
.setRemoveImportSources(removeImportSources
);
132 config
.setAddSources(addSource
);
134 config
.setDbSchemaValidation(hbm2dll
);
136 config
.setCheck(check
);
137 config
.setRegisterAuditing(registerAuditing
);
140 CdmDefaultImport
<Cdm2CdmImportConfigurator
> myImport
= new CdmDefaultImport
<>();
141 myImport
.invoke(config
);
143 System
.out
.println("End" + importFrom
);
146 // private Reference getEndemismReference() {
147 // Reference ref = ReferenceFactory.newWebPage();
148 // ref.setTitle("Euro+Med PlantBase");
149 // ref.setAccessed(DateTime.now());
150 // ref.setUuid(endemismReferenceUuid);
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
163 Set
<UUID
> relevantAreas
= taxonNodeFilter
.getAreaFilter().stream().map(f
->f
.getUuid()).collect(Collectors
.toSet());
165 Function
<DoubleResult
<Taxon
,DefinedTermBase
<?
>[]>,Distribution
> function
= input
->{
166 Taxon t
= input
.getFirstResult();
167 DefinedTermBase
<?
>[] params
= input
.getSecondResult();
168 NamedArea relevantArea
= (NamedArea
)params
[0];
170 PresenceAbsenceTerm endemic
= (PresenceAbsenceTerm
)params
[1];
171 PresenceAbsenceTerm notEndemic
= (PresenceAbsenceTerm
)params
[2];
172 PresenceAbsenceTerm unknownEndemic
= (PresenceAbsenceTerm
)params
[3];
173 Feature distributionFeature
= (Feature
)params
[4];
175 boolean isNativeInRelevantArea
= false;
176 boolean isEndemicInEuroMed
= false;
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()) {
185 for (Distribution distribution
: distributions
) {
186 NamedArea area
= distribution
.getArea();
187 PresenceAbsenceTerm status
= distribution
.getStatus();
188 if (area
== null || status
== null) {
190 } else if (emAreas
.contains(area
.getUuid())) {
191 if (status
.equals(notEndemic
)) {
192 result
.setStatus(notEndemic
);
194 }else if (status
.equals(endemic
)) {
195 isEndemicInEuroMed
= true;
197 } else if (relevantAreas
.contains(area
.getUuid())) {
198 if (isNative(status
)) {
199 isNativeInRelevantArea
= true;
201 } else if (largerCaucasusAreas
.contains(area
.getUuid())) {
202 System
.out
.println("Larger Cc area for " + t
.getName().getTitleCache() + " with status " + distribution
.getStatus().getTitleCache());
205 if (isNative(status
)) {
206 result
.setStatus(notEndemic
);
211 if (isNativeInRelevantArea
&& isEndemicInEuroMed
) {
212 result
.setStatus(endemic
);
220 private boolean isNative(PresenceAbsenceTerm status
) {
221 return status
.equals(PresenceAbsenceTerm
.NATIVE())
222 || status
.equals(PresenceAbsenceTerm
.ENDEMIC_FOR_THE_RELEVANT_AREA()) ;
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
);
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
);