diff --git a/api/pom.xml b/api/pom.xml
index 256505eac3..4c2b8ddf25 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -13,7 +13,7 @@
api
jar
- COL API
+ CLB API
4.10.0
diff --git a/coldp/pom.xml b/coldp/pom.xml
index 11b9301ed8..4fdf70b3e3 100644
--- a/coldp/pom.xml
+++ b/coldp/pom.xml
@@ -10,7 +10,7 @@
coldp
- COL Data Packages
+ CLB Data Packages
This module provides terms for the ColDP format with minimal dependencies
diff --git a/core/dataset/003/3/4-names.txt.gz b/core/dataset/003/3/4-names.txt.gz
new file mode 100644
index 0000000000..e1d083d8e4
Binary files /dev/null and b/core/dataset/003/3/4-names.txt.gz differ
diff --git a/core/dataset/003/3/4-tree.txt.gz b/core/dataset/003/3/4-tree.txt.gz
new file mode 100644
index 0000000000..82265307f1
Binary files /dev/null and b/core/dataset/003/3/4-tree.txt.gz differ
diff --git a/core/dataset/003/3/sector/2/1-names.txt.gz b/core/dataset/003/3/sector/2/1-names.txt.gz
new file mode 100644
index 0000000000..001322f84b
Binary files /dev/null and b/core/dataset/003/3/sector/2/1-names.txt.gz differ
diff --git a/core/dataset/003/3/sector/3/1-names.txt.gz b/core/dataset/003/3/sector/3/1-names.txt.gz
new file mode 100644
index 0000000000..01d740cbdd
Binary files /dev/null and b/core/dataset/003/3/sector/3/1-names.txt.gz differ
diff --git a/core/dataset/003/3/sector/4/1-names.txt.gz b/core/dataset/003/3/sector/4/1-names.txt.gz
new file mode 100644
index 0000000000..28e53f331c
Binary files /dev/null and b/core/dataset/003/3/sector/4/1-names.txt.gz differ
diff --git a/core/pom.xml b/core/pom.xml
new file mode 100644
index 0000000000..74b749820c
--- /dev/null
+++ b/core/pom.xml
@@ -0,0 +1,330 @@
+
+
+ 4.0.0
+
+ org.catalogueoflife
+ motherpom
+ 1.0-SNAPSHOT
+
+
+ core
+ CLB core
+ Core components of ChecklistBank not yet tight to any webservice framework
+
+
+
+
+ org.catalogueoflife
+ coldp
+
+
+ org.catalogueoflife
+ metadata
+
+
+ org.catalogueoflife
+ api
+
+
+ org.gbif
+ name-parser-api
+
+
+ org.catalogueoflife
+ parser
+
+
+ org.catalogueoflife
+ reader
+
+
+ org.catalogueoflife
+ reader-xls
+
+
+ org.catalogueoflife
+ dao
+
+
+ org.catalogueoflife
+ doi
+
+
+ org.gbif
+ dwc-api
+
+
+ org.gbif
+ dwca-io
+
+
+ org.gbif
+ text-tree
+
+
+
+ org.mybatis
+ mybatis
+
+
+ org.postgresql
+ postgresql
+
+
+ com.zaxxer
+ HikariCP
+
+
+
+
+
+ org.mapdb
+ mapdb
+
+
+ com.esotericsoftware
+ kryo
+
+
+ org.apache.fury
+ fury-core
+
+
+
+
+ org.elasticsearch.client
+ elasticsearch-rest-client
+ ${elasticsearch.version}
+
+
+
+ com.github.docker-java
+ docker-java
+
+
+ com.github.docker-java
+ docker-java-transport-httpclient5
+
+
+
+
+ it.unimi.dsi
+ fastutil
+
+
+ com.univocity
+ univocity-parsers
+
+
+
+
+ com.ibm.icu
+ icu4j
+
+
+
+
+ jakarta.xml.bind
+ jakarta.xml.bind-api
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ com.fasterxml.jackson.dataformat
+ jackson-dataformat-xml
+
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ org.apache.commons
+ commons-text
+
+
+
+
+ org.simplejavamail
+ simple-java-mail
+
+
+ com.github.ben-manes.caffeine
+ caffeine
+
+
+ io.jsonwebtoken
+ jjwt-api
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ runtime
+
+
+ org.apache.tika
+ tika-core
+
+
+ org.apache.poi
+ poi-ooxml
+
+
+ org.eclipse.jetty
+ jetty-util
+
+
+ jakarta.ws.rs
+ jakarta.ws.rs-api
+
+
+
+
+ org.slf4j
+ slf4j-api
+
+
+ org.slf4j
+ jul-to-slf4j
+
+
+ ch.qos.logback
+ logback-classic
+
+
+ jakarta.validation
+ jakarta.validation-api
+
+
+ co.elastic.logging
+ logback-ecs-encoder
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+ org.assertj
+ assertj-core
+ test
+
+
+ org.catalogueoflife
+ api
+ tests
+ test
+
+
+ org.catalogueoflife
+ dao
+ tests
+ test
+
+
+ org.javers
+ javers-core
+ test
+
+
+ org.testcontainers
+ junit-jupiter
+ test
+
+
+ org.testcontainers
+ postgresql
+ test
+
+
+ org.testcontainers
+ elasticsearch
+ test
+
+
+
+ com.fasterxml.jackson.jakarta.rs
+ jackson-jakarta-rs-json-provider
+ test
+
+
+ org.hibernate.validator
+ hibernate-validator
+ test
+
+
+ org.glassfish
+ jakarta.el
+ test
+
+
+
+
+
+
+ src/main/resources
+ false
+
+ **/*.yaml
+
+
+
+ src/main/resources
+ true
+
+ **/*.yaml
+
+
+
+
+
+
+ src/test/resources
+ false
+
+ gbifAuth.yaml
+ datacite.yaml
+
+
+
+ src/test/resources
+ true
+
+ gbifAuth.yaml
+ datacite.yaml
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webservice/src/main/java/life/catalogue/assembly/SectorDelete.java b/core/src/main/java/life/catalogue/assembly/SectorDelete.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/SectorDelete.java
rename to core/src/main/java/life/catalogue/assembly/SectorDelete.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/SectorDeleteFull.java b/core/src/main/java/life/catalogue/assembly/SectorDeleteFull.java
similarity index 99%
rename from webservice/src/main/java/life/catalogue/assembly/SectorDeleteFull.java
rename to core/src/main/java/life/catalogue/assembly/SectorDeleteFull.java
index 962ace5fe0..09313b5526 100644
--- a/webservice/src/main/java/life/catalogue/assembly/SectorDeleteFull.java
+++ b/core/src/main/java/life/catalogue/assembly/SectorDeleteFull.java
@@ -3,7 +3,6 @@
import life.catalogue.api.model.DSID;
import life.catalogue.api.model.DSIDValue;
import life.catalogue.api.model.Sector;
-import life.catalogue.api.model.User;
import life.catalogue.api.vocab.ImportState;
import life.catalogue.dao.SectorDao;
import life.catalogue.dao.SectorImportDao;
diff --git a/webservice/src/main/java/life/catalogue/assembly/SectorRunnable.java b/core/src/main/java/life/catalogue/assembly/SectorRunnable.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/assembly/SectorRunnable.java
rename to core/src/main/java/life/catalogue/assembly/SectorRunnable.java
index 32bd5245e5..5a8a282038 100644
--- a/webservice/src/main/java/life/catalogue/assembly/SectorRunnable.java
+++ b/core/src/main/java/life/catalogue/assembly/SectorRunnable.java
@@ -7,6 +7,8 @@
import life.catalogue.api.util.ObjectUtils;
import life.catalogue.api.vocab.*;
import life.catalogue.common.util.LoggingUtils;
+import life.catalogue.concurrent.DatasetBlockedException;
+import life.catalogue.concurrent.DatasetLock;
import life.catalogue.dao.DatasetInfoCache;
import life.catalogue.dao.SectorDao;
import life.catalogue.dao.SectorImportDao;
@@ -39,6 +41,7 @@ abstract class SectorRunnable implements Runnable {
Rank.SUBSPECIES, Rank.VARIETY, Rank.FORM
);
+ protected final UUID key = UUID.randomUUID();
protected final DSID sectorKey;
protected final int subjectDatasetKey;
protected Sector sector;
@@ -126,9 +129,6 @@ public Map getDecisions() {
@Override
public void run() {
- LoggingUtils.setSectorMDC(sectorKey, state.getAttempt());
- LoggingUtils.setSourceMDC(sector.getSubjectDatasetKey());
-
try {
state.setStarted(LocalDateTime.now());
state.setState( ImportState.PREPARING);
diff --git a/webservice/src/main/java/life/catalogue/assembly/SectorSync.java b/core/src/main/java/life/catalogue/assembly/SectorSync.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/SectorSync.java
rename to core/src/main/java/life/catalogue/assembly/SectorSync.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/SycnException.java b/core/src/main/java/life/catalogue/assembly/SycnException.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/SycnException.java
rename to core/src/main/java/life/catalogue/assembly/SycnException.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/SyncFactory.java b/core/src/main/java/life/catalogue/assembly/SyncFactory.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/assembly/SyncFactory.java
rename to core/src/main/java/life/catalogue/assembly/SyncFactory.java
index ed1066c2df..1992a38a33 100644
--- a/webservice/src/main/java/life/catalogue/assembly/SyncFactory.java
+++ b/core/src/main/java/life/catalogue/assembly/SyncFactory.java
@@ -2,7 +2,6 @@
import life.catalogue.api.model.DSID;
import life.catalogue.api.model.Sector;
-import life.catalogue.api.vocab.DatasetOrigin;
import life.catalogue.common.id.ShortUUID;
import life.catalogue.dao.DatasetInfoCache;
import life.catalogue.dao.EstimateDao;
diff --git a/webservice/src/main/java/life/catalogue/assembly/SyncManager.java b/core/src/main/java/life/catalogue/assembly/SyncManager.java
similarity index 91%
rename from webservice/src/main/java/life/catalogue/assembly/SyncManager.java
rename to core/src/main/java/life/catalogue/assembly/SyncManager.java
index 0735820596..69ebb4257f 100644
--- a/webservice/src/main/java/life/catalogue/assembly/SyncManager.java
+++ b/core/src/main/java/life/catalogue/assembly/SyncManager.java
@@ -17,7 +17,6 @@
import life.catalogue.db.mapper.NameMapper;
import life.catalogue.db.mapper.SectorImportMapper;
import life.catalogue.db.mapper.SectorMapper;
-import life.catalogue.importer.ImportManager;
import life.catalogue.matching.nidx.NameIndex;
import org.gbif.nameparser.utils.NamedThreadFactory;
@@ -32,7 +31,6 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
-import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
@@ -49,7 +47,6 @@ public class SyncManager implements Managed, Idle {
private static final String SCHEDULER_THREAD_NAME = "sync-scheduler";
private ExecutorService exec;
- private ImportManager importManager;
private final SyncManagerConfig cfg;
private Thread schedulerThread;
private SyncSchedulerJob schedulerJob;
@@ -151,10 +148,6 @@ public boolean isIdle() {
return !hasStarted() || getState().isIdle();
}
- public void setImportManager(ImportManager importManager) {
- this.importManager = importManager;
- }
-
public SyncState getState() {
return new SyncState(syncs.values(), total(failed), total(counter));
}
@@ -187,28 +180,17 @@ public DSID hasSyncingSector(int datasetKey){
}
/**
- * Makes sure the dataset has data and is currently not importing
+ * Makes sure the dataset has data
*/
- private void assertStableData(SectorRunnable job) throws IllegalArgumentException {
+ private void assertDataExists(SectorRunnable job) throws IllegalArgumentException {
Sector s = job.sector;
try (SqlSession session = factory.openSession(true)) {
- try {
- //make sure dataset is currently not imported
- if (importManager != null && importManager.isRunning(s.getSubjectDatasetKey())) {
- LOG.warn("Concurrently running dataset import. Cannot sync {}", s);
- throw new IllegalArgumentException("Dataset "+s.getSubjectDatasetKey()+" currently being imported. Cannot sync " + s);
- }
- NameMapper nm = session.getMapper(NameMapper.class);
- if (!(job instanceof SectorSync) || nm.hasData(s.getSubjectDatasetKey())) {
- return;
- }
- } catch (PersistenceException e) {
- // missing partitions cause this
- LOG.debug("No partition exists for dataset {}", s.getSubjectDatasetKey(), e);
+ NameMapper nm = session.getMapper(NameMapper.class);
+ if (job instanceof SectorSync && !nm.hasData(s.getSubjectDatasetKey())) {
+ LOG.warn("Cannot sync {} which has no data and probably never has been imported", s);
+ throw new IllegalArgumentException("Dataset empty. Cannot sync " + s);
}
}
- LOG.warn("Cannot sync {} which has never been imported", s);
- throw new IllegalArgumentException("Dataset empty. Cannot sync " + s);
}
private DatasetSettings projectSettings(int projectKey) {
@@ -299,7 +281,7 @@ private synchronized boolean queueJob(SectorRunnable job, boolean blockMergeSync
return rejectJob(job, String.format("Merge sectors blocked in project, skip sync of sector %s", job.sector));
} else {
- assertStableData(job);
+ assertDataExists(job);
syncs.put(job.sectorKey, new SectorFuture(job, exec.submit(job)));
LOG.info("Queued {} for {} targeting {}", job.getClass().getSimpleName(), job.sector, job.sector.getTarget());
return true;
diff --git a/webservice/src/main/java/life/catalogue/assembly/SyncNameUsageRules.java b/core/src/main/java/life/catalogue/assembly/SyncNameUsageRules.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/SyncNameUsageRules.java
rename to core/src/main/java/life/catalogue/assembly/SyncNameUsageRules.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java b/core/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java
rename to core/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java
index 48ed26695d..fcb85dbec6 100644
--- a/webservice/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java
+++ b/core/src/main/java/life/catalogue/assembly/SyncSchedulerJob.java
@@ -1,7 +1,6 @@
package life.catalogue.assembly;
import life.catalogue.api.model.Sector;
-import life.catalogue.api.model.User;
import life.catalogue.api.search.DatasetSearchRequest;
import life.catalogue.api.vocab.DatasetOrigin;
import life.catalogue.api.vocab.Setting;
@@ -10,7 +9,6 @@
import life.catalogue.config.SyncManagerConfig;
import life.catalogue.db.mapper.DatasetMapper;
import life.catalogue.db.mapper.SectorMapper;
-import life.catalogue.importer.ImportRequest;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
diff --git a/webservice/src/main/java/life/catalogue/assembly/SyncState.java b/core/src/main/java/life/catalogue/assembly/SyncState.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/SyncState.java
rename to core/src/main/java/life/catalogue/assembly/SyncState.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/TreeBaseHandler.java b/core/src/main/java/life/catalogue/assembly/TreeBaseHandler.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/TreeBaseHandler.java
rename to core/src/main/java/life/catalogue/assembly/TreeBaseHandler.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/TreeCopyHandler.java b/core/src/main/java/life/catalogue/assembly/TreeCopyHandler.java
similarity index 99%
rename from webservice/src/main/java/life/catalogue/assembly/TreeCopyHandler.java
rename to core/src/main/java/life/catalogue/assembly/TreeCopyHandler.java
index 09f8b6c466..05d2d6a86b 100644
--- a/webservice/src/main/java/life/catalogue/assembly/TreeCopyHandler.java
+++ b/core/src/main/java/life/catalogue/assembly/TreeCopyHandler.java
@@ -1,7 +1,6 @@
package life.catalogue.assembly;
import life.catalogue.api.model.*;
-import life.catalogue.api.vocab.DatasetType;
import life.catalogue.api.vocab.IgnoreReason;
import life.catalogue.api.vocab.TaxonomicStatus;
import life.catalogue.dao.CopyUtil;
diff --git a/webservice/src/main/java/life/catalogue/assembly/TreeHandler.java b/core/src/main/java/life/catalogue/assembly/TreeHandler.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/TreeHandler.java
rename to core/src/main/java/life/catalogue/assembly/TreeHandler.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/TreeMergeHandler.java b/core/src/main/java/life/catalogue/assembly/TreeMergeHandler.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/TreeMergeHandler.java
rename to core/src/main/java/life/catalogue/assembly/TreeMergeHandler.java
diff --git a/webservice/src/main/java/life/catalogue/assembly/TreeMergeHandlerConfig.java b/core/src/main/java/life/catalogue/assembly/TreeMergeHandlerConfig.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/assembly/TreeMergeHandlerConfig.java
rename to core/src/main/java/life/catalogue/assembly/TreeMergeHandlerConfig.java
diff --git a/webservice/src/main/java/life/catalogue/basgroup/BasionymSorter.java b/core/src/main/java/life/catalogue/basgroup/BasionymSorter.java
similarity index 91%
rename from webservice/src/main/java/life/catalogue/basgroup/BasionymSorter.java
rename to core/src/main/java/life/catalogue/basgroup/BasionymSorter.java
index 62d4bead15..83c5ec7ce1 100644
--- a/webservice/src/main/java/life/catalogue/basgroup/BasionymSorter.java
+++ b/core/src/main/java/life/catalogue/basgroup/BasionymSorter.java
@@ -1,7 +1,5 @@
package life.catalogue.basgroup;
-import com.google.common.annotations.VisibleForTesting;
-
import life.catalogue.api.model.*;
import life.catalogue.api.vocab.Issue;
@@ -13,7 +11,6 @@
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
-import java.util.function.IntFunction;
import java.util.function.ToIntFunction;
import org.gbif.nameparser.api.NomCode;
@@ -22,8 +19,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.common.base.Functions;
-
import it.unimi.dsi.fastutil.Pair;
/**
@@ -86,8 +81,8 @@ public String toString() {
* @return
*/
public Collection> groupBasionyms(NomCode code, String epithet, List names,
- Function nameResolver,
- Consumer> issueConsumer
+ Function nameResolver,
+ Consumer> issueConsumer
) {
List> groups = new ArrayList<>();
diff --git a/webservice/src/main/java/life/catalogue/basgroup/HomotypicConsolidationJob.java b/core/src/main/java/life/catalogue/basgroup/HomotypicConsolidationJob.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/basgroup/HomotypicConsolidationJob.java
rename to core/src/main/java/life/catalogue/basgroup/HomotypicConsolidationJob.java
diff --git a/webservice/src/main/java/life/catalogue/basgroup/HomotypicConsolidator.java b/core/src/main/java/life/catalogue/basgroup/HomotypicConsolidator.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/basgroup/HomotypicConsolidator.java
rename to core/src/main/java/life/catalogue/basgroup/HomotypicConsolidator.java
diff --git a/webservice/src/main/java/life/catalogue/basgroup/HomotypicGroup.java b/core/src/main/java/life/catalogue/basgroup/HomotypicGroup.java
similarity index 99%
rename from webservice/src/main/java/life/catalogue/basgroup/HomotypicGroup.java
rename to core/src/main/java/life/catalogue/basgroup/HomotypicGroup.java
index 10905a8db9..e5dd21da1d 100644
--- a/webservice/src/main/java/life/catalogue/basgroup/HomotypicGroup.java
+++ b/core/src/main/java/life/catalogue/basgroup/HomotypicGroup.java
@@ -1,7 +1,6 @@
package life.catalogue.basgroup;
import life.catalogue.api.model.FormattableName;
-import life.catalogue.api.model.HasID;
import org.gbif.nameparser.api.Authorship;
diff --git a/webservice/src/main/java/life/catalogue/basgroup/SectorPriority.java b/core/src/main/java/life/catalogue/basgroup/SectorPriority.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/basgroup/SectorPriority.java
rename to core/src/main/java/life/catalogue/basgroup/SectorPriority.java
diff --git a/webservice/src/main/java/life/catalogue/cache/CacheFlush.java b/core/src/main/java/life/catalogue/cache/CacheFlush.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/cache/CacheFlush.java
rename to core/src/main/java/life/catalogue/cache/CacheFlush.java
diff --git a/webservice/src/main/java/life/catalogue/cache/LatestDatasetKeyCache.java b/core/src/main/java/life/catalogue/cache/LatestDatasetKeyCache.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/cache/LatestDatasetKeyCache.java
rename to core/src/main/java/life/catalogue/cache/LatestDatasetKeyCache.java
diff --git a/webservice/src/main/java/life/catalogue/cache/LatestDatasetKeyCacheImpl.java b/core/src/main/java/life/catalogue/cache/LatestDatasetKeyCacheImpl.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/cache/LatestDatasetKeyCacheImpl.java
rename to core/src/main/java/life/catalogue/cache/LatestDatasetKeyCacheImpl.java
diff --git a/webservice/src/main/java/life/catalogue/doi/DoiUpdater.java b/core/src/main/java/life/catalogue/doi/DoiUpdater.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/doi/DoiUpdater.java
rename to core/src/main/java/life/catalogue/doi/DoiUpdater.java
diff --git a/webservice/src/main/java/life/catalogue/exporter/AcefExport.java b/core/src/main/java/life/catalogue/exporter/AcefExport.java
similarity index 96%
rename from webservice/src/main/java/life/catalogue/exporter/AcefExport.java
rename to core/src/main/java/life/catalogue/exporter/AcefExport.java
index 92c55ae684..8e7e841974 100644
--- a/webservice/src/main/java/life/catalogue/exporter/AcefExport.java
+++ b/core/src/main/java/life/catalogue/exporter/AcefExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.Dataset;
import life.catalogue.api.model.DatasetImport;
import life.catalogue.api.model.ExportRequest;
@@ -45,7 +44,7 @@ public class AcefExport extends DatasetExportJob {
private static final Pattern COPY_END = Pattern.compile("^\\s*\\)\\s*TO\\s*'(.+)'");
private static final Pattern VAR_DATASET_KEY = Pattern.compile("\\{\\{datasetKey}}", Pattern.CASE_INSENSITIVE);
- public AcefExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public AcefExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(req, userKey, DataFormat.ACEF, false, factory, cfg, imageService);
if (req.hasFilter()) {
throw new IllegalArgumentException("ACEF exports cannot have any filters");
@@ -115,12 +114,12 @@ private void exportLogos() throws IOException {
List resp = dm.search(req, null, new Page(0,1000));
LOG.info("Found " +resp.size()+ " source datasets of project " + datasetKey);
for (Dataset d : resp) {
- Path p = cfg.img.datasetLogo(d.getKey(), ImgConfig.Scale.MEDIUM);
+ Path p = iCfg.datasetLogo(d.getKey(), ImgConfig.Scale.MEDIUM);
if (java.nio.file.Files.exists(p)) {
File img = new File(logoDir, (d.getKey()-1000) + ".png");
Files.copy(p.toFile(), img);
- p = cfg.img.datasetLogo(d.getKey(), ImgConfig.Scale.SMALL);
+ p = iCfg.datasetLogo(d.getKey(), ImgConfig.Scale.SMALL);
img = new File(logoDir, (d.getKey()-1000) + "-sm.png");
Files.copy(p.toFile(), img);
counter++;
diff --git a/webservice/src/main/java/life/catalogue/exporter/ArchiveExport.java b/core/src/main/java/life/catalogue/exporter/ArchiveExport.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/exporter/ArchiveExport.java
rename to core/src/main/java/life/catalogue/exporter/ArchiveExport.java
index 696d54e192..a5a13152d0 100644
--- a/webservice/src/main/java/life/catalogue/exporter/ArchiveExport.java
+++ b/core/src/main/java/life/catalogue/exporter/ArchiveExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.*;
import life.catalogue.api.search.EstimateSearchRequest;
import life.catalogue.api.util.ObjectUtils;
@@ -24,8 +23,6 @@
import java.io.IOException;
import java.util.*;
-import jakarta.ws.rs.core.UriBuilder;
-
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.session.SqlSession;
@@ -39,6 +36,7 @@
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import jakarta.ws.rs.core.UriBuilder;
public abstract class ArchiveExport extends DatasetExportJob {
private static final Logger LOG = LoggerFactory.getLogger(ArchiveExport.class);
@@ -59,9 +57,9 @@ public abstract class ArchiveExport extends DatasetExportJob {
private final SXSSFWorkbook wb;
protected final boolean inclTreatments;
- ArchiveExport(DataFormat requiredFormat, int userKey, ExportRequest req, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ ArchiveExport(DataFormat requiredFormat, int userKey, ExportRequest req, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(req, userKey, requiredFormat, true, factory, cfg, imageService);
- logoUriBuilder = cfg.apiURI == null ? null : UriBuilder.fromUri(cfg.apiURI).path("/dataset/{key}/logo?size=ORIGINAL");
+ logoUriBuilder = cfg.getApiUri() == null ? null : UriBuilder.fromUri(cfg.getApiUri()).path("/dataset/{key}/logo?size=ORIGINAL");
refCache = Caffeine.newBuilder()
.maximumSize(10000)
.build(this::lookupReference);
diff --git a/webservice/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java b/core/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java
similarity index 99%
rename from webservice/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java
rename to core/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java
index d916d314c5..674865400a 100644
--- a/webservice/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java
+++ b/core/src/main/java/life/catalogue/exporter/ColdpExtendedExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.jackson.ApiModule;
import life.catalogue.api.jackson.PermissiveEnumSerde;
import life.catalogue.api.model.*;
@@ -22,7 +21,6 @@
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -39,7 +37,7 @@ public class ColdpExtendedExport extends ArchiveExport {
private NameUsageKeyMap nameUsageKeyMap;
private final File treatmentDir;
- public ColdpExtendedExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public ColdpExtendedExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(DataFormat.COLDP, userKey, req, factory, cfg, imageService);
if (inclTreatments) {
treatmentDir = new File(tmpDir, "treatments");
diff --git a/webservice/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java b/core/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java
similarity index 82%
rename from webservice/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java
rename to core/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java
index 4520d808b1..d13818df30 100644
--- a/webservice/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java
+++ b/core/src/main/java/life/catalogue/exporter/ColdpSimpleExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.vocab.DataFormat;
import life.catalogue.api.vocab.TabularFormat;
@@ -11,11 +10,11 @@
public class ColdpSimpleExport extends PrinterExport {
- private ColdpSimpleExport(Class clazz, ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ private ColdpSimpleExport(Class clazz, ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(clazz, "ColDP", DataFormat.COLDP, req, userKey, factory, cfg, imageService);
}
- public static ColdpSimpleExport extends ColdpPrinter> build(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public static ColdpSimpleExport extends ColdpPrinter> build(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
if (req.getTabFormat() == TabularFormat.CSV) {
return new ColdpSimpleExport<>(ColdpPrinter.CSV.class, req, userKey, factory, cfg, imageService);
diff --git a/webservice/src/main/java/life/catalogue/exporter/DatasetExportJob.java b/core/src/main/java/life/catalogue/exporter/DatasetExportJob.java
similarity index 91%
rename from webservice/src/main/java/life/catalogue/exporter/DatasetExportJob.java
rename to core/src/main/java/life/catalogue/exporter/DatasetExportJob.java
index 216b40e599..7fe0a23491 100644
--- a/webservice/src/main/java/life/catalogue/exporter/DatasetExportJob.java
+++ b/core/src/main/java/life/catalogue/exporter/DatasetExportJob.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.exception.NotFoundException;
import life.catalogue.api.model.DSID;
import life.catalogue.api.model.DatasetExport;
@@ -10,14 +9,13 @@
import life.catalogue.api.vocab.JobStatus;
import life.catalogue.common.io.CompressionUtil;
import life.catalogue.common.lang.Exceptions;
-import life.catalogue.concurrent.BackgroundJob;
-import life.catalogue.concurrent.DatasetBlockingJob;
-import life.catalogue.concurrent.JobPriority;
-import life.catalogue.concurrent.UsageCounter;
+import life.catalogue.concurrent.*;
+import life.catalogue.config.NormalizerConfig;
import life.catalogue.db.mapper.DatasetExportMapper;
import life.catalogue.db.mapper.NameUsageMapper;
import life.catalogue.db.mapper.TaxonMapper;
import life.catalogue.img.ImageService;
+import life.catalogue.img.ImgConfig;
import life.catalogue.metadata.coldp.DatasetYamlWriter;
import java.io.File;
@@ -45,14 +43,16 @@ abstract class DatasetExportJob extends DatasetBlockingJob {
protected final ExportRequest req;
protected File archive;
protected File tmpDir;
- protected final WsServerConfig cfg;
+ protected final JobConfig jCfg;
+ protected final NormalizerConfig nCfg;
+ protected final ImgConfig iCfg;
protected final ImageService imageService;
protected final UsageCounter counter = new UsageCounter();
private final DatasetExport export;
@VisibleForTesting
DatasetExportJob(ExportRequest req, int userKey, DataFormat requiredFormat, List classification, SqlSessionFactory factory,
- WsServerConfig cfg, ImageService imageService) {
+ ExporterConfig cfg, ImageService imageService) {
super(req.getDatasetKey(), userKey, JobPriority.LOW);
Preconditions.checkNotNull(requiredFormat, "format required");
if (req.getFormat() == null) {
@@ -60,12 +60,14 @@ abstract class DatasetExportJob extends DatasetBlockingJob {
} else if (req.getFormat() != requiredFormat) {
throw new IllegalArgumentException("Format "+req.getFormat()+" cannot be exported with "+getClass().getSimpleName());
}
- this.cfg = cfg;
+ this.jCfg = cfg.getJob();
+ this.nCfg = cfg.getNormalizerConfig();
+ this.iCfg = cfg.getImgConfig();
this.imageService = imageService;
this.req = Preconditions.checkNotNull(req);
this.factory = factory;
- this.archive = cfg.job.downloadFile(getKey());
- this.tmpDir = new File(cfg.normalizer.scratchDir, "export/" + getKey().toString());
+ this.archive = this.jCfg.downloadFile(getKey());
+ this.tmpDir = new File(nCfg.scratchDir, "export/" + getKey().toString());
this.dataset = loadDataset(factory, req.getDatasetKey());
export = DatasetExport.createWaiting(getKey(), userKey, req, dataset);
export.setClassification(classification);
@@ -77,7 +79,7 @@ abstract class DatasetExportJob extends DatasetBlockingJob {
}
DatasetExportJob(ExportRequest req, int userKey, DataFormat requiredFormat, boolean allowExcel, SqlSessionFactory factory,
- WsServerConfig cfg, ImageService imageService) {
+ ExporterConfig cfg, ImageService imageService) {
this(req, userKey, requiredFormat, loadClassification(factory, req), factory, cfg, imageService);
if (req.isExcel() && !allowExcel) {
throw new IllegalArgumentException(requiredFormat.getName() + " cannot be exported in Excel");
diff --git a/webservice/src/main/java/life/catalogue/exporter/DotExport.java b/core/src/main/java/life/catalogue/exporter/DotExport.java
similarity index 85%
rename from webservice/src/main/java/life/catalogue/exporter/DotExport.java
rename to core/src/main/java/life/catalogue/exporter/DotExport.java
index 2295237819..f464188e1c 100644
--- a/webservice/src/main/java/life/catalogue/exporter/DotExport.java
+++ b/core/src/main/java/life/catalogue/exporter/DotExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.vocab.DataFormat;
import life.catalogue.img.ImageService;
@@ -10,7 +9,7 @@
public class DotExport extends PrinterExport {
- public DotExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public DotExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(DotPrinter.class, "DOT", DataFormat.DOT, req, userKey, factory, cfg, imageService);
}
diff --git a/webservice/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java b/core/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java
rename to core/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java
index 03907e4d99..2bb925827c 100644
--- a/webservice/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java
+++ b/core/src/main/java/life/catalogue/exporter/DwcaExtendedExport.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.*;
import life.catalogue.api.vocab.*;
import life.catalogue.coldp.ColdpTerm;
@@ -28,9 +27,6 @@
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
-
-import org.gbif.nameparser.util.RankUtils;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,7 +48,7 @@ public class DwcaExtendedExport extends ArchiveExport {
private final Archive arch = new Archive();
private final AtomicInteger bareNameID = new AtomicInteger(1);
- public DwcaExtendedExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public DwcaExtendedExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(DataFormat.DWCA, userKey, req, factory, cfg, imageService);
}
diff --git a/webservice/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java b/core/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java
similarity index 83%
rename from webservice/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java
rename to core/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java
index 7fec54be05..c2c5bb57e1 100644
--- a/webservice/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java
+++ b/core/src/main/java/life/catalogue/exporter/DwcaSimpleExport.java
@@ -1,29 +1,24 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.util.ObjectUtils;
import life.catalogue.api.vocab.DataFormat;
import life.catalogue.api.vocab.TabularFormat;
import life.catalogue.common.io.Resources;
-import life.catalogue.common.io.TmpIO;
import life.catalogue.img.ImageService;
-
import life.catalogue.printer.DwcaPrinter;
-import org.apache.commons.io.IOUtils;
-import org.apache.ibatis.session.SqlSessionFactory;
-
import java.io.File;
-import java.io.FileOutputStream;
+
+import org.apache.ibatis.session.SqlSessionFactory;
public class DwcaSimpleExport extends PrinterExport {
- private DwcaSimpleExport(Class clazz, ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ private DwcaSimpleExport(Class clazz, ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(clazz, "DwCA", DataFormat.DWCA, req, userKey, factory, cfg, imageService);
}
- public static DwcaSimpleExport> build(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public static DwcaSimpleExport> build(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
return new DwcaSimpleExport(req.getTabFormat() == TabularFormat.CSV ? DwcaPrinter.CSV.class : DwcaPrinter.TSV.class, req, userKey, factory, cfg, imageService);
}
diff --git a/webservice/src/main/java/life/catalogue/exporter/ExcelTermWriter.java b/core/src/main/java/life/catalogue/exporter/ExcelTermWriter.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/exporter/ExcelTermWriter.java
rename to core/src/main/java/life/catalogue/exporter/ExcelTermWriter.java
diff --git a/webservice/src/main/java/life/catalogue/exporter/ExportManager.java b/core/src/main/java/life/catalogue/exporter/ExportManager.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/exporter/ExportManager.java
rename to core/src/main/java/life/catalogue/exporter/ExportManager.java
index d2dbff640b..cc19100fcf 100644
--- a/webservice/src/main/java/life/catalogue/exporter/ExportManager.java
+++ b/core/src/main/java/life/catalogue/exporter/ExportManager.java
@@ -1,6 +1,5 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.event.DatasetChanged;
import life.catalogue.api.model.DSID;
import life.catalogue.api.model.DatasetExport;
@@ -27,14 +26,14 @@
public class ExportManager {
private static final Logger LOG = LoggerFactory.getLogger(ExportManager.class);
- private final WsServerConfig cfg;
+ private final ExporterConfig cfg;
private final SqlSessionFactory factory;
private final ImageService imageService;
private final JobExecutor executor;
private final DatasetExportDao dao;
private final DatasetImportDao diDao;
- public ExportManager(WsServerConfig cfg, SqlSessionFactory factory, JobExecutor executor, ImageService imageService,
+ public ExportManager(ExporterConfig cfg, SqlSessionFactory factory, JobExecutor executor, ImageService imageService,
DatasetExportDao exportDao, DatasetImportDao diDao) {
this.cfg = cfg;
this.factory = factory;
diff --git a/core/src/main/java/life/catalogue/exporter/ExporterConfig.java b/core/src/main/java/life/catalogue/exporter/ExporterConfig.java
new file mode 100644
index 0000000000..21d8dc31fd
--- /dev/null
+++ b/core/src/main/java/life/catalogue/exporter/ExporterConfig.java
@@ -0,0 +1,15 @@
+package life.catalogue.exporter;
+
+import life.catalogue.concurrent.JobConfig;
+import life.catalogue.config.NormalizerConfig;
+import life.catalogue.img.ImgConfig;
+
+import java.net.URI;
+
+public interface ExporterConfig {
+
+ URI getApiUri();
+ JobConfig getJob();
+ ImgConfig getImgConfig();
+ NormalizerConfig getNormalizerConfig();
+}
diff --git a/webservice/src/main/java/life/catalogue/exporter/NameUsageKeyMap.java b/core/src/main/java/life/catalogue/exporter/NameUsageKeyMap.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/exporter/NameUsageKeyMap.java
rename to core/src/main/java/life/catalogue/exporter/NameUsageKeyMap.java
diff --git a/webservice/src/main/java/life/catalogue/exporter/NewickExport.java b/core/src/main/java/life/catalogue/exporter/NewickExport.java
similarity index 69%
rename from webservice/src/main/java/life/catalogue/exporter/NewickExport.java
rename to core/src/main/java/life/catalogue/exporter/NewickExport.java
index b005f60511..e186b4158e 100644
--- a/webservice/src/main/java/life/catalogue/exporter/NewickExport.java
+++ b/core/src/main/java/life/catalogue/exporter/NewickExport.java
@@ -1,25 +1,15 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.vocab.DataFormat;
-import life.catalogue.common.io.UTF8IoUtils;
-import life.catalogue.printer.AbstractPrinter;
-import life.catalogue.printer.DotPrinter;
-import life.catalogue.printer.NewickPrinter;
-import life.catalogue.printer.PrinterFactory;
import life.catalogue.img.ImageService;
-
-import java.io.File;
-import java.io.Writer;
+import life.catalogue.printer.NewickPrinter;
import org.apache.ibatis.session.SqlSessionFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class NewickExport extends PrinterExport {
- public NewickExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public NewickExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(NewickPrinter.class, "Newick", DataFormat.NEWICK, req, userKey, factory, cfg, imageService);
if (req.isSynonyms()) {
throw new IllegalArgumentException("The Newick format does not support synonyms");
diff --git a/webservice/src/main/java/life/catalogue/exporter/PrinterExport.java b/core/src/main/java/life/catalogue/exporter/PrinterExport.java
similarity index 91%
rename from webservice/src/main/java/life/catalogue/exporter/PrinterExport.java
rename to core/src/main/java/life/catalogue/exporter/PrinterExport.java
index b3de3e666a..6e09a85b8b 100644
--- a/webservice/src/main/java/life/catalogue/exporter/PrinterExport.java
+++ b/core/src/main/java/life/catalogue/exporter/PrinterExport.java
@@ -1,20 +1,21 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.vocab.DataFormat;
import life.catalogue.common.io.UTF8IoUtils;
+import life.catalogue.concurrent.JobConfig;
+import life.catalogue.config.NormalizerConfig;
import life.catalogue.img.ImageService;
import life.catalogue.printer.AbstractPrinter;
import life.catalogue.printer.PrinterFactory;
+import java.io.File;
+import java.io.Writer;
+
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
-import java.io.Writer;
-
public abstract class PrinterExport extends DatasetExportJob {
private static final Logger LOG = LoggerFactory.getLogger(PrinterExport.class);
@@ -22,7 +23,7 @@ public abstract class PrinterExport extends DatasetEx
private final String printerName;
PrinterExport(Class printerClass, String printerName, DataFormat requiredFormat,
- ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService
+ ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService
) {
super(req, userKey, requiredFormat, false, factory, cfg, imageService);
this.printerClass = printerClass;
diff --git a/webservice/src/main/java/life/catalogue/exporter/TextTreeExport.java b/core/src/main/java/life/catalogue/exporter/TextTreeExport.java
similarity index 69%
rename from webservice/src/main/java/life/catalogue/exporter/TextTreeExport.java
rename to core/src/main/java/life/catalogue/exporter/TextTreeExport.java
index 3d15ee27c3..5eb3f6b0c9 100644
--- a/webservice/src/main/java/life/catalogue/exporter/TextTreeExport.java
+++ b/core/src/main/java/life/catalogue/exporter/TextTreeExport.java
@@ -1,23 +1,14 @@
package life.catalogue.exporter;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.model.ExportRequest;
import life.catalogue.api.vocab.DataFormat;
-import life.catalogue.common.io.UTF8IoUtils;
-import life.catalogue.printer.NewickPrinter;
-import life.catalogue.printer.PrinterFactory;
-import life.catalogue.printer.TextTreePrinter;
import life.catalogue.img.ImageService;
-
-import java.io.File;
-import java.io.Writer;
+import life.catalogue.printer.TextTreePrinter;
import org.apache.ibatis.session.SqlSessionFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class TextTreeExport extends PrinterExport {
- public TextTreeExport(ExportRequest req, int userKey, SqlSessionFactory factory, WsServerConfig cfg, ImageService imageService) {
+ public TextTreeExport(ExportRequest req, int userKey, SqlSessionFactory factory, ExporterConfig cfg, ImageService imageService) {
super(TextTreePrinter.class, "text tree", DataFormat.TEXT_TREE, req, userKey, factory, cfg, imageService);
}
diff --git a/webservice/src/main/java/life/catalogue/gbifsync/DatasetPager.java b/core/src/main/java/life/catalogue/gbifsync/DatasetPager.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/gbifsync/DatasetPager.java
rename to core/src/main/java/life/catalogue/gbifsync/DatasetPager.java
diff --git a/webservice/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java b/core/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java
rename to core/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java
index 4f58bac49c..25f3a89906 100644
--- a/webservice/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java
+++ b/core/src/main/java/life/catalogue/gbifsync/GbifSyncJob.java
@@ -12,7 +12,6 @@
import life.catalogue.concurrent.JobPriority;
import life.catalogue.config.GbifConfig;
import life.catalogue.dao.DatasetDao;
-import life.catalogue.db.PgUtils;
import life.catalogue.db.mapper.DatasetMapper;
import java.time.LocalDate;
@@ -21,7 +20,6 @@
import jakarta.ws.rs.client.Client;
-import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
diff --git a/webservice/src/main/java/life/catalogue/gbifsync/GbifSyncManager.java b/core/src/main/java/life/catalogue/gbifsync/GbifSyncManager.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/gbifsync/GbifSyncManager.java
rename to core/src/main/java/life/catalogue/gbifsync/GbifSyncManager.java
diff --git a/webservice/src/main/java/life/catalogue/importer/ExtinctName.java b/core/src/main/java/life/catalogue/interpreter/ExtinctName.java
similarity index 93%
rename from webservice/src/main/java/life/catalogue/importer/ExtinctName.java
rename to core/src/main/java/life/catalogue/interpreter/ExtinctName.java
index 9fa2730bc9..0f926213cc 100644
--- a/webservice/src/main/java/life/catalogue/importer/ExtinctName.java
+++ b/core/src/main/java/life/catalogue/interpreter/ExtinctName.java
@@ -1,4 +1,4 @@
-package life.catalogue.importer;
+package life.catalogue.interpreter;
import life.catalogue.common.tax.SciNameNormalizer;
diff --git a/core/src/main/java/life/catalogue/interpreter/InterpreterUtils.java b/core/src/main/java/life/catalogue/interpreter/InterpreterUtils.java
new file mode 100644
index 0000000000..7da5e461a0
--- /dev/null
+++ b/core/src/main/java/life/catalogue/interpreter/InterpreterUtils.java
@@ -0,0 +1,99 @@
+package life.catalogue.interpreter;
+
+import life.catalogue.api.model.Identifier;
+import life.catalogue.api.model.IssueContainer;
+import life.catalogue.api.model.VerbatimRecord;
+import life.catalogue.api.vocab.Issue;
+
+import org.gbif.dwc.terms.Term;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jsoup.Jsoup;
+
+import static life.catalogue.matching.NameValidator.MAX_YEAR;
+import static life.catalogue.matching.NameValidator.MIN_YEAR;
+
+public class InterpreterUtils {
+ private static final Pattern YEAR_PATTERN = Pattern.compile("^(\\d{3})(\\d|\\s*\\?)(?:-[0-9-]+)?(?:\\s*[a-zA-Z])?$");
+ private static final Pattern SPLIT_COMMA = Pattern.compile("(? MAX_YEAR) {
+ issues.addIssue(Issue.UNLIKELY_YEAR);
+ } else {
+ return y;
+ }
+ } else {
+ issues.addIssue(Issue.UNPARSABLE_YEAR);
+ }
+ }
+ return null;
+ }
+
+ public static List interpretIdentifiers(String idsRaw, @Nullable Identifier.Scope defaultScope, IssueContainer issues) {
+ if (!StringUtils.isBlank(idsRaw)) {
+ List ids = new ArrayList<>();
+ for (String altID : SPLIT_COMMA.split(idsRaw)) {
+ var id = Identifier.parse(altID);
+ ids.add(id);
+ if (id.isLocal()) {
+ if (defaultScope != null) {
+ id.setScope(defaultScope);
+ } else {
+ issues.addIssue(Issue.IDENTIFIER_WITHOUT_SCOPE);
+ }
+ }
+ }
+ return ids;
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/webservice/src/main/java/life/catalogue/importer/NameInterpreter.java b/core/src/main/java/life/catalogue/interpreter/NameInterpreter.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/importer/NameInterpreter.java
rename to core/src/main/java/life/catalogue/interpreter/NameInterpreter.java
index 8b0ca4ab05..d48bf8ad07 100644
--- a/webservice/src/main/java/life/catalogue/importer/NameInterpreter.java
+++ b/core/src/main/java/life/catalogue/interpreter/NameInterpreter.java
@@ -1,4 +1,4 @@
-package life.catalogue.importer;
+package life.catalogue.interpreter;
import life.catalogue.api.model.*;
import life.catalogue.api.util.ObjectUtils;
@@ -109,7 +109,7 @@ public Optional interpret(final String id, String vrank, @Nulla
uninomial, genus, infraGenus, species, infraspecies, cultivar,
v.get(combAuthors), v.get(combExAuthors), v.get(combAuthorsYear), v.get(basAuthors), v.get(basExAuthors), v.get(basAuthorsYear),
nothoVal, originalSpellingVal, v.get(nomStatus),
- v.getRaw(link), InterpreterBase.replaceHtml(v.get(remarks),true), v.getRaw(identifiers), v
+ v.getRaw(link), InterpreterUtils.replaceHtml(v.get(remarks),true), v.getRaw(identifiers), v
);
// keep the verbatim id
opt.ifPresent(parsedNameUsage -> parsedNameUsage.getName().setVerbatimKey(v.getId()));
@@ -271,13 +271,13 @@ private Optional interpret(final boolean allowToInferRank,
// populate name published in through various channels and verify its a real nomenclatural date
if (publishedInYear != null){
- Integer year = InterpreterBase.parseNomenYear(publishedInYear, issues);
+ Integer year = InterpreterUtils.parseNomenYear(publishedInYear, issues);
if (year != null) {
pnu.getName().setPublishedInYear(year);
}
}
if (pnu.getName().getCombinationAuthorship() != null && pnu.getName().getCombinationAuthorship().getYear() != null){
- Integer year = InterpreterBase.parseNomenYear(pnu.getName().getCombinationAuthorship().getYear(), issues);
+ Integer year = InterpreterUtils.parseNomenYear(pnu.getName().getCombinationAuthorship().getYear(), issues);
if (year != null) {
if (pnu.getName().getPublishedInYear() == null) {
pnu.getName().setPublishedInYear(year);
@@ -318,7 +318,7 @@ private Optional interpret(final boolean allowToInferRank,
// add raw status to remarks
pnu.getName().addRemarks(nomStatus);
}
- pnu.getName().setIdentifier(InterpreterBase.interpretIdentifiers(identifiers, null, issues));
+ pnu.getName().setIdentifier(InterpreterUtils.interpretIdentifiers(identifiers, null, issues));
// finally update the scientificName with the canonical form if we can
pnu.getName().rebuildScientificName();
@@ -363,7 +363,7 @@ private static String cleanAuthor(String author) {
}
private static void verifyNomenYear(Authorship authorship, IssueContainer issues) {
- InterpreterBase.parseNomenYear(authorship.getYear(), issues);
+ InterpreterUtils.parseNomenYear(authorship.getYear(), issues);
}
/**
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/DatasetSchedulerJob.java b/core/src/main/java/life/catalogue/jobs/DatasetSchedulerJob.java
similarity index 99%
rename from webservice/src/main/java/life/catalogue/admin/jobs/DatasetSchedulerJob.java
rename to core/src/main/java/life/catalogue/jobs/DatasetSchedulerJob.java
index 27013f46b0..4e14ef72e3 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/DatasetSchedulerJob.java
+++ b/core/src/main/java/life/catalogue/jobs/DatasetSchedulerJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import life.catalogue.api.vocab.DatasetOrigin;
import life.catalogue.common.func.ThrowingConsumer;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/IndexJob.java b/core/src/main/java/life/catalogue/jobs/IndexJob.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/admin/jobs/IndexJob.java
rename to core/src/main/java/life/catalogue/jobs/IndexJob.java
index d9553ca0f7..52dc093267 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/IndexJob.java
+++ b/core/src/main/java/life/catalogue/jobs/IndexJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import com.google.common.eventbus.EventBus;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/MetricsSchedulerJob.java b/core/src/main/java/life/catalogue/jobs/MetricsSchedulerJob.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/admin/jobs/MetricsSchedulerJob.java
rename to core/src/main/java/life/catalogue/jobs/MetricsSchedulerJob.java
index a3865d3cb4..7fbfd4fdd2 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/MetricsSchedulerJob.java
+++ b/core/src/main/java/life/catalogue/jobs/MetricsSchedulerJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import life.catalogue.api.vocab.DatasetOrigin;
import life.catalogue.concurrent.BackgroundJob;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/RebuildMetricsJob.java b/core/src/main/java/life/catalogue/jobs/RebuildMetricsJob.java
similarity index 74%
rename from webservice/src/main/java/life/catalogue/admin/jobs/RebuildMetricsJob.java
rename to core/src/main/java/life/catalogue/jobs/RebuildMetricsJob.java
index ce76b24a65..6d9decdb2c 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/RebuildMetricsJob.java
+++ b/core/src/main/java/life/catalogue/jobs/RebuildMetricsJob.java
@@ -1,22 +1,13 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import life.catalogue.concurrent.BackgroundJob;
import life.catalogue.concurrent.DatasetBlockingJob;
import life.catalogue.concurrent.JobPriority;
import life.catalogue.dao.DaoUtils;
-import life.catalogue.dao.MetricsDao;
-import life.catalogue.dao.NameDao;
-import life.catalogue.dao.TaxonDao;
-import life.catalogue.es.NameUsageIndexService;
-import life.catalogue.matching.nidx.NameIndexFactory;
-
-import jakarta.validation.Validator;
import life.catalogue.release.MetricsBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* Recreates all taxon metrics for a given dataset
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/ReindexSchedulerJob.java b/core/src/main/java/life/catalogue/jobs/ReindexSchedulerJob.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/admin/jobs/ReindexSchedulerJob.java
rename to core/src/main/java/life/catalogue/jobs/ReindexSchedulerJob.java
index 1bebbd67c2..8bb459e90a 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/ReindexSchedulerJob.java
+++ b/core/src/main/java/life/catalogue/jobs/ReindexSchedulerJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import com.google.common.eventbus.EventBus;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/RematchSchedulerJob.java b/core/src/main/java/life/catalogue/jobs/RematchSchedulerJob.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/admin/jobs/RematchSchedulerJob.java
rename to core/src/main/java/life/catalogue/jobs/RematchSchedulerJob.java
index 4c5b5bc4a1..dd0161a99c 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/RematchSchedulerJob.java
+++ b/core/src/main/java/life/catalogue/jobs/RematchSchedulerJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import com.google.common.eventbus.EventBus;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/UsageCountJob.java b/core/src/main/java/life/catalogue/jobs/UsageCountJob.java
similarity index 97%
rename from webservice/src/main/java/life/catalogue/admin/jobs/UsageCountJob.java
rename to core/src/main/java/life/catalogue/jobs/UsageCountJob.java
index 32ad17d7fc..6c900b095d 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/UsageCountJob.java
+++ b/core/src/main/java/life/catalogue/jobs/UsageCountJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import life.catalogue.api.vocab.DatasetOrigin;
import life.catalogue.concurrent.GlobalBlockingJob;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/ValidationJob.java b/core/src/main/java/life/catalogue/jobs/ValidationJob.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/admin/jobs/ValidationJob.java
rename to core/src/main/java/life/catalogue/jobs/ValidationJob.java
index 8044dfc22c..b6752f54d0 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/ValidationJob.java
+++ b/core/src/main/java/life/catalogue/jobs/ValidationJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs;
+package life.catalogue.jobs;
import life.catalogue.api.model.TreeTraversalParameter;
import life.catalogue.common.date.DateUtils;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/cron/CronExecutor.java b/core/src/main/java/life/catalogue/jobs/cron/CronExecutor.java
similarity index 87%
rename from webservice/src/main/java/life/catalogue/admin/jobs/cron/CronExecutor.java
rename to core/src/main/java/life/catalogue/jobs/cron/CronExecutor.java
index 394186253f..89eaabb2ad 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/cron/CronExecutor.java
+++ b/core/src/main/java/life/catalogue/jobs/cron/CronExecutor.java
@@ -1,7 +1,8 @@
-package life.catalogue.admin.jobs.cron;
+package life.catalogue.jobs.cron;
import com.google.common.base.Preconditions;
+import life.catalogue.common.Managed;
import life.catalogue.concurrent.NamedThreadFactory;
import java.util.ArrayList;
@@ -13,7 +14,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import io.dropwizard.lifecycle.Managed;
public class CronExecutor implements Managed {
private static final Logger LOG = LoggerFactory.getLogger(CronExecutor.class);
@@ -38,6 +38,11 @@ private CronExecutor() {
);
}
+ @Override
+ public void start() throws Exception {
+
+ }
+
@Override
public void stop() throws Exception {
LOG.info("Stopping cron executor with {} jobs", futures.size());
@@ -47,4 +52,9 @@ public void stop() throws Exception {
scheduler.shutdown();
LOG.info("Cron executor stopped");
}
+
+ @Override
+ public boolean hasStarted() {
+ return scheduler.isShutdown();
+ }
}
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/cron/CronJob.java b/core/src/main/java/life/catalogue/jobs/cron/CronJob.java
similarity index 94%
rename from webservice/src/main/java/life/catalogue/admin/jobs/cron/CronJob.java
rename to core/src/main/java/life/catalogue/jobs/cron/CronJob.java
index 9497dfe410..28f1b9a892 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/cron/CronJob.java
+++ b/core/src/main/java/life/catalogue/jobs/cron/CronJob.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs.cron;
+package life.catalogue.jobs.cron;
import java.util.concurrent.TimeUnit;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/cron/ProjectCounterUpdate.java b/core/src/main/java/life/catalogue/jobs/cron/ProjectCounterUpdate.java
similarity index 88%
rename from webservice/src/main/java/life/catalogue/admin/jobs/cron/ProjectCounterUpdate.java
rename to core/src/main/java/life/catalogue/jobs/cron/ProjectCounterUpdate.java
index 8301205abb..16a79576fd 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/cron/ProjectCounterUpdate.java
+++ b/core/src/main/java/life/catalogue/jobs/cron/ProjectCounterUpdate.java
@@ -1,6 +1,6 @@
-package life.catalogue.admin.jobs.cron;
+package life.catalogue.jobs.cron;
-import life.catalogue.admin.jobs.UsageCountJob;
+import life.catalogue.jobs.UsageCountJob;
import life.catalogue.api.vocab.Users;
import life.catalogue.concurrent.JobPriority;
diff --git a/webservice/src/main/java/life/catalogue/admin/jobs/cron/TempDatasetCleanup.java b/core/src/main/java/life/catalogue/jobs/cron/TempDatasetCleanup.java
similarity index 93%
rename from webservice/src/main/java/life/catalogue/admin/jobs/cron/TempDatasetCleanup.java
rename to core/src/main/java/life/catalogue/jobs/cron/TempDatasetCleanup.java
index 1db4bbc384..d5b7e1ad58 100644
--- a/webservice/src/main/java/life/catalogue/admin/jobs/cron/TempDatasetCleanup.java
+++ b/core/src/main/java/life/catalogue/jobs/cron/TempDatasetCleanup.java
@@ -1,4 +1,4 @@
-package life.catalogue.admin.jobs.cron;
+package life.catalogue.jobs.cron;
import life.catalogue.dao.DatasetDao;
diff --git a/webservice/src/main/java/life/catalogue/matching/DockerConfig.java b/core/src/main/java/life/catalogue/matching/DockerConfig.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/matching/DockerConfig.java
rename to core/src/main/java/life/catalogue/matching/DockerConfig.java
diff --git a/webservice/src/main/java/life/catalogue/matching/MatchedParentStack.java b/core/src/main/java/life/catalogue/matching/MatchedParentStack.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/matching/MatchedParentStack.java
rename to core/src/main/java/life/catalogue/matching/MatchedParentStack.java
diff --git a/webservice/src/main/java/life/catalogue/matching/MatchingJob.java b/core/src/main/java/life/catalogue/matching/MatchingJob.java
similarity index 98%
rename from webservice/src/main/java/life/catalogue/matching/MatchingJob.java
rename to core/src/main/java/life/catalogue/matching/MatchingJob.java
index e035a4dcc7..c8d81f0185 100644
--- a/webservice/src/main/java/life/catalogue/matching/MatchingJob.java
+++ b/core/src/main/java/life/catalogue/matching/MatchingJob.java
@@ -1,6 +1,5 @@
package life.catalogue.matching;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.exception.NotFoundException;
import life.catalogue.api.exception.UnavailableException;
import life.catalogue.api.jackson.PermissiveEnumSerde;
@@ -17,15 +16,14 @@
import life.catalogue.concurrent.DatasetBlockingJob;
import life.catalogue.concurrent.JobPriority;
import life.catalogue.concurrent.UsageCounter;
+import life.catalogue.config.NormalizerConfig;
import life.catalogue.csv.CsvReader;
import life.catalogue.dao.TreeStreams;
import life.catalogue.db.mapper.NameUsageMapper;
import life.catalogue.db.mapper.TaxonMapper;
-import life.catalogue.importer.NameInterpreter;
+import life.catalogue.interpreter.NameInterpreter;
import life.catalogue.parser.*;
-import org.apache.commons.lang3.StringUtils;
-
import org.gbif.dwc.terms.DwcTerm;
import org.gbif.dwc.terms.Term;
@@ -42,6 +40,7 @@
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
@@ -74,14 +73,14 @@ public class MatchingJob extends DatasetBlockingJob {
private final SqlSessionFactory factory;
private final UsageMatcherGlobal matcher;
private final NameInterpreter interpreter = new NameInterpreter(new DatasetSettings(), true);
- private final WsServerConfig cfg;
+ private final NormalizerConfig cfg;
// job specifics
private final MatchingRequest req;
private final JobResult result;
private final UsageCounter counter = new UsageCounter();
private List rootClassification;
- public MatchingJob(MatchingRequest req, int userKey, SqlSessionFactory factory, UsageMatcherGlobal matcher, WsServerConfig cfg) {
+ public MatchingJob(MatchingRequest req, int userKey, SqlSessionFactory factory, UsageMatcherGlobal matcher, NormalizerConfig cfg) {
super(req.getDatasetKey(), userKey, JobPriority.LOW);
this.logToFile = true;
this.cfg = cfg;
@@ -114,7 +113,7 @@ public MatchingRequest getRequest() {
}
private File matchResultFile() {
- return cfg.normalizer.scratchFile(getKey());
+ return cfg.scratchFile(getKey());
}
@Override
diff --git a/webservice/src/main/java/life/catalogue/matching/MatchingRequest.java b/core/src/main/java/life/catalogue/matching/MatchingRequest.java
similarity index 100%
rename from webservice/src/main/java/life/catalogue/matching/MatchingRequest.java
rename to core/src/main/java/life/catalogue/matching/MatchingRequest.java
diff --git a/webservice/src/main/java/life/catalogue/matching/NidxExportJob.java b/core/src/main/java/life/catalogue/matching/NidxExportJob.java
similarity index 96%
rename from webservice/src/main/java/life/catalogue/matching/NidxExportJob.java
rename to core/src/main/java/life/catalogue/matching/NidxExportJob.java
index 443e8470de..b323a40b8f 100644
--- a/webservice/src/main/java/life/catalogue/matching/NidxExportJob.java
+++ b/core/src/main/java/life/catalogue/matching/NidxExportJob.java
@@ -1,6 +1,5 @@
package life.catalogue.matching;
-import life.catalogue.WsServerConfig;
import life.catalogue.api.jackson.ApiModule;
import life.catalogue.api.jackson.PermissiveEnumSerde;
import life.catalogue.api.model.Dataset;
@@ -10,6 +9,7 @@
import life.catalogue.common.io.UTF8IoUtils;
import life.catalogue.concurrent.BackgroundJob;
import life.catalogue.concurrent.JobPriority;
+import life.catalogue.config.NormalizerConfig;
import life.catalogue.db.mapper.DatasetMapper;
import life.catalogue.db.mapper.NamesIndexMapper;
import life.catalogue.metadata.coldp.DatasetYamlWriter;
@@ -38,7 +38,7 @@ public class NidxExportJob extends BackgroundJob {
private static final Logger LOG = LoggerFactory.getLogger(NidxExportJob.class);
private static final TypeReference