From 1fd01fdf478b6329cb8d06749b971e91a1dd0dee Mon Sep 17 00:00:00 2001 From: Andi Huber Date: Tue, 18 Jun 2024 07:15:26 +0200 Subject: [PATCH] (#24): factors out connector stuff into own module --- globodiet/connectors/nutridb/pom.xml | 45 +++++++++++ .../nutridb/util/NutriDbConverters.java | 79 +++++++++++++++++++ globodiet/connectors/pom.xml | 38 +++++++++ globodiet/pom.xml | 1 + globodiet/survey/pom.xml | 6 ++ .../survey/DitaGdSurveyIntegrationTest.java | 49 ------------ .../InterviewXmlParserIntegrationTest.java | 9 ++- pom.xml | 12 +-- 8 files changed, 181 insertions(+), 58 deletions(-) create mode 100644 globodiet/connectors/nutridb/pom.xml create mode 100644 globodiet/connectors/nutridb/src/main/java/dita/globodiet/connectors/nutridb/util/NutriDbConverters.java create mode 100644 globodiet/connectors/pom.xml diff --git a/globodiet/connectors/nutridb/pom.xml b/globodiet/connectors/nutridb/pom.xml new file mode 100644 index 00000000..2d2c6841 --- /dev/null +++ b/globodiet/connectors/nutridb/pom.xml @@ -0,0 +1,45 @@ + + + + 4.0.0 + + + at.ac.univie.nutrition.dita + dita-globodiet-connectors + 1.0.0-SNAPSHOT + + + dita-globodiet-connectors-nutridb + Dita - Globodiet Connectors (NutriDb) + + Dita library integrating Globodiet with NutriDb (an external FCDB system). + + + + at.ac.univie.nutrition.dita.nutridb + at/ac/univie/nutrition/dita/nutridb + + + + + + at.ac.univie.nutrition.dita + dita-recall24-dto + + + + + diff --git a/globodiet/connectors/nutridb/src/main/java/dita/globodiet/connectors/nutridb/util/NutriDbConverters.java b/globodiet/connectors/nutridb/src/main/java/dita/globodiet/connectors/nutridb/util/NutriDbConverters.java new file mode 100644 index 00000000..7beb1b26 --- /dev/null +++ b/globodiet/connectors/nutridb/src/main/java/dita/globodiet/connectors/nutridb/util/NutriDbConverters.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package dita.globodiet.connectors.nutridb.util; + +import java.util.stream.Collectors; + +import org.apache.causeway.commons.internal.base._Strings; + +import lombok.experimental.UtilityClass; + +import dita.commons.format.FormatUtils; +import dita.recall24.dto.RecallNode24; +import dita.recall24.dto.RecallNode24.Builder24; +import dita.recall24.dto.Record24; + +@UtilityClass +public class NutriDbConverters { + + @UtilityClass + public class ToNutriDB { + public String convertFacet(final String facetGd) { + var facet = facetGd.substring(0, 2); + var descriptor = facetGd.substring(2); + return "gd:F" + FormatUtils.noLeadingZeros(facet) + "." + descriptor; + } + public String convertFacetList(final String facetSids) { + return _Strings.splitThenStream(facetSids, ",") + .map(ToNutriDB::convertFacet) + .collect(Collectors.joining(",")); + } + public String convertFood(final Record24.Type recordType, final String sid) { + return switch(recordType) { + case FOOD, TYPE_OF_FAT_USED, TYPE_OF_MILK_OR_LIQUID_USED, FRYING_FAT -> + // ndb system-id = 'gd' + "gd:N" + FormatUtils.noLeadingZeros(sid); + case COMPOSITE -> + // ndb system-id = 'gdr' + "gdr:" + FormatUtils.noLeadingZeros(sid); + case PRODUCT -> + // ndb system-id = 'ndb' (supplements only) + "ndb:" + FormatUtils.noLeadingZeros(sid); + }; + } + } + + /** + * Converts GloboDiet to NutriDb identifiers. + */ + public record ToNutriDbTransfomer() implements RecallNode24.Transfomer { + @Override + public void accept(final Builder24 builder) { + switch (builder) { + case Record24.Builder recBuilder -> toNutriDbPrefixes(recBuilder); + default -> {} + }; + } + private void toNutriDbPrefixes(final Record24.Builder recBuilder) { + recBuilder.sid(ToNutriDB.convertFood(recBuilder.type(), recBuilder.sid())); + recBuilder.facetSids(ToNutriDB.convertFacetList(recBuilder.facetSids())); + } + } + +} diff --git a/globodiet/connectors/pom.xml b/globodiet/connectors/pom.xml new file mode 100644 index 00000000..3c677665 --- /dev/null +++ b/globodiet/connectors/pom.xml @@ -0,0 +1,38 @@ + + + + 4.0.0 + + + at.ac.univie.nutrition.dita + dita-globodiet + 1.0.0-SNAPSHOT + + + dita-globodiet-connectors + Dita - Globodiet Connectors + + Globodiet connectors to external systems. + + + pom + + + nutridb + + + + diff --git a/globodiet/pom.xml b/globodiet/pom.xml index c59bfd7f..2e0486cd 100644 --- a/globodiet/pom.xml +++ b/globodiet/pom.xml @@ -33,6 +33,7 @@ manager schema survey + connectors diff --git a/globodiet/survey/pom.xml b/globodiet/survey/pom.xml index 7730df07..ba4608db 100644 --- a/globodiet/survey/pom.xml +++ b/globodiet/survey/pom.xml @@ -113,6 +113,12 @@ additional + + at.ac.univie.nutrition.dita + dita-globodiet-connectors-nutridb + test + + org.apache.causeway.testing causeway-testing-integtestsupport-applib diff --git a/globodiet/survey/src/test/java/dita/globodiet/survey/DitaGdSurveyIntegrationTest.java b/globodiet/survey/src/test/java/dita/globodiet/survey/DitaGdSurveyIntegrationTest.java index 08a0ee26..7a5fe968 100644 --- a/globodiet/survey/src/test/java/dita/globodiet/survey/DitaGdSurveyIntegrationTest.java +++ b/globodiet/survey/src/test/java/dita/globodiet/survey/DitaGdSurveyIntegrationTest.java @@ -19,7 +19,6 @@ package dita.globodiet.survey; import java.util.function.Consumer; -import java.util.stream.Collectors; import java.util.stream.Stream; import jakarta.inject.Inject; @@ -27,22 +26,17 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.lang.Nullable; -import org.apache.causeway.commons.internal.base._Strings; import org.apache.causeway.testing.integtestsupport.applib.CausewayIntegrationTestAbstract; import lombok.NonNull; import dita.commons.food.composition.FoodCompositionRepository; -import dita.commons.format.FormatUtils; import dita.commons.qmap.QualifiedMap; import dita.commons.types.Message; import dita.globodiet.survey.recall24.InterviewXmlParser; import dita.globodiet.survey.util.InterviewUtils; import dita.recall24.dto.Correction24; import dita.recall24.dto.InterviewSet24; -import dita.recall24.dto.RecallNode24; -import dita.recall24.dto.RecallNode24.Builder24; -import dita.recall24.dto.Record24; import dita.recall24.dto.util.Recall24DtoUtils; import io.github.causewaystuff.blobstore.applib.BlobStore; import io.github.causewaystuff.commons.base.types.NamedPath; @@ -82,47 +76,4 @@ protected Stream loadAndStreamInterviews( .map(Recall24DtoUtils.correct(correction)); } - /** - * Converts ingredient identifiers to NutriDb (prefixed) identifiers. - */ - protected RecallNode24.Transfomer nutriDbTransfomer(){ - - record NutriDbTransfomer() implements RecallNode24.Transfomer { - - @Override - public void accept(final Builder24 builder) { - switch (builder) { - case Record24.Builder recBuilder -> toNutriDbPrefixes(recBuilder); - default -> {} - }; - } - private void toNutriDbPrefixes(final Record24.Builder recBuilder) { - switch(recBuilder.type()) { - case FOOD, TYPE_OF_FAT_USED, TYPE_OF_MILK_OR_LIQUID_USED, FRYING_FAT -> { - // ndb system-id = 'gd' - recBuilder.sid("gd:N" + FormatUtils.noLeadingZeros(recBuilder.sid())); - } - case COMPOSITE -> { - // ndb system-id = 'gdr' - recBuilder.sid("gdr:" + FormatUtils.noLeadingZeros(recBuilder.sid())); - } - case PRODUCT -> { - // ndb system-id = 'ndb' (supplements only) - recBuilder.sid("ndb:" + FormatUtils.noLeadingZeros(recBuilder.sid())); - } - } - recBuilder.facetSids(_Strings.splitThenStream(recBuilder.facetSids(), ",") - .map(this::toNutriDbFacet) - .collect(Collectors.joining(","))); - } - private String toNutriDbFacet(final String f) { - var facet = f.substring(0, 2); - var descriptor = f.substring(2); - return "gd:F" + FormatUtils.noLeadingZeros(facet) + "." + descriptor; - } - } - - return new NutriDbTransfomer(); - } - } diff --git a/globodiet/survey/src/test/java/dita/globodiet/survey/recall24/InterviewXmlParserIntegrationTest.java b/globodiet/survey/src/test/java/dita/globodiet/survey/recall24/InterviewXmlParserIntegrationTest.java index fa2c4cf1..7d1c3573 100644 --- a/globodiet/survey/src/test/java/dita/globodiet/survey/recall24/InterviewXmlParserIntegrationTest.java +++ b/globodiet/survey/src/test/java/dita/globodiet/survey/recall24/InterviewXmlParserIntegrationTest.java @@ -32,6 +32,7 @@ import dita.commons.qmap.QualifiedMap; import dita.commons.qmap.QualifiedMap.QualifiedMapKey; import dita.commons.qmap.QualifiedMapEntry; +import dita.globodiet.connectors.nutridb.util.NutriDbConverters; import dita.globodiet.survey.DitaGdSurveyIntegrationTest; import dita.globodiet.survey.DitaTestModuleGdSurvey; import dita.globodiet.survey.PrivateDataTest; @@ -54,9 +55,11 @@ class InterviewXmlParserIntegrationTest extends DitaGdSurveyIntegrationTest { @Test void parsingFromBlobStore() { + final var systemId = "GD-AT20240507"; + var nutMapping = loadNutMapping(); var stats = new Recall24SummaryStatistics(); - var recordProcessor = new RecordProcessor(stats, "GD-AT20240507", nutMapping); + var recordProcessor = new RecordProcessor(stats, systemId, nutMapping); var correction = Correction24.tryFromYaml(""" respondents: @@ -77,9 +80,9 @@ void parsingFromBlobStore() { var interviewSet = InterviewUtils .interviewSetFromBlobStrore(NamedPath.of("at-national-2026"), surveyBlobStore, correction, null) - .transform(nutriDbTransfomer()); + .transform(new NutriDbConverters.ToNutriDbTransfomer()); - var todoReporter = new TodoReportUtils.TodoReporter("GD-AT20240507", nutMapping, interviewSet); + var todoReporter = new TodoReportUtils.TodoReporter(systemId, nutMapping, interviewSet); todoReporter.report( factoryService, DataSink.ofFile(new File("d:/tmp/_scratch/mapping-todos.txt"))); diff --git a/pom.xml b/pom.xml index 9c71552f..40ad4583 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,7 @@ additional org.apache.maven.plugins maven-surefire-plugin + 3.3.0 false ${surefire-plugin.argLine} @@ -188,22 +189,20 @@ additional dita-globodiet-schema 1.0.0-SNAPSHOT - - at.ac.univie.nutrition.dita - dita-recall24-dto + dita-globodiet-connectors-nutridb 1.0.0-SNAPSHOT + at.ac.univie.nutrition.dita - dita-recall24-reporter + dita-recall24-dto 1.0.0-SNAPSHOT - at.ac.univie.nutrition.dita - dita-vault + dita-recall24-reporter 1.0.0-SNAPSHOT @@ -434,6 +433,7 @@ additional causeway foodex globodiet + nutridb