From 6a9ee4ea97dad2149fdfcb5b98a0cb965776c246 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 2 Jun 2023 10:57:11 +0200 Subject: [PATCH 001/114] Update for next development version --- pom.xml | 2 +- sdmx-dl-api/pom.xml | 2 +- sdmx-dl-bom/pom.xml | 2 +- sdmx-dl-cli/pom.xml | 2 +- sdmx-dl-desktop/pom.xml | 2 +- sdmx-dl-format-base/pom.xml | 2 +- sdmx-dl-format-csv/pom.xml | 2 +- sdmx-dl-format-kryo/pom.xml | 2 +- sdmx-dl-format-protobuf/pom.xml | 2 +- sdmx-dl-format-xml/pom.xml | 2 +- sdmx-dl-grpc/pom.xml | 2 +- sdmx-dl-provider-base/pom.xml | 2 +- sdmx-dl-provider-connectors/pom.xml | 2 +- sdmx-dl-provider-ri/pom.xml | 2 +- sdmx-dl-testing/pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 072a66754..95a91489a 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT pom sdmx-dl diff --git a/sdmx-dl-api/pom.xml b/sdmx-dl-api/pom.xml index f2bb35dc3..f779e5b59 100644 --- a/sdmx-dl-api/pom.xml +++ b/sdmx-dl-api/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-api diff --git a/sdmx-dl-bom/pom.xml b/sdmx-dl-bom/pom.xml index 5f12ff80a..ae6e97f69 100644 --- a/sdmx-dl-bom/pom.xml +++ b/sdmx-dl-bom/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-bom diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index ce8bc583e..a2719aa1a 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-cli diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 3389a3390..49be4917a 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-desktop diff --git a/sdmx-dl-format-base/pom.xml b/sdmx-dl-format-base/pom.xml index 8f2f970d9..08a7e29b4 100644 --- a/sdmx-dl-format-base/pom.xml +++ b/sdmx-dl-format-base/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-format-base diff --git a/sdmx-dl-format-csv/pom.xml b/sdmx-dl-format-csv/pom.xml index 75c8aefe8..75f3beed0 100644 --- a/sdmx-dl-format-csv/pom.xml +++ b/sdmx-dl-format-csv/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-format-csv diff --git a/sdmx-dl-format-kryo/pom.xml b/sdmx-dl-format-kryo/pom.xml index 14061ee40..7ca8dc0be 100644 --- a/sdmx-dl-format-kryo/pom.xml +++ b/sdmx-dl-format-kryo/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-format-kryo diff --git a/sdmx-dl-format-protobuf/pom.xml b/sdmx-dl-format-protobuf/pom.xml index c31294719..c434ce1ea 100644 --- a/sdmx-dl-format-protobuf/pom.xml +++ b/sdmx-dl-format-protobuf/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-format-protobuf diff --git a/sdmx-dl-format-xml/pom.xml b/sdmx-dl-format-xml/pom.xml index 47d032600..c2b7d7f02 100644 --- a/sdmx-dl-format-xml/pom.xml +++ b/sdmx-dl-format-xml/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-format-xml diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index be3fa1d6a..742dcdceb 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-grpc diff --git a/sdmx-dl-provider-base/pom.xml b/sdmx-dl-provider-base/pom.xml index 22865b058..e5a0efc24 100644 --- a/sdmx-dl-provider-base/pom.xml +++ b/sdmx-dl-provider-base/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-provider-base diff --git a/sdmx-dl-provider-connectors/pom.xml b/sdmx-dl-provider-connectors/pom.xml index a97fb00ed..71df8ea12 100644 --- a/sdmx-dl-provider-connectors/pom.xml +++ b/sdmx-dl-provider-connectors/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-provider-connectors diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index e4e335bc2..b1b8b40d4 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-provider-ri diff --git a/sdmx-dl-testing/pom.xml b/sdmx-dl-testing/pom.xml index 8b3df9986..a16342f9b 100644 --- a/sdmx-dl-testing/pom.xml +++ b/sdmx-dl-testing/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.11 + 3.0.0-beta.12-SNAPSHOT sdmx-dl-testing From 6ac49e1e1ed98d45b79cd46aafaa1f47f87ce393 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 5 Jun 2023 10:41:35 +0200 Subject: [PATCH 002/114] Fix descriptions in pom files --- pom.xml | 2 +- sdmx-dl-api/pom.xml | 2 +- sdmx-dl-bom/pom.xml | 2 +- sdmx-dl-cli/pom.xml | 2 +- sdmx-dl-desktop/pom.xml | 2 +- sdmx-dl-format-base/pom.xml | 2 +- sdmx-dl-format-csv/pom.xml | 2 +- sdmx-dl-format-kryo/pom.xml | 2 +- sdmx-dl-format-protobuf/pom.xml | 2 +- sdmx-dl-format-xml/pom.xml | 2 +- sdmx-dl-grpc/pom.xml | 2 +- sdmx-dl-provider-base/pom.xml | 2 +- sdmx-dl-provider-connectors/pom.xml | 2 +- sdmx-dl-provider-ri/pom.xml | 2 +- sdmx-dl-testing/pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 95a91489a..947be66bd 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ pom sdmx-dl - Download SDMX data + Easily download official statistics https://github.com/nbbrd/sdmx-dl 2020 diff --git a/sdmx-dl-api/pom.xml b/sdmx-dl-api/pom.xml index f779e5b59..9fd33dd75 100644 --- a/sdmx-dl-api/pom.xml +++ b/sdmx-dl-api/pom.xml @@ -13,7 +13,7 @@ jar sdmx-dl-api - Download SDMX data - API + Easily download official statistics - API https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-bom/pom.xml b/sdmx-dl-bom/pom.xml index ae6e97f69..2def4890a 100644 --- a/sdmx-dl-bom/pom.xml +++ b/sdmx-dl-bom/pom.xml @@ -14,7 +14,7 @@ pom sdmx-dl-bom - Download SDMX data - Bill of Materials + Easily download official statistics - Bill of Materials https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index a2719aa1a..7124e38db 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-cli - Download SDMX data - CLI + Easily download official statistics - CLI https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 49be4917a..99278a1b4 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-desktop - Download SDMX data - Desktop + Easily download official statistics - Desktop https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-format-base/pom.xml b/sdmx-dl-format-base/pom.xml index 08a7e29b4..a943b63f1 100644 --- a/sdmx-dl-format-base/pom.xml +++ b/sdmx-dl-format-base/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-format-base - Download SDMX data - Format + Easily download official statistics - Format https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-format-csv/pom.xml b/sdmx-dl-format-csv/pom.xml index 75f3beed0..7096586e5 100644 --- a/sdmx-dl-format-csv/pom.xml +++ b/sdmx-dl-format-csv/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-format-csv - Download SDMX data - CSV + Easily download official statistics - CSV https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-format-kryo/pom.xml b/sdmx-dl-format-kryo/pom.xml index 7ca8dc0be..5fc1f960c 100644 --- a/sdmx-dl-format-kryo/pom.xml +++ b/sdmx-dl-format-kryo/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-format-kryo - Download SDMX data - Kryo + Easily download official statistics - Kryo https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-format-protobuf/pom.xml b/sdmx-dl-format-protobuf/pom.xml index c434ce1ea..5897aceb0 100644 --- a/sdmx-dl-format-protobuf/pom.xml +++ b/sdmx-dl-format-protobuf/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-format-protobuf - Download SDMX data - Protocol Buffers + Easily download official statistics - Protocol Buffers https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-format-xml/pom.xml b/sdmx-dl-format-xml/pom.xml index c2b7d7f02..b62c65949 100644 --- a/sdmx-dl-format-xml/pom.xml +++ b/sdmx-dl-format-xml/pom.xml @@ -13,7 +13,7 @@ jar sdmx-dl-format-xml - Download SDMX data - XML + Easily download official statistics - XML https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 742dcdceb..0229c1b9d 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-grpc - Download SDMX data - GRPC + Easily download official statistics - GRPC https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-provider-base/pom.xml b/sdmx-dl-provider-base/pom.xml index e5a0efc24..cb07bc2e4 100644 --- a/sdmx-dl-provider-base/pom.xml +++ b/sdmx-dl-provider-base/pom.xml @@ -13,7 +13,7 @@ jar sdmx-dl-provider-base - Download SDMX data - Provider + Easily download official statistics - Provider https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-provider-connectors/pom.xml b/sdmx-dl-provider-connectors/pom.xml index 71df8ea12..5279f3052 100644 --- a/sdmx-dl-provider-connectors/pom.xml +++ b/sdmx-dl-provider-connectors/pom.xml @@ -13,7 +13,7 @@ jar sdmx-dl-provider-connectors - Download SDMX data - Connectors + Easily download official statistics - Connectors https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index b1b8b40d4..b1aca251e 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -13,7 +13,7 @@ jar sdmx-dl-provider-ri - Download SDMX data - RI + Easily download official statistics - RI https://github.com/nbbrd/sdmx-dl diff --git a/sdmx-dl-testing/pom.xml b/sdmx-dl-testing/pom.xml index a16342f9b..1d82a4e00 100644 --- a/sdmx-dl-testing/pom.xml +++ b/sdmx-dl-testing/pom.xml @@ -14,7 +14,7 @@ jar sdmx-dl-testing - Download SDMX data - Testing + Easily download official statistics - Testing https://github.com/nbbrd/sdmx-dl From c23a6fe24113b6fbe9fd029ceab5b21062085158 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 04:57:42 +0000 Subject: [PATCH 003/114] Bump picocli.version from 4.7.3 to 4.7.4 Bumps `picocli.version` from 4.7.3 to 4.7.4. Updates `picocli` from 4.7.3 to 4.7.4 - [Release notes](https://github.com/remkop/picocli/releases) - [Changelog](https://github.com/remkop/picocli/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/remkop/picocli/compare/v4.7.3...v4.7.4) Updates `picocli-codegen` from 4.7.3 to 4.7.4 - [Release notes](https://github.com/remkop/picocli/releases) - [Changelog](https://github.com/remkop/picocli/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/remkop/picocli/compare/v4.7.3...v4.7.4) --- updated-dependencies: - dependency-name: info.picocli:picocli dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: info.picocli:picocli-codegen dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 947be66bd..4b3662180 100644 --- a/pom.xml +++ b/pom.xml @@ -284,7 +284,7 @@ 1.18.28 1.6.1 1.4.0 - 4.7.3 + 4.7.4 From 156d21d7e2eafd7da869f1ff4d16160c7b15bb49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 06:44:16 +0000 Subject: [PATCH 004/114] Bump gitflow-maven-plugin from 1.19.0 to 1.20.0 Bumps [gitflow-maven-plugin](https://github.com/aleksandr-m/gitflow-maven-plugin) from 1.19.0 to 1.20.0. - [Release notes](https://github.com/aleksandr-m/gitflow-maven-plugin/releases) - [Changelog](https://github.com/aleksandr-m/gitflow-maven-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/aleksandr-m/gitflow-maven-plugin/compare/v1.19.0...v1.20.0) --- updated-dependencies: - dependency-name: com.amashchenko.maven.plugin:gitflow-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4b3662180..94d622096 100644 --- a/pom.xml +++ b/pom.xml @@ -585,7 +585,7 @@ com.amashchenko.maven.plugin gitflow-maven-plugin - 1.19.0 + 1.20.0 v From d9a63856e6603e695ab18bb697ce3c0d459db685 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 06:14:30 +0000 Subject: [PATCH 005/114] Bump extra-enforcer-rules from 1.6.2 to 1.7.0 Bumps [extra-enforcer-rules](https://github.com/mojohaus/extra-enforcer-rules) from 1.6.2 to 1.7.0. - [Release notes](https://github.com/mojohaus/extra-enforcer-rules/releases) - [Commits](https://github.com/mojohaus/extra-enforcer-rules/compare/1.6.2...1.7.0) --- updated-dependencies: - dependency-name: org.codehaus.mojo:extra-enforcer-rules dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 94d622096..32dcdfa8e 100644 --- a/pom.xml +++ b/pom.xml @@ -452,7 +452,7 @@ org.codehaus.mojo extra-enforcer-rules - 1.6.2 + 1.7.0 From a5ae1e72236eb2f10fdb12deab0d037cd1617687 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Jun 2023 04:57:30 +0000 Subject: [PATCH 006/114] Bump checker-qual from 3.34.0 to 3.35.0 Bumps [checker-qual](https://github.com/typetools/checker-framework) from 3.34.0 to 3.35.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.34.0...checker-framework-3.35.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker-qual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 32dcdfa8e..6f607cacc 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.checkerframework checker-qual - 3.34.0 + 3.35.0 From b29170ecc838067deae93520039b362678344c42 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 6 Jun 2023 10:23:20 +0200 Subject: [PATCH 007/114] Migrate gRPC module to Quarkus framework --- CHANGELOG.md | 4 + pom.xml | 12 +- .../debug.proto => sdmxdl_debug.proto} | 4 +- .../monitor.proto => sdmxdl_monitor.proto} | 0 ...pository.proto => sdmxdl_repository.proto} | 0 .../source.proto => sdmxdl_source.proto} | 0 sdmx-dl-grpc/.dockerignore | 5 + sdmx-dl-grpc/pom.xml | 231 ++++++++---------- sdmx-dl-grpc/src/main/docker/Dockerfile.jvm | 95 +++++++ .../src/main/docker/Dockerfile.legacy-jar | 91 +++++++ .../src/main/docker/Dockerfile.native | 27 ++ .../src/main/docker/Dockerfile.native-micro | 30 +++ .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 1 + .../main/java/sdmxdl/grpc/LocalhostOnly.java | 6 +- .../sdmxdl/grpc/SdmxWebManagerService.java | 91 ++++--- .../main/java/sdmxdl/grpc/ServiceDemo.java | 58 ----- .../grpc/demo.proto => sdmxdl_grpc.proto} | 6 +- .../src/main/resources/application.properties | 7 + .../grpc/SdmxWebManagerServiceTest.java | 28 +++ .../test/java/sdmxdl/grpc/ServiceDemo.java | 41 ---- 20 files changed, 450 insertions(+), 287 deletions(-) rename sdmx-dl-cli/src/main/proto/{sdmxdl/cli/protobuf/debug.proto => sdmxdl_debug.proto} (92%) rename sdmx-dl-format-protobuf/src/main/proto/{sdmxdl/format/protobuf/monitor.proto => sdmxdl_monitor.proto} (100%) rename sdmx-dl-format-protobuf/src/main/proto/{sdmxdl/format/protobuf/repository.proto => sdmxdl_repository.proto} (100%) rename sdmx-dl-format-protobuf/src/main/proto/{sdmxdl/format/protobuf/source.proto => sdmxdl_source.proto} (100%) create mode 100644 sdmx-dl-grpc/.dockerignore create mode 100644 sdmx-dl-grpc/src/main/docker/Dockerfile.jvm create mode 100644 sdmx-dl-grpc/src/main/docker/Dockerfile.legacy-jar create mode 100644 sdmx-dl-grpc/src/main/docker/Dockerfile.native create mode 100644 sdmx-dl-grpc/src/main/docker/Dockerfile.native-micro delete mode 100644 sdmx-dl-grpc/src/main/java/sdmxdl/grpc/ServiceDemo.java rename sdmx-dl-grpc/src/main/proto/{sdmxdl/grpc/demo.proto => sdmxdl_grpc.proto} (85%) create mode 100644 sdmx-dl-grpc/src/main/resources/application.properties create mode 100644 sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java delete mode 100644 sdmx-dl-grpc/src/test/java/sdmxdl/grpc/ServiceDemo.java diff --git a/CHANGELOG.md b/CHANGELOG.md index aec38f1cc..601548bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Changed + +- ![GRPC] Migrate gRPC module to Quarkus framework + ## [3.0.0-beta.11] - 2023-06-02 This is the eleventh beta release of **sdmx-dl**. diff --git a/pom.xml b/pom.xml index 6f607cacc..63262f02c 100644 --- a/pom.xml +++ b/pom.xml @@ -240,12 +240,22 @@ sdmx-dl-provider-connectors sdmx-dl-testing sdmx-dl-cli - sdmx-dl-grpc sdmx-dl-desktop sdmx-dl-bom + + + java17-modules + + [17,) + + + sdmx-dl-grpc + + + base-java8 diff --git a/sdmx-dl-cli/src/main/proto/sdmxdl/cli/protobuf/debug.proto b/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto similarity index 92% rename from sdmx-dl-cli/src/main/proto/sdmxdl/cli/protobuf/debug.proto rename to sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto index 8c9fc1183..2d7cb85db 100644 --- a/sdmx-dl-cli/src/main/proto/sdmxdl/cli/protobuf/debug.proto +++ b/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto @@ -1,8 +1,8 @@ syntax = "proto3"; option java_multiple_files = true; -import "sdmxdl/format/protobuf/repository.proto"; -import "sdmxdl/format/protobuf/source.proto"; +import "sdmxdl_repository.proto"; +import "sdmxdl_source.proto"; package sdmxdl.cli.protobuf; diff --git a/sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/monitor.proto b/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_monitor.proto similarity index 100% rename from sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/monitor.proto rename to sdmx-dl-format-protobuf/src/main/proto/sdmxdl_monitor.proto diff --git a/sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/repository.proto b/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_repository.proto similarity index 100% rename from sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/repository.proto rename to sdmx-dl-format-protobuf/src/main/proto/sdmxdl_repository.proto diff --git a/sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/source.proto b/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto similarity index 100% rename from sdmx-dl-format-protobuf/src/main/proto/sdmxdl/format/protobuf/source.proto rename to sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto diff --git a/sdmx-dl-grpc/.dockerignore b/sdmx-dl-grpc/.dockerignore new file mode 100644 index 000000000..94810d006 --- /dev/null +++ b/sdmx-dl-grpc/.dockerignore @@ -0,0 +1,5 @@ +* +!target/*-runner +!target/*-runner.jar +!target/lib/* +!target/quarkus-app/* \ No newline at end of file diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 0229c1b9d..670de0066 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -18,17 +18,22 @@ https://github.com/nbbrd/sdmx-dl - sdmxdl.grpc.ServiceDemo - 3.21.5 - 1.55.1 + 17 + UTF-8 + UTF-8 + quarkus-bom + io.quarkus.platform + 3.1.0.Final + true + true - io.grpc - grpc-bom - ${grpc.version} + ${quarkus.platform.group-id} + ${quarkus.platform.artifact-id} + ${quarkus.platform.version} pom import @@ -37,33 +42,17 @@ - - org.checkerframework - checker-qual - provided - org.projectlombok lombok provided - - com.github.nbbrd.java-design-util - java-design-processor - provided - com.github.nbbrd.sdmx-dl sdmx-dl-format-protobuf ${project.version} - - - com.google.code.gson - gson - - com.github.nbbrd.sdmx-dl @@ -71,146 +60,120 @@ ${project.version} - io.grpc - grpc-netty - - - com.google.guava - guava - - - com.google.errorprone - error_prone_annotations - - - com.google.code.gson - gson - - - - - io.grpc - grpc-protobuf - - - com.google.guava - guava - - - com.google.protobuf - protobuf-java - - - - - io.grpc - grpc-stub - - - com.google.guava - guava - - + io.quarkus + quarkus-grpc - - org.apache.tomcat - annotations-api - 6.0.53 - provided + io.quarkus + quarkus-arc + + - - io.grpc - grpc-services - - - com.google.guava - guava - - - com.google.protobuf - protobuf-java - - - com.google.protobuf - protobuf-java-util - - - com.google.errorprone - error_prone_annotations - - - com.google.code.gson - gson - - + io.quarkus + quarkus-junit5 + test - info.picocli - picocli + org.assertj + assertj-core + test - org.xolstice.maven.plugins - protobuf-maven-plugin - - com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} - grpc-java - io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier} - + ${quarkus.platform.group-id} + quarkus-maven-plugin + ${quarkus.platform.version} + true - compile - compile-custom + build + generate-code + generate-code-tests - - org.apache.maven.plugins - maven-shade-plugin + maven-compiler-plugin + + + -parameters + + + - package - - shade - + default-compile + + ${maven.compiler.release} + + + + base-compile + + true + + + + default-testCompile + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-surefire-plugin - - - *:* - - **/module-info.class - META-INF/MANIFEST.MF - META-INF/NOTICE - META-INF/LICENSE - META-INF/LICENSE.txt - META-INF/io.netty.versions.properties - - - - - - - ${project.x.mainClass} - - - true - bin - false + + org.jboss.logmanager.LogManager + ${maven.home} + + + org.apache.maven.plugins + maven-failsafe-plugin + 3.1.0 + + + + integration-test + verify + + + + ${project.build.directory}/${project.build.finalName}-runner + + org.jboss.logmanager.LogManager + ${maven.home} + + + + + + + + + native + + + native + + + + false + native + + + \ No newline at end of file diff --git a/sdmx-dl-grpc/src/main/docker/Dockerfile.jvm b/sdmx-dl-grpc/src/main/docker/Dockerfile.jvm new file mode 100644 index 000000000..5f5f3c888 --- /dev/null +++ b/sdmx-dl-grpc/src/main/docker/Dockerfile.jvm @@ -0,0 +1,95 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/jdplus-tool-jvm . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool-jvm +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool-jvm +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 + +ENV LANGUAGE='en_US:en' + + +# We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=185 target/quarkus-app/lib/ /deployments/lib/ +COPY --chown=185 target/quarkus-app/*.jar /deployments/ +COPY --chown=185 target/quarkus-app/app/ /deployments/app/ +COPY --chown=185 target/quarkus-app/quarkus/ /deployments/quarkus/ + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" + diff --git a/sdmx-dl-grpc/src/main/docker/Dockerfile.legacy-jar b/sdmx-dl-grpc/src/main/docker/Dockerfile.legacy-jar new file mode 100644 index 000000000..ae278175f --- /dev/null +++ b/sdmx-dl-grpc/src/main/docker/Dockerfile.legacy-jar @@ -0,0 +1,91 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode +# +# Before building the container image run: +# +# ./mvnw package -Dquarkus.package.type=legacy-jar +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.legacy-jar -t quarkus/jdplus-tool-legacy-jar . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool-legacy-jar +# +# If you want to include the debug port into your docker image +# you will have to expose the debug port (default 5005 being the default) like this : EXPOSE 8080 5005. +# Additionally you will have to set -e JAVA_DEBUG=true and -e JAVA_DEBUG_PORT=*:5005 +# when running the container +# +# Then run the container using : +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool-legacy-jar +# +# This image uses the `run-java.sh` script to run the application. +# This scripts computes the command line to execute your Java application, and +# includes memory/GC tuning. +# You can configure the behavior using the following environment properties: +# - JAVA_OPTS: JVM options passed to the `java` command (example: "-verbose:class") +# - JAVA_OPTS_APPEND: User specified Java options to be appended to generated options +# in JAVA_OPTS (example: "-Dsome.property=foo") +# - JAVA_MAX_MEM_RATIO: Is used when no `-Xmx` option is given in JAVA_OPTS. This is +# used to calculate a default maximal heap memory based on a containers restriction. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xmx` is set to a ratio +# of the container available memory as set here. The default is `50` which means 50% +# of the available memory is used as an upper boundary. You can skip this mechanism by +# setting this value to `0` in which case no `-Xmx` option is added. +# - JAVA_INITIAL_MEM_RATIO: Is used when no `-Xms` option is given in JAVA_OPTS. This +# is used to calculate a default initial heap memory based on the maximum heap memory. +# If used in a container without any memory constraints for the container then this +# option has no effect. If there is a memory constraint then `-Xms` is set to a ratio +# of the `-Xmx` memory as set here. The default is `25` which means 25% of the `-Xmx` +# is used as the initial heap size. You can skip this mechanism by setting this value +# to `0` in which case no `-Xms` option is added (example: "25") +# - JAVA_MAX_INITIAL_MEM: Is used when no `-Xms` option is given in JAVA_OPTS. +# This is used to calculate the maximum value of the initial heap memory. If used in +# a container without any memory constraints for the container then this option has +# no effect. If there is a memory constraint then `-Xms` is limited to the value set +# here. The default is 4096MB which means the calculated value of `-Xms` never will +# be greater than 4096MB. The value of this variable is expressed in MB (example: "4096") +# - JAVA_DIAGNOSTICS: Set this to get some diagnostics information to standard output +# when things are happening. This option, if set to true, will set +# `-XX:+UnlockDiagnosticVMOptions`. Disabled by default (example: "true"). +# - JAVA_DEBUG: If set remote debugging will be switched on. Disabled by default (example: +# true"). +# - JAVA_DEBUG_PORT: Port used for remote debugging. Defaults to 5005 (example: "8787"). +# - CONTAINER_CORE_LIMIT: A calculated core limit as described in +# https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt. (example: "2") +# - CONTAINER_MAX_MEMORY: Memory limit given to the container (example: "1024"). +# - GC_MIN_HEAP_FREE_RATIO: Minimum percentage of heap free after GC to avoid expansion. +# (example: "20") +# - GC_MAX_HEAP_FREE_RATIO: Maximum percentage of heap free after GC to avoid shrinking. +# (example: "40") +# - GC_TIME_RATIO: Specifies the ratio of the time spent outside the garbage collection. +# (example: "4") +# - GC_ADAPTIVE_SIZE_POLICY_WEIGHT: The weighting given to the current GC time versus +# previous GC times. (example: "90") +# - GC_METASPACE_SIZE: The initial metaspace size. (example: "20") +# - GC_MAX_METASPACE_SIZE: The maximum metaspace size. (example: "100") +# - GC_CONTAINER_OPTIONS: Specify Java GC to use. The value of this variable should +# contain the necessary JRE command-line options to specify the required GC, which +# will override the default of `-XX:+UseParallelGC` (example: -XX:+UseG1GC). +# - HTTPS_PROXY: The location of the https proxy. (example: "myuser@127.0.0.1:8080") +# - HTTP_PROXY: The location of the http proxy. (example: "myuser@127.0.0.1:8080") +# - NO_PROXY: A comma separated lists of hosts, IP addresses or domains that can be +# accessed directly. (example: "foo.example.com,bar.example.com") +# +### +FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 + +ENV LANGUAGE='en_US:en' + + +COPY target/lib/* /deployments/lib/ +COPY target/*-runner.jar /deployments/quarkus-run.jar + +EXPOSE 8080 +USER 185 +ENV JAVA_OPTS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" +ENV JAVA_APP_JAR="/deployments/quarkus-run.jar" diff --git a/sdmx-dl-grpc/src/main/docker/Dockerfile.native b/sdmx-dl-grpc/src/main/docker/Dockerfile.native new file mode 100644 index 000000000..998dea486 --- /dev/null +++ b/sdmx-dl-grpc/src/main/docker/Dockerfile.native @@ -0,0 +1,27 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# +# Before building the container image run: +# +# ./mvnw package -Pnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native -t quarkus/jdplus-tool . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool +# +### +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.6 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/sdmx-dl-grpc/src/main/docker/Dockerfile.native-micro b/sdmx-dl-grpc/src/main/docker/Dockerfile.native-micro new file mode 100644 index 000000000..7d84843af --- /dev/null +++ b/sdmx-dl-grpc/src/main/docker/Dockerfile.native-micro @@ -0,0 +1,30 @@ +#### +# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode. +# It uses a micro base image, tuned for Quarkus native executables. +# It reduces the size of the resulting container image. +# Check https://quarkus.io/guides/quarkus-runtime-base-image for further information about this image. +# +# Before building the container image run: +# +# ./mvnw package -Pnative +# +# Then, build the image with: +# +# docker build -f src/main/docker/Dockerfile.native-micro -t quarkus/jdplus-tool . +# +# Then run the container using: +# +# docker run -i --rm -p 8080:8080 quarkus/jdplus-tool +# +### +FROM quay.io/quarkus/quarkus-micro-image:2.0 +WORKDIR /work/ +RUN chown 1001 /work \ + && chmod "g+rwX" /work \ + && chown 1001:root /work +COPY --chown=1001:root target/*-runner /work/application + +EXPOSE 8080 +USER 1001 + +CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index 2590c0b21..e570d2f1a 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -4,6 +4,7 @@ import lombok.NonNull; import sdmxdl.ext.Cache; import sdmxdl.format.FileFormat; +import sdmxdl.format.protobuf.ProtobufProvider; import sdmxdl.format.spi.FileFormatProvider; import sdmxdl.format.spi.FileFormatProviderLoader; import sdmxdl.provider.ext.FileCache; diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/LocalhostOnly.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/LocalhostOnly.java index 7ddd82692..5c9f8c58e 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/LocalhostOnly.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/LocalhostOnly.java @@ -1,11 +1,15 @@ package sdmxdl.grpc; import io.grpc.*; +import io.quarkus.grpc.GlobalInterceptor; +import jakarta.enterprise.context.ApplicationScoped; import java.net.InetSocketAddress; import java.net.SocketAddress; -final class LocalhostOnly implements ServerInterceptor { +@ApplicationScoped +@GlobalInterceptor +public class LocalhostOnly implements ServerInterceptor { @Override public ServerCall.Listener interceptCall(ServerCall serverCall, Metadata metadata, ServerCallHandler serverCallHandler) { diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java index 3e1c235a1..b6df08d4c 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java @@ -1,6 +1,8 @@ package sdmxdl.grpc; -import io.grpc.stub.StreamObserver; +import io.quarkus.grpc.GrpcService; +import io.smallrye.mutiny.Multi; +import io.smallrye.mutiny.Uni; import sdmxdl.Connection; import sdmxdl.DataflowRef; import sdmxdl.Key; @@ -10,88 +12,83 @@ import sdmxdl.web.SdmxWebManager; import java.io.IOException; -import java.util.stream.Stream; -import static sdmxdl.format.protobuf.ProtobufRepositories.*; +@GrpcService +public class SdmxWebManagerService implements sdmxdl.grpc.SdmxWebManager { -@lombok.AllArgsConstructor -class SdmxWebManagerService extends SdmxWebManagerGrpc.SdmxWebManagerImplBase { - - @lombok.NonNull - private final SdmxWebManager manager; - - @Override - public void getSources(Empty request, StreamObserver response) { - manager.getSources() - .values() - .stream() - .map(ProtobufSources::fromWebSource) - .forEach(response::onNext); - response.onCompleted(); - } + private final SdmxWebManager manager = GrpcWebFactory.loadManager(); @Override - public void getMonitorReport(SourceRequest request, StreamObserver response) { + public Uni getMonitorReport(SourceRequest request) { try { - response.onNext(ProtobufMonitors.fromMonitorReport(manager.getMonitorReport(request.getSource()))); - response.onCompleted(); + return Uni.createFrom() + .item(manager.getMonitorReport(request.getSource())) + .map(ProtobufMonitors::fromMonitorReport); } catch (IOException ex) { - response.onError(ex); + return Uni.createFrom().failure(ex); } } @Override - public void getFlows(SourceRequest request, StreamObserver response) { + public Uni getFlow(FlowRequest request) { try (Connection connection = manager.getConnection(request.getSource())) { - connection.getFlows() - .stream() - .map(ProtobufRepositories::fromDataflow) - .forEach(response::onNext); - response.onCompleted(); + return Uni.createFrom() + .item(connection.getFlow(DataflowRef.parse(request.getFlow()))) + .map(ProtobufRepositories::fromDataflow); } catch (IOException ex) { - response.onError(ex); + return Uni.createFrom().failure(ex); } } @Override - public void getFlow(FlowRequest request, StreamObserver response) { + public Uni getStructure(FlowRequest request) { try (Connection connection = manager.getConnection(request.getSource())) { - response.onNext(fromDataflow(connection.getFlow(DataflowRef.parse(request.getFlow())))); - response.onCompleted(); + return Uni.createFrom() + .item(connection.getStructure(DataflowRef.parse(request.getFlow()))) + .map(ProtobufRepositories::fromDataStructure); } catch (IOException ex) { - response.onError(ex); + return Uni.createFrom().failure(ex); } } @Override - public void getStructure(FlowRequest request, StreamObserver response) { + public Uni getData(KeyRequest request) { try (Connection connection = manager.getConnection(request.getSource())) { - response.onNext(fromDataStructure(connection.getStructure(DataflowRef.parse(request.getFlow())))); - response.onCompleted(); + return Uni.createFrom() + .item(connection.getData(getFlowRef(request), getDataQuery(request))) + .map(ProtobufRepositories::fromDataSet); } catch (IOException ex) { - response.onError(ex); + return Uni.createFrom().failure(ex); } } @Override - public void getData(KeyRequest request, StreamObserver response) { + public Multi getSources(Empty request) { + return Multi.createFrom().items(manager.getSources() + .values() + .stream() + .map(ProtobufSources::fromWebSource)); + } + + @Override + public Multi getFlows(SourceRequest request) { try (Connection connection = manager.getConnection(request.getSource())) { - response.onNext(fromDataSet(connection.getData(getFlowRef(request), getDataQuery(request)))); - response.onCompleted(); + return Multi.createFrom() + .items(connection.getFlows().stream()) + .map(ProtobufRepositories::fromDataflow); } catch (IOException ex) { - response.onError(ex); + return Multi.createFrom().failure(ex); } } @Override - public void getDataStream(KeyRequest request, StreamObserver responseObserver) { + public Multi getDataStream(KeyRequest request) { try (Connection connection = manager.getConnection(request.getSource())) { - try (Stream stream = connection.getDataStream(getFlowRef(request), getDataQuery(request))) { - stream.map(ProtobufRepositories::fromSeries).forEach(responseObserver::onNext); - } - responseObserver.onCompleted(); + return Multi.createFrom() + .items(connection.getData(getFlowRef(request), getDataQuery(request)).getData().stream()) + .map(ProtobufRepositories::fromSeries); } catch (IOException ex) { - responseObserver.onError(ex); + return Multi.createFrom().failure(ex); } } diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/ServiceDemo.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/ServiceDemo.java deleted file mode 100644 index fb94a6f6e..000000000 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/ServiceDemo.java +++ /dev/null @@ -1,58 +0,0 @@ -package sdmxdl.grpc; - -import io.grpc.Server; -import io.grpc.ServerBuilder; -import io.grpc.protobuf.services.ProtoReflectionService; -import picocli.CommandLine; - -import java.util.concurrent.Callable; - -@CommandLine.Command( - name = "sdmx-dl-grpc", - description = "Service that provides sdmx-dl over gRPC.", - scope = CommandLine.ScopeType.INHERIT, - sortOptions = false, - mixinStandardHelpOptions = true, - descriptionHeading = "%n", - parameterListHeading = "%nParameters:%n", - optionListHeading = "%nOptions:%n", - commandListHeading = "%nCommands:%n", - headerHeading = "%n" -) -public class ServiceDemo implements Callable { - - public static void main(String[] args) { - CommandLine cmd = new CommandLine(new ServiceDemo()); - cmd.execute(args); - } - - @CommandLine.Option( - names = {"-p", "--port"}, - description = "Service port", - defaultValue = "4567" - ) - int port; - - @Override - public Void call() throws Exception { - Server server = ServerBuilder - .forPort(port) - .addService(new SdmxWebManagerService(GrpcWebFactory.loadManager())) - .addService(ProtoReflectionService.newInstance()) - .intercept(new LocalhostOnly()) - .build(); - server.start(); - - System.out.println("Server available at localhost:" + port + ""); - System.out.println("Press Ctrl+C to stop"); - - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - System.err.println("Shutting down web server"); - server.shutdown(); - })); - - server.awaitTermination(); - - return null; - } -} diff --git a/sdmx-dl-grpc/src/main/proto/sdmxdl/grpc/demo.proto b/sdmx-dl-grpc/src/main/proto/sdmxdl_grpc.proto similarity index 85% rename from sdmx-dl-grpc/src/main/proto/sdmxdl/grpc/demo.proto rename to sdmx-dl-grpc/src/main/proto/sdmxdl_grpc.proto index a7a97f2f2..7b1b7b844 100644 --- a/sdmx-dl-grpc/src/main/proto/sdmxdl/grpc/demo.proto +++ b/sdmx-dl-grpc/src/main/proto/sdmxdl_grpc.proto @@ -3,9 +3,9 @@ option java_multiple_files = true; package sdmxdl.grpc; -import "sdmxdl/format/protobuf/monitor.proto"; -import "sdmxdl/format/protobuf/repository.proto"; -import "sdmxdl/format/protobuf/source.proto"; +import "sdmxdl_monitor.proto"; +import "sdmxdl_repository.proto"; +import "sdmxdl_source.proto"; service SdmxWebManager { diff --git a/sdmx-dl-grpc/src/main/resources/application.properties b/sdmx-dl-grpc/src/main/resources/application.properties new file mode 100644 index 000000000..f729203de --- /dev/null +++ b/sdmx-dl-grpc/src/main/resources/application.properties @@ -0,0 +1,7 @@ +quarkus.native.auto-service-loader-registration=true +quarkus.generate-code.grpc.scan-for-imports=com.github.nbbrd.sdmx-dl:sdmx-dl-format-protobuf +quarkus.grpc.server.enable-reflection-service=true +#quarkus.grpc.server.use-separate-server=false +quarkus.grpc.server.host=127.0.0.1 +quarkus.grpc.server.port=4568 +%prod.quarkus.http.host-enabled=false diff --git a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java new file mode 100644 index 000000000..1fe08a1e6 --- /dev/null +++ b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java @@ -0,0 +1,28 @@ +package sdmxdl.grpc; + +import io.quarkus.grpc.GrpcClient; +import io.quarkus.test.junit.QuarkusTest; +import org.junit.jupiter.api.Test; +import sdmxdl.format.protobuf.web.SdmxWebSource; + +import java.time.Duration; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@QuarkusTest +public class SdmxWebManagerServiceTest { + + @GrpcClient + SdmxWebManager grpc; + + @Test + public void testGetSources() { + Empty request = Empty.newBuilder().build(); + List response = grpc.getSources(request).collect().asList().await().atMost(Duration.ofSeconds(5)); + assertThat(response) + .hasSize(34) + .extracting(SdmxWebSource::getId) + .contains("ECB"); + } +} diff --git a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/ServiceDemo.java b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/ServiceDemo.java deleted file mode 100644 index 029e93229..000000000 --- a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/ServiceDemo.java +++ /dev/null @@ -1,41 +0,0 @@ -package sdmxdl.grpc; - -import io.grpc.ManagedChannel; -import io.grpc.ManagedChannelBuilder; -import io.grpc.Server; -import io.grpc.ServerBuilder; - -import java.io.IOException; - -public class ServiceDemo { - - public static void main(String[] args) throws IOException { - - int port = 4567; - - Server server = ServerBuilder - .forPort(port) - .addService(new SdmxWebManagerService(GrpcWebFactory.loadManager())) - .intercept(new LocalhostOnly()) - .build(); - server.start(); - - ManagedChannel channel = ManagedChannelBuilder - .forAddress("localhost", port) - .usePlaintext() - .build(); - - SdmxWebManagerGrpc.SdmxWebManagerBlockingStub stub - = SdmxWebManagerGrpc.newBlockingStub(channel); - - try { - System.out.println(stub.getMonitorReport(SourceRequest.newBuilder().setSource("ECB").build())); - } catch (RuntimeException ex) { - ex.printStackTrace(); - } - - channel.shutdown(); - - server.shutdown(); - } -} From e41cfbe85ccc65a41c8fcb25d5118e6b746b76d4 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 12 Jun 2023 09:11:51 +0200 Subject: [PATCH 008/114] Move curl backend to an external project --- CHANGELOG.md | 1 + pom.xml | 2 +- sdmx-dl-cli/pom.xml | 4 + .../internal/sdmxdl/cli/NetworkOptions.java | 2 +- sdmx-dl-desktop/pom.xml | 4 + .../sdmxdl/desktop/DesktopWebFactory.java | 2 +- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 3 +- .../main/java/internal/http/curl/Curl.java | 241 ------------------ .../http/curl/CurlHttpURLConnection.java | 175 ------------- .../src/main/java/module-info.java | 2 - .../http/curl/CurlHttpURLConnectionTest.java | 227 ----------------- .../java/internal/http/curl/CurlTest.java | 156 ------------ sdmx-dl-provider-ri/pom.xml | 4 + .../util/http/CurlRestClientTest.java | 2 +- 14 files changed, 18 insertions(+), 807 deletions(-) delete mode 100644 sdmx-dl-provider-base/src/main/java/internal/http/curl/Curl.java delete mode 100644 sdmx-dl-provider-base/src/main/java/internal/http/curl/CurlHttpURLConnection.java delete mode 100644 sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlHttpURLConnectionTest.java delete mode 100644 sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 601548bb8..11b91e3b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed +- ![PROVIDER] Move curl backend to an external project - ![GRPC] Migrate gRPC module to Quarkus framework ## [3.0.0-beta.11] - 2023-06-02 diff --git a/pom.xml b/pom.xml index 63262f02c..6f46ecb18 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.22 + 0.0.23 pom import diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 7124e38db..b0e321cc5 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -111,6 +111,10 @@ java-console-properties 1.4.0 + + com.github.nbbrd.java-io-util + java-io-curl + diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java index 8d8a8eb0d..998461374 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java @@ -1,10 +1,10 @@ package internal.sdmxdl.cli; -import internal.http.curl.CurlHttpURLConnection; import internal.sdmxdl.cli.ext.AuthOptions; import internal.sdmxdl.cli.ext.CacheOptions; import internal.sdmxdl.cli.ext.ProxyOptions; import internal.sdmxdl.cli.ext.SslOptions; +import nbbrd.io.curl.CurlHttpURLConnection; import picocli.CommandLine; import sdmxdl.web.URLConnectionFactory; diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 99278a1b4..c590e354d 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -131,6 +131,10 @@ miglayout-swing 5.3 + + com.github.nbbrd.java-io-util + java-io-curl + diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index de817e4bc..50e88213e 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -1,7 +1,7 @@ package internal.sdmxdl.desktop; -import internal.http.curl.CurlHttpURLConnection; import lombok.NonNull; +import nbbrd.io.curl.CurlHttpURLConnection; import sdmxdl.ext.Cache; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.FileFormatProvider; diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index e570d2f1a..868a36f1b 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -1,10 +1,9 @@ package sdmxdl.grpc; -import internal.http.curl.CurlHttpURLConnection; import lombok.NonNull; +import nbbrd.io.curl.CurlHttpURLConnection; import sdmxdl.ext.Cache; import sdmxdl.format.FileFormat; -import sdmxdl.format.protobuf.ProtobufProvider; import sdmxdl.format.spi.FileFormatProvider; import sdmxdl.format.spi.FileFormatProviderLoader; import sdmxdl.provider.ext.FileCache; diff --git a/sdmx-dl-provider-base/src/main/java/internal/http/curl/Curl.java b/sdmx-dl-provider-base/src/main/java/internal/http/curl/Curl.java deleted file mode 100644 index cda4c8c3e..000000000 --- a/sdmx-dl-provider-base/src/main/java/internal/http/curl/Curl.java +++ /dev/null @@ -1,241 +0,0 @@ -package internal.http.curl; - -import lombok.NonNull; -import nbbrd.design.BuilderPattern; -import nbbrd.design.VisibleForTesting; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URL; -import java.nio.file.Path; -import java.util.*; - -@lombok.experimental.UtilityClass -class Curl { - - public static final int CURL_UNSUPPORTED_PROTOCOL = 1; - public static final int CURL_COULD_NOT_RESOLVE_HOST = 6; - public static final int CURL_OPERATION_TIMEOUT = 28; - public static final int CURL_FAILURE_RECEIVING = 56; - - @VisibleForTesting - @lombok.Value - public static class Status { - - int code; - - String message; - } - - @VisibleForTesting - @lombok.Value - public static class CurlHead { - - @lombok.NonNull - Status status; - - @lombok.NonNull - SortedMap> headers; - - public static LinkedList parseResponse(BufferedReader reader) throws IOException { - LinkedList result = new LinkedList<>(); - String line = reader.readLine(); - while (line != null) { - Status status = parseStatusLine(line); - SortedMap> headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - while ((line = reader.readLine()) != null && !line.isEmpty()) { - parseHeaders(line, headers); - } - if (line != null) { - // flush empty line - line = reader.readLine(); - } - result.add(new CurlHead(status, Collections.unmodifiableSortedMap(headers))); - } - return result; - } - - private static char SP = 32; - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages#status_line - private static Status parseStatusLine(String statusLine) throws IOException { - if (statusLine == null) { - return new Status(-1, null); - } - int codeStart = statusLine.indexOf(SP); - if (codeStart == -1) { - return new Status(-1, null); - } - int codeEnd = statusLine.indexOf(SP, codeStart + 1); - if (codeEnd == -1) { - return new Status(Integer.parseInt(statusLine.substring(codeStart + 1)), null); - } else { - return new Status(Integer.parseInt(statusLine.substring(codeStart + 1, codeEnd)), statusLine.substring(codeEnd + 1)); - } - } - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages#headers_2 - private static void parseHeaders(String line, SortedMap> result) throws IOException { - int index = line.indexOf(":"); - if (index != -1) { - String key = line.substring(0, index); - String value = line.substring(index + 1).trim(); - if (!value.isEmpty()) { - result.computeIfAbsent(key, ignore -> new ArrayList<>()).add(value); - } - } - } - - public static final class Builder { - // fix error when generating Javadoc - } - } - - @lombok.Value - @lombok.Builder - public static class CurlVersion { - - @lombok.Singular - List lines; - - public static CurlVersion parseText(BufferedReader reader) throws IOException { - CurlVersion.Builder result = new CurlVersion.Builder(); - try { - reader.lines().forEach(result::line); - } catch (UncheckedIOException ex) { - throw ex.getCause(); - } - return result.build(); - } - - public static final class Builder { - // fix error when generating Javadoc - } - } - - // https://curl.se/docs/manpage.html - @BuilderPattern(String[].class) - public static final class CurlCommandBuilder { - - private final List items; - - public CurlCommandBuilder() { - this.items = new ArrayList<>(); - items.add("curl"); - } - - private CurlCommandBuilder push(String item) { - items.add(item); - return this; - } - - public CurlCommandBuilder request(String method) { - return isDefaultMethod(method) ? this : push("-X").push(method); - } - - public CurlCommandBuilder url(URL url) { - return push(url.toString()); - } - - public CurlCommandBuilder proxy(Proxy proxy) { - if (hasProxy(proxy)) { - InetSocketAddress address = (InetSocketAddress) proxy.address(); - push("-x").push(address.getHostString() + ":" + address.getPort()); - } - return this; - } - - public CurlCommandBuilder output(Path file) { - return push("-o").push(file.toString()); - } - - public CurlCommandBuilder silent(boolean silent) { - return silent ? push("-s") : this; - } - - public CurlCommandBuilder dumpHeader(String filename) { - return push("-D").push(filename); - } - - public CurlCommandBuilder connectTimeout(float seconds) { - return push("--connect-timeout").push(fixNumericalParameter(seconds)); - } - - public CurlCommandBuilder maxTime(float seconds) { - return push("-m").push(fixNumericalParameter(seconds)); - } - - @CurlMinVersion("7.70.0") - public CurlCommandBuilder sslRevokeBestEffort(boolean sslRevokeBestEffort) { - return sslRevokeBestEffort ? push("--ssl-revoke-best-effort") : this; - } - - public CurlCommandBuilder insecure(boolean insecure) { - return insecure ? push("-k") : this; - } - - public CurlCommandBuilder header(String key, String value) { - return push("-H").push(key + ": " + value); - } - - public CurlCommandBuilder headers(Map> headers) { - headers.forEach((key, values) -> values.forEach(value -> header(key, value))); - return this; - } - - public CurlCommandBuilder version() { - return push("-V"); - } - - @CurlMinVersion("7.33.0") - public CurlCommandBuilder http1_1() { - return push("--http1.1"); - } - - public CurlCommandBuilder dataRaw(@Nullable String data) { - return data != null ? push("--data-raw").push(data) : this; - } - - public CurlCommandBuilder dataBinary(@Nullable Path data) { - return data != null ? push("--data-binary").push("@" + data) : this; - } - - public CurlCommandBuilder location(boolean location) { - return location ? push("-L") : this; - } - - public CurlCommandBuilder maxRedirs(int maxRedirs) { - return push("--max-redirs").push(Integer.toString(maxRedirs)); - } - - @CurlMinVersion("7.42.0") - public CurlCommandBuilder pathAsIs() { - return push("--path-as-is"); - } - - public String[] build() { - return items.toArray(new String[0]); - } - - // some old versions don't accept decimal values! - private String fixNumericalParameter(float seconds) { - return Integer.toString((int) seconds); - } - - private boolean isDefaultMethod(String method) { - return method.equals("GET"); - } - } - - private @interface CurlMinVersion { - String value(); - } - - static boolean hasProxy(@NonNull Proxy proxy) { - return !proxy.equals(Proxy.NO_PROXY); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/internal/http/curl/CurlHttpURLConnection.java b/sdmx-dl-provider-base/src/main/java/internal/http/curl/CurlHttpURLConnection.java deleted file mode 100644 index d50174bc5..000000000 --- a/sdmx-dl-provider-base/src/main/java/internal/http/curl/CurlHttpURLConnection.java +++ /dev/null @@ -1,175 +0,0 @@ -package internal.http.curl; - -import lombok.NonNull; -import nbbrd.design.StaticFactoryMethod; -import nbbrd.design.VisibleForTesting; -import nbbrd.io.function.IOConsumer; -import nbbrd.io.sys.EndOfProcessException; -import nbbrd.io.sys.OS; -import nbbrd.io.sys.ProcessReader; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.Proxy; -import java.net.URL; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; -import java.util.stream.Stream; - -import static internal.http.curl.Curl.*; -import static java.util.Collections.emptySortedMap; - -public final class CurlHttpURLConnection extends HttpURLConnection { - - @StaticFactoryMethod - public static @NonNull CurlHttpURLConnection of(@NonNull URL url, @NonNull Proxy proxy) throws IOException { - return init(url, proxy, false); - } - - @VisibleForTesting - @StaticFactoryMethod - public static @NonNull CurlHttpURLConnection insecureForTestOnly(@NonNull URL url, @NonNull Proxy proxy) throws IOException { - return init(url, proxy, true); - } - - private static CurlHttpURLConnection init(URL url, Proxy proxy, boolean insecure) throws IOException { - return new CurlHttpURLConnection(url, proxy, insecure, Files.createTempDirectory("curl")); - } - - @lombok.NonNull - private final Proxy proxy; - - private final boolean insecure; - - private final Path tempDir; - - private Map> headerFields = Collections.emptyMap(); - - private CurlHttpURLConnection(URL url, Proxy proxy, boolean insecure, Path tempDir) { - super(url); - this.proxy = proxy; - this.insecure = insecure; - this.tempDir = tempDir; - } - - @Override - public boolean usingProxy() { - return Curl.hasProxy(proxy); - } - - @Override - public void connect() throws IOException { - String[] request = createCurlCommand(); - CurlHead responseHead = executeCurlCommand(request); - this.responseCode = responseHead.getStatus().getCode(); - this.responseMessage = responseHead.getStatus().getMessage(); - this.headerFields = responseHead.getHeaders(); - } - - @Override - public void disconnect() { - if (Files.exists(tempDir)) { - try { - try (Stream files = Files.walk(tempDir).sorted(Comparator.reverseOrder())) { - files.forEach(IOConsumer.unchecked(Files::delete)); - } - } catch (IOException ex) { - throw new UncheckedIOException(ex); - } - } - } - - @Override - public String getHeaderField(String name) { - return lastValueOrNull(headerFields, name); - } - - @Override - public Map> getHeaderFields() { - return headerFields; - } - - @Override - public InputStream getInputStream() throws IOException { - return Files.newInputStream(getInput()); - } - - @Override - public OutputStream getOutputStream() throws IOException { - return Files.newOutputStream(getOutput()); - } - - @VisibleForTesting - Path getInput() { - return tempDir.resolve("input.tmp"); - } - - @VisibleForTesting - Path getOutput() { - return tempDir.resolve("output.tmp"); - } - - @VisibleForTesting - boolean isSchannel() { - return OS.NAME.equals(OS.Name.WINDOWS); - } - - @VisibleForTesting - String[] createCurlCommand() { - return new CurlCommandBuilder() - .request(getRequestMethod()) - .pathAsIs() - .url(getURL()) - .http1_1() - .silent(true) - .sslRevokeBestEffort(isSchannel()) - .insecure(insecure) - .proxy(proxy) - .output(getInput()) - .dumpHeader("-") - .connectTimeout(getConnectTimeout() / 1000f) - .maxTime(getReadTimeout() / 1000f) - .headers(getRequestProperties()) - .dataBinary(getDoOutput() ? getOutput() : null) - .location(getInstanceFollowRedirects()) - .build(); - } - - private CurlHead executeCurlCommand(String[] command) throws IOException { - try (BufferedReader reader = ProcessReader.newReader(command)) { - LinkedList curlHeads = CurlHead.parseResponse(reader); - return curlHeads.isEmpty() - ? new CurlHead(new Status(-1, null), emptySortedMap()) - : curlHeads.getLast(); - } catch (EndOfProcessException ex) { - switch (ex.getExitValue()) { - case CURL_UNSUPPORTED_PROTOCOL: - throw new IOException("Unsupported protocol '" + getURL().getProtocol() + "'"); - case CURL_COULD_NOT_RESOLVE_HOST: - throw new UnknownHostException(getURL().getHost()); - case CURL_OPERATION_TIMEOUT: - throw new IOException("Read timed out"); - case CURL_FAILURE_RECEIVING: - throw new IOException(getFailureReceivingNetworkDataMessage(proxy)); - default: - throw ex; - } - } - } - - private static String getFailureReceivingNetworkDataMessage(Proxy proxy) { - String result = "Failure in receiving network data."; - if (Curl.hasProxy(proxy)) { - result = "Unable to tunnel through proxy. " + result; - } - return result; - } - - private static @Nullable String lastValueOrNull(@NonNull Map> headers, @NonNull String name) { - List header = headers.get(name); - return header != null && !header.isEmpty() ? header.get(header.size() - 1) : null; - } -} diff --git a/sdmx-dl-provider-base/src/main/java/module-info.java b/sdmx-dl-provider-base/src/main/java/module-info.java index dd2417354..9d8189a64 100644 --- a/sdmx-dl-provider-base/src/main/java/module-info.java +++ b/sdmx-dl-provider-base/src/main/java/module-info.java @@ -11,6 +11,4 @@ exports sdmxdl.provider.ext; exports sdmxdl.provider.file; exports sdmxdl.provider.web; - - exports internal.http.curl to sdmxdl.provider.ri; } \ No newline at end of file diff --git a/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlHttpURLConnectionTest.java b/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlHttpURLConnectionTest.java deleted file mode 100644 index 24b1902a9..000000000 --- a/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlHttpURLConnectionTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package internal.http.curl; - -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import com.github.tomakehurst.wiremock.junit5.WireMockExtension; -import com.github.tomakehurst.wiremock.matching.EqualToPattern; -import nbbrd.io.function.IOSupplier; -import nbbrd.io.sys.ProcessReader; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import org.junit.jupiter.api.io.TempDir; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import wiremock.com.google.common.io.ByteSink; - -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.net.*; -import java.nio.file.Path; -import java.util.Locale; - -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static java.net.HttpURLConnection.*; -import static java.net.Proxy.NO_PROXY; -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; - -public class CurlHttpURLConnectionTest { - - @RegisterExtension - private final WireMockExtension wire = WireMockExtension.newInstance() - .options(WireMockConfiguration - .options() - .dynamicPort() - .dynamicHttpsPort() - .gzipDisabled(false)) - .build(); - - @Test - public void testCreateCurlCommand() throws IOException { - URL url = new URL("http://localhost"); - Proxy proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved("http://localhost", 123)); - - CurlHttpURLConnection conn = CurlHttpURLConnection.of(url, proxy); - conn.setConnectTimeout(2000); - conn.setReadTimeout(3000); - conn.setRequestProperty("Content-Type", "text/html; charset=ISO-8859-1"); - conn.setRequestProperty("P3P", "CP=\"This is not a P3P policy! See g.co/p3phelp for more info."); - conn.setInstanceFollowRedirects(false); - String[] command = conn.createCurlCommand(); - if (conn.isSchannel()) { - assertThat(command) - .containsExactly("curl", "--path-as-is", "http://localhost", "--http1.1", "-s", "--ssl-revoke-best-effort", - "-x", "http://localhost:123", - "-o", conn.getInput().toString(), - "-D", "-", - "--connect-timeout", "2", - "-m", "3", - "-H", "P3P: CP=\"This is not a P3P policy! See g.co/p3phelp for more info.", - "-H", "Content-Type: text/html; charset=ISO-8859-1" - ); - } else { - assertThat(command) - .containsExactly("curl", "--path-as-is", "http://localhost", "--http1.1", "-s", - "-x", "http://localhost:123", - "-o", conn.getInput().toString(), - "-D", "-", - "--connect-timeout", "2", - "-m", "3", - "-H", "P3P: CP=\"This is not a P3P policy! See g.co/p3phelp for more info.", - "-H", "Content-Type: text/html; charset=ISO-8859-1" - ); - } - } - - @Test - public void testCurlHead(@TempDir Path temp) throws IOException { - String customErrorMessage = "Custom error message"; - - wire.resetAll(); - wire.stubFor(WireMock.get(SAMPLE_URL) - .willReturn(WireMock.aResponse() - .withStatus(HttpsURLConnection.HTTP_INTERNAL_ERROR) - .withStatusMessage(customErrorMessage) - .withHeader("key", "value") - .withHeader("camelCaseKey", "a", "B") - )); - - Path dumpHeader = temp.resolve("dumpHeader.txt"); - - String[] command = new Curl.CurlCommandBuilder() - .http1_1() - .url(wireURL(SAMPLE_URL)) - .dumpHeader(dumpHeader.toString()) - .insecure(true) - .build(); - - ProcessReader.readToString(command); - - String content = org.assertj.core.util.Files.contentOf(dumpHeader.toFile(), UTF_8); - - assertThat(content).startsWith("HTTP/1.1 500 Custom error message"); - - try (BufferedReader reader = new BufferedReader(new StringReader(content))) { - assertThat(Curl.CurlHead.parseResponse(reader)) - .singleElement() - .satisfies(head -> { - assertThat(head.getStatus()) - .isEqualTo(new Curl.Status(500, customErrorMessage)); - assertThat(head.getHeaders()) - .containsEntry("key", singletonList("value")) - .containsEntry("camelCaseKey", asList("a", "B")) - .containsKeys("camelCaseKey", "camelcasekey", "CAMELCASEKEY"); - }); - } - - wire.verify(1, WireMock.getRequestedFor(WireMock.urlEqualTo(SAMPLE_URL))); - } - - @Test - public void testRequestMethodGET() throws IOException { - wire.resetAll(); - wire.stubFor(WireMock.get(SAMPLE_URL).willReturn(WireMock.ok())); - - HttpURLConnection x = CurlHttpURLConnection.insecureForTestOnly(wireURL(SAMPLE_URL), NO_PROXY); - x.setRequestMethod("GET"); - x.setRequestProperty("key", "value"); - x.connect(); - x.disconnect(); - - wire.verify(1, - WireMock.getRequestedFor(WireMock.urlEqualTo(SAMPLE_URL)) - .withHeader("key", new EqualToPattern("value"))); - } - - @Test - public void testRequestMethodPOST() throws IOException { - wire.resetAll(); - wire.stubFor(WireMock.post(SAMPLE_URL).willReturn(WireMock.ok())); - - HttpURLConnection x = CurlHttpURLConnection.insecureForTestOnly(wireURL(SAMPLE_URL), NO_PROXY); - x.setRequestMethod("POST"); - x.setRequestProperty("key", "value"); - x.setDoOutput(true); - asByteSink(x::getOutputStream).asCharSink(UTF_8).write("hello"); - x.connect(); - x.disconnect(); - - wire.verify(1, - WireMock.postRequestedFor(WireMock.urlEqualTo(SAMPLE_URL)) - .withHeader("key", new EqualToPattern("value")) - .withRequestBody(new EqualToPattern("hello"))); - } - - @Test - public void testDisconnect() throws IOException { - wire.resetAll(); - wire.stubFor(WireMock.get(SAMPLE_URL).willReturn(WireMock.ok())); - - HttpURLConnection x = CurlHttpURLConnection.insecureForTestOnly(wireURL(SAMPLE_URL), NO_PROXY); - x.setRequestMethod("GET"); - x.connect(); - x.disconnect(); - - assertThatCode(x::disconnect) - .describedAs("Subsequent call to #disconnect() should not fail") - .doesNotThrowAnyException(); - } - - @ParameterizedTest - @ValueSource(ints = {HTTP_MOVED_PERM, HTTP_MOVED_TEMP, HTTP_SEE_OTHER, 307, 308}) - public void testSetInstanceFollowRedirects(int redirection) throws IOException { - String absoluteSecondURL = wireURL(SECOND_URL).toString(); - - for (String location : asList(absoluteSecondURL, SECOND_URL)) { - for (boolean followRedirects : new boolean[]{true, false}) { - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(aResponse().withStatus(redirection).withHeader(HTTP_LOCATION_HEADER, location))); - wire.stubFor(get(SECOND_URL).willReturn(okXml(SAMPLE_XML))); - - HttpURLConnection x = CurlHttpURLConnection.insecureForTestOnly(wireURL(SAMPLE_URL), NO_PROXY); - x.setInstanceFollowRedirects(followRedirects); - x.setRequestProperty(HTTP_CONTENT_TYPE_HEADER, "application/xml"); - x.connect(); - if (followRedirects) { - assertSameSampleContent(x); - } - x.disconnect(); - - wire.verify(1, WireMock.getRequestedFor(WireMock.urlEqualTo(SAMPLE_URL))); - wire.verify(followRedirects ? 1 : 0, WireMock.getRequestedFor(WireMock.urlEqualTo(SECOND_URL))); - } - } - } - - private URL wireURL(String path) throws MalformedURLException { - if (!path.startsWith("/")) { - path = "/" + path; - } - return new URL(String.format(Locale.ROOT, "%s%s", wire.baseUrl(), path)); - } - - private static final String SAMPLE_URL = "/first.xml"; - protected static final String SECOND_URL = "/second.xml"; - protected static final String SAMPLE_XML = "JohnDoe"; - private static final String HTTP_LOCATION_HEADER = "Location"; - private static final String HTTP_CONTENT_TYPE_HEADER = "Content-Type"; - - protected void assertSameSampleContent(HttpURLConnection response) throws IOException { - assertThat(response.getContentType()).isEqualTo("application/xml"); - try (InputStream stream = response.getInputStream()) { - assertThat(stream).hasContent(SAMPLE_XML); - } - } - - private static ByteSink asByteSink(IOSupplier target) { - return new ByteSink() { - @Override - public OutputStream openStream() throws IOException { - return target.getWithIO(); - } - }; - } -} diff --git a/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlTest.java b/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlTest.java deleted file mode 100644 index 384d94e8c..000000000 --- a/sdmx-dl-provider-base/src/test/java/internal/http/curl/CurlTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package internal.http.curl; - -import nbbrd.io.Resource; -import nbbrd.io.sys.ProcessReader; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.net.URL; -import java.nio.file.Path; -import java.util.List; -import java.util.TreeMap; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Arrays.asList; -import static java.util.Collections.*; -import static nbbrd.io.text.TextResource.getResourceAsBufferedReader; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.atIndex; - -public class CurlTest { - - @Test - public void testCurlCommandBuilder(@TempDir Path tmp) throws MalformedURLException { - Path file = tmp.resolve("abc.txt"); - - assertThat(new Curl.CurlCommandBuilder().request("GET").build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().request("POST").build()) - .containsExactly("curl", "-X", "POST"); - - assertThat(new Curl.CurlCommandBuilder().url(new URL("https://www.nbb.be")).build()) - .containsExactly("curl", "https://www.nbb.be"); - - assertThat(new Curl.CurlCommandBuilder().proxy(Proxy.NO_PROXY).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().proxy(new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved("http://localhost", 123))).build()) - .containsExactly("curl", "-x", "http://localhost:123"); - - assertThat(new Curl.CurlCommandBuilder().output(file).build()) - .containsExactly("curl", "-o", file.toString()); - - assertThat(new Curl.CurlCommandBuilder().silent(false).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().silent(true).build()) - .containsExactly("curl", "-s"); - - assertThat(new Curl.CurlCommandBuilder().dumpHeader(file.toString()).build()) - .containsExactly("curl", "-D", file.toString()); - - assertThat(new Curl.CurlCommandBuilder().connectTimeout(3.14f).build()) - .containsExactly("curl", "--connect-timeout", "3"); - - assertThat(new Curl.CurlCommandBuilder().maxTime(3.14f).build()) - .containsExactly("curl", "-m", "3"); - - assertThat(new Curl.CurlCommandBuilder().sslRevokeBestEffort(false).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().sslRevokeBestEffort(true).build()) - .containsExactly("curl", "--ssl-revoke-best-effort"); - - assertThat(new Curl.CurlCommandBuilder().insecure(false).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().insecure(true).build()) - .containsExactly("curl", "-k"); - - assertThat(new Curl.CurlCommandBuilder().header("key", "value").build()) - .containsExactly("curl", "-H", "key: value"); - - assertThat(new Curl.CurlCommandBuilder().headers(emptyMap()).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().headers(singletonMap("key", asList("v1", "v2"))).build()) - .containsExactly("curl", "-H", "key: v1", "-H", "key: v2"); - - assertThat(new Curl.CurlCommandBuilder().version().build()) - .containsExactly("curl", "-V"); - - assertThat(new Curl.CurlCommandBuilder().http1_1().build()) - .containsExactly("curl", "--http1.1"); - - assertThat(new Curl.CurlCommandBuilder().dataRaw("hello").build()) - .containsExactly("curl", "--data-raw", "hello"); - - assertThat(new Curl.CurlCommandBuilder().dataBinary(file).build()) - .containsExactly("curl", "--data-binary", "@" + file); - - assertThat(new Curl.CurlCommandBuilder().location(false).build()) - .containsExactly("curl"); - - assertThat(new Curl.CurlCommandBuilder().location(true).build()) - .containsExactly("curl", "-L"); - - assertThat(new Curl.CurlCommandBuilder().maxRedirs(15).build()) - .containsExactly("curl", "--max-redirs", "15"); - - assertThat(new Curl.CurlCommandBuilder().pathAsIs().build()) - .containsExactly("curl", "--path-as-is"); - } - - @Test - public void testCurlHead() throws IOException { - try (InputStream stream = Resource.getResourceAsStream(CurlTest.class, "curlhead.txt").orElseThrow(IOException::new)) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, UTF_8))) { - assertThat(Curl.CurlHead.parseResponse(reader)) - .singleElement() - .isEqualTo(new Curl.CurlHead( - new Curl.Status(200, "OK"), - new TreeMap>(String.CASE_INSENSITIVE_ORDER) { - { - put("Date", singletonList("Wed, 20 Oct 2021 10:58:37 GMT")); - put("Expires", singletonList("-1")); - put("Cache-Control", singletonList("private, max-age=0")); - put("Content-Type", singletonList("text/html; charset=ISO-8859-1")); - put("P3P", singletonList("CP=\"This is not a P3P policy! See g.co/p3phelp for more info.\"")); - put("Server", singletonList("gws")); - put("X-XSS-Protection", singletonList("0")); - put("X-Frame-Options", singletonList("SAMEORIGIN")); - put("Accept-Ranges", singletonList("none")); - put("Vary", singletonList("Accept-Encoding")); - put("Transfer-Encoding", singletonList("chunked")); - } - } - )); - } - } - - try (BufferedReader reader = getResourceAsBufferedReader(CurlTest.class, "curlhead2.txt", UTF_8).orElseThrow(IOException::new)) { - assertThat(Curl.CurlHead.parseResponse(reader)) - .hasSize(2) - .satisfies(head -> assertThat(head.getStatus().getCode()).isEqualTo(301), atIndex(0)) - .satisfies(head -> assertThat(head.getStatus().getCode()).isEqualTo(200), atIndex(1)); - } - } - - @Disabled - @Test - public void testVersion() throws IOException { - String[] versionCommand = new Curl.CurlCommandBuilder().version().build(); - try (BufferedReader reader = ProcessReader.newReader(versionCommand)) { - Curl.CurlVersion.parseText(reader).getLines().forEach(System.out::println); - } - } -} diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index b1aca251e..c66b02f5d 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -65,6 +65,10 @@ gson 2.10.1 + + com.github.nbbrd.java-io-util + java-io-curl + diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java index 8f3f42249..51fcf29fb 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java @@ -17,7 +17,7 @@ package internal.util.http; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import internal.http.curl.CurlHttpURLConnection; +import nbbrd.io.curl.CurlHttpURLConnection; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import sdmxdl.web.URLConnectionFactory; From 3f2faac30ce80a26bd26a088e5ad80d5904773e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 04:57:40 +0000 Subject: [PATCH 009/114] Bump quarkus.platform.version from 3.1.0.Final to 3.1.1.Final Bumps `quarkus.platform.version` from 3.1.0.Final to 3.1.1.Final. Updates `quarkus-bom` from 3.1.0.Final to 3.1.1.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.0.Final...3.1.1.Final) Updates `quarkus-maven-plugin` from 3.1.0.Final to 3.1.1.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.0.Final...3.1.1.Final) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 670de0066..d52a70622 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.1.0.Final + 3.1.1.Final true true From 840908574211ea21181c265fd4d21c07d9ecef2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 04:57:27 +0000 Subject: [PATCH 010/114] Bump maven-surefire-plugin from 3.1.0 to 3.1.2 Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.0...surefire-3.1.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f46ecb18..e9641adbb 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.1.0 + 3.1.2 From f1233b0dcc8956de248bd9a5ba24078bbd018a4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Jun 2023 04:57:23 +0000 Subject: [PATCH 011/114] Bump maven-failsafe-plugin from 3.1.0 to 3.1.2 Bumps [maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.1.0 to 3.1.2. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.0...surefire-3.1.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-failsafe-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index d52a70622..9442a71a2 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -141,7 +141,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.1.0 + 3.1.2 From 05257b74d798a5ef99f944d0a56be18740d400c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Jun 2023 04:57:08 +0000 Subject: [PATCH 012/114] Bump quarkus.platform.version from 3.1.1.Final to 3.1.2.Final Bumps `quarkus.platform.version` from 3.1.1.Final to 3.1.2.Final. Updates `quarkus-bom` from 3.1.1.Final to 3.1.2.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.1.Final...3.1.2.Final) Updates `quarkus-maven-plugin` from 3.1.1.Final to 3.1.2.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.1.Final...3.1.2.Final) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 9442a71a2..6a412d8c8 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.1.1.Final + 3.1.2.Final true true From 5044b8e00d3ff3bfca68a0d561d00ac0a1ff68b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 04:57:37 +0000 Subject: [PATCH 013/114] Bump sslcontext-kickstart from 8.0.0 to 8.1.1 Bumps [sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.0.0 to 8.1.1. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.0.0...v8.1.1) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-cli/pom.xml | 2 +- sdmx-dl-desktop/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index b0e321cc5..34458c72c 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -98,7 +98,7 @@ io.github.hakky54 sslcontext-kickstart - 8.0.0 + 8.1.1 slf4j-api diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index c590e354d..6c116a20d 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -86,7 +86,7 @@ io.github.hakky54 sslcontext-kickstart - 8.0.0 + 8.1.1 slf4j-api From 2cc678877328e571acc5a3ea956872e03a20ef67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jun 2023 12:26:35 +0000 Subject: [PATCH 014/114] Bump java-service.version from 1.6.1 to 1.7.0 Bumps `java-service.version` from 1.6.1 to 1.7.0. Updates `java-service-bom` from 1.6.1 to 1.7.0 - [Release notes](https://github.com/nbbrd/java-service-util/releases) - [Changelog](https://github.com/nbbrd/java-service-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-service-util/compare/v1.6.1...v1.7.0) Updates `java-service-processor` from 1.6.1 to 1.7.0 - [Release notes](https://github.com/nbbrd/java-service-util/releases) - [Changelog](https://github.com/nbbrd/java-service-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-service-util/compare/v1.6.1...v1.7.0) --- updated-dependencies: - dependency-name: com.github.nbbrd.java-service-util:java-service-bom dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.github.nbbrd.java-service-util:java-service-processor dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9641adbb..b185239fc 100644 --- a/pom.xml +++ b/pom.xml @@ -292,7 +292,7 @@ 1.18.28 - 1.6.1 + 1.7.0 1.4.0 4.7.4 From 14e5df43969a41568e3e6c2be90b0502e6f457b8 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 26 Jun 2023 15:11:29 +0200 Subject: [PATCH 015/114] Use ServiceId annotation in extension points --- .../src/main/java/internal/sdmxdl/ServiceId.java | 12 ------------ .../main/java/sdmxdl/web/spi/WebAuthenticator.java | 2 +- .../src/main/java/sdmxdl/web/spi/WebDriver.java | 6 +----- .../src/main/java/sdmxdl/web/spi/WebMonitoring.java | 2 +- 4 files changed, 3 insertions(+), 19 deletions(-) delete mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/ServiceId.java diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/ServiceId.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/ServiceId.java deleted file mode 100644 index 9ed1b2dfe..000000000 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/ServiceId.java +++ /dev/null @@ -1,12 +0,0 @@ -package internal.sdmxdl; - -import nbbrd.design.MightBePromoted; - -import java.lang.annotation.*; - -@Documented -@Target({ElementType.METHOD}) -@Retention(RetentionPolicy.SOURCE) -@MightBePromoted -public @interface ServiceId { -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java index 3d72bba82..11c1c6051 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java @@ -1,11 +1,11 @@ package sdmxdl.web.spi; -import internal.sdmxdl.ServiceId; import lombok.NonNull; import nbbrd.design.ThreadSafe; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceFilter; +import nbbrd.service.ServiceId; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java index 61dc3054e..2d49e3cef 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java @@ -16,14 +16,10 @@ */ package sdmxdl.web.spi; -import internal.sdmxdl.ServiceId; import internal.sdmxdl.web.spi.FailsafeDriver; import lombok.NonNull; import nbbrd.design.ThreadSafe; -import nbbrd.service.Quantifier; -import nbbrd.service.ServiceDefinition; -import nbbrd.service.ServiceFilter; -import nbbrd.service.ServiceSorter; +import nbbrd.service.*; import sdmxdl.Connection; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java index b92860439..ee53337e8 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java @@ -1,10 +1,10 @@ package sdmxdl.web.spi; -import internal.sdmxdl.ServiceId; import lombok.NonNull; import nbbrd.design.ThreadSafe; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; +import nbbrd.service.ServiceId; import sdmxdl.web.MonitorReport; import sdmxdl.web.SdmxWebSource; From 24646408bc1f1b5e04dce0b998a92af27347c3a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 04:57:08 +0000 Subject: [PATCH 016/114] Bump sslcontext-kickstart from 8.1.1 to 8.1.2 Bumps [sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.1.1 to 8.1.2. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.1.1...v8.1.2) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-cli/pom.xml | 2 +- sdmx-dl-desktop/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 34458c72c..8a58e8430 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -98,7 +98,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.1 + 8.1.2 slf4j-api diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 6c116a20d..f9a7cfec7 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -86,7 +86,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.1 + 8.1.2 slf4j-api From 956310bffdd536c0f140141519a98abf3128ea0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 04:57:41 +0000 Subject: [PATCH 017/114] Bump maven-shade-plugin from 3.4.1 to 3.5.0 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.4.1 to 3.5.0. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.4.1...maven-shade-plugin-3.5.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b185239fc..3b7ad7ab1 100644 --- a/pom.xml +++ b/pom.xml @@ -155,7 +155,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.0 org.xolstice.maven.plugins From 15a3ef11f2cbc40a8b660a9256ed44be74ca27e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 04:57:22 +0000 Subject: [PATCH 018/114] Bump heylogs-maven-plugin from 0.5.0 to 0.6.0 Bumps [heylogs-maven-plugin](https://github.com/nbbrd/heylogs) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/nbbrd/heylogs/releases) - [Changelog](https://github.com/nbbrd/heylogs/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/heylogs/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: com.github.nbbrd.heylogs:heylogs-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3b7ad7ab1..207a7b4eb 100644 --- a/pom.xml +++ b/pom.xml @@ -165,7 +165,7 @@ com.github.nbbrd.heylogs heylogs-maven-plugin - 0.5.0 + 0.6.0 de.thetaphi From 6ba1f07c980beb7b5674bfb7a6bf5f4cfa48324b Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 27 Jun 2023 08:33:27 +0200 Subject: [PATCH 019/114] Update ECB endpoint --- CHANGELOG.md | 1 + docs/tmp/sources.csv | 2 +- .../src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java | 4 ++-- .../sdmxdl/provider/connectors/drivers/Sdmx21Driver.java | 4 ++-- .../sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java | 4 ++-- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b91e3b5..5ad346425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed +- ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![PROVIDER] Move curl backend to an external project - ![GRPC] Migrate gRPC module to Quarkus framework diff --git a/docs/tmp/sources.csv b/docs/tmp/sources.csv index 766711c2f..d09d02a61 100644 --- a/docs/tmp/sources.csv +++ b/docs/tmp/sources.csv @@ -3,7 +3,7 @@ ABS,Australian Bureau of Statistics,,ri:sdmx21,,https://api.data.abs.gov.au,deta BBK,Deutsche Bundesbank,,ri:bbk,,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" BIS,Bank for International Settlements,,ri:sdmx21,,https://stats.bis.org/api/v1,detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en CAMSTAT,National Institute of Statistics of Cambodia,,ri:sdmx21,,https://nsiws-stable-camstat-live.officialstatistics.org/rest,,http://camstat.nis.gov.kh/?locale=en&start=0,upptime:/nbbrd/sdmx-upptime/CAMSTAT,https://nbbrd.github.io/sdmx-upptime/history/camstat,"en,km" -ECB,European Central Bank,,ri:sdmx21,ECB2020,https://sdw-wsrest.ecb.europa.eu/service,detailSupported=true,https://sdw.ecb.europa.eu,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en +ECB,European Central Bank,,ri:sdmx21,ECB2020,https://data-api.ecb.europa.eu/service,detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en EC_DG_COMP,European Commission - Directorate General for Competition,,ri:estat,,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,ri:estat,,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,ri:estat,,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java index 24402572a..ea465c01e 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java @@ -39,7 +39,7 @@ public class XmlWebSourceTest { .name("en", "European Central Bank") .driver("ri:sdmx21") .dialect(SDMX21_DIALECT) - .endpointOf("https://sdw-wsrest.ecb.europa.eu/service") + .endpointOf("https://data-api.ecb.europa.eu/service") .property("detailSupported", "true") .alias("XYZ") .websiteOf("https://sdw.ecb.europa.eu") @@ -63,7 +63,7 @@ public class XmlWebSourceTest { + " European Central Bank\n" + " ri:sdmx21\n" + " SDMX21\n" - + " https://sdw-wsrest.ecb.europa.eu/service\n" + + " https://data-api.ecb.europa.eu/service\n" + " \n" + " XYZ\n" + " https://sdw.ecb.europa.eu\n" diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 248bb9c86..3c767c0f3 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -92,10 +92,10 @@ public final class Sdmx21Driver implements WebDriver { .name("en", "European Central Bank") .driver(CONNECTORS_SDMX_21) .dialect("ECB2020") - .endpointOf("https://sdw-wsrest.ecb.europa.eu/service") + .endpointOf("https://data-api.ecb.europa.eu/service") .propertyOf(SUPPORTS_COMPRESSION_PROPERTY, true) .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) - .websiteOf("https://sdw.ecb.europa.eu") + .websiteOf("https://data.ecb.europa.eu/") .monitorOf("upptime:/nbbrd/sdmx-upptime/ECB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ecb") .build()) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java index 5b3a9b6e4..2040462b4 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java @@ -94,9 +94,9 @@ public final class Sdmx21Driver2 implements WebDriver { .name("en", "European Central Bank") .driver(RI_SDMX_21) .dialect("ECB2020") - .endpointOf("https://sdw-wsrest.ecb.europa.eu/service") + .endpointOf("https://data-api.ecb.europa.eu/service") .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) - .websiteOf("https://sdw.ecb.europa.eu") + .websiteOf("https://data.ecb.europa.eu/") .monitorOf("upptime:/nbbrd/sdmx-upptime/ECB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ecb") .build()) From 75cdf039c59262b8ed7b092804d08f8c85042b73 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 27 Jun 2023 15:17:04 +0200 Subject: [PATCH 020/114] Fix NPE in check rules command --- .../sdmxdl/cli/experimental/CheckRulesCommand.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java index 60f5da7ca..8ce3c072e 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java @@ -109,13 +109,12 @@ private static RulesTarget targetOf(WebRequest request) { private static RulesConfig configOf(SdmxWebSource source) { try { - return RulesConfig - .newBuilder() - .setDriver(source.getDriver()) - .setDialect(source.getDialect()) - .setProtocol(source.getEndpoint().toURL().getProtocol()) - .setProperties(DEFAULT_MAP_FORMATTER.formatAsString(source.getProperties())) - .build(); + RulesConfig.Builder result = RulesConfig.newBuilder(); + result.setDriver(source.getDriver()); + if (source.getDialect() != null) result.setDialect(source.getDialect()); + result.setProtocol(source.getEndpoint().toURL().getProtocol()); + result.setProperties(DEFAULT_MAP_FORMATTER.formatAsString(source.getProperties())); + return result.build(); } catch (MalformedURLException ex) { throw new UncheckedIOException(ex); } From dd8464e0d18a2eee2970a563b96b99ac374adf1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jun 2023 04:57:25 +0000 Subject: [PATCH 021/114] Bump maven-clean-plugin from 3.2.0 to 3.3.1 Bumps [maven-clean-plugin](https://github.com/apache/maven-clean-plugin) from 3.2.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-clean-plugin/releases) - [Commits](https://github.com/apache/maven-clean-plugin/compare/maven-clean-plugin-3.2.0...maven-clean-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-clean-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 207a7b4eb..a0c9f71a9 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ org.apache.maven.plugins maven-clean-plugin - 3.2.0 + 3.3.1 org.apache.maven.plugins From 79436339373d81f32a816ba0a43b08172d7845b2 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 28 Jun 2023 17:19:55 +0200 Subject: [PATCH 022/114] Fix file locking in cache --- CHANGELOG.md | 4 ++ .../sdmxdl/cli/ext/VerboseOptions.java | 5 +- .../java/sdmxdl/provider/ext/FileCache.java | 8 +-- .../provider/ext/LockingFileFormatter.java | 59 +++++++++++++++++++ .../provider/ext/LockingFileParser.java | 58 ++++++++++++++++++ .../sdmxdl/provider/ext/FileCacheTest.java | 37 +++++++----- 6 files changed, 151 insertions(+), 20 deletions(-) create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ad346425..d790a7ec1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed + +- ![PROVIDER] Fix file locking in cache + ### Changed - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java index e4fb680fb..a482216ca 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java @@ -2,6 +2,8 @@ import picocli.CommandLine; +import java.util.Objects; + @lombok.Getter @lombok.Setter public class VerboseOptions { @@ -30,13 +32,14 @@ public void reportToErrorStream(String anchor, String message) { public void reportToErrorStream(String anchor, String message, Exception ex) { CommandLine.Help.ColorScheme colorScheme = spec.commandLine().getColorScheme(); + String details = ex.getMessage() != null ? ex.getMessage() : ex.getClass().getName(); reportToErrorStream(colorScheme .text("[") .concat(colorScheme.commandText(anchor)) .concat(colorScheme.text("] ")) .concat(colorScheme.optionText(message)) .concat(" ") - .concat(colorScheme.stackTraceText(ex.getMessage())) + .concat(colorScheme.stackTraceText(details)) ); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java index 975248b64..792119e69 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java @@ -120,9 +120,9 @@ private T read(FileFormat fileFormat, FileType fileType, String key) { Path file = getFile(key, fileType, fileFormat); if (Files.exists(file) && Files.isRegularFile(file)) { try { - return fileFormat.getParser().parsePath(file); + return new LockingFileParser<>(fileFormat.getParser()).parsePath(file); } catch (IOException ex) { - onIOException.accept("While reading '" + file + "'", ex); + onIOException.accept("Failed reading '" + file + "'", ex); } } return null; @@ -132,9 +132,9 @@ private void write(FileFormat fileFormat, String key, FileType fileType, Path file = getFile(key, fileType, fileFormat); ensureParentExists(file); try { - fileFormat.getFormatter().formatPath(entry, file); + new LockingFileFormatter<>(fileFormat.getFormatter()).formatPath(entry, file); } catch (IOException ex) { - onIOException.accept("While writing '" + file + "'", ex); + onIOException.accept("Failed writing '" + file + "'", ex); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java new file mode 100644 index 000000000..376c6655b --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java @@ -0,0 +1,59 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import nbbrd.io.FileFormatter; +import nbbrd.io.function.IOSupplier; + +import java.io.*; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +@lombok.RequiredArgsConstructor +final class LockingFileFormatter implements FileFormatter { + + private final @NonNull FileFormatter delegate; + + @Override + public void formatFile(@NonNull T value, @NonNull File target) throws IOException { + try (FileOutputStream stream = new FileOutputStream(target)) { + try (FileLock lock = stream.getChannel().lock()) { + delegate.formatStream(value, new UnclosableOutputStream(stream)); + } + } + } + + @Override + public void formatPath(@NonNull T value, @NonNull Path target) throws IOException { + try (FileChannel channel = FileChannel.open(target, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) { + try (FileLock lock = channel.lock()) { + delegate.formatStream(value, new UnclosableOutputStream(Channels.newOutputStream(channel))); + } + } + } + + @Override + public void formatStream(@NonNull T value, @NonNull IOSupplier target) throws IOException { + delegate.formatStream(value, target); + } + + @Override + public void formatStream(@NonNull T value, @NonNull OutputStream resource) throws IOException { + delegate.formatStream(value, resource); + } + + @lombok.AllArgsConstructor + private static final class UnclosableOutputStream extends OutputStream { + + @lombok.experimental.Delegate(excludes = Closeable.class) + private final OutputStream delegate; + + @Override + public void close() throws IOException { + flush(); + super.close(); + } + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java new file mode 100644 index 000000000..2af166128 --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java @@ -0,0 +1,58 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import nbbrd.io.FileParser; +import nbbrd.io.function.IOSupplier; + +import java.io.*; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +@lombok.RequiredArgsConstructor +final class LockingFileParser implements FileParser { + + private final @NonNull FileParser delegate; + + @Override + public @NonNull T parseFile(@NonNull File source) throws IOException { + try (FileInputStream stream = new FileInputStream(source)) { + try (FileLock lock = stream.getChannel().lock(0, Long.MAX_VALUE, true)) { + return delegate.parseStream(new UnclosableInputStream(stream)); + } + } + } + + @Override + public @NonNull T parsePath(@NonNull Path source) throws IOException { + try (FileChannel channel = FileChannel.open(source, StandardOpenOption.READ)) { + try (FileLock lock = channel.lock(0, Long.MAX_VALUE, true)) { + return delegate.parseStream(new UnclosableInputStream(Channels.newInputStream(channel))); + } + } + } + + @Override + public @NonNull T parseResource(@NonNull Class type, @NonNull String name) throws IOException { + return delegate.parseResource(type, name); + } + + @Override + public @NonNull T parseStream(@NonNull IOSupplier source) throws IOException { + return delegate.parseStream(source); + } + + @Override + public @NonNull T parseStream(@NonNull InputStream resource) throws IOException { + return delegate.parseStream(resource); + } + + @lombok.AllArgsConstructor + private static final class UnclosableInputStream extends InputStream { + + @lombok.experimental.Delegate(excludes = Closeable.class) + private final InputStream delegate; + } +} diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java index a5edf3ff0..65d123193 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java @@ -29,7 +29,9 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.time.Duration; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.UnaryOperator; import java.util.stream.Collectors; @@ -52,12 +54,15 @@ public void testGetSet(@TempDir Path temp) throws IOException { clock.set(1000); FileFormat serializer = newFakeFileFormat(); + List exceptions = new ArrayList<>(); + FileCache cache = FileCache .builder() .root(temp.resolve("testfolder")) .fileNameGenerator(UnaryOperator.identity()) .repositoryFormat(serializer) .clock(clock) + .onIOException((message, exception) -> exceptions.add(exception)) .build(); assertThat(cache.getRoot()) @@ -110,28 +115,30 @@ public void testGetSet(@TempDir Path temp) throws IOException { assertThat(cache.getRepository("KEY1")) .as("Updated key should return updated value") .isEqualTo(r2); + + assertThat(exceptions) + .isEmpty(); } private static FileFormat newFakeFileFormat() { Map content = new HashMap<>(); - return new FileFormat<>(newFakeFileParser(content), newFakeFileFormatter(content), ".dat"); + return new FileFormat<>( + FileParser.onParsingStream(stream -> parseFake(content, stream)), + FileFormatter.onFormattingStream((value, stream) -> formatFake(content, stream, value)), + ".dat" + ); } - private static FileParser newFakeFileParser(Map content) { - return (stream) -> { - try (Reader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { - String name = new BufferedReader(reader).lines().collect(Collectors.joining("")); - return content.get(name); - } - }; + private static DataRepository parseFake(Map content, InputStream stream) { + Reader reader = new InputStreamReader(stream, StandardCharsets.UTF_8); + String name = new BufferedReader(reader).lines().collect(Collectors.joining("")); + return content.get(name); } - private static FileFormatter newFakeFileFormatter(Map content) { - return (entry, stream) -> { - try (Writer writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8)) { - writer.write(entry.getName()); - content.put(entry.getName(), entry); - } - }; + private static void formatFake(Map content, OutputStream stream, DataRepository value) throws IOException { + Writer writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8); + writer.write(value.getName()); + writer.flush(); + content.put(value.getName(), value); } } From e940f1c6cae6a6b3321972a6b22fbb7eb6d90c90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:21:33 +0000 Subject: [PATCH 023/114] Bump java-io-bom from 0.0.23 to 0.0.24 Bumps [java-io-bom](https://github.com/nbbrd/java-io-util) from 0.0.23 to 0.0.24. - [Release notes](https://github.com/nbbrd/java-io-util/releases) - [Changelog](https://github.com/nbbrd/java-io-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-io-util/compare/v0.0.23...v0.0.24) --- updated-dependencies: - dependency-name: com.github.nbbrd.java-io-util:java-io-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a0c9f71a9..62117cd9e 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.23 + 0.0.24 pom import From 6877fa129b5d811ab0787eaf31d1cfa7ed9e0068 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 30 Jun 2023 13:41:47 +0200 Subject: [PATCH 024/114] Code cleanup --- .../java/sdmxdl/provider/ext/FileCache.java | 6 +- .../provider/ext/LockingFileFormatter.java | 59 ------------------- .../provider/ext/LockingFileParser.java | 58 ------------------ 3 files changed, 4 insertions(+), 119 deletions(-) delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java index 792119e69..14d8f9321 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java @@ -18,6 +18,8 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; +import nbbrd.io.FileFormatter; +import nbbrd.io.FileParser; import nbbrd.io.sys.SystemProperties; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; @@ -120,7 +122,7 @@ private T read(FileFormat fileFormat, FileType fileType, String key) { Path file = getFile(key, fileType, fileFormat); if (Files.exists(file) && Files.isRegularFile(file)) { try { - return new LockingFileParser<>(fileFormat.getParser()).parsePath(file); + return FileParser.onParsingLock(fileFormat.getParser()).parsePath(file); } catch (IOException ex) { onIOException.accept("Failed reading '" + file + "'", ex); } @@ -132,7 +134,7 @@ private void write(FileFormat fileFormat, String key, FileType fileType, Path file = getFile(key, fileType, fileFormat); ensureParentExists(file); try { - new LockingFileFormatter<>(fileFormat.getFormatter()).formatPath(entry, file); + FileFormatter.onFormattingLock(fileFormat.getFormatter()).formatPath(entry, file); } catch (IOException ex) { onIOException.accept("Failed writing '" + file + "'", ex); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java deleted file mode 100644 index 376c6655b..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileFormatter.java +++ /dev/null @@ -1,59 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import nbbrd.io.FileFormatter; -import nbbrd.io.function.IOSupplier; - -import java.io.*; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; - -@lombok.RequiredArgsConstructor -final class LockingFileFormatter implements FileFormatter { - - private final @NonNull FileFormatter delegate; - - @Override - public void formatFile(@NonNull T value, @NonNull File target) throws IOException { - try (FileOutputStream stream = new FileOutputStream(target)) { - try (FileLock lock = stream.getChannel().lock()) { - delegate.formatStream(value, new UnclosableOutputStream(stream)); - } - } - } - - @Override - public void formatPath(@NonNull T value, @NonNull Path target) throws IOException { - try (FileChannel channel = FileChannel.open(target, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) { - try (FileLock lock = channel.lock()) { - delegate.formatStream(value, new UnclosableOutputStream(Channels.newOutputStream(channel))); - } - } - } - - @Override - public void formatStream(@NonNull T value, @NonNull IOSupplier target) throws IOException { - delegate.formatStream(value, target); - } - - @Override - public void formatStream(@NonNull T value, @NonNull OutputStream resource) throws IOException { - delegate.formatStream(value, resource); - } - - @lombok.AllArgsConstructor - private static final class UnclosableOutputStream extends OutputStream { - - @lombok.experimental.Delegate(excludes = Closeable.class) - private final OutputStream delegate; - - @Override - public void close() throws IOException { - flush(); - super.close(); - } - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java deleted file mode 100644 index 2af166128..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/LockingFileParser.java +++ /dev/null @@ -1,58 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import nbbrd.io.FileParser; -import nbbrd.io.function.IOSupplier; - -import java.io.*; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.nio.file.Path; -import java.nio.file.StandardOpenOption; - -@lombok.RequiredArgsConstructor -final class LockingFileParser implements FileParser { - - private final @NonNull FileParser delegate; - - @Override - public @NonNull T parseFile(@NonNull File source) throws IOException { - try (FileInputStream stream = new FileInputStream(source)) { - try (FileLock lock = stream.getChannel().lock(0, Long.MAX_VALUE, true)) { - return delegate.parseStream(new UnclosableInputStream(stream)); - } - } - } - - @Override - public @NonNull T parsePath(@NonNull Path source) throws IOException { - try (FileChannel channel = FileChannel.open(source, StandardOpenOption.READ)) { - try (FileLock lock = channel.lock(0, Long.MAX_VALUE, true)) { - return delegate.parseStream(new UnclosableInputStream(Channels.newInputStream(channel))); - } - } - } - - @Override - public @NonNull T parseResource(@NonNull Class type, @NonNull String name) throws IOException { - return delegate.parseResource(type, name); - } - - @Override - public @NonNull T parseStream(@NonNull IOSupplier source) throws IOException { - return delegate.parseStream(source); - } - - @Override - public @NonNull T parseStream(@NonNull InputStream resource) throws IOException { - return delegate.parseStream(resource); - } - - @lombok.AllArgsConstructor - private static final class UnclosableInputStream extends InputStream { - - @lombok.experimental.Delegate(excludes = Closeable.class) - private final InputStream delegate; - } -} From 912d7d890cf7ff255a54d9935ab672ef259aa240 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Jun 2023 04:57:29 +0000 Subject: [PATCH 025/114] Bump jreleaser-maven-plugin from 1.5.1 to 1.7.0 Bumps [jreleaser-maven-plugin](https://github.com/jreleaser/jreleaser) from 1.5.1 to 1.7.0. - [Release notes](https://github.com/jreleaser/jreleaser/releases) - [Changelog](https://github.com/jreleaser/jreleaser/blob/main/jreleaser.yml) - [Commits](https://github.com/jreleaser/jreleaser/compare/v1.5.1...v1.7.0) --- updated-dependencies: - dependency-name: org.jreleaser:jreleaser-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-cli/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 8a58e8430..187c31dea 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -356,7 +356,7 @@ org.jreleaser jreleaser-maven-plugin - 1.5.1 + 1.7.0 install From 58404bec78df26fe8a9da1f80dc9e69b1479171c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Jun 2023 04:03:28 +0000 Subject: [PATCH 026/114] Bump quarkus.platform.version from 3.1.2.Final to 3.1.3.Final Bumps `quarkus.platform.version` from 3.1.2.Final to 3.1.3.Final. Updates `quarkus-bom` from 3.1.2.Final to 3.1.3.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.2.Final...3.1.3.Final) Updates `quarkus-maven-plugin` from 3.1.2.Final to 3.1.3.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.2.Final...3.1.3.Final) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 6a412d8c8..0d93fba11 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.1.2.Final + 3.1.3.Final true true From 0647b37fd50d7bc022b307566bf0628f4413f33a Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 3 Jul 2023 13:31:57 +0200 Subject: [PATCH 027/114] Code cleanup --- .../internal/sdmxdl/cli/WebNetOptions.java | 65 +++---------------- sdmx-dl-cli/src/test/java/_demo/Demo.java | 38 +++++++++++ .../src/test/java/_demo/EasyNetwork.java | 49 ++++++++++++++ .../java/sdmxdl/provider/ext/DualCache.java | 58 +++++++++++++++++ .../java/sdmxdl/provider/ext/MapCache.java | 19 +++--- .../java/_test/sdmxdl/util/CachingAssert.java | 2 +- .../java/sdmxdl/provider/TypedIdTest.java | 3 +- .../sdmxdl/provider/ext/MapCacheTest.java | 7 +- 8 files changed, 168 insertions(+), 73 deletions(-) create mode 100644 sdmx-dl-cli/src/test/java/_demo/Demo.java create mode 100644 sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 8b80acb3b..aa6af9ff9 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -22,11 +22,11 @@ import internal.util.WebAuthenticatorLoader; import lombok.NonNull; import nl.altindag.ssl.SSLFactory; -import org.checkerframework.checker.nullness.qual.Nullable; import picocli.CommandLine; import sdmxdl.DataRepository; import sdmxdl.ext.Cache; import sdmxdl.format.FileFormat; +import sdmxdl.provider.ext.DualCache; import sdmxdl.provider.ext.FileCache; import sdmxdl.provider.ext.MapCache; import sdmxdl.provider.ext.VerboseCache; @@ -42,7 +42,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiConsumer; import java.util.stream.Collectors; @@ -69,7 +68,7 @@ public SdmxWebManager loadManager() throws IOException { return defaultManager .toBuilder() .network(new LazyNetwork()) - .cache(new DryCache(getCache(getNetworkOptions().getCacheOptions(), getVerboseOptions()))) + .cache(getDryCache()) .clearAuthenticators() .authenticators(getAuthenticators()) .customSources(getForcedSslSources(defaultManager)) @@ -92,6 +91,14 @@ private static URI toHttps(URI url) { : url; } + private Cache getDryCache() { + Cache main = getCache(getNetworkOptions().getCacheOptions(), getVerboseOptions()); + Clock clock = main.getClock(); + return new DualCache( + MapCache.builder().clock(clock).build(), + main, main.getClock()); + } + private static Cache getCache(CacheOptions cacheOptions, VerboseOptions verboseOptions) { if (cacheOptions.isNoCache()) { return Cache.noOp(); @@ -155,58 +162,6 @@ private List getAuthenticators() { private static final String CACHE_ANCHOR = "CCH"; - private static final class DryCache implements Cache { - - private final Cache delegate; - private final MapCache dry; - - public DryCache(Cache delegate) { - this.delegate = delegate; - this.dry = MapCache.of(new ConcurrentHashMap<>(), new ConcurrentHashMap<>(), delegate.getClock()); - } - - @Override - public @NonNull Clock getClock() { - return delegate.getClock(); - } - - @Override - public @Nullable DataRepository getRepository(@NonNull String key) { - DataRepository result = dry.getRepository(key); - if (result == null) { - result = delegate.getRepository(key); - if (result != null) { - dry.putRepository(key, result); - } - } - return result; - } - - @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { - dry.putRepository(key, value); - delegate.putRepository(key, value); - } - - @Override - public @Nullable MonitorReports getMonitorReports(@NonNull String key) { - MonitorReports result = dry.getMonitorReports(key); - if (result == null) { - result = delegate.getMonitorReports(key); - if (result != null) { - dry.putMonitorReports(key, result); - } - } - return result; - } - - @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - dry.putMonitorReports(key, value); - delegate.putMonitorReports(key, value); - } - } - private final class LazyNetwork implements Network { @lombok.Getter(lazy = true) diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java new file mode 100644 index 000000000..e8aa6e8e0 --- /dev/null +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -0,0 +1,38 @@ +package _demo; + +import nbbrd.io.curl.CurlHttpURLConnection; +import sdmxdl.*; +import sdmxdl.provider.ext.MapCache; +import sdmxdl.web.SdmxWebManager; + +import java.io.IOException; + +public class Demo { + + @nbbrd.design.Demo + public static void main(String[] args) throws IOException { + + SdmxWebManager manager = SdmxWebManager.ofServiceLoader() + .toBuilder() + .cache(MapCache.builder().build()) + .network(EasyNetwork.DEFAULT + .toBuilder() + .urlConnectionFactory(() -> CurlHttpURLConnection::of) + .build()) + .languages(LanguagePriorityList.ANY) + .eventListener((source, message) -> System.err.println("[" + source.getId() + "] " + message)) + .build(); + + try (Connection ecb = manager.getConnection("ECB")) { + DataflowRef exr = DataflowRef.parse("EXR"); + System.out.println(ecb.getFlow(exr).getName()); + + Key chf = Key.parse("M.CHF.EUR.SP00.A"); + ecb.getData(exr, DataQuery.builder().key(chf).build()) + .getData() + .stream() + .map(Series::getKey) + .forEach(System.out::println); + } + } +} diff --git a/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java b/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java new file mode 100644 index 000000000..bbf93560e --- /dev/null +++ b/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java @@ -0,0 +1,49 @@ +package _demo; + +import lombok.NonNull; +import sdmxdl.web.Network; +import sdmxdl.web.URLConnectionFactory; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; +import java.net.ProxySelector; +import java.util.function.Supplier; + +@lombok.Builder(toBuilder = true) +final class EasyNetwork implements Network { + + public static final EasyNetwork DEFAULT = EasyNetwork.builder().build(); + + @lombok.Builder.Default + final @NonNull Supplier proxySelector = ProxySelector::getDefault; + + @lombok.Builder.Default + final @NonNull Supplier sslSocketFactory = HttpsURLConnection::getDefaultSSLSocketFactory; + + @lombok.Builder.Default + final @NonNull Supplier hostnameVerifier = HttpsURLConnection::getDefaultHostnameVerifier; + + @lombok.Builder.Default + final @NonNull Supplier urlConnectionFactory = URLConnectionFactory::getDefault; + + @Override + public @NonNull ProxySelector getProxySelector() { + return proxySelector.get(); + } + + @Override + public @NonNull SSLSocketFactory getSSLSocketFactory() { + return sslSocketFactory.get(); + } + + @Override + public @NonNull HostnameVerifier getHostnameVerifier() { + return hostnameVerifier.get(); + } + + @Override + public @NonNull URLConnectionFactory getURLConnectionFactory() { + return urlConnectionFactory.get(); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java new file mode 100644 index 000000000..bf4dc93df --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java @@ -0,0 +1,58 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; +import sdmxdl.ext.Cache; +import sdmxdl.web.MonitorReports; + +import java.time.Clock; + +@lombok.AllArgsConstructor +public final class DualCache implements Cache { + + private final @NonNull Cache first; + private final @NonNull Cache second; + private final @NonNull Clock clock; + + @Override + public @NonNull Clock getClock() { + return clock; + } + + @Override + public @Nullable DataRepository getRepository(@NonNull String key) { + DataRepository result = first.getRepository(key); + if (result == null) { + result = second.getRepository(key); + if (result != null) { + first.putRepository(key, result); + } + } + return result; + } + + @Override + public void putRepository(@NonNull String key, @NonNull DataRepository value) { + first.putRepository(key, value); + second.putRepository(key, value); + } + + @Override + public @Nullable MonitorReports getMonitorReports(@NonNull String key) { + MonitorReports result = first.getMonitorReports(key); + if (result == null) { + result = second.getMonitorReports(key); + if (result != null) { + first.putMonitorReports(key, result); + } + } + return result; + } + + @Override + public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + first.putMonitorReports(key, value); + second.putMonitorReports(key, value); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java index 7f6263be2..a06c86811 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java @@ -32,22 +32,20 @@ * @author Philippe Charles */ @lombok.Getter -@lombok.AllArgsConstructor(staticName = "of") +@lombok.Builder(toBuilder = true) public final class MapCache implements Cache { - @NonNull - public static MapCache of() { - return of(new ConcurrentHashMap<>(), new ConcurrentHashMap<>(), Clock.systemDefaultZone()); - } - @lombok.NonNull - private final ConcurrentMap repositories; + @lombok.Builder.Default + private final ConcurrentMap repositories = new ConcurrentHashMap<>(); @lombok.NonNull - private final ConcurrentMap webMonitors; + @lombok.Builder.Default + private final ConcurrentMap webMonitors = new ConcurrentHashMap<>(); @lombok.NonNull - private final Clock clock; + @lombok.Builder.Default + private final Clock clock = Clock.systemDefaultZone(); @Override public @Nullable DataRepository getRepository(@NonNull String key) { @@ -92,8 +90,7 @@ private static T get(@NonNull Predicate validator, @NonNull ConcurrentMap return result; } - @VisibleForTesting - static void put(@NonNull ConcurrentMap map, @NonNull String key, @NonNull T value) { + private static void put(@NonNull ConcurrentMap map, @NonNull String key, @NonNull T value) { map.put(key, value); } } diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java index 6c34e8a18..53847f15a 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java @@ -54,7 +54,7 @@ public void reset() { } public MapCache newCache() { - return MapCache.of(map, monitors, clock); + return MapCache.builder().repositories(map).webMonitors(monitors).clock(clock).build(); } } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java index e34f6ca99..c6f205ff9 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java @@ -10,7 +10,6 @@ import java.io.IOException; import java.net.URI; import java.time.Duration; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import static org.assertj.core.api.Assertions.assertThat; @@ -27,7 +26,7 @@ public void test() throws IOException { FakeClock clock = new FakeClock(); - Cache cache = MapCache.of(new ConcurrentHashMap<>(), new ConcurrentHashMap<>(), clock); + Cache cache = MapCache.builder().clock(clock).build(); IOSupplier factory = new AtomicInteger()::getAndIncrement; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java index 66e281897..21aa8101e 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java @@ -34,7 +34,7 @@ public class MapCacheTest { @Test public void testCompliance() { - CacheAssert.assertCompliance(MapCache.of()); + CacheAssert.assertCompliance(MapCache.builder().build()); } @Test @@ -50,7 +50,7 @@ public void testGetRepository() { .name("r1") .ttl(clock(1000).instant(), Duration.ofMillis(10)) .build(); - MapCache.put(map, "KEY1", r1000); + map.put("KEY1", r1000); assertThat(MapCache.getRepository(map, clock(1009), "KEY1")) .as("Non-expired key should return value") .isEqualTo(r1000); @@ -71,10 +71,9 @@ public void testGetRepository() { .name("r2") .ttl(clock(1009).instant(), Duration.ofMillis(10)) .build(); - MapCache.put(map, "KEY1", r1009); + map.put("KEY1", r1009); assertThat(MapCache.getRepository(map, clock(1010), "KEY1")) .as("Updated key should return updated value") .isEqualTo(r1009); } - } From 0df63188369e94991b47e637183abec77f9c7b08 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 4 Jul 2023 09:44:44 +0200 Subject: [PATCH 028/114] Refactor cache --- CHANGELOG.md | 1 + .../internal/sdmxdl/NoOpCacheProvider.java | 46 +++++++ .../sdmxdl/web/spi/FailsafeDriver.java | 2 +- sdmx-dl-api/src/main/java/module-info.java | 1 + .../src/main/java/sdmxdl/SdmxManager.java | 14 +-- .../src/main/java/sdmxdl/ext/Cache.java | 4 +- .../java/sdmxdl/ext/SdmxSourceBiConsumer.java | 16 +++ .../java/sdmxdl/ext/SdmxSourceConsumer.java | 15 +++ .../java/sdmxdl/ext/spi/CacheProvider.java | 42 +++++++ .../java/sdmxdl/file/SdmxFileManager.java | 12 +- .../java/sdmxdl/file/spi/FileContext.java | 13 +- .../main/java/sdmxdl/web/SdmxWebManager.java | 12 +- .../main/java/sdmxdl/web/spi/WebContext.java | 12 +- .../main/java/sdmxdl/web/spi/WebDriver.java | 2 +- .../sdmxdl/web/spi/FailsafeDriverTest.java | 2 +- .../java/sdmxdl/web/SdmxWebManagerTest.java | 8 +- .../java/tests/sdmxdl/web/MockedDriver.java | 2 +- .../internal/sdmxdl/cli/WebNetOptions.java | 119 +++++++++--------- .../java/internal/sdmxdl/cli/WebOptions.java | 5 +- sdmx-dl-cli/src/test/java/_demo/Demo.java | 2 - .../sdmxdl/desktop/DesktopWebFactory.java | 15 --- .../main/java/sdmxdl/format/DiskCache.java | 33 +++-- .../java/sdmxdl/format/DiskCacheEvent.java | 6 + .../format/DiskCacheProviderSupport.java | 107 ++++++++++++++++ .../sdmxdl/format/spi/FileFormatProvider.java | 3 +- .../java/sdmxdl/format/DiskCacheTest.java | 17 ++- .../src/main/java/module-info.java | 1 + .../java/sdmxdl/format/kryo/KryoProvider.java | 23 +++- .../src/main/java/module-info.java | 3 + .../sdmxdl/format/protobuf/JsonProvider.java | 24 +++- .../format/protobuf/ProtobufProvider.java | 23 +++- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 15 --- .../ext/DualCacheProviderSupport.java | 60 +++++++++ .../ext/{MapCache.java => MemCache.java} | 18 +-- .../provider/ext/MemCacheProviderSupport.java | 48 +++++++ .../sdmxdl/provider/ext/VerboseCache.java | 54 -------- .../sdmxdl/provider/web/RestConnector.java | 2 +- .../sdmxdl/provider/web/WebDriverSupport.java | 2 +- .../java/_test/sdmxdl/util/CachingAssert.java | 14 +-- .../java/sdmxdl/provider/TypedIdTest.java | 4 +- .../{MapCacheTest.java => MemCacheTest.java} | 20 +-- .../provider/ri/file/readers/XmlReader.java | 6 +- .../provider/ri/web/drivers/FileDriver.java | 51 +++++++- .../provider/ri/web/drivers/PxWebDriver.java | 2 +- .../ri/web/drivers/StatCanDriver.java | 2 +- .../ri/web/monitors/UpptimeMonitoring.java | 2 +- 46 files changed, 629 insertions(+), 256 deletions(-) create mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java => sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java (79%) create mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java create mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java rename sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java => sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java (90%) create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/{MapCache.java => MemCache.java} (75%) create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/VerboseCache.java rename sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/{MapCacheTest.java => MemCacheTest.java} (78%) diff --git a/CHANGELOG.md b/CHANGELOG.md index d790a7ec1..c698b4e09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed +- ![API] Refactor cache API [#500](https://github.com/nbbrd/sdmx-dl/issues/500) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![PROVIDER] Move curl backend to an external project - ![GRPC] Migrate gRPC module to Quarkus framework diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java new file mode 100644 index 000000000..39238feff --- /dev/null +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java @@ -0,0 +1,46 @@ +package internal.sdmxdl; + +import lombok.NonNull; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; + +import java.util.Collection; +import java.util.Collections; + +public enum NoOpCacheProvider implements CacheProvider { + + INSTANCE; + + @Override + public @NonNull String getCacheId() { + return "NO_OP"; + } + + @Override + public int getCacheRank() { + return UNKNOWN_RANK; + } + + @Override + public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + return Cache.noOp(); + } + + @Override + public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + return Cache.noOp(); + } + + @Override + public @NonNull Collection getSupportedFileProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Collection getSupportedWebProperties() { + return Collections.emptyList(); + } +} diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java index 43baf5452..f91261762 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java @@ -75,7 +75,7 @@ public int getRank() { return delegate.getRank(); } catch (RuntimeException ex) { unexpectedError("while getting rank", ex); - return UNKNOWN; + return UNKNOWN_RANK; } } diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index 826a390fe..0a2049a7b 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -15,6 +15,7 @@ exports sdmxdl.web; exports sdmxdl.web.spi; + uses sdmxdl.ext.spi.CacheProvider; uses sdmxdl.ext.spi.Dialect; uses sdmxdl.file.spi.FileReader; uses sdmxdl.web.spi.WebAuthenticator; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index e092c6571..4414cc352 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -19,13 +19,13 @@ import lombok.NonNull; import nbbrd.design.SealedType; import nbbrd.design.ThreadSafe; -import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.file.SdmxFileManager; import sdmxdl.web.SdmxWebManager; import java.io.IOException; import java.util.Optional; -import java.util.function.BiConsumer; /** * @author Philippe Charles @@ -41,14 +41,12 @@ public abstract class SdmxManager { public abstract @NonNull LanguagePriorityList getLanguages(); - public abstract @NonNull Cache getCache(); + public abstract @NonNull CacheProvider getCacheProvider(); - public abstract @NonNull BiConsumer getEventListener(); + public abstract @NonNull SdmxSourceConsumer getEventListener(); public abstract @NonNull Optional getDialect(@NonNull SOURCE source); - public static final BiConsumer NO_OP_EVENT_LISTENER = SdmxManager::doNothing; - - private static void doNothing(SdmxSource ignoredSource, String message) { - } + public static final SdmxSourceConsumer NO_OP_EVENT_LISTENER = (source, t) -> { + }; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java index 5ea3814c2..e0c2a5c18 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java @@ -18,8 +18,8 @@ import internal.sdmxdl.NoOpCache; import lombok.NonNull; +import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; -import nbbrd.design.ThreadSafe; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; import sdmxdl.web.MonitorReports; @@ -29,7 +29,7 @@ /** * @author Philippe Charles */ -@ThreadSafe +@NotThreadSafe public interface Cache { @NonNull Clock getClock(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java new file mode 100644 index 000000000..73f2769b7 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java @@ -0,0 +1,16 @@ +package sdmxdl.ext; + +import lombok.NonNull; +import sdmxdl.SdmxSource; + +import java.util.function.BiConsumer; + +@FunctionalInterface +public interface SdmxSourceBiConsumer { + + void accept(S source, T t, U u); + + default @NonNull BiConsumer asBiConsumer(S source) { + return (t, u) -> accept(source, t, u); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java new file mode 100644 index 000000000..55a181cc5 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java @@ -0,0 +1,15 @@ +package sdmxdl.ext; + +import lombok.NonNull; +import sdmxdl.SdmxSource; + +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +@FunctionalInterface +public interface SdmxSourceConsumer extends BiConsumer { + + default @NonNull Consumer asConsumer(S source) { + return t -> accept(source, t); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java new file mode 100644 index 000000000..62d94b748 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java @@ -0,0 +1,42 @@ +package sdmxdl.ext.spi; + +import internal.sdmxdl.NoOpCacheProvider; +import lombok.NonNull; +import nbbrd.service.Quantifier; +import nbbrd.service.ServiceDefinition; +import nbbrd.service.ServiceId; +import nbbrd.service.ServiceSorter; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; + +import java.util.Collection; + +@ServiceDefinition( + quantifier = Quantifier.SINGLE, + loaderName = "internal.util.CacheProviderLoader", + fallback = NoOpCacheProvider.class +) +public interface CacheProvider { + + @ServiceId + @NonNull String getCacheId(); + + @ServiceSorter(reverse = true) + int getCacheRank(); + + @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener); + + @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener); + + @NonNull Collection getSupportedFileProperties(); + + @NonNull Collection getSupportedWebProperties(); + + int UNKNOWN_RANK = -1; + + static @NonNull CacheProvider noOp() { + return NoOpCacheProvider.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index ce6a4584d..eb84a9b61 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -16,6 +16,7 @@ */ package sdmxdl.file; +import internal.util.CacheProviderLoader; import internal.util.FileReaderLoader; import lombok.AccessLevel; import lombok.NonNull; @@ -23,14 +24,14 @@ import sdmxdl.Connection; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; -import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; import java.io.IOException; import java.util.List; import java.util.Optional; -import java.util.function.BiConsumer; /** * @author Philippe Charles @@ -44,6 +45,7 @@ public class SdmxFileManager extends SdmxManager { public static @NonNull SdmxFileManager ofServiceLoader() { return builder() .readers(FileReaderLoader.load()) + .cacheProvider(CacheProviderLoader.load()) .build(); } @@ -58,11 +60,11 @@ public class SdmxFileManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - Cache cache = Cache.noOp(); + CacheProvider cacheProvider = CacheProvider.noOp(); @lombok.NonNull @lombok.Builder.Default - BiConsumer eventListener = NO_OP_EVENT_LISTENER; + SdmxSourceConsumer eventListener = NO_OP_EVENT_LISTENER; @lombok.NonNull @lombok.Singular @@ -90,7 +92,7 @@ private FileContext initContext() { .builder() .languages(languages) .eventListener(eventListener) - .cache(cache) + .cacheProvider(cacheProvider) .build(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index d71c0f411..b3c014bbf 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -1,12 +1,13 @@ package sdmxdl.file.spi; +import lombok.NonNull; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.file.SdmxFileSource; -import java.util.function.BiConsumer; - @lombok.Value @lombok.Builder(toBuilder = true) public class FileContext { @@ -17,9 +18,13 @@ public class FileContext { @lombok.NonNull @lombok.Builder.Default - Cache cache = Cache.noOp(); + CacheProvider cacheProvider = CacheProvider.noOp(); @lombok.NonNull @lombok.Builder.Default - BiConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; + SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; + + public @NonNull Cache getCache(@NonNull SdmxFileSource source) { + return getCacheProvider().getFileCache(source, getEventListener()); + } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 470e8056f..d9cb7ced5 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -16,6 +16,7 @@ */ package sdmxdl.web; +import internal.util.CacheProviderLoader; import internal.util.WebAuthenticatorLoader; import internal.util.WebDriverLoader; import internal.util.WebMonitoringLoader; @@ -25,7 +26,8 @@ import sdmxdl.Connection; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; -import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.web.spi.WebAuthenticator; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebDriver; @@ -35,7 +37,6 @@ import java.net.URI; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collector; @@ -56,6 +57,7 @@ public class SdmxWebManager extends SdmxManager { .builder() .drivers(WebDriverLoader.load()) .monitorings(WebMonitoringLoader.load()) + .cacheProvider(CacheProviderLoader.load()) .authenticators(WebAuthenticatorLoader.load()) .build(); } @@ -83,11 +85,11 @@ public class SdmxWebManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - Cache cache = Cache.noOp(); + CacheProvider cacheProvider = CacheProvider.noOp(); @lombok.NonNull @lombok.Builder.Default - BiConsumer eventListener = NO_OP_EVENT_LISTENER; + SdmxSourceConsumer eventListener = NO_OP_EVENT_LISTENER; @lombok.NonNull @lombok.Singular @@ -187,7 +189,7 @@ private Optional lookupMonitoring(String uriScheme) { private WebContext initContext() { return WebContext .builder() - .cache(cache) + .cacheProvider(cacheProvider) .languages(languages) .network(network) .eventListener(eventListener) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index cd91ace09..399bb01a2 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -16,14 +16,16 @@ */ package sdmxdl.web.spi; +import lombok.NonNull; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; import java.util.List; -import java.util.function.BiConsumer; /** * @author Philippe Charles @@ -38,11 +40,11 @@ public class WebContext { @lombok.NonNull @lombok.Builder.Default - Cache cache = Cache.noOp(); + CacheProvider cacheProvider = CacheProvider.noOp(); @lombok.NonNull @lombok.Builder.Default - BiConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; + SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; @lombok.NonNull @lombok.Singular @@ -51,4 +53,8 @@ public class WebContext { @lombok.NonNull @lombok.Builder.Default Network network = Network.getDefault(); + + public @NonNull Cache getCache(@NonNull SdmxWebSource source) { + return getCacheProvider().getWebCache(source, getEventListener()); + } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java index 2d49e3cef..9cec44687 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java @@ -62,7 +62,7 @@ Connection connect( int NATIVE_RANK = Byte.MAX_VALUE; int WRAPPED_RANK = 0; - int UNKNOWN = -1; + int UNKNOWN_RANK = -1; String NO_DEFAULT_DIALECT = ""; } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java index 05ae88084..0efaeb49e 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java @@ -64,7 +64,7 @@ public void testGetRank() { failsafe.assertEmpty(); failsafe.reset(); - assertThat(failing.getRank()).isEqualTo(WebDriver.UNKNOWN); + assertThat(failing.getRank()).isEqualTo(WebDriver.UNKNOWN_RANK); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index edd08c1e1..9b25b09b4 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; -import sdmxdl.ext.Cache; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.ext.spi.Dialect; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.api.SdmxManagerAssert; @@ -61,7 +61,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); - assertThat(o.getCache()).isEqualTo(Cache.noOp()); + assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -74,7 +74,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); - assertThat(o.getCache()).isEqualTo(Cache.noOp()); + assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -86,7 +86,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); - assertThat(o.getCache()).isEqualTo(Cache.noOp()); + assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java index 25422e05a..9afb6eaab 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java @@ -23,7 +23,7 @@ public final class MockedDriver implements WebDriver { @lombok.Getter @lombok.Builder.Default - private final int rank = WebDriver.UNKNOWN; + private final int rank = WebDriver.UNKNOWN_RANK; @lombok.Getter @lombok.Builder.Default diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index aa6af9ff9..079961393 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -23,14 +23,16 @@ import lombok.NonNull; import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; -import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; -import sdmxdl.format.FileFormat; -import sdmxdl.provider.ext.DualCache; -import sdmxdl.provider.ext.FileCache; -import sdmxdl.provider.ext.MapCache; -import sdmxdl.provider.ext.VerboseCache; -import sdmxdl.web.*; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.format.DiskCache; +import sdmxdl.format.DiskCacheProviderSupport; +import sdmxdl.provider.ext.DualCacheProviderSupport; +import sdmxdl.provider.ext.MemCacheProviderSupport; +import sdmxdl.web.Network; +import sdmxdl.web.SdmxWebManager; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.URLConnectionFactory; import sdmxdl.web.spi.WebAuthenticator; import javax.net.ssl.HostnameVerifier; @@ -38,11 +40,11 @@ import java.io.IOException; import java.net.ProxySelector; import java.net.URI; +import java.nio.file.Path; import java.time.Clock; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.function.BiConsumer; import java.util.stream.Collectors; /** @@ -68,7 +70,7 @@ public SdmxWebManager loadManager() throws IOException { return defaultManager .toBuilder() .network(new LazyNetwork()) - .cache(getDryCache()) + .cacheProvider(getCacheProvider(getNetworkOptions().getCacheOptions(), getVerboseOptions())) .clearAuthenticators() .authenticators(getAuthenticators()) .customSources(getForcedSslSources(defaultManager)) @@ -91,57 +93,6 @@ private static URI toHttps(URI url) { : url; } - private Cache getDryCache() { - Cache main = getCache(getNetworkOptions().getCacheOptions(), getVerboseOptions()); - Clock clock = main.getClock(); - return new DualCache( - MapCache.builder().clock(clock).build(), - main, main.getClock()); - } - - private static Cache getCache(CacheOptions cacheOptions, VerboseOptions verboseOptions) { - if (cacheOptions.isNoCache()) { - return Cache.noOp(); - } - FileCache fileCache = getFileCache(cacheOptions, verboseOptions); - if (verboseOptions.isVerbose()) { - verboseOptions.reportToErrorStream(CACHE_ANCHOR, "Using cache folder '" + fileCache.getRoot() + "'"); - } - return getVerboseCache(fileCache, verboseOptions); - } - - private static FileCache getFileCache(CacheOptions cacheOptions, VerboseOptions verboseOptions) { - FileCache.Builder result = FileCache - .builder() - .repositoryFormat(getRepositoryFormat(cacheOptions)) - .monitorFormat(getMonitorFormat(cacheOptions)); - if (cacheOptions.getCacheFolder() != null) { - result.root(cacheOptions.getCacheFolder().toPath()); - } - if (verboseOptions.isVerbose()) { - result.onIOException((msg, ex) -> verboseOptions.reportToErrorStream(CACHE_ANCHOR, msg, ex)); - } - return result.build(); - } - - private static FileFormat getRepositoryFormat(CacheOptions cacheOptions) { - FileFormat result = cacheOptions.getCacheFormat().getDataRepositoryFormat(); - return cacheOptions.isNoCacheCompression() ? result : FileFormat.gzip(result); - } - - private static FileFormat getMonitorFormat(CacheOptions cacheOptions) { - FileFormat result = cacheOptions.getCacheFormat().getMonitorReportsFormat(); - return cacheOptions.isNoCacheCompression() ? result : FileFormat.gzip(result); - } - - private static Cache getVerboseCache(Cache delegate, VerboseOptions options) { - if (options.isVerbose()) { - BiConsumer listener = (key, hit) -> options.reportToErrorStream(CACHE_ANCHOR, (hit ? "Hit " : "Miss ") + key); - return new VerboseCache(delegate, listener, listener); - } - return delegate; - } - private List getAuthenticators() { AuthOptions authOptions = networkOptions.getAuthOptions(); if (authOptions.hasUsername() && authOptions.hasPassword()) { @@ -162,6 +113,52 @@ private List getAuthenticators() { private static final String CACHE_ANCHOR = "CCH"; + private static CacheProvider getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { + if (cacheOptions.isNoCache()) { + return CacheProvider.noOp(); + } + + Clock clock = Clock.systemDefaultZone(); + Path root = cacheOptions.getCacheFolder() != null ? cacheOptions.getCacheFolder().toPath() : DiskCache.SDMXDL_TMP_DIR; + reportConfig(verboseOptions, root); + + return DualCacheProviderSupport + .builder() + .cacheId("DRY") + .first(MemCacheProviderSupport + .builder() + .cacheId("MEM") + .clock(clock) + .build()) + .second(DiskCacheProviderSupport + .builder() + .cacheId("DISK") + .root(root) + .formatProvider(cacheOptions.getCacheFormat()) + .onFileError((src, msg, ex) -> reportFileError(verboseOptions, src, msg, ex)) + .onWebError((src, msg, ex) -> reportWebError(verboseOptions, src, msg, ex)) + .clock(clock) + .noCompression(cacheOptions.isNoCacheCompression()) + .build()) + .clock(clock) + .build(); + } + + private static void reportConfig(VerboseOptions verboseOptions, Path root) { + if (verboseOptions.isVerbose()) + verboseOptions.reportToErrorStream(CACHE_ANCHOR, "Using cache folder '" + root + "'"); + } + + private static void reportFileError(VerboseOptions verboseOptions, SdmxFileSource src, String msg, IOException ex) { + if (verboseOptions.isVerbose()) + verboseOptions.reportToErrorStream(CACHE_ANCHOR, src.getData() + ": " + msg, ex); + } + + private static void reportWebError(VerboseOptions verboseOptions, SdmxWebSource src, String msg, IOException ex) { + if (verboseOptions.isVerbose()) + verboseOptions.reportToErrorStream(CACHE_ANCHOR, src.getId() + ": " + msg, ex); + } + private final class LazyNetwork implements Network { @lombok.Getter(lazy = true) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 59745528e..f561a803b 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -24,6 +24,7 @@ import picocli.CommandLine; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; +import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.format.xml.XmlWebSource; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -112,8 +113,8 @@ public SdmxWebManager loadManager() throws IOException { } } - private BiConsumer getEventListener() { - BiConsumer original = isNoLog() ? SdmxManager.NO_OP_EVENT_LISTENER : new LoggingListener()::onSourceEvent; + private SdmxSourceConsumer getEventListener() { + SdmxSourceConsumer original = isNoLog() ? SdmxManager.NO_OP_EVENT_LISTENER : new LoggingListener()::onSourceEvent; return new VerboseListener(original, verboseOptions)::onSourceEvent; } diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index e8aa6e8e0..e82f4df25 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -2,7 +2,6 @@ import nbbrd.io.curl.CurlHttpURLConnection; import sdmxdl.*; -import sdmxdl.provider.ext.MapCache; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -14,7 +13,6 @@ public static void main(String[] args) throws IOException { SdmxWebManager manager = SdmxWebManager.ofServiceLoader() .toBuilder() - .cache(MapCache.builder().build()) .network(EasyNetwork.DEFAULT .toBuilder() .urlConnectionFactory(() -> CurlHttpURLConnection::of) diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index 50e88213e..60582b07e 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -2,11 +2,6 @@ import lombok.NonNull; import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.ext.Cache; -import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; -import sdmxdl.format.spi.FileFormatProviderLoader; -import sdmxdl.provider.ext.FileCache; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.URLConnectionFactory; @@ -26,7 +21,6 @@ public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() .network(getNetwork()) - .cache(getCache()) .eventListener((source, msg) -> System.out.println(source.getId() + ": " + msg)) .build(); } @@ -54,13 +48,4 @@ private static Network getNetwork() { } }; } - - private static Cache getCache() { - FileFormatProvider fileFormatProvider = FileFormatProviderLoader.load().stream().findFirst().orElseThrow(RuntimeException::new); - return FileCache - .builder() - .repositoryFormat(FileFormat.gzip(fileFormatProvider.getDataRepositoryFormat())) - .monitorFormat(FileFormat.gzip(fileFormatProvider.getMonitorReportsFormat())) - .build(); - } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java similarity index 79% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java rename to sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index 14d8f9321..feeec720e 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/FileCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ext; +package sdmxdl.format; import lombok.NonNull; import nbbrd.design.VisibleForTesting; @@ -25,7 +25,6 @@ import sdmxdl.About; import sdmxdl.DataRepository; import sdmxdl.ext.Cache; -import sdmxdl.format.FileFormat; import sdmxdl.web.MonitorReports; import java.io.IOException; @@ -44,11 +43,11 @@ */ @lombok.Getter @lombok.Builder(toBuilder = true) -public final class FileCache implements Cache { +public final class DiskCache implements Cache { @lombok.NonNull @lombok.Builder.Default - private final Path root = requireNonNull(SystemProperties.DEFAULT.getJavaIoTmpdir()).resolve(About.NAME).resolve(About.VERSION); + private final Path root = SDMXDL_TMP_DIR; @lombok.NonNull @lombok.Builder.Default @@ -60,7 +59,7 @@ public final class FileCache implements Cache { @lombok.NonNull @lombok.Builder.Default - private final UnaryOperator fileNameGenerator = DEFAULT_GENERATOR; + private final UnaryOperator fileNameGenerator = NORMALIZE_HASH_CODE; @lombok.NonNull @lombok.Builder.Default @@ -72,7 +71,11 @@ public final class FileCache implements Cache { @lombok.NonNull @lombok.Builder.Default - private final BiConsumer onIOException = DO_NOT_REPORT; + private final BiConsumer onRead = DO_NOT_REPORT; + + @lombok.NonNull + @lombok.Builder.Default + private final BiConsumer onError = DO_NOT_REPORT; @lombok.NonNull @lombok.Builder.Default @@ -109,12 +112,15 @@ private boolean isValid(MonitorReports value) { private T read(FileFormat fileFormat, Predicate validator, String key, FileType fileType) { T result = read(fileFormat, fileType, key); if (result == null) { + onRead.accept(key, DiskCacheEvent.MISSED); return null; } if (!validator.test(result)) { delete(key, fileType, fileFormat); + onRead.accept(key, DiskCacheEvent.EXPIRED); return null; } + onRead.accept(key, DiskCacheEvent.HIT); return result; } @@ -124,7 +130,7 @@ private T read(FileFormat fileFormat, FileType fileType, String key) { try { return FileParser.onParsingLock(fileFormat.getParser()).parsePath(file); } catch (IOException ex) { - onIOException.accept("Failed reading '" + file + "'", ex); + onError.accept("Failed reading '" + file + "'", ex); } } return null; @@ -136,7 +142,7 @@ private void write(FileFormat fileFormat, String key, FileType fileType, try { FileFormatter.onFormattingLock(fileFormat.getFormatter()).formatPath(entry, file); } catch (IOException ex) { - onIOException.accept("Failed writing '" + file + "'", ex); + onError.accept("Failed writing '" + file + "'", ex); } } @@ -144,7 +150,7 @@ private void ensureParentExists(Path file) { try { Files.createDirectories(file.getParent()); } catch (IOException ex) { - onIOException.accept("While creating working dir '" + file + "'", ex); + onError.accept("While creating working dir '" + file + "'", ex); } } @@ -153,7 +159,7 @@ private void delete(String key, FileType fileType, FileFormat fileFormat) { try { Files.deleteIfExists(file); } catch (IOException ex) { - onIOException.accept("While deleting '" + file + "'", ex); + onError.accept("While deleting '" + file + "'", ex); } } @@ -162,11 +168,12 @@ Path getFile(String key, FileType fileType, FileFormat fileFormat) { return root.resolve(fileNamePrefix + fileType.name().charAt(0) + fileNameGenerator.apply(key) + fileNameSuffix + fileFormat.getFileExtension()); } - private static final UnaryOperator DEFAULT_GENERATOR = FileCache::generateFileNameFromHashCode; - private static final BiConsumer DO_NOT_REPORT = (msg, ex) -> { + public static final Path SDMXDL_TMP_DIR = requireNonNull(SystemProperties.DEFAULT.getJavaIoTmpdir()).resolve(About.NAME).resolve(About.VERSION); + private static final UnaryOperator NORMALIZE_HASH_CODE = DiskCache::normalizeHashCode; + private static final BiConsumer DO_NOT_REPORT = (msg, ex) -> { }; - private static String generateFileNameFromHashCode(String key) { + private static String normalizeHashCode(String key) { int hashCode = key.hashCode(); return String.format(Locale.ROOT, hashCode >= 0 ? "0%010d" : "1%010d", Math.abs(hashCode)); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java new file mode 100644 index 000000000..ecf8656ff --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java @@ -0,0 +1,6 @@ +package sdmxdl.format; + +public enum DiskCacheEvent { + + HIT, MISSED, EXPIRED +} diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java new file mode 100644 index 000000000..d5ecd5d6e --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java @@ -0,0 +1,107 @@ +package sdmxdl.format; + +import lombok.NonNull; +import sdmxdl.DataRepository; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceBiConsumer; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.format.spi.FileFormatProvider; +import sdmxdl.web.MonitorReports; +import sdmxdl.web.SdmxWebSource; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.Clock; +import java.util.Collection; +import java.util.Collections; + +@lombok.Builder(toBuilder = true) +public final class DiskCacheProviderSupport implements CacheProvider { + + @lombok.Getter + @lombok.NonNull + private final String cacheId; + + @lombok.Getter + @lombok.Builder.Default + private final int cacheRank = UNKNOWN_RANK; + + @lombok.NonNull + @lombok.Builder.Default + private final Path root = DiskCache.SDMXDL_TMP_DIR; + + @lombok.NonNull + @lombok.Builder.Default + private final FileFormat repositoryFormat = FileFormat.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final FileFormat monitorFormat = FileFormat.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final SdmxSourceBiConsumer onFileError = NO_OP_FILE_ERROR; + + @lombok.NonNull + @lombok.Builder.Default + private final SdmxSourceBiConsumer onWebError = NO_OP_WEB_ERROR; + + @lombok.NonNull + @lombok.Builder.Default + private final Clock clock = Clock.systemDefaultZone(); + + @lombok.Builder.Default + private final boolean noCompression = false; + + private DiskCache.Builder newFileCacheBuilder() { + return DiskCache + .builder() + .root(root) + .repositoryFormat(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) + .monitorFormat(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat)) + .clock(clock); + } + + @Override + public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + return newFileCacheBuilder() + .onRead((key, event) -> eventListener.accept(source, event.name() + " " + key)) + .onError(onFileError.asBiConsumer(source)) + .build(); + } + + @Override + public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + return newFileCacheBuilder() + .onRead((key, event) -> eventListener.accept(source, event.name() + " " + key)) + .onError(onWebError.asBiConsumer(source)) + .build(); + } + + @Override + public @NonNull Collection getSupportedFileProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Collection getSupportedWebProperties() { + return Collections.emptyList(); + } + + public static final class Builder { + + public @NonNull Builder formatProvider(@NonNull FileFormatProvider formatProvider) { + repositoryFormat(formatProvider.getDataRepositoryFormat()); + monitorFormat(formatProvider.getMonitorReportsFormat()); + return this; + } + } + + public static final SdmxSourceBiConsumer NO_OP_FILE_ERROR = (source, t, u) -> { + }; + + public static final SdmxSourceBiConsumer NO_OP_WEB_ERROR = (source, t, u) -> { + }; +} diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java index 7a4cbe82f..3465deb66 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java @@ -3,6 +3,7 @@ import lombok.NonNull; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; +import nbbrd.service.ServiceId; import nbbrd.service.ServiceSorter; import sdmxdl.DataRepository; import sdmxdl.format.FileFormat; @@ -13,7 +14,7 @@ ) public interface FileFormatProvider { - // @ServiceId + @ServiceId @NonNull String getId(); @ServiceSorter(reverse = true) diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java similarity index 90% rename from sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java rename to sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java index 65d123193..129c81144 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/FileCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java @@ -14,14 +14,13 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ext; +package sdmxdl.format; import nbbrd.io.FileFormatter; import nbbrd.io.FileParser; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import sdmxdl.DataRepository; -import sdmxdl.format.FileFormat; import tests.sdmxdl.ext.CacheAssert; import tests.sdmxdl.ext.FakeClock; @@ -41,11 +40,11 @@ /** * @author Philippe Charles */ -public class FileCacheTest { +public class DiskCacheTest { @Test public void testCompliance() { - CacheAssert.assertCompliance(FileCache.builder().build()); + CacheAssert.assertCompliance(DiskCache.builder().build()); } @Test @@ -56,13 +55,13 @@ public void testGetSet(@TempDir Path temp) throws IOException { List exceptions = new ArrayList<>(); - FileCache cache = FileCache + DiskCache cache = DiskCache .builder() .root(temp.resolve("testfolder")) .fileNameGenerator(UnaryOperator.identity()) .repositoryFormat(serializer) .clock(clock) - .onIOException((message, exception) -> exceptions.add(exception)) + .onError((message, exception) -> exceptions.add(exception)) .build(); assertThat(cache.getRoot()) @@ -77,7 +76,7 @@ public void testGetSet(@TempDir Path temp) throws IOException { .ttl(clock.instant(), Duration.ofMillis(10)) .build(); cache.putRepository("KEY1", r1); - assertThat(cache.getFile("KEY1", FileCache.FileType.REPOSITORY, serializer)) + assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) .exists() .hasContent("r1"); @@ -94,7 +93,7 @@ public void testGetSet(@TempDir Path temp) throws IOException { assertThat(cache.getRepository("KEY1")) .as("Expired key should return null") .isNull(); - assertThat(cache.getFile("KEY1", FileCache.FileType.REPOSITORY, serializer)) + assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) .as("Expired key should be deleted") .doesNotExist(); @@ -109,7 +108,7 @@ public void testGetSet(@TempDir Path temp) throws IOException { .build(); cache.putRepository("KEY1", r1b); cache.putRepository("KEY1", r2); - assertThat(cache.getFile("KEY1", FileCache.FileType.REPOSITORY, serializer)) + assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) .exists() .hasContent("r2"); assertThat(cache.getRepository("KEY1")) diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index 44dbab9ca..c6d3fdddd 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -9,5 +9,6 @@ exports sdmxdl.format.kryo; + provides sdmxdl.ext.spi.CacheProvider with sdmxdl.format.kryo.KryoProvider; provides sdmxdl.format.spi.FileFormatProvider with sdmxdl.format.kryo.KryoProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index 3b7c436c0..bc50030cc 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -3,21 +3,36 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.format.DiskCacheProviderSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.FileFormatProvider; import sdmxdl.web.MonitorReports; -@ServiceProvider -public final class KryoProvider implements FileFormatProvider { +@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(CacheProvider.class) +public final class KryoProvider implements FileFormatProvider, CacheProvider { + + private static final String ID = "KRYO"; + + private static final int RANK = 400; + + @lombok.experimental.Delegate + private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + .builder() + .cacheId(ID) + .cacheRank(RANK) + .formatProvider(this) + .build(); @Override public @NonNull String getId() { - return "KRYO"; + return ID; } @Override public int getRank() { - return 400; + return RANK; } @Override diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index 429f99484..eb8f051ab 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -11,6 +11,9 @@ exports sdmxdl.format.protobuf; exports sdmxdl.format.protobuf.web; + provides sdmxdl.ext.spi.CacheProvider with + sdmxdl.format.protobuf.JsonProvider, + sdmxdl.format.protobuf.ProtobufProvider; provides sdmxdl.format.spi.FileFormatProvider with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index 7c7c1d401..a24f31597 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -4,6 +4,8 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.format.DiskCacheProviderSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.FileFormatProvider; import sdmxdl.web.MonitorReports; @@ -15,20 +17,34 @@ import static nbbrd.io.text.TextFormatter.onFormattingWriter; import static nbbrd.io.text.TextParser.onParsingReader; -@ServiceProvider -public final class JsonProvider implements FileFormatProvider { +@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(CacheProvider.class) +public final class JsonProvider implements FileFormatProvider, CacheProvider { + + private static final String ID = "JSON"; + + private static final int RANK = 200; private final JsonFormat.Parser jsonParser = JsonFormat.parser(); + private final JsonFormat.Printer jsonFormatter = JsonFormat.printer(); + @lombok.experimental.Delegate + private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + .builder() + .cacheId(ID) + .cacheRank(RANK) + .formatProvider(this) + .build(); + @Override public @NonNull String getId() { - return "JSON"; + return ID; } @Override public int getRank() { - return 200; + return RANK; } @Override diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index 249d8e455..4000dc744 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -4,6 +4,8 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.format.DiskCacheProviderSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.FileFormatProvider; import sdmxdl.web.MonitorReports; @@ -14,17 +16,30 @@ import static nbbrd.io.FileFormatter.onFormattingStream; import static nbbrd.io.FileParser.onParsingStream; -@ServiceProvider -public final class ProtobufProvider implements FileFormatProvider { +@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(CacheProvider.class) +public final class ProtobufProvider implements FileFormatProvider, CacheProvider { + + private static final String ID = "PROTOBUF"; + + private static final int RANK = 300; + + @lombok.experimental.Delegate + private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + .builder() + .cacheId(ID) + .cacheRank(RANK) + .formatProvider(this) + .build(); @Override public @NonNull String getId() { - return "PROTOBUF"; + return ID; } @Override public int getRank() { - return 300; + return RANK; } @Override diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index 868a36f1b..b7a3fa7a3 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -2,11 +2,6 @@ import lombok.NonNull; import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.ext.Cache; -import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; -import sdmxdl.format.spi.FileFormatProviderLoader; -import sdmxdl.provider.ext.FileCache; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.URLConnectionFactory; @@ -23,7 +18,6 @@ public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() .network(getNetwork()) - .cache(getCache()) .build(); } @@ -50,13 +44,4 @@ private static Network getNetwork() { } }; } - - private static Cache getCache() { - FileFormatProvider fileFormatProvider = FileFormatProviderLoader.load().stream().findFirst().orElseThrow(RuntimeException::new);; - return FileCache - .builder() - .repositoryFormat(FileFormat.gzip(fileFormatProvider.getDataRepositoryFormat())) - .monitorFormat(FileFormat.gzip(fileFormatProvider.getMonitorReportsFormat())) - .build(); - } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java new file mode 100644 index 000000000..9ae6e0f2b --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java @@ -0,0 +1,60 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; + +import java.time.Clock; +import java.util.Collection; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; + +@lombok.Builder(toBuilder = true) +public final class DualCacheProviderSupport implements CacheProvider { + + @lombok.Getter + @lombok.NonNull + private final String cacheId; + + @lombok.Getter + @lombok.Builder.Default + private final int cacheRank = UNKNOWN_RANK; + + @lombok.NonNull + @lombok.Builder.Default + private final CacheProvider first = CacheProvider.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final CacheProvider second = CacheProvider.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final Clock clock = Clock.systemDefaultZone(); + + @Override + public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + Cache main = first.getFileCache(source, eventListener); + return new DualCache(main, second.getFileCache(source, eventListener), clock); + } + + @Override + public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + Cache main = first.getWebCache(source, eventListener); + return new DualCache(main, second.getWebCache(source, eventListener), clock); + } + + @Override + public @NonNull Collection getSupportedFileProperties() { + return Stream.concat(first.getSupportedFileProperties().stream(), second.getSupportedFileProperties().stream()).collect(toList()); + } + + @Override + public @NonNull Collection getSupportedWebProperties() { + return Stream.concat(first.getSupportedWebProperties().stream(), second.getSupportedWebProperties().stream()).collect(toList()); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java similarity index 75% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java index a06c86811..45db51e7f 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MapCache.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java @@ -24,8 +24,8 @@ import sdmxdl.web.MonitorReports; import java.time.Clock; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.HashMap; +import java.util.Map; import java.util.function.Predicate; /** @@ -33,15 +33,15 @@ */ @lombok.Getter @lombok.Builder(toBuilder = true) -public final class MapCache implements Cache { +public final class MemCache implements Cache { @lombok.NonNull @lombok.Builder.Default - private final ConcurrentMap repositories = new ConcurrentHashMap<>(); + private final Map repositories = new HashMap<>(); @lombok.NonNull @lombok.Builder.Default - private final ConcurrentMap webMonitors = new ConcurrentHashMap<>(); + private final Map webMonitors = new HashMap<>(); @lombok.NonNull @lombok.Builder.Default @@ -68,17 +68,17 @@ public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value } @VisibleForTesting - static DataRepository getRepository(@NonNull ConcurrentMap map, @NonNull Clock clock, @NonNull String key) { + static DataRepository getRepository(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { return get(reports -> !reports.isExpired(clock), map, key); } @VisibleForTesting - static MonitorReports getWebMonitorReports(@NonNull ConcurrentMap map, @NonNull Clock clock, @NonNull String key) { + static MonitorReports getWebMonitorReports(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { return get(reports -> !reports.isExpired(clock), map, key); } @Nullable - private static T get(@NonNull Predicate validator, @NonNull ConcurrentMap map, @NonNull String key) { + private static T get(@NonNull Predicate validator, @NonNull Map map, @NonNull String key) { T result = map.get(key); if (result == null) { return null; @@ -90,7 +90,7 @@ private static T get(@NonNull Predicate validator, @NonNull ConcurrentMap return result; } - private static void put(@NonNull ConcurrentMap map, @NonNull String key, @NonNull T value) { + private static void put(@NonNull Map map, @NonNull String key, @NonNull T value) { map.put(key, value); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java new file mode 100644 index 000000000..b458fd980 --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java @@ -0,0 +1,48 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; + +import java.time.Clock; +import java.util.Collection; +import java.util.Collections; + +@lombok.Builder(toBuilder = true) +public final class MemCacheProviderSupport implements CacheProvider { + + @lombok.Getter + @lombok.NonNull + private final String cacheId; + + @lombok.Getter + @lombok.Builder.Default + private final int cacheRank = UNKNOWN_RANK; + + @lombok.NonNull + @lombok.Builder.Default + private final Clock clock = Clock.systemDefaultZone(); + + @Override + public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + return MemCache.builder().clock(clock).build(); + } + + @Override + public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + return MemCache.builder().clock(clock).build(); + } + + @Override + public @NonNull Collection getSupportedFileProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Collection getSupportedWebProperties() { + return Collections.emptyList(); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/VerboseCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/VerboseCache.java deleted file mode 100644 index 29ea90d62..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/VerboseCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; -import sdmxdl.web.MonitorReports; - -import java.time.Clock; -import java.util.function.BiConsumer; - -@lombok.AllArgsConstructor -public final class VerboseCache implements Cache { - - @lombok.NonNull - private final Cache delegate; - - @lombok.NonNull - private final BiConsumer onRepository; - - @lombok.NonNull - private final BiConsumer onWebMonitorReports; - - @Override - public @NonNull Clock getClock() { - return delegate.getClock(); - } - - @Override - @Nullable - public DataRepository getRepository(@NonNull String key) { - DataRepository result = delegate.getRepository(key); - onRepository.accept(key, result != null); - return result; - } - - @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { - delegate.putRepository(key, value); - } - - @Override - @Nullable - public MonitorReports getMonitorReports(@NonNull String key) { - MonitorReports result = delegate.getMonitorReports(key); - onWebMonitorReports.accept(key, result != null); - return result; - } - - @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - delegate.putMonitorReports(key, value); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index 04b4427eb..a32fd1085 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -33,7 +33,7 @@ public final class RestConnector implements WebConnector { private RestClient getClient(SdmxWebSource source, WebContext context) throws IOException { return CachedRestClient.of( client.get(source, context), - context.getCache(), + context.getCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, context.getLanguages()); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java index d01ab0357..6e2e2d251 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java @@ -41,7 +41,7 @@ public final class WebDriverSupport implements WebDriver { @lombok.Getter @lombok.Builder.Default - private final int rank = UNKNOWN; + private final int rank = UNKNOWN_RANK; @NonNull private final WebConnector connector; diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java index 53847f15a..effb54e94 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java @@ -3,7 +3,7 @@ import nbbrd.io.function.IOFunction; import org.assertj.core.api.Condition; import sdmxdl.DataRepository; -import sdmxdl.provider.ext.MapCache; +import sdmxdl.provider.ext.MemCache; import sdmxdl.web.MonitorReports; import tests.sdmxdl.ext.FakeClock; @@ -12,8 +12,8 @@ import java.time.Duration; import java.time.Instant; import java.time.ZoneId; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -39,10 +39,10 @@ public static class Context { AtomicInteger count = new AtomicInteger(0); @lombok.NonNull - ConcurrentMap map = new ConcurrentHashMap<>(); + Map map = new HashMap<>(); @lombok.NonNull - ConcurrentMap monitors = new ConcurrentHashMap<>(); + Map monitors = new HashMap<>(); @lombok.NonNull FakeClock clock = new FakeClock().set(0); @@ -53,8 +53,8 @@ public void reset() { clock.set(0); } - public MapCache newCache() { - return MapCache.builder().repositories(map).webMonitors(monitors).clock(clock).build(); + public MemCache newCache() { + return MemCache.builder().repositories(map).webMonitors(monitors).clock(clock).build(); } } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java index c6f205ff9..1192f3413 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; import sdmxdl.ext.Cache; -import sdmxdl.provider.ext.MapCache; +import sdmxdl.provider.ext.MemCache; import tests.sdmxdl.ext.FakeClock; import java.io.IOException; @@ -26,7 +26,7 @@ public void test() throws IOException { FakeClock clock = new FakeClock(); - Cache cache = MapCache.builder().clock(clock).build(); + Cache cache = MemCache.builder().clock(clock).build(); IOSupplier factory = new AtomicInteger()::getAndIncrement; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java similarity index 78% rename from sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java rename to sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java index 21aa8101e..48dd8c1e1 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MapCacheTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java @@ -21,8 +21,8 @@ import tests.sdmxdl.ext.CacheAssert; import java.time.Duration; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; +import java.util.HashMap; +import java.util.Map; import static _test.sdmxdl.util.CachingAssert.clock; import static org.assertj.core.api.Assertions.assertThat; @@ -30,18 +30,18 @@ /** * @author Philippe Charles */ -public class MapCacheTest { +public class MemCacheTest { @Test public void testCompliance() { - CacheAssert.assertCompliance(MapCache.builder().build()); + CacheAssert.assertCompliance(MemCache.builder().build()); } @Test public void testGetRepository() { - ConcurrentMap map = new ConcurrentHashMap<>(); + Map map = new HashMap<>(); - assertThat(MapCache.getRepository(map, clock(1000), "KEY1")) + assertThat(MemCache.getRepository(map, clock(1000), "KEY1")) .as("Empty map should return null") .isNull(); @@ -51,18 +51,18 @@ public void testGetRepository() { .ttl(clock(1000).instant(), Duration.ofMillis(10)) .build(); map.put("KEY1", r1000); - assertThat(MapCache.getRepository(map, clock(1009), "KEY1")) + assertThat(MemCache.getRepository(map, clock(1009), "KEY1")) .as("Non-expired key should return value") .isEqualTo(r1000); - assertThat(MapCache.getRepository(map, clock(1010), "KEY1")) + assertThat(MemCache.getRepository(map, clock(1010), "KEY1")) .as("Expired key should return null") .isNull(); assertThat(map) .as("Expired key should be evicted") .doesNotContainKey("KEY1"); - assertThat(MapCache.getRepository(map, clock(1009), "KEY2")) + assertThat(MemCache.getRepository(map, clock(1009), "KEY2")) .as("Non-existing key should return null") .isNull(); @@ -72,7 +72,7 @@ public void testGetRepository() { .ttl(clock(1009).instant(), Duration.ofMillis(10)) .build(); map.put("KEY1", r1009); - assertThat(MapCache.getRepository(map, clock(1010), "KEY1")) + assertThat(MemCache.getRepository(map, clock(1010), "KEY1")) .as("Updated key should return updated value") .isEqualTo(r1009); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java index fc513d9e2..afb3746b3 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -10,10 +10,10 @@ import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; +import sdmxdl.format.ObsParser; import sdmxdl.provider.file.CachedFileClient; -import sdmxdl.provider.file.FileConnection; import sdmxdl.provider.file.FileClient; -import sdmxdl.format.ObsParser; +import sdmxdl.provider.file.FileConnection; import java.io.File; import java.io.IOException; @@ -47,7 +47,7 @@ private FileClient getClient(SdmxFileSource source, FileContext context) throws ObsParser::newDefault, context.getEventListener() ); - return CachedFileClient.of(client, context.getCache(), source, context.getLanguages()); + return CachedFileClient.of(client, context.getCache(source), source, context.getLanguages()); } private static final DataStructureRef EMPTY = DataStructureRef.of("", "", ""); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 7d755a7d3..23d5ea755 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -8,6 +8,9 @@ import nbbrd.io.text.Property; import nbbrd.service.ServiceProvider; import sdmxdl.Connection; +import sdmxdl.ext.Cache; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ext.spi.CacheProvider; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.web.WebDriverSupport; @@ -18,6 +21,8 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.util.Collection; +import java.util.Collections; @ServiceProvider public final class FileDriver implements WebDriver { @@ -44,11 +49,55 @@ public final class FileDriver implements WebDriver { .toBuilder() .languages(context.getLanguages()) .eventListener((fileSource, message) -> context.getEventListener().accept(source, message)) - .cache(context.getCache()) + .cacheProvider(new FileToWebCacheFactory(source, context.getCacheProvider(), context.getEventListener())) .build() .getConnection(toFileSource(source)); } + @lombok.AllArgsConstructor + private static final class FileToWebCacheFactory implements CacheProvider { + + private final @NonNull SdmxWebSource webSource; + + private final @NonNull CacheProvider webCacheFactory; + + private final @NonNull SdmxSourceConsumer eventListener; + + private Cache getCache() { + return webCacheFactory.getWebCache(webSource, eventListener); + } + + @Override + public @NonNull String getCacheId() { + return webCacheFactory.getCacheId(); + } + + @Override + public int getCacheRank() { + return webCacheFactory.getCacheRank(); + } + + @Override + public @NonNull Cache getFileCache(@NonNull SdmxFileSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { + return getCache(); + } + + @Override + public @NonNull Cache getWebCache(@NonNull SdmxWebSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { + return getCache(); + } + + @Override + public @NonNull Collection getSupportedFileProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Collection getSupportedWebProperties() { + return webCacheFactory.getSupportedWebProperties(); + } + } + private static SdmxFileSource toFileSource(SdmxWebSource source) throws IOException { return SdmxFileSource .builder() diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index f8c4dc7e4..1cd608d5f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -89,7 +89,7 @@ public final class PxWebDriver implements WebDriver { PxWebClient cachedClient = CachedPxWebClient.of( client, - context.getCache(), + context.getCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, context.getLanguages() diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index c0a9b1502..09de61ce6 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -88,7 +88,7 @@ public final class StatCanDriver implements WebDriver { StatCanClient cachedClient = CachedStatCanClient.of( client, - context.getCache(), CACHE_TTL_PROPERTY.get(source.getProperties()), + context.getCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, context.getLanguages() ); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java index 8f5625ada..e433111ec 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java @@ -40,7 +40,7 @@ public final class UpptimeMonitoring implements WebMonitoring { UpptimeId id = UpptimeId.parse(source.getMonitor()); - Cache cache = context.getCache(); + Cache cache = context.getCache(source); String key = id.toSummaryURL().toString(); MonitorReports reports = cache.getMonitorReports(key); From 75456502efe86891925e07272a47738a3ba90f21 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 5 Jul 2023 16:27:10 +0200 Subject: [PATCH 029/114] Refactor file format API --- CHANGELOG.md | 1 + .../internal/sdmxdl/cli/WebNetOptions.java | 2 +- .../internal/sdmxdl/cli/ext/CacheOptions.java | 16 ++--- .../src/main/java/module-info.java | 4 +- .../format/DiskCacheProviderSupport.java | 8 +-- ...leFormatProvider.java => Persistence.java} | 8 ++- .../sdmxdl/format/spi/PersistenceSupport.java | 45 ++++++++++++ ...rAssert.java => FileFormattingAssert.java} | 14 ++-- .../src/main/java/module-info.java | 4 +- .../java/sdmxdl/format/kryo/KryoProvider.java | 14 ++-- .../sdmxdl/format/kryo/KryoProviderTest.java | 4 +- .../src/main/java/module-info.java | 4 +- .../sdmxdl/format/protobuf/JsonProvider.java | 68 +++++++------------ .../format/protobuf/ProtobufProvider.java | 61 ++++++----------- .../format/protobuf/JsonProviderTest.java | 4 +- .../format/protobuf/ProtobufProviderTest.java | 4 +- 16 files changed, 136 insertions(+), 125 deletions(-) rename sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/{FileFormatProvider.java => Persistence.java} (81%) create mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java rename sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/{FileFormatProviderAssert.java => FileFormattingAssert.java} (88%) diff --git a/CHANGELOG.md b/CHANGELOG.md index c698b4e09..a92361fc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Refactor cache API [#500](https://github.com/nbbrd/sdmx-dl/issues/500) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) +- ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project - ![GRPC] Migrate gRPC module to Quarkus framework diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 079961393..aeae58b06 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -134,7 +134,7 @@ private static CacheProvider getCacheProvider(CacheOptions cacheOptions, Verbose .builder() .cacheId("DISK") .root(root) - .formatProvider(cacheOptions.getCacheFormat()) + .persistence(cacheOptions.getCacheFormat()) .onFileError((src, msg, ex) -> reportFileError(verboseOptions, src, msg, ex)) .onWebError((src, msg, ex) -> reportWebError(verboseOptions, src, msg, ex)) .clock(clock) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java index 1fb5ce684..72d99cbd4 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java @@ -1,8 +1,8 @@ package internal.sdmxdl.cli.ext; import picocli.CommandLine; -import sdmxdl.format.spi.FileFormatProvider; -import sdmxdl.format.spi.FileFormatProviderLoader; +import sdmxdl.format.spi.Persistence; +import sdmxdl.format.spi.PersistenceLoader; import java.io.File; import java.util.List; @@ -43,19 +43,19 @@ public class CacheOptions { converter = FileFormatters.class, hidden = true ) - private FileFormatProvider cacheFormat = PROVIDERS.stream() - .filter(provider -> provider.getId().equals("PROTOBUF")) + private Persistence cacheFormat = PROVIDERS.stream() + .filter(provider -> provider.getPersistenceId().equals("PROTOBUF")) .findFirst() .orElseThrow(NoSuchElementException::new); - private static final List PROVIDERS = FileFormatProviderLoader.load(); + private static final List PROVIDERS = PersistenceLoader.load(); - private static final class FileFormatters implements CommandLine.ITypeConverter { + private static final class FileFormatters implements CommandLine.ITypeConverter { @Override - public FileFormatProvider convert(String value) throws Exception { + public Persistence convert(String value) throws Exception { return PROVIDERS.stream() - .filter(provider -> provider.getId().equals(value)) + .filter(provider -> provider.getPersistenceId().equals(value)) .findFirst() .orElseThrow(NoSuchElementException::new); } diff --git a/sdmx-dl-format-base/src/main/java/module-info.java b/sdmx-dl-format-base/src/main/java/module-info.java index 81e3586e3..f57cb3596 100644 --- a/sdmx-dl-format-base/src/main/java/module-info.java +++ b/sdmx-dl-format-base/src/main/java/module-info.java @@ -1,3 +1,5 @@ +import sdmxdl.format.spi.Persistence; + module sdmxdl.format.base { requires static lombok; @@ -12,5 +14,5 @@ exports sdmxdl.format.time; exports sdmxdl.format.spi; - uses sdmxdl.format.spi.FileFormatProvider; + uses Persistence; } \ No newline at end of file diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java index d5ecd5d6e..d383d30d5 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java @@ -7,7 +7,7 @@ import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.ext.spi.CacheProvider; import sdmxdl.file.SdmxFileSource; -import sdmxdl.format.spi.FileFormatProvider; +import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; @@ -92,9 +92,9 @@ private DiskCache.Builder newFileCacheBuilder() { public static final class Builder { - public @NonNull Builder formatProvider(@NonNull FileFormatProvider formatProvider) { - repositoryFormat(formatProvider.getDataRepositoryFormat()); - monitorFormat(formatProvider.getMonitorReportsFormat()); + public @NonNull Builder persistence(@NonNull Persistence persistence) { + repositoryFormat(persistence.getDataRepositoryFormat()); + monitorFormat(persistence.getMonitorReportsFormat()); return this; } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java similarity index 81% rename from sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java rename to sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java index 3465deb66..0b5324979 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/FileFormatProvider.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java @@ -12,15 +12,17 @@ @ServiceDefinition( quantifier = Quantifier.MULTIPLE ) -public interface FileFormatProvider { +public interface Persistence { @ServiceId - @NonNull String getId(); + @NonNull String getPersistenceId(); @ServiceSorter(reverse = true) - int getRank(); + int getPersistenceRank(); @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException; @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException; + + int UNKNOWN_PERSISTENCE_RANK = -1; } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java new file mode 100644 index 000000000..90f6c35a3 --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java @@ -0,0 +1,45 @@ +package sdmxdl.format.spi; + +import lombok.NonNull; +import nbbrd.io.FileFormatter; +import nbbrd.io.FileParser; +import sdmxdl.DataRepository; +import sdmxdl.format.FileFormat; +import sdmxdl.web.MonitorReports; + +@lombok.Builder(toBuilder = true) +public final class PersistenceSupport implements Persistence { + + @lombok.Getter + @lombok.NonNull + private final String persistenceId; + + @lombok.Getter + @lombok.Builder.Default + private final int persistenceRank = UNKNOWN_PERSISTENCE_RANK; + + @lombok.NonNull + private final FileParser monitorReportsParser; + + @lombok.NonNull + private final FileFormatter monitorReportsFormatter; + + @lombok.NonNull + private final FileParser dataRepositoryParser; + + @lombok.NonNull + private final FileFormatter dataRepositoryFormatter; + + @lombok.NonNull + private final String fileExtension; + + @Override + public @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException { + return new FileFormat<>(monitorReportsParser, monitorReportsFormatter, fileExtension); + } + + @Override + public @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException { + return new FileFormat<>(dataRepositoryParser, dataRepositoryFormatter, fileExtension); + } +} diff --git a/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormatProviderAssert.java b/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormattingAssert.java similarity index 88% rename from sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormatProviderAssert.java rename to sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormattingAssert.java index d30b20d15..9b7a67fc7 100644 --- a/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormatProviderAssert.java +++ b/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/FileFormattingAssert.java @@ -21,7 +21,7 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.DataRepository; import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; +import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; import tests.sdmxdl.api.RepoSamples; import tests.sdmxdl.api.TckUtil; @@ -33,15 +33,15 @@ import java.time.Duration; @lombok.experimental.UtilityClass -public class FileFormatProviderAssert { +public class FileFormattingAssert { - public void assertCompliance(FileFormatProvider provider) { - TckUtil.run(s -> assertCompliance(s, provider)); + public void assertCompliance(Persistence formatting) { + TckUtil.run(s -> assertCompliance(s, formatting)); } - public void assertCompliance(SoftAssertions s, FileFormatProvider provider) throws Exception { - checkDataRepository(s, provider.getDataRepositoryFormat()); - checkMonitorReports(s, provider.getMonitorReportsFormat()); + public void assertCompliance(SoftAssertions s, Persistence formatting) throws Exception { + checkDataRepository(s, formatting.getDataRepositoryFormat()); + checkMonitorReports(s, formatting.getMonitorReportsFormat()); } private void checkDataRepository(SoftAssertions s, FileFormat fileFormat) throws IOException { diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index c6d3fdddd..7f5ea2217 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -1,3 +1,5 @@ +import sdmxdl.format.spi.Persistence; + module sdmxdl.format.kryo { requires static lombok; @@ -10,5 +12,5 @@ exports sdmxdl.format.kryo; provides sdmxdl.ext.spi.CacheProvider with sdmxdl.format.kryo.KryoProvider; - provides sdmxdl.format.spi.FileFormatProvider with sdmxdl.format.kryo.KryoProvider; + provides Persistence with sdmxdl.format.kryo.KryoProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index bc50030cc..81e79d860 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -6,32 +6,32 @@ import sdmxdl.ext.spi.CacheProvider; import sdmxdl.format.DiskCacheProviderSupport; import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; +import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; -@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(Persistence.class) @ServiceProvider(CacheProvider.class) -public final class KryoProvider implements FileFormatProvider, CacheProvider { +public final class KryoProvider implements Persistence, CacheProvider { private static final String ID = "KRYO"; private static final int RANK = 400; @lombok.experimental.Delegate - private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + private final DiskCacheProviderSupport caching = DiskCacheProviderSupport .builder() .cacheId(ID) .cacheRank(RANK) - .formatProvider(this) + .persistence(this) .build(); @Override - public @NonNull String getId() { + public @NonNull String getPersistenceId() { return ID; } @Override - public int getRank() { + public int getPersistenceRank() { return RANK; } diff --git a/sdmx-dl-format-kryo/src/test/java/sdmxdl/format/kryo/KryoProviderTest.java b/sdmx-dl-format-kryo/src/test/java/sdmxdl/format/kryo/KryoProviderTest.java index d97622dbc..70f6fa18b 100644 --- a/sdmx-dl-format-kryo/src/test/java/sdmxdl/format/kryo/KryoProviderTest.java +++ b/sdmx-dl-format-kryo/src/test/java/sdmxdl/format/kryo/KryoProviderTest.java @@ -1,13 +1,13 @@ package sdmxdl.format.kryo; import org.junit.jupiter.api.Test; -import tests.sdmxdl.format.FileFormatProviderAssert; +import tests.sdmxdl.format.FileFormattingAssert; public class KryoProviderTest { @Test public void testCompliance() { - FileFormatProviderAssert.assertCompliance(new KryoProvider()); + FileFormattingAssert.assertCompliance(new KryoProvider()); } } \ No newline at end of file diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index eb8f051ab..8be9323fa 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -1,3 +1,5 @@ +import sdmxdl.format.spi.Persistence; + module sdmxdl.format.protobuf { requires static lombok; @@ -14,7 +16,7 @@ provides sdmxdl.ext.spi.CacheProvider with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; - provides sdmxdl.format.spi.FileFormatProvider with + provides Persistence with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index a24f31597..9c1f3f1bd 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -1,14 +1,11 @@ package sdmxdl.format.protobuf; import com.google.protobuf.util.JsonFormat; -import lombok.NonNull; import nbbrd.service.ServiceProvider; -import sdmxdl.DataRepository; import sdmxdl.ext.spi.CacheProvider; import sdmxdl.format.DiskCacheProviderSupport; -import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; -import sdmxdl.web.MonitorReports; +import sdmxdl.format.spi.Persistence; +import sdmxdl.format.spi.PersistenceSupport; import java.io.IOException; import java.io.Reader; @@ -17,62 +14,43 @@ import static nbbrd.io.text.TextFormatter.onFormattingWriter; import static nbbrd.io.text.TextParser.onParsingReader; -@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(Persistence.class) @ServiceProvider(CacheProvider.class) -public final class JsonProvider implements FileFormatProvider, CacheProvider { +public final class JsonProvider implements Persistence, CacheProvider { - private static final String ID = "JSON"; + private final JsonFormat.Parser parser = JsonFormat.parser(); - private static final int RANK = 200; - - private final JsonFormat.Parser jsonParser = JsonFormat.parser(); - - private final JsonFormat.Printer jsonFormatter = JsonFormat.printer(); + private final JsonFormat.Printer formatter = JsonFormat.printer(); @lombok.experimental.Delegate - private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + private final PersistenceSupport persistence = PersistenceSupport .builder() - .cacheId(ID) - .cacheRank(RANK) - .formatProvider(this) + .persistenceId("JSON") + .persistenceRank(200) + .monitorReportsParser(onParsingReader(this::parseJsonReports).andThen(ProtobufMonitors::toMonitorReports).asFileParser(UTF_8)) + .monitorReportsFormatter(onFormattingWriter(formatter::appendTo).compose(ProtobufMonitors::fromMonitorReports).asFileFormatter(UTF_8)) + .dataRepositoryParser(onParsingReader(this::parseJsonRepository).andThen(ProtobufRepositories::toDataRepository).asFileParser(UTF_8)) + .dataRepositoryFormatter(onFormattingWriter(formatter::appendTo).compose(ProtobufRepositories::fromDataRepository).asFileFormatter(UTF_8)) + .fileExtension(".json") .build(); - @Override - public @NonNull String getId() { - return ID; - } - - @Override - public int getRank() { - return RANK; - } - - @Override - public @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException { - return new FileFormat<>( - onParsingReader(this::parseJsonReports).andThen(ProtobufMonitors::toMonitorReports).asFileParser(UTF_8), - onFormattingWriter(jsonFormatter::appendTo).compose(ProtobufMonitors::fromMonitorReports).asFileFormatter(UTF_8), - ".json" - ); - } - - @Override - public @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException { - return new FileFormat<>( - onParsingReader(this::parseJsonRepository).andThen(ProtobufRepositories::toDataRepository).asFileParser(UTF_8), - onFormattingWriter(jsonFormatter::appendTo).compose(ProtobufRepositories::fromDataRepository).asFileFormatter(UTF_8), - ".json"); - } + @lombok.experimental.Delegate + private final DiskCacheProviderSupport caching = DiskCacheProviderSupport + .builder() + .cacheId(persistence.getPersistenceId()) + .cacheRank(persistence.getPersistenceRank()) + .persistence(persistence) + .build(); private sdmxdl.format.protobuf.web.MonitorReports parseJsonReports(Reader reader) throws IOException { sdmxdl.format.protobuf.web.MonitorReports.Builder builder = sdmxdl.format.protobuf.web.MonitorReports.newBuilder(); - jsonParser.merge(reader, builder); + parser.merge(reader, builder); return builder.build(); } private sdmxdl.format.protobuf.DataRepository parseJsonRepository(Reader reader) throws IOException { sdmxdl.format.protobuf.DataRepository.Builder builder = sdmxdl.format.protobuf.DataRepository.newBuilder(); - jsonParser.merge(reader, builder); + parser.merge(reader, builder); return builder.build(); } } diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index 4000dc744..e14d88f15 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -1,14 +1,12 @@ package sdmxdl.format.protobuf; import com.google.protobuf.MessageLite; -import lombok.NonNull; import nbbrd.service.ServiceProvider; -import sdmxdl.DataRepository; import sdmxdl.ext.spi.CacheProvider; import sdmxdl.format.DiskCacheProviderSupport; -import sdmxdl.format.FileFormat; -import sdmxdl.format.spi.FileFormatProvider; -import sdmxdl.web.MonitorReports; +import sdmxdl.format.protobuf.web.MonitorReports; +import sdmxdl.format.spi.Persistence; +import sdmxdl.format.spi.PersistenceSupport; import java.io.IOException; import java.io.OutputStream; @@ -16,48 +14,29 @@ import static nbbrd.io.FileFormatter.onFormattingStream; import static nbbrd.io.FileParser.onParsingStream; -@ServiceProvider(FileFormatProvider.class) +@ServiceProvider(Persistence.class) @ServiceProvider(CacheProvider.class) -public final class ProtobufProvider implements FileFormatProvider, CacheProvider { - - private static final String ID = "PROTOBUF"; - - private static final int RANK = 300; +public final class ProtobufProvider implements Persistence, CacheProvider { @lombok.experimental.Delegate - private final DiskCacheProviderSupport cacheProvider = DiskCacheProviderSupport + private final PersistenceSupport persistence = PersistenceSupport .builder() - .cacheId(ID) - .cacheRank(RANK) - .formatProvider(this) + .persistenceId("PROTOBUF") + .persistenceRank(300) + .monitorReportsParser(onParsingStream(MonitorReports::parseFrom).andThen(ProtobufMonitors::toMonitorReports)) + .monitorReportsFormatter(onFormattingStream(this::writeProtobuf).compose(ProtobufMonitors::fromMonitorReports)) + .dataRepositoryParser(onParsingStream(DataRepository::parseFrom).andThen(ProtobufRepositories::toDataRepository)) + .dataRepositoryFormatter(onFormattingStream(this::writeProtobuf).compose(ProtobufRepositories::fromDataRepository)) + .fileExtension(".protobuf") .build(); - @Override - public @NonNull String getId() { - return ID; - } - - @Override - public int getRank() { - return RANK; - } - - @Override - public @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException { - return new FileFormat<>( - onParsingStream(sdmxdl.format.protobuf.web.MonitorReports::parseFrom).andThen(ProtobufMonitors::toMonitorReports), - onFormattingStream(this::writeProtobuf).compose(ProtobufMonitors::fromMonitorReports), - ".protobuf" - ); - } - - @Override - public @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException { - return new FileFormat<>( - onParsingStream(sdmxdl.format.protobuf.DataRepository::parseFrom).andThen(ProtobufRepositories::toDataRepository), - onFormattingStream(this::writeProtobuf).compose(ProtobufRepositories::fromDataRepository), - ".protobuf"); - } + @lombok.experimental.Delegate + private final DiskCacheProviderSupport caching = DiskCacheProviderSupport + .builder() + .cacheId(persistence.getPersistenceId()) + .cacheRank(persistence.getPersistenceRank()) + .persistence(persistence) + .build(); private void writeProtobuf(MessageLite message, OutputStream outputStream) throws IOException { message.writeTo(outputStream); diff --git a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/JsonProviderTest.java b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/JsonProviderTest.java index 61198b11b..5b1f47523 100644 --- a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/JsonProviderTest.java +++ b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/JsonProviderTest.java @@ -1,12 +1,12 @@ package sdmxdl.format.protobuf; import org.junit.jupiter.api.Test; -import tests.sdmxdl.format.FileFormatProviderAssert; +import tests.sdmxdl.format.FileFormattingAssert; public class JsonProviderTest { @Test public void testCompliance() { - FileFormatProviderAssert.assertCompliance(new JsonProvider()); + FileFormattingAssert.assertCompliance(new JsonProvider()); } } diff --git a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufProviderTest.java b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufProviderTest.java index d44116e35..703d57216 100644 --- a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufProviderTest.java +++ b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufProviderTest.java @@ -1,12 +1,12 @@ package sdmxdl.format.protobuf; import org.junit.jupiter.api.Test; -import tests.sdmxdl.format.FileFormatProviderAssert; +import tests.sdmxdl.format.FileFormattingAssert; public class ProtobufProviderTest { @Test public void testCompliance() { - FileFormatProviderAssert.assertCompliance(new ProtobufProvider()); + FileFormattingAssert.assertCompliance(new ProtobufProvider()); } } From 1ae986f1185d0f6f797034217ca5aed8e3d6b2b9 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 6 Jul 2023 09:53:12 +0200 Subject: [PATCH 030/114] Refactor network API --- CHANGELOG.md | 1 + .../internal/sdmxdl/web/DefaultNetwork.java | 13 +-- .../sdmxdl/web/DefaultSSLFactory.java | 23 ++++++ .../sdmxdl/web/spi/DefaultNetworking.java | 39 +++++++++ sdmx-dl-api/src/main/java/module-info.java | 1 + .../java/sdmxdl/ext/spi/CacheProvider.java | 2 + .../src/main/java/sdmxdl/web/Network.java | 10 +-- .../src/main/java/sdmxdl/web/SSLFactory.java | 22 +++++ .../main/java/sdmxdl/web/SdmxWebManager.java | 15 ++-- .../main/java/sdmxdl/web/spi/Networking.java | 40 +++++++++ .../main/java/sdmxdl/web/spi/WebContext.java | 6 +- .../java/sdmxdl/web/SdmxWebManagerTest.java | 7 +- .../java/tests/sdmxdl/ext/NetworkAssert.java | 4 +- .../internal/sdmxdl/cli/WebNetOptions.java | 72 ++++++++--------- sdmx-dl-cli/src/test/java/_demo/Demo.java | 6 +- .../src/test/java/_demo/EasyNetwork.java | 49 ----------- .../sdmxdl/desktop/DesktopWebFactory.java | 35 +------- .../sdmxdl/desktop/SdmxAutoCompletion.java | 8 +- .../java/sdmxdl/desktop/MainComponent.java | 17 +++- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 35 +------- .../java/sdmxdl/provider/web/LazyNetwork.java | 37 +++++++++ .../provider/web/SingleNetworkingSupport.java | 81 +++++++++++++++++++ .../connectors/ConnectorsRestClient.java | 10 ++- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 10 ++- .../web/monitors/UptimeRobotMonitoring.java | 12 +-- 25 files changed, 350 insertions(+), 205 deletions(-) create mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java create mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java delete mode 100644 sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a92361fc0..317933e05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Changed - ![API] Refactor cache API [#500](https://github.com/nbbrd/sdmx-dl/issues/500) +- ![API] Refactor network API [#503](https://github.com/nbbrd/sdmx-dl/issues/503) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java index d4fadff93..68ce799b1 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java @@ -2,11 +2,9 @@ import lombok.NonNull; import sdmxdl.web.Network; +import sdmxdl.web.SSLFactory; import sdmxdl.web.URLConnectionFactory; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; import java.net.ProxySelector; public enum DefaultNetwork implements Network { @@ -19,13 +17,8 @@ public enum DefaultNetwork implements Network { } @Override - public @NonNull SSLSocketFactory getSSLSocketFactory() { - return HttpsURLConnection.getDefaultSSLSocketFactory(); - } - - @Override - public @NonNull HostnameVerifier getHostnameVerifier() { - return HttpsURLConnection.getDefaultHostnameVerifier(); + public @NonNull SSLFactory getSSLFactory() { + return SSLFactory.getDefault(); } @Override diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java new file mode 100644 index 000000000..a16e110dc --- /dev/null +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java @@ -0,0 +1,23 @@ +package internal.sdmxdl.web; + +import lombok.NonNull; +import sdmxdl.web.SSLFactory; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; + +public enum DefaultSSLFactory implements SSLFactory { + + INSTANCE; + + @Override + public @NonNull SSLSocketFactory getSSLSocketFactory() { + return HttpsURLConnection.getDefaultSSLSocketFactory(); + } + + @Override + public @NonNull HostnameVerifier getHostnameVerifier() { + return HttpsURLConnection.getDefaultHostnameVerifier(); + } +} diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java new file mode 100644 index 000000000..abb9a0b30 --- /dev/null +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java @@ -0,0 +1,39 @@ +package internal.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.Network; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Networking; + +import java.util.Collection; +import java.util.Collections; + +public enum DefaultNetworking implements Networking { + + INSTANCE; + + @Override + public @NonNull String getNetworkingId() { + return "DEFAULT"; + } + + @Override + public int getNetworkingRank() { + return UNKNOWN_NETWORKING_RANK; + } + + @Override + public boolean isNetworkingAvailable() { + return true; + } + + @Override + public @NonNull Collection getNetworkingProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { + return Network.getDefault(); + } +} diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index 0a2049a7b..e5bd37f3e 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -18,6 +18,7 @@ uses sdmxdl.ext.spi.CacheProvider; uses sdmxdl.ext.spi.Dialect; uses sdmxdl.file.spi.FileReader; + uses sdmxdl.web.spi.Networking; uses sdmxdl.web.spi.WebAuthenticator; uses sdmxdl.web.spi.WebDriver; uses sdmxdl.web.spi.WebMonitoring; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java index 62d94b748..6ce6c11e6 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java @@ -2,6 +2,7 @@ import internal.sdmxdl.NoOpCacheProvider; import lombok.NonNull; +import nbbrd.design.StaticFactoryMethod; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; @@ -36,6 +37,7 @@ public interface CacheProvider { int UNKNOWN_RANK = -1; + @StaticFactoryMethod static @NonNull CacheProvider noOp() { return NoOpCacheProvider.INSTANCE; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java b/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java index 00660e5ca..aadd501a3 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java @@ -2,21 +2,21 @@ import internal.sdmxdl.web.DefaultNetwork; import lombok.NonNull; +import nbbrd.design.NotThreadSafe; +import nbbrd.design.StaticFactoryMethod; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSocketFactory; import java.net.ProxySelector; +@NotThreadSafe public interface Network { @NonNull ProxySelector getProxySelector(); - @NonNull SSLSocketFactory getSSLSocketFactory(); - - @NonNull HostnameVerifier getHostnameVerifier(); + @NonNull SSLFactory getSSLFactory(); @NonNull URLConnectionFactory getURLConnectionFactory(); + @StaticFactoryMethod static @NonNull Network getDefault() { return DefaultNetwork.INSTANCE; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java new file mode 100644 index 000000000..130f73702 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java @@ -0,0 +1,22 @@ +package sdmxdl.web; + +import internal.sdmxdl.web.DefaultSSLFactory; +import lombok.NonNull; +import nbbrd.design.NotThreadSafe; +import nbbrd.design.StaticFactoryMethod; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; + +@NotThreadSafe +public interface SSLFactory { + + @NonNull SSLSocketFactory getSSLSocketFactory(); + + @NonNull HostnameVerifier getHostnameVerifier(); + + @StaticFactoryMethod + static @NonNull SSLFactory getDefault() { + return DefaultSSLFactory.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index d9cb7ced5..b58993ccf 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -16,10 +16,7 @@ */ package sdmxdl.web; -import internal.util.CacheProviderLoader; -import internal.util.WebAuthenticatorLoader; -import internal.util.WebDriverLoader; -import internal.util.WebMonitoringLoader; +import internal.util.*; import lombok.AccessLevel; import lombok.NonNull; import nbbrd.design.StaticFactoryMethod; @@ -28,10 +25,7 @@ import sdmxdl.SdmxManager; import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.ext.spi.CacheProvider; -import sdmxdl.web.spi.WebAuthenticator; -import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; -import sdmxdl.web.spi.WebMonitoring; +import sdmxdl.web.spi.*; import java.io.IOException; import java.net.URI; @@ -57,6 +51,7 @@ public class SdmxWebManager extends SdmxManager { .builder() .drivers(WebDriverLoader.load()) .monitorings(WebMonitoringLoader.load()) + .networking(NetworkingLoader.load()) .cacheProvider(CacheProviderLoader.load()) .authenticators(WebAuthenticatorLoader.load()) .build(); @@ -81,7 +76,7 @@ public class SdmxWebManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - Network network = Network.getDefault(); + Networking networking = Networking.getDefault(); @lombok.NonNull @lombok.Builder.Default @@ -191,7 +186,7 @@ private WebContext initContext() { .builder() .cacheProvider(cacheProvider) .languages(languages) - .network(network) + .networking(networking) .eventListener(eventListener) .authenticators(authenticators) .build(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java new file mode 100644 index 000000000..1420d9e21 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java @@ -0,0 +1,40 @@ +package sdmxdl.web.spi; + +import internal.sdmxdl.web.spi.DefaultNetworking; +import lombok.NonNull; +import nbbrd.design.StaticFactoryMethod; +import nbbrd.design.ThreadSafe; +import nbbrd.service.*; +import sdmxdl.web.Network; +import sdmxdl.web.SdmxWebSource; + +import java.util.Collection; + +@ServiceDefinition( + quantifier = Quantifier.SINGLE, + loaderName = "internal.util.NetworkingLoader", + fallback = DefaultNetworking.class +) +@ThreadSafe +public interface Networking { + + @ServiceId + @NonNull String getNetworkingId(); + + @ServiceSorter(reverse = true) + int getNetworkingRank(); + + @ServiceFilter + boolean isNetworkingAvailable(); + + @NonNull Collection getNetworkingProperties(); + + @NonNull Network getNetwork(@NonNull SdmxWebSource source); + + int UNKNOWN_NETWORKING_RANK = -1; + + @StaticFactoryMethod + static @NonNull Networking getDefault() { + return DefaultNetworking.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 399bb01a2..d4ae4991e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -52,9 +52,13 @@ public class WebContext { @lombok.NonNull @lombok.Builder.Default - Network network = Network.getDefault(); + Networking networking = Networking.getDefault(); public @NonNull Cache getCache(@NonNull SdmxWebSource source) { return getCacheProvider().getWebCache(source, getEventListener()); } + + public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { + return getNetworking().getNetwork(source); + } } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index 9b25b09b4..5367b9b2e 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -20,6 +20,7 @@ import sdmxdl.*; import sdmxdl.ext.spi.CacheProvider; import sdmxdl.ext.spi.Dialect; +import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.api.SdmxManagerAssert; import tests.sdmxdl.ext.MockedDialect; @@ -60,7 +61,7 @@ public void testFactories() { assertThat(o.getDrivers()).isEmpty(); assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); - assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); + assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); @@ -73,7 +74,7 @@ public void testFactories() { assertThat(o.getDrivers()).isEmpty(); assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); - assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); + assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); @@ -85,7 +86,7 @@ public void testFactories() { assertThat(o.getDrivers()).containsExactly(sampleDriver); assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); - assertThat(o.getNetwork()).isEqualTo(Network.getDefault()); + assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java index ddac19b37..4e5b84819 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java @@ -12,8 +12,8 @@ public void assertCompliance(Network network) { } public void assertCompliance(SoftAssertions s, Network network) { - s.assertThat(network.getHostnameVerifier()).isNotNull(); - s.assertThat(network.getSSLSocketFactory()).isNotNull(); s.assertThat(network.getProxySelector()).isNotNull(); + s.assertThat(network.getSSLFactory()).isNotNull(); + s.assertThat(network.getURLConnectionFactory()).isNotNull(); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index aeae58b06..71244868b 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -29,22 +29,23 @@ import sdmxdl.format.DiskCacheProviderSupport; import sdmxdl.provider.ext.DualCacheProviderSupport; import sdmxdl.provider.ext.MemCacheProviderSupport; -import sdmxdl.web.Network; +import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebAuthenticator; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSocketFactory; import java.io.IOException; -import java.net.ProxySelector; import java.net.URI; import java.nio.file.Path; import java.time.Clock; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -69,7 +70,7 @@ public SdmxWebManager loadManager() throws IOException { SdmxWebManager defaultManager = super.loadManager(); return defaultManager .toBuilder() - .network(new LazyNetwork()) + .networking(getNetworking(getNetworkOptions(), getVerboseOptions())) .cacheProvider(getCacheProvider(getNetworkOptions().getCacheOptions(), getVerboseOptions())) .clearAuthenticators() .authenticators(getAuthenticators()) @@ -159,50 +160,47 @@ private static void reportWebError(VerboseOptions verboseOptions, SdmxWebSource verboseOptions.reportToErrorStream(CACHE_ANCHOR, src.getId() + ": " + msg, ex); } - private final class LazyNetwork implements Network { - - @lombok.Getter(lazy = true) - private final ProxySelector lazyProxySelector = initProxySelector(); - - @lombok.Getter(lazy = true) - private final SSLFactory lazySSLFactory = initSSLFactory(); - - @lombok.Getter(lazy = true) - private final URLConnectionFactory lazyURLConnectionFactory = initURLConnectionFactory(); + private static Networking getNetworking(NetworkOptions networkOptions, VerboseOptions verboseOptions) { + return SingleNetworkingSupport + .builder() + .id("DRY") + .proxySelector(memoize(networkOptions.getProxyOptions()::getProxySelector, "Loading proxy selector", verboseOptions)) + .sslFactory(memoize(() -> new SSLFactoryAdapter(networkOptions.getSslOptions().getSSLFactory()), "Loading SSL factory", verboseOptions)) + .urlConnectionFactory(memoize(networkOptions::getURLConnectionFactory, "Loading URL connection factory", verboseOptions)) + .build(); + } - private ProxySelector initProxySelector() { - getVerboseOptions().reportToErrorStream("NET", "Initializing proxy selector"); - return networkOptions.getProxyOptions().getProxySelector(); - } + private static void reportNetwork(VerboseOptions verboseOptions, String msg) { + if (verboseOptions.isVerbose()) + verboseOptions.reportToErrorStream("NET", msg); + } - private SSLFactory initSSLFactory() { - getVerboseOptions().reportToErrorStream("NET", "Initializing SSL factory"); - return networkOptions.getSslOptions().getSSLFactory(); - } + private static Supplier memoize(Supplier supplier, String message, VerboseOptions verboseOptions) { + AtomicReference ref = new AtomicReference<>(); + return () -> { + T result = ref.get(); + if (result == null) { + reportNetwork(verboseOptions, message); + result = supplier.get(); + ref.set(result); + } + return result; + }; + } - private URLConnectionFactory initURLConnectionFactory() { - getVerboseOptions().reportToErrorStream("NET", "Initializing URL backend"); - return networkOptions.getURLConnectionFactory(); - } + @lombok.AllArgsConstructor + private static final class SSLFactoryAdapter implements sdmxdl.web.SSLFactory { - @Override - public @NonNull ProxySelector getProxySelector() { - return getLazyProxySelector(); - } + private final @NonNull SSLFactory delegate; @Override public @NonNull SSLSocketFactory getSSLSocketFactory() { - return getLazySSLFactory().getSslSocketFactory(); + return delegate.getSslSocketFactory(); } @Override public @NonNull HostnameVerifier getHostnameVerifier() { - return getLazySSLFactory().getHostnameVerifier(); - } - - @Override - public @NonNull URLConnectionFactory getURLConnectionFactory() { - return getLazyURLConnectionFactory(); + return delegate.getHostnameVerifier(); } } } diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index e82f4df25..29e8ff5be 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -2,6 +2,7 @@ import nbbrd.io.curl.CurlHttpURLConnection; import sdmxdl.*; +import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -13,10 +14,7 @@ public static void main(String[] args) throws IOException { SdmxWebManager manager = SdmxWebManager.ofServiceLoader() .toBuilder() - .network(EasyNetwork.DEFAULT - .toBuilder() - .urlConnectionFactory(() -> CurlHttpURLConnection::of) - .build()) + .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .languages(LanguagePriorityList.ANY) .eventListener((source, message) -> System.err.println("[" + source.getId() + "] " + message)) .build(); diff --git a/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java b/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java deleted file mode 100644 index bbf93560e..000000000 --- a/sdmx-dl-cli/src/test/java/_demo/EasyNetwork.java +++ /dev/null @@ -1,49 +0,0 @@ -package _demo; - -import lombok.NonNull; -import sdmxdl.web.Network; -import sdmxdl.web.URLConnectionFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; -import java.net.ProxySelector; -import java.util.function.Supplier; - -@lombok.Builder(toBuilder = true) -final class EasyNetwork implements Network { - - public static final EasyNetwork DEFAULT = EasyNetwork.builder().build(); - - @lombok.Builder.Default - final @NonNull Supplier proxySelector = ProxySelector::getDefault; - - @lombok.Builder.Default - final @NonNull Supplier sslSocketFactory = HttpsURLConnection::getDefaultSSLSocketFactory; - - @lombok.Builder.Default - final @NonNull Supplier hostnameVerifier = HttpsURLConnection::getDefaultHostnameVerifier; - - @lombok.Builder.Default - final @NonNull Supplier urlConnectionFactory = URLConnectionFactory::getDefault; - - @Override - public @NonNull ProxySelector getProxySelector() { - return proxySelector.get(); - } - - @Override - public @NonNull SSLSocketFactory getSSLSocketFactory() { - return sslSocketFactory.get(); - } - - @Override - public @NonNull HostnameVerifier getHostnameVerifier() { - return hostnameVerifier.get(); - } - - @Override - public @NonNull URLConnectionFactory getURLConnectionFactory() { - return urlConnectionFactory.get(); - } -} diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index 60582b07e..5e03e48b8 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -1,15 +1,8 @@ package internal.sdmxdl.desktop; -import lombok.NonNull; import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.web.Network; +import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.URLConnectionFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; -import java.net.ProxySelector; public class DesktopWebFactory { @@ -20,32 +13,8 @@ public class DesktopWebFactory { public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() - .network(getNetwork()) + .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .eventListener((source, msg) -> System.out.println(source.getId() + ": " + msg)) .build(); } - - private static Network getNetwork() { - return new Network() { - @Override - public @NonNull ProxySelector getProxySelector() { - return ProxySelector.getDefault(); - } - - @Override - public @NonNull SSLSocketFactory getSSLSocketFactory() { - return HttpsURLConnection.getDefaultSSLSocketFactory(); - } - - @Override - public @NonNull HostnameVerifier getHostnameVerifier() { - return HttpsURLConnection.getDefaultHostnameVerifier(); - } - - @Override - public @NonNull URLConnectionFactory getURLConnectionFactory() { - return CurlHttpURLConnection::of; - } - }; - } } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index aaa9658ea..b545c8309 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -24,12 +24,13 @@ import nbbrd.desktop.favicon.FaviconSupport; import nbbrd.desktop.favicon.URLConnectionFactory; import nbbrd.io.Resource; -import sdmxdl.*; import sdmxdl.Dimension; +import sdmxdl.*; import sdmxdl.desktop.MainComponent; import sdmxdl.ext.Registry; import sdmxdl.ext.spi.Dialect; import sdmxdl.web.Network; +import sdmxdl.web.SSLFactory; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -382,9 +383,10 @@ public URLConnection openConnection(URL url) throws IOException { private void applyHttps(URLConnection result, Network network) { if (result instanceof HttpsURLConnection) { + SSLFactory sslFactory = network.getSSLFactory(); HttpsURLConnection https = (HttpsURLConnection) result; - https.setHostnameVerifier(network.getHostnameVerifier()); - https.setSSLSocketFactory(network.getSSLSocketFactory()); + https.setHostnameVerifier(sslFactory.getHostnameVerifier()); + https.setSSLSocketFactory(sslFactory.getSSLSocketFactory()); } } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index 1a0a4cf49..b831a1fcf 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -18,6 +18,7 @@ import sdmxdl.DataflowRef; import sdmxdl.LanguagePriorityList; import sdmxdl.ext.Registry; +import sdmxdl.web.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebDriver; @@ -39,7 +40,9 @@ import java.io.InputStream; import java.io.UncheckedIOException; import java.net.Proxy; +import java.net.URISyntaxException; import java.net.URL; +import java.net.URLConnection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -90,13 +93,23 @@ public void setDataSources(@NonNull DefaultListModel dataSources) private final FaviconSupport faviconSupport = FaviconSupport.ofServiceLoader() .toBuilder() - .client(url -> getSdmxManager().getNetwork().getURLConnectionFactory().openConnection(url, Proxy.NO_PROXY)) + .client(this::openConnection) .build(); private final ImageIcon sdmxIcon = new ImageIcon(loadImage()); + private URLConnection openConnection(URL url) throws IOException { + try { + SdmxWebSource source = SdmxWebSource.builder().id("").driver("").endpoint(url.toURI()).build(); + Network network = getSdmxManager().getNetworking().getNetwork(source); + return network.getURLConnectionFactory().openConnection(url, Proxy.NO_PROXY); + } catch (URISyntaxException ex) { + throw new IOException(ex); + } + } + private Image loadImage() { - try (InputStream stream = Resource.getResourceAsStream(MainComponent.class, "sdmx-logo.png").orElseThrow(RuntimeException::new)) { + try (InputStream stream = Resource.newInputStream(MainComponent.class, "sdmx-logo.png")) { return ImageIO.read(stream); } catch (IOException ex) { throw new UncheckedIOException(ex); diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index b7a3fa7a3..d0e8e25ec 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -1,15 +1,8 @@ package sdmxdl.grpc; -import lombok.NonNull; import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.web.Network; +import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.URLConnectionFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; -import java.net.ProxySelector; @lombok.experimental.UtilityClass class GrpcWebFactory { @@ -17,31 +10,7 @@ class GrpcWebFactory { public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() - .network(getNetwork()) + .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .build(); } - - private static Network getNetwork() { - return new Network() { - @Override - public @NonNull ProxySelector getProxySelector() { - return ProxySelector.getDefault(); - } - - @Override - public @NonNull SSLSocketFactory getSSLSocketFactory() { - return HttpsURLConnection.getDefaultSSLSocketFactory(); - } - - @Override - public @NonNull HostnameVerifier getHostnameVerifier() { - return HttpsURLConnection.getDefaultHostnameVerifier(); - } - - @Override - public @NonNull URLConnectionFactory getURLConnectionFactory() { - return CurlHttpURLConnection::of; - } - }; - } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java new file mode 100644 index 000000000..4bcfd0ade --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java @@ -0,0 +1,37 @@ +package sdmxdl.provider.web; + +import lombok.NonNull; +import sdmxdl.web.Network; +import sdmxdl.web.SSLFactory; +import sdmxdl.web.URLConnectionFactory; + +import java.net.ProxySelector; +import java.util.function.Supplier; + +@lombok.Builder(toBuilder = true) +public final class LazyNetwork implements Network { + + @lombok.Builder.Default + private final @NonNull Supplier proxySelector = Network.getDefault()::getProxySelector; + + @lombok.Builder.Default + private final @NonNull Supplier sslFactory = Network.getDefault()::getSSLFactory; + + @lombok.Builder.Default + private final @NonNull Supplier urlConnectionFactory = Network.getDefault()::getURLConnectionFactory; + + @Override + public @NonNull ProxySelector getProxySelector() { + return proxySelector.get(); + } + + @Override + public @NonNull SSLFactory getSSLFactory() { + return sslFactory.get(); + } + + @Override + public @NonNull URLConnectionFactory getURLConnectionFactory() { + return urlConnectionFactory.get(); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java new file mode 100644 index 000000000..bdad0aa60 --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java @@ -0,0 +1,81 @@ +package sdmxdl.provider.web; + +import lombok.AccessLevel; +import lombok.NonNull; +import sdmxdl.web.Network; +import sdmxdl.web.SSLFactory; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.Networking; + +import java.net.ProxySelector; +import java.util.Collection; +import java.util.Collections; +import java.util.Properties; +import java.util.function.Predicate; +import java.util.function.Supplier; + +@lombok.Builder(toBuilder = true) +public final class SingleNetworkingSupport implements Networking { + + private final @NonNull String id; + + @lombok.Builder.Default + private final int rank = UNKNOWN_NETWORKING_RANK; + + @lombok.Builder.Default + private final @NonNull Predicate availability = ignore -> true; + + @lombok.Builder.Default + private final @NonNull Supplier proxySelector = Network.getDefault()::getProxySelector; + + @lombok.Builder.Default + private final @NonNull Supplier sslFactory = Network.getDefault()::getSSLFactory; + + @lombok.Builder.Default + private final @NonNull Supplier urlConnectionFactory = Network.getDefault()::getURLConnectionFactory; + + @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) + private final @NonNull Network singleNetwork = initSingleNetwork(); + + @Override + public @NonNull String getNetworkingId() { + return id; + } + + @Override + public int getNetworkingRank() { + return rank; + } + + @Override + public boolean isNetworkingAvailable() { + return availability.test(System.getProperties()); + } + + @Override + public @NonNull Collection getNetworkingProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Network getNetwork(@NonNull SdmxWebSource ignore) { + return getSingleNetwork(); + } + + private Network initSingleNetwork() { + return LazyNetwork + .builder() + .proxySelector(proxySelector) + .sslFactory(sslFactory) + .urlConnectionFactory(urlConnectionFactory) + .build(); + } + + public static final class Builder { + + public @NonNull Builder urlConnectionFactoryOf(@NonNull URLConnectionFactory supplier) { + return urlConnectionFactory(() -> supplier); + } + } +} diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java index 023e788a3..6fc210a02 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -33,6 +33,8 @@ import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestClientSupplier; import sdmxdl.provider.web.WebEvents; +import sdmxdl.web.Network; +import sdmxdl.web.SSLFactory; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -208,9 +210,11 @@ private static void configure(RestSdmxClient client, SdmxWebSource source, WebCo // client.setLanguages(Connectors.fromLanguages(context.getLanguages())); client.setConnectTimeout(CONNECT_TIMEOUT_PROPERTY.get(source.getProperties())); client.setReadTimeout(READ_TIMEOUT_PROPERTY.get(source.getProperties())); - client.setProxySelector(context.getNetwork().getProxySelector()); - client.setSslSocketFactory(context.getNetwork().getSSLSocketFactory()); - client.setHostnameVerifier(context.getNetwork().getHostnameVerifier()); + Network network = context.getNetwork(source); + client.setProxySelector(network.getProxySelector()); + SSLFactory sslFactory = network.getSSLFactory(); + client.setSslSocketFactory(sslFactory.getSSLSocketFactory()); + client.setHostnameVerifier(sslFactory.getHostnameVerifier()); client.setMaxRedirects(MAX_REDIRECTS_PROPERTY.get(source.getProperties())); RestSdmxEventListener eventListener = new DefaultRestSdmxEventListener(source, context.getEventListener()); client.setRedirectionEventListener(eventListener); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java index cd92efaeb..2d0f3268f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -30,6 +30,7 @@ import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.provider.web.WebEvents; +import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebAuthenticator; import sdmxdl.web.spi.WebContext; @@ -93,16 +94,17 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl } public static @NonNull HttpContext newContext(@NonNull SdmxWebSource source, @NonNull WebContext context) { + Network network = context.getNetwork(source); return HttpContext .builder() .readTimeout(READ_TIMEOUT_PROPERTY.get(source.getProperties())) .connectTimeout(CONNECT_TIMEOUT_PROPERTY.get(source.getProperties())) .maxRedirects(MAX_REDIRECTS_PROPERTY.get(source.getProperties())) .preemptiveAuthentication(PREEMPTIVE_AUTHENTICATION_PROPERTY.get(source.getProperties())) - .proxySelector(context.getNetwork()::getProxySelector) - .sslSocketFactory(context.getNetwork()::getSSLSocketFactory) - .hostnameVerifier(context.getNetwork()::getHostnameVerifier) - .urlConnectionFactory(context.getNetwork()::getURLConnectionFactory) + .proxySelector(network::getProxySelector) + .sslSocketFactory(() -> network.getSSLFactory().getSSLSocketFactory()) + .hostnameVerifier(() -> network.getSSLFactory().getHostnameVerifier()) + .urlConnectionFactory(network::getURLConnectionFactory) .listener(new RiHttpEventListener(source, context.getEventListener())) .authenticator(new RiHttpAuthenticator(source, context.getAuthenticators(), context.getEventListener())) .userAgent(HTTP_AGENT.get(System.getProperties())) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java index 7712d550d..2246ebcd2 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java @@ -10,9 +10,7 @@ import sdmxdl.SdmxManager; import sdmxdl.provider.web.WebEvents; import sdmxdl.provider.web.WebMonitors; -import sdmxdl.web.MonitorReport; -import sdmxdl.web.MonitorStatus; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.*; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebMonitoring; @@ -99,7 +97,8 @@ private static URI toURI(URL url) throws IOException { private static T post(URL url, String query, IOFunction factory, WebContext context, SdmxWebSource source) throws IOException { byte[] data = query.getBytes(StandardCharsets.UTF_8); - Proxy proxy = context.getNetwork().getProxySelector().select(toURI(url)).stream().findFirst().orElse(Proxy.NO_PROXY); + Network network = context.getNetwork(source); + Proxy proxy = network.getProxySelector().select(toURI(url)).stream().findFirst().orElse(Proxy.NO_PROXY); if (context.getEventListener() != SdmxManager.NO_OP_EVENT_LISTENER) { context.getEventListener().accept(source, WebEvents.onQuery(url, proxy)); @@ -108,8 +107,9 @@ private static T post(URL url, String query, IOFunction factory, HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy); if (conn instanceof HttpsURLConnection) { - ((HttpsURLConnection) conn).setSSLSocketFactory(context.getNetwork().getSSLSocketFactory()); - ((HttpsURLConnection) conn).setHostnameVerifier(context.getNetwork().getHostnameVerifier()); + SSLFactory sslFactory = network.getSSLFactory(); + ((HttpsURLConnection) conn).setSSLSocketFactory(sslFactory.getSSLSocketFactory()); + ((HttpsURLConnection) conn).setHostnameVerifier(sslFactory.getHostnameVerifier()); } conn.setDoOutput(true); From bd8caf86c0247e9187bd6fc36ebff21bbec74ee1 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 6 Jul 2023 14:07:56 +0200 Subject: [PATCH 031/114] Simplify naming --- .../internal/sdmxdl/{ => ext}/NoOpCache.java | 2 +- .../spi/NoOpCaching.java} | 16 +++++----- sdmx-dl-api/src/main/java/module-info.java | 2 +- .../src/main/java/sdmxdl/SdmxManager.java | 4 +-- .../src/main/java/sdmxdl/ext/Cache.java | 2 +- .../spi/{CacheProvider.java => Caching.java} | 22 ++++++------- .../java/sdmxdl/file/SdmxFileManager.java | 10 +++--- .../java/sdmxdl/file/spi/FileContext.java | 6 ++-- .../main/java/sdmxdl/web/SdmxWebManager.java | 8 ++--- .../main/java/sdmxdl/web/spi/WebContext.java | 6 ++-- .../java/sdmxdl/web/SdmxWebManagerTest.java | 8 ++--- .../internal/sdmxdl/cli/WebNetOptions.java | 26 +++++++-------- ...erSupport.java => DiskCachingSupport.java} | 24 +++++++++----- .../sdmxdl/format/spi/PersistenceSupport.java | 16 +++++++--- .../src/main/java/module-info.java | 3 +- .../java/sdmxdl/format/kryo/KryoProvider.java | 14 ++++---- .../src/main/java/module-info.java | 3 +- .../sdmxdl/format/protobuf/JsonProvider.java | 18 +++++------ .../format/protobuf/ProtobufProvider.java | 18 +++++------ ...erSupport.java => DualCachingSupport.java} | 32 ++++++++++++------- ...derSupport.java => MemCachingSupport.java} | 24 +++++++++----- .../provider/ri/web/drivers/FileDriver.java | 22 ++++++------- 22 files changed, 160 insertions(+), 126 deletions(-) rename sdmx-dl-api/src/main/java/internal/sdmxdl/{ => ext}/NoOpCache.java (98%) rename sdmx-dl-api/src/main/java/internal/sdmxdl/{NoOpCacheProvider.java => ext/spi/NoOpCaching.java} (69%) rename sdmx-dl-api/src/main/java/sdmxdl/ext/spi/{CacheProvider.java => Caching.java} (64%) rename sdmx-dl-format-base/src/main/java/sdmxdl/format/{DiskCacheProviderSupport.java => DiskCachingSupport.java} (87%) rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/{DualCacheProviderSupport.java => DualCachingSupport.java} (61%) rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/{MemCacheProviderSupport.java => MemCachingSupport.java} (69%) diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java similarity index 98% rename from sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java rename to sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java index 7e3645082..c7a3cdb72 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl; +package internal.sdmxdl.ext; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java similarity index 69% rename from sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java rename to sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java index 39238feff..29174b814 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCacheProvider.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java @@ -1,27 +1,27 @@ -package internal.sdmxdl; +package internal.sdmxdl.ext.spi; import lombok.NonNull; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; import java.util.Collection; import java.util.Collections; -public enum NoOpCacheProvider implements CacheProvider { +public enum NoOpCaching implements Caching { INSTANCE; @Override - public @NonNull String getCacheId() { + public @NonNull String getCachingId() { return "NO_OP"; } @Override - public int getCacheRank() { - return UNKNOWN_RANK; + public int getCachingRank() { + return UNKNOWN_CACHING_RANK; } @Override @@ -35,12 +35,12 @@ public int getCacheRank() { } @Override - public @NonNull Collection getSupportedFileProperties() { + public @NonNull Collection getFileCachingProperties() { return Collections.emptyList(); } @Override - public @NonNull Collection getSupportedWebProperties() { + public @NonNull Collection getWebCachingProperties() { return Collections.emptyList(); } } diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index e5bd37f3e..c5448dc0d 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -15,7 +15,7 @@ exports sdmxdl.web; exports sdmxdl.web.spi; - uses sdmxdl.ext.spi.CacheProvider; + uses sdmxdl.ext.spi.Caching; uses sdmxdl.ext.spi.Dialect; uses sdmxdl.file.spi.FileReader; uses sdmxdl.web.spi.Networking; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index 4414cc352..0d3d67a41 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -20,7 +20,7 @@ import nbbrd.design.SealedType; import nbbrd.design.ThreadSafe; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileManager; import sdmxdl.web.SdmxWebManager; @@ -41,7 +41,7 @@ public abstract class SdmxManager { public abstract @NonNull LanguagePriorityList getLanguages(); - public abstract @NonNull CacheProvider getCacheProvider(); + public abstract @NonNull Caching getCaching(); public abstract @NonNull SdmxSourceConsumer getEventListener(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java index e0c2a5c18..29a565539 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java @@ -16,7 +16,7 @@ */ package sdmxdl.ext; -import internal.sdmxdl.NoOpCache; +import internal.sdmxdl.ext.NoOpCache; import lombok.NonNull; import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java similarity index 64% rename from sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java rename to sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java index 6ce6c11e6..940a5e12d 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/CacheProvider.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java @@ -1,6 +1,6 @@ package sdmxdl.ext.spi; -import internal.sdmxdl.NoOpCacheProvider; +import internal.sdmxdl.ext.spi.NoOpCaching; import lombok.NonNull; import nbbrd.design.StaticFactoryMethod; import nbbrd.service.Quantifier; @@ -16,29 +16,29 @@ @ServiceDefinition( quantifier = Quantifier.SINGLE, - loaderName = "internal.util.CacheProviderLoader", - fallback = NoOpCacheProvider.class + loaderName = "internal.util.CachingLoader", + fallback = NoOpCaching.class ) -public interface CacheProvider { +public interface Caching { @ServiceId - @NonNull String getCacheId(); + @NonNull String getCachingId(); @ServiceSorter(reverse = true) - int getCacheRank(); + int getCachingRank(); @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener); @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener); - @NonNull Collection getSupportedFileProperties(); + @NonNull Collection getFileCachingProperties(); - @NonNull Collection getSupportedWebProperties(); + @NonNull Collection getWebCachingProperties(); - int UNKNOWN_RANK = -1; + int UNKNOWN_CACHING_RANK = -1; @StaticFactoryMethod - static @NonNull CacheProvider noOp() { - return NoOpCacheProvider.INSTANCE; + static @NonNull Caching noOp() { + return NoOpCaching.INSTANCE; } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index eb84a9b61..d10589ca6 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -16,7 +16,7 @@ */ package sdmxdl.file; -import internal.util.CacheProviderLoader; +import internal.util.CachingLoader; import internal.util.FileReaderLoader; import lombok.AccessLevel; import lombok.NonNull; @@ -25,7 +25,7 @@ import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; @@ -45,7 +45,7 @@ public class SdmxFileManager extends SdmxManager { public static @NonNull SdmxFileManager ofServiceLoader() { return builder() .readers(FileReaderLoader.load()) - .cacheProvider(CacheProviderLoader.load()) + .caching(CachingLoader.load()) .build(); } @@ -60,7 +60,7 @@ public class SdmxFileManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - CacheProvider cacheProvider = CacheProvider.noOp(); + Caching caching = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default @@ -92,7 +92,7 @@ private FileContext initContext() { .builder() .languages(languages) .eventListener(eventListener) - .cacheProvider(cacheProvider) + .caching(caching) .build(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index b3c014bbf..2b429c066 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -5,7 +5,7 @@ import sdmxdl.SdmxManager; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; @lombok.Value @@ -18,13 +18,13 @@ public class FileContext { @lombok.NonNull @lombok.Builder.Default - CacheProvider cacheProvider = CacheProvider.noOp(); + Caching caching = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; public @NonNull Cache getCache(@NonNull SdmxFileSource source) { - return getCacheProvider().getFileCache(source, getEventListener()); + return getCaching().getFileCache(source, getEventListener()); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index b58993ccf..7755f0cea 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -24,7 +24,7 @@ import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.web.spi.*; import java.io.IOException; @@ -52,7 +52,7 @@ public class SdmxWebManager extends SdmxManager { .drivers(WebDriverLoader.load()) .monitorings(WebMonitoringLoader.load()) .networking(NetworkingLoader.load()) - .cacheProvider(CacheProviderLoader.load()) + .caching(CachingLoader.load()) .authenticators(WebAuthenticatorLoader.load()) .build(); } @@ -80,7 +80,7 @@ public class SdmxWebManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - CacheProvider cacheProvider = CacheProvider.noOp(); + Caching caching = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default @@ -184,7 +184,7 @@ private Optional lookupMonitoring(String uriScheme) { private WebContext initContext() { return WebContext .builder() - .cacheProvider(cacheProvider) + .caching(caching) .languages(languages) .networking(networking) .eventListener(eventListener) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index d4ae4991e..2f4935cfa 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -21,7 +21,7 @@ import sdmxdl.SdmxManager; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; @@ -40,7 +40,7 @@ public class WebContext { @lombok.NonNull @lombok.Builder.Default - CacheProvider cacheProvider = CacheProvider.noOp(); + Caching caching = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default @@ -55,7 +55,7 @@ public class WebContext { Networking networking = Networking.getDefault(); public @NonNull Cache getCache(@NonNull SdmxWebSource source) { - return getCacheProvider().getWebCache(source, getEventListener()); + return getCaching().getWebCache(source, getEventListener()); } public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index 5367b9b2e..927890c24 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.ext.spi.Dialect; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebDriver; @@ -62,7 +62,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); + assertThat(o.getCaching()).isEqualTo(Caching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -75,7 +75,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); + assertThat(o.getCaching()).isEqualTo(Caching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -87,7 +87,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCacheProvider()).isEqualTo(CacheProvider.noOp()); + assertThat(o.getCaching()).isEqualTo(Caching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 71244868b..2fe04be81 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -23,12 +23,12 @@ import lombok.NonNull; import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DiskCache; -import sdmxdl.format.DiskCacheProviderSupport; -import sdmxdl.provider.ext.DualCacheProviderSupport; -import sdmxdl.provider.ext.MemCacheProviderSupport; +import sdmxdl.format.DiskCachingSupport; +import sdmxdl.provider.ext.DualCachingSupport; +import sdmxdl.provider.ext.MemCachingSupport; import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -71,7 +71,7 @@ public SdmxWebManager loadManager() throws IOException { return defaultManager .toBuilder() .networking(getNetworking(getNetworkOptions(), getVerboseOptions())) - .cacheProvider(getCacheProvider(getNetworkOptions().getCacheOptions(), getVerboseOptions())) + .caching(getCacheProvider(getNetworkOptions().getCacheOptions(), getVerboseOptions())) .clearAuthenticators() .authenticators(getAuthenticators()) .customSources(getForcedSslSources(defaultManager)) @@ -114,26 +114,26 @@ private List getAuthenticators() { private static final String CACHE_ANCHOR = "CCH"; - private static CacheProvider getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { + private static Caching getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { if (cacheOptions.isNoCache()) { - return CacheProvider.noOp(); + return Caching.noOp(); } Clock clock = Clock.systemDefaultZone(); Path root = cacheOptions.getCacheFolder() != null ? cacheOptions.getCacheFolder().toPath() : DiskCache.SDMXDL_TMP_DIR; reportConfig(verboseOptions, root); - return DualCacheProviderSupport + return DualCachingSupport .builder() - .cacheId("DRY") - .first(MemCacheProviderSupport + .id("DRY") + .first(MemCachingSupport .builder() - .cacheId("MEM") + .id("MEM") .clock(clock) .build()) - .second(DiskCacheProviderSupport + .second(DiskCachingSupport .builder() - .cacheId("DISK") + .id("DISK") .root(root) .persistence(cacheOptions.getCacheFormat()) .onFileError((src, msg, ex) -> reportFileError(verboseOptions, src, msg, ex)) diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java similarity index 87% rename from sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java rename to sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index d383d30d5..b1ab49e8c 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheProviderSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -5,7 +5,7 @@ import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceBiConsumer; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; @@ -18,15 +18,13 @@ import java.util.Collections; @lombok.Builder(toBuilder = true) -public final class DiskCacheProviderSupport implements CacheProvider { +public final class DiskCachingSupport implements Caching { - @lombok.Getter @lombok.NonNull - private final String cacheId; + private final String id; - @lombok.Getter @lombok.Builder.Default - private final int cacheRank = UNKNOWN_RANK; + private final int rank = UNKNOWN_CACHING_RANK; @lombok.NonNull @lombok.Builder.Default @@ -64,6 +62,16 @@ private DiskCache.Builder newFileCacheBuilder() { .clock(clock); } + @Override + public @NonNull String getCachingId() { + return id; + } + + @Override + public int getCachingRank() { + return rank; + } + @Override public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { return newFileCacheBuilder() @@ -81,12 +89,12 @@ private DiskCache.Builder newFileCacheBuilder() { } @Override - public @NonNull Collection getSupportedFileProperties() { + public @NonNull Collection getFileCachingProperties() { return Collections.emptyList(); } @Override - public @NonNull Collection getSupportedWebProperties() { + public @NonNull Collection getWebCachingProperties() { return Collections.emptyList(); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java index 90f6c35a3..ea1816edc 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/PersistenceSupport.java @@ -10,13 +10,11 @@ @lombok.Builder(toBuilder = true) public final class PersistenceSupport implements Persistence { - @lombok.Getter @lombok.NonNull - private final String persistenceId; + private final String id; - @lombok.Getter @lombok.Builder.Default - private final int persistenceRank = UNKNOWN_PERSISTENCE_RANK; + private final int rank = UNKNOWN_PERSISTENCE_RANK; @lombok.NonNull private final FileParser monitorReportsParser; @@ -33,6 +31,16 @@ public final class PersistenceSupport implements Persistence { @lombok.NonNull private final String fileExtension; + @Override + public @NonNull String getPersistenceId() { + return id; + } + + @Override + public int getPersistenceRank() { + return rank; + } + @Override public @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException { return new FileFormat<>(monitorReportsParser, monitorReportsFormatter, fileExtension); diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index 7f5ea2217..c70d45ca5 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -1,3 +1,4 @@ +import sdmxdl.ext.spi.Caching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.kryo { @@ -11,6 +12,6 @@ exports sdmxdl.format.kryo; - provides sdmxdl.ext.spi.CacheProvider with sdmxdl.format.kryo.KryoProvider; + provides Caching with sdmxdl.format.kryo.KryoProvider; provides Persistence with sdmxdl.format.kryo.KryoProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index 81e79d860..70bcf5c2c 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -3,25 +3,25 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; -import sdmxdl.ext.spi.CacheProvider; -import sdmxdl.format.DiskCacheProviderSupport; +import sdmxdl.ext.spi.Caching; +import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; @ServiceProvider(Persistence.class) -@ServiceProvider(CacheProvider.class) -public final class KryoProvider implements Persistence, CacheProvider { +@ServiceProvider(Caching.class) +public final class KryoProvider implements Persistence, Caching { private static final String ID = "KRYO"; private static final int RANK = 400; @lombok.experimental.Delegate - private final DiskCacheProviderSupport caching = DiskCacheProviderSupport + private final DiskCachingSupport caching = DiskCachingSupport .builder() - .cacheId(ID) - .cacheRank(RANK) + .id(ID) + .rank(RANK) .persistence(this) .build(); diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index 8be9323fa..413fbc080 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -1,3 +1,4 @@ +import sdmxdl.ext.spi.Caching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.protobuf { @@ -13,7 +14,7 @@ exports sdmxdl.format.protobuf; exports sdmxdl.format.protobuf.web; - provides sdmxdl.ext.spi.CacheProvider with + provides Caching with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; provides Persistence with diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index 9c1f3f1bd..f571f9f02 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -2,8 +2,8 @@ import com.google.protobuf.util.JsonFormat; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.CacheProvider; -import sdmxdl.format.DiskCacheProviderSupport; +import sdmxdl.ext.spi.Caching; +import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; @@ -15,8 +15,8 @@ import static nbbrd.io.text.TextParser.onParsingReader; @ServiceProvider(Persistence.class) -@ServiceProvider(CacheProvider.class) -public final class JsonProvider implements Persistence, CacheProvider { +@ServiceProvider(Caching.class) +public final class JsonProvider implements Persistence, Caching { private final JsonFormat.Parser parser = JsonFormat.parser(); @@ -25,8 +25,8 @@ public final class JsonProvider implements Persistence, CacheProvider { @lombok.experimental.Delegate private final PersistenceSupport persistence = PersistenceSupport .builder() - .persistenceId("JSON") - .persistenceRank(200) + .id("JSON") + .rank(200) .monitorReportsParser(onParsingReader(this::parseJsonReports).andThen(ProtobufMonitors::toMonitorReports).asFileParser(UTF_8)) .monitorReportsFormatter(onFormattingWriter(formatter::appendTo).compose(ProtobufMonitors::fromMonitorReports).asFileFormatter(UTF_8)) .dataRepositoryParser(onParsingReader(this::parseJsonRepository).andThen(ProtobufRepositories::toDataRepository).asFileParser(UTF_8)) @@ -35,10 +35,10 @@ public final class JsonProvider implements Persistence, CacheProvider { .build(); @lombok.experimental.Delegate - private final DiskCacheProviderSupport caching = DiskCacheProviderSupport + private final DiskCachingSupport caching = DiskCachingSupport .builder() - .cacheId(persistence.getPersistenceId()) - .cacheRank(persistence.getPersistenceRank()) + .id(persistence.getPersistenceId()) + .rank(persistence.getPersistenceRank()) .persistence(persistence) .build(); diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index e14d88f15..a3a4808fa 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -2,8 +2,8 @@ import com.google.protobuf.MessageLite; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.CacheProvider; -import sdmxdl.format.DiskCacheProviderSupport; +import sdmxdl.ext.spi.Caching; +import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.protobuf.web.MonitorReports; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; @@ -15,14 +15,14 @@ import static nbbrd.io.FileParser.onParsingStream; @ServiceProvider(Persistence.class) -@ServiceProvider(CacheProvider.class) -public final class ProtobufProvider implements Persistence, CacheProvider { +@ServiceProvider(Caching.class) +public final class ProtobufProvider implements Persistence, Caching { @lombok.experimental.Delegate private final PersistenceSupport persistence = PersistenceSupport .builder() - .persistenceId("PROTOBUF") - .persistenceRank(300) + .id("PROTOBUF") + .rank(300) .monitorReportsParser(onParsingStream(MonitorReports::parseFrom).andThen(ProtobufMonitors::toMonitorReports)) .monitorReportsFormatter(onFormattingStream(this::writeProtobuf).compose(ProtobufMonitors::fromMonitorReports)) .dataRepositoryParser(onParsingStream(DataRepository::parseFrom).andThen(ProtobufRepositories::toDataRepository)) @@ -31,10 +31,10 @@ public final class ProtobufProvider implements Persistence, CacheProvider { .build(); @lombok.experimental.Delegate - private final DiskCacheProviderSupport caching = DiskCacheProviderSupport + private final DiskCachingSupport caching = DiskCachingSupport .builder() - .cacheId(persistence.getPersistenceId()) - .cacheRank(persistence.getPersistenceRank()) + .id(persistence.getPersistenceId()) + .rank(persistence.getPersistenceRank()) .persistence(persistence) .build(); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java similarity index 61% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java index 9ae6e0f2b..254d316e9 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCacheProviderSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java @@ -3,7 +3,7 @@ import lombok.NonNull; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; @@ -14,28 +14,36 @@ import static java.util.stream.Collectors.toList; @lombok.Builder(toBuilder = true) -public final class DualCacheProviderSupport implements CacheProvider { +public final class DualCachingSupport implements Caching { - @lombok.Getter @lombok.NonNull - private final String cacheId; + private final String id; - @lombok.Getter @lombok.Builder.Default - private final int cacheRank = UNKNOWN_RANK; + private final int rank = UNKNOWN_CACHING_RANK; @lombok.NonNull @lombok.Builder.Default - private final CacheProvider first = CacheProvider.noOp(); + private final Caching first = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default - private final CacheProvider second = CacheProvider.noOp(); + private final Caching second = Caching.noOp(); @lombok.NonNull @lombok.Builder.Default private final Clock clock = Clock.systemDefaultZone(); + @Override + public @NonNull String getCachingId() { + return id; + } + + @Override + public int getCachingRank() { + return rank; + } + @Override public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { Cache main = first.getFileCache(source, eventListener); @@ -49,12 +57,12 @@ public final class DualCacheProviderSupport implements CacheProvider { } @Override - public @NonNull Collection getSupportedFileProperties() { - return Stream.concat(first.getSupportedFileProperties().stream(), second.getSupportedFileProperties().stream()).collect(toList()); + public @NonNull Collection getFileCachingProperties() { + return Stream.concat(first.getFileCachingProperties().stream(), second.getFileCachingProperties().stream()).collect(toList()); } @Override - public @NonNull Collection getSupportedWebProperties() { - return Stream.concat(first.getSupportedWebProperties().stream(), second.getSupportedWebProperties().stream()).collect(toList()); + public @NonNull Collection getWebCachingProperties() { + return Stream.concat(first.getWebCachingProperties().stream(), second.getWebCachingProperties().stream()).collect(toList()); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java similarity index 69% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java index b458fd980..63dcb71a0 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCacheProviderSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java @@ -3,7 +3,7 @@ import lombok.NonNull; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; @@ -12,20 +12,28 @@ import java.util.Collections; @lombok.Builder(toBuilder = true) -public final class MemCacheProviderSupport implements CacheProvider { +public final class MemCachingSupport implements Caching { - @lombok.Getter @lombok.NonNull - private final String cacheId; + private final String id; - @lombok.Getter @lombok.Builder.Default - private final int cacheRank = UNKNOWN_RANK; + private final int rank = UNKNOWN_CACHING_RANK; @lombok.NonNull @lombok.Builder.Default private final Clock clock = Clock.systemDefaultZone(); + @Override + public @NonNull String getCachingId() { + return id; + } + + @Override + public int getCachingRank() { + return rank; + } + @Override public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { return MemCache.builder().clock(clock).build(); @@ -37,12 +45,12 @@ public final class MemCacheProviderSupport implements CacheProvider { } @Override - public @NonNull Collection getSupportedFileProperties() { + public @NonNull Collection getFileCachingProperties() { return Collections.emptyList(); } @Override - public @NonNull Collection getSupportedWebProperties() { + public @NonNull Collection getWebCachingProperties() { return Collections.emptyList(); } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 23d5ea755..37ca2d657 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -10,7 +10,7 @@ import sdmxdl.Connection; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.CacheProvider; +import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.web.WebDriverSupport; @@ -49,17 +49,17 @@ public final class FileDriver implements WebDriver { .toBuilder() .languages(context.getLanguages()) .eventListener((fileSource, message) -> context.getEventListener().accept(source, message)) - .cacheProvider(new FileToWebCacheFactory(source, context.getCacheProvider(), context.getEventListener())) + .caching(new FileToWebCacheFactory(source, context.getCaching(), context.getEventListener())) .build() .getConnection(toFileSource(source)); } @lombok.AllArgsConstructor - private static final class FileToWebCacheFactory implements CacheProvider { + private static final class FileToWebCacheFactory implements Caching { private final @NonNull SdmxWebSource webSource; - private final @NonNull CacheProvider webCacheFactory; + private final @NonNull Caching webCacheFactory; private final @NonNull SdmxSourceConsumer eventListener; @@ -68,13 +68,13 @@ private Cache getCache() { } @Override - public @NonNull String getCacheId() { - return webCacheFactory.getCacheId(); + public @NonNull String getCachingId() { + return webCacheFactory.getCachingId(); } @Override - public int getCacheRank() { - return webCacheFactory.getCacheRank(); + public int getCachingRank() { + return webCacheFactory.getCachingRank(); } @Override @@ -88,13 +88,13 @@ public int getCacheRank() { } @Override - public @NonNull Collection getSupportedFileProperties() { + public @NonNull Collection getFileCachingProperties() { return Collections.emptyList(); } @Override - public @NonNull Collection getSupportedWebProperties() { - return webCacheFactory.getSupportedWebProperties(); + public @NonNull Collection getWebCachingProperties() { + return webCacheFactory.getWebCachingProperties(); } } From 4d9c4e6682fe368a463914c39f895239343ae947 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 6 Jul 2023 15:39:37 +0200 Subject: [PATCH 032/114] Improve MemCachingSupport --- .../internal/sdmxdl/cli/WebNetOptions.java | 2 +- .../main/java/sdmxdl/format}/MemCache.java | 2 +- .../sdmxdl/format}/MemCachingSupport.java | 40 ++++++++++++- .../java/sdmxdl/format}/MemCacheTest.java | 33 ++++++++++- .../sdmxdl/format/MemCachingSupportTest.java | 56 +++++++++++++++++++ .../java/_test/sdmxdl/util/CachingAssert.java | 9 +-- .../java/sdmxdl/provider/TypedIdTest.java | 2 +- 7 files changed, 128 insertions(+), 16 deletions(-) rename {sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext => sdmx-dl-format-base/src/main/java/sdmxdl/format}/MemCache.java (99%) rename {sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext => sdmx-dl-format-base/src/main/java/sdmxdl/format}/MemCachingSupport.java (53%) rename {sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext => sdmx-dl-format-base/src/test/java/sdmxdl/format}/MemCacheTest.java (70%) create mode 100644 sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 2fe04be81..5386bd05b 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -27,8 +27,8 @@ import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DiskCache; import sdmxdl.format.DiskCachingSupport; +import sdmxdl.format.MemCachingSupport; import sdmxdl.provider.ext.DualCachingSupport; -import sdmxdl.provider.ext.MemCachingSupport; import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java similarity index 99% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java rename to sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java index 45db51e7f..2737c743f 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ext; +package sdmxdl.format; import lombok.NonNull; import nbbrd.design.VisibleForTesting; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java similarity index 53% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java rename to sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index 63dcb71a0..eb39b7a36 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -1,15 +1,21 @@ -package sdmxdl.provider.ext; +package sdmxdl.format; import lombok.NonNull; +import sdmxdl.DataRepository; import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; import java.time.Clock; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentMap; +import java.util.function.Supplier; @lombok.Builder(toBuilder = true) public final class MemCachingSupport implements Caching { @@ -20,6 +26,14 @@ public final class MemCachingSupport implements Caching { @lombok.Builder.Default private final int rank = UNKNOWN_CACHING_RANK; + @lombok.NonNull + @lombok.Builder.Default + private final Supplier> repositories = HashMap::new; + + @lombok.NonNull + @lombok.Builder.Default + private final Supplier> webMonitors = HashMap::new; + @lombok.NonNull @lombok.Builder.Default private final Clock clock = Clock.systemDefaultZone(); @@ -36,12 +50,12 @@ public int getCachingRank() { @Override public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { - return MemCache.builder().clock(clock).build(); + return getCache(); } @Override public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { - return MemCache.builder().clock(clock).build(); + return getCache(); } @Override @@ -53,4 +67,24 @@ public int getCachingRank() { public @NonNull Collection getWebCachingProperties() { return Collections.emptyList(); } + + private Cache getCache() { + return MemCache + .builder() + .repositories(repositories.get()) + .webMonitors(webMonitors.get()) + .clock(clock) + .build(); + } + + public static final class Builder { + + public @NonNull Builder repositoriesOf(@NonNull ConcurrentMap repositories) { + return repositories(() -> repositories); + } + + public @NonNull Builder webMonitorsOf(@NonNull ConcurrentMap webMonitors) { + return webMonitors(() -> webMonitors); + } + } } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java similarity index 70% rename from sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java rename to sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java index 48dd8c1e1..9e79204f4 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/ext/MemCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java @@ -14,17 +14,21 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ext; +package sdmxdl.format; import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; import tests.sdmxdl.ext.CacheAssert; +import java.time.Clock; import java.time.Duration; +import java.time.Instant; +import java.time.ZoneId; import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; -import static _test.sdmxdl.util.CachingAssert.clock; import static org.assertj.core.api.Assertions.assertThat; /** @@ -76,4 +80,29 @@ public void testGetRepository() { .as("Updated key should return updated value") .isEqualTo(r1009); } + + @Test + public void testMapFactories() { + assertThat(MemCache.builder().build()) + .satisfies(x -> { + assertThat(x.getRepositories()) + .isInstanceOf(HashMap.class); + + assertThat(x.getWebMonitors()) + .isInstanceOf(HashMap.class); + }); + + assertThat(MemCache.builder().repositories(new TreeMap<>()).webMonitors(new ConcurrentHashMap<>()).build()) + .satisfies(x -> { + assertThat(x.getRepositories()) + .isInstanceOf(TreeMap.class); + + assertThat(x.getWebMonitors()) + .isInstanceOf(ConcurrentHashMap.class); + }); + } + + private static Clock clock(long value) { + return Clock.fixed(Instant.ofEpochMilli(value), ZoneId.systemDefault()); + } } diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java new file mode 100644 index 000000000..cafea0e44 --- /dev/null +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java @@ -0,0 +1,56 @@ +package sdmxdl.format; + +import nbbrd.io.text.Parser; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; +import sdmxdl.SdmxManager; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; + +import java.io.File; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; + +import static org.assertj.core.api.Assertions.assertThat; +import static sdmxdl.format.MemCachingSupport.builder; + +public class MemCachingSupportTest { + + @ParameterizedTest + @EnumSource(Extractor.class) + public void testFactories(Extractor extractor) { + assertThat(builder().id("").build()) + .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isNotSameAs(extractor.f(x).getRepositories()).isInstanceOf(HashMap.class)) + .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isNotSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(HashMap.class)); + + assertThat(builder().id("").repositories(ConcurrentHashMap::new).webMonitors(ConcurrentSkipListMap::new).build()) + .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isNotSameAs(extractor.f(x).getRepositories()).isInstanceOf(ConcurrentHashMap.class)) + .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isNotSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(ConcurrentSkipListMap.class)); + + assertThat(builder().id("").repositoriesOf(new ConcurrentHashMap<>()).webMonitorsOf(new ConcurrentSkipListMap<>()).build()) + .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isSameAs(extractor.f(x).getRepositories()).isInstanceOf(ConcurrentHashMap.class)) + .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(ConcurrentSkipListMap.class)); + } + + enum Extractor { + + FILE { + @Override + MemCache f(MemCachingSupport z) { + return (MemCache) z.getFileCache(FILE_SOURCE, SdmxManager.NO_OP_EVENT_LISTENER); + } + }, WEB { + @Override + MemCache f(MemCachingSupport z) { + return (MemCache) z.getWebCache(WEB_SOURCE, SdmxManager.NO_OP_EVENT_LISTENER); + } + }; + + abstract MemCache f(MemCachingSupport z); + } + + private final static SdmxFileSource FILE_SOURCE = SdmxFileSource.builder().data(new File("")).build(); + + private final static SdmxWebSource WEB_SOURCE = SdmxWebSource.builder().id("").driver("").endpoint(Parser.onURI().parseValue("http://localhost").orElseThrow(RuntimeException::new)).build(); +} diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java index effb54e94..f77c94796 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java @@ -3,15 +3,12 @@ import nbbrd.io.function.IOFunction; import org.assertj.core.api.Condition; import sdmxdl.DataRepository; -import sdmxdl.provider.ext.MemCache; +import sdmxdl.format.MemCache; import sdmxdl.web.MonitorReports; import tests.sdmxdl.ext.FakeClock; import java.io.IOException; -import java.time.Clock; import java.time.Duration; -import java.time.Instant; -import java.time.ZoneId; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -28,10 +25,6 @@ public static String idOf(Object... items) { return Stream.of(items).map(Object::toString).collect(Collectors.joining()); } - public static Clock clock(long value) { - return Clock.fixed(Instant.ofEpochMilli(value), ZoneId.systemDefault()); - } - @lombok.Value public static class Context { diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java index 1192f3413..da985bfb1 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; import sdmxdl.ext.Cache; -import sdmxdl.provider.ext.MemCache; +import sdmxdl.format.MemCache; import tests.sdmxdl.ext.FakeClock; import java.io.IOException; From 20511c8e57c376d0a83b3cc5e6d6f83ba7bd76f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jul 2023 04:45:19 +0000 Subject: [PATCH 033/114] Bump quarkus.platform.version from 3.1.3.Final to 3.2.0.Final Bumps `quarkus.platform.version` from 3.1.3.Final to 3.2.0.Final. Updates `quarkus-bom` from 3.1.3.Final to 3.2.0.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.3.Final...3.2.0.Final) Updates `quarkus-maven-plugin` from 3.1.3.Final to 3.2.0.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.1.3.Final...3.2.0.Final) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 0d93fba11..0ea1c68ad 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.1.3.Final + 3.2.0.Final true true From e270269e56e03b2cbdbd3cf13cf8a466b4ad2448 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jul 2023 04:51:44 +0000 Subject: [PATCH 034/114] Bump checker-qual from 3.35.0 to 3.36.0 Bumps [checker-qual](https://github.com/typetools/checker-framework) from 3.35.0 to 3.36.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.35.0...checker-framework-3.36.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker-qual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 62117cd9e..e4ec0cb65 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.checkerframework checker-qual - 3.35.0 + 3.36.0 From c60dee7930dc13f93fe718450c8a514e4f7c29a8 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 10 Jul 2023 09:12:23 +0200 Subject: [PATCH 035/114] Remove dialect API --- CHANGELOG.md | 1 + docs/content/cli/usage.md | 11 ++- docs/tmp/sources.csv | 68 +++++++-------- .../sdmxdl/web/spi/FailsafeDriver.java | 19 ----- sdmx-dl-api/src/main/java/module-info.java | 1 - .../src/main/java/sdmxdl/SdmxManager.java | 3 - .../src/main/java/sdmxdl/SdmxSource.java | 2 - .../src/main/java/sdmxdl/ext/Registry.java | 63 -------------- .../src/main/java/sdmxdl/ext/spi/Dialect.java | 49 ----------- .../java/sdmxdl/file/SdmxFileManager.java | 5 -- .../main/java/sdmxdl/file/SdmxFileSource.java | 3 - .../main/java/sdmxdl/web/SdmxWebManager.java | 7 -- .../main/java/sdmxdl/web/SdmxWebSource.java | 3 - .../main/java/sdmxdl/web/spi/WebDriver.java | 4 - .../test/java/_test/sdmxdl/TestDriver.java | 19 +---- .../java/sdmxdl/web/SdmxWebManagerTest.java | 13 +-- .../java/tests/sdmxdl/ext/DialectAssert.java | 36 -------- .../java/tests/sdmxdl/ext/MockedDialect.java | 26 ------ .../tests/sdmxdl/ext/SdmxDialectAssert.java | 5 -- .../java/tests/sdmxdl/web/MockedDriver.java | 4 - .../tests/sdmxdl/web/WebDriverAssert.java | 1 - .../java/sdmxdl/cli/ListSourcesCommand.java | 1 - .../cli/experimental/CheckRulesCommand.java | 1 - .../cli/experimental/FetchExtraCommand.java | 12 ++- sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto | 5 +- .../sdmxdl/cli/ListSourcesCommandTest.java | 2 +- .../sdmxdl/desktop/SdmxAutoCompletion.java | 45 ---------- .../sdmxdl/desktop/SeriesMetaFormats.java | 2 +- .../sdmxdl/desktop/HasSdmxProperties.java | 7 -- .../main/java/sdmxdl/desktop/JDataSet.java | 10 +-- .../src/main/java/sdmxdl/desktop/Main.java | 2 - .../java/sdmxdl/desktop/MainComponent.java | 11 +-- .../java/sdmxdl/desktop/SingleSeries.java | 17 +--- .../format/protobuf/ProtobufSources.java | 2 - .../src/main/proto/sdmxdl_source.proto | 13 ++- .../format/protobuf/ProtobufSourcesTest.java | 1 - .../java/sdmxdl/format/xml/XmlFileSource.java | 9 -- .../java/sdmxdl/format/xml/XmlWebSource.java | 5 -- .../sdmxdl/format/xml/XmlFileSourceTest.java | 17 +--- .../sdmxdl/format/xml/XmlWebSourceTest.java | 3 - .../java/sdmxdl/provider}/ext/SeriesMeta.java | 2 +- .../provider/ext/SeriesMetaFactory.java | 16 +++- .../sdmxdl/provider/web/WebDriverSupport.java | 4 - .../provider/web/CachedRestClientTest.java | 2 +- .../connectors/drivers/EurostatDriver.java | 2 - .../connectors/drivers/ImfDriver.java | 2 - .../connectors/drivers/InseeDriver.java | 4 - .../connectors/drivers/NbbDriver.java | 2 - .../connectors/drivers/OecdDriver.java | 2 - .../connectors/drivers/Sdmx20Driver.java | 2 - .../connectors/drivers/Sdmx21Driver.java | 3 - .../provider/connectors/drivers/SeDriver.java | 2 - .../connectors/drivers/UisDriver.java | 2 - .../connectors/drivers/Sdmx20DriverTest.java | 3 +- .../sdmxdl/provider/ri/ext/EcbDialect.java | 85 ------------------- .../sdmxdl/provider/ri/ext/InseeDialect.java | 80 ----------------- .../sdmxdl/provider/ri/ext/Sdmx20Dialect.java | 49 ----------- .../sdmxdl/provider/ri/ext/Sdmx21Dialect.java | 49 ----------- .../provider/ri/web/drivers/BbkDriver.java | 5 -- .../ri/web/drivers/DotStatDriver2.java | 2 - .../ri/web/drivers/EurostatDriver2.java | 2 - .../provider/ri/web/drivers/FileDriver.java | 1 - .../provider/ri/web/drivers/ImfDriver2.java | 2 - .../provider/ri/web/drivers/InseeDriver2.java | 4 - .../provider/ri/web/drivers/NbbDriver2.java | 2 - .../ri/web/drivers/Sdmx21Driver2.java | 3 - .../src/main/java/module-info.java | 8 -- .../provider/ri/ext/InseeDialectTest.java | 67 --------------- 68 files changed, 86 insertions(+), 829 deletions(-) delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/Registry.java delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Dialect.java delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/ext/DialectAssert.java delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/ext/MockedDialect.java delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/ext/SdmxDialectAssert.java rename {sdmx-dl-api/src/main/java/sdmxdl => sdmx-dl-provider-base/src/main/java/sdmxdl/provider}/ext/SeriesMeta.java (97%) delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/EcbDialect.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/InseeDialect.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx20Dialect.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx21Dialect.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/ext/InseeDialectTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 317933e05..a1d3de3da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Refactor cache API [#500](https://github.com/nbbrd/sdmx-dl/issues/500) - ![API] Refactor network API [#503](https://github.com/nbbrd/sdmx-dl/issues/503) +- ![API] Remove dialect API [#505](https://github.com/nbbrd/sdmx-dl/issues/505) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/docs/content/cli/usage.md b/docs/content/cli/usage.md index 67144a504..12a8ce343 100644 --- a/docs/content/cli/usage.md +++ b/docs/content/cli/usage.md @@ -243,7 +243,6 @@ Output format: [`Description:string`](../datatypes#string), [`Aliases:list`](../datatypes#list), [`Driver:string`](../datatypes#string), - [`Dialect:string`](../datatypes#string), [`Endpoint:uri`](../datatypes#uri), [`Properties:map`](../datatypes#list), [`Website:url`](../datatypes#url), @@ -254,11 +253,11 @@ Output format: {{< expand "Output sample" >}} -| Name | Description | Aliases | Driver | Dialect | Endpoint | Properties | Website | Monitor | MonitorWebsite | Languages | -|-------|---------------------------------|----------|---------------------|---------|--------------------------------------------------|----------------------|---------------------------------------------|-----------------------------------|----------------------------------------------------|-----------| -| ABS | Australian Bureau of Statistics | | ri:abs | | https://stat.data.abs.gov.au/restsdmx/sdmx.ashx | | https://stat.data.abs.gov.au | upptime:/nbbrd/sdmx-upptime/ABS | https://nbbrd.github.io/sdmx-upptime/history/abs | en | -| ECB | European Central Bank | | ri:sdmx21 | ECB2020 | https://sdw-wsrest.ecb.europa.eu/service | detailSupported=true | https://sdw.ecb.europa.eu | upptime:/nbbrd/sdmx-upptime/ECB | https://nbbrd.github.io/sdmx-upptime/history/ecb | en | -| ESTAT | Eurostat | EUROSTAT | connectors:eurostat | | https://ec.europa.eu/eurostat/SDMX/diss-web/rest | | https://ec.europa.eu/eurostat/data/database | upptime:/nbbrd/sdmx-upptime/ESTAT | https://nbbrd.github.io/sdmx-upptime/history/estat | en,de,fr | +| Name | Description | Aliases | Driver | Endpoint | Properties | Website | Monitor | MonitorWebsite | Languages | +|-------|---------------------------------|----------|---------------------|--------------------------------------------------|----------------------|---------------------------------------------|-----------------------------------|----------------------------------------------------|-----------| +| ABS | Australian Bureau of Statistics | | ri:abs | https://stat.data.abs.gov.au/restsdmx/sdmx.ashx | | https://stat.data.abs.gov.au | upptime:/nbbrd/sdmx-upptime/ABS | https://nbbrd.github.io/sdmx-upptime/history/abs | en | +| ECB | European Central Bank | | ri:sdmx21 | https://sdw-wsrest.ecb.europa.eu/service | detailSupported=true | https://sdw.ecb.europa.eu | upptime:/nbbrd/sdmx-upptime/ECB | https://nbbrd.github.io/sdmx-upptime/history/ecb | en | +| ESTAT | Eurostat | EUROSTAT | connectors:eurostat | https://ec.europa.eu/eurostat/SDMX/diss-web/rest | | https://ec.europa.eu/eurostat/data/database | upptime:/nbbrd/sdmx-upptime/ESTAT | https://nbbrd.github.io/sdmx-upptime/history/estat | en,de,fr | {{< /expand >}} diff --git a/docs/tmp/sources.csv b/docs/tmp/sources.csv index d09d02a61..69c28d079 100644 --- a/docs/tmp/sources.csv +++ b/docs/tmp/sources.csv @@ -1,34 +1,34 @@ -Name,Description,Aliases,Driver,Dialect,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages -ABS,Australian Bureau of Statistics,,ri:sdmx21,,https://api.data.abs.gov.au,detailSupported=true,https://explore.data.abs.gov.au,upptime:/nbbrd/sdmx-upptime/ABS,https://nbbrd.github.io/sdmx-upptime/history/abs,en -BBK,Deutsche Bundesbank,,ri:bbk,,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" -BIS,Bank for International Settlements,,ri:sdmx21,,https://stats.bis.org/api/v1,detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en -CAMSTAT,National Institute of Statistics of Cambodia,,ri:sdmx21,,https://nsiws-stable-camstat-live.officialstatistics.org/rest,,http://camstat.nis.gov.kh/?locale=en&start=0,upptime:/nbbrd/sdmx-upptime/CAMSTAT,https://nbbrd.github.io/sdmx-upptime/history/camstat,"en,km" -ECB,European Central Bank,,ri:sdmx21,ECB2020,https://data-api.ecb.europa.eu/service,detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en -EC_DG_COMP,European Commission - Directorate General for Competition,,ri:estat,,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en -EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,ri:estat,,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en -EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,ri:estat,,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en -ESCAP,Economic and Social Commission for Asia and the Pacific,,ri:sdmx21,,https://api-dataexplorer.unescap.org/rest,detailSupported=true,https://dataexplorer.unescap.org/,upptime:/nbbrd/sdmx-upptime/ESCAP,https://nbbrd.github.io/sdmx-upptime/history/escap,en -ESTAT,Eurostat,EUROSTAT,ri:estat,,https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/data/database,upptime:/nbbrd/sdmx-upptime/ESTAT,https://nbbrd.github.io/sdmx-upptime/history/estat,"en,de,fr" -ESTAT_COMEXT,Eurostat - International trade in goods statistics (ITGS),,ri:estat,,https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview,upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT,https://nbbrd.github.io/sdmx-upptime/history/estat_comext,en -ILO,International Labour Organization,,ri:sdmx21,,https://www.ilo.org/sdmx/rest,detailSupported=true,https://ilostat.ilo.org/data/,upptime:/nbbrd/sdmx-upptime/ILO,https://nbbrd.github.io/sdmx-upptime/history/ilo,"en,es,fr" -IMF,International Monetary Fund,,ri:imf,,http://dataservices.imf.org/REST/SDMX_XML.svc,,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF,https://nbbrd.github.io/sdmx-upptime/history/imf,en -IMF_SDMX_CENTRAL,International Monetary Fund (SDMX Central),,ri:sdmx21,,https://sdmxcentral.imf.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL,https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central,"en,fr" -INEGI,"National Institute of Statistics, Geography and Informatics",,ri:sdmx21,,https://sdmx.snieg.mx/service/Rest,"detailSupported=true,trailingSlashRequired=true",https://sdmx.snieg.mx,upptime:/nbbrd/sdmx-upptime/INEGI,https://nbbrd.github.io/sdmx-upptime/history/inegi,"en,es" -INSEE,National Institute of Statistics and Economic Studies,,ri:insee,,https://bdm.insee.fr/series/sdmx,,https://www.insee.fr/fr/statistiques,upptime:/nbbrd/sdmx-upptime/INSEE,https://nbbrd.github.io/sdmx-upptime/history/insee,"en,fr" -ISTAT,Italian National Institute of Statistics,,ri:sdmx21,,https://esploradati.istat.it/SDMXWS/rest,detailSupported=true,https://esploradati.istat.it/databrowser/,upptime:/nbbrd/sdmx-upptime/ISTAT,https://nbbrd.github.io/sdmx-upptime/history/istat,"en,it" -NB,Norges Bank,,ri:sdmx21,,https://data.norges-bank.no/api,detailSupported=true,https://www.norges-bank.no/en/topics/Statistics/,upptime:/nbbrd/sdmx-upptime/NB,https://nbbrd.github.io/sdmx-upptime/history/nb,"en,no" -NBB,National Bank of Belgium,,ri:nbb,,https://stat.nbb.be/restsdmx/sdmx.ashx,,https://stat.nbb.be,upptime:/nbbrd/sdmx-upptime/NBB,https://nbbrd.github.io/sdmx-upptime/history/nbb,"en,de,fr,nl" -OECD,The Organisation for Economic Co-operation and Development,,ri:dotstat,,https://stats.oecd.org/restsdmx/sdmx.ashx,,https://stats.oecd.org,upptime:/nbbrd/sdmx-upptime/OECD,https://nbbrd.github.io/sdmx-upptime/history/oecd,"en,es,fr,it" -SE,Statistics Estonia,,ri:dotstat,,http://andmebaas.stat.ee/restsdmx/sdmx.ashx,,http://andmebaas.stat.ee,upptime:/nbbrd/sdmx-upptime/SE,https://nbbrd.github.io/sdmx-upptime/history/se,"en,et" -SGR,SDMX Global Registry,,ri:sdmx21,,https://registry.sdmx.org/ws/rest,detailSupported=true,https://registry.sdmx.org/overview.html,upptime:/nbbrd/sdmx-upptime/SGR,https://nbbrd.github.io/sdmx-upptime/history/sgr,en -SIMEL,El Salvador Labor Market Information System,,ri:sdmx21,,https://disseminatesimel.mtps.gob.sv/rest,detailSupported=true,https://datasimel.mtps.gob.sv/,upptime:/nbbrd/sdmx-upptime/SIMEL,https://nbbrd.github.io/sdmx-upptime/history/simel,"en,es" -SPC,Pacific Data Hub,,ri:sdmx21,,https://stats-nsi-stable.pacificdata.org/rest,detailSupported=true,https://stats.pacificdata.org/?locale=en,upptime:/nbbrd/sdmx-upptime/SPC,https://nbbrd.github.io/sdmx-upptime/history/spc,"en,fr" -STATCAN,Statistics Canada,,ri:statcan,,https://www150.statcan.gc.ca/t1/wds/rest,cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" -STATEC,National Institute of statistics and economic studies of the Grand Duchy of Luxembourg,,ri:sdmx21,,https://lustat.statec.lu/rest,detailSupported=true,https://lustat.statec.lu,upptime:/nbbrd/sdmx-upptime/STATEC,https://nbbrd.github.io/sdmx-upptime/history/statec,"en,fr" -TNSO,National Statistical Office of Thailand,,ri:sdmx21,,https://ns1-oshub.nso.go.th/rest,detailSupported=true,https://oshub.nso.go.th/?lc=en,upptime:/nbbrd/sdmx-upptime/TNSO,https://nbbrd.github.io/sdmx-upptime/history/tnso,"en,th" -UIS,Unesco Institute for Statistics,,ri:dotstat,,http://data.uis.unesco.org/RestSDMX/sdmx.ashx,,http://data.uis.unesco.org,upptime:/nbbrd/sdmx-upptime/UIS,https://nbbrd.github.io/sdmx-upptime/history/uis,"en,fr" -UKDS,UK Data Service,,ri:dotstat,,https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx,,https://stats2.digitalresources.jisc.ac.uk/,upptime:/nbbrd/sdmx-upptime/UKDS,https://nbbrd.github.io/sdmx-upptime/history/ukds,en -UNDATA,Data access system to UN databases,,ri:sdmx21,,https://data.un.org/WS/rest,detailSupported=true,https://data.un.org/SdmxBrowser/start,upptime:/nbbrd/sdmx-upptime/UNDATA,https://nbbrd.github.io/sdmx-upptime/history/undata,en -UNICEF,UN International Children's Emergency Fund,,ri:sdmx21,,https://sdmx.data.unicef.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.unicef.org/,upptime:/nbbrd/sdmx-upptime/UNICEF,https://nbbrd.github.io/sdmx-upptime/history/unicef,en -WB,World Bank,,ri:sdmx21,,https://api.worldbank.org/v2/sdmx/rest,"detailSupported=true,trailingSlashRequired=true",https://data.worldbank.org,upptime:/nbbrd/sdmx-upptime/WB,https://nbbrd.github.io/sdmx-upptime/history/wb,"en,es,fr" -WITS,World Integrated Trade Solution,,ri:sdmx21,,http://wits.worldbank.org/API/V1/SDMX/V21/rest,trailingSlashRequired=true,https://wits.worldbank.org,upptime:/nbbrd/sdmx-upptime/WITS,https://nbbrd.github.io/sdmx-upptime/history/wits,"en,es" +Name,Description,Aliases,Driver,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages +ABS,Australian Bureau of Statistics,,ri:sdmx21,https://api.data.abs.gov.au,detailSupported=true,https://explore.data.abs.gov.au,upptime:/nbbrd/sdmx-upptime/ABS,https://nbbrd.github.io/sdmx-upptime/history/abs,en +BBK,Deutsche Bundesbank,,ri:bbk,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" +BIS,Bank for International Settlements,,ri:sdmx21,https://stats.bis.org/api/v1,detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en +CAMSTAT,National Institute of Statistics of Cambodia,,ri:sdmx21,https://nsiws-stable-camstat-live.officialstatistics.org/rest,,http://camstat.nis.gov.kh/?locale=en&start=0,upptime:/nbbrd/sdmx-upptime/CAMSTAT,https://nbbrd.github.io/sdmx-upptime/history/camstat,"en,km" +ECB,European Central Bank,,ri:sdmx21,https://data-api.ecb.europa.eu/service,detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en +EC_DG_COMP,European Commission - Directorate General for Competition,,ri:estat,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en +EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,ri:estat,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en +EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,ri:estat,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en +ESCAP,Economic and Social Commission for Asia and the Pacific,,ri:sdmx21,https://api-dataexplorer.unescap.org/rest,detailSupported=true,https://dataexplorer.unescap.org/,upptime:/nbbrd/sdmx-upptime/ESCAP,https://nbbrd.github.io/sdmx-upptime/history/escap,en +ESTAT,Eurostat,EUROSTAT,ri:estat,https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/data/database,upptime:/nbbrd/sdmx-upptime/ESTAT,https://nbbrd.github.io/sdmx-upptime/history/estat,"en,de,fr" +ESTAT_COMEXT,Eurostat - International trade in goods statistics (ITGS),,ri:estat,https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview,upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT,https://nbbrd.github.io/sdmx-upptime/history/estat_comext,en +ILO,International Labour Organization,,ri:sdmx21,https://www.ilo.org/sdmx/rest,detailSupported=true,https://ilostat.ilo.org/data/,upptime:/nbbrd/sdmx-upptime/ILO,https://nbbrd.github.io/sdmx-upptime/history/ilo,"en,es,fr" +IMF,International Monetary Fund,,ri:imf,http://dataservices.imf.org/REST/SDMX_XML.svc,,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF,https://nbbrd.github.io/sdmx-upptime/history/imf,en +IMF_SDMX_CENTRAL,International Monetary Fund (SDMX Central),,ri:sdmx21,https://sdmxcentral.imf.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL,https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central,"en,fr" +INEGI,"National Institute of Statistics, Geography and Informatics",,ri:sdmx21,https://sdmx.snieg.mx/service/Rest,"detailSupported=true,trailingSlashRequired=true",https://sdmx.snieg.mx,upptime:/nbbrd/sdmx-upptime/INEGI,https://nbbrd.github.io/sdmx-upptime/history/inegi,"en,es" +INSEE,National Institute of Statistics and Economic Studies,,ri:insee,https://bdm.insee.fr/series/sdmx,,https://www.insee.fr/fr/statistiques,upptime:/nbbrd/sdmx-upptime/INSEE,https://nbbrd.github.io/sdmx-upptime/history/insee,"en,fr" +ISTAT,Italian National Institute of Statistics,,ri:sdmx21,https://esploradati.istat.it/SDMXWS/rest,detailSupported=true,https://esploradati.istat.it/databrowser/,upptime:/nbbrd/sdmx-upptime/ISTAT,https://nbbrd.github.io/sdmx-upptime/history/istat,"en,it" +NB,Norges Bank,,ri:sdmx21,https://data.norges-bank.no/api,detailSupported=true,https://www.norges-bank.no/en/topics/Statistics/,upptime:/nbbrd/sdmx-upptime/NB,https://nbbrd.github.io/sdmx-upptime/history/nb,"en,no" +NBB,National Bank of Belgium,,ri:nbb,https://stat.nbb.be/restsdmx/sdmx.ashx,,https://stat.nbb.be,upptime:/nbbrd/sdmx-upptime/NBB,https://nbbrd.github.io/sdmx-upptime/history/nbb,"en,de,fr,nl" +OECD,The Organisation for Economic Co-operation and Development,,ri:dotstat,https://stats.oecd.org/restsdmx/sdmx.ashx,,https://stats.oecd.org,upptime:/nbbrd/sdmx-upptime/OECD,https://nbbrd.github.io/sdmx-upptime/history/oecd,"en,es,fr,it" +SE,Statistics Estonia,,ri:dotstat,http://andmebaas.stat.ee/restsdmx/sdmx.ashx,,http://andmebaas.stat.ee,upptime:/nbbrd/sdmx-upptime/SE,https://nbbrd.github.io/sdmx-upptime/history/se,"en,et" +SGR,SDMX Global Registry,,ri:sdmx21,https://registry.sdmx.org/ws/rest,detailSupported=true,https://registry.sdmx.org/overview.html,upptime:/nbbrd/sdmx-upptime/SGR,https://nbbrd.github.io/sdmx-upptime/history/sgr,en +SIMEL,El Salvador Labor Market Information System,,ri:sdmx21,https://disseminatesimel.mtps.gob.sv/rest,detailSupported=true,https://datasimel.mtps.gob.sv/,upptime:/nbbrd/sdmx-upptime/SIMEL,https://nbbrd.github.io/sdmx-upptime/history/simel,"en,es" +SPC,Pacific Data Hub,,ri:sdmx21,https://stats-nsi-stable.pacificdata.org/rest,detailSupported=true,https://stats.pacificdata.org/?locale=en,upptime:/nbbrd/sdmx-upptime/SPC,https://nbbrd.github.io/sdmx-upptime/history/spc,"en,fr" +STATCAN,Statistics Canada,,ri:statcan,https://www150.statcan.gc.ca/t1/wds/rest,cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" +STATEC,National Institute of statistics and economic studies of the Grand Duchy of Luxembourg,,ri:sdmx21,https://lustat.statec.lu/rest,detailSupported=true,https://lustat.statec.lu,upptime:/nbbrd/sdmx-upptime/STATEC,https://nbbrd.github.io/sdmx-upptime/history/statec,"en,fr" +TNSO,National Statistical Office of Thailand,,ri:sdmx21,https://ns1-oshub.nso.go.th/rest,detailSupported=true,https://oshub.nso.go.th/?lc=en,upptime:/nbbrd/sdmx-upptime/TNSO,https://nbbrd.github.io/sdmx-upptime/history/tnso,"en,th" +UIS,Unesco Institute for Statistics,,ri:dotstat,http://data.uis.unesco.org/RestSDMX/sdmx.ashx,,http://data.uis.unesco.org,upptime:/nbbrd/sdmx-upptime/UIS,https://nbbrd.github.io/sdmx-upptime/history/uis,"en,fr" +UKDS,UK Data Service,,ri:dotstat,https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx,,https://stats2.digitalresources.jisc.ac.uk/,upptime:/nbbrd/sdmx-upptime/UKDS,https://nbbrd.github.io/sdmx-upptime/history/ukds,en +UNDATA,Data access system to UN databases,,ri:sdmx21,https://data.un.org/WS/rest,detailSupported=true,https://data.un.org/SdmxBrowser/start,upptime:/nbbrd/sdmx-upptime/UNDATA,https://nbbrd.github.io/sdmx-upptime/history/undata,en +UNICEF,UN International Children's Emergency Fund,,ri:sdmx21,https://sdmx.data.unicef.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.unicef.org/,upptime:/nbbrd/sdmx-upptime/UNICEF,https://nbbrd.github.io/sdmx-upptime/history/unicef,en +WB,World Bank,,ri:sdmx21,https://api.worldbank.org/v2/sdmx/rest,"detailSupported=true,trailingSlashRequired=true",https://data.worldbank.org,upptime:/nbbrd/sdmx-upptime/WB,https://nbbrd.github.io/sdmx-upptime/history/wb,"en,es,fr" +WITS,World Integrated Trade Solution,,ri:sdmx21,http://wits.worldbank.org/API/V1/SDMX/V21/rest,trailingSlashRequired=true,https://wits.worldbank.org,upptime:/nbbrd/sdmx-upptime/WITS,https://nbbrd.github.io/sdmx-upptime/history/wits,"en,es" diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java index f91261762..d7ce40dc1 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java @@ -146,25 +146,6 @@ public boolean isAvailable() { return result; } - @Override - public @NonNull String getDefaultDialect() { - String result; - - try { - result = delegate.getDefaultDialect(); - } catch (RuntimeException ex) { - unexpectedError("while getting default dialect", ex); - return NO_DEFAULT_DIALECT; - } - - if (result == null) { - unexpectedNull("null list"); - return NO_DEFAULT_DIALECT; - } - - return result; - } - private IOException newUnexpectedError(String context, RuntimeException ex) { String msg = "Unexpected " + ex.getClass().getSimpleName() + " " + context; onUnexpectedError.accept(msg, ex); diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index c5448dc0d..2f5574e31 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -16,7 +16,6 @@ exports sdmxdl.web.spi; uses sdmxdl.ext.spi.Caching; - uses sdmxdl.ext.spi.Dialect; uses sdmxdl.file.spi.FileReader; uses sdmxdl.web.spi.Networking; uses sdmxdl.web.spi.WebAuthenticator; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index 0d3d67a41..74dac9693 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -25,7 +25,6 @@ import sdmxdl.web.SdmxWebManager; import java.io.IOException; -import java.util.Optional; /** * @author Philippe Charles @@ -45,8 +44,6 @@ public abstract class SdmxManager { public abstract @NonNull SdmxSourceConsumer getEventListener(); - public abstract @NonNull Optional getDialect(@NonNull SOURCE source); - public static final SdmxSourceConsumer NO_OP_EVENT_LISTENER = (source, t) -> { }; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java index 3bc9abe5d..8551e6b3a 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java @@ -1,7 +1,6 @@ package sdmxdl; import nbbrd.design.SealedType; -import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; @@ -11,5 +10,4 @@ }) public abstract class SdmxSource { - public abstract @Nullable String getDialect(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/Registry.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/Registry.java deleted file mode 100644 index d1f987c3b..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/Registry.java +++ /dev/null @@ -1,63 +0,0 @@ -package sdmxdl.ext; - -import internal.util.DialectLoader; -import lombok.NonNull; -import nbbrd.design.StaticFactoryMethod; -import sdmxdl.DataStructure; -import sdmxdl.SdmxManager; -import sdmxdl.SdmxSource; -import sdmxdl.Series; -import sdmxdl.ext.spi.Dialect; -import sdmxdl.file.SdmxFileManager; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; - -import java.io.IOException; -import java.util.List; -import java.util.function.Function; - -@lombok.Value -@lombok.Builder(toBuilder = true) -public class Registry { - - @StaticFactoryMethod - public static @NonNull Registry ofServiceLoader() { - return Registry - .builder() - .dialects(DialectLoader.load()) - .build(); - } - - - @StaticFactoryMethod - public static @NonNull Registry noOp() { - return Registry.builder().build(); - } - - @lombok.NonNull - @lombok.Singular - List dialects; - - public @NonNull Function getFactory(@NonNull SdmxFileManager manager, @NonNull SdmxFileSource source, @NonNull DataStructure dsd) throws IOException { - return get(manager, source, dsd); - } - - public @NonNull Function getFactory(@NonNull SdmxWebManager manager, @NonNull String sourceName, @NonNull DataStructure dsd) throws IOException { - SdmxWebSource source = manager.getSources().get(sourceName); - return source != null ? get(manager, source, dsd) : series -> SeriesMeta.EMPTY; - } - - private > @NonNull Function get(@NonNull M manager, @NonNull S source, @NonNull DataStructure dsd) throws IOException { - String dialectName = manager.getDialect(source).orElse(null); - if (dialectName == null) { - return series -> SeriesMeta.EMPTY; - } - return getDialects() - .stream() - .filter(dialect -> dialect.getName().equals(dialectName)) - .findFirst() - .orElseThrow(() -> new IOException("Failed to find a suitable dialect for '" + source + "'")) - .getMetaFactory(dsd); - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Dialect.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Dialect.java deleted file mode 100644 index 7324fa19f..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Dialect.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package sdmxdl.ext.spi; - -import lombok.NonNull; -import nbbrd.design.ThreadSafe; -import nbbrd.service.Quantifier; -import nbbrd.service.ServiceDefinition; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; - -import java.util.function.Function; - -/** - * @author Philippe Charles - */ -@ServiceDefinition( - quantifier = Quantifier.MULTIPLE, - loaderName = "internal.util.DialectLoader" -) -@ThreadSafe -public interface Dialect { - - @NonNull - String getName(); - - @NonNull - String getDescription(); - - @NonNull Function getMetaFactory(@NonNull DataStructure dsd); - - String SDMX20_DIALECT = "SDMX20"; - String SDMX21_DIALECT = "SDMX21"; -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index d10589ca6..a372ed0d6 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -82,11 +82,6 @@ public class SdmxFileManager extends SdmxManager { return reader.read(source, getContext()); } - @Override - public @NonNull Optional getDialect(@NonNull SdmxFileSource source) { - return Optional.ofNullable(source.getDialect()); - } - private FileContext initContext() { return FileContext .builder() diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java index ccaeb7f33..cf5f034df 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java @@ -37,9 +37,6 @@ public class SdmxFileSource extends SdmxSource { @Nullable File structure; - @Nullable - String dialect; - @NonNull public DataflowRef asDataflowRef() { return DataflowRef.parse("data" + (structure != null && !structure.toString().isEmpty() ? "&struct" : "")); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 7755f0cea..7e7df8013 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -145,13 +145,6 @@ public MonitorReport getMonitorReport(@NonNull SdmxWebSource source) throws IOEx return monitoring.getReport(source, getContext()); } - @Override - public @NonNull Optional getDialect(@NonNull SdmxWebSource source) { - return source.getDialect() != null - ? Optional.of(source.getDialect()) - : lookupDriverById(source.getDriver()).map(WebDriver::getDefaultDialect); - } - private void checkSourceProperties(SdmxWebSource source, WebDriver driver) { if (eventListener != NO_OP_EVENT_LISTENER) { Collection expected = driver.getSupportedProperties(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java index c08adfdf2..8b47cbf09 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java @@ -44,9 +44,6 @@ public class SdmxWebSource extends SdmxSource { @lombok.NonNull String driver; - @Nullable - String dialect; - @lombok.NonNull URI endpoint; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java index 9cec44687..c9765cdf4 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java @@ -58,11 +58,7 @@ Connection connect( @NonNull Collection getSupportedProperties(); - @NonNull String getDefaultDialect(); - int NATIVE_RANK = Byte.MAX_VALUE; int WRAPPED_RANK = 0; int UNKNOWN_RANK = -1; - - String NO_DEFAULT_DIALECT = ""; } diff --git a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java index 07f24ba27..e765e28b9 100644 --- a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java +++ b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java @@ -25,8 +25,6 @@ import java.util.Collection; import java.util.Collections; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; - /** * @author Philippe Charles */ @@ -61,11 +59,6 @@ public boolean isAvailable() { public @NonNull Collection getSupportedProperties() { return Collections.singletonList("hello"); } - - @Override - public @NonNull String getDefaultDialect() { - return NO_DEFAULT_DIALECT; - } }, FAILING { @Override public @NonNull String getId() { @@ -96,11 +89,6 @@ public boolean isAvailable() { public @NonNull Collection getSupportedProperties() { throw new CustomException(); } - - @Override - public @NonNull String getDefaultDialect() { - throw new CustomException(); - } }, NULL { @Override public @NonNull String getId() { @@ -131,12 +119,7 @@ public boolean isAvailable() { public @NonNull Collection getSupportedProperties() { return null; } - - @Override - public @NonNull String getDefaultDialect() { - return null; - } }; - public static final SdmxWebSource SOURCE = SdmxWebSource.builder().id("123").driver("456").dialect(SDMX21_DIALECT).endpointOf("http://localhost").build(); + public static final SdmxWebSource SOURCE = SdmxWebSource.builder().id("123").driver("456").endpointOf("http://localhost").build(); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index 927890c24..830d39d48 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -19,11 +19,9 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; import sdmxdl.ext.spi.Caching; -import sdmxdl.ext.spi.Dialect; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.api.SdmxManagerAssert; -import tests.sdmxdl.ext.MockedDialect; import tests.sdmxdl.web.MockedDriver; import java.io.IOException; @@ -103,7 +101,6 @@ public void testGetSources() { SdmxWebSource abs = SdmxWebSource.builder().id("abs").driver("sdmx21").endpointOf("http://abs").build(); SdmxWebSource nbbAlias = nbb.alias("bnb"); - SdmxWebSource nbbDialect = nbb.toBuilder().dialect("custom").clearAliases().build(); WebDriver sdmx21 = MockedDriver .builder() @@ -141,7 +138,6 @@ public void testGetSources() { SdmxWebManager .builder() .customSource(nbb) - .customSource(nbbDialect) .customSource(abs) .build() .getSources() @@ -157,7 +153,6 @@ public void testGetSources() { SdmxWebManager .builder() .driver(sdmx21) - .customSource(nbbDialect) .customSource(abs) .build() .getSources() @@ -167,7 +162,7 @@ public void testGetSources() { entryOf("abs", abs), entryOf("bnb", nbbAlias), entryOf("ecb", ecb), - entryOf("nbb", nbbDialect) + entryOf("nbb", nbb) ); } @@ -207,7 +202,7 @@ public void testGetConnection() throws IOException { .rank(WRAPPED_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) - .customSource(SdmxWebSource.builder().id("source").driver("d1").dialect("azerty").endpointOf(sample.getName()).build()) + .customSource(SdmxWebSource.builder().id("source").driver("d1").endpointOf(sample.getName()).build()) .build(); WebDriver driver2 = MockedDriver @@ -216,7 +211,7 @@ public void testGetConnection() throws IOException { .rank(NATIVE_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) - .customSource(SdmxWebSource.builder().id("source").driver("d2").dialect("azerty").endpointOf(sample.getName()).build()) + .customSource(SdmxWebSource.builder().id("source").driver("d2").endpointOf(sample.getName()).build()) .build(); try (Connection c = SdmxWebManager.builder().driver(driver2).driver(driver1).build().getConnection("source")) { @@ -278,7 +273,6 @@ public void testInvalidSourceProperties() throws IOException { .builder() .id("repoSource") .driver("repoDriver") - .dialect("azerty") .endpointOf(sample.getName()) .build(); private final WebDriver sampleDriver = MockedDriver @@ -289,7 +283,6 @@ public void testInvalidSourceProperties() throws IOException { .repo(sample, EnumSet.allOf(Feature.class)) .customSource(sampleSource) .build(); - private final Dialect sampleDialect = new MockedDialect("azerty"); private static AbstractMap.SimpleEntry entryOf(K name, V source) { return new AbstractMap.SimpleEntry<>(name, source); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/DialectAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/DialectAssert.java deleted file mode 100644 index 0622ada09..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/DialectAssert.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package tests.sdmxdl.ext; - -import sdmxdl.ext.spi.Dialect; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Philippe Charles - */ -@lombok.experimental.UtilityClass -public class DialectAssert { - - @SuppressWarnings("null") - public void assertDialectCompliance(Dialect d) { - assertThat(d.getName()).isNotBlank(); - assertThat(d.getDescription()).isNotBlank(); - - assertThat(d.getClass()).isFinal(); - } -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/MockedDialect.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/MockedDialect.java deleted file mode 100644 index e8c98ba05..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/MockedDialect.java +++ /dev/null @@ -1,26 +0,0 @@ -package tests.sdmxdl.ext; - -import lombok.NonNull; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; -import sdmxdl.ext.spi.Dialect; - -import java.util.function.Function; - -@lombok.RequiredArgsConstructor -public final class MockedDialect implements Dialect { - - @lombok.Getter - private final String name; - - @Override - public String getDescription() { - return getName(); - } - - @Override - public @NonNull Function getMetaFactory(DataStructure dsd) { - return series -> SeriesMeta.EMPTY; - } -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/SdmxDialectAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/SdmxDialectAssert.java deleted file mode 100644 index 322db695e..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/SdmxDialectAssert.java +++ /dev/null @@ -1,5 +0,0 @@ -package tests.sdmxdl.ext; - -@lombok.experimental.UtilityClass -public class SdmxDialectAssert { -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java index 9afb6eaab..a963112db 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java @@ -35,10 +35,6 @@ public final class MockedDriver implements WebDriver { @lombok.Singular private final Collection customSources; - @lombok.Getter - @lombok.Builder.Default - private final String defaultDialect = NO_DEFAULT_DIALECT; - @Override public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException { checkSource(source); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java index 6546ac065..86d22f511 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java @@ -19,7 +19,6 @@ public void assertCompliance(WebDriver d) { .builder() .id("valid") .driver(d.getId()) - .dialect("azerty") .endpointOf("http://localhost") .build(); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java index e222d04d7..aed90078d 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java @@ -55,7 +55,6 @@ private CsvTable getTable() { .columnOf("Description", this::getDescription) .columnOf("Aliases", SdmxWebSource::getAliases, CsvUtil.DEFAULT_LIST_FORMATTER) .columnOf("Driver", SdmxWebSource::getDriver) - .columnOf("Dialect", SdmxWebSource::getDialect) .columnOf("Endpoint", SdmxWebSource::getEndpoint, Formatter.onURI()) .columnOf("Properties", SdmxWebSource::getProperties, DEFAULT_MAP_FORMATTER) .columnOf("Website", SdmxWebSource::getWebsite, Formatter.onURL()) diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java index 8ce3c072e..68a3717fb 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java @@ -111,7 +111,6 @@ private static RulesConfig configOf(SdmxWebSource source) { try { RulesConfig.Builder result = RulesConfig.newBuilder(); result.setDriver(source.getDriver()); - if (source.getDialect() != null) result.setDialect(source.getDialect()); result.setProtocol(source.getEndpoint().toURL().getProtocol()); result.setProperties(DEFAULT_MAP_FORMATTER.formatAsString(source.getProperties())); return result.build(); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java index bbb9d6475..9159e07b0 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java @@ -23,14 +23,13 @@ import nbbrd.io.text.Formatter; import picocli.CommandLine; import sdmxdl.*; -import sdmxdl.ext.Registry; -import sdmxdl.ext.SeriesMeta; +import sdmxdl.provider.ext.SeriesMeta; +import sdmxdl.provider.ext.SeriesMetaFactory; import sdmxdl.web.SdmxWebManager; import java.io.IOException; import java.time.temporal.TemporalAmount; import java.util.concurrent.Callable; -import java.util.function.Function; import java.util.stream.Stream; import static internal.sdmxdl.cli.WebFlowOptions.SERIES_BY_KEY; @@ -71,16 +70,15 @@ private CsvTable getTable() { private Stream getRows() throws IOException { SdmxWebManager manager = web.loadManager(); - Registry registry = Registry.ofServiceLoader(); try (Connection conn = web.open(manager)) { DataStructure dsd = conn.getStructure(web.getFlow()); - Function factory = registry.getFactory(manager, web.getSource(), dsd); + SeriesMetaFactory factory = SeriesMetaFactory.getDefault(dsd); return sort.applySort(conn.getData(web.getFlow(), DataQuery.builder().key(web.getKey()).detail(getDetail()).build()).getData(), SERIES_BY_KEY) .map(series -> { - SeriesMeta x = factory.apply(series); + SeriesMeta x = factory.get(series); return new Extra( series.getKey(), x.getTimeUnit(), @@ -94,7 +92,7 @@ private Stream getRows() throws IOException { } private DataDetail getDetail() { - return DataDetail.NO_DATA; + return DataDetail.FULL; } @lombok.Value diff --git a/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto b/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto index 2d7cb85db..fc182e7f9 100644 --- a/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto +++ b/sdmx-dl-cli/src/main/proto/sdmxdl_debug.proto @@ -33,9 +33,8 @@ message RulesTarget { message RulesConfig { string driver = 1; - string dialect = 2; - string protocol = 3; - string properties = 4; + string protocol = 2; + string properties = 3; } message RulesExpect { diff --git a/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListSourcesCommandTest.java b/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListSourcesCommandTest.java index eec3aa57f..2ec648915 100644 --- a/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListSourcesCommandTest.java +++ b/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListSourcesCommandTest.java @@ -44,7 +44,7 @@ public void testContent(@TempDir Path temp) throws IOException { .doesNotContain("[SSL] Initializing SSL factory"); assertThat(FileSample.readAll(out)) - .contains("Name,Description,Aliases,Driver,Dialect,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages", atIndex(0)) + .contains("Name,Description,Aliases,Driver,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages", atIndex(0)) .hasSizeGreaterThan(2); } } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index b545c8309..c97a94355 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -27,8 +27,6 @@ import sdmxdl.Dimension; import sdmxdl.*; import sdmxdl.desktop.MainComponent; -import sdmxdl.ext.Registry; -import sdmxdl.ext.spi.Dialect; import sdmxdl.web.Network; import sdmxdl.web.SSLFactory; import sdmxdl.web.SdmxWebManager; @@ -65,10 +63,6 @@ public abstract class SdmxAutoCompletion { public abstract ListCellRenderer getRenderer(); - public static SdmxAutoCompletion onDialect(Registry registry) { - return new DialectCompletion(registry); - } - public static SdmxAutoCompletion onWebSource(SdmxWebManager manager) { return new WebSourceCompletion(manager); } @@ -85,45 +79,6 @@ public static SdmxAutoCompletion onAttribute(SdmxManager< return new AttributeCompletion<>(manager, source, flowRef, cache); } - @lombok.AllArgsConstructor - private static final class DialectCompletion extends SdmxAutoCompletion { - - @lombok.NonNull - private final Registry registry; - - @Override - public AutoCompletionSource getSource() { - return ExtAutoCompletionSource - .builder(this::load) - .behavior(SYNC) - .postProcessor(this::filterAndSort) - .valueToString(Dialect::getName) - .build(); - } - - @Override - public ListCellRenderer getRenderer() { - return CustomListCellRenderer.of(Dialect::getName, Dialect::getDescription); - } - - private List load(String term) { - return registry.getDialects(); - } - - private List filterAndSort(List list, String term) { - return list.stream().filter(getFilter(term)).sorted(getSorter(term)).collect(toList()); - } - - private Predicate getFilter(String term) { - Predicate filter = ExtAutoCompletionSource.basicFilter(term); - return value -> filter.test(value.getDescription()) || filter.test(value.getName()); - } - - private Comparator getSorter(String term) { - return Comparator.comparing(Dialect::getDescription); - } - } - @lombok.AllArgsConstructor private static final class WebSourceCompletion extends SdmxAutoCompletion { diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java index b413662cc..1ac18d5f4 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java @@ -1,7 +1,7 @@ package internal.sdmxdl.desktop; import nbbrd.io.text.Parser; -import sdmxdl.ext.SeriesMeta; +import sdmxdl.provider.ext.SeriesMeta; import java.text.*; import java.time.format.DateTimeFormatter; diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java index f535bd314..aac915ff1 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java @@ -2,7 +2,6 @@ import lombok.NonNull; import sdmxdl.SdmxManager; -import sdmxdl.ext.Registry; public interface HasSdmxProperties> { @@ -11,10 +10,4 @@ public interface HasSdmxProperties> { @NonNull M getSdmxManager(); void setSdmxManager(@NonNull M sdmxManager); - - String REGISTRY_PROPERTY = "registry"; - - @NonNull Registry getRegistry(); - - void setRegistry(@NonNull Registry registry); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java index f5494014e..89be31641 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java @@ -16,7 +16,6 @@ import org.jfree.data.xy.IntervalXYDataset; import sdmxdl.Attribute; import sdmxdl.Obs; -import sdmxdl.ext.Registry; import sdmxdl.web.SdmxWebManager; import javax.swing.*; @@ -45,13 +44,6 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { firePropertyChange(SDMX_MANAGER_PROPERTY, this.sdmxManager, this.sdmxManager = sdmxManager); } - @lombok.Getter - private Registry registry = Registry.noOp(); - - public void setRegistry(@NonNull Registry registry) { - firePropertyChange(REGISTRY_PROPERTY, this.registry, this.registry = registry); - } - public static final String MODEL_PROPERTY = "model"; @lombok.Getter @@ -140,7 +132,7 @@ private void onModelChange(PropertyChangeEvent evt) { new SwingWorker() { @Override protected SingleSeries doInBackground() throws Exception { - return SingleSeries.load(getSdmxManager(), getRegistry(), model); + return SingleSeries.load(getSdmxManager(), model); } @Override diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/Main.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/Main.java index 4aa61e07d..279caf5be 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/Main.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/Main.java @@ -3,7 +3,6 @@ import com.formdev.flatlaf.FlatLightLaf; import ec.util.various.swing.BasicSwingLauncher; import internal.sdmxdl.desktop.DesktopWebFactory; -import sdmxdl.ext.Registry; import javax.swing.*; @@ -22,7 +21,6 @@ public static void main(String[] args) { static JComponent create() { MainComponent mainComponent = new MainComponent(); mainComponent.setSdmxManager(DesktopWebFactory.loadManager()); - mainComponent.setRegistry(Registry.ofServiceLoader()); return mainComponent; } } \ No newline at end of file diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index b831a1fcf..6f479434c 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -17,7 +17,6 @@ import org.kordamp.ikonli.swing.FontIcon; import sdmxdl.DataflowRef; import sdmxdl.LanguagePriorityList; -import sdmxdl.ext.Registry; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -63,13 +62,6 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { firePropertyChange(SDMX_MANAGER_PROPERTY, this.sdmxManager, this.sdmxManager = sdmxManager); } - @lombok.Getter - private Registry registry = Registry.noOp(); - - public void setRegistry(@NonNull Registry registry) { - firePropertyChange(REGISTRY_PROPERTY, this.registry, this.registry = registry); - } - public static final String DATA_SOURCES_PROPERTY = "dataSources"; @lombok.Getter @@ -210,7 +202,7 @@ public void actionPerformed(ActionEvent e) { })); driversList.setCellRenderer(JLists.cellRendererOf((label, value) -> { - label.setText(nameDescription(value.getId(), value.getDefaultDialect()).render()); + label.setText(value.getId()); label.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); })); @@ -285,7 +277,6 @@ private void openCurrentDataSetRef() { } else { JDataSet result = new JDataSet(); result.setSdmxManager(sdmxManager); - result.setRegistry(registry); result.setModel(dataSetRef); main.addTab(title, getDataSourceIcon(dataSetRef.getDataSourceRef(), main::repaint), result); main.setSelectedComponent(result); diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java index 46b623e99..aa8b7b448 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java @@ -2,8 +2,8 @@ import lombok.NonNull; import sdmxdl.*; -import sdmxdl.ext.Registry; -import sdmxdl.ext.SeriesMeta; +import sdmxdl.provider.ext.SeriesMeta; +import sdmxdl.provider.ext.SeriesMetaFactory; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -17,24 +17,15 @@ class SingleSeries { @NonNull SeriesMeta meta; - public static SingleSeries load(SdmxWebManager manager, Registry registry, DataSetRef ref) throws IOException { + public static SingleSeries load(SdmxWebManager manager, DataSetRef ref) throws IOException { try (Connection conn = manager.getConnection(ref.getDataSourceRef().getSource())) { DataStructure dsd = conn.getStructure(ref.getDataSourceRef().getFlow()); Series series = conn.getDataStream(ref.getDataSourceRef().getFlow(), DataQuery.builder().key(ref.getKey()).detail(DataDetail.FULL).build()).findFirst().orElseThrow(RuntimeException::new); return new SingleSeries( dsd, series, - loadSeriesMeta(manager, registry, ref, dsd, series) + SeriesMetaFactory.getDefault(dsd).get(series) ); } } - - private static SeriesMeta loadSeriesMeta(SdmxWebManager manager, Registry registry, DataSetRef ref, DataStructure dsd, Series series) { - try { - return registry.getFactory(manager, ref.getDataSourceRef().getSource(), dsd).apply(series); - } catch (IOException ex) { - System.out.println("Series meta not found"); - return SeriesMeta.EMPTY; - } - } } diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java index 282b1b7ad..6fd026ed4 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java @@ -11,7 +11,6 @@ public static SdmxWebSource fromWebSource(sdmxdl.web.SdmxWebSource value) { result.setId(value.getId()); result.putAllNames(value.getNames()); result.setDriver(value.getDriver()); - if (value.getDialect() != null) result.setDialect(value.getDialect()); result.setEndpoint(value.getEndpoint().toString()); result.putAllProperties(value.getProperties()); result.addAllAliases(value.getAliases()); @@ -27,7 +26,6 @@ public static sdmxdl.web.SdmxWebSource toWebSource(SdmxWebSource value) { .id(value.getId()) .names(value.getNamesMap()) .driver(value.getDriver()) - .dialect(value.hasDialect() ? value.getDialect() : null) .endpointOf(value.getEndpoint()) .properties(value.getPropertiesMap()) .aliases(value.getAliasesList()) diff --git a/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto b/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto index 5e4532b11..d27fb871d 100644 --- a/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto +++ b/sdmx-dl-format-protobuf/src/main/proto/sdmxdl_source.proto @@ -7,11 +7,10 @@ message SdmxWebSource { string id = 1; map names = 2; string driver = 3; - optional string dialect = 4; - string endpoint = 5; - map properties = 6; - repeated string aliases = 7; - optional string website = 8; - optional string monitor = 9; - optional string monitor_website = 10; + string endpoint = 4; + map properties = 5; + repeated string aliases = 6; + optional string website = 7; + optional string monitor = 8; + optional string monitor_website = 9; } diff --git a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java index 7268bb0ea..374698bcc 100644 --- a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java +++ b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java @@ -22,7 +22,6 @@ public void testSources() { SdmxWebSource max = min .toBuilder() .name("en", "hello") - .dialect("OTHER") .property("key", "value") .alias("EUROSTAT") .websiteOf("http://website") diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java index 031e0e0db..d0f178e4d 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java @@ -42,11 +42,6 @@ private void formatXml(SdmxFileSource source, XMLStreamWriter xml, Charset encod xml.writeAttribute(STRUCT_ATTR, source.getStructure().toString()); } - String dialect = source.getDialect(); - if (!isNullOrEmpty(dialect)) { - xml.writeAttribute(DIALECT_ATTR, dialect); - } - xml.writeEndDocument(); } @@ -59,13 +54,11 @@ private void formatXml(SdmxFileSource source, XMLStreamWriter xml, Charset encod private static SdmxFileSource parseXml(XMLStreamReader xml) throws XMLStreamException { String data = null; String structure = null; - String dialect = null; while (xml.hasNext()) { if (xml.next() == XMLStreamReader.START_ELEMENT && xml.getLocalName().equals(ROOT_TAG)) { data = xml.getAttributeValue(null, DATA_ATTR); structure = xml.getAttributeValue(null, STRUCT_ATTR); - dialect = xml.getAttributeValue(null, DIALECT_ATTR); } } @@ -76,7 +69,6 @@ private static SdmxFileSource parseXml(XMLStreamReader xml) throws XMLStreamExce return SdmxFileSource.builder() .data(new File(data)) .structure(!isNullOrEmpty(structure) ? new File(structure) : null) - .dialect(dialect) .build(); } @@ -91,5 +83,4 @@ private boolean isNullOrEmpty(String o) { private static final String ROOT_TAG = "file"; private static final String DATA_ATTR = "data"; private static final String STRUCT_ATTR = "structure"; - private static final String DIALECT_ATTR = "dialect"; } diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java index 9b35eb7aa..94bd69923 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java @@ -52,7 +52,6 @@ public static Xml.Formatter> getFormatter() { private static final String NAME_TAG = "name"; private static final String DESCRIPTION_TAG = "description"; private static final String DRIVER_TAG = "driver"; - private static final String DIALECT_TAG = "dialect"; private static final String ENDPOINT_TAG = "endpoint"; private static final String PROPERTY_TAG = "property"; private static final String ALIAS_TAG = "alias"; @@ -84,9 +83,6 @@ private static List parseXml(XMLStreamReader reader) throws XMLSt case DRIVER_TAG: item.driver(reader.getElementText()); break; - case DIALECT_TAG: - item.dialect(reader.getElementText()); - break; case ENDPOINT_TAG: item.endpointOf(reader.getElementText()); break; @@ -129,7 +125,6 @@ private static void formatXml(List list, XMLStreamWriter writer, writeDescription(writer, description); } writeTextElement(writer, DRIVER_TAG, source.getDriver()); - writeTextElement(writer, DIALECT_TAG, source.getDialect()); writeTextElement(writer, ENDPOINT_TAG, source.getEndpoint().toString()); for (Map.Entry property : source.getProperties().entrySet()) { writeProperty(writer, property); diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java index 31b035302..750ea7396 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java @@ -34,9 +34,6 @@ public class XmlFileSourceTest { public void testFormatter() throws IOException { Xml.Formatter x = XmlFileSource.getFormatter(); - assertThat(x.formatToString(SdmxFileSource.builder().data(data).structure(structure).dialect("hello").build())) - .isEqualTo(""); - assertThat(x.formatToString(SdmxFileSource.builder().data(data).structure(structure).build())) .isEqualTo(""); @@ -56,23 +53,15 @@ public void testParser() throws IOException { assertThat(x.parseChars("")) .hasFieldOrPropertyWithValue("data", data) - .hasFieldOrPropertyWithValue("structure", null) - .hasFieldOrPropertyWithValue("dialect", null); + .hasFieldOrPropertyWithValue("structure", null); assertThat(x.parseChars("")) .hasFieldOrPropertyWithValue("data", data) - .hasFieldOrPropertyWithValue("structure", null) - .hasFieldOrPropertyWithValue("dialect", null); + .hasFieldOrPropertyWithValue("structure", null); assertThat(x.parseChars("")) .hasFieldOrPropertyWithValue("data", data) - .hasFieldOrPropertyWithValue("structure", structure) - .hasFieldOrPropertyWithValue("dialect", null); - - assertThat(x.parseChars("")) - .hasFieldOrPropertyWithValue("data", data) - .hasFieldOrPropertyWithValue("structure", structure) - .hasFieldOrPropertyWithValue("dialect", "hello"); + .hasFieldOrPropertyWithValue("structure", structure); } private final File data = new File("a.xml"); diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java index ea465c01e..09b2db7f3 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java @@ -25,7 +25,6 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; /** * @author Philippe Charles @@ -38,7 +37,6 @@ public class XmlWebSourceTest { .id("ECB") .name("en", "European Central Bank") .driver("ri:sdmx21") - .dialect(SDMX21_DIALECT) .endpointOf("https://data-api.ecb.europa.eu/service") .property("detailSupported", "true") .alias("XYZ") @@ -62,7 +60,6 @@ public class XmlWebSourceTest { + " ECB\n" + " European Central Bank\n" + " ri:sdmx21\n" - + " SDMX21\n" + " https://data-api.ecb.europa.eu/service\n" + " \n" + " XYZ\n" diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SeriesMeta.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMeta.java similarity index 97% rename from sdmx-dl-api/src/main/java/sdmxdl/ext/SeriesMeta.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMeta.java index ed5a37720..b97fa85af 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/SeriesMeta.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMeta.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.ext; +package sdmxdl.provider.ext; import java.time.temporal.TemporalAmount; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java index d92d740eb..d8c758bd0 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java @@ -19,7 +19,6 @@ import lombok.NonNull; import nbbrd.io.text.Parser; import sdmxdl.*; -import sdmxdl.ext.SeriesMeta; import sdmxdl.format.SeriesMetaUtil; import java.time.Duration; @@ -64,6 +63,17 @@ public final class SeriesMetaFactory { .build(); } + @NonNull + public static SeriesMetaFactory getDefault(@NonNull DataStructure dsd) { + return builder() + .byContent() + .valueUnit(getValueUnit(dsd)) + .decimal(getDecimal(dsd)) + .name(getName(dsd)) + .description(getDescription(dsd)) + .build(); + } + @NonNull public static SeriesMetaFactory sdmx20(@NonNull DataStructure dsd) { return builder() @@ -88,6 +98,10 @@ public static SeriesMetaFactory sdmx21(@NonNull DataStructure dsd) { public static final class Builder { + public Builder byContent() { + return timeUnit(series -> series.getObs().stream().map(obs -> obs.getPeriod().getDuration()).distinct().findFirst().orElse(null)); + } + public Builder byAttribute(@NonNull String attributeName, Parser timeUnitParser) { return timeUnit(series -> timeUnitParser.parse(series.getMeta().get(attributeName))); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java index 6e2e2d251..dcc7d5072 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java @@ -52,10 +52,6 @@ public final class WebDriverSupport implements WebDriver { @lombok.Singular private final Collection supportedProperties; - @lombok.Getter - @lombok.Builder.Default - private final String defaultDialect = NO_DEFAULT_DIALECT; - @lombok.NonNull @lombok.Builder.Default private final Predicate availability = properties -> true; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java index f12988a2e..8d010091c 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java @@ -191,7 +191,7 @@ public void testGetBase() { .build(); assertThat(getBase(s1, ANY)) - .hasToString("cache:rest/id1/-1698165431/*") + .hasToString("cache:rest/id1/1032839954/*") .isEqualTo(getBase(s1, ANY)) .isNotEqualTo(getBase(s1, LanguagePriorityList.parse("fr"))) .isNotEqualTo(getBase(s1.toBuilder().id("id2").build(), ANY)) diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java index cab18c140..51f34dded 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -25,7 +25,6 @@ import sdmxdl.web.spi.WebDriver; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; /** * @author Philippe Charles @@ -42,7 +41,6 @@ public final class EurostatDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(EUROSTAT::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(SDMX21_DIALECT) .source(SdmxWebSource .builder() .id("ESTAT") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java index 435dd15c6..177023e49 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -19,7 +19,6 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.IMF2; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Dialect; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; @@ -42,7 +41,6 @@ public final class ImfDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(IMF2::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(Dialect.SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("IMF") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java index 390651ea7..8367adaca 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -60,7 +60,6 @@ public final class InseeDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(InseeClient::new, OBS_FACTORY))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(INSEE_2017) .source(SdmxWebSource .builder() .id("INSEE") @@ -73,9 +72,6 @@ public final class InseeDriver implements WebDriver { .build()) .build(); - @SdmxFix(id = 2, category = CONTENT, cause = "Does not follow sdmx standard codes") - private static final String INSEE_2017 = "INSEE2017"; - private final static class InseeClient extends RestSdmxClient implements HasDetailSupported { private InseeClient(URI endpoint, Map properties) { diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java index c0dbb632a..d0421c500 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -19,7 +19,6 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.NBB; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Dialect; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; @@ -42,7 +41,6 @@ public final class NbbDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(NBB::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(Dialect.SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("NBB") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java index 877d0f970..b60fd050d 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -19,7 +19,6 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.OECD; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Dialect; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; @@ -42,7 +41,6 @@ public final class OecdDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(OECD::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(Dialect.SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("OECD") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java index 3191cada7..51e67b6b7 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java @@ -19,7 +19,6 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.RestSdmx20Client; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Dialect; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.spi.WebDriver; @@ -46,7 +45,6 @@ public final class Sdmx20Driver implements WebDriver { .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(Sdmx20Client::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .supportedPropertyOf(NEEDS_CREDENTIALS_PROPERTY) - .defaultDialect(Dialect.SDMX20_DIALECT) .build(); private static final class Sdmx20Client extends RestSdmx20Client { diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 3c767c0f3..0a75d8e91 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -30,7 +30,6 @@ import static internal.sdmxdl.provider.connectors.Connectors.*; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; /** @@ -52,7 +51,6 @@ public final class Sdmx21Driver implements WebDriver { .supportedPropertyOf(NEEDS_URL_ENCODING_PROPERTY) .supportedPropertyOf(SUPPORTS_COMPRESSION_PROPERTY) .supportedPropertyOf(DETAIL_SUPPORTED_PROPERTY) - .defaultDialect(SDMX21_DIALECT) .source(SdmxWebSource .builder() .id("ABS") @@ -91,7 +89,6 @@ public final class Sdmx21Driver implements WebDriver { .id("ECB") .name("en", "European Central Bank") .driver(CONNECTORS_SDMX_21) - .dialect("ECB2020") .endpointOf("https://data-api.ecb.europa.eu/service") .propertyOf(SUPPORTS_COMPRESSION_PROPERTY, true) .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java index 2132081e6..513de1a25 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -28,7 +28,6 @@ import java.net.URISyntaxException; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; /** * @author Philippe Charles @@ -45,7 +44,6 @@ public final class SeDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(SeClient::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("SE") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java index 506295c28..5636d7d6b 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -29,7 +29,6 @@ import java.util.Map; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; import static sdmxdl.provider.SdmxFix.Category.ENDPOINT; /** @@ -47,7 +46,6 @@ public final class UisDriver implements WebDriver { .rank(WRAPPED_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(UIS2::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .defaultDialect(SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("UIS") diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java index 28af438fe..6fe13d977 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java @@ -22,7 +22,6 @@ import tests.sdmxdl.web.WebDriverAssert; import static org.assertj.core.api.Assertions.assertThatCode; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; /** * @author Philippe Charles @@ -36,7 +35,7 @@ public void testCompliance() { @Test public void testConnect() { - SdmxWebSource x = SdmxWebSource.builder().id("localhost").driver("connectors:sdmx20").dialect(SDMX20_DIALECT).endpointOf("http://localhost").build(); + SdmxWebSource x = SdmxWebSource.builder().id("localhost").driver("connectors:sdmx20").endpointOf("http://localhost").build(); assertThatCode(() -> new Sdmx20Driver().connect(x, WebDriverAssert.noOpWebContext()).close()).doesNotThrowAnyException(); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/EcbDialect.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/EcbDialect.java deleted file mode 100644 index 4b4e35089..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/EcbDialect.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.sdmxdl.provider.ri.ext; - -import lombok.NonNull; -import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; -import sdmxdl.ext.spi.Dialect; -import sdmxdl.provider.ext.SeriesMetaFactory; - -import java.time.temporal.TemporalAmount; -import java.util.function.Function; - -/** - * @author Philippe Charles - */ -@ServiceProvider(Dialect.class) -public final class EcbDialect implements Dialect { - - @Override - public String getName() { - return "ECB2020"; - } - - @Override - public String getDescription() { - return getName(); - } - - @Override - public @NonNull Function getMetaFactory(DataStructure dsd) { - return getFreqFactory(dsd)::get; - } - - private static SeriesMetaFactory getFreqFactory(DataStructure dsd) { - return SeriesMetaFactory - .sdmx21(dsd) - .toBuilder() - .byDimension(SeriesMetaFactory.getFrequencyCodeIdIndex(dsd), EcbDialect::parseFreq) - .build(); - } - - private static TemporalAmount parseFreq(CharSequence code) { - if (code != null && code.length() == 1) { - switch (code.charAt(0)) { - case 'A': - return SeriesMetaFactory.ANNUAL; - case 'S': - case 'H': - return SeriesMetaFactory.HALF_YEARLY; - case 'Q': - return SeriesMetaFactory.QUARTERLY; - case 'M': - return SeriesMetaFactory.MONTHLY; - case 'W': - return SeriesMetaFactory.WEEKLY; - case 'D': - return SeriesMetaFactory.DAILY; - case 'B': - return SeriesMetaFactory.DAILY_BUSINESS; - case 'N': - return SeriesMetaFactory.MINUTELY; - default: - return null; - } - } - return SeriesMetaFactory.UNDEFINED; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/InseeDialect.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/InseeDialect.java deleted file mode 100644 index 622dc4ae1..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/InseeDialect.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.sdmxdl.provider.ri.ext; - -import lombok.NonNull; -import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; -import sdmxdl.ext.spi.Dialect; -import sdmxdl.provider.ext.SeriesMetaFactory; - -import java.time.temporal.TemporalAmount; -import java.util.function.Function; - -/** - * https://www.insee.fr/fr/information/2862759 - * - * @author Philippe Charles - */ -@ServiceProvider(Dialect.class) -public final class InseeDialect implements Dialect { - - @Override - public String getName() { - return "INSEE2017"; - } - - @Override - public String getDescription() { - return getName(); - } - - @Override - public @NonNull Function getMetaFactory(DataStructure dsd) { - return getFreqFactory(dsd)::get; - } - - static SeriesMetaFactory getFreqFactory(DataStructure dsd) { - return SeriesMetaFactory - .sdmx21(dsd) - .toBuilder() - .byDimension(SeriesMetaFactory.getFrequencyCodeIdIndex(dsd), InseeDialect::parseInseeFreq) - .build(); - } - - private static TemporalAmount parseInseeFreq(CharSequence code) { - if (code != null && code.length() == 1) { - switch (code.charAt(0)) { - case 'A': - return SeriesMetaFactory.ANNUAL; - case 'S': - return SeriesMetaFactory.HALF_YEARLY; - case 'T': - return SeriesMetaFactory.QUARTERLY; - case 'M': - return SeriesMetaFactory.MONTHLY; - case 'B': - // Two-monthly - // FIXME: define new freq? - return SeriesMetaFactory.MONTHLY; - } - } - return SeriesMetaFactory.UNDEFINED; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx20Dialect.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx20Dialect.java deleted file mode 100644 index 842152bef..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx20Dialect.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.sdmxdl.provider.ri.ext; - -import lombok.NonNull; -import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; -import sdmxdl.ext.spi.Dialect; -import sdmxdl.provider.ext.SeriesMetaFactory; - -import java.util.function.Function; - -/** - * @author Philippe Charles - */ -@ServiceProvider(Dialect.class) -public final class Sdmx20Dialect implements Dialect { - - @Override - public String getName() { - return SDMX20_DIALECT; - } - - @Override - public String getDescription() { - return getName(); - } - - @Override - public @NonNull Function getMetaFactory(DataStructure dsd) { - return SeriesMetaFactory.sdmx20(dsd)::get; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx21Dialect.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx21Dialect.java deleted file mode 100644 index 3687f8c78..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/ext/Sdmx21Dialect.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.sdmxdl.provider.ri.ext; - -import lombok.NonNull; -import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructure; -import sdmxdl.Series; -import sdmxdl.ext.SeriesMeta; -import sdmxdl.ext.spi.Dialect; -import sdmxdl.provider.ext.SeriesMetaFactory; - -import java.util.function.Function; - -/** - * @author Philippe Charles - */ -@ServiceProvider(Dialect.class) -public final class Sdmx21Dialect implements Dialect { - - @Override - public String getName() { - return SDMX21_DIALECT; - } - - @Override - public String getDescription() { - return getName(); - } - - @Override - public @NonNull Function getMetaFactory(DataStructure dsd) { - return SeriesMetaFactory.sdmx21(dsd)::get; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java index ee5bdbe90..cc8d6ecc3 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -36,7 +36,6 @@ import java.util.Set; import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; import static sdmxdl.provider.SdmxFix.Category.QUERY; /** @@ -54,7 +53,6 @@ public final class BbkDriver implements WebDriver { .rank(NATIVE_RANK) .connector(RestConnector.of(BbkDriver::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) - .defaultDialect(DIALECT) .source(SdmxWebSource .builder() .id("BBK") @@ -134,7 +132,4 @@ protected void applyFilter(DataDetail detail, URLQueryBuilder result) { } } } - - // FIXME: use TIME_FORMAT attribute instead of FREQ dimension in SDMX21 ? - private static final String DIALECT = SDMX20_DIALECT; } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java index 1d630e4ca..3216d35ba 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java @@ -34,7 +34,6 @@ import java.util.Set; import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; import static sdmxdl.provider.SdmxFix.Category.ENDPOINT; import static sdmxdl.provider.SdmxFix.Category.QUERY; @@ -53,7 +52,6 @@ public final class DotStatDriver2 implements WebDriver { .rank(NATIVE_RANK) .connector(RestConnector.of(DotStatDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) - .defaultDialect(SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("OECD") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index eecb8b0a3..2d760f82f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -57,7 +57,6 @@ import static internal.sdmxdl.provider.ri.web.Sdmx21RestParsers.withCharset; import static java.util.Collections.singletonList; import static sdmxdl.LanguagePriorityList.ANY; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; @@ -84,7 +83,6 @@ public final class EurostatDriver2 implements WebDriver { .supportedProperties(RI_CONNECTION_PROPERTIES) .supportedPropertyOf(ASYNC_MAX_RETRIES_PROPERTY) .supportedPropertyOf(ASYNC_SLEEP_TIME_PROPERTY) - .defaultDialect(SDMX21_DIALECT) .source(SdmxWebSource .builder() .id("ESTAT") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 37ca2d657..4db2db98f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -103,7 +103,6 @@ private static SdmxFileSource toFileSource(SdmxWebSource source) throws IOExcept .builder() .data(toFile(source.getEndpoint())) .structure(toFile(STRUCTURE_PROPERTY.get(source.getProperties()))) - .dialect(source.getDialect()) .build(); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java index b09125d64..9be1305cd 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java @@ -45,7 +45,6 @@ import java.util.function.Supplier; import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; import static sdmxdl.provider.SdmxFix.Category.QUERY; /** @@ -63,7 +62,6 @@ public final class ImfDriver2 implements WebDriver { .rank(NATIVE_RANK) .connector(RestConnector.of(ImfDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) - .defaultDialect(SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("IMF") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index f84931554..dafedd970 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -63,7 +63,6 @@ public final class InseeDriver2 implements WebDriver { .rank(NATIVE_RANK) .connector(RestConnector.of(InseeRestClient::new)) .supportedProperties(RI_CONNECTION_PROPERTIES) - .defaultDialect(DIALECT) .source(SdmxWebSource .builder() .id("INSEE") @@ -77,9 +76,6 @@ public final class InseeDriver2 implements WebDriver { .build()) .build(); - @SdmxFix(id = 2, category = CONTENT, cause = "Does not follow sdmx standard codes") - private static final String DIALECT = "INSEE2017"; - @SdmxFix(id = 3, category = CONTENT, cause = "Some dimension/code ids are invalid") private static Dimension fixDimensionId(Dimension dimension) { String id = dimension.getId(); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java index ec2c18a91..7f223c89f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java @@ -45,7 +45,6 @@ import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; -import static sdmxdl.ext.spi.Dialect.SDMX20_DIALECT; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; @@ -64,7 +63,6 @@ public final class NbbDriver2 implements WebDriver { .rank(NATIVE_RANK) .connector(RestConnector.of(NbbDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) - .defaultDialect(SDMX20_DIALECT) .source(SdmxWebSource .builder() .id("NBB") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java index 2040462b4..6cad54d9b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java @@ -33,7 +33,6 @@ import java.util.Set; import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.ext.spi.Dialect.SDMX21_DIALECT; import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; import static sdmxdl.provider.web.WebProperties.TRAILING_SLASH_REQUIRED_PROPERTY; @@ -54,7 +53,6 @@ public final class Sdmx21Driver2 implements WebDriver { .supportedProperties(RI_CONNECTION_PROPERTIES) .supportedPropertyOf(DETAIL_SUPPORTED_PROPERTY) .supportedPropertyOf(TRAILING_SLASH_REQUIRED_PROPERTY) - .defaultDialect(SDMX21_DIALECT) .source(SdmxWebSource .builder() .id("ABS") @@ -93,7 +91,6 @@ public final class Sdmx21Driver2 implements WebDriver { .id("ECB") .name("en", "European Central Bank") .driver(RI_SDMX_21) - .dialect("ECB2020") .endpointOf("https://data-api.ecb.europa.eu/service") .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) .websiteOf("https://data.ecb.europa.eu/") diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index 129f221d5..235de1b3c 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -36,12 +36,4 @@ internal.sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; opens internal.sdmxdl.provider.ri.web.monitors to com.google.gson; - - provides sdmxdl.ext.spi.Dialect with - internal.sdmxdl.provider.ri.ext.EcbDialect, - internal.sdmxdl.provider.ri.ext.InseeDialect, - internal.sdmxdl.provider.ri.ext.Sdmx20Dialect, - internal.sdmxdl.provider.ri.ext.Sdmx21Dialect; - - uses sdmxdl.ext.spi.Dialect; } \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/ext/InseeDialectTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/ext/InseeDialectTest.java deleted file mode 100644 index 3ca9312ba..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/ext/InseeDialectTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.sdmxdl.provider.ri.ext; - -import org.junit.jupiter.api.Test; -import sdmxdl.*; -import sdmxdl.provider.ext.SeriesMetaFactory; -import tests.sdmxdl.ext.DialectAssert; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Philippe Charles - */ -public class InseeDialectTest { - - @Test - public void testCompliance() { - DialectAssert.assertDialectCompliance(new InseeDialect()); - } - - @Test - public void testFreqParser() { - Key.Builder key = Key.builder(dsd); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "A").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.ANNUAL); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "T").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.QUARTERLY); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "M").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.MONTHLY); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "B").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.MONTHLY); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "S").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.HALF_YEARLY); - assertThat(InseeDialect.getFreqFactory(dsd).get(Series.builder().key(key.put("FREQ", "X").build()).build()).getTimeUnit()).isEqualTo(SeriesMetaFactory.UNDEFINED); - } - - // https://bdm.insee.fr/series/sdmx/codelist/FR1/CL_PERIODICITE/1.0 - private final Codelist cl_periodicite = Codelist - .builder() - .ref(CodelistRef.of("FR1", "CL_PERIODICITE", "1.0")) - .code("A", "Annuelle") - .code("B", "Bimestrielle") - .code("M", "Mensuelle") - .code("S", "Semestrielle") - .code("T", "Trimestrielle") - .build(); - - // https://bdm.insee.fr/series/sdmx/datastructure/FR1/IPI-2010/1.0?references=children - private final DataStructure dsd = DataStructure - .builder() - .dimension(Dimension.builder().id("FREQ").position(1).name("Périodicité").codelist(cl_periodicite).build()) - .ref(DataStructureRef.of("FR1", "IPI-2010", "1.0")) - .timeDimensionId("TIME_PERIOD") - .primaryMeasureId("OBS_VALUE") - .name("Indices de la production industrielle - Résultats par secteur d'activité détaillé et regroupements MIG") - .build(); -} From 43cae0571581d390437e3ae59102cd0d5e29aa95 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 10 Jul 2023 10:38:13 +0200 Subject: [PATCH 036/114] Fix sources doc --- docs/layouts/shortcodes/sources.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/layouts/shortcodes/sources.html b/docs/layouts/shortcodes/sources.html index 540ac7c53..f749f7770 100644 --- a/docs/layouts/shortcodes/sources.html +++ b/docs/layouts/shortcodes/sources.html @@ -14,9 +14,9 @@ {{ $name := index $r 0 }} {{ $description := index $r 1 }} - {{ $website := index $r 7 }} + {{ $website := index $r 6 }} {{ $domain := (urls.Parse $website).Host }} - {{ $monitor_website := index $r 9 }} + {{ $monitor_website := index $r 8 }} {{ $monitor_name := replace (lower $name) "_" "-" }} {{ $name }} {{ $description }} From 420254f66019b877bcb3c0e0abe2ccd7fcfc06fb Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 10 Jul 2023 11:02:43 +0200 Subject: [PATCH 037/114] Split cache --- .../internal/sdmxdl/{ext => }/NoOpCache.java | 31 ++++-- .../java/internal/sdmxdl/NoOpCaching.java | 58 ++++++++++ .../internal/sdmxdl/ext/spi/NoOpCaching.java | 46 -------- sdmx-dl-api/src/main/java/module-info.java | 4 +- .../src/main/java/sdmxdl/SdmxManager.java | 3 - .../src/main/java/sdmxdl/ext/spi/Caching.java | 44 -------- .../{ext/Cache.java => file/FileCache.java} | 19 ++-- .../java/sdmxdl/file/SdmxFileManager.java | 8 +- .../java/sdmxdl/file/spi/FileCaching.java | 39 +++++++ .../java/sdmxdl/file/spi/FileContext.java | 7 +- .../main/java/sdmxdl/web/SdmxWebManager.java | 6 +- .../src/main/java/sdmxdl/web/WebCache.java | 48 +++++++++ .../main/java/sdmxdl/web/spi/WebCaching.java | 39 +++++++ .../main/java/sdmxdl/web/spi/WebContext.java | 7 +- .../ext/{CacheTest.java => WebCacheTest.java} | 5 +- .../java/sdmxdl/web/SdmxWebManagerTest.java | 8 +- .../java/tests/sdmxdl/ext/CacheAssert.java | 48 ++++----- .../internal/sdmxdl/cli/WebNetOptions.java | 10 +- .../main/java/sdmxdl/format/DiskCache.java | 33 ++++-- .../sdmxdl/format/DiskCachingSupport.java | 32 ++++-- .../src/main/java/sdmxdl/format/MemCache.java | 37 +++++-- .../java/sdmxdl/format/MemCachingSupport.java | 30 ++++-- .../java/sdmxdl/format/DiskCacheTest.java | 16 +-- .../src/main/java/module-info.java | 6 +- .../java/sdmxdl/format/kryo/KryoProvider.java | 8 +- .../src/main/java/module-info.java | 8 +- .../sdmxdl/format/protobuf/JsonProvider.java | 8 +- .../format/protobuf/ProtobufProvider.java | 8 +- .../java/sdmxdl/provider/FileTypedId.java | 101 ++++++++++++++++++ .../{TypedId.java => WebTypedId.java} | 22 ++-- .../java/sdmxdl/provider/ext/DualCache.java | 58 ---------- .../provider/ext/DualCachingSupport.java | 68 ------------ .../sdmxdl/provider/ext/DualWebCache.java | 58 ++++++++++ .../provider/ext/DualWebCachingSupport.java | 56 ++++++++++ .../provider/file/CachedFileClient.java | 23 ++-- .../sdmxdl/provider/web/CachedRestClient.java | 48 ++++----- .../{TypedIdTest.java => WebTypedIdTest.java} | 8 +- .../provider/web/CachedRestClientTest.java | 12 +-- .../provider/ri/web/drivers/FileDriver.java | 53 +++++---- .../provider/ri/web/drivers/PxWebDriver.java | 22 ++-- .../ri/web/drivers/StatCanDriver.java | 20 ++-- .../ri/web/monitors/UpptimeMonitoring.java | 10 +- 42 files changed, 727 insertions(+), 448 deletions(-) rename sdmx-dl-api/src/main/java/internal/sdmxdl/{ext => }/NoOpCache.java (57%) create mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java delete mode 100644 sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java rename sdmx-dl-api/src/main/java/sdmxdl/{ext/Cache.java => file/FileCache.java} (68%) create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java rename sdmx-dl-api/src/test/java/sdmxdl/ext/{CacheTest.java => WebCacheTest.java} (56%) create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/{TypedId.java => WebTypedId.java} (74%) delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java rename sdmx-dl-provider-base/src/test/java/sdmxdl/provider/{TypedIdTest.java => WebTypedIdTest.java} (89%) diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java similarity index 57% rename from sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java rename to sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java index c7a3cdb72..6b64aead7 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/NoOpCache.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java @@ -14,43 +14,58 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.ext; +package internal.sdmxdl; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; +import sdmxdl.file.FileCache; import sdmxdl.web.MonitorReports; +import sdmxdl.web.WebCache; import java.time.Clock; /** * @author Philippe Charles */ -public enum NoOpCache implements Cache { +public enum NoOpCache implements FileCache, WebCache { INSTANCE; @Override - public @NonNull Clock getClock() { + public @NonNull Clock getFileClock() { return Clock.systemDefaultZone(); } @Override - public DataRepository getRepository(@NonNull String key) { + public @NonNull Clock getWebClock() { + return Clock.systemDefaultZone(); + } + + @Override + public DataRepository getFileRepository(@NonNull String key) { return null; } @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { + public DataRepository getWebRepository(@NonNull String key) { + return null; + } + + @Override + public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { + } + + @Override + public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { } @Override - public @Nullable MonitorReports getMonitorReports(@NonNull String key) { + public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { return null; } @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { } } diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java new file mode 100644 index 000000000..70301efc4 --- /dev/null +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java @@ -0,0 +1,58 @@ +package internal.sdmxdl; + +import lombok.NonNull; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.file.FileCache; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCaching; + +import java.util.Collection; +import java.util.Collections; + +public enum NoOpCaching implements FileCaching, WebCaching { + + INSTANCE; + + @Override + public @NonNull String getFileCachingId() { + return "NO_OP"; + } + + @Override + public @NonNull String getWebCachingId() { + return "NO_OP"; + } + + @Override + public int getFileCachingRank() { + return UNKNOWN_FILE_CACHING_RANK; + } + + @Override + public int getWebCachingRank() { + return UNKNOWN_WEB_CACHING_RANK; + } + + @Override + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener) { + return FileCache.noOp(); + } + + @Override + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { + return WebCache.noOp(); + } + + @Override + public @NonNull Collection getFileCachingProperties() { + return Collections.emptyList(); + } + + @Override + public @NonNull Collection getWebCachingProperties() { + return Collections.emptyList(); + } +} diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java deleted file mode 100644 index 29174b814..000000000 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/ext/spi/NoOpCaching.java +++ /dev/null @@ -1,46 +0,0 @@ -package internal.sdmxdl.ext.spi; - -import lombok.NonNull; -import sdmxdl.ext.Cache; -import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; - -import java.util.Collection; -import java.util.Collections; - -public enum NoOpCaching implements Caching { - - INSTANCE; - - @Override - public @NonNull String getCachingId() { - return "NO_OP"; - } - - @Override - public int getCachingRank() { - return UNKNOWN_CACHING_RANK; - } - - @Override - public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { - return Cache.noOp(); - } - - @Override - public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { - return Cache.noOp(); - } - - @Override - public @NonNull Collection getFileCachingProperties() { - return Collections.emptyList(); - } - - @Override - public @NonNull Collection getWebCachingProperties() { - return Collections.emptyList(); - } -} diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index 2f5574e31..ee81b6be1 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -9,16 +9,16 @@ exports sdmxdl; exports sdmxdl.ext; - exports sdmxdl.ext.spi; exports sdmxdl.file; exports sdmxdl.file.spi; exports sdmxdl.web; exports sdmxdl.web.spi; - uses sdmxdl.ext.spi.Caching; + uses sdmxdl.file.spi.FileCaching; uses sdmxdl.file.spi.FileReader; uses sdmxdl.web.spi.Networking; uses sdmxdl.web.spi.WebAuthenticator; + uses sdmxdl.web.spi.WebCaching; uses sdmxdl.web.spi.WebDriver; uses sdmxdl.web.spi.WebMonitoring; } \ No newline at end of file diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index 74dac9693..b83f7b206 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -20,7 +20,6 @@ import nbbrd.design.SealedType; import nbbrd.design.ThreadSafe; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; import sdmxdl.file.SdmxFileManager; import sdmxdl.web.SdmxWebManager; @@ -40,8 +39,6 @@ public abstract class SdmxManager { public abstract @NonNull LanguagePriorityList getLanguages(); - public abstract @NonNull Caching getCaching(); - public abstract @NonNull SdmxSourceConsumer getEventListener(); public static final SdmxSourceConsumer NO_OP_EVENT_LISTENER = (source, t) -> { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java deleted file mode 100644 index 940a5e12d..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/spi/Caching.java +++ /dev/null @@ -1,44 +0,0 @@ -package sdmxdl.ext.spi; - -import internal.sdmxdl.ext.spi.NoOpCaching; -import lombok.NonNull; -import nbbrd.design.StaticFactoryMethod; -import nbbrd.service.Quantifier; -import nbbrd.service.ServiceDefinition; -import nbbrd.service.ServiceId; -import nbbrd.service.ServiceSorter; -import sdmxdl.ext.Cache; -import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; - -import java.util.Collection; - -@ServiceDefinition( - quantifier = Quantifier.SINGLE, - loaderName = "internal.util.CachingLoader", - fallback = NoOpCaching.class -) -public interface Caching { - - @ServiceId - @NonNull String getCachingId(); - - @ServiceSorter(reverse = true) - int getCachingRank(); - - @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener); - - @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener); - - @NonNull Collection getFileCachingProperties(); - - @NonNull Collection getWebCachingProperties(); - - int UNKNOWN_CACHING_RANK = -1; - - @StaticFactoryMethod - static @NonNull Caching noOp() { - return NoOpCaching.INSTANCE; - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java b/sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java similarity index 68% rename from sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java rename to sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java index 29a565539..5f2708fbb 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java @@ -14,15 +14,14 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.ext; +package sdmxdl.file; -import internal.sdmxdl.ext.NoOpCache; +import internal.sdmxdl.NoOpCache; import lombok.NonNull; import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.web.MonitorReports; import java.time.Clock; @@ -30,20 +29,16 @@ * @author Philippe Charles */ @NotThreadSafe -public interface Cache { +public interface FileCache { - @NonNull Clock getClock(); + @NonNull Clock getFileClock(); - @Nullable DataRepository getRepository(@NonNull String key); + @Nullable DataRepository getFileRepository(@NonNull String key); - void putRepository(@NonNull String key, @NonNull DataRepository value); - - @Nullable MonitorReports getMonitorReports(@NonNull String key); - - void putMonitorReports(@NonNull String key, @NonNull MonitorReports value); + void putFileRepository(@NonNull String key, @NonNull DataRepository value); @StaticFactoryMethod - static @NonNull Cache noOp() { + static @NonNull FileCache noOp() { return NoOpCache.INSTANCE; } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index a372ed0d6..43c23e400 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -16,7 +16,7 @@ */ package sdmxdl.file; -import internal.util.CachingLoader; +import internal.util.FileCachingLoader; import internal.util.FileReaderLoader; import lombok.AccessLevel; import lombok.NonNull; @@ -25,7 +25,7 @@ import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; @@ -45,7 +45,7 @@ public class SdmxFileManager extends SdmxManager { public static @NonNull SdmxFileManager ofServiceLoader() { return builder() .readers(FileReaderLoader.load()) - .caching(CachingLoader.load()) + .caching(FileCachingLoader.load()) .build(); } @@ -60,7 +60,7 @@ public class SdmxFileManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - Caching caching = Caching.noOp(); + FileCaching caching = FileCaching.noOp(); @lombok.NonNull @lombok.Builder.Default diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java new file mode 100644 index 000000000..b3dc4e779 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -0,0 +1,39 @@ +package sdmxdl.file.spi; + +import internal.sdmxdl.NoOpCaching; +import lombok.NonNull; +import nbbrd.design.StaticFactoryMethod; +import nbbrd.service.Quantifier; +import nbbrd.service.ServiceDefinition; +import nbbrd.service.ServiceId; +import nbbrd.service.ServiceSorter; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.file.FileCache; +import sdmxdl.file.SdmxFileSource; + +import java.util.Collection; + +@ServiceDefinition( + quantifier = Quantifier.SINGLE, + loaderName = "internal.util.FileCachingLoader", + fallback = NoOpCaching.class +) +public interface FileCaching { + + @ServiceId + @NonNull String getFileCachingId(); + + @ServiceSorter(reverse = true) + int getFileCachingRank(); + + @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener); + + @NonNull Collection getFileCachingProperties(); + + int UNKNOWN_FILE_CACHING_RANK = -1; + + @StaticFactoryMethod + static @NonNull FileCaching noOp() { + return NoOpCaching.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index 2b429c066..81efc30e6 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -3,9 +3,8 @@ import lombok.NonNull; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; -import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; @lombok.Value @@ -18,13 +17,13 @@ public class FileContext { @lombok.NonNull @lombok.Builder.Default - Caching caching = Caching.noOp(); + FileCaching caching = FileCaching.noOp(); @lombok.NonNull @lombok.Builder.Default SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; - public @NonNull Cache getCache(@NonNull SdmxFileSource source) { + public @NonNull FileCache getCache(@NonNull SdmxFileSource source) { return getCaching().getFileCache(source, getEventListener()); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 7e7df8013..f9279dde2 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -24,7 +24,7 @@ import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.*; import java.io.IOException; @@ -52,7 +52,7 @@ public class SdmxWebManager extends SdmxManager { .drivers(WebDriverLoader.load()) .monitorings(WebMonitoringLoader.load()) .networking(NetworkingLoader.load()) - .caching(CachingLoader.load()) + .caching(WebCachingLoader.load()) .authenticators(WebAuthenticatorLoader.load()) .build(); } @@ -80,7 +80,7 @@ public class SdmxWebManager extends SdmxManager { @lombok.NonNull @lombok.Builder.Default - Caching caching = Caching.noOp(); + WebCaching caching = WebCaching.noOp(); @lombok.NonNull @lombok.Builder.Default diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java b/sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java new file mode 100644 index 000000000..035ff4beb --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java @@ -0,0 +1,48 @@ +/* + * Copyright 2016 National Bank of Belgium + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved + * by the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * + * http://ec.europa.eu/idabc/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package sdmxdl.web; + +import internal.sdmxdl.NoOpCache; +import lombok.NonNull; +import nbbrd.design.NotThreadSafe; +import nbbrd.design.StaticFactoryMethod; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; + +import java.time.Clock; + +/** + * @author Philippe Charles + */ +@NotThreadSafe +public interface WebCache { + + @NonNull Clock getWebClock(); + + @Nullable DataRepository getWebRepository(@NonNull String key); + + void putWebRepository(@NonNull String key, @NonNull DataRepository value); + + @Nullable MonitorReports getWebMonitorReports(@NonNull String key); + + void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value); + + @StaticFactoryMethod + static @NonNull WebCache noOp() { + return NoOpCache.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java new file mode 100644 index 000000000..d0f2c303c --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -0,0 +1,39 @@ +package sdmxdl.web.spi; + +import internal.sdmxdl.NoOpCaching; +import lombok.NonNull; +import nbbrd.design.StaticFactoryMethod; +import nbbrd.service.Quantifier; +import nbbrd.service.ServiceDefinition; +import nbbrd.service.ServiceId; +import nbbrd.service.ServiceSorter; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; + +import java.util.Collection; + +@ServiceDefinition( + quantifier = Quantifier.SINGLE, + loaderName = "internal.util.WebCachingLoader", + fallback = NoOpCaching.class +) +public interface WebCaching { + + @ServiceId + @NonNull String getWebCachingId(); + + @ServiceSorter(reverse = true) + int getWebCachingRank(); + + @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener); + + @NonNull Collection getWebCachingProperties(); + + int UNKNOWN_WEB_CACHING_RANK = -1; + + @StaticFactoryMethod + static @NonNull WebCaching noOp() { + return NoOpCaching.INSTANCE; + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 2f4935cfa..bde6e8456 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -19,9 +19,8 @@ import lombok.NonNull; import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; @@ -40,7 +39,7 @@ public class WebContext { @lombok.NonNull @lombok.Builder.Default - Caching caching = Caching.noOp(); + WebCaching caching = WebCaching.noOp(); @lombok.NonNull @lombok.Builder.Default @@ -54,7 +53,7 @@ public class WebContext { @lombok.Builder.Default Networking networking = Networking.getDefault(); - public @NonNull Cache getCache(@NonNull SdmxWebSource source) { + public @NonNull WebCache getCache(@NonNull SdmxWebSource source) { return getCaching().getWebCache(source, getEventListener()); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java similarity index 56% rename from sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java rename to sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java index 9c87425ed..fa2eb1a82 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java @@ -1,12 +1,13 @@ package sdmxdl.ext; import org.junit.jupiter.api.Test; +import sdmxdl.web.WebCache; import tests.sdmxdl.ext.CacheAssert; -public class CacheTest { +public class WebCacheTest { @Test public void testNoOp() { - CacheAssert.assertCompliance(Cache.noOp()); + CacheAssert.assertCompliance(WebCache.noOp()); } } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index 830d39d48..d80bc9bbb 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; -import sdmxdl.ext.spi.Caching; +import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.api.SdmxManagerAssert; @@ -60,7 +60,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCaching()).isEqualTo(Caching.noOp()); + assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -73,7 +73,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCaching()).isEqualTo(Caching.noOp()); + assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); @@ -85,7 +85,7 @@ public void testFactories() { assertThat(o.getMonitorings()).isEmpty(); assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); - assertThat(o.getCaching()).isEqualTo(Caching.noOp()); + assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java index e0e8ee665..45c532791 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.ext; import org.assertj.core.api.SoftAssertions; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.web.MonitorReports; import tests.sdmxdl.api.TckUtil; @@ -14,76 +14,76 @@ @lombok.experimental.UtilityClass public class CacheAssert { - public void assertCompliance(Cache cache) { + public void assertCompliance(WebCache cache) { TckUtil.run(s -> assertCompliance(s, cache)); } - public void assertCompliance(SoftAssertions s, Cache cache) { + public void assertCompliance(SoftAssertions s, WebCache cache) { checkClock(s, cache); checkRepository(s, cache); checkMonitor(s, cache); } - private static void checkClock(SoftAssertions s, Cache cache) { - s.assertThat(cache.getClock()) - .isEqualTo(cache.getClock()) + private static void checkClock(SoftAssertions s, WebCache cache) { + s.assertThat(cache.getWebClock()) + .isEqualTo(cache.getWebClock()) .isNotNull(); } - private static void checkRepository(SoftAssertions s, Cache cache) { - s.assertThatThrownBy(() -> cache.putRepository(null, REPO)) + private static void checkRepository(SoftAssertions s, WebCache cache) { + s.assertThatThrownBy(() -> cache.putWebRepository(null, REPO)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.putRepository("key", null)) + s.assertThatThrownBy(() -> cache.putWebRepository("key", null)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.getRepository(null)) + s.assertThatThrownBy(() -> cache.getWebRepository(null)) .isInstanceOf(NullPointerException.class); - s.assertThat(cache.getRepository("key")) + s.assertThat(cache.getWebRepository("key")) .isNull(); - s.assertThatCode(() -> cache.putRepository("key", REPO.toBuilder().ttl(cache.getClock().instant(), Duration.ZERO).build())) + s.assertThatCode(() -> cache.putWebRepository("key", REPO.toBuilder().ttl(cache.getWebClock().instant(), Duration.ZERO).build())) .doesNotThrowAnyException(); - s.assertThat(cache.getRepository("key")) + s.assertThat(cache.getWebRepository("key")) .isNull(); - s.assertThatCode(() -> cache.putRepository("key", REPO)) + s.assertThatCode(() -> cache.putWebRepository("key", REPO)) .doesNotThrowAnyException(); - s.assertThat(cache.getRepository("key")) + s.assertThat(cache.getWebRepository("key")) .satisfiesAnyOf( result -> assertThat(result).isNull(), result -> assertThat(result).isEqualTo(REPO) ); } - private static void checkMonitor(SoftAssertions s, Cache cache) { + private static void checkMonitor(SoftAssertions s, WebCache cache) { MonitorReports report = MonitorReports.builder().uriScheme("testscheme").build(); - s.assertThatThrownBy(() -> cache.putMonitorReports(null, report)) + s.assertThatThrownBy(() -> cache.putWebMonitorReports(null, report)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.putMonitorReports("key", null)) + s.assertThatThrownBy(() -> cache.putWebMonitorReports("key", null)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.getMonitorReports(null)) + s.assertThatThrownBy(() -> cache.getWebMonitorReports(null)) .isInstanceOf(NullPointerException.class); - s.assertThat(cache.getMonitorReports("key")) + s.assertThat(cache.getWebMonitorReports("key")) .isNull(); - s.assertThatCode(() -> cache.putMonitorReports("key", report.toBuilder().ttl(cache.getClock().instant(), Duration.ZERO).build())) + s.assertThatCode(() -> cache.putWebMonitorReports("key", report.toBuilder().ttl(cache.getWebClock().instant(), Duration.ZERO).build())) .doesNotThrowAnyException(); - s.assertThat(cache.getMonitorReports("key")) + s.assertThat(cache.getWebMonitorReports("key")) .isNull(); - s.assertThatCode(() -> cache.putMonitorReports("key", report)) + s.assertThatCode(() -> cache.putWebMonitorReports("key", report)) .doesNotThrowAnyException(); - s.assertThat(cache.getMonitorReports("key")) + s.assertThat(cache.getWebMonitorReports("key")) .satisfiesAnyOf( result -> assertThat(result).isNull(), result -> assertThat(result).isEqualTo(report) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 5386bd05b..52df4064c 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -23,12 +23,12 @@ import lombok.NonNull; import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; -import sdmxdl.ext.spi.Caching; +import sdmxdl.web.spi.WebCaching; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DiskCache; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.MemCachingSupport; -import sdmxdl.provider.ext.DualCachingSupport; +import sdmxdl.provider.ext.DualWebCachingSupport; import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -114,16 +114,16 @@ private List getAuthenticators() { private static final String CACHE_ANCHOR = "CCH"; - private static Caching getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { + private static WebCaching getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { if (cacheOptions.isNoCache()) { - return Caching.noOp(); + return WebCaching.noOp(); } Clock clock = Clock.systemDefaultZone(); Path root = cacheOptions.getCacheFolder() != null ? cacheOptions.getCacheFolder().toPath() : DiskCache.SDMXDL_TMP_DIR; reportConfig(verboseOptions, root); - return DualCachingSupport + return DualWebCachingSupport .builder() .id("DRY") .first(MemCachingSupport diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index feeec720e..18784047a 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -24,8 +24,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; +import sdmxdl.file.FileCache; import sdmxdl.web.MonitorReports; +import sdmxdl.web.WebCache; import java.io.IOException; import java.nio.file.Files; @@ -43,7 +44,7 @@ */ @lombok.Getter @lombok.Builder(toBuilder = true) -public final class DiskCache implements Cache { +public final class DiskCache implements FileCache, WebCache { @lombok.NonNull @lombok.Builder.Default @@ -82,22 +83,42 @@ public final class DiskCache implements Cache { private final Clock clock = Clock.systemDefaultZone(); @Override - public @Nullable DataRepository getRepository(@NonNull String key) { + public @NonNull Clock getFileClock() { + return clock; + } + + @Override + public @NonNull Clock getWebClock() { + return clock; + } + + @Override + public @Nullable DataRepository getFileRepository(@NonNull String key) { + return read(repositoryFormat, this::isValid, key, FileType.REPOSITORY); + } + + @Override + public @Nullable DataRepository getWebRepository(@NonNull String key) { return read(repositoryFormat, this::isValid, key, FileType.REPOSITORY); } @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { + public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { + write(repositoryFormat, key, FileType.REPOSITORY, value); + } + + @Override + public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { write(repositoryFormat, key, FileType.REPOSITORY, value); } @Override - public @Nullable MonitorReports getMonitorReports(@NonNull String key) { + public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { return read(monitorFormat, this::isValid, key, FileType.MONITOR); } @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { write(monitorFormat, key, FileType.MONITOR, value); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index b1ab49e8c..f128acb70 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -2,14 +2,16 @@ import lombok.NonNull; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceBiConsumer; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.nio.file.Path; @@ -18,13 +20,13 @@ import java.util.Collections; @lombok.Builder(toBuilder = true) -public final class DiskCachingSupport implements Caching { +public final class DiskCachingSupport implements FileCaching, WebCaching { @lombok.NonNull private final String id; @lombok.Builder.Default - private final int rank = UNKNOWN_CACHING_RANK; + private final int rank = UNKNOWN_WEB_CACHING_RANK; @lombok.NonNull @lombok.Builder.Default @@ -63,27 +65,37 @@ private DiskCache.Builder newFileCacheBuilder() { } @Override - public @NonNull String getCachingId() { + public @NonNull String getFileCachingId() { return id; } @Override - public int getCachingRank() { + public @NonNull String getWebCachingId() { + return id; + } + + @Override + public int getFileCachingRank() { + return rank; + } + + @Override + public int getWebCachingRank() { return rank; } @Override - public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener) { return newFileCacheBuilder() - .onRead((key, event) -> eventListener.accept(source, event.name() + " " + key)) + .onRead((key, event) -> listener.accept(source, event.name() + " " + key)) .onError(onFileError.asBiConsumer(source)) .build(); } @Override - public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { return newFileCacheBuilder() - .onRead((key, event) -> eventListener.accept(source, event.name() + " " + key)) + .onRead((key, event) -> listener.accept(source, event.name() + " " + key)) .onError(onWebError.asBiConsumer(source)) .build(); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java index 2737c743f..8f01c16b2 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java @@ -20,8 +20,9 @@ import nbbrd.design.VisibleForTesting; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; +import sdmxdl.file.FileCache; import sdmxdl.web.MonitorReports; +import sdmxdl.web.WebCache; import java.time.Clock; import java.util.HashMap; @@ -33,7 +34,7 @@ */ @lombok.Getter @lombok.Builder(toBuilder = true) -public final class MemCache implements Cache { +public final class MemCache implements FileCache, WebCache { @lombok.NonNull @lombok.Builder.Default @@ -48,22 +49,42 @@ public final class MemCache implements Cache { private final Clock clock = Clock.systemDefaultZone(); @Override - public @Nullable DataRepository getRepository(@NonNull String key) { + public @NonNull Clock getFileClock() { + return clock; + } + + @Override + public @NonNull Clock getWebClock() { + return clock; + } + + @Override + public @Nullable DataRepository getFileRepository(@NonNull String key) { + return getRepository(repositories, clock, key); + } + + @Override + public @Nullable DataRepository getWebRepository(@NonNull String key) { return getRepository(repositories, clock, key); } @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { + public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { + put(repositories, key, value); + } + + @Override + public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { put(repositories, key, value); } @Override - public @Nullable MonitorReports getMonitorReports(@NonNull String key) { - return getWebMonitorReports(webMonitors, clock, key); + public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { + return getMonitorReports(webMonitors, clock, key); } @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { put(webMonitors, key, value); } @@ -73,7 +94,7 @@ static DataRepository getRepository(@NonNull Map map, @N } @VisibleForTesting - static MonitorReports getWebMonitorReports(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { + static MonitorReports getMonitorReports(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { return get(reports -> !reports.isExpired(clock), map, key); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index eb39b7a36..e6f6c032a 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -2,12 +2,14 @@ import lombok.NonNull; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCaching; import java.time.Clock; import java.util.Collection; @@ -18,13 +20,13 @@ import java.util.function.Supplier; @lombok.Builder(toBuilder = true) -public final class MemCachingSupport implements Caching { +public final class MemCachingSupport implements FileCaching, WebCaching { @lombok.NonNull private final String id; @lombok.Builder.Default - private final int rank = UNKNOWN_CACHING_RANK; + private final int rank = UNKNOWN_WEB_CACHING_RANK; @lombok.NonNull @lombok.Builder.Default @@ -39,22 +41,32 @@ public final class MemCachingSupport implements Caching { private final Clock clock = Clock.systemDefaultZone(); @Override - public @NonNull String getCachingId() { + public @NonNull String getFileCachingId() { return id; } @Override - public int getCachingRank() { + public @NonNull String getWebCachingId() { + return id; + } + + @Override + public int getFileCachingRank() { + return rank; + } + + @Override + public int getWebCachingRank() { return rank; } @Override - public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { return getCache(); } @Override - public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { return getCache(); } @@ -68,7 +80,7 @@ public int getCachingRank() { return Collections.emptyList(); } - private Cache getCache() { + private MemCache getCache() { return MemCache .builder() .repositories(repositories.get()) diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java index 129c81144..3eacd55e2 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java @@ -66,7 +66,7 @@ public void testGetSet(@TempDir Path temp) throws IOException { assertThat(cache.getRoot()) .doesNotExist(); - assertThat(cache.getRepository("KEY1")) + assertThat(cache.getWebRepository("KEY1")) .as("Empty directory should return null") .isNull(); @@ -75,22 +75,22 @@ public void testGetSet(@TempDir Path temp) throws IOException { .name("r1") .ttl(clock.instant(), Duration.ofMillis(10)) .build(); - cache.putRepository("KEY1", r1); + cache.putWebRepository("KEY1", r1); assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) .exists() .hasContent("r1"); - assertThat(cache.getRepository("KEY2")) + assertThat(cache.getWebRepository("KEY2")) .as("Non-existing key should return null") .isNull(); clock.plus(9); - assertThat(cache.getRepository("KEY1")) + assertThat(cache.getWebRepository("KEY1")) .as("Non-expired key should return value") .isEqualTo(r1); clock.plus(1); - assertThat(cache.getRepository("KEY1")) + assertThat(cache.getWebRepository("KEY1")) .as("Expired key should return null") .isNull(); assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) @@ -106,12 +106,12 @@ public void testGetSet(@TempDir Path temp) throws IOException { .name("r2") .ttl(clock.instant(), Duration.ofMillis(10)) .build(); - cache.putRepository("KEY1", r1b); - cache.putRepository("KEY1", r2); + cache.putWebRepository("KEY1", r1b); + cache.putWebRepository("KEY1", r2); assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) .exists() .hasContent("r2"); - assertThat(cache.getRepository("KEY1")) + assertThat(cache.getWebRepository("KEY1")) .as("Updated key should return updated value") .isEqualTo(r2); diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index c70d45ca5..d3261e86e 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -1,4 +1,5 @@ -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; +import sdmxdl.web.spi.WebCaching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.kryo { @@ -12,6 +13,7 @@ exports sdmxdl.format.kryo; - provides Caching with sdmxdl.format.kryo.KryoProvider; + provides FileCaching with sdmxdl.format.kryo.KryoProvider; + provides WebCaching with sdmxdl.format.kryo.KryoProvider; provides Persistence with sdmxdl.format.kryo.KryoProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index 70bcf5c2c..5cee0c08e 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -3,15 +3,17 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; +import sdmxdl.web.spi.WebCaching; @ServiceProvider(Persistence.class) -@ServiceProvider(Caching.class) -public final class KryoProvider implements Persistence, Caching { +@ServiceProvider(FileCaching.class) +@ServiceProvider(WebCaching.class) +public final class KryoProvider implements Persistence, FileCaching, WebCaching { private static final String ID = "KRYO"; diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index 413fbc080..dfecc35b2 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -1,4 +1,5 @@ -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; +import sdmxdl.web.spi.WebCaching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.protobuf { @@ -14,7 +15,10 @@ exports sdmxdl.format.protobuf; exports sdmxdl.format.protobuf.web; - provides Caching with + provides FileCaching with + sdmxdl.format.protobuf.JsonProvider, + sdmxdl.format.protobuf.ProtobufProvider; + provides WebCaching with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; provides Persistence with diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index f571f9f02..9768668e7 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -2,10 +2,11 @@ import com.google.protobuf.util.JsonFormat; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; +import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.io.Reader; @@ -15,8 +16,9 @@ import static nbbrd.io.text.TextParser.onParsingReader; @ServiceProvider(Persistence.class) -@ServiceProvider(Caching.class) -public final class JsonProvider implements Persistence, Caching { +@ServiceProvider(FileCaching.class) +@ServiceProvider(WebCaching.class) +public final class JsonProvider implements Persistence, FileCaching, WebCaching { private final JsonFormat.Parser parser = JsonFormat.parser(); diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index a3a4808fa..97275652a 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -2,11 +2,12 @@ import com.google.protobuf.MessageLite; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.spi.Caching; +import sdmxdl.file.spi.FileCaching; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.protobuf.web.MonitorReports; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; +import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.io.OutputStream; @@ -15,8 +16,9 @@ import static nbbrd.io.FileParser.onParsingStream; @ServiceProvider(Persistence.class) -@ServiceProvider(Caching.class) -public final class ProtobufProvider implements Persistence, Caching { +@ServiceProvider(FileCaching.class) +@ServiceProvider(WebCaching.class) +public final class ProtobufProvider implements Persistence, FileCaching, WebCaching { @lombok.experimental.Delegate private final PersistenceSupport persistence = PersistenceSupport diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java new file mode 100644 index 000000000..d5c8bbd0d --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java @@ -0,0 +1,101 @@ +/* + * Copyright 2017 National Bank of Belgium + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved + * by the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * + * http://ec.europa.eu/idabc/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package sdmxdl.provider; + +import lombok.AccessLevel; +import lombok.NonNull; +import nbbrd.io.function.IOSupplier; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; +import sdmxdl.file.FileCache; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.Duration; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @param + * @author Philippe Charles + */ +@lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@lombok.EqualsAndHashCode +public final class FileTypedId { + + @NonNull + public static FileTypedId of( + @NonNull URI content, + @NonNull Function loader, + @NonNull Function storer) { + return new FileTypedId<>(content, loader, storer); + } + + @NonNull + @lombok.Getter + private final URI content; + + @NonNull + private final Function loader; + + @NonNull + private final Function storer; + + @NonNull + public FileTypedId with(@NonNull Object o) { + return new FileTypedId<>(resolveURI(content, o.toString()), loader, storer); + } + + @Nullable + public T peek(@NonNull FileCache cache) { + DataRepository repo = cache.getFileRepository(content.toString()); + return repo != null ? loader.apply(repo) : null; + } + + @NonNull + public T load(@NonNull FileCache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { + return load(cache, factory, ttl, o -> true); + } + + @NonNull + public T load(@NonNull FileCache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { + T result = peek(cache); + if (result == null || !validator.test(result)) { + result = factory.getWithIO(); + cache.putFileRepository(content.toString(), storer.apply(result).toBuilder().ttl(cache.getFileClock().instant(), ttl.apply(result)).build()); + } + return result; + } + + public static URI resolveURI(URI base, String... items) { + return URI.create(Stream.of(items) + .map(item -> { + try { + return URLEncoder.encode(item, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException ex) { + throw new UncheckedIOException(ex); + } + }) + .collect(Collectors.joining("/", base + "/", ""))); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java similarity index 74% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java index 1cd209901..650177c79 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java @@ -21,7 +21,7 @@ import nbbrd.io.function.IOSupplier; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import java.io.IOException; import java.io.UncheckedIOException; @@ -41,14 +41,14 @@ */ @lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE) @lombok.EqualsAndHashCode -public final class TypedId { +public final class WebTypedId { @NonNull - public static TypedId of( + public static WebTypedId of( @NonNull URI content, @NonNull Function loader, @NonNull Function storer) { - return new TypedId<>(content, loader, storer); + return new WebTypedId<>(content, loader, storer); } @lombok.NonNull @@ -62,27 +62,27 @@ public static TypedId of( private final Function storer; @NonNull - public TypedId with(@NonNull Object o) { - return new TypedId<>(resolveURI(content, o.toString()), loader, storer); + public WebTypedId with(@NonNull Object o) { + return new WebTypedId<>(resolveURI(content, o.toString()), loader, storer); } @Nullable - public T peek(@NonNull Cache cache) { - DataRepository repo = cache.getRepository(content.toString()); + public T peek(@NonNull WebCache cache) { + DataRepository repo = cache.getWebRepository(content.toString()); return repo != null ? loader.apply(repo) : null; } @NonNull - public T load(@NonNull Cache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { + public T load(@NonNull WebCache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { return load(cache, factory, ttl, o -> true); } @NonNull - public T load(@NonNull Cache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { + public T load(@NonNull WebCache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { T result = peek(cache); if (result == null || !validator.test(result)) { result = factory.getWithIO(); - cache.putRepository(content.toString(), storer.apply(result).toBuilder().ttl(cache.getClock().instant(), ttl.apply(result)).build()); + cache.putWebRepository(content.toString(), storer.apply(result).toBuilder().ttl(cache.getWebClock().instant(), ttl.apply(result)).build()); } return result; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java deleted file mode 100644 index bf4dc93df..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java +++ /dev/null @@ -1,58 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; -import sdmxdl.web.MonitorReports; - -import java.time.Clock; - -@lombok.AllArgsConstructor -public final class DualCache implements Cache { - - private final @NonNull Cache first; - private final @NonNull Cache second; - private final @NonNull Clock clock; - - @Override - public @NonNull Clock getClock() { - return clock; - } - - @Override - public @Nullable DataRepository getRepository(@NonNull String key) { - DataRepository result = first.getRepository(key); - if (result == null) { - result = second.getRepository(key); - if (result != null) { - first.putRepository(key, result); - } - } - return result; - } - - @Override - public void putRepository(@NonNull String key, @NonNull DataRepository value) { - first.putRepository(key, value); - second.putRepository(key, value); - } - - @Override - public @Nullable MonitorReports getMonitorReports(@NonNull String key) { - MonitorReports result = first.getMonitorReports(key); - if (result == null) { - result = second.getMonitorReports(key); - if (result != null) { - first.putMonitorReports(key, result); - } - } - return result; - } - - @Override - public void putMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - first.putMonitorReports(key, value); - second.putMonitorReports(key, value); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java deleted file mode 100644 index 254d316e9..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCachingSupport.java +++ /dev/null @@ -1,68 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import sdmxdl.ext.Cache; -import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; - -import java.time.Clock; -import java.util.Collection; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; - -@lombok.Builder(toBuilder = true) -public final class DualCachingSupport implements Caching { - - @lombok.NonNull - private final String id; - - @lombok.Builder.Default - private final int rank = UNKNOWN_CACHING_RANK; - - @lombok.NonNull - @lombok.Builder.Default - private final Caching first = Caching.noOp(); - - @lombok.NonNull - @lombok.Builder.Default - private final Caching second = Caching.noOp(); - - @lombok.NonNull - @lombok.Builder.Default - private final Clock clock = Clock.systemDefaultZone(); - - @Override - public @NonNull String getCachingId() { - return id; - } - - @Override - public int getCachingRank() { - return rank; - } - - @Override - public @NonNull Cache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { - Cache main = first.getFileCache(source, eventListener); - return new DualCache(main, second.getFileCache(source, eventListener), clock); - } - - @Override - public @NonNull Cache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer eventListener) { - Cache main = first.getWebCache(source, eventListener); - return new DualCache(main, second.getWebCache(source, eventListener), clock); - } - - @Override - public @NonNull Collection getFileCachingProperties() { - return Stream.concat(first.getFileCachingProperties().stream(), second.getFileCachingProperties().stream()).collect(toList()); - } - - @Override - public @NonNull Collection getWebCachingProperties() { - return Stream.concat(first.getWebCachingProperties().stream(), second.getWebCachingProperties().stream()).collect(toList()); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java new file mode 100644 index 000000000..0c0b40aa5 --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java @@ -0,0 +1,58 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; +import sdmxdl.web.MonitorReports; +import sdmxdl.web.WebCache; + +import java.time.Clock; + +@lombok.AllArgsConstructor +public final class DualWebCache implements WebCache { + + private final @NonNull WebCache first; + private final @NonNull WebCache second; + private final @NonNull Clock clock; + + @Override + public @NonNull Clock getWebClock() { + return clock; + } + + @Override + public @Nullable DataRepository getWebRepository(@NonNull String key) { + DataRepository result = first.getWebRepository(key); + if (result == null) { + result = second.getWebRepository(key); + if (result != null) { + first.putWebRepository(key, result); + } + } + return result; + } + + @Override + public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { + first.putWebRepository(key, value); + second.putWebRepository(key, value); + } + + @Override + public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { + MonitorReports result = first.getWebMonitorReports(key); + if (result == null) { + result = second.getWebMonitorReports(key); + if (result != null) { + first.putWebMonitorReports(key, result); + } + } + return result; + } + + @Override + public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + first.putWebMonitorReports(key, value); + second.putWebMonitorReports(key, value); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java new file mode 100644 index 000000000..a93ce8f1a --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java @@ -0,0 +1,56 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCaching; + +import java.time.Clock; +import java.util.Collection; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; + +@lombok.Builder(toBuilder = true) +public final class DualWebCachingSupport implements WebCaching { + + @lombok.NonNull + private final String id; + + @lombok.Builder.Default + private final int rank = UNKNOWN_WEB_CACHING_RANK; + + @lombok.NonNull + @lombok.Builder.Default + private final WebCaching first = WebCaching.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final WebCaching second = WebCaching.noOp(); + + @lombok.NonNull + @lombok.Builder.Default + private final Clock clock = Clock.systemDefaultZone(); + + @Override + public @NonNull String getWebCachingId() { + return id; + } + + @Override + public int getWebCachingRank() { + return rank; + } + + @Override + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { + WebCache main = first.getWebCache(source, listener); + return new DualWebCache(main, second.getWebCache(source, listener), clock); + } + + @Override + public @NonNull Collection getWebCachingProperties() { + return Stream.concat(first.getWebCachingProperties().stream(), second.getWebCachingProperties().stream()).collect(toList()); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java index f934572f8..705cb8023 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java @@ -19,11 +19,12 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import sdmxdl.*; -import sdmxdl.ext.Cache; +import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.DataRef; +import sdmxdl.provider.FileTypedId; import sdmxdl.provider.Marker; -import sdmxdl.provider.TypedId; +import sdmxdl.provider.WebTypedId; import java.io.IOException; import java.net.URI; @@ -39,13 +40,13 @@ public final class CachedFileClient implements FileClient { public static @NonNull CachedFileClient of( - @NonNull FileClient client, @NonNull Cache cache, + @NonNull FileClient client, @NonNull FileCache cache, @NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) { return new CachedFileClient(client, cache, getBase(source, languages)); } private static URI getBase(SdmxFileSource source, LanguagePriorityList languages) { - return TypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); + return WebTypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); } // TODO: replace ttl with file last modification time @@ -55,26 +56,26 @@ private static URI getBase(SdmxFileSource source, LanguagePriorityList languages private final FileClient delegate; @lombok.NonNull - private final Cache cache; + private final FileCache cache; @lombok.NonNull private final URI base; @lombok.Getter(lazy = true) - private final TypedId idOfDecode = initIdOfDecode(base); + private final FileTypedId idOfDecode = initIdOfDecode(base); @lombok.Getter(lazy = true) - private final TypedId idOfLoadData = initIdOfLoadData(base); + private final FileTypedId idOfLoadData = initIdOfLoadData(base); - private static TypedId initIdOfDecode(URI base) { - return TypedId.of(base, + private static FileTypedId initIdOfDecode(URI base) { + return FileTypedId.of(base, repo -> FileInfo.of(MediaType.parse(repo.getName()), repo.getStructures().stream().findFirst().orElse(null)), info -> DataRepository.builder().name(info.getDataType().toString()).structure(info.getStructure()).build() ).with("decode"); } - private static TypedId initIdOfLoadData(URI base) { - return TypedId.of(base, + private static FileTypedId initIdOfLoadData(URI base) { + return FileTypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), data -> DataRepository.builder().dataSet(data).build() ).with("loadData"); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java index f1bc75254..666797b82 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java @@ -19,10 +19,10 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; import sdmxdl.*; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; -import sdmxdl.provider.TypedId; +import sdmxdl.provider.WebTypedId; import sdmxdl.web.SdmxWebSource; import java.io.IOException; @@ -41,21 +41,21 @@ final class CachedRestClient implements RestClient { static @NonNull RestClient of( - @NonNull RestClient client, @NonNull Cache cache, long ttlInMillis, + @NonNull RestClient client, @NonNull WebCache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { return new CachedRestClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } @VisibleForTesting static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { - return TypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); + return WebTypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); } @lombok.NonNull private final RestClient delegate; @lombok.NonNull - private final Cache cache; + private final WebCache cache; @lombok.NonNull private final URI base; @@ -64,50 +64,50 @@ static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfFlows = initIdOfFlows(base); + private final WebTypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) - private final TypedId idOfFlow = initIdOfFlow(base); + private final WebTypedId idOfFlow = initIdOfFlow(base); @lombok.Getter(lazy = true) - private final TypedId idOfStruct = initIdOfStruct(base); + private final WebTypedId idOfStruct = initIdOfStruct(base); @lombok.Getter(lazy = true) - private final TypedId idOfSeriesKeysOnly = initIdOfSeriesKeysOnly(base); + private final WebTypedId idOfSeriesKeysOnly = initIdOfSeriesKeysOnly(base); @lombok.Getter(lazy = true) - private final TypedId idOfNoData = initIdOfNoData(base); + private final WebTypedId idOfNoData = initIdOfNoData(base); - private static TypedId> initIdOfFlows(URI base) { - return TypedId.of(base, + private static WebTypedId> initIdOfFlows(URI base) { + return WebTypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("flows"); } - private static TypedId initIdOfFlow(URI base) { - return TypedId.of(base, + private static WebTypedId initIdOfFlow(URI base) { + return WebTypedId.of(base, repo -> repo.getFlows().stream().findFirst().orElse(null), flow -> DataRepository.builder().flow(flow).build() ).with("flow"); } - private static TypedId initIdOfStruct(URI base) { - return TypedId.of(base, + private static WebTypedId initIdOfStruct(URI base) { + return WebTypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() ).with("struct"); } - private static TypedId initIdOfSeriesKeysOnly(URI base) { - return TypedId.of(base, + private static WebTypedId initIdOfSeriesKeysOnly(URI base) { + return WebTypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), dataSet -> DataRepository.builder().dataSet(dataSet).build() ).with("seriesKeysOnly"); } - private static TypedId initIdOfNoData(URI base) { - return TypedId.of(base, + private static WebTypedId initIdOfNoData(URI base) { + return WebTypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), dataSet -> DataRepository.builder().dataSet(dataSet).build() ).with("noData"); @@ -165,17 +165,17 @@ private List loadDataflowsWithCache() throws IOException { } private DataStructure loadDataStructureWithCache(DataStructureRef ref) throws IOException { - TypedId id = getIdOfStruct().with(ref); + WebTypedId id = getIdOfStruct().with(ref); return id.load(cache, () -> delegate.getStructure(ref), this::getTtl); } private DataSet loadSeriesKeysOnlyWithCache(DataRef ref, DataStructure dsd) throws IOException { - TypedId id = getIdOfSeriesKeysOnly().with(ref.getFlowRef()); + WebTypedId id = getIdOfSeriesKeysOnly().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } private DataSet loadNoDataWithCache(DataRef ref, DataStructure dsd) throws IOException { - TypedId id = getIdOfNoData().with(ref.getFlowRef()); + WebTypedId id = getIdOfNoData().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } @@ -195,7 +195,7 @@ private Dataflow peekDataflowFromCache(DataflowRef ref) { } private Dataflow loadDataflowWithCache(DataflowRef ref) throws IOException { - TypedId id = getIdOfFlow().with(ref); + WebTypedId id = getIdOfFlow().with(ref); return id.load(cache, () -> delegate.getFlow(ref), this::getTtl); } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java similarity index 89% rename from sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java rename to sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java index da985bfb1..7bbcdf6c6 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java @@ -3,7 +3,7 @@ import nbbrd.io.function.IOSupplier; import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.format.MemCache; import tests.sdmxdl.ext.FakeClock; @@ -14,11 +14,11 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TypedIdTest { +public class WebTypedIdTest { @Test public void test() throws IOException { - TypedId id = TypedId.of( + WebTypedId id = WebTypedId.of( URI.create("cache://key"), repo -> Integer.parseInt(repo.getName()), data -> DataRepository.builder().name(Integer.toString(data)).build() @@ -26,7 +26,7 @@ public void test() throws IOException { FakeClock clock = new FakeClock(); - Cache cache = MemCache.builder().clock(clock).build(); + WebCache cache = MemCache.builder().clock(clock).build(); IOSupplier factory = new AtomicInteger()::getAndIncrement; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java index 8d010091c..72bdb40ec 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; import sdmxdl.provider.DataRef; -import sdmxdl.provider.TypedId; +import sdmxdl.provider.WebTypedId; import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.api.RepoSamples; @@ -54,11 +54,11 @@ public class CachedRestClientTest { private final URI base = URI.create("cache:rest"); private final Duration ttl = Duration.ofMillis(100); - private final String flowsId = TypedId.resolveURI(base, "flows").toString(); - private final String flowId = TypedId.resolveURI(base, "flow", FLOW_REF.toString()).toString(); - private final String structId = TypedId.resolveURI(base, "struct", STRUCT_REF.toString()).toString(); - private final String seriesKeysOnlyId = TypedId.resolveURI(base, "seriesKeysOnly", FLOW_REF.toString()).toString(); - private final String noDataId = TypedId.resolveURI(base, "noData", FLOW_REF.toString()).toString(); + private final String flowsId = WebTypedId.resolveURI(base, "flows").toString(); + private final String flowId = WebTypedId.resolveURI(base, "flow", FLOW_REF.toString()).toString(); + private final String structId = WebTypedId.resolveURI(base, "struct", STRUCT_REF.toString()).toString(); + private final String seriesKeysOnlyId = WebTypedId.resolveURI(base, "seriesKeysOnly", FLOW_REF.toString()).toString(); + private final String noDataId = WebTypedId.resolveURI(base, "noData", FLOW_REF.toString()).toString(); private CachedRestClient getClient(CachingAssert.Context ctx) { RestClient original = XRepoRestClient.of(RepoSamples.REPO); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 4db2db98f..4b67d7ca6 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -7,22 +7,26 @@ import nbbrd.io.text.Parser; import nbbrd.io.text.Property; import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.Connection; -import sdmxdl.ext.Cache; +import sdmxdl.DataRepository; import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.ext.spi.Caching; +import sdmxdl.web.spi.WebCaching; +import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebDriver; import java.io.File; import java.io.IOException; import java.net.URI; +import java.time.Clock; import java.util.Collection; -import java.util.Collections; @ServiceProvider public final class FileDriver implements WebDriver { @@ -49,52 +53,59 @@ public final class FileDriver implements WebDriver { .toBuilder() .languages(context.getLanguages()) .eventListener((fileSource, message) -> context.getEventListener().accept(source, message)) - .caching(new FileToWebCacheFactory(source, context.getCaching(), context.getEventListener())) + .caching(new FileCachingAdapter(source, context.getCaching(), context.getEventListener())) .build() .getConnection(toFileSource(source)); } @lombok.AllArgsConstructor - private static final class FileToWebCacheFactory implements Caching { + private static final class FileCachingAdapter implements FileCaching { private final @NonNull SdmxWebSource webSource; - private final @NonNull Caching webCacheFactory; + private final @NonNull WebCaching delegate; - private final @NonNull SdmxSourceConsumer eventListener; + private final @NonNull SdmxSourceConsumer webListener; - private Cache getCache() { - return webCacheFactory.getWebCache(webSource, eventListener); + @Override + public @NonNull String getFileCachingId() { + return delegate.getWebCachingId(); } @Override - public @NonNull String getCachingId() { - return webCacheFactory.getCachingId(); + public int getFileCachingRank() { + return delegate.getWebCachingRank(); } @Override - public int getCachingRank() { - return webCacheFactory.getCachingRank(); + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { + return new FileCacheAdapter(delegate.getWebCache(webSource, webListener)); } @Override - public @NonNull Cache getFileCache(@NonNull SdmxFileSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { - return getCache(); + public @NonNull Collection getFileCachingProperties() { + return delegate.getWebCachingProperties(); } + } + + @lombok.AllArgsConstructor + private static final class FileCacheAdapter implements FileCache { + + private final @NonNull WebCache delegate; @Override - public @NonNull Cache getWebCache(@NonNull SdmxWebSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { - return getCache(); + public @NonNull Clock getFileClock() { + return delegate.getWebClock(); } @Override - public @NonNull Collection getFileCachingProperties() { - return Collections.emptyList(); + public @Nullable DataRepository getFileRepository(@NonNull String key) { + return delegate.getWebRepository(key); } @Override - public @NonNull Collection getWebCachingProperties() { - return webCacheFactory.getWebCachingProperties(); + public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { + delegate.putWebRepository(key, value); } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index 1cd608d5f..9843d9940 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -19,7 +19,7 @@ import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.*; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.time.ObservationalTimePeriod; @@ -27,7 +27,7 @@ import sdmxdl.provider.ConnectionSupport; import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; -import sdmxdl.provider.TypedId; +import sdmxdl.provider.WebTypedId; import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -249,20 +249,20 @@ private FileParser getDataParser(DataStructure dsd, MediaType ignore private static final class CachedPxWebClient implements PxWebClient { static @NonNull CachedPxWebClient of( - @NonNull PxWebClient client, @NonNull Cache cache, long ttlInMillis, + @NonNull PxWebClient client, @NonNull WebCache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { return new CachedPxWebClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { - return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); + return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @lombok.NonNull private final PxWebClient delegate; @lombok.NonNull - private final Cache cache; + private final WebCache cache; @lombok.NonNull private final URI base; @@ -271,20 +271,20 @@ private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfTables = initIdOfTables(base); + private final WebTypedId> idOfTables = initIdOfTables(base); @lombok.Getter(lazy = true) - private final TypedId idOfMeta = initIdOfMeta(base); + private final WebTypedId idOfMeta = initIdOfMeta(base); - private static TypedId> initIdOfTables(URI base) { - return TypedId.of(base, + private static WebTypedId> initIdOfTables(URI base) { + return WebTypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("tables"); } - private static TypedId initIdOfMeta(URI base) { - return TypedId.of(base, + private static WebTypedId initIdOfMeta(URI base) { + return WebTypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() ).with("meta"); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index 09de61ce6..eae09c75c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -14,7 +14,7 @@ import nbbrd.io.net.MediaType; import nbbrd.service.ServiceProvider; import sdmxdl.*; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; @@ -263,20 +263,20 @@ private File getFullTableDownloadSDMX(FullTableDownloadSDMX ref) throws IOExcept static class CachedStatCanClient implements StatCanClient { static @NonNull CachedStatCanClient of( - @NonNull StatCanClient client, @NonNull Cache cache, long ttlInMillis, + @NonNull StatCanClient client, @NonNull WebCache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { return new CachedStatCanClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { - return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); + return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @lombok.NonNull private final StatCanClient delegate; @lombok.NonNull - private final Cache cache; + private final WebCache cache; @lombok.NonNull private final URI base; @@ -285,20 +285,20 @@ private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfFlows = initIdOfFlows(base); + private final WebTypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) - private final TypedId idOfRepo = initIdOfRepo(base); + private final WebTypedId idOfRepo = initIdOfRepo(base); - private static TypedId> initIdOfFlows(URI base) { - return TypedId.of(base, + private static WebTypedId> initIdOfFlows(URI base) { + return WebTypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("flows"); } - private static TypedId initIdOfRepo(URI base) { - return TypedId.of(base, identity(), identity()) + private static WebTypedId initIdOfRepo(URI base) { + return WebTypedId.of(base, identity(), identity()) .with("structAndData"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java index e433111ec..de649fa93 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java @@ -6,7 +6,7 @@ import nbbrd.design.VisibleForTesting; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; -import sdmxdl.ext.Cache; +import sdmxdl.web.WebCache; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; @@ -40,14 +40,14 @@ public final class UpptimeMonitoring implements WebMonitoring { UpptimeId id = UpptimeId.parse(source.getMonitor()); - Cache cache = context.getCache(source); + WebCache cache = context.getCache(source); String key = id.toSummaryURL().toString(); - MonitorReports reports = cache.getMonitorReports(key); + MonitorReports reports = cache.getWebMonitorReports(key); if (reports == null) { - reports = createReports(RiHttpUtils.newClient(source, context), id, cache.getClock()); - cache.putMonitorReports(key, reports); + reports = createReports(RiHttpUtils.newClient(source, context), id, cache.getWebClock()); + cache.putWebMonitorReports(key, reports); } return reports.getReports() From 9246893453dc98e5cbca7cccb4dfd147af5848fc Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 10 Jul 2023 13:06:54 +0200 Subject: [PATCH 038/114] Refactor listeners API --- CHANGELOG.md | 1 + .../java/internal/sdmxdl/NoOpCaching.java | 8 ++- .../src/main/java/sdmxdl/ErrorListener.java | 16 +++++ .../src/main/java/sdmxdl/EventListener.java | 15 +++++ sdmx-dl-api/src/main/java/sdmxdl/Marker.java | 25 ++++++++ .../src/main/java/sdmxdl/SdmxManager.java | 7 +-- .../java/sdmxdl/ext/SdmxSourceBiConsumer.java | 16 ----- .../java/sdmxdl/ext/SdmxSourceConsumer.java | 15 ----- .../java/sdmxdl/file/SdmxFileManager.java | 15 +++-- .../java/sdmxdl/file/spi/FileCaching.java | 13 ++-- .../java/sdmxdl/file/spi/FileContext.java | 13 ++-- .../main/java/sdmxdl/web/SdmxWebManager.java | 23 +++---- .../main/java/sdmxdl/web/spi/WebCaching.java | 13 ++-- .../main/java/sdmxdl/web/spi/WebContext.java | 15 ++--- .../java/sdmxdl/web/spi/WebMonitoring.java | 3 + .../java/sdmxdl/web/SdmxWebManagerTest.java | 15 +++-- .../internal/sdmxdl/cli/WebNetOptions.java | 20 ++---- .../java/internal/sdmxdl/cli/WebOptions.java | 63 ++++++++++++++----- .../java/internal/sdmxdl/cli/ext/Anchor.java | 5 ++ .../sdmxdl/cli/ext/VerboseOptions.java | 8 +-- .../java/sdmxdl/cli/CheckConfigCommand.java | 3 +- sdmx-dl-cli/src/test/java/_demo/Demo.java | 7 ++- .../sdmxdl/desktop/DesktopWebFactory.java | 2 +- .../main/java/sdmxdl/format/DiskCache.java | 34 +++++----- .../java/sdmxdl/format/DiskCacheEvent.java | 6 -- .../sdmxdl/format/DiskCachingSupport.java | 33 +++------- .../java/sdmxdl/format/MemCachingSupport.java | 8 ++- .../sdmxdl/format/MemCachingSupportTest.java | 5 +- .../provider/ext/DualWebCachingSupport.java | 10 +-- .../java/sdmxdl/provider/file/FileClient.java | 3 + .../java/sdmxdl/provider/web/RestClient.java | 2 + .../connectors/ConnectorsRestClient.java | 16 ++--- .../sdmxdl/provider/ri/file/SdmxDecoder.java | 3 + .../sdmxdl/provider/ri/file/XmlDecoder.java | 22 +++---- .../provider/ri/file/XmlFileClient.java | 10 ++- .../provider/ri/file/readers/XmlReader.java | 4 +- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 54 +++++++--------- .../provider/ri/web/drivers/FileDriver.java | 19 +++--- .../ri/web/drivers/StatCanDriver.java | 1 + .../web/monitors/UptimeRobotMonitoring.java | 5 +- .../provider/ri/file/XmlFileClientTest.java | 4 +- .../provider/ri/web/RiHttpUtilsTest.java | 7 ++- 42 files changed, 316 insertions(+), 251 deletions(-) create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/EventListener.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/Marker.java delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java create mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java delete mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java diff --git a/CHANGELOG.md b/CHANGELOG.md index a1d3de3da..bd0dfd903 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Refactor cache API [#500](https://github.com/nbbrd/sdmx-dl/issues/500) - ![API] Refactor network API [#503](https://github.com/nbbrd/sdmx-dl/issues/503) - ![API] Remove dialect API [#505](https://github.com/nbbrd/sdmx-dl/issues/505) +- ![API] Refactor listeners API [#506](https://github.com/nbbrd/sdmx-dl/issues/506) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java index 70301efc4..183133367 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java @@ -1,7 +1,9 @@ package internal.sdmxdl; import lombok.NonNull; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; @@ -37,12 +39,12 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener) { + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { return FileCache.noOp(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { return WebCache.noOp(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java new file mode 100644 index 000000000..8d8e1b388 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java @@ -0,0 +1,16 @@ +package sdmxdl; + +import lombok.NonNull; + +import java.io.IOException; +import java.util.function.BiConsumer; + +@FunctionalInterface +public interface ErrorListener { + + void accept(@NonNull S source, @NonNull Marker marker, @NonNull CharSequence message, @NonNull IOException error); + + default @NonNull BiConsumer asBiConsumer(@NonNull S source, @NonNull Marker marker) { + return (message, error) -> accept(source, marker, message, error); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java new file mode 100644 index 000000000..b1b2e6168 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java @@ -0,0 +1,15 @@ +package sdmxdl; + +import lombok.NonNull; + +import java.util.function.Consumer; + +@FunctionalInterface +public interface EventListener { + + void accept(@NonNull S source, @NonNull Marker marker, @NonNull CharSequence message); + + default @NonNull Consumer asConsumer(@NonNull S source, @NonNull Marker marker) { + return message -> accept(source, marker, message); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Marker.java b/sdmx-dl-api/src/main/java/sdmxdl/Marker.java new file mode 100644 index 000000000..f768ebfe7 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/Marker.java @@ -0,0 +1,25 @@ +package sdmxdl; + +import lombok.AccessLevel; +import lombok.NonNull; +import nbbrd.design.RepresentableAsString; +import nbbrd.design.StaticFactoryMethod; + +@RepresentableAsString +@lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) +@lombok.EqualsAndHashCode +public class Marker implements CharSequence { + + @lombok.experimental.Delegate(types = CharSequence.class) + private final @NonNull String value; + + @Override + public String toString() { + return value; + } + + @StaticFactoryMethod + public static @NonNull Marker parse(@NonNull CharSequence value) { + return new Marker(value.toString()); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index b83f7b206..aa342d39d 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -19,7 +19,7 @@ import lombok.NonNull; import nbbrd.design.SealedType; import nbbrd.design.ThreadSafe; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.file.SdmxFileManager; import sdmxdl.web.SdmxWebManager; @@ -39,8 +39,7 @@ public abstract class SdmxManager { public abstract @NonNull LanguagePriorityList getLanguages(); - public abstract @NonNull SdmxSourceConsumer getEventListener(); + public abstract @Nullable EventListener getOnEvent(); - public static final SdmxSourceConsumer NO_OP_EVENT_LISTENER = (source, t) -> { - }; + public abstract @Nullable ErrorListener getOnError(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java deleted file mode 100644 index 73f2769b7..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceBiConsumer.java +++ /dev/null @@ -1,16 +0,0 @@ -package sdmxdl.ext; - -import lombok.NonNull; -import sdmxdl.SdmxSource; - -import java.util.function.BiConsumer; - -@FunctionalInterface -public interface SdmxSourceBiConsumer { - - void accept(S source, T t, U u); - - default @NonNull BiConsumer asBiConsumer(S source) { - return (t, u) -> accept(source, t, u); - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java deleted file mode 100644 index 55a181cc5..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxSourceConsumer.java +++ /dev/null @@ -1,15 +0,0 @@ -package sdmxdl.ext; - -import lombok.NonNull; -import sdmxdl.SdmxSource; - -import java.util.function.BiConsumer; -import java.util.function.Consumer; - -@FunctionalInterface -public interface SdmxSourceConsumer extends BiConsumer { - - default @NonNull Consumer asConsumer(S source) { - return t -> accept(source, t); - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index 43c23e400..ab43048fc 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -21,10 +21,8 @@ import lombok.AccessLevel; import lombok.NonNull; import nbbrd.design.StaticFactoryMethod; -import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.*; import sdmxdl.file.spi.FileCaching; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; @@ -62,9 +60,9 @@ public class SdmxFileManager extends SdmxManager { @lombok.Builder.Default FileCaching caching = FileCaching.noOp(); - @lombok.NonNull - @lombok.Builder.Default - SdmxSourceConsumer eventListener = NO_OP_EVENT_LISTENER; + @Nullable EventListener onEvent; + + @Nullable ErrorListener onError; @lombok.NonNull @lombok.Singular @@ -86,7 +84,8 @@ private FileContext initContext() { return FileContext .builder() .languages(languages) - .eventListener(eventListener) + .onEvent(onEvent) + .onError(onError) .caching(caching) .build(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java index b3dc4e779..a40304e8c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -7,7 +7,9 @@ import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; import nbbrd.service.ServiceSorter; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; @@ -26,14 +28,17 @@ public interface FileCaching { @ServiceSorter(reverse = true) int getFileCachingRank(); - @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener); + @NonNull FileCache getFileCache( + @NonNull SdmxFileSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); @NonNull Collection getFileCachingProperties(); - int UNKNOWN_FILE_CACHING_RANK = -1; - @StaticFactoryMethod static @NonNull FileCaching noOp() { return NoOpCaching.INSTANCE; } + + int UNKNOWN_FILE_CACHING_RANK = -1; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index 81efc30e6..657f2f079 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -1,9 +1,10 @@ package sdmxdl.file.spi; import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; -import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; @@ -19,11 +20,11 @@ public class FileContext { @lombok.Builder.Default FileCaching caching = FileCaching.noOp(); - @lombok.NonNull - @lombok.Builder.Default - SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; + @Nullable EventListener onEvent; + + @Nullable ErrorListener onError; public @NonNull FileCache getCache(@NonNull SdmxFileSource source) { - return getCaching().getFileCache(source, getEventListener()); + return getCaching().getFileCache(source, getOnEvent(), getOnError()); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index f9279dde2..0864d51fc 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -20,11 +20,9 @@ import lombok.AccessLevel; import lombok.NonNull; import nbbrd.design.StaticFactoryMethod; -import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; -import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.web.spi.WebCaching; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.EventListener; +import sdmxdl.*; import sdmxdl.web.spi.*; import java.io.IOException; @@ -45,6 +43,8 @@ @lombok.EqualsAndHashCode(callSuper = false) public class SdmxWebManager extends SdmxManager { + public static final Marker WEB_MANAGER_MARKER = Marker.parse("WEB_MANAGER"); + @StaticFactoryMethod public static @NonNull SdmxWebManager ofServiceLoader() { return SdmxWebManager @@ -82,9 +82,9 @@ public class SdmxWebManager extends SdmxManager { @lombok.Builder.Default WebCaching caching = WebCaching.noOp(); - @lombok.NonNull - @lombok.Builder.Default - SdmxSourceConsumer eventListener = NO_OP_EVENT_LISTENER; + @Nullable EventListener onEvent; + + @Nullable ErrorListener onError; @lombok.NonNull @lombok.Singular @@ -146,12 +146,12 @@ public MonitorReport getMonitorReport(@NonNull SdmxWebSource source) throws IOEx } private void checkSourceProperties(SdmxWebSource source, WebDriver driver) { - if (eventListener != NO_OP_EVENT_LISTENER) { + if (onEvent != null) { Collection expected = driver.getSupportedProperties(); Collection found = source.getProperties().keySet(); String diff = found.stream().filter(item -> !expected.contains(item)).sorted().collect(Collectors.joining(",")); if (!diff.isEmpty()) { - eventListener.accept(source, "Unexpected properties [" + diff + "]"); + onEvent.accept(source, WEB_MANAGER_MARKER, "Unexpected properties [" + diff + "]"); } } } @@ -180,7 +180,8 @@ private WebContext initContext() { .caching(caching) .languages(languages) .networking(networking) - .eventListener(eventListener) + .onEvent(onEvent) + .onError(onError) .authenticators(authenticators) .build(); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java index d0f2c303c..4349ac233 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -7,7 +7,9 @@ import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; import nbbrd.service.ServiceSorter; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.WebCache; @@ -26,14 +28,17 @@ public interface WebCaching { @ServiceSorter(reverse = true) int getWebCachingRank(); - @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener); + @NonNull WebCache getWebCache( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); @NonNull Collection getWebCachingProperties(); - int UNKNOWN_WEB_CACHING_RANK = -1; - @StaticFactoryMethod static @NonNull WebCaching noOp() { return NoOpCaching.INSTANCE; } + + int UNKNOWN_WEB_CACHING_RANK = -1; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index bde6e8456..e37ebbb7f 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -17,12 +17,13 @@ package sdmxdl.web.spi; import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; -import sdmxdl.web.WebCache; -import sdmxdl.ext.SdmxSourceConsumer; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebCache; import java.util.List; @@ -41,9 +42,9 @@ public class WebContext { @lombok.Builder.Default WebCaching caching = WebCaching.noOp(); - @lombok.NonNull - @lombok.Builder.Default - SdmxSourceConsumer eventListener = SdmxManager.NO_OP_EVENT_LISTENER; + @Nullable EventListener onEvent; + + @Nullable ErrorListener onError; @lombok.NonNull @lombok.Singular @@ -54,7 +55,7 @@ public class WebContext { Networking networking = Networking.getDefault(); public @NonNull WebCache getCache(@NonNull SdmxWebSource source) { - return getCaching().getWebCache(source, getEventListener()); + return getCaching().getWebCache(source, getOnEvent(), getOnError()); } public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java index ee53337e8..726d2200c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java @@ -5,6 +5,7 @@ import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; +import sdmxdl.Marker; import sdmxdl.web.MonitorReport; import sdmxdl.web.SdmxWebSource; @@ -28,4 +29,6 @@ MonitorReport getReport( @NonNull SdmxWebSource source, @NonNull WebContext context ) throws IOException, IllegalArgumentException; + + Marker WEB_MONITORING_MARKER = Marker.parse("WEB_MONITORING"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index d80bc9bbb..173baca4b 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -17,9 +17,12 @@ package sdmxdl.web; import org.junit.jupiter.api.Test; -import sdmxdl.*; -import sdmxdl.web.spi.WebCaching; +import sdmxdl.Connection; +import sdmxdl.DataRepository; +import sdmxdl.Feature; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.spi.Networking; +import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.api.SdmxManagerAssert; import tests.sdmxdl.web.MockedDriver; @@ -61,7 +64,7 @@ public void testFactories() { assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); - assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); + assertThat(o.getOnEvent()).isNull(); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); assertThat(o.getDefaultSources()).isEmpty(); @@ -74,7 +77,7 @@ public void testFactories() { assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); - assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); + assertThat(o.getOnEvent()).isNull(); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); assertThat(o.getDefaultSources()).isEmpty(); @@ -86,7 +89,7 @@ public void testFactories() { assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); - assertThat(o.getEventListener()).isEqualTo(SdmxManager.NO_OP_EVENT_LISTENER); + assertThat(o.getOnEvent()).isNull(); assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); assertThat(o.getDefaultSources()).containsAll(sampleDriver.getDefaultSources()); @@ -247,7 +250,7 @@ public void testInvalidSourceProperties() throws IOException { SdmxWebManager manager = SdmxWebManager .builder() .driver(sampleDriver) - .eventListener((source, event) -> events.add(source.getId() + ":" + event)) + .onEvent((source, marker, event) -> events.add(source.getId() + ":" + event)) .build(); SdmxWebSource noProp = sampleSource.toBuilder().id("noProp").clearProperties().build(); diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 52df4064c..925f8671d 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -16,6 +16,7 @@ */ package internal.sdmxdl.cli; +import internal.sdmxdl.cli.ext.Anchor; import internal.sdmxdl.cli.ext.AuthOptions; import internal.sdmxdl.cli.ext.CacheOptions; import internal.sdmxdl.cli.ext.VerboseOptions; @@ -23,8 +24,6 @@ import lombok.NonNull; import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; -import sdmxdl.web.spi.WebCaching; -import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DiskCache; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.MemCachingSupport; @@ -34,6 +33,7 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebAuthenticator; +import sdmxdl.web.spi.WebCaching; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLSocketFactory; @@ -136,8 +136,6 @@ private static WebCaching getCacheProvider(CacheOptions cacheOptions, VerboseOpt .id("DISK") .root(root) .persistence(cacheOptions.getCacheFormat()) - .onFileError((src, msg, ex) -> reportFileError(verboseOptions, src, msg, ex)) - .onWebError((src, msg, ex) -> reportWebError(verboseOptions, src, msg, ex)) .clock(clock) .noCompression(cacheOptions.isNoCacheCompression()) .build()) @@ -147,17 +145,7 @@ private static WebCaching getCacheProvider(CacheOptions cacheOptions, VerboseOpt private static void reportConfig(VerboseOptions verboseOptions, Path root) { if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(CACHE_ANCHOR, "Using cache folder '" + root + "'"); - } - - private static void reportFileError(VerboseOptions verboseOptions, SdmxFileSource src, String msg, IOException ex) { - if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(CACHE_ANCHOR, src.getData() + ": " + msg, ex); - } - - private static void reportWebError(VerboseOptions verboseOptions, SdmxWebSource src, String msg, IOException ex) { - if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(CACHE_ANCHOR, src.getId() + ": " + msg, ex); + verboseOptions.reportToErrorStream(Anchor.CCH, "Using cache folder '" + root + "'"); } private static Networking getNetworking(NetworkOptions networkOptions, VerboseOptions verboseOptions) { @@ -172,7 +160,7 @@ private static Networking getNetworking(NetworkOptions networkOptions, VerboseOp private static void reportNetwork(VerboseOptions verboseOptions, String msg) { if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream("NET", msg); + verboseOptions.reportToErrorStream(Anchor.NET, msg); } private static Supplier memoize(Supplier supplier, String message, VerboseOptions verboseOptions) { diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index f561a803b..9a57e3fb3 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -16,15 +16,18 @@ */ package internal.sdmxdl.cli; +import internal.sdmxdl.cli.ext.Anchor; import internal.sdmxdl.cli.ext.CloseableExecutorService; import internal.sdmxdl.cli.ext.SameThreadExecutorService; import internal.sdmxdl.cli.ext.VerboseOptions; import nbbrd.design.ReturnNew; import nbbrd.io.text.BooleanProperty; +import org.checkerframework.checker.nullness.qual.Nullable; import picocli.CommandLine; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; -import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.Marker; import sdmxdl.format.xml.XmlWebSource; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -37,7 +40,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.function.BiConsumer; import java.util.logging.Level; /** @@ -104,7 +106,8 @@ public SdmxWebManager loadManager() throws IOException { return defaultWebManager.get() .toBuilder() .languages(langs) - .eventListener(getEventListener()) + .onEvent(getEventListener()) + .onError(getErrorListener()) .customSources(customSources.get()) .build(); @@ -113,9 +116,14 @@ public SdmxWebManager loadManager() throws IOException { } } - private SdmxSourceConsumer getEventListener() { - SdmxSourceConsumer original = isNoLog() ? SdmxManager.NO_OP_EVENT_LISTENER : new LoggingListener()::onSourceEvent; - return new VerboseListener(original, verboseOptions)::onSourceEvent; + private EventListener getEventListener() { + EventListener original = isNoLog() ? null : new LoggingListener()::onSourceEvent; + return new VerboseEventListener(original, verboseOptions)::onSourceEvent; + } + + private ErrorListener getErrorListener() { + ErrorListener original = isNoLog() ? null : new LoggingListener()::onSourceError; + return new VerboseErrorListener(original, verboseOptions)::onSourceError; } @ReturnNew @@ -127,7 +135,7 @@ private SdmxWebManager loadDefaultWebManager() { private List loadCustomSources() throws IOException { if (sourcesFile != null) { if (verboseOptions.isVerbose()) { - verboseOptions.reportToErrorStream("CFG", "Using source file '" + sourcesFile + "'"); + verboseOptions.reportToErrorStream(Anchor.CFG, "Using source file '" + sourcesFile + "'"); } return XmlWebSource.getParser().parseFile(sourcesFile); } @@ -137,28 +145,51 @@ private List loadCustomSources() throws IOException { @lombok.extern.java.Log private static class LoggingListener { - public void onSourceEvent(SdmxWebSource source, String message) { + public void onSourceEvent(SdmxWebSource source, Marker marker, CharSequence message) { if (log.isLoggable(Level.INFO)) { - log.info(message); + log.info(message.toString()); + } + } + + public void onSourceError(SdmxWebSource source, Marker marker, CharSequence message, IOException error) { + if (log.isLoggable(Level.INFO)) { + log.log(Level.INFO, message.toString(), error); } } } @lombok.AllArgsConstructor - private static class VerboseListener { + private static class VerboseEventListener { + + private final @Nullable EventListener main; @lombok.NonNull - private final BiConsumer main; + private final VerboseOptions verboseOptions; + + public void onSourceEvent(SdmxWebSource source, Marker marker, CharSequence message) { + if (main != null) { + main.accept(source, marker, message); + } + if (verboseOptions.isVerbose()) { + verboseOptions.reportToErrorStream(Anchor.WEB, source.getId() + ": " + message); + } + } + } + + @lombok.AllArgsConstructor + private static class VerboseErrorListener { + + private final @Nullable ErrorListener main; @lombok.NonNull private final VerboseOptions verboseOptions; - public void onSourceEvent(SdmxWebSource source, String message) { - if (main != SdmxManager.NO_OP_EVENT_LISTENER) { - main.accept(source, message); + public void onSourceError(SdmxWebSource source, Marker marker, CharSequence message, IOException error) { + if (main != null) { + main.accept(source, marker, message, error); } if (verboseOptions.isVerbose()) { - verboseOptions.reportToErrorStream("WEB", source.getId() + ": " + message); + verboseOptions.reportToErrorStream(Anchor.WEB, source.getId() + ": " + message, error); } } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java new file mode 100644 index 000000000..cef4f2b0f --- /dev/null +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java @@ -0,0 +1,5 @@ +package internal.sdmxdl.cli.ext; + +public enum Anchor { + CFG, CCH, NET, WEB +} diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java index a482216ca..34c792a91 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/VerboseOptions.java @@ -18,24 +18,24 @@ public class VerboseOptions { @CommandLine.Spec private CommandLine.Model.CommandSpec spec; - public void reportToErrorStream(String anchor, String message) { + public void reportToErrorStream(Anchor anchor, String message) { if (verbose) { CommandLine.Help.ColorScheme colorScheme = spec.commandLine().getColorScheme(); reportToErrorStream(colorScheme .text("[") - .concat(colorScheme.commandText(anchor)) + .concat(colorScheme.commandText(anchor.toString())) .concat(colorScheme.text("] ")) .concat(colorScheme.optionText(message)) ); } } - public void reportToErrorStream(String anchor, String message, Exception ex) { + public void reportToErrorStream(Anchor anchor, String message, Exception ex) { CommandLine.Help.ColorScheme colorScheme = spec.commandLine().getColorScheme(); String details = ex.getMessage() != null ? ex.getMessage() : ex.getClass().getName(); reportToErrorStream(colorScheme .text("[") - .concat(colorScheme.commandText(anchor)) + .concat(colorScheme.commandText(anchor.toString())) .concat(colorScheme.text("] ")) .concat(colorScheme.optionText(message)) .concat(" ") diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckConfigCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckConfigCommand.java index 227cf4bd7..3ebbb892e 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckConfigCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckConfigCommand.java @@ -16,6 +16,7 @@ */ package sdmxdl.cli; +import internal.sdmxdl.cli.ext.Anchor; import internal.sdmxdl.cli.ext.CsvTable; import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import internal.sdmxdl.cli.ext.VerboseOptions; @@ -73,7 +74,7 @@ private ConfigHelper getConfigHelper() { return ConfigHelper .builder() .appName(About.NAME) - .onLoadingError((path, ex) -> verboseOptions.reportToErrorStream("CFG", path.toString(), ex)) + .onLoadingError((path, ex) -> verboseOptions.reportToErrorStream(Anchor.CFG, path.toString(), ex)) .build(); } diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index 29e8ff5be..42321e3a9 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -4,6 +4,7 @@ import sdmxdl.*; import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; +import sdmxdl.web.SdmxWebSource; import java.io.IOException; @@ -16,7 +17,7 @@ public static void main(String[] args) throws IOException { .toBuilder() .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .languages(LanguagePriorityList.ANY) - .eventListener((source, message) -> System.err.println("[" + source.getId() + "] " + message)) + .onEvent(Demo::printEvent) .build(); try (Connection ecb = manager.getConnection("ECB")) { @@ -31,4 +32,8 @@ public static void main(String[] args) throws IOException { .forEach(System.out::println); } } + + private static void printEvent(SdmxWebSource source, Marker marker, CharSequence message) { + System.err.println("[" + source.getId() + "] (" + marker + ") " + message); + } } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index 5e03e48b8..fe524ad71 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -14,7 +14,7 @@ public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) - .eventListener((source, msg) -> System.out.println(source.getId() + ": " + msg)) + .onEvent((source, marker, msg) -> System.out.println(source.getId() + ": " + msg)) .build(); } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index 18784047a..b27fb8a4a 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -34,6 +34,7 @@ import java.time.Clock; import java.util.Locale; import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.UnaryOperator; @@ -70,13 +71,9 @@ public final class DiskCache implements FileCache, WebCache { @lombok.Builder.Default private final FileFormat monitorFormat = FileFormat.noOp(); - @lombok.NonNull - @lombok.Builder.Default - private final BiConsumer onRead = DO_NOT_REPORT; + private final @Nullable Consumer onRead; - @lombok.NonNull - @lombok.Builder.Default - private final BiConsumer onError = DO_NOT_REPORT; + private final @Nullable BiConsumer onError; @lombok.NonNull @lombok.Builder.Default @@ -133,25 +130,29 @@ private boolean isValid(MonitorReports value) { private T read(FileFormat fileFormat, Predicate validator, String key, FileType fileType) { T result = read(fileFormat, fileType, key); if (result == null) { - onRead.accept(key, DiskCacheEvent.MISSED); + reportRead(key, DiskCacheEvent.MISSED); return null; } if (!validator.test(result)) { delete(key, fileType, fileFormat); - onRead.accept(key, DiskCacheEvent.EXPIRED); + reportRead(key, DiskCacheEvent.EXPIRED); return null; } - onRead.accept(key, DiskCacheEvent.HIT); + reportRead(key, DiskCacheEvent.HIT); return result; } + private void reportRead(String key, DiskCacheEvent event) { + if (onRead != null) onRead.accept(event.name() + " " + key); + } + private T read(FileFormat fileFormat, FileType fileType, String key) { Path file = getFile(key, fileType, fileFormat); if (Files.exists(file) && Files.isRegularFile(file)) { try { return FileParser.onParsingLock(fileFormat.getParser()).parsePath(file); } catch (IOException ex) { - onError.accept("Failed reading '" + file + "'", ex); + if (onError != null) onError.accept("Failed reading '" + file + "'", ex); } } return null; @@ -163,7 +164,7 @@ private void write(FileFormat fileFormat, String key, FileType fileType, try { FileFormatter.onFormattingLock(fileFormat.getFormatter()).formatPath(entry, file); } catch (IOException ex) { - onError.accept("Failed writing '" + file + "'", ex); + if (onError != null) onError.accept("Failed writing '" + file + "'", ex); } } @@ -171,7 +172,7 @@ private void ensureParentExists(Path file) { try { Files.createDirectories(file.getParent()); } catch (IOException ex) { - onError.accept("While creating working dir '" + file + "'", ex); + if (onError != null) onError.accept("While creating working dir '" + file + "'", ex); } } @@ -180,7 +181,7 @@ private void delete(String key, FileType fileType, FileFormat fileFormat) { try { Files.deleteIfExists(file); } catch (IOException ex) { - onError.accept("While deleting '" + file + "'", ex); + if (onError != null) onError.accept("While deleting '" + file + "'", ex); } } @@ -191,8 +192,6 @@ Path getFile(String key, FileType fileType, FileFormat fileFormat) { public static final Path SDMXDL_TMP_DIR = requireNonNull(SystemProperties.DEFAULT.getJavaIoTmpdir()).resolve(About.NAME).resolve(About.VERSION); private static final UnaryOperator NORMALIZE_HASH_CODE = DiskCache::normalizeHashCode; - private static final BiConsumer DO_NOT_REPORT = (msg, ex) -> { - }; private static String normalizeHashCode(String key) { int hashCode = key.hashCode(); @@ -203,4 +202,9 @@ private static String normalizeHashCode(String key) { enum FileType { REPOSITORY, MONITOR } + + @VisibleForTesting + enum DiskCacheEvent { + HIT, MISSED, EXPIRED + } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java deleted file mode 100644 index ecf8656ff..000000000 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCacheEvent.java +++ /dev/null @@ -1,6 +0,0 @@ -package sdmxdl.format; - -public enum DiskCacheEvent { - - HIT, MISSED, EXPIRED -} diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index f128acb70..ebb6bde91 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -1,9 +1,11 @@ package sdmxdl.format; import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.ext.SdmxSourceBiConsumer; -import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; +import sdmxdl.Marker; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; @@ -13,7 +15,6 @@ import sdmxdl.web.WebCache; import sdmxdl.web.spi.WebCaching; -import java.io.IOException; import java.nio.file.Path; import java.time.Clock; import java.util.Collection; @@ -40,14 +41,6 @@ public final class DiskCachingSupport implements FileCaching, WebCaching { @lombok.Builder.Default private final FileFormat monitorFormat = FileFormat.noOp(); - @lombok.NonNull - @lombok.Builder.Default - private final SdmxSourceBiConsumer onFileError = NO_OP_FILE_ERROR; - - @lombok.NonNull - @lombok.Builder.Default - private final SdmxSourceBiConsumer onWebError = NO_OP_WEB_ERROR; - @lombok.NonNull @lombok.Builder.Default private final Clock clock = Clock.systemDefaultZone(); @@ -85,18 +78,18 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer listener) { + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return newFileCacheBuilder() - .onRead((key, event) -> listener.accept(source, event.name() + " " + key)) - .onError(onFileError.asBiConsumer(source)) + .onRead(onEvent != null ? onEvent.asConsumer(source, Marker.parse(id)) : null) + .onError(onError != null ? onError.asBiConsumer(source, Marker.parse(id)) : null) .build(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return newFileCacheBuilder() - .onRead((key, event) -> listener.accept(source, event.name() + " " + key)) - .onError(onWebError.asBiConsumer(source)) + .onRead(onEvent != null ? onEvent.asConsumer(source, Marker.parse(id)) : null) + .onError(onError != null ? onError.asBiConsumer(source, Marker.parse(id)) : null) .build(); } @@ -118,10 +111,4 @@ public static final class Builder { return this; } } - - public static final SdmxSourceBiConsumer NO_OP_FILE_ERROR = (source, t, u) -> { - }; - - public static final SdmxSourceBiConsumer NO_OP_WEB_ERROR = (source, t, u) -> { - }; } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index e6f6c032a..422bc419b 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -1,8 +1,10 @@ package sdmxdl.format; import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.ext.SdmxSourceConsumer; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; @@ -61,12 +63,12 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @NonNull SdmxSourceConsumer eventListener) { + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return getCache(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return getCache(); } diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java index cafea0e44..4612eff70 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java @@ -3,7 +3,6 @@ import nbbrd.io.text.Parser; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; -import sdmxdl.SdmxManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; @@ -38,12 +37,12 @@ enum Extractor { FILE { @Override MemCache f(MemCachingSupport z) { - return (MemCache) z.getFileCache(FILE_SOURCE, SdmxManager.NO_OP_EVENT_LISTENER); + return (MemCache) z.getFileCache(FILE_SOURCE, null, null); } }, WEB { @Override MemCache f(MemCachingSupport z) { - return (MemCache) z.getWebCache(WEB_SOURCE, SdmxManager.NO_OP_EVENT_LISTENER); + return (MemCache) z.getWebCache(WEB_SOURCE, null, null); } }; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java index a93ce8f1a..4b5bef46b 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java @@ -1,7 +1,9 @@ package sdmxdl.provider.ext; import lombok.NonNull; -import sdmxdl.ext.SdmxSourceConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.WebCache; import sdmxdl.web.spi.WebCaching; @@ -44,9 +46,9 @@ public int getWebCachingRank() { } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @NonNull SdmxSourceConsumer listener) { - WebCache main = first.getWebCache(source, listener); - return new DualWebCache(main, second.getWebCache(source, listener), clock); + public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + WebCache main = first.getWebCache(source, onEvent, onError); + return new DualWebCache(main, second.getWebCache(source, onEvent, onError), clock); } @Override diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java index 9b06f9f82..8ee97b87c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java @@ -1,6 +1,7 @@ package sdmxdl.provider.file; import lombok.NonNull; +import sdmxdl.Marker; import sdmxdl.Series; import sdmxdl.provider.DataRef; import sdmxdl.provider.HasMarker; @@ -15,4 +16,6 @@ public interface FileClient extends HasMarker { @NonNull FileInfo decode() throws IOException; @NonNull Stream loadData(@NonNull FileInfo info, @NonNull DataRef dataRef) throws IOException; + + Marker FILE_CLIENT_MARKER = Marker.parse("FILE_CLIENT"); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java index 301e279cd..442c7f89c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java @@ -44,4 +44,6 @@ public interface RestClient extends HasMarker { @NonNull Set getSupportedFeatures() throws IOException; void testClient() throws IOException; + + Marker REST_CLIENT_MARKER = sdmxdl.Marker.parse("REST_CLIENT"); } diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java index 6fc210a02..080ca5761 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -26,6 +26,8 @@ import lombok.AccessLevel; import lombok.NonNull; import nbbrd.io.text.BaseProperty; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.EventListener; import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.DataRef; @@ -42,7 +44,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.*; -import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -171,7 +172,7 @@ public interface GenericSupplier { } @Override - public Set getSupportedFeatures() { + public @NonNull Set getSupportedFeatures() { return connector instanceof HasDetailSupported && ((HasDetailSupported) connector).isDetailSupported() ? EnumSet.of(Feature.DATA_QUERY_ALL_KEYWORD, Feature.DATA_QUERY_DETAIL) @@ -216,7 +217,7 @@ private static void configure(RestSdmxClient client, SdmxWebSource source, WebCo client.setSslSocketFactory(sslFactory.getSSLSocketFactory()); client.setHostnameVerifier(sslFactory.getHostnameVerifier()); client.setMaxRedirects(MAX_REDIRECTS_PROPERTY.get(source.getProperties())); - RestSdmxEventListener eventListener = new DefaultRestSdmxEventListener(source, context.getEventListener()); + RestSdmxEventListener eventListener = new DefaultRestSdmxEventListener(source, context.getOnEvent()); client.setRedirectionEventListener(eventListener); client.setOpenEventListener(eventListener); } @@ -227,18 +228,17 @@ private static final class DefaultRestSdmxEventListener implements RestSdmxEvent @lombok.NonNull private final SdmxWebSource source; - @lombok.NonNull - private final BiConsumer listener; + private final @Nullable EventListener listener; @Override public void onSdmxEvent(RestSdmxEvent event) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { + if (listener != null) { if (event instanceof RedirectionEvent) { RedirectionEvent redirectionEvent = (RedirectionEvent) event; - listener.accept(source, WebEvents.onRedirection(redirectionEvent.getUrl(), redirectionEvent.getRedirection())); + listener.accept(source, REST_CLIENT_MARKER, WebEvents.onRedirection(redirectionEvent.getUrl(), redirectionEvent.getRedirection())); } else if (event instanceof OpenEvent) { OpenEvent openEvent = (OpenEvent) event; - listener.accept(source, WebEvents.onQuery(openEvent.getUrl(), openEvent.getProxy())); + listener.accept(source, REST_CLIENT_MARKER, WebEvents.onQuery(openEvent.getUrl(), openEvent.getProxy())); } } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java index 57a7c4b30..3a1637f9c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java @@ -18,6 +18,7 @@ import lombok.NonNull; import sdmxdl.LanguagePriorityList; +import sdmxdl.Marker; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.file.FileInfo; @@ -29,4 +30,6 @@ public interface SdmxDecoder { @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) throws IOException; + + Marker SDMX_DECODER_MARKER = Marker.parse("SDMX_DECODER"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java index 598e60fbd..f13ceff1f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java @@ -16,18 +16,19 @@ */ package internal.sdmxdl.provider.ri.file; +import lombok.NonNull; import nbbrd.io.net.MediaType; import nbbrd.io.xml.Xml; +import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataStructure; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.*; import sdmxdl.provider.file.FileInfo; import java.io.IOException; import java.util.List; -import java.util.function.BiConsumer; /** * @author Philippe Charles @@ -35,18 +36,17 @@ @lombok.AllArgsConstructor public final class XmlDecoder implements SdmxDecoder { - @lombok.NonNull - private final BiConsumer eventListener; + private final @Nullable EventListener listener; @Override - public FileInfo decode(SdmxFileSource source, LanguagePriorityList langs) throws IOException { + public @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList langs) throws IOException { MediaType type = probeDataType(source); return FileInfo.of(type, loadStructure(source, langs, type)); } private MediaType probeDataType(SdmxFileSource source) throws IOException { - if (eventListener != SdmxManager.NO_OP_EVENT_LISTENER) { - eventListener.accept(source, "Probing data type from '" + source.getData() + "'"); + if (listener != null) { + listener.accept(source, SDMX_DECODER_MARKER, "Probing data type from '" + source.getData() + "'"); } return XmlMediaTypeProbe.of() .parseFile(source.getData()) @@ -60,8 +60,8 @@ private DataStructure loadStructure(SdmxFileSource source, LanguagePriorityList } private DataStructure parseStruct(MediaType dataType, LanguagePriorityList langs, SdmxFileSource source) throws IOException { - if (eventListener != SdmxManager.NO_OP_EVENT_LISTENER) { - eventListener.accept(source, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); + if (listener != null) { + listener.accept(source, SDMX_DECODER_MARKER, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); } return getStructParser(dataType, langs) .parseFile(source.getStructure()) @@ -80,8 +80,8 @@ private Xml.Parser> getStructParser(MediaType dataType, Lang } private DataStructure decodeStruct(MediaType dataType, SdmxFileSource source) throws IOException { - if (eventListener != SdmxManager.NO_OP_EVENT_LISTENER) { - eventListener.accept(source, "Decoding structure from '" + source.getData() + "' with data type '" + dataType + "'"); + if (listener != null) { + listener.accept(source, SDMX_DECODER_MARKER, "Decoding structure from '" + source.getData() + "' with data type '" + dataType + "'"); } return getStructDecoder(dataType) .parseFile(source.getData()); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java index c52592aec..4179b9896 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java @@ -21,8 +21,8 @@ import nbbrd.io.xml.Xml; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataStructure; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; import sdmxdl.Series; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DataCursor; @@ -36,7 +36,6 @@ import java.io.FileNotFoundException; import java.io.IOException; -import java.util.function.BiConsumer; import java.util.function.Supplier; import java.util.stream.Stream; @@ -58,8 +57,7 @@ public class XmlFileClient implements FileClient { @Nullable private final Supplier obsFactory; - @lombok.NonNull - BiConsumer eventListener; + private final @Nullable EventListener listener; @Override public @NonNull Marker getMarker() { @@ -83,8 +81,8 @@ public void testClient() throws IOException { @Override public @NonNull Stream loadData(@NonNull FileInfo info, @NonNull DataRef dataRef) throws IOException { - if (eventListener != SdmxManager.NO_OP_EVENT_LISTENER) { - eventListener.accept(source, "Loading data from file '" + source.getData() + "'"); + if (listener != null) { + listener.accept(source, FILE_CLIENT_MARKER, "Loading data from file '" + source.getData() + "'"); } return dataRef.getQuery().execute( getDataSupplier(info.getDataType(), info.getStructure()) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java index afb3746b3..20af5430c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -43,9 +43,9 @@ private FileClient getClient(SdmxFileSource source, FileContext context) throws FileClient client = new XmlFileClient( source, context.getLanguages(), - new XmlDecoder(context.getEventListener()), + new XmlDecoder(context.getOnEvent()), ObsParser::newDefault, - context.getEventListener() + context.getOnEvent() ); return CachedFileClient.of(client, context.getCache(source), source, context.getLanguages()); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java index 2d0f3268f..51791af11 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -27,8 +27,9 @@ import nbbrd.io.text.Property; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; +import sdmxdl.EventListener; import sdmxdl.LanguagePriorityList; -import sdmxdl.SdmxManager; +import sdmxdl.Marker; import sdmxdl.provider.web.WebEvents; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; @@ -43,7 +44,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; -import java.util.function.BiConsumer; +import java.util.function.Consumer; import java.util.function.Supplier; import static sdmxdl.provider.web.WebProperties.*; @@ -105,8 +106,8 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl .sslSocketFactory(() -> network.getSSLFactory().getSSLSocketFactory()) .hostnameVerifier(() -> network.getSSLFactory().getHostnameVerifier()) .urlConnectionFactory(network::getURLConnectionFactory) - .listener(new RiHttpEventListener(source, context.getEventListener())) - .authenticator(new RiHttpAuthenticator(source, context.getAuthenticators(), context.getEventListener())) + .listener(context.getOnEvent() != null ? new RiHttpEventListener(context.getOnEvent().asConsumer(source, RI_HTTP_MARKER)) : HttpEventListener.noOp()) + .authenticator(new RiHttpAuthenticator(source, context.getAuthenticators(), context.getOnEvent())) .userAgent(HTTP_AGENT.get(System.getProperties())) .build(); } @@ -114,49 +115,35 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl @lombok.AllArgsConstructor private static final class RiHttpEventListener implements HttpEventListener { - @lombok.NonNull - private final SdmxWebSource source; - - @lombok.NonNull - private final BiConsumer listener; + private final @NonNull Consumer listener; @Override public void onOpen(@NonNull HttpRequest request, @NonNull Proxy proxy, @NonNull HttpAuthScheme scheme) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { - String message = WebEvents.onQuery(request.getMethod().name(), request.getQuery(), proxy); - if (!HttpAuthScheme.NONE.equals(scheme)) { - message += " with auth '" + scheme.name() + "'"; - } - listener.accept(source, message); + String message = WebEvents.onQuery(request.getMethod().name(), request.getQuery(), proxy); + if (!HttpAuthScheme.NONE.equals(scheme)) { + message += " with auth '" + scheme.name() + "'"; } + listener.accept(message); } @Override public void onSuccess(@NonNull Supplier contentType) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { - listener.accept(source, String.format(Locale.ROOT, "Parsing '%s' content-type", contentType.get())); - } + listener.accept(String.format(Locale.ROOT, "Parsing '%s' content-type", contentType.get())); } @Override public void onRedirection(@NonNull URL oldUrl, @NonNull URL newUrl) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { - listener.accept(source, WebEvents.onRedirection(oldUrl, newUrl)); - } + listener.accept(WebEvents.onRedirection(oldUrl, newUrl)); } @Override public void onUnauthorized(@NonNull URL url, @NonNull HttpAuthScheme oldScheme, @NonNull HttpAuthScheme newScheme) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { - listener.accept(source, String.format(Locale.ROOT, "Authenticating %s with '%s'", url, newScheme.name())); - } + listener.accept(String.format(Locale.ROOT, "Authenticating %s with '%s'", url, newScheme.name())); } @Override public void onEvent(@NonNull String message) { - if (listener != SdmxManager.NO_OP_EVENT_LISTENER) { - listener.accept(source, message); - } + listener.accept(message); } } @@ -169,8 +156,7 @@ private static final class RiHttpAuthenticator implements HttpAuthenticator { @lombok.NonNull private final List authenticators; - @lombok.NonNull - private final BiConsumer listener; + private final @Nullable EventListener listener; @Override public @Nullable PasswordAuthentication getPasswordAuthentication(URL url) { @@ -201,7 +187,9 @@ private PasswordAuthentication getPasswordAuthentication(WebAuthenticator authen try { return authenticator.getPasswordAuthentication(source); } catch (IOException ex) { - listener.accept(source, "Failed to get password authentication: " + ex.getMessage()); + if (listener != null) { + listener.accept(source, RI_HTTP_MARKER, "Failed to get password authentication: " + ex.getMessage()); + } return null; } } @@ -210,8 +198,12 @@ private void invalidate(WebAuthenticator authenticator) { try { authenticator.invalidate(source); } catch (IOException ex) { - listener.accept(source, "Failed to invalidate password authentication: " + ex.getMessage()); + if (listener != null) { + listener.accept(source, RI_HTTP_MARKER, "Failed to invalidate password authentication: " + ex.getMessage()); + } } } } + + public static final Marker RI_HTTP_MARKER = Marker.parse("RI_HTTP"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 4b67d7ca6..2298d0f9f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -10,8 +10,8 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.Connection; import sdmxdl.DataRepository; -import sdmxdl.ext.SdmxSourceConsumer; -import sdmxdl.web.spi.WebCaching; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; @@ -19,6 +19,7 @@ import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebDriver; @@ -52,8 +53,8 @@ public final class FileDriver implements WebDriver { return fileManager .toBuilder() .languages(context.getLanguages()) - .eventListener((fileSource, message) -> context.getEventListener().accept(source, message)) - .caching(new FileCachingAdapter(source, context.getCaching(), context.getEventListener())) + .onEvent(context.getOnEvent() != null ? (fileSource, marker, message) -> context.getOnEvent().accept(source, marker, message) : null) + .caching(new FileCachingAdapter(context.getCaching(), source, context.getOnEvent(), context.getOnError())) .build() .getConnection(toFileSource(source)); } @@ -61,11 +62,13 @@ public final class FileDriver implements WebDriver { @lombok.AllArgsConstructor private static final class FileCachingAdapter implements FileCaching { + private final @NonNull WebCaching delegate; + private final @NonNull SdmxWebSource webSource; - private final @NonNull WebCaching delegate; + private final @Nullable EventListener onWebEvent; - private final @NonNull SdmxSourceConsumer webListener; + private final @Nullable ErrorListener onWebError; @Override public @NonNull String getFileCachingId() { @@ -78,8 +81,8 @@ public int getFileCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @NonNull SdmxSourceConsumer ignoreEvent) { - return new FileCacheAdapter(delegate.getWebCache(webSource, webListener)); + public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { + return new FileCacheAdapter(delegate.getWebCache(webSource, onWebEvent, onWebError)); } @Override diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index eae09c75c..4af4b0f82 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -14,6 +14,7 @@ import nbbrd.io.net.MediaType; import nbbrd.service.ServiceProvider; import sdmxdl.*; +import sdmxdl.provider.Marker; import sdmxdl.web.WebCache; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java index 2246ebcd2..18881c7be 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java @@ -7,7 +7,6 @@ import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; import nbbrd.service.ServiceProvider; -import sdmxdl.SdmxManager; import sdmxdl.provider.web.WebEvents; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.*; @@ -100,8 +99,8 @@ private static T post(URL url, String query, IOFunction factory, Network network = context.getNetwork(source); Proxy proxy = network.getProxySelector().select(toURI(url)).stream().findFirst().orElse(Proxy.NO_PROXY); - if (context.getEventListener() != SdmxManager.NO_OP_EVENT_LISTENER) { - context.getEventListener().accept(source, WebEvents.onQuery(url, proxy)); + if (context.getOnEvent() != null) { + context.getOnEvent().accept(source, WEB_MONITORING_MARKER, WebEvents.onQuery(url, proxy)); } HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy); diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java index 3a54cd2cb..4f12f6d57 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java @@ -48,7 +48,7 @@ public void testCompactData21(@TempDir Path temp) throws IOException { SdmxXmlSources.OTHER_COMPACT21.copyTo(compact21); SdmxFileSource source = sourceOf(compact21); - FileClient x = new XmlFileClient(source, ANY, DECODER, null, SdmxManager.NO_OP_EVENT_LISTENER); + FileClient x = new XmlFileClient(source, ANY, DECODER, null, null); FileInfo info = x.decode(); @@ -95,6 +95,6 @@ public static SdmxFileSource sourceOf(File compact21) { return SdmxFileSource.builder().data(compact21).build(); } - public static final SdmxDecoder DECODER = new XmlDecoder(SdmxManager.NO_OP_EVENT_LISTENER); + public static final SdmxDecoder DECODER = new XmlDecoder(null); public static final Dataflow DATAFLOW = Dataflow.builder().ref(DataflowRef.parse("data")).structureRef(DataStructureRef.parse("xyz")).name("label").build(); } diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java index 9f00a1ea1..905668131 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java @@ -5,6 +5,7 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import sdmxdl.Marker; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import tests.sdmxdl.web.WebDriverAssert; @@ -56,7 +57,7 @@ public void testListener() throws MalformedURLException { WebContext webContext = WebContext .builder() - .eventListener(events::onSourceEvent) + .onEvent(events::onSourceEvent) .build(); HttpEventListener x = RiHttpUtils.newContext(source, webContext).getListener(); @@ -124,8 +125,8 @@ public List pop() { return result; } - public void onSourceEvent(@NonNull SdmxWebSource source, @NonNull String message) { - events.add(new Event(source, message)); + public void onSourceEvent(@NonNull SdmxWebSource source, @NonNull Marker marker, @NonNull CharSequence message) { + events.add(new Event(source, message.toString())); } } } \ No newline at end of file From bdfd8c7057ba9b576a04527da90ba0ab8a077c20 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 11 Jul 2023 09:05:16 +0200 Subject: [PATCH 039/114] Handle languages per connection instead of per manager --- CHANGELOG.md | 1 + .../sdmxdl/web/spi/FailsafeDriver.java | 5 ++- .../src/main/java/sdmxdl/SdmxManager.java | 4 +- .../java/sdmxdl/file/SdmxFileManager.java | 9 +--- .../java/sdmxdl/file/spi/FileContext.java | 5 --- .../main/java/sdmxdl/file/spi/FileReader.java | 2 + .../main/java/sdmxdl/web/SdmxWebManager.java | 13 ++---- .../main/java/sdmxdl/web/spi/WebContext.java | 5 --- .../main/java/sdmxdl/web/spi/WebDriver.java | 2 + .../test/java/_test/sdmxdl/TestDriver.java | 7 +-- .../web/spi/FailsafeConnectionTest.java | 3 +- .../sdmxdl/web/spi/FailsafeDriverTest.java | 8 ++-- .../java/sdmxdl/ext/SdmxCubeUtilTest.java | 11 ++--- .../java/sdmxdl/file/SdmxFileManagerTest.java | 3 +- .../java/sdmxdl/web/SdmxWebManagerTest.java | 28 ++++++------ .../tests/sdmxdl/api/SdmxManagerAssert.java | 24 +++++----- .../tests/sdmxdl/file/FileReaderAssert.java | 11 +++-- .../java/tests/sdmxdl/web/MockedDriver.java | 2 +- .../tests/sdmxdl/web/WebDriverAssert.java | 8 ++-- .../internal/sdmxdl/cli/WebFlowOptions.java | 4 +- .../java/internal/sdmxdl/cli/WebOptions.java | 1 - .../internal/sdmxdl/cli/WebSourceOptions.java | 13 +++--- .../java/sdmxdl/cli/CheckAccessCommand.java | 8 ++-- .../java/sdmxdl/cli/FetchDataCommand.java | 2 +- .../sdmxdl/cli/ListAvailabilityCommand.java | 2 +- .../java/sdmxdl/cli/ListFeaturesCommand.java | 3 +- .../java/sdmxdl/cli/ListFlowsCommand.java | 3 +- .../cli/experimental/DebugListCommand.java | 4 +- .../cli/experimental/FetchExtraCommand.java | 2 +- sdmx-dl-cli/src/test/java/_demo/Demo.java | 5 ++- .../sdmxdl/desktop/SdmxAutoCompletion.java | 45 ++++++++++++------- .../java/sdmxdl/desktop/DataNodeFactory.java | 14 +++--- .../main/java/sdmxdl/desktop/FlowStruct.java | 5 ++- .../sdmxdl/desktop/HasSdmxProperties.java | 7 +++ .../main/java/sdmxdl/desktop/JDataSet.java | 10 ++++- .../java/sdmxdl/desktop/MainComponent.java | 15 +++++-- .../java/sdmxdl/desktop/SingleSeries.java | 4 +- .../sdmxdl/grpc/SdmxWebManagerService.java | 12 ++--- .../provider/web/RestClientSupplier.java | 3 +- .../sdmxdl/provider/web/RestConnector.java | 11 ++--- .../sdmxdl/provider/web/WebConnector.java | 3 +- .../sdmxdl/provider/web/WebDriverSupport.java | 5 ++- .../connectors/ConnectorsRestClient.java | 4 +- .../connectors/drivers/Sdmx20DriverTest.java | 4 +- .../provider/ri/file/readers/XmlReader.java | 11 ++--- .../sdmxdl/provider/ri/web/RiRestClient.java | 4 +- .../provider/ri/web/drivers/BbkDriver.java | 4 +- .../ri/web/drivers/DotStatDriver2.java | 5 ++- .../ri/web/drivers/EurostatDriver2.java | 5 ++- .../provider/ri/web/drivers/FileDriver.java | 10 ++--- .../provider/ri/web/drivers/ImfDriver2.java | 4 +- .../provider/ri/web/drivers/InseeDriver2.java | 4 +- .../provider/ri/web/drivers/NbbDriver2.java | 4 +- .../provider/ri/web/drivers/PxWebDriver.java | 6 +-- .../provider/ri/web/drivers/RngDriver.java | 2 +- .../ri/web/drivers/Sdmx21Driver2.java | 5 ++- .../ri/web/drivers/StatCanDriver.java | 10 ++--- .../ri/web/drivers/RngDriverTest.java | 4 +- .../ri/web/drivers/StatCanDriverTest.java | 7 +-- .../main/java/sdmxdl/testing/WebRequest.java | 4 ++ .../main/java/sdmxdl/testing/WebResponse.java | 2 +- 61 files changed, 237 insertions(+), 194 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd0dfd903..02d657418 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Refactor network API [#503](https://github.com/nbbrd/sdmx-dl/issues/503) - ![API] Remove dialect API [#505](https://github.com/nbbrd/sdmx-dl/issues/505) - ![API] Refactor listeners API [#506](https://github.com/nbbrd/sdmx-dl/issues/506) +- ![API] Handle languages per connection instead of per manager [#507](https://github.com/nbbrd/sdmx-dl/issues/507) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java index d7ce40dc1..8ad2e7abb 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java @@ -19,6 +19,7 @@ import lombok.AccessLevel; import lombok.NonNull; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebDriver; @@ -90,11 +91,11 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { Connection result; try { - result = delegate.connect(source, context); + result = delegate.connect(source, languages, context); } catch (IllegalArgumentException ex) { throw ex; } catch (RuntimeException ex) { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index aa342d39d..b1b5a843e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -35,9 +35,7 @@ @ThreadSafe public abstract class SdmxManager { - public abstract @NonNull Connection getConnection(@NonNull SOURCE source) throws IOException; - - public abstract @NonNull LanguagePriorityList getLanguages(); + public abstract @NonNull Connection getConnection(@NonNull SOURCE source, @NonNull LanguagePriorityList languages) throws IOException; public abstract @Nullable EventListener getOnEvent(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index ab43048fc..0f0204f59 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -52,10 +52,6 @@ public class SdmxFileManager extends SdmxManager { return builder().build(); } - @lombok.NonNull - @lombok.Builder.Default - LanguagePriorityList languages = LanguagePriorityList.ANY; - @lombok.NonNull @lombok.Builder.Default FileCaching caching = FileCaching.noOp(); @@ -73,17 +69,16 @@ public class SdmxFileManager extends SdmxManager { FileContext context = initContext(); @Override - public @NonNull Connection getConnection(@NonNull SdmxFileSource source) throws IOException { + public @NonNull Connection getConnection(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) throws IOException { FileReader reader = lookupReader(source) .orElseThrow(() -> new IOException("cannot find reader for source '" + source + "'")); - return reader.read(source, getContext()); + return reader.read(source, languages, getContext()); } private FileContext initContext() { return FileContext .builder() - .languages(languages) .onEvent(onEvent) .onError(onError) .caching(caching) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index 657f2f079..f3e404ce1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -4,7 +4,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; @@ -12,10 +11,6 @@ @lombok.Builder(toBuilder = true) public class FileContext { - @lombok.NonNull - @lombok.Builder.Default - LanguagePriorityList languages = LanguagePriorityList.ANY; - @lombok.NonNull @lombok.Builder.Default FileCaching caching = FileCaching.noOp(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java index d9a4b305e..12f48cb0e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java @@ -21,6 +21,7 @@ import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.file.SdmxFileSource; import java.io.IOException; @@ -40,6 +41,7 @@ public interface FileReader { @NonNull Connection read( @NonNull SdmxFileSource source, + @NonNull LanguagePriorityList languages, @NonNull FileContext context ) throws IOException, IllegalArgumentException; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 0864d51fc..de3da39fb 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -70,10 +70,6 @@ public class SdmxWebManager extends SdmxManager { @lombok.Singular List monitorings; - @lombok.NonNull - @lombok.Builder.Default - LanguagePriorityList languages = LanguagePriorityList.ANY; - @lombok.NonNull @lombok.Builder.Default Networking networking = Networking.getDefault(); @@ -106,21 +102,21 @@ public class SdmxWebManager extends SdmxManager { @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) WebContext context = initContext(); - public @NonNull Connection getConnection(@NonNull String name) throws IOException { + public @NonNull Connection getConnection(@NonNull String name, @NonNull LanguagePriorityList languages) throws IOException { SdmxWebSource source = lookupSource(name) .orElseThrow(() -> newMissingSource(name)); - return getConnection(source); + return getConnection(source, languages); } @Override - public @NonNull Connection getConnection(@NonNull SdmxWebSource source) throws IOException { + public @NonNull Connection getConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) throws IOException { WebDriver driver = lookupDriverById(source.getDriver()) .orElseThrow(() -> new IOException("Failed to find a suitable driver for '" + source + "'")); checkSourceProperties(source, driver); - return driver.connect(source, getContext()); + return driver.connect(source, languages, getContext()); } @NonNull @@ -178,7 +174,6 @@ private WebContext initContext() { return WebContext .builder() .caching(caching) - .languages(languages) .networking(networking) .onEvent(onEvent) .onError(onError) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index e37ebbb7f..010c48e90 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -20,7 +20,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.WebCache; @@ -34,10 +33,6 @@ @lombok.Builder(toBuilder = true) public class WebContext { - @lombok.NonNull - @lombok.Builder.Default - LanguagePriorityList languages = LanguagePriorityList.ANY; - @lombok.NonNull @lombok.Builder.Default WebCaching caching = WebCaching.noOp(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java index c9765cdf4..71d43c01a 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java @@ -21,6 +21,7 @@ import nbbrd.design.ThreadSafe; import nbbrd.service.*; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebSource; import java.io.IOException; @@ -49,6 +50,7 @@ public interface WebDriver { @NonNull Connection connect( @NonNull SdmxWebSource source, + @NonNull LanguagePriorityList languages, @NonNull WebContext context ) throws IOException, IllegalArgumentException; diff --git a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java index e765e28b9..1c083181a 100644 --- a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java +++ b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java @@ -18,6 +18,7 @@ import lombok.NonNull; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.WebDriver; @@ -46,7 +47,7 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { return TestConnection.TEST_VALID; } @@ -76,7 +77,7 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { throw new CustomException(); } @@ -106,7 +107,7 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { return null; } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java index 46a73c977..35c99709b 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java @@ -32,6 +32,7 @@ import static org.assertj.core.api.Assertions.assertThatIOException; import static org.assertj.core.api.Assertions.assertThatNoException; +import static sdmxdl.LanguagePriorityList.ANY; /** * @author Philippe Charles @@ -45,7 +46,7 @@ public void testCompliance() { SdmxWebSource source = driver.getDefaultSources().iterator().next(); ConnectionAssert.assertCompliance( - () -> FailsafeConnection.wrap(driver.connect(source, WebDriverAssert.noOpWebContext())), + () -> FailsafeConnection.wrap(driver.connect(source, ANY, WebDriverAssert.noOpWebContext())), ConnectionAssert.Sample .builder() .validFlow(RepoSamples.FLOW_REF) diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java index 0efaeb49e..b4b313bcb 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java @@ -20,6 +20,7 @@ import _test.sdmxdl.FailsafeHandler; import _test.sdmxdl.TestDriver; import org.junit.jupiter.api.Test; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.spi.WebDriver; import tests.sdmxdl.web.MockedDriver; import tests.sdmxdl.web.WebDriverAssert; @@ -28,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIOException; +import static sdmxdl.LanguagePriorityList.ANY; /** * @author Philippe Charles @@ -82,20 +84,20 @@ public void testIsAvailable() { @Test public void testConnect() throws IOException { failsafe.reset(); - assertThat(valid.connect(TestDriver.SOURCE, WebDriverAssert.noOpWebContext())) + assertThat(valid.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) .isNotNull() .isInstanceOf(FailsafeConnection.class); failsafe.assertEmpty(); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> failing.connect(TestDriver.SOURCE, WebDriverAssert.noOpWebContext())) + .isThrownBy(() -> failing.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) .withCauseInstanceOf(CustomException.class); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> nul.connect(TestDriver.SOURCE, WebDriverAssert.noOpWebContext())) + .isThrownBy(() -> nul.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) .withNoCause(); failsafe.assertUnexpectedNull("unexpected null"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java index 7961e4bb5..a7e83c717 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java @@ -19,6 +19,7 @@ import static org.assertj.core.api.Assertions.*; import static sdmxdl.Key.ALL; +import static sdmxdl.LanguagePriorityList.ANY; import static tests.sdmxdl.api.RepoSamples.*; @SuppressWarnings("ConstantConditions") @@ -50,7 +51,7 @@ public void testGetAllSeries() throws IOException { for (WebDriver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(null, FLOW_REF, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(c, null, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(c, FLOW_REF, null)); @@ -76,7 +77,7 @@ public void testGetAllSeriesWithData() throws IOException { for (WebDriver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(null, FLOW_REF, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(c, null, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(c, FLOW_REF, null)); @@ -102,7 +103,7 @@ public void testGetSeries() throws IOException { for (WebDriver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(null, FLOW_REF, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(c, null, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(c, FLOW_REF, null)); @@ -122,7 +123,7 @@ public void testGetSeriesWithData() throws IOException { for (WebDriver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(null, FLOW_REF, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(c, null, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(c, FLOW_REF, null)); @@ -142,7 +143,7 @@ public void testGetChildren() throws IOException { for (WebDriver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(null, FLOW_REF, ALL, 0)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(c, null, ALL, 0)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(c, FLOW_REF, null, 0)); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java index 29b55fd61..9f51c6b71 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java @@ -21,6 +21,7 @@ import java.io.File; import static org.assertj.core.api.Assertions.assertThatNullPointerException; +import static sdmxdl.LanguagePriorityList.ANY; /** * @author Philippe Charles @@ -41,7 +42,7 @@ public class SdmxFileManagerTest { @SuppressWarnings({"null", "ConstantConditions"}) public void test() { SdmxFileManager m = SdmxFileManager.ofServiceLoader(); - assertThatNullPointerException().isThrownBy(() -> m.getConnection(null)); + assertThatNullPointerException().isThrownBy(() -> m.getConnection(null, ANY)); } private final SdmxFileSource source = SdmxFileSource.builder().data(new File("hello")).build(); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index 173baca4b..b2a939caf 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -34,6 +34,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.*; +import static sdmxdl.LanguagePriorityList.ANY; import static sdmxdl.web.spi.WebDriver.NATIVE_RANK; import static sdmxdl.web.spi.WebDriver.WRAPPED_RANK; @@ -61,7 +62,6 @@ public void testFactories() { assertThat(o).isNotNull(); assertThat(o.getDrivers()).isEmpty(); assertThat(o.getMonitorings()).isEmpty(); - assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -74,7 +74,6 @@ public void testFactories() { assertThat(SdmxWebManager.noOp()).satisfies(o -> { assertThat(o.getDrivers()).isEmpty(); assertThat(o.getMonitorings()).isEmpty(); - assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -86,7 +85,6 @@ public void testFactories() { assertThat(SdmxWebManager.builder().driver(sampleDriver).build()).satisfies(o -> { assertThat(o.getDrivers()).containsExactly(sampleDriver); assertThat(o.getMonitorings()).isEmpty(); - assertThat(o.getLanguages()).isEqualTo(LanguagePriorityList.ANY); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -191,13 +189,13 @@ public void testGetDefaultSources() { public void testGetConnection() throws IOException { SdmxWebManager manager = SdmxWebManager.builder().driver(sampleDriver).build(); - assertThatNullPointerException().isThrownBy(() -> manager.getConnection((String) null)); + assertThatNullPointerException().isThrownBy(() -> manager.getConnection((String) null, ANY)); assertThatIOException() - .isThrownBy(() -> manager.getConnection("ko")) + .isThrownBy(() -> manager.getConnection("ko", ANY)) .as("Invalid source name"); - assertThatCode(() -> manager.getConnection(sampleSource.getId()).close()).doesNotThrowAnyException(); + assertThatCode(() -> manager.getConnection(sampleSource.getId(), ANY).close()).doesNotThrowAnyException(); WebDriver driver1 = MockedDriver .builder() @@ -217,7 +215,7 @@ public void testGetConnection() throws IOException { .customSource(SdmxWebSource.builder().id("source").driver("d2").endpointOf(sample.getName()).build()) .build(); - try (Connection c = SdmxWebManager.builder().driver(driver2).driver(driver1).build().getConnection("source")) { + try (Connection c = SdmxWebManager.builder().driver(driver2).driver(driver1).build().getConnection("source", ANY)) { // TODO: create code that verifies that driver2 is selected // assertThat(c.getDriver()).isEqualTo(driver2.getName()); } @@ -228,18 +226,18 @@ public void testGetConnection() throws IOException { public void testGetConnectionOfSource() { SdmxWebManager manager = SdmxWebManager.builder().driver(sampleDriver).build(); - assertThatNullPointerException().isThrownBy(() -> manager.getConnection((SdmxWebSource) null)); + assertThatNullPointerException().isThrownBy(() -> manager.getConnection((SdmxWebSource) null, ANY)); assertThatIOException() - .isThrownBy(() -> manager.getConnection(sampleSource.toBuilder().endpointOf("http://ko").build())) + .isThrownBy(() -> manager.getConnection(sampleSource.toBuilder().endpointOf("http://ko").build(), ANY)) .as("Invalid source endpoint"); assertThatIOException() - .isThrownBy(() -> manager.getConnection(sampleSource.toBuilder().driver("ko").build())) + .isThrownBy(() -> manager.getConnection(sampleSource.toBuilder().driver("ko").build(), ANY)) .as("Invalid source driver"); - assertThatCode(() -> manager.getConnection(sampleSource).close()).doesNotThrowAnyException(); - assertThatCode(() -> manager.getConnection(sampleSource.toBuilder().id("other").build()).close()).doesNotThrowAnyException(); + assertThatCode(() -> manager.getConnection(sampleSource, ANY).close()).doesNotThrowAnyException(); + assertThatCode(() -> manager.getConnection(sampleSource.toBuilder().id("other").build(), ANY).close()).doesNotThrowAnyException(); } @SuppressWarnings("EmptyTryBlock") @@ -254,17 +252,17 @@ public void testInvalidSourceProperties() throws IOException { .build(); SdmxWebSource noProp = sampleSource.toBuilder().id("noProp").clearProperties().build(); - try (Connection ignored = manager.getConnection(noProp)) { + try (Connection ignored = manager.getConnection(noProp, ANY)) { } assertThat(events).isEmpty(); SdmxWebSource validProp = sampleSource.toBuilder().id("validProp").build(); - try (Connection ignored = manager.getConnection(validProp)) { + try (Connection ignored = manager.getConnection(validProp, ANY)) { } assertThat(events).isEmpty(); SdmxWebSource invalidProp = sampleSource.toBuilder().id("invalidProp").property("boom", "123").build(); - try (Connection ignored = manager.getConnection(invalidProp)) { + try (Connection ignored = manager.getConnection(invalidProp, ANY)) { } assertThat(events).singleElement(as(STRING)) .contains(invalidProp.getId()) diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java index a8a497037..70477fa68 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java @@ -23,6 +23,7 @@ import java.io.IOException; +import static sdmxdl.LanguagePriorityList.ANY; import static tests.sdmxdl.api.TckUtil.nullDescriptionOf; /** @@ -44,23 +45,22 @@ public void assertCompliance(SdmxManager manager, Samp } public void assertCompliance(SoftAssertions s, SdmxManager manager, Sample sample) { - checkGetLanguages(s, manager); checkGetConnection(s, manager, sample); } - private void checkGetLanguages(SoftAssertions s, SdmxManager manager) { - s.assertThat(manager.getLanguages()).isNotNull(); - } - private void checkGetConnection(SoftAssertions s, SdmxManager manager, Sample sample) { - s.assertThatThrownBy(() -> manager.getConnection(null)) - .as(nullDescriptionOf("getConnection(SOURCE)", "source")) + s.assertThatThrownBy(() -> manager.getConnection(null, ANY)) + .as(nullDescriptionOf("getConnection(SOURCE,LANGUAGES)", "source")) .isInstanceOf(NullPointerException.class); if (sample.validSource != null) { - try (Connection conn = manager.getConnection(sample.validSource)) { + s.assertThatThrownBy(() -> manager.getConnection(sample.validSource, null)) + .as(nullDescriptionOf("getConnection(SOURCE,LANGUAGES)", "languages")) + .isInstanceOf(NullPointerException.class); + + try (Connection conn = manager.getConnection(sample.validSource, ANY)) { s.assertThat(conn) - .as("Expecting 'getConnection(SOURCE)' to return a non-null connection") + .as("Expecting 'getConnection(SOURCE,LANGUAGES)' to return a non-null connection") .isNotNull(); } catch (IOException ex) { s.fail("Not expected to raise exception", ex); @@ -68,7 +68,11 @@ private void checkGetConnection(SoftAssertions s, SdmxMan } if (sample.invalidSource != null) { - s.assertThatThrownBy(() -> manager.getConnection(sample.invalidSource)) + s.assertThatThrownBy(() -> manager.getConnection(sample.invalidSource, null)) + .as(nullDescriptionOf("getConnection(SOURCE,LANGUAGES)", "languages")) + .isInstanceOf(NullPointerException.class); + + s.assertThatThrownBy(() -> manager.getConnection(sample.invalidSource, ANY)) .as("Expecting 'getConnection(SOURCE) to raise IOException on invalid name") .isInstanceOf(IOException.class); } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java index a15eabc40..9f75d5b67 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java @@ -2,11 +2,14 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; import tests.sdmxdl.api.TckUtil; +import static sdmxdl.LanguagePriorityList.ANY; + @lombok.experimental.UtilityClass public class FileReaderAssert { @@ -34,16 +37,16 @@ public void assertCompliance(SoftAssertions s, FileReader reader, Sample sample) } private static void checkRead(SoftAssertions s, FileReader reader, Sample sample) { - s.assertThatThrownBy(() -> reader.read(null, sample.context)) + s.assertThatThrownBy(() -> reader.read(null, ANY, sample.context)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> reader.read(sample.validSource, null)) + s.assertThatThrownBy(() -> reader.read(sample.validSource, ANY, null)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> reader.read(sample.invalidSource, sample.context)) + s.assertThatThrownBy(() -> reader.read(sample.invalidSource, ANY, sample.context)) .isInstanceOf(IllegalArgumentException.class); - try (Connection conn = reader.read(sample.validSource, sample.context)) { + try (Connection conn = reader.read(sample.validSource, ANY, sample.context)) { s.assertThat(conn).isNotNull(); } catch (Exception ex) { s.fail("Not expected to raise exception", ex); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java index a963112db..2ea006e1e 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java @@ -36,7 +36,7 @@ public final class MockedDriver implements WebDriver { private final Collection customSources; @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { checkSource(source); return repos diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java index 86d22f511..1351218ef 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java @@ -5,6 +5,7 @@ import sdmxdl.web.spi.WebDriver; import static org.assertj.core.api.Assertions.*; +import static sdmxdl.LanguagePriorityList.ANY; @lombok.experimental.UtilityClass public class WebDriverAssert { @@ -28,10 +29,11 @@ public void assertCompliance(WebDriver d) { assertThat(d.getId()).isNotBlank(); - assertThatNullPointerException().isThrownBy(() -> d.connect(null, context)); - assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, null)); + assertThatNullPointerException().isThrownBy(() -> d.connect(null, ANY, context)); + assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, null, context)); + assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, ANY, null)); - assertThatIllegalArgumentException().isThrownBy(() -> d.connect(invalidSource, context)); + assertThatIllegalArgumentException().isThrownBy(() -> d.connect(invalidSource, ANY, context)); assertThat(d.getDefaultSources()).allSatisfy(o -> checkSource(o, d)); diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java index 20a1cdbd7..f93e46948 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java @@ -39,13 +39,13 @@ public class WebFlowOptions extends WebSourceOptions { private DataflowRef flow; public DataStructure loadStructure(SdmxWebManager manager) throws IOException { - try (Connection conn = open(manager)) { + try (Connection conn = open(manager, getLangs())) { return conn.getStructure(getFlow()); } } public DataSet loadSeries(SdmxWebManager manager, Key key, DataDetail detail) throws IOException { - try (Connection conn = open(manager)) { + try (Connection conn = open(manager, getLangs())) { return conn.getData(getFlow(), DataQuery.builder().key(key).detail(detail).build()); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 9a57e3fb3..35c8ea584 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -105,7 +105,6 @@ public SdmxWebManager loadManager() throws IOException { return defaultWebManager.get() .toBuilder() - .languages(langs) .onEvent(getEventListener()) .onError(getErrorListener()) .customSources(customSources.get()) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java index 71b8b03e9..038434ee8 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java @@ -20,6 +20,7 @@ import sdmxdl.Connection; import sdmxdl.Dataflow; import sdmxdl.Feature; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -41,18 +42,18 @@ public class WebSourceOptions extends WebNetOptions { ) private String source; - public Connection open(SdmxWebManager manager) throws IOException { - return manager.getConnection(getSource()); + public Connection open(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + return manager.getConnection(getSource(), languages); } - public Set loadFeatures(SdmxWebManager manager) throws IOException { - try (Connection conn = open(manager)) { + public Set loadFeatures(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + try (Connection conn = open(manager, languages)) { return conn.getSupportedFeatures(); } } - public Collection loadFlows(SdmxWebManager manager) throws IOException { - try (Connection conn = open(manager)) { + public Collection loadFlows(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + try (Connection conn = open(manager, languages)) { return conn.getFlows(); } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java index 0f80cf02e..734a375fb 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java @@ -22,10 +22,10 @@ import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import lombok.AccessLevel; import lombok.NonNull; -import nbbrd.io.text.Formatter; import org.checkerframework.checker.nullness.qual.Nullable; import picocli.CommandLine; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -71,7 +71,7 @@ private CsvTable getTable() { private Stream getRows() throws IOException { SdmxWebManager manager = web.loadManager(); Stream sources = web.isAllSources() ? WebSourcesOptions.getAllSourceNames(manager) : web.getSources().stream(); - return sort.applySort(web.applyParallel(sources).map(sourceName -> Access.of(manager, sourceName)), BY_SOURCE); + return sort.applySort(web.applyParallel(sources).map(sourceName -> Access.of(manager, web.getLangs(), sourceName)), BY_SOURCE); } private static String formatDuration(Duration o) { @@ -84,8 +84,8 @@ private static String formatDuration(Duration o) { @lombok.Value private static class Access { - static @NonNull Access of(@NonNull SdmxWebManager manager, @NonNull String source) { - try (Connection conn = manager.getConnection(source)) { + static @NonNull Access of(@NonNull SdmxWebManager manager, @NonNull LanguagePriorityList languages, @NonNull String source) { + try (Connection conn = manager.getConnection(source, languages)) { Clock clock = Clock.systemDefaultZone(); Instant start = clock.instant(); conn.testConnection(); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java index 92639f109..131a3d70f 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java @@ -70,7 +70,7 @@ private void writeHead(Csv.Writer w) throws IOException { } private void writeBody(Csv.Writer w) throws IOException { - try (Connection conn = web.loadManager().getConnection(web.getSource())) { + try (Connection conn = web.loadManager().getConnection(web.getSource(), web.getLangs())) { DataStructure dsd = conn.getStructure(web.getFlow()); getBodyFormatter(dsd, format).getFormatter(dsd).formatCsv(getSortedSeries(conn, web), w); } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAvailabilityCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAvailabilityCommand.java index 4ba4ea74d..87a8263fd 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAvailabilityCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAvailabilityCommand.java @@ -65,7 +65,7 @@ private void writeHead(Csv.Writer w) throws IOException { } private void writeBody(Csv.Writer w) throws IOException { - try (Connection conn = web.loadManager().getConnection(web.getSource())) { + try (Connection conn = web.loadManager().getConnection(web.getSource(), web.getLangs())) { try (Stream children = SdmxCubeUtil.getChildren(conn, web.getFlow(), web.getKey(), dimensionIndex)) { Iterator iterator = sort.applySort(children, Comparator.naturalOrder()).iterator(); while (iterator.hasNext()) { diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFeaturesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFeaturesCommand.java index 3dd604c5d..e45f91072 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFeaturesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFeaturesCommand.java @@ -20,7 +20,6 @@ import internal.sdmxdl.cli.WebSourceOptions; import internal.sdmxdl.cli.ext.CsvTable; import internal.sdmxdl.cli.ext.RFC4180OutputOptions; -import nbbrd.io.text.Formatter; import picocli.CommandLine; import sdmxdl.Feature; @@ -58,7 +57,7 @@ private CsvTable getTable() { } private Stream getRows() throws IOException { - return sort.applySort(web.loadFeatures(web.loadManager()), BY_NAME); + return sort.applySort(web.loadFeatures(web.loadManager(), web.getLangs()), BY_NAME); } private static final Comparator BY_NAME = Comparator.comparing(Enum::name); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java index 94c67d4cb..09a1a2d0e 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java @@ -20,7 +20,6 @@ import internal.sdmxdl.cli.WebSourceOptions; import internal.sdmxdl.cli.ext.CsvTable; import internal.sdmxdl.cli.ext.RFC4180OutputOptions; -import nbbrd.io.text.Formatter; import picocli.CommandLine; import sdmxdl.Dataflow; import sdmxdl.format.csv.SdmxCsvFields; @@ -60,6 +59,6 @@ private CsvTable getTable() { } private Stream getRows() throws IOException { - return sort.applySort(web.loadFlows(web.loadManager()), WebSourceOptions.FLOWS_BY_REF); + return sort.applySort(web.loadFlows(web.loadManager(), web.getLangs()), WebSourceOptions.FLOWS_BY_REF); } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java index 3a4952f5f..57b3fa21c 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java @@ -69,7 +69,7 @@ private static Sources fromWebSources(Collection value) { @Command public void flows(@Mixin WebSourceOptions web, @ArgGroup(validate = false, headingKey = "debug") DebugOutputOptions out) throws Exception { - nonNull(out).dumpAll(fromDataflows(web.loadFlows(web.loadManager()))); + nonNull(out).dumpAll(fromDataflows(web.loadFlows(web.loadManager(), web.getLangs()))); } private static Flows fromDataflows(Collection value) { @@ -86,7 +86,7 @@ public void keys(@Mixin WebFlowOptions web, @ArgGroup(validate = false, headingK @Command public void features(@Mixin WebSourceOptions web, @ArgGroup(validate = false, headingKey = "debug") DebugOutputOptions out) throws Exception { - nonNull(out).dumpAll(fromFeatures(web.loadFeatures(web.loadManager()))); + nonNull(out).dumpAll(fromFeatures(web.loadFeatures(web.loadManager(), web.getLangs()))); } private static Features fromFeatures(Collection value) { diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java index 9159e07b0..0677ed8bb 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java @@ -71,7 +71,7 @@ private CsvTable getTable() { private Stream getRows() throws IOException { SdmxWebManager manager = web.loadManager(); - try (Connection conn = web.open(manager)) { + try (Connection conn = web.open(manager, web.getLangs())) { DataStructure dsd = conn.getStructure(web.getFlow()); SeriesMetaFactory factory = SeriesMetaFactory.getDefault(dsd); diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index 42321e3a9..bcd91296b 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -8,6 +8,8 @@ import java.io.IOException; +import static sdmxdl.LanguagePriorityList.ANY; + public class Demo { @nbbrd.design.Demo @@ -16,11 +18,10 @@ public static void main(String[] args) throws IOException { SdmxWebManager manager = SdmxWebManager.ofServiceLoader() .toBuilder() .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) - .languages(LanguagePriorityList.ANY) .onEvent(Demo::printEvent) .build(); - try (Connection ecb = manager.getConnection("ECB")) { + try (Connection ecb = manager.getConnection("ECB", ANY)) { DataflowRef exr = DataflowRef.parse("EXR"); System.out.println(ecb.getFlow(exr).getName()); diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index c97a94355..5783a6795 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -63,20 +63,20 @@ public abstract class SdmxAutoCompletion { public abstract ListCellRenderer getRenderer(); - public static SdmxAutoCompletion onWebSource(SdmxWebManager manager) { - return new WebSourceCompletion(manager); + public static SdmxAutoCompletion onWebSource(SdmxWebManager manager, LanguagePriorityList languages) { + return new WebSourceCompletion(manager, languages); } - public static SdmxAutoCompletion onDataflow(SdmxManager manager, Supplier source, ConcurrentMap cache) { - return new DataflowCompletion<>(manager, source, cache); + public static SdmxAutoCompletion onDataflow(SdmxManager manager, LanguagePriorityList languages, Supplier source, ConcurrentMap cache) { + return new DataflowCompletion<>(manager, languages, source, cache); } - public static SdmxAutoCompletion onDimension(SdmxManager manager, Supplier source, Supplier flowRef, ConcurrentMap cache) { - return new DimensionCompletion<>(manager, source, flowRef, cache); + public static SdmxAutoCompletion onDimension(SdmxManager manager, LanguagePriorityList languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + return new DimensionCompletion<>(manager, languages, source, flowRef, cache); } - public static SdmxAutoCompletion onAttribute(SdmxManager manager, Supplier source, Supplier flowRef, ConcurrentMap cache) { - return new AttributeCompletion<>(manager, source, flowRef, cache); + public static SdmxAutoCompletion onAttribute(SdmxManager manager, LanguagePriorityList languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + return new AttributeCompletion<>(manager, languages, source, flowRef, cache); } @lombok.AllArgsConstructor @@ -85,6 +85,9 @@ private static final class WebSourceCompletion extends SdmxAutoCompletion { @lombok.NonNull private final SdmxWebManager manager; + @lombok.NonNull + private final LanguagePriorityList languages; + @Override public AutoCompletionSource getSource() { return ExtAutoCompletionSource @@ -100,7 +103,7 @@ public ListCellRenderer getRenderer() { return new CustomListCellRenderer() { @Override protected String getValueAsString(SdmxWebSource value) { - return value.getId() + ": " + manager.getLanguages().select(value.getNames()); + return value.getId() + ": " + languages.select(value.getNames()); } @Override @@ -125,8 +128,7 @@ private List filterAndSort(List list, String term) private Predicate getFilter(String term) { Predicate filter = ExtAutoCompletionSource.basicFilter(term); - LanguagePriorityList langs = manager.getLanguages(); - return value -> filter.test(langs.select(value.getNames())) + return value -> filter.test(languages.select(value.getNames())) || filter.test(value.getId()) || value.getAliases().stream().anyMatch(filter); } @@ -138,6 +140,9 @@ private static final class DataflowCompletion extends Sdmx @lombok.NonNull private final SdmxManager manager; + @lombok.NonNull + private final LanguagePriorityList languages; + @lombok.NonNull private final Supplier source; @@ -161,7 +166,7 @@ public ListCellRenderer getRenderer() { } private List load(String term) throws Exception { - try (Connection c = manager.getConnection(source.get())) { + try (Connection c = manager.getConnection(source.get(), languages)) { return new ArrayList<>(c.getFlows()); } } @@ -179,7 +184,7 @@ private List filterAndSort(List values, String term) { } private String getCacheKey(String term) { - return "Dataflow" + source.get() + manager.getLanguages(); + return "Dataflow" + source.get() + languages; } } @@ -189,6 +194,9 @@ private static final class DimensionCompletion extends Sdm @lombok.NonNull private final SdmxManager manager; + @lombok.NonNull + private final LanguagePriorityList languages; + @lombok.NonNull private final Supplier source; @@ -215,7 +223,7 @@ public ListCellRenderer getRenderer() { } private List load(String term) throws Exception { - try (Connection c = manager.getConnection(source.get())) { + try (Connection c = manager.getConnection(source.get(), languages)) { return new ArrayList<>(c.getStructure(flowRef.get()).getDimensions()); } } @@ -233,7 +241,7 @@ private List filterAndSort(List values, String term) { } private String getCacheKey(String term) { - return "Dimension" + source.get() + flowRef.get() + manager.getLanguages(); + return "Dimension" + source.get() + flowRef.get() + languages; } } @@ -243,6 +251,9 @@ private static final class AttributeCompletion extends Sdm @lombok.NonNull private final SdmxManager manager; + @lombok.NonNull + private final LanguagePriorityList languages; + @lombok.NonNull private final Supplier source; @@ -269,7 +280,7 @@ public ListCellRenderer getRenderer() { } private List load(String term) throws Exception { - try (Connection c = manager.getConnection(source.get())) { + try (Connection c = manager.getConnection(source.get(), languages)) { return new ArrayList<>(c.getStructure(flowRef.get()).getAttributes()); } } @@ -287,7 +298,7 @@ private List filterAndSort(List values, String term) { } private String getCacheKey(String term) { - return "Attribute" + source.get() + flowRef.get() + manager.getLanguages(); + return "Attribute" + source.get() + flowRef.get() + languages; } } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java index a0c498479..21a2cc94d 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java @@ -1,10 +1,7 @@ package sdmxdl.desktop; import internal.sdmxdl.desktop.DynamicTree; -import sdmxdl.Connection; -import sdmxdl.DataStructure; -import sdmxdl.Dimension; -import sdmxdl.Key; +import sdmxdl.*; import sdmxdl.ext.SdmxCubeUtil; import sdmxdl.web.SdmxWebManager; @@ -19,6 +16,7 @@ class DataNodeFactory implements DynamicTree.NodeFactory { private final Supplier manager; + private final Supplier languages; @Override public boolean isLeaf(Object userObject) { @@ -29,16 +27,16 @@ public boolean isLeaf(Object userObject) { public List getChildren(Object userObject) throws Exception { if (userObject instanceof DataSourceRef) { DataSourceRef dataSourceRef = (DataSourceRef) userObject; - return getChildren(manager.get(), dataSourceRef, Key.ALL); + return getChildren(manager.get(), languages.get(), dataSourceRef, Key.ALL); } else if (userObject instanceof DataSetRef) { DataSetRef dataSetRef = (DataSetRef) userObject; - return getChildren(manager.get(), dataSetRef.getDataSourceRef(), dataSetRef.getKey()); + return getChildren(manager.get(), languages.get(), dataSetRef.getDataSourceRef(), dataSetRef.getKey()); } return Collections.emptyList(); } - private static List getChildren(SdmxWebManager manager, DataSourceRef dataSourceRef, Key key) throws IOException { - try (Connection conn = manager.getConnection(dataSourceRef.getSource())) { + private static List getChildren(SdmxWebManager manager, LanguagePriorityList languages, DataSourceRef dataSourceRef, Key key) throws IOException { + try (Connection conn = manager.getConnection(dataSourceRef.getSource(), languages)) { DataStructure dsd = conn.getStructure(dataSourceRef.getFlow()); List dimensionList = dsd.getDimensionList(); Key.Builder builder = Key.builder(dsd); diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java index aa0753dfb..a9ece0962 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java @@ -4,6 +4,7 @@ import sdmxdl.Connection; import sdmxdl.DataStructure; import sdmxdl.Dataflow; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -15,8 +16,8 @@ public class FlowStruct { @NonNull DataStructure dataStructure; - public static FlowStruct load(SdmxWebManager manager, DataSourceRef ref) throws IOException { - try (Connection conn = manager.getConnection(ref.getSource())) { + public static FlowStruct load(SdmxWebManager manager, LanguagePriorityList languages, DataSourceRef ref) throws IOException { + try (Connection conn = manager.getConnection(ref.getSource(), languages)) { return new FlowStruct(conn.getFlow(ref.getFlow()), conn.getStructure(ref.getFlow())); } } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java index aac915ff1..b58cf95a9 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java @@ -1,6 +1,7 @@ package sdmxdl.desktop; import lombok.NonNull; +import sdmxdl.LanguagePriorityList; import sdmxdl.SdmxManager; public interface HasSdmxProperties> { @@ -10,4 +11,10 @@ public interface HasSdmxProperties> { @NonNull M getSdmxManager(); void setSdmxManager(@NonNull M sdmxManager); + + String LANGUAGES_PROPERTY = "languages"; + + @NonNull LanguagePriorityList getLanguages(); + + void setLanguages(@NonNull LanguagePriorityList languages); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java index 89be31641..f74360249 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java @@ -15,6 +15,7 @@ import org.jfree.data.time.*; import org.jfree.data.xy.IntervalXYDataset; import sdmxdl.Attribute; +import sdmxdl.LanguagePriorityList; import sdmxdl.Obs; import sdmxdl.web.SdmxWebManager; @@ -44,6 +45,13 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { firePropertyChange(SDMX_MANAGER_PROPERTY, this.sdmxManager, this.sdmxManager = sdmxManager); } + @lombok.Getter + private LanguagePriorityList languages = LanguagePriorityList.ANY; + + public void setLanguages(@NonNull LanguagePriorityList languages) { + firePropertyChange(LANGUAGES_PROPERTY, this.languages, this.languages = languages); + } + public static final String MODEL_PROPERTY = "model"; @lombok.Getter @@ -132,7 +140,7 @@ private void onModelChange(PropertyChangeEvent evt) { new SwingWorker() { @Override protected SingleSeries doInBackground() throws Exception { - return SingleSeries.load(getSdmxManager(), model); + return SingleSeries.load(getSdmxManager(), getLanguages(), model); } @Override diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index 6f479434c..f670ab6b5 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -62,6 +62,13 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { firePropertyChange(SDMX_MANAGER_PROPERTY, this.sdmxManager, this.sdmxManager = sdmxManager); } + @lombok.Getter + private LanguagePriorityList languages = LanguagePriorityList.ANY; + + public void setLanguages(@NonNull LanguagePriorityList languages) { + firePropertyChange(LANGUAGES_PROPERTY, this.languages, this.languages = languages); + } + public static final String DATA_SOURCES_PROPERTY = "dataSources"; @lombok.Getter @@ -172,7 +179,7 @@ private FlowStruct getFlowStruct(DataSourceRef ref) { .orElse(null); } }); - DynamicTree.enable(datasetsTree, new DataNodeFactory(this::getSdmxManager), new DefaultMutableTreeNode("root")); + DynamicTree.enable(datasetsTree, new DataNodeFactory(this::getSdmxManager, this::getLanguages), new DefaultMutableTreeNode("root")); datasetsTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -313,7 +320,7 @@ private void contentsChanged(ListDataEvent e) { @Override protected Void doInBackground() throws Exception { for (DataSourceRef dataSourceRef : JLists.asList(dataSources)) { - publish(FlowStruct.load(getSdmxManager(), dataSourceRef)); + publish(FlowStruct.load(getSdmxManager(), getLanguages(), dataSourceRef)); } return null; } @@ -331,13 +338,13 @@ private static final class AddDatasetCommand extends JCommand { public void execute(@NonNull MainComponent c) { JTextField sourceField = new JTextField(""); - SdmxAutoCompletion sourceCompletion = SdmxAutoCompletion.onWebSource(c.getSdmxManager()); + SdmxAutoCompletion sourceCompletion = SdmxAutoCompletion.onWebSource(c.getSdmxManager(), c.getLanguages()); JAutoCompletion sourceAutoCompletion = new JAutoCompletion(sourceField); sourceAutoCompletion.setSource(sourceCompletion.getSource()); sourceAutoCompletion.getList().setCellRenderer(sourceCompletion.getRenderer()); JTextField flowField = new JTextField(""); - SdmxAutoCompletion flowCompletion = SdmxAutoCompletion.onDataflow(c.getSdmxManager(), () -> c.getSdmxManager().getSources().get(sourceField.getText()), new ConcurrentHashMap<>()); + SdmxAutoCompletion flowCompletion = SdmxAutoCompletion.onDataflow(c.getSdmxManager(), c.getLanguages(), () -> c.getSdmxManager().getSources().get(sourceField.getText()), new ConcurrentHashMap<>()); JAutoCompletion flowAutoCompletion = new JAutoCompletion(flowField); flowAutoCompletion.setSource(flowCompletion.getSource()); flowAutoCompletion.getList().setCellRenderer(flowCompletion.getRenderer()); diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java index aa8b7b448..91eeb7d9c 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java @@ -17,8 +17,8 @@ class SingleSeries { @NonNull SeriesMeta meta; - public static SingleSeries load(SdmxWebManager manager, DataSetRef ref) throws IOException { - try (Connection conn = manager.getConnection(ref.getDataSourceRef().getSource())) { + public static SingleSeries load(SdmxWebManager manager, LanguagePriorityList languages, DataSetRef ref) throws IOException { + try (Connection conn = manager.getConnection(ref.getDataSourceRef().getSource(), languages)) { DataStructure dsd = conn.getStructure(ref.getDataSourceRef().getFlow()); Series series = conn.getDataStream(ref.getDataSourceRef().getFlow(), DataQuery.builder().key(ref.getKey()).detail(DataDetail.FULL).build()).findFirst().orElseThrow(RuntimeException::new); return new SingleSeries( diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java index b6df08d4c..5f031955e 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java @@ -6,6 +6,7 @@ import sdmxdl.Connection; import sdmxdl.DataflowRef; import sdmxdl.Key; +import sdmxdl.LanguagePriorityList; import sdmxdl.format.protobuf.*; import sdmxdl.format.protobuf.web.MonitorReport; import sdmxdl.format.protobuf.web.SdmxWebSource; @@ -17,6 +18,7 @@ public class SdmxWebManagerService implements sdmxdl.grpc.SdmxWebManager { private final SdmxWebManager manager = GrpcWebFactory.loadManager(); + private final LanguagePriorityList languages = LanguagePriorityList.ANY; @Override public Uni getMonitorReport(SourceRequest request) { @@ -31,7 +33,7 @@ public Uni getMonitorReport(SourceRequest request) { @Override public Uni getFlow(FlowRequest request) { - try (Connection connection = manager.getConnection(request.getSource())) { + try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Uni.createFrom() .item(connection.getFlow(DataflowRef.parse(request.getFlow()))) .map(ProtobufRepositories::fromDataflow); @@ -42,7 +44,7 @@ public Uni getFlow(FlowRequest request) { @Override public Uni getStructure(FlowRequest request) { - try (Connection connection = manager.getConnection(request.getSource())) { + try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Uni.createFrom() .item(connection.getStructure(DataflowRef.parse(request.getFlow()))) .map(ProtobufRepositories::fromDataStructure); @@ -53,7 +55,7 @@ public Uni getStructure(FlowRequest request) { @Override public Uni getData(KeyRequest request) { - try (Connection connection = manager.getConnection(request.getSource())) { + try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Uni.createFrom() .item(connection.getData(getFlowRef(request), getDataQuery(request))) .map(ProtobufRepositories::fromDataSet); @@ -72,7 +74,7 @@ public Multi getSources(Empty request) { @Override public Multi getFlows(SourceRequest request) { - try (Connection connection = manager.getConnection(request.getSource())) { + try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Multi.createFrom() .items(connection.getFlows().stream()) .map(ProtobufRepositories::fromDataflow); @@ -83,7 +85,7 @@ public Multi getFlows(SourceRequest request) { @Override public Multi getDataStream(KeyRequest request) { - try (Connection connection = manager.getConnection(request.getSource())) { + try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Multi.createFrom() .items(connection.getData(getFlowRef(request), getDataQuery(request)).getData().stream()) .map(ProtobufRepositories::fromSeries); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java index 7cee7c4de..f2e5d622c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java @@ -1,6 +1,7 @@ package sdmxdl.provider.web; import lombok.NonNull; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -9,5 +10,5 @@ @FunctionalInterface public interface RestClientSupplier { - @NonNull RestClient get(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException; + @NonNull RestClient get(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index a32fd1085..a033c2654 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -3,6 +3,7 @@ import lombok.NonNull; import sdmxdl.Connection; import sdmxdl.DataflowRef; +import sdmxdl.LanguagePriorityList; import sdmxdl.provider.Validator; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -26,16 +27,16 @@ public final class RestConnector implements WebConnector { private final Validator dataflowRefValidator = WebValidators.DEFAULT_DATAFLOW_REF_VALIDATOR; @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException { - return RestConnection.of(getClient(source, context), dataflowRefValidator, false); + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + return RestConnection.of(getClient(source, languages, context), dataflowRefValidator, false); } - private RestClient getClient(SdmxWebSource source, WebContext context) throws IOException { + private RestClient getClient(SdmxWebSource source, LanguagePriorityList languages, WebContext context) throws IOException { return CachedRestClient.of( - client.get(source, context), + client.get(source, languages, context), context.getCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, - context.getLanguages()); + languages); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java index a9c459476..8c5d1b667 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java @@ -2,6 +2,7 @@ import lombok.NonNull; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -10,5 +11,5 @@ @FunctionalInterface public interface WebConnector { - @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException; + @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java index dcc7d5072..60c3d6c5c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java @@ -19,6 +19,7 @@ import lombok.AccessLevel; import lombok.NonNull; import sdmxdl.Connection; +import sdmxdl.LanguagePriorityList; import sdmxdl.provider.Validator; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -65,10 +66,10 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { getLazySourceValidator().checkValidity(source); - return connector.connect(source, context); + return connector.connect(source, languages, context); } @Override diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java index 080ca5761..6e000c1f3 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -75,7 +75,7 @@ public interface GenericSupplier { } public static @NonNull RestClientSupplier ofSpecific(@NonNull SpecificSupplier supplier, @NonNull Supplier obsFactory) { - return (source, context) -> { + return (source, languages, context) -> { try { RestSdmxClient client = supplier.get(); client.setEndpoint(source.getEndpoint()); @@ -92,7 +92,7 @@ public interface GenericSupplier { } public static @NonNull RestClientSupplier ofGeneric(@NonNull GenericSupplier supplier, @NonNull Supplier obsFactory) { - return (source, context) -> { + return (source, languages, context) -> { RestSdmxClient client = supplier.get(source.getEndpoint(), source.getProperties()); configure(client, source, context); return new ConnectorsRestClient(Marker.of(source), client, obsFactory); diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java index 6fe13d977..4448be81b 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java @@ -22,6 +22,7 @@ import tests.sdmxdl.web.WebDriverAssert; import static org.assertj.core.api.Assertions.assertThatCode; +import static sdmxdl.LanguagePriorityList.ANY; /** * @author Philippe Charles @@ -37,6 +38,7 @@ public void testCompliance() { public void testConnect() { SdmxWebSource x = SdmxWebSource.builder().id("localhost").driver("connectors:sdmx20").endpointOf("http://localhost").build(); - assertThatCode(() -> new Sdmx20Driver().connect(x, WebDriverAssert.noOpWebContext()).close()).doesNotThrowAnyException(); + assertThatCode(() -> new Sdmx20Driver().connect(x, ANY, WebDriverAssert.noOpWebContext()).close()) + .doesNotThrowAnyException(); } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java index 20af5430c..0dec7cc3d 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -7,6 +7,7 @@ import sdmxdl.Connection; import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; +import sdmxdl.LanguagePriorityList; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.FileReader; @@ -28,26 +29,26 @@ public boolean canRead(@NonNull SdmxFileSource source) { } @Override - public @NonNull Connection read(@NonNull SdmxFileSource source, @NonNull FileContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection read(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages, @NonNull FileContext context) throws IOException, IllegalArgumentException { if (!canRead(source)) { throw new IllegalArgumentException(source.toString()); } - return new FileConnection(getClient(source, context), getDataflow(source)); + return new FileConnection(getClient(source, languages, context), getDataflow(source)); } private boolean isXmlFileName(File file) { return file.toString().toLowerCase(Locale.ROOT).endsWith(".xml"); } - private FileClient getClient(SdmxFileSource source, FileContext context) throws IOException { + private FileClient getClient(SdmxFileSource source, LanguagePriorityList languages, FileContext context) throws IOException { FileClient client = new XmlFileClient( source, - context.getLanguages(), + languages, new XmlDecoder(context.getOnEvent()), ObsParser::newDefault, context.getOnEvent() ); - return CachedFileClient.of(client, context.getCache(source), source, context.getLanguages()); + return CachedFileClient.of(client, context.getCache(source), source, languages); } private static final DataStructureRef EMPTY = DataStructureRef.of("", "", ""); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java index d63486abf..ce167128b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java @@ -46,12 +46,12 @@ @lombok.RequiredArgsConstructor public class RiRestClient implements RestClient { - public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull WebContext c, + public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull LanguagePriorityList languages, @NonNull WebContext c, @NonNull RiRestQueries queries, @NonNull RiRestParsers parsers, @NonNull Set supportedFeatures) throws IOException { return new RiRestClient( Marker.of(s), s.getEndpoint().toURL(), - c.getLanguages(), + languages, ObsParser::newDefault, RiHttpUtils.newClient(s, c), queries, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java index cc8d6ecc3..2ff435235 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -66,11 +66,11 @@ public final class BbkDriver implements WebDriver { .build()) .build(); - private static RiRestClient newClient(SdmxWebSource s, WebContext c) throws IOException { + private static RiRestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { return new RiRestClient( Marker.of(s), s.getEndpoint().toURL(), - c.getLanguages(), + languages, ObsParser::newDefault, RiHttpUtils.newClient(s, c), new BbkQueries(), diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java index 3216d35ba..5ddad2c54 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java @@ -21,6 +21,7 @@ import internal.sdmxdl.provider.ri.web.RiRestClient; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; +import sdmxdl.LanguagePriorityList; import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; @@ -99,8 +100,8 @@ public final class DotStatDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, WebContext c) throws IOException { - return RiRestClient.of(s, c, new DotStatRestQueries(), new DotStatRestParsers(), DOTSTAT_FEATURES); + private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + return RiRestClient.of(s, languages, c, new DotStatRestQueries(), new DotStatRestParsers(), DOTSTAT_FEATURES); } @SdmxFix(id = 1, category = ENDPOINT, cause = "UIS API requires auth by key in header and this is not supported yet in facade") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index 2d760f82f..a8327c5a0 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -30,6 +30,7 @@ import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; +import sdmxdl.LanguagePriorityList; import sdmxdl.format.MessageFooter; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; @@ -138,11 +139,11 @@ public final class EurostatDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, WebContext c) throws IOException { + private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { return new RiRestClient( Marker.of(s), s.getEndpoint().toURL(), - c.getLanguages(), + languages, ObsParser::newDefault, getHttpClient(s, c), new Sdmx21RestQueries(false), diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 2298d0f9f..a0b4d93b6 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -8,10 +8,7 @@ import nbbrd.io.text.Property; import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.Connection; -import sdmxdl.DataRepository; -import sdmxdl.ErrorListener; -import sdmxdl.EventListener; +import sdmxdl.*; import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; @@ -49,14 +46,13 @@ public final class FileDriver implements WebDriver { private final SdmxFileManager fileManager = SdmxFileManager.ofServiceLoader(); - private @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { + private @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { return fileManager .toBuilder() - .languages(context.getLanguages()) .onEvent(context.getOnEvent() != null ? (fileSource, marker, message) -> context.getOnEvent().accept(source, marker, message) : null) .caching(new FileCachingAdapter(context.getCaching(), source, context.getOnEvent(), context.getOnError())) .build() - .getConnection(toFileSource(source)); + .getConnection(toFileSource(source), languages); } @lombok.AllArgsConstructor diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java index 9be1305cd..9db6a0493 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java @@ -74,8 +74,8 @@ public final class ImfDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, WebContext c) throws IOException { - return RiRestClient.of(s, c, new ImfQueries(), new ImfParsers(), IMF_FEATURES); + private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + return RiRestClient.of(s, languages, c, new ImfQueries(), new ImfParsers(), IMF_FEATURES); } @SdmxFix(id = 1, category = QUERY, cause = "Data detail parameter not supported") diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index dafedd970..170fbf8f1 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -97,11 +97,11 @@ private static Dimension fixDimensionCodes(Dimension dimension, IOFunction labels = new HashMap<>(); - labels.put(LanguagePriorityList.ANY, "Data Structure"); + labels.put(ANY, "Data Structure"); labels.put(LanguagePriorityList.parse("en"), "Data Structure"); labels.put(LanguagePriorityList.parse("fr"), "Structure de données"); @@ -177,7 +178,7 @@ public void testRevisions(@TempDir File tmp) throws IOException { File x = new File(tmp, fileName); Files.copy(getResourceAsStream(StatCanDriverTest.class, fileName).orElseThrow(FileNotFoundException::new), x.toPath()); - assertThat(toSdmxRepository(x, 34100158, LanguagePriorityList.ANY).getDataSets().get(0).getData()) + assertThat(toSdmxRepository(x, 34100158, ANY).getDataSets().get(0).getData()) .has(uniqueKeys()) .have(uniqueObs()) .filteredOn(Series::getKey, Key.parse("1")) diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java index acbffea67..159602561 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java @@ -18,6 +18,7 @@ import sdmxdl.DataQuery; import sdmxdl.DataflowRef; +import sdmxdl.LanguagePriorityList; /** * @author Philippe Charles @@ -31,6 +32,9 @@ public class WebRequest { @lombok.NonNull String source; + @lombok.NonNull + LanguagePriorityList languages; + @lombok.NonNull DataflowRef flowRef; diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java index 5c86508c6..775e518c7 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java @@ -64,7 +64,7 @@ public static WebResponse of(@NonNull WebRequest request, @NonNull SdmxWebManage .request(request) .source(manager.getSources().get(request.getSource())); - try (Connection conn = manager.getConnection(request.getSource())) { + try (Connection conn = manager.getConnection(request.getSource(), request.getLanguages())) { result .flows(conn.getFlows()) .flow(conn.getFlow(request.getFlowRef())) From 7dbb77a339cce9166fb83038e3b4f69b85efacf8 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 11 Jul 2023 09:21:55 +0200 Subject: [PATCH 040/114] Simplify naming and structure --- CHANGELOG.md | 1 + .../main/java/internal/sdmxdl/NoOpCache.java | 4 +- .../java/internal/sdmxdl/NoOpCaching.java | 4 +- .../internal/sdmxdl/web/DefaultNetwork.java | 6 +- .../sdmxdl/web/DefaultSSLFactory.java | 2 +- .../sdmxdl/web/spi/DefaultNetworking.java | 2 +- .../sdmxdl/web/spi/FailsafeDriver.java | 30 +++---- sdmx-dl-api/src/main/java/module-info.java | 13 ++- ...nguagePriorityList.java => Languages.java} | 12 +-- .../src/main/java/sdmxdl/SdmxManager.java | 2 +- .../java/sdmxdl/file/SdmxFileManager.java | 23 +++--- .../main/java/sdmxdl/file/SdmxFileSource.java | 12 +-- .../java/sdmxdl/file/{ => spi}/FileCache.java | 2 +- .../java/sdmxdl/file/spi/FileCaching.java | 1 - .../java/sdmxdl/file/spi/FileContext.java | 6 +- .../file/spi/{FileReader.java => Reader.java} | 25 ++++-- .../main/java/sdmxdl/web/MonitorReport.java | 15 ++-- .../main/java/sdmxdl/web/MonitorReports.java | 13 ++- .../main/java/sdmxdl/web/SdmxWebManager.java | 82 +++++++++---------- .../main/java/sdmxdl/web/SdmxWebSource.java | 34 +++----- ...bAuthenticator.java => Authenticator.java} | 13 ++- .../web/spi/{WebDriver.java => Driver.java} | 29 +++---- .../spi/{WebMonitoring.java => Monitor.java} | 14 ++-- .../java/sdmxdl/web/{ => spi}/Network.java | 2 +- .../main/java/sdmxdl/web/spi/Networking.java | 1 - .../java/sdmxdl/web/{ => spi}/SSLFactory.java | 2 +- .../web/{ => spi}/URLConnectionFactory.java | 4 +- .../java/sdmxdl/web/{ => spi}/WebCache.java | 3 +- .../main/java/sdmxdl/web/spi/WebCaching.java | 1 - .../main/java/sdmxdl/web/spi/WebContext.java | 15 ++-- .../test/java/_test/sdmxdl/TestDriver.java | 38 ++++----- .../web/spi/FailsafeConnectionTest.java | 2 +- .../sdmxdl/web/spi/FailsafeDriverTest.java | 25 +++--- ...iorityListTest.java => LanguagesTest.java} | 42 +++++----- .../java/sdmxdl/ext/SdmxCubeUtilTest.java | 16 ++-- .../test/java/sdmxdl/ext/WebCacheTest.java | 2 +- .../java/sdmxdl/file/SdmxFileManagerTest.java | 2 +- .../java/sdmxdl/web/NetworkFactoryTest.java | 1 + .../java/sdmxdl/web/SdmxWebManagerTest.java | 33 ++++---- .../tests/sdmxdl/api/SdmxManagerAssert.java | 2 +- .../java/tests/sdmxdl/ext/CacheAssert.java | 2 +- .../java/tests/sdmxdl/ext/NetworkAssert.java | 2 +- .../tests/sdmxdl/file/FileReaderAssert.java | 13 ++- .../java/tests/sdmxdl/web/MockedDriver.java | 30 +++++-- .../sdmxdl/web/WebAuthenticatorAssert.java | 18 ++-- .../tests/sdmxdl/web/WebDriverAssert.java | 16 ++-- .../sdmxdl/cli/ConsoleAuthenticator.java | 12 +-- .../sdmxdl/cli/ConstantAuthenticator.java | 12 +-- .../internal/sdmxdl/cli/LangsConverter.java | 8 +- .../internal/sdmxdl/cli/NetworkOptions.java | 2 +- .../internal/sdmxdl/cli/WebNetOptions.java | 14 ++-- .../java/internal/sdmxdl/cli/WebOptions.java | 6 +- .../internal/sdmxdl/cli/WebSourceOptions.java | 8 +- .../java/sdmxdl/cli/CheckAccessCommand.java | 4 +- .../java/sdmxdl/cli/ListDriversCommand.java | 12 +-- sdmx-dl-cli/src/test/java/_demo/Demo.java | 2 +- .../sdmxdl/desktop/SdmxAutoCompletion.java | 20 ++--- .../java/sdmxdl/desktop/DataNodeFactory.java | 4 +- .../main/java/sdmxdl/desktop/FlowStruct.java | 4 +- .../sdmxdl/desktop/HasSdmxProperties.java | 6 +- .../main/java/sdmxdl/desktop/JDataSet.java | 6 +- .../java/sdmxdl/desktop/MainComponent.java | 16 ++-- .../java/sdmxdl/desktop/SingleSeries.java | 2 +- .../main/java/sdmxdl/format/DiskCache.java | 4 +- .../sdmxdl/format/DiskCachingSupport.java | 6 +- .../src/main/java/sdmxdl/format/MemCache.java | 4 +- .../java/sdmxdl/format/MemCachingSupport.java | 6 +- .../java/sdmxdl/format/ServiceSupport.java | 20 +++++ .../sdmxdl/format/xml/TextBuilder.java | 4 +- .../format/xml/XMLStreamCodelist21.java | 4 +- .../sdmxdl/format/xml/XMLStreamFlow20.java | 4 +- .../sdmxdl/format/xml/XMLStreamFlow21.java | 4 +- .../format/xml/XMLStreamMessageFooter21.java | 4 +- .../format/xml/XMLStreamStructure20.java | 2 +- .../format/xml/XMLStreamStructure21.java | 2 +- .../sdmxdl/format/xml/SdmxXmlStreams.java | 12 +-- .../sdmxdl/format/xml/TextBuilderTest.java | 5 +- .../format/xml/XMLStreamCodelist21Test.java | 4 +- .../format/xml/XMLStreamFlow20Test.java | 4 +- .../format/xml/XMLStreamFlow21Test.java | 6 +- .../xml/XMLStreamMessageFooter21Test.java | 4 +- .../format/xml/XMLStreamStructure20Test.java | 4 +- .../format/xml/XMLStreamStructure21Test.java | 2 +- .../sdmxdl/grpc/SdmxWebManagerService.java | 4 +- .../java/sdmxdl/provider/FileTypedId.java | 2 +- .../main/java/sdmxdl/provider/WebTypedId.java | 2 +- .../sdmxdl/provider/ext/DualWebCache.java | 2 +- .../provider/ext/DualWebCachingSupport.java | 4 +- .../provider/file/CachedFileClient.java | 6 +- .../sdmxdl/provider/web/CachedRestClient.java | 6 +- ...bDriverSupport.java => DriverSupport.java} | 28 +++++-- .../java/sdmxdl/provider/web/LazyNetwork.java | 6 +- .../provider/web/RestClientSupplier.java | 4 +- .../sdmxdl/provider/web/RestConnector.java | 6 +- .../provider/web/SingleNetworkingSupport.java | 12 +-- .../sdmxdl/provider/web/WebConnector.java | 4 +- .../java/sdmxdl/provider/WebTypedIdTest.java | 2 +- .../provider/web/CachedRestClientTest.java | 4 +- .../provider/connectors/Connectors.java | 2 +- .../connectors/ConnectorsRestClient.java | 4 +- .../connectors/drivers/EurostatDriver.java | 12 +-- .../connectors/drivers/ImfDriver.java | 12 +-- .../connectors/drivers/InseeDriver.java | 10 +-- .../connectors/drivers/NbbDriver.java | 10 +-- .../connectors/drivers/OecdDriver.java | 12 +-- .../connectors/drivers/Sdmx20Driver.java | 12 +-- .../connectors/drivers/Sdmx21Driver.java | 12 +-- .../provider/connectors/drivers/SeDriver.java | 12 +-- .../connectors/drivers/UisDriver.java | 10 +-- .../src/main/java/module-info.java | 4 +- .../connectors/samples/FacadeResource.java | 12 +-- .../connectors/drivers/Sdmx20DriverTest.java | 2 +- .../file/{SdmxDecoder.java => Decoder.java} | 6 +- .../sdmxdl/provider/ri/file/XmlDecoder.java | 12 +-- .../provider/ri/file/XmlFileClient.java | 6 +- .../provider/ri/file/readers/XmlReader.java | 25 ++++-- .../provider/ri/web/DotStatRestParsers.java | 8 +- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 18 ++-- .../sdmxdl/provider/ri/web/RiRestClient.java | 4 +- .../sdmxdl/provider/ri/web/RiRestParsers.java | 8 +- .../provider/ri/web/Sdmx21RestParsers.java | 8 +- .../WinPasswordVaultAuthenticator.java | 12 +-- .../provider/ri/web/drivers/BbkDriver.java | 14 ++-- .../ri/web/drivers/DotStatDriver2.java | 16 ++-- .../ri/web/drivers/EurostatDriver2.java | 18 ++-- .../provider/ri/web/drivers/FileDriver.java | 16 ++-- .../provider/ri/web/drivers/ImfDriver2.java | 16 ++-- .../provider/ri/web/drivers/InseeDriver2.java | 14 ++-- .../provider/ri/web/drivers/NbbDriver2.java | 18 ++-- .../provider/ri/web/drivers/PxWebDriver.java | 18 ++-- .../provider/ri/web/drivers/RngDriver.java | 12 +-- .../ri/web/drivers/Sdmx21Driver2.java | 14 ++-- .../ri/web/drivers/StatCanDriver.java | 26 +++--- .../ri/web/monitors/UpptimeMonitoring.java | 14 ++-- .../ri/web/monitors/UpptimeSummary.java | 2 +- .../web/monitors/UptimeRobotMonitoring.java | 14 ++-- .../internal/util/http/DefaultHttpClient.java | 2 +- .../java/internal/util/http/HttpContext.java | 2 +- .../src/main/java/module-info.java | 13 ++- .../provider/ri/file/XmlFileClientTest.java | 4 +- .../provider/ri/web/RiRestClientTest.java | 2 +- .../ri/web/Sdmx21RestParsersTest.java | 2 +- .../ri/web/drivers/NbbDriver2Test.java | 2 +- .../ri/web/drivers/RngDriverTest.java | 2 +- .../ri/web/drivers/StatCanDriverTest.java | 10 +-- .../util/http/CurlRestClientTest.java | 2 +- .../util/http/DefaultHttpClientTest.java | 2 +- .../util/http/HttpRestClientTest.java | 8 +- .../internal/util/http/JdkRestClientTest.java | 2 +- .../main/java/sdmxdl/testing/WebRequest.java | 4 +- 150 files changed, 748 insertions(+), 706 deletions(-) rename sdmx-dl-api/src/main/java/sdmxdl/{LanguagePriorityList.java => Languages.java} (90%) rename sdmx-dl-api/src/main/java/sdmxdl/file/{ => spi}/FileCache.java (98%) rename sdmx-dl-api/src/main/java/sdmxdl/file/spi/{FileReader.java => Reader.java} (74%) rename sdmx-dl-api/src/main/java/sdmxdl/web/spi/{WebAuthenticator.java => Authenticator.java} (57%) rename sdmx-dl-api/src/main/java/sdmxdl/web/spi/{WebDriver.java => Driver.java} (72%) rename sdmx-dl-api/src/main/java/sdmxdl/web/spi/{WebMonitoring.java => Monitor.java} (66%) rename sdmx-dl-api/src/main/java/sdmxdl/web/{ => spi}/Network.java (95%) rename sdmx-dl-api/src/main/java/sdmxdl/web/{ => spi}/SSLFactory.java (95%) rename sdmx-dl-api/src/main/java/sdmxdl/web/{ => spi}/URLConnectionFactory.java (81%) rename sdmx-dl-api/src/main/java/sdmxdl/web/{ => spi}/WebCache.java (96%) rename sdmx-dl-api/src/test/java/sdmxdl/{LanguagePriorityListTest.java => LanguagesTest.java} (65%) create mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/ServiceSupport.java rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/{WebDriverSupport.java => DriverSupport.java} (80%) rename sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/{SdmxDecoder.java => Decoder.java} (89%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02d657418..bbb174a1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Remove dialect API [#505](https://github.com/nbbrd/sdmx-dl/issues/505) - ![API] Refactor listeners API [#506](https://github.com/nbbrd/sdmx-dl/issues/506) - ![API] Handle languages per connection instead of per manager [#507](https://github.com/nbbrd/sdmx-dl/issues/507) +- ![API] Simplify naming and structure [#508](https://github.com/nbbrd/sdmx-dl/issues/508) - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java index 6b64aead7..30df967df 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java @@ -19,9 +19,9 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import java.time.Clock; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java index 183133367..7e5bbad13 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java @@ -4,11 +4,11 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.util.Collection; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java index 68ce799b1..2cb9db879 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java @@ -1,9 +1,9 @@ package internal.sdmxdl.web; import lombok.NonNull; -import sdmxdl.web.Network; -import sdmxdl.web.SSLFactory; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; +import sdmxdl.web.spi.URLConnectionFactory; import java.net.ProxySelector; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java index a16e110dc..cdaef4295 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java @@ -1,7 +1,7 @@ package internal.sdmxdl.web; import lombok.NonNull; -import sdmxdl.web.SSLFactory; +import sdmxdl.web.spi.SSLFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java index abb9a0b30..98d169c64 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java @@ -1,7 +1,7 @@ package internal.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.Network; +import sdmxdl.web.spi.Network; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Networking; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java index 8ad2e7abb..575d06493 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java @@ -19,10 +19,10 @@ import lombok.AccessLevel; import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.Collection; @@ -34,16 +34,16 @@ * @author Philippe Charles */ @lombok.AllArgsConstructor(access = AccessLevel.PACKAGE) -public final class FailsafeDriver implements WebDriver { +public final class FailsafeDriver implements Driver { - public static WebDriver wrap(WebDriver obj) { + public static Driver wrap(Driver obj) { if (obj instanceof FailsafeDriver) return obj; FailsafeLogging logging = FailsafeLogging.of(FailsafeDriver.class); return new FailsafeDriver(obj, logging::logUnexpectedError, logging::logUnexpectedNull); } @lombok.NonNull - private final WebDriver delegate; + private final Driver delegate; @lombok.NonNull private final BiConsumer onUnexpectedError; @@ -52,11 +52,11 @@ public static WebDriver wrap(WebDriver obj) { private final Consumer onUnexpectedNull; @Override - public @NonNull String getId() { + public @NonNull String getDriverId() { String result; try { - result = delegate.getId(); + result = delegate.getDriverId(); } catch (RuntimeException ex) { unexpectedError("while getting id", ex); return delegate.getClass().getName(); @@ -71,19 +71,19 @@ public static WebDriver wrap(WebDriver obj) { } @Override - public int getRank() { + public int getDriverRank() { try { - return delegate.getRank(); + return delegate.getDriverRank(); } catch (RuntimeException ex) { unexpectedError("while getting rank", ex); - return UNKNOWN_RANK; + return UNKNOWN_DRIVER_RANK; } } @Override - public boolean isAvailable() { + public boolean isDriverAvailable() { try { - return delegate.isAvailable(); + return delegate.isDriverAvailable(); } catch (RuntimeException ex) { unexpectedError("while getting availability", ex); return false; @@ -91,7 +91,7 @@ public boolean isAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { Connection result; try { @@ -129,11 +129,11 @@ public boolean isAvailable() { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { Collection result; try { - result = delegate.getSupportedProperties(); + result = delegate.getDriverProperties(); } catch (RuntimeException ex) { unexpectedError("while getting supported properties", ex); return Collections.emptyList(); diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index ee81b6be1..c1777f102 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -1,3 +1,8 @@ +import sdmxdl.file.spi.Reader; +import sdmxdl.web.spi.Authenticator; +import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.Monitor; + module sdmxdl.api { requires static lombok; @@ -15,10 +20,10 @@ exports sdmxdl.web.spi; uses sdmxdl.file.spi.FileCaching; - uses sdmxdl.file.spi.FileReader; + uses Reader; uses sdmxdl.web.spi.Networking; - uses sdmxdl.web.spi.WebAuthenticator; + uses Authenticator; uses sdmxdl.web.spi.WebCaching; - uses sdmxdl.web.spi.WebDriver; - uses sdmxdl.web.spi.WebMonitoring; + uses Driver; + uses Monitor; } \ No newline at end of file diff --git a/sdmx-dl-api/src/main/java/sdmxdl/LanguagePriorityList.java b/sdmx-dl-api/src/main/java/sdmxdl/Languages.java similarity index 90% rename from sdmx-dl-api/src/main/java/sdmxdl/LanguagePriorityList.java rename to sdmx-dl-api/src/main/java/sdmxdl/Languages.java index 221bb9b3d..554045bb1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/LanguagePriorityList.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Languages.java @@ -39,14 +39,14 @@ @RepresentableAsString @lombok.EqualsAndHashCode @lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) -public final class LanguagePriorityList { +public final class Languages { public static final String ANY_KEYWORD = "*"; /** * Any language. */ - public static final LanguagePriorityList ANY = LanguagePriorityList.parse(ANY_KEYWORD); + public static final Languages ANY = Languages.parse(ANY_KEYWORD); /** * Parses the given ranges to generate a priority list. @@ -60,8 +60,8 @@ public final class LanguagePriorityList { * the given {@code ranges} is ill-formed */ @StaticFactoryMethod - public static @NonNull LanguagePriorityList parse(@NonNull CharSequence ranges) throws IllegalArgumentException { - return new LanguagePriorityList(Locale.LanguageRange.parse(ranges.toString())); + public static @NonNull Languages parse(@NonNull CharSequence ranges) throws IllegalArgumentException { + return new Languages(Locale.LanguageRange.parse(ranges.toString())); } private final List list; @@ -112,14 +112,14 @@ private static String getFirstNonBlankValue(Map data) { return data .values() .stream() - .filter(LanguagePriorityList::isNonBlank) + .filter(Languages::isNonBlank) .findFirst() .orElse(null); } private static String asString(List list) { return list.stream() - .map(LanguagePriorityList::asString) + .map(Languages::asString) .collect(Collectors.joining(",")); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index b1b5a843e..b5de66c09 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -35,7 +35,7 @@ @ThreadSafe public abstract class SdmxManager { - public abstract @NonNull Connection getConnection(@NonNull SOURCE source, @NonNull LanguagePriorityList languages) throws IOException; + public abstract @NonNull Connection getConnection(@NonNull SOURCE source, @NonNull Languages languages) throws IOException; public abstract @Nullable EventListener getOnEvent(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index 0f0204f59..206d5d0c5 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -17,7 +17,7 @@ package sdmxdl.file; import internal.util.FileCachingLoader; -import internal.util.FileReaderLoader; +import internal.util.ReaderLoader; import lombok.AccessLevel; import lombok.NonNull; import nbbrd.design.StaticFactoryMethod; @@ -25,7 +25,7 @@ import sdmxdl.*; import sdmxdl.file.spi.FileCaching; import sdmxdl.file.spi.FileContext; -import sdmxdl.file.spi.FileReader; +import sdmxdl.file.spi.Reader; import java.io.IOException; import java.util.List; @@ -42,7 +42,7 @@ public class SdmxFileManager extends SdmxManager { @StaticFactoryMethod public static @NonNull SdmxFileManager ofServiceLoader() { return builder() - .readers(FileReaderLoader.load()) + .readers(ReaderLoader.load()) .caching(FileCachingLoader.load()) .build(); } @@ -52,31 +52,28 @@ public class SdmxFileManager extends SdmxManager { return builder().build(); } - @lombok.NonNull @lombok.Builder.Default - FileCaching caching = FileCaching.noOp(); + @NonNull FileCaching caching = FileCaching.noOp(); @Nullable EventListener onEvent; @Nullable ErrorListener onError; - @lombok.NonNull @lombok.Singular - List readers; + @NonNull List readers; - @lombok.NonNull @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) - FileContext context = initContext(); + @NonNull FileContext context = initLazyContext(); @Override - public @NonNull Connection getConnection(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) throws IOException { - FileReader reader = lookupReader(source) + public @NonNull Connection getConnection(@NonNull SdmxFileSource source, @NonNull Languages languages) throws IOException { + Reader reader = lookupReader(source) .orElseThrow(() -> new IOException("cannot find reader for source '" + source + "'")); return reader.read(source, languages, getContext()); } - private FileContext initContext() { + private FileContext initLazyContext() { return FileContext .builder() .onEvent(onEvent) @@ -85,7 +82,7 @@ private FileContext initContext() { .build(); } - private Optional lookupReader(SdmxFileSource source) { + private Optional lookupReader(SdmxFileSource source) { return readers.stream() .filter(reader -> reader.canRead(source)) .findFirst(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java index cf5f034df..5517e8ecf 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java @@ -31,19 +31,15 @@ @lombok.EqualsAndHashCode(callSuper = false) public class SdmxFileSource extends SdmxSource { - @lombok.NonNull - File data; + @NonNull File data; - @Nullable - File structure; + @Nullable File structure; - @NonNull - public DataflowRef asDataflowRef() { + public @NonNull DataflowRef asDataflowRef() { return DataflowRef.parse("data" + (structure != null && !structure.toString().isEmpty() ? "&struct" : "")); } - @NonNull - public static String asFlowLabel(@NonNull SdmxFileSource source) { + public static @NonNull String asFlowLabel(@NonNull SdmxFileSource source) { return source.getData().getName().replace(".xml", ""); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java similarity index 98% rename from sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java rename to sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java index 5f2708fbb..2f9785235 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/FileCache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.file; +package sdmxdl.file.spi; import internal.sdmxdl.NoOpCache; import lombok.NonNull; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java index a40304e8c..40c8af367 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -10,7 +10,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; import java.util.Collection; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index f3e404ce1..09116d700 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -4,22 +4,20 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; @lombok.Value @lombok.Builder(toBuilder = true) public class FileContext { - @lombok.NonNull @lombok.Builder.Default - FileCaching caching = FileCaching.noOp(); + @NonNull FileCaching caching = FileCaching.noOp(); @Nullable EventListener onEvent; @Nullable ErrorListener onError; public @NonNull FileCache getCache(@NonNull SdmxFileSource source) { - return getCaching().getFileCache(source, getOnEvent(), getOnError()); + return caching.getFileCache(source, onEvent, onError); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java similarity index 74% rename from sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java rename to sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java index 12f48cb0e..7300c40f0 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileReader.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java @@ -18,10 +18,9 @@ import lombok.NonNull; import nbbrd.design.ThreadSafe; -import nbbrd.service.Quantifier; -import nbbrd.service.ServiceDefinition; +import nbbrd.service.*; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.file.SdmxFileSource; import java.io.IOException; @@ -31,17 +30,27 @@ */ @ServiceDefinition( quantifier = Quantifier.MULTIPLE, - loaderName = "internal.util.FileReaderLoader" + loaderName = "internal.util.ReaderLoader" ) @ThreadSafe -public interface FileReader { +public interface Reader { + + @ServiceId + @NonNull String getReaderId(); + + @ServiceSorter(reverse = true) + int getReaderRank(); + + @ServiceFilter + boolean isReaderAvailable(); boolean canRead(@NonNull SdmxFileSource source); - @NonNull - Connection read( + @NonNull Connection read( @NonNull SdmxFileSource source, - @NonNull LanguagePriorityList languages, + @NonNull Languages languages, @NonNull FileContext context ) throws IOException, IllegalArgumentException; + + int UNKNOWN_READER_RANK = -1; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReport.java b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReport.java index 0274de83a..3373359e4 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReport.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReport.java @@ -1,23 +1,18 @@ package sdmxdl.web; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @lombok.Value @lombok.Builder(toBuilder = true) public class MonitorReport { - @lombok.NonNull - String source; + @NonNull String source; - @lombok.NonNull @lombok.Builder.Default - MonitorStatus status = MonitorStatus.UNKNOWN; + @NonNull MonitorStatus status = MonitorStatus.UNKNOWN; - @Nullable - @lombok.Builder.Default - Double uptimeRatio = null; + @Nullable Double uptimeRatio; - @Nullable - @lombok.Builder.Default - Long averageResponseTime = null; + @Nullable Long averageResponseTime; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java index d455ea4e9..256ad7f72 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java @@ -11,19 +11,16 @@ @lombok.Builder(toBuilder = true) public class MonitorReports { - @lombok.NonNull - String uriScheme; + @NonNull String uriScheme; @lombok.Singular - List reports; + @NonNull List reports; - @lombok.NonNull @lombok.Builder.Default - Instant creationTime = Instant.EPOCH; + @NonNull Instant creationTime = Instant.EPOCH; - @lombok.NonNull @lombok.Builder.Default - Instant expirationTime = Instant.MAX; + @NonNull Instant expirationTime = Instant.MAX; public boolean isExpired(@NonNull Clock clock) { return !clock.instant().isBefore(expirationTime); @@ -31,7 +28,7 @@ public boolean isExpired(@NonNull Clock clock) { public static final class Builder { - public Builder ttl(Instant creationTime, Duration ttl) { + public @NonNull Builder ttl(@NonNull Instant creationTime, @NonNull Duration ttl) { return creationTime(creationTime).expirationTime(creationTime.plus(ttl)); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index de3da39fb..61346d105 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -35,6 +35,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.toList; + /** * @author Philippe Charles */ @@ -49,11 +52,11 @@ public class SdmxWebManager extends SdmxManager { public static @NonNull SdmxWebManager ofServiceLoader() { return SdmxWebManager .builder() - .drivers(WebDriverLoader.load()) - .monitorings(WebMonitoringLoader.load()) + .drivers(DriverLoader.load()) + .monitors(MonitorLoader.load()) .networking(NetworkingLoader.load()) .caching(WebCachingLoader.load()) - .authenticators(WebAuthenticatorLoader.load()) + .authenticators(AuthenticatorLoader.load()) .build(); } @@ -62,47 +65,38 @@ public class SdmxWebManager extends SdmxManager { return SdmxWebManager.builder().build(); } - @lombok.NonNull @lombok.Singular - List drivers; + @NonNull List drivers; - @lombok.NonNull @lombok.Singular - List monitorings; + @NonNull List monitors; - @lombok.NonNull @lombok.Builder.Default - Networking networking = Networking.getDefault(); + @NonNull Networking networking = Networking.getDefault(); - @lombok.NonNull @lombok.Builder.Default - WebCaching caching = WebCaching.noOp(); + @NonNull WebCaching caching = WebCaching.noOp(); @Nullable EventListener onEvent; @Nullable ErrorListener onError; - @lombok.NonNull @lombok.Singular - List authenticators; + @NonNull List authenticators; - @lombok.NonNull @lombok.Singular - List customSources; + @NonNull List customSources; - @lombok.NonNull @lombok.Getter(lazy = true) - List defaultSources = initDefaultSources(getDrivers()); + @NonNull List defaultSources = initLazyDefaultSources(getDrivers()); - @lombok.NonNull @lombok.Getter(lazy = true) - SortedMap sources = initSourceMap(getCustomSources(), getDefaultSources()); + @NonNull SortedMap sources = initLazySourceMap(getCustomSources(), getDefaultSources()); - @lombok.NonNull @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) - WebContext context = initContext(); + @NonNull WebContext context = initLazyContext(); - public @NonNull Connection getConnection(@NonNull String name, @NonNull LanguagePriorityList languages) throws IOException { + public @NonNull Connection getConnection(@NonNull String name, @NonNull Languages languages) throws IOException { SdmxWebSource source = lookupSource(name) .orElseThrow(() -> newMissingSource(name)); @@ -110,8 +104,8 @@ public class SdmxWebManager extends SdmxManager { } @Override - public @NonNull Connection getConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) throws IOException { - WebDriver driver = lookupDriverById(source.getDriver()) + public @NonNull Connection getConnection(@NonNull SdmxWebSource source, @NonNull Languages languages) throws IOException { + Driver driver = lookupDriverById(source.getDriver()) .orElseThrow(() -> new IOException("Failed to find a suitable driver for '" + source + "'")); checkSourceProperties(source, driver); @@ -119,31 +113,29 @@ public class SdmxWebManager extends SdmxManager { return driver.connect(source, languages, getContext()); } - @NonNull - public MonitorReport getMonitorReport(@NonNull String name) throws IOException { + public @NonNull MonitorReport getMonitorReport(@NonNull String name) throws IOException { SdmxWebSource source = lookupSource(name) .orElseThrow(() -> newMissingSource(name)); return getMonitorReport(source); } - @NonNull - public MonitorReport getMonitorReport(@NonNull SdmxWebSource source) throws IOException { - URI monitor = source.getMonitor(); + public @NonNull MonitorReport getMonitorReport(@NonNull SdmxWebSource source) throws IOException { + URI monitorURI = source.getMonitor(); - if (monitor == null) { - throw new IOException("Missing monitor for '" + source + "'"); + if (monitorURI == null) { + throw new IOException("Missing monitor URI for '" + source + "'"); } - WebMonitoring monitoring = lookupMonitoring(monitor.getScheme()) + Monitor monitor = lookupMonitor(monitorURI.getScheme()) .orElseThrow(() -> new IOException("Failed to find a suitable monitoring for '" + source + "'")); - return monitoring.getReport(source, getContext()); + return monitor.getReport(source, getContext()); } - private void checkSourceProperties(SdmxWebSource source, WebDriver driver) { + private void checkSourceProperties(SdmxWebSource source, Driver driver) { if (onEvent != null) { - Collection expected = driver.getSupportedProperties(); + Collection expected = driver.getDriverProperties(); Collection found = source.getProperties().keySet(); String diff = found.stream().filter(item -> !expected.contains(item)).sorted().collect(Collectors.joining(",")); if (!diff.isEmpty()) { @@ -156,21 +148,21 @@ private Optional lookupSource(String name) { return Optional.ofNullable(getSources().get(name)); } - private Optional lookupDriverById(String id) { + private Optional lookupDriverById(String id) { return drivers .stream() - .filter(driver -> id.equals(driver.getId())) + .filter(driver -> id.equals(driver.getDriverId())) .findFirst(); } - private Optional lookupMonitoring(String uriScheme) { - return monitorings + private Optional lookupMonitor(String uriScheme) { + return monitors .stream() - .filter(monitoring -> uriScheme.equals(monitoring.getUriScheme())) + .filter(monitor -> uriScheme.equals(monitor.getMonitorUriScheme())) .findFirst(); } - private WebContext initContext() { + private WebContext initLazyContext() { return WebContext .builder() .caching(caching) @@ -181,18 +173,18 @@ private WebContext initContext() { .build(); } - private static List initDefaultSources(List drivers) { + private static List initLazyDefaultSources(List drivers) { return drivers .stream() .flatMap(driver -> driver.getDefaultSources().stream()) .filter(distinctByKey(SdmxWebSource::getId)) - .collect(Collectors.toList()); + .collect(toList()); } - private static SortedMap initSourceMap(List customSources, List defaultSources) { + private static SortedMap initLazySourceMap(List customSources, List defaultSources) { return Stream.concat(customSources.stream(), defaultSources.stream()) .flatMap(SdmxWebManager::expandAliases) - .collect(Collectors.groupingBy(SdmxWebSource::getId, TreeMap::new, reducingByFirst())); + .collect(groupingBy(SdmxWebSource::getId, TreeMap::new, reducingByFirst())); } private static Stream expandAliases(SdmxWebSource source) { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java index 8b47cbf09..7c6f080ff 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java @@ -18,7 +18,7 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.SdmxSource; import java.net.MalformedURLException; @@ -35,36 +35,28 @@ @lombok.EqualsAndHashCode(callSuper = false) public class SdmxWebSource extends SdmxSource { - @lombok.NonNull - String id; + @NonNull String id; @lombok.Singular - Map names; + @NonNull Map names; - @lombok.NonNull - String driver; + @NonNull String driver; - @lombok.NonNull - URI endpoint; + @NonNull URI endpoint; @lombok.Singular - Map properties; + @NonNull Map properties; @lombok.Singular - Set aliases; + @NonNull Set aliases; - @Nullable - URL website; + @Nullable URL website; - @Nullable - URI monitor; + @Nullable URI monitor; - @Nullable - @lombok.Builder.Default - URL monitorWebsite = null; + @Nullable URL monitorWebsite; - @NonNull - public SdmxWebSource alias(@NonNull String id) throws IllegalArgumentException { + public @NonNull SdmxWebSource alias(@NonNull String id) throws IllegalArgumentException { if (!aliases.contains(id)) { throw new IllegalArgumentException(id); } @@ -75,8 +67,8 @@ public boolean isAlias() { return aliases.contains(id); } - public @Nullable String getName(@NonNull LanguagePriorityList langs) { - return langs.select(names); + public @Nullable String getName(@NonNull Languages languages) { + return languages.select(names); } public static class Builder { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java similarity index 57% rename from sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java index 11c1c6051..dcb07915e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebAuthenticator.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java @@ -14,19 +14,18 @@ @ServiceDefinition( quantifier = Quantifier.MULTIPLE, - loaderName = "internal.util.WebAuthenticatorLoader" + loaderName = "internal.util.AuthenticatorLoader" ) @ThreadSafe -public interface WebAuthenticator { +public interface Authenticator { @ServiceId - @NonNull String getId(); + @NonNull String getAuthenticatorId(); @ServiceFilter - boolean isAvailable(); + boolean isAuthenticatorAvailable(); - @Nullable - PasswordAuthentication getPasswordAuthentication(@NonNull SdmxWebSource source) throws IOException; + @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException; - void invalidate(@NonNull SdmxWebSource source) throws IOException; + void invalidateAuthentication(@NonNull SdmxWebSource source) throws IOException; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java similarity index 72% rename from sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java index 71d43c01a..a0ca25cd2 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebDriver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java @@ -21,7 +21,7 @@ import nbbrd.design.ThreadSafe; import nbbrd.service.*; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebSource; import java.io.IOException; @@ -33,34 +33,31 @@ @ServiceDefinition( quantifier = Quantifier.MULTIPLE, wrapper = FailsafeDriver.class, - loaderName = "internal.util.WebDriverLoader" + loaderName = "internal.util.DriverLoader" ) @ThreadSafe -public interface WebDriver { +public interface Driver { @ServiceId - @NonNull String getId(); + @NonNull String getDriverId(); @ServiceSorter(reverse = true) - int getRank(); + int getDriverRank(); @ServiceFilter - boolean isAvailable(); + boolean isDriverAvailable(); - @NonNull - Connection connect( + @NonNull Connection connect( @NonNull SdmxWebSource source, - @NonNull LanguagePriorityList languages, + @NonNull Languages languages, @NonNull WebContext context ) throws IOException, IllegalArgumentException; - @NonNull - Collection getDefaultSources(); + @NonNull Collection getDefaultSources(); - @NonNull - Collection getSupportedProperties(); + @NonNull Collection getDriverProperties(); - int NATIVE_RANK = Byte.MAX_VALUE; - int WRAPPED_RANK = 0; - int UNKNOWN_RANK = -1; + int NATIVE_DRIVER_RANK = Byte.MAX_VALUE; + int WRAPPED_DRIVER_RANK = 0; + int UNKNOWN_DRIVER_RANK = -1; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java similarity index 66% rename from sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java index 726d2200c..02a6d3149 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebMonitoring.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java @@ -13,22 +13,20 @@ @ServiceDefinition( quantifier = Quantifier.MULTIPLE, - loaderName = "internal.util.WebMonitoringLoader" + loaderName = "internal.util.MonitorLoader" ) @ThreadSafe -public interface WebMonitoring { +public interface Monitor { @ServiceId - @NonNull String getId(); + @NonNull String getMonitorId(); - @NonNull - String getUriScheme(); + @NonNull String getMonitorUriScheme(); - @NonNull - MonitorReport getReport( + @NonNull MonitorReport getReport( @NonNull SdmxWebSource source, @NonNull WebContext context ) throws IOException, IllegalArgumentException; - Marker WEB_MONITORING_MARKER = Marker.parse("WEB_MONITORING"); + Marker MONITOR_MARKER = Marker.parse("MONITOR"); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java similarity index 95% rename from sdmx-dl-api/src/main/java/sdmxdl/web/Network.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java index aadd501a3..b1de3d42c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/Network.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java @@ -1,4 +1,4 @@ -package sdmxdl.web; +package sdmxdl.web.spi; import internal.sdmxdl.web.DefaultNetwork; import lombok.NonNull; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java index 1420d9e21..c7defa530 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java @@ -5,7 +5,6 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.design.ThreadSafe; import nbbrd.service.*; -import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; import java.util.Collection; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java similarity index 95% rename from sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java index 130f73702..423ccc0a5 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SSLFactory.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java @@ -1,4 +1,4 @@ -package sdmxdl.web; +package sdmxdl.web.spi; import internal.sdmxdl.web.DefaultSSLFactory; import lombok.NonNull; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/URLConnectionFactory.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/URLConnectionFactory.java similarity index 81% rename from sdmx-dl-api/src/main/java/sdmxdl/web/URLConnectionFactory.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/URLConnectionFactory.java index 4d5f7e57b..4913e8f3b 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/URLConnectionFactory.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/URLConnectionFactory.java @@ -1,6 +1,7 @@ -package sdmxdl.web; +package sdmxdl.web.spi; import lombok.NonNull; +import nbbrd.design.StaticFactoryMethod; import java.io.IOException; import java.net.Proxy; @@ -12,6 +13,7 @@ public interface URLConnectionFactory { @NonNull URLConnection openConnection(@NonNull URL url, @NonNull Proxy proxy) throws IOException; + @StaticFactoryMethod static @NonNull URLConnectionFactory getDefault() { return URL::openConnection; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java similarity index 96% rename from sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java index 035ff4beb..1784135a1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/WebCache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.web; +package sdmxdl.web.spi; import internal.sdmxdl.NoOpCache; import lombok.NonNull; @@ -22,6 +22,7 @@ import nbbrd.design.StaticFactoryMethod; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; +import sdmxdl.web.MonitorReports; import java.time.Clock; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java index 4349ac233..eef570aef 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -11,7 +11,6 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; import java.util.Collection; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 010c48e90..805e195ed 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -20,9 +20,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.web.Network; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; import java.util.List; @@ -33,27 +31,24 @@ @lombok.Builder(toBuilder = true) public class WebContext { - @lombok.NonNull @lombok.Builder.Default - WebCaching caching = WebCaching.noOp(); + @NonNull WebCaching caching = WebCaching.noOp(); @Nullable EventListener onEvent; @Nullable ErrorListener onError; - @lombok.NonNull @lombok.Singular - List authenticators; + @NonNull List authenticators; - @lombok.NonNull @lombok.Builder.Default - Networking networking = Networking.getDefault(); + @NonNull Networking networking = Networking.getDefault(); public @NonNull WebCache getCache(@NonNull SdmxWebSource source) { - return getCaching().getWebCache(source, getOnEvent(), getOnError()); + return caching.getWebCache(source, onEvent, onError); } public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { - return getNetworking().getNetwork(source); + return networking.getNetwork(source); } } diff --git a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java index 1c083181a..87da4585d 100644 --- a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java +++ b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java @@ -18,10 +18,10 @@ import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.util.Collection; import java.util.Collections; @@ -29,25 +29,25 @@ /** * @author Philippe Charles */ -public enum TestDriver implements WebDriver { +public enum TestDriver implements Driver { VALID { @Override - public @NonNull String getId() { + public @NonNull String getDriverId() { return "valid"; } @Override - public int getRank() { - return NATIVE_RANK; + public int getDriverRank() { + return NATIVE_DRIVER_RANK; } @Override - public boolean isAvailable() { + public boolean isDriverAvailable() { return true; } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { return TestConnection.TEST_VALID; } @@ -57,27 +57,27 @@ public boolean isAvailable() { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { return Collections.singletonList("hello"); } }, FAILING { @Override - public @NonNull String getId() { + public @NonNull String getDriverId() { throw new CustomException(); } @Override - public int getRank() { + public int getDriverRank() { throw new CustomException(); } @Override - public boolean isAvailable() { + public boolean isDriverAvailable() { throw new CustomException(); } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { throw new CustomException(); } @@ -87,27 +87,27 @@ public boolean isAvailable() { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { throw new CustomException(); } }, NULL { @Override - public @NonNull String getId() { + public @NonNull String getDriverId() { return null; } @Override - public int getRank() { + public int getDriverRank() { throw new UnsupportedOperationException(); } @Override - public boolean isAvailable() { + public boolean isDriverAvailable() { throw new UnsupportedOperationException(); } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { return null; } @@ -117,7 +117,7 @@ public boolean isAvailable() { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { return null; } }; diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java index 35c99709b..b3444252c 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java @@ -32,7 +32,7 @@ import static org.assertj.core.api.Assertions.assertThatIOException; import static org.assertj.core.api.Assertions.assertThatNoException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; /** * @author Philippe Charles diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java index b4b313bcb..90234b503 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java @@ -20,8 +20,7 @@ import _test.sdmxdl.FailsafeHandler; import _test.sdmxdl.TestDriver; import org.junit.jupiter.api.Test; -import sdmxdl.LanguagePriorityList; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import tests.sdmxdl.web.MockedDriver; import tests.sdmxdl.web.WebDriverAssert; @@ -29,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIOException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; /** * @author Philippe Charles @@ -47,37 +46,37 @@ public void testCompliance() { @Test public void testGetName() { failsafe.reset(); - assertThat(valid.getId()).isEqualTo("valid"); + assertThat(valid.getDriverId()).isEqualTo("valid"); failsafe.assertEmpty(); failsafe.reset(); - assertThat(failing.getId()).isEqualTo(TestDriver.FAILING.getClass().getName()); + assertThat(failing.getDriverId()).isEqualTo(TestDriver.FAILING.getClass().getName()); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); - assertThat(nul.getId()).isEqualTo(TestDriver.NULL.getClass().getName()); + assertThat(nul.getDriverId()).isEqualTo(TestDriver.NULL.getClass().getName()); failsafe.assertUnexpectedNull("unexpected null"); } @Test public void testGetRank() { failsafe.reset(); - assertThat(valid.getRank()).isEqualTo(WebDriver.NATIVE_RANK); + assertThat(valid.getDriverRank()).isEqualTo(Driver.NATIVE_DRIVER_RANK); failsafe.assertEmpty(); failsafe.reset(); - assertThat(failing.getRank()).isEqualTo(WebDriver.UNKNOWN_RANK); + assertThat(failing.getDriverRank()).isEqualTo(Driver.UNKNOWN_DRIVER_RANK); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); } @Test public void testIsAvailable() { failsafe.reset(); - assertThat(valid.isAvailable()).isTrue(); + assertThat(valid.isDriverAvailable()).isTrue(); failsafe.assertEmpty(); failsafe.reset(); - assertThat(failing.isAvailable()).isFalse(); + assertThat(failing.isDriverAvailable()).isFalse(); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); } @@ -120,15 +119,15 @@ public void testGetDefaultSources() { @Test public void testGetSupportedProperties() { failsafe.reset(); - assertThat(valid.getSupportedProperties()).containsExactly("hello"); + assertThat(valid.getDriverProperties()).containsExactly("hello"); failsafe.assertEmpty(); failsafe.reset(); - assertThat(failing.getSupportedProperties()).isEmpty(); + assertThat(failing.getDriverProperties()).isEmpty(); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); - assertThat(nul.getSupportedProperties()).isEmpty(); + assertThat(nul.getDriverProperties()).isEmpty(); failsafe.assertUnexpectedNull("unexpected null"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/LanguagePriorityListTest.java b/sdmx-dl-api/src/test/java/sdmxdl/LanguagesTest.java similarity index 65% rename from sdmx-dl-api/src/test/java/sdmxdl/LanguagePriorityListTest.java rename to sdmx-dl-api/src/test/java/sdmxdl/LanguagesTest.java index 69d79e439..f0163b19b 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/LanguagePriorityListTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/LanguagesTest.java @@ -24,45 +24,45 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.LanguagePriorityList.ANY; -import static sdmxdl.LanguagePriorityList.parse; +import static sdmxdl.Languages.ANY; +import static sdmxdl.Languages.parse; /** * @author Philippe Charles */ -public class LanguagePriorityListTest { +public class LanguagesTest { @Test @SuppressWarnings("null") public void testParse() { - Assertions.assertThat(LanguagePriorityList.parse("*")).hasToString("*"); - Assertions.assertThat(LanguagePriorityList.parse("fr")).hasToString("fr"); - Assertions.assertThat(LanguagePriorityList.parse("fr-BE")).hasToString("fr-be"); - Assertions.assertThat(LanguagePriorityList.parse("fr-BE,fr;q=0.5")).hasToString("fr-be,fr;q=0.5"); - Assertions.assertThat(LanguagePriorityList.parse("fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5")).hasToString("fr-ch,fr;q=0.9,en;q=0.8,de;q=0.7,*;q=0.5"); - assertThatIllegalArgumentException().isThrownBy(() -> LanguagePriorityList.parse("fr-BE;")); - assertThatNullPointerException().isThrownBy(() -> LanguagePriorityList.parse(null)); + Assertions.assertThat(Languages.parse("*")).hasToString("*"); + Assertions.assertThat(Languages.parse("fr")).hasToString("fr"); + Assertions.assertThat(Languages.parse("fr-BE")).hasToString("fr-be"); + Assertions.assertThat(Languages.parse("fr-BE,fr;q=0.5")).hasToString("fr-be,fr;q=0.5"); + Assertions.assertThat(Languages.parse("fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5")).hasToString("fr-ch,fr;q=0.9,en;q=0.8,de;q=0.7,*;q=0.5"); + assertThatIllegalArgumentException().isThrownBy(() -> Languages.parse("fr-BE;")); + assertThatNullPointerException().isThrownBy(() -> Languages.parse(null)); } @Test public void testEquals() { - Assertions.assertThat(LanguagePriorityList.parse("*")) - .isEqualTo(LanguagePriorityList.parse("*")) - .isEqualTo(LanguagePriorityList.ANY); + Assertions.assertThat(Languages.parse("*")) + .isEqualTo(Languages.parse("*")) + .isEqualTo(Languages.ANY); - Assertions.assertThat(LanguagePriorityList.parse("fr-BE")) - .isEqualTo(LanguagePriorityList.parse("fr-BE;q=1")) - .isEqualTo(LanguagePriorityList.parse("fr-BE")); + Assertions.assertThat(Languages.parse("fr-BE")) + .isEqualTo(Languages.parse("fr-BE;q=1")) + .isEqualTo(Languages.parse("fr-BE")); } @Test @SuppressWarnings("null") public void testLookupTag() { - Assertions.assertThat(LanguagePriorityList.parse("fr").lookupTag(Arrays.asList("fr", "nl"))).isEqualTo("fr"); - Assertions.assertThat(LanguagePriorityList.parse("fr-BE").lookupTag(Arrays.asList("fr", "nl"))).isEqualTo("fr"); - Assertions.assertThat(LanguagePriorityList.parse("fr,nl;q=0.7,en;q=0.3").lookupTag(Arrays.asList("de", "nl", "en"))).isEqualTo("nl"); - Assertions.assertThat(LanguagePriorityList.parse("fr").lookupTag(Collections.singletonList("nl"))).isNull(); - assertThatNullPointerException().isThrownBy(() -> LanguagePriorityList.parse("fr").lookupTag(null)); + Assertions.assertThat(Languages.parse("fr").lookupTag(Arrays.asList("fr", "nl"))).isEqualTo("fr"); + Assertions.assertThat(Languages.parse("fr-BE").lookupTag(Arrays.asList("fr", "nl"))).isEqualTo("fr"); + Assertions.assertThat(Languages.parse("fr,nl;q=0.7,en;q=0.3").lookupTag(Arrays.asList("de", "nl", "en"))).isEqualTo("nl"); + Assertions.assertThat(Languages.parse("fr").lookupTag(Collections.singletonList("nl"))).isNull(); + assertThatNullPointerException().isThrownBy(() -> Languages.parse("fr").lookupTag(null)); } @Test diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java index a7e83c717..9aa88e1b2 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java @@ -7,7 +7,7 @@ import sdmxdl.Key; import sdmxdl.Series; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import tests.sdmxdl.web.MockedDriver; import tests.sdmxdl.web.WebDriverAssert; @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.*; import static sdmxdl.Key.ALL; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; import static tests.sdmxdl.api.RepoSamples.*; @SuppressWarnings("ConstantConditions") @@ -40,7 +40,7 @@ public class SdmxCubeUtilTest { .key(M_FR_XXX) .build(); - private List getDrivers() { + private List getDrivers() { return Stream.of(EnumSet.noneOf(Feature.class), EnumSet.allOf(Feature.class)) .map(features -> MockedDriver.builder().repo(REPO, features).build()) .collect(Collectors.toList()); @@ -48,7 +48,7 @@ private List getDrivers() { @Test public void testGetAllSeries() throws IOException { - for (WebDriver driver : getDrivers()) { + for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { @@ -74,7 +74,7 @@ public void testGetAllSeries() throws IOException { @Test public void testGetAllSeriesWithData() throws IOException { - for (WebDriver driver : getDrivers()) { + for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { @@ -100,7 +100,7 @@ public void testGetAllSeriesWithData() throws IOException { @Test public void testGetSeries() throws IOException { - for (WebDriver driver : getDrivers()) { + for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { @@ -120,7 +120,7 @@ public void testGetSeries() throws IOException { @Test public void testGetSeriesWithData() throws IOException { - for (WebDriver driver : getDrivers()) { + for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { @@ -140,7 +140,7 @@ public void testGetSeriesWithData() throws IOException { @Test public void testGetChildren() throws IOException { - for (WebDriver driver : getDrivers()) { + for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java index fa2eb1a82..236f09576 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java @@ -1,7 +1,7 @@ package sdmxdl.ext; import org.junit.jupiter.api.Test; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import tests.sdmxdl.ext.CacheAssert; public class WebCacheTest { diff --git a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java index 9f51c6b71..ffd9add60 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java @@ -21,7 +21,7 @@ import java.io.File; import static org.assertj.core.api.Assertions.assertThatNullPointerException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; /** * @author Philippe Charles diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java index 715760957..51c46081d 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java @@ -1,6 +1,7 @@ package sdmxdl.web; import org.junit.jupiter.api.Test; +import sdmxdl.web.spi.Network; import tests.sdmxdl.ext.NetworkAssert; public class NetworkFactoryTest { diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index b2a939caf..cd7d3a3d5 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -20,10 +20,9 @@ import sdmxdl.Connection; import sdmxdl.DataRepository; import sdmxdl.Feature; -import sdmxdl.LanguagePriorityList; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebCaching; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import tests.sdmxdl.api.SdmxManagerAssert; import tests.sdmxdl.web.MockedDriver; @@ -34,9 +33,9 @@ import java.util.List; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.LanguagePriorityList.ANY; -import static sdmxdl.web.spi.WebDriver.NATIVE_RANK; -import static sdmxdl.web.spi.WebDriver.WRAPPED_RANK; +import static sdmxdl.Languages.ANY; +import static sdmxdl.web.spi.Driver.NATIVE_DRIVER_RANK; +import static sdmxdl.web.spi.Driver.WRAPPED_DRIVER_RANK; /** * @author Philippe Charles @@ -61,7 +60,7 @@ public void testFactories() { assertThat(SdmxWebManager.ofServiceLoader()).satisfies(o -> { assertThat(o).isNotNull(); assertThat(o.getDrivers()).isEmpty(); - assertThat(o.getMonitorings()).isEmpty(); + assertThat(o.getMonitors()).isEmpty(); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -73,7 +72,7 @@ public void testFactories() { assertThat(SdmxWebManager.noOp()).satisfies(o -> { assertThat(o.getDrivers()).isEmpty(); - assertThat(o.getMonitorings()).isEmpty(); + assertThat(o.getMonitors()).isEmpty(); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -84,7 +83,7 @@ public void testFactories() { assertThat(SdmxWebManager.builder().driver(sampleDriver).build()).satisfies(o -> { assertThat(o.getDrivers()).containsExactly(sampleDriver); - assertThat(o.getMonitorings()).isEmpty(); + assertThat(o.getMonitors()).isEmpty(); assertThat(o.getNetworking()).isEqualTo(Networking.getDefault()); assertThat(o.getCaching()).isEqualTo(WebCaching.noOp()); assertThat(o.getOnEvent()).isNull(); @@ -103,10 +102,10 @@ public void testGetSources() { SdmxWebSource nbbAlias = nbb.alias("bnb"); - WebDriver sdmx21 = MockedDriver + Driver sdmx21 = MockedDriver .builder() .id("sdmx21") - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .available(true) .customSource(nbb) .customSource(ecb) @@ -171,11 +170,11 @@ public void testGetSources() { public void testGetDefaultSources() { SdmxWebSource source1a = SdmxWebSource.builder().id("s1").driver("dX").endpointOf("http://abc").build(); SdmxWebSource source2 = SdmxWebSource.builder().id("s2").driver("dX").endpointOf("http://abc").build(); - WebDriver driverX = MockedDriver.builder().id("dX").rank(WRAPPED_RANK).available(true).customSource(source1a).customSource(source2).build(); + Driver driverX = MockedDriver.builder().id("dX").rank(WRAPPED_DRIVER_RANK).available(true).customSource(source1a).customSource(source2).build(); SdmxWebSource source1b = SdmxWebSource.builder().id("s1").driver("dY").endpointOf("http://xyz").build(); SdmxWebSource source3 = SdmxWebSource.builder().id("s3").driver("dY").endpointOf("http://xyz").build(); - WebDriver driverY = MockedDriver.builder().id("dY").rank(NATIVE_RANK).available(true).customSource(source1b).customSource(source3).build(); + Driver driverY = MockedDriver.builder().id("dY").rank(NATIVE_DRIVER_RANK).available(true).customSource(source1b).customSource(source3).build(); assertThat(SdmxWebManager.builder().driver(driverX).driver(driverY).build().getDefaultSources()) .containsExactly(source1a, source2, source3); @@ -197,19 +196,19 @@ public void testGetConnection() throws IOException { assertThatCode(() -> manager.getConnection(sampleSource.getId(), ANY).close()).doesNotThrowAnyException(); - WebDriver driver1 = MockedDriver + Driver driver1 = MockedDriver .builder() .id("d1") - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) .customSource(SdmxWebSource.builder().id("source").driver("d1").endpointOf(sample.getName()).build()) .build(); - WebDriver driver2 = MockedDriver + Driver driver2 = MockedDriver .builder() .id("d2") - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) .customSource(SdmxWebSource.builder().id("source").driver("d2").endpointOf(sample.getName()).build()) @@ -276,7 +275,7 @@ public void testInvalidSourceProperties() throws IOException { .driver("repoDriver") .endpointOf(sample.getName()) .build(); - private final WebDriver sampleDriver = MockedDriver + private final Driver sampleDriver = MockedDriver .builder() .id("repoDriver") .rank(0) diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java index 70477fa68..71ce42f34 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java @@ -23,7 +23,7 @@ import java.io.IOException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; import static tests.sdmxdl.api.TckUtil.nullDescriptionOf; /** diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java index 45c532791..ce48ec7a9 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.ext; import org.assertj.core.api.SoftAssertions; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.MonitorReports; import tests.sdmxdl.api.TckUtil; diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java index 4e5b84819..a0267021e 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.ext; import org.assertj.core.api.SoftAssertions; -import sdmxdl.web.Network; +import sdmxdl.web.spi.Network; import tests.sdmxdl.api.TckUtil; @lombok.experimental.UtilityClass diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java index 9f75d5b67..1b679c6a4 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java @@ -2,13 +2,12 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileContext; -import sdmxdl.file.spi.FileReader; +import sdmxdl.file.spi.Reader; import tests.sdmxdl.api.TckUtil; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; @lombok.experimental.UtilityClass public class FileReaderAssert { @@ -27,16 +26,16 @@ public static class Sample { FileContext context; } - public void assertCompliance(FileReader reader, Sample sample) { + public void assertCompliance(Reader reader, Sample sample) { TckUtil.run(s -> assertCompliance(s, reader, sample)); } - public void assertCompliance(SoftAssertions s, FileReader reader, Sample sample) { + public void assertCompliance(SoftAssertions s, Reader reader, Sample sample) { checkCanRead(s, reader, sample); checkRead(s, reader, sample); } - private static void checkRead(SoftAssertions s, FileReader reader, Sample sample) { + private static void checkRead(SoftAssertions s, Reader reader, Sample sample) { s.assertThatThrownBy(() -> reader.read(null, ANY, sample.context)) .isInstanceOf(NullPointerException.class); @@ -53,7 +52,7 @@ private static void checkRead(SoftAssertions s, FileReader reader, Sample sample } } - private static void checkCanRead(SoftAssertions s, FileReader reader, Sample sample) { + private static void checkCanRead(SoftAssertions s, Reader reader, Sample sample) { s.assertThatThrownBy(() -> reader.canRead(null)) .isInstanceOf(NullPointerException.class); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java index 2ea006e1e..7fa34d7d1 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java @@ -3,8 +3,8 @@ import lombok.NonNull; import sdmxdl.*; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.Collection; @@ -15,17 +15,14 @@ import java.util.stream.Stream; @lombok.Builder(toBuilder = true) -public final class MockedDriver implements WebDriver { +public final class MockedDriver implements Driver { - @lombok.Getter @lombok.Builder.Default private final String id = "mockedDriver"; - @lombok.Getter @lombok.Builder.Default - private final int rank = WebDriver.UNKNOWN_RANK; + private final int rank = Driver.UNKNOWN_DRIVER_RANK; - @lombok.Getter @lombok.Builder.Default private final boolean available = false; @@ -36,7 +33,22 @@ public final class MockedDriver implements WebDriver { private final Collection customSources; @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + public @NonNull String getDriverId() { + return id; + } + + @Override + public int getDriverRank() { + return rank; + } + + @Override + public boolean isDriverAvailable() { + return available; + } + + @Override + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { checkSource(source); return repos @@ -54,7 +66,7 @@ public final class MockedDriver implements WebDriver { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { return Collections.emptyList(); } @@ -68,7 +80,7 @@ private Stream generateSources() { return repos .keySet() .stream() - .map(repo -> sourceOf(repo.getName(), getId(), repo)); + .map(repo -> sourceOf(repo.getName(), getDriverId(), repo)); } public static SdmxWebSource sourceOf(String name, String driverId, DataRepository repo) { diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java index d89fdda91..23f7aa353 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java @@ -2,7 +2,7 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebAuthenticator; +import sdmxdl.web.spi.Authenticator; import tests.sdmxdl.api.TckUtil; @SuppressWarnings("ConstantConditions") @@ -15,28 +15,28 @@ public static class Sample { SdmxWebSource source; } - public void assertCompliance(WebAuthenticator actual, Sample sample) { + public void assertCompliance(Authenticator actual, Sample sample) { TckUtil.run(s -> assertCompliance(s, actual, sample)); } - public void assertCompliance(SoftAssertions s, WebAuthenticator actual, Sample sample) { + public void assertCompliance(SoftAssertions s, Authenticator actual, Sample sample) { checkGetPasswordAuthentication(s, actual, sample); checkInvalidate(s, actual, sample); } - private void checkGetPasswordAuthentication(SoftAssertions s, WebAuthenticator actual, Sample sample) { - s.assertThatThrownBy(() -> actual.getPasswordAuthentication(null)) + private void checkGetPasswordAuthentication(SoftAssertions s, Authenticator actual, Sample sample) { + s.assertThatThrownBy(() -> actual.getPasswordAuthenticationOrNull(null)) .isInstanceOf(NullPointerException.class); - s.assertThatCode(() -> actual.getPasswordAuthentication(sample.source)). + s.assertThatCode(() -> actual.getPasswordAuthenticationOrNull(sample.source)). doesNotThrowAnyException(); } - private void checkInvalidate(SoftAssertions s, WebAuthenticator actual, Sample sample) { - s.assertThatThrownBy(() -> actual.invalidate(null)) + private void checkInvalidate(SoftAssertions s, Authenticator actual, Sample sample) { + s.assertThatThrownBy(() -> actual.invalidateAuthentication(null)) .isInstanceOf(NullPointerException.class); - s.assertThatCode(() -> actual.invalidate(sample.source)) + s.assertThatCode(() -> actual.invalidateAuthentication(sample.source)) .doesNotThrowAnyException(); } } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java index 1351218ef..9493a237f 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java @@ -1,11 +1,11 @@ package tests.sdmxdl.web; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; @lombok.experimental.UtilityClass public class WebDriverAssert { @@ -15,11 +15,11 @@ public WebContext noOpWebContext() { } @SuppressWarnings("null") - public void assertCompliance(WebDriver d) { + public void assertCompliance(Driver d) { SdmxWebSource validSource = SdmxWebSource .builder() .id("valid") - .driver(d.getId()) + .driver(d.getDriverId()) .endpointOf("http://localhost") .build(); @@ -27,7 +27,7 @@ public void assertCompliance(WebDriver d) { WebContext context = WebDriverAssert.noOpWebContext(); - assertThat(d.getId()).isNotBlank(); + assertThat(d.getDriverId()).isNotBlank(); assertThatNullPointerException().isThrownBy(() -> d.connect(null, ANY, context)); assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, null, context)); @@ -40,10 +40,10 @@ public void assertCompliance(WebDriver d) { assertThat(d.getClass()).isFinal(); } - private void checkSource(SdmxWebSource o, WebDriver d) { + private void checkSource(SdmxWebSource o, Driver d) { assertThat(o.getId()).isNotBlank(); assertThat(o.getProperties()).isNotNull(); - assertThat(o.getDriver()).isEqualTo(d.getId()); - assertThat(o.getProperties().keySet()).isSubsetOf(d.getSupportedProperties()); + assertThat(o.getDriver()).isEqualTo(d.getDriverId()); + assertThat(o.getProperties().keySet()).isSubsetOf(d.getDriverProperties()); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java index b6fdc8a48..01d728b1b 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java @@ -2,7 +2,7 @@ import lombok.NonNull; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebAuthenticator; +import sdmxdl.web.spi.Authenticator; import java.io.Console; import java.io.IOError; @@ -10,24 +10,24 @@ import java.net.PasswordAuthentication; import java.util.concurrent.ConcurrentHashMap; -final class ConsoleAuthenticator implements WebAuthenticator { +final class ConsoleAuthenticator implements Authenticator { private final Console console = System.console(); private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); @Override - public @NonNull String getId() { + public @NonNull String getAuthenticatorId() { return "CONSOLE"; } @Override - public boolean isAvailable() { + public boolean isAuthenticatorAvailable() { return isConsoleAvailable(); } @Override - public PasswordAuthentication getPasswordAuthentication(SdmxWebSource source) throws IOException { + public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException { if (!isConsoleAvailable()) { throw new IOException("Console is not available"); } @@ -46,7 +46,7 @@ private boolean isConsoleAvailable() { } @Override - public void invalidate(SdmxWebSource source) { + public void invalidateAuthentication(@NonNull SdmxWebSource source) { cache.remove(source); } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java index 46ae9a782..37c526fa7 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java @@ -3,31 +3,31 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebAuthenticator; +import sdmxdl.web.spi.Authenticator; import java.net.PasswordAuthentication; @lombok.AllArgsConstructor -final class ConstantAuthenticator implements WebAuthenticator { +final class ConstantAuthenticator implements Authenticator { private final PasswordAuthentication user; @Override - public @NonNull String getId() { + public @NonNull String getAuthenticatorId() { return "CONSTANT"; } @Override - public boolean isAvailable() { + public boolean isAuthenticatorAvailable() { return true; } @Override - public @Nullable PasswordAuthentication getPasswordAuthentication(@NonNull SdmxWebSource source) { + public @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) { return user; } @Override - public void invalidate(@NonNull SdmxWebSource source) { + public void invalidateAuthentication(@NonNull SdmxWebSource source) { } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/LangsConverter.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/LangsConverter.java index a13159910..d9dddae2b 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/LangsConverter.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/LangsConverter.java @@ -17,16 +17,16 @@ package internal.sdmxdl.cli; import picocli.CommandLine; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; /** * * @author Philippe Charles */ -public final class LangsConverter implements CommandLine.ITypeConverter { +public final class LangsConverter implements CommandLine.ITypeConverter { @Override - public LanguagePriorityList convert(String string) { - return LanguagePriorityList.parse(string); + public Languages convert(String string) { + return Languages.parse(string); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java index 998461374..c19cf2835 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java @@ -6,7 +6,7 @@ import internal.sdmxdl.cli.ext.SslOptions; import nbbrd.io.curl.CurlHttpURLConnection; import picocli.CommandLine; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; @lombok.Getter @lombok.Setter diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 925f8671d..a5e402f5d 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -20,7 +20,7 @@ import internal.sdmxdl.cli.ext.AuthOptions; import internal.sdmxdl.cli.ext.CacheOptions; import internal.sdmxdl.cli.ext.VerboseOptions; -import internal.util.WebAuthenticatorLoader; +import internal.util.AuthenticatorLoader; import lombok.NonNull; import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; @@ -31,8 +31,8 @@ import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Networking; -import sdmxdl.web.spi.WebAuthenticator; import sdmxdl.web.spi.WebCaching; import javax.net.ssl.HostnameVerifier; @@ -94,18 +94,18 @@ private static URI toHttps(URI url) { : url; } - private List getAuthenticators() { + private List getAuthenticators() { AuthOptions authOptions = networkOptions.getAuthOptions(); if (authOptions.hasUsername() && authOptions.hasPassword()) { return Collections.singletonList(new ConstantAuthenticator(authOptions.getUser())); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); if (!authOptions.isNoSystemAuth()) { - result.addAll(WebAuthenticatorLoader.load()); + result.addAll(AuthenticatorLoader.load()); } if (result.isEmpty()) { ConsoleAuthenticator fallback = new ConsoleAuthenticator(); - if (fallback.isAvailable()) { + if (fallback.isAuthenticatorAvailable()) { result.add(fallback); } } @@ -177,7 +177,7 @@ private static Supplier memoize(Supplier supplier, String message, Ver } @lombok.AllArgsConstructor - private static final class SSLFactoryAdapter implements sdmxdl.web.SSLFactory { + private static final class SSLFactoryAdapter implements sdmxdl.web.spi.SSLFactory { private final @NonNull SSLFactory delegate; diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 35c8ea584..7aaa5ce27 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -26,7 +26,7 @@ import picocli.CommandLine; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.Marker; import sdmxdl.format.xml.XmlWebSource; import sdmxdl.web.SdmxWebManager; @@ -63,10 +63,10 @@ public class WebOptions { names = {"-l", "--languages"}, paramLabel = "", converter = LangsConverter.class, - defaultValue = LanguagePriorityList.ANY_KEYWORD, + defaultValue = Languages.ANY_KEYWORD, descriptionKey = "cli.sdmx.languages" ) - private LanguagePriorityList langs; + private Languages langs; @CommandLine.Option( names = {"--no-log"}, diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java index 038434ee8..7a39e2b9c 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java @@ -20,7 +20,7 @@ import sdmxdl.Connection; import sdmxdl.Dataflow; import sdmxdl.Feature; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -42,17 +42,17 @@ public class WebSourceOptions extends WebNetOptions { ) private String source; - public Connection open(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + public Connection open(SdmxWebManager manager, Languages languages) throws IOException { return manager.getConnection(getSource(), languages); } - public Set loadFeatures(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + public Set loadFeatures(SdmxWebManager manager, Languages languages) throws IOException { try (Connection conn = open(manager, languages)) { return conn.getSupportedFeatures(); } } - public Collection loadFlows(SdmxWebManager manager, LanguagePriorityList languages) throws IOException { + public Collection loadFlows(SdmxWebManager manager, Languages languages) throws IOException { try (Connection conn = open(manager, languages)) { return conn.getFlows(); } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java index 734a375fb..782a05153 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckAccessCommand.java @@ -25,7 +25,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import picocli.CommandLine; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -84,7 +84,7 @@ private static String formatDuration(Duration o) { @lombok.Value private static class Access { - static @NonNull Access of(@NonNull SdmxWebManager manager, @NonNull LanguagePriorityList languages, @NonNull String source) { + static @NonNull Access of(@NonNull SdmxWebManager manager, @NonNull Languages languages, @NonNull String source) { try (Connection conn = manager.getConnection(source, languages)) { Clock clock = Clock.systemDefaultZone(); Instant start = clock.instant(); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDriversCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDriversCommand.java index 93110399e..3514f5d65 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDriversCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDriversCommand.java @@ -21,7 +21,7 @@ import internal.sdmxdl.cli.ext.CsvUtil; import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import picocli.CommandLine; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.io.IOException; import java.util.List; @@ -45,15 +45,15 @@ public Void call() throws Exception { return null; } - private CsvTable getTable() { + private CsvTable getTable() { return CsvTable - .builderOf(WebDriver.class) - .columnOf("Name", WebDriver::getId) - .columnOf("SupportedProperties", WebDriver::getSupportedProperties, CsvUtil.DEFAULT_LIST_FORMATTER) + .builderOf(Driver.class) + .columnOf("Name", Driver::getDriverId) + .columnOf("SupportedProperties", Driver::getDriverProperties, CsvUtil.DEFAULT_LIST_FORMATTER) .build(); } - private List getRows() throws IOException { + private List getRows() throws IOException { return web.loadManager().getDrivers(); } } diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index bcd91296b..20af9c5a5 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -8,7 +8,7 @@ import java.io.IOException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; public class Demo { diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index 5783a6795..acf51aa92 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -27,8 +27,8 @@ import sdmxdl.Dimension; import sdmxdl.*; import sdmxdl.desktop.MainComponent; -import sdmxdl.web.Network; -import sdmxdl.web.SSLFactory; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -63,19 +63,19 @@ public abstract class SdmxAutoCompletion { public abstract ListCellRenderer getRenderer(); - public static SdmxAutoCompletion onWebSource(SdmxWebManager manager, LanguagePriorityList languages) { + public static SdmxAutoCompletion onWebSource(SdmxWebManager manager, Languages languages) { return new WebSourceCompletion(manager, languages); } - public static SdmxAutoCompletion onDataflow(SdmxManager manager, LanguagePriorityList languages, Supplier source, ConcurrentMap cache) { + public static SdmxAutoCompletion onDataflow(SdmxManager manager, Languages languages, Supplier source, ConcurrentMap cache) { return new DataflowCompletion<>(manager, languages, source, cache); } - public static SdmxAutoCompletion onDimension(SdmxManager manager, LanguagePriorityList languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + public static SdmxAutoCompletion onDimension(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { return new DimensionCompletion<>(manager, languages, source, flowRef, cache); } - public static SdmxAutoCompletion onAttribute(SdmxManager manager, LanguagePriorityList languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + public static SdmxAutoCompletion onAttribute(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { return new AttributeCompletion<>(manager, languages, source, flowRef, cache); } @@ -86,7 +86,7 @@ private static final class WebSourceCompletion extends SdmxAutoCompletion { private final SdmxWebManager manager; @lombok.NonNull - private final LanguagePriorityList languages; + private final Languages languages; @Override public AutoCompletionSource getSource() { @@ -141,7 +141,7 @@ private static final class DataflowCompletion extends Sdmx private final SdmxManager manager; @lombok.NonNull - private final LanguagePriorityList languages; + private final Languages languages; @lombok.NonNull private final Supplier source; @@ -195,7 +195,7 @@ private static final class DimensionCompletion extends Sdm private final SdmxManager manager; @lombok.NonNull - private final LanguagePriorityList languages; + private final Languages languages; @lombok.NonNull private final Supplier source; @@ -252,7 +252,7 @@ private static final class AttributeCompletion extends Sdm private final SdmxManager manager; @lombok.NonNull - private final LanguagePriorityList languages; + private final Languages languages; @lombok.NonNull private final Supplier source; diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java index 21a2cc94d..cba86b4ef 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java @@ -16,7 +16,7 @@ class DataNodeFactory implements DynamicTree.NodeFactory { private final Supplier manager; - private final Supplier languages; + private final Supplier languages; @Override public boolean isLeaf(Object userObject) { @@ -35,7 +35,7 @@ public List getChildren(Object userObject) throws Exception { return Collections.emptyList(); } - private static List getChildren(SdmxWebManager manager, LanguagePriorityList languages, DataSourceRef dataSourceRef, Key key) throws IOException { + private static List getChildren(SdmxWebManager manager, Languages languages, DataSourceRef dataSourceRef, Key key) throws IOException { try (Connection conn = manager.getConnection(dataSourceRef.getSource(), languages)) { DataStructure dsd = conn.getStructure(dataSourceRef.getFlow()); List dimensionList = dsd.getDimensionList(); diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java index a9ece0962..ee328f795 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java @@ -4,7 +4,7 @@ import sdmxdl.Connection; import sdmxdl.DataStructure; import sdmxdl.Dataflow; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -16,7 +16,7 @@ public class FlowStruct { @NonNull DataStructure dataStructure; - public static FlowStruct load(SdmxWebManager manager, LanguagePriorityList languages, DataSourceRef ref) throws IOException { + public static FlowStruct load(SdmxWebManager manager, Languages languages, DataSourceRef ref) throws IOException { try (Connection conn = manager.getConnection(ref.getSource(), languages)) { return new FlowStruct(conn.getFlow(ref.getFlow()), conn.getStructure(ref.getFlow())); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java index b58cf95a9..d952d1f30 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/HasSdmxProperties.java @@ -1,7 +1,7 @@ package sdmxdl.desktop; import lombok.NonNull; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.SdmxManager; public interface HasSdmxProperties> { @@ -14,7 +14,7 @@ public interface HasSdmxProperties> { String LANGUAGES_PROPERTY = "languages"; - @NonNull LanguagePriorityList getLanguages(); + @NonNull Languages getLanguages(); - void setLanguages(@NonNull LanguagePriorityList languages); + void setLanguages(@NonNull Languages languages); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java index f74360249..dc698d8fa 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java @@ -15,7 +15,7 @@ import org.jfree.data.time.*; import org.jfree.data.xy.IntervalXYDataset; import sdmxdl.Attribute; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.Obs; import sdmxdl.web.SdmxWebManager; @@ -46,9 +46,9 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { } @lombok.Getter - private LanguagePriorityList languages = LanguagePriorityList.ANY; + private Languages languages = Languages.ANY; - public void setLanguages(@NonNull LanguagePriorityList languages) { + public void setLanguages(@NonNull Languages languages) { firePropertyChange(LANGUAGES_PROPERTY, this.languages, this.languages = languages); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index f670ab6b5..cd115a819 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -16,11 +16,11 @@ import org.kordamp.ikonli.materialdesign.MaterialDesign; import org.kordamp.ikonli.swing.FontIcon; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; -import sdmxdl.web.Network; +import sdmxdl.Languages; +import sdmxdl.web.spi.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import javax.imageio.ImageIO; import javax.swing.*; @@ -63,9 +63,9 @@ public void setSdmxManager(@NonNull SdmxWebManager sdmxManager) { } @lombok.Getter - private LanguagePriorityList languages = LanguagePriorityList.ANY; + private Languages languages = Languages.ANY; - public void setLanguages(@NonNull LanguagePriorityList languages) { + public void setLanguages(@NonNull Languages languages) { firePropertyChange(LANGUAGES_PROPERTY, this.languages, this.languages = languages); } @@ -82,7 +82,7 @@ public void setDataSources(@NonNull DefaultListModel dataSources) private final JList sourcesList = new JList<>(); - private final JList driversList = new JList<>(); + private final JList driversList = new JList<>(); private final JTabbedPane main = new JTabbedPane(); @@ -203,13 +203,13 @@ public void actionPerformed(ActionEvent e) { main.putClientProperty(FlatClientProperties.TABBED_PANE_TAB_TYPE, FlatClientProperties.TABBED_PANE_TAB_TYPE_CARD); sourcesList.setCellRenderer(JLists.cellRendererOf((label, value) -> { - label.setText(nameDescription(value.getId(), value.getName(LanguagePriorityList.ANY)).render()); + label.setText(nameDescription(value.getId(), value.getName(Languages.ANY)).render()); label.setIcon(getDataSourceIcon(value.getId(), 24, sourcesList::repaint)); label.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); })); driversList.setCellRenderer(JLists.cellRendererOf((label, value) -> { - label.setText(value.getId()); + label.setText(value.getDriverId()); label.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); })); diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java index 91eeb7d9c..0b0c9589a 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java @@ -17,7 +17,7 @@ class SingleSeries { @NonNull SeriesMeta meta; - public static SingleSeries load(SdmxWebManager manager, LanguagePriorityList languages, DataSetRef ref) throws IOException { + public static SingleSeries load(SdmxWebManager manager, Languages languages, DataSetRef ref) throws IOException { try (Connection conn = manager.getConnection(ref.getDataSourceRef().getSource(), languages)) { DataStructure dsd = conn.getStructure(ref.getDataSourceRef().getFlow()); Series series = conn.getDataStream(ref.getDataSourceRef().getFlow(), DataQuery.builder().key(ref.getKey()).detail(DataDetail.FULL).build()).findFirst().orElseThrow(RuntimeException::new); diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index b27fb8a4a..3d866ae51 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -24,9 +24,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; import sdmxdl.DataRepository; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import java.io.IOException; import java.nio.file.Files; diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index ebb6bde91..240306bb6 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -6,13 +6,13 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.Marker; -import sdmxdl.file.FileCache; import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCache; import sdmxdl.file.spi.FileCaching; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.nio.file.Path; @@ -20,6 +20,8 @@ import java.util.Collection; import java.util.Collections; +@ServiceSupport(FileCaching.class) +@ServiceSupport(WebCaching.class) @lombok.Builder(toBuilder = true) public final class DiskCachingSupport implements FileCaching, WebCaching { diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java index 8f01c16b2..155899dd2 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java @@ -20,9 +20,9 @@ import nbbrd.design.VisibleForTesting; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import java.time.Clock; import java.util.HashMap; diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index 422bc419b..dd36b2f88 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -5,12 +5,12 @@ import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.time.Clock; @@ -21,6 +21,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.function.Supplier; +@ServiceSupport(FileCaching.class) +@ServiceSupport(WebCaching.class) @lombok.Builder(toBuilder = true) public final class MemCachingSupport implements FileCaching, WebCaching { diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/ServiceSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/ServiceSupport.java new file mode 100644 index 000000000..d4f886c25 --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/ServiceSupport.java @@ -0,0 +1,20 @@ +package sdmxdl.format; + +import java.lang.annotation.*; + +@Documented +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.SOURCE) +@Repeatable(ServiceSupport.List.class) +public @interface ServiceSupport { + + Class value() default Void.class; + + @Documented + @Target({ElementType.TYPE}) + @Retention(RetentionPolicy.SOURCE) + @interface List { + + ServiceSupport[] value(); + } +} diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/TextBuilder.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/TextBuilder.java index fdb21c285..555e82b0e 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/TextBuilder.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/TextBuilder.java @@ -18,7 +18,7 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import java.util.LinkedHashMap; import java.util.Map; @@ -30,7 +30,7 @@ final class TextBuilder { @lombok.NonNull - private final LanguagePriorityList ranges; + private final Languages ranges; // this map preserves insertion order but is not sortable ! private final Map data = new LinkedHashMap<>(); diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamCodelist21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamCodelist21.java index f46407cf1..4ac1c6a68 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamCodelist21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamCodelist21.java @@ -19,7 +19,7 @@ import lombok.NonNull; import sdmxdl.Codelist; import sdmxdl.CodelistRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -47,7 +47,7 @@ public final class XMLStreamCodelist21 { private final TextBuilder label; - public XMLStreamCodelist21(LanguagePriorityList languages) { + public XMLStreamCodelist21(Languages languages) { this.label = new TextBuilder(languages); } diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java index c4937d0f3..d270e900e 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java @@ -20,7 +20,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -53,7 +53,7 @@ public final class XMLStreamFlow20 { private final TextBuilder flowName; private final TextBuilder flowDescription; - public XMLStreamFlow20(LanguagePriorityList languages) { + public XMLStreamFlow20(Languages languages) { this.flowName = new TextBuilder(languages); this.flowDescription = new TextBuilder(languages); } diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java index 8567ebb8b..c4b380699 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java @@ -20,7 +20,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -54,7 +54,7 @@ public final class XMLStreamFlow21 { private final TextBuilder flowName; private final TextBuilder flowDescription; - public XMLStreamFlow21(LanguagePriorityList languages) { + public XMLStreamFlow21(Languages languages) { this.flowName = new TextBuilder(languages); this.flowDescription = new TextBuilder(languages); } diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21.java index e177872a0..fa37f39b9 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21.java @@ -2,7 +2,7 @@ import lombok.NonNull; import nbbrd.io.text.Parser; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.format.MessageFooter; import javax.xml.stream.XMLStreamException; @@ -21,7 +21,7 @@ public final class XMLStreamMessageFooter21 { private final TextBuilder label; - public XMLStreamMessageFooter21(LanguagePriorityList langs) { + public XMLStreamMessageFooter21(Languages langs) { this.label = new TextBuilder(langs); } diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java index 6402567e5..0d68baef2 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java @@ -59,7 +59,7 @@ public final class XMLStreamStructure20 { private final TextBuilder structureLabel; private final TextBuilder label; - public XMLStreamStructure20(LanguagePriorityList languages) { + public XMLStreamStructure20(Languages languages) { this.structureLabel = new TextBuilder(languages); this.label = new TextBuilder(languages); } diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java index 3a3ccd7f1..7661e5210 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java @@ -64,7 +64,7 @@ public final class XMLStreamStructure21 { private final TextBuilder structureLabel; private final TextBuilder label; - public XMLStreamStructure21(LanguagePriorityList languages) { + public XMLStreamStructure21(Languages languages) { this.structureLabel = new TextBuilder(languages); this.label = new TextBuilder(languages); } diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java index addcbf1cb..12840aae1 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java @@ -63,42 +63,42 @@ public class SdmxXmlStreams { .build(); } - public Xml.@NonNull Parser> struct20(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser> struct20(@NonNull Languages langs) { return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamStructure20(langs)::parse)) .build(); } - public Xml.@NonNull Parser> struct21(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser> struct21(@NonNull Languages langs) { return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamStructure21(langs)::parse)) .build(); } - public Xml.@NonNull Parser> flow20(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser> flow20(@NonNull Languages langs) { return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamFlow20(langs)::parse)) .build(); } - public Xml.@NonNull Parser> flow21(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser> flow21(@NonNull Languages langs) { return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamFlow21(langs)::parse)) .build(); } - public Xml.@NonNull Parser> codelist21(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser> codelist21(@NonNull Languages langs) { return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamCodelist21(langs)::parse)) .build(); } - public Xml.@NonNull Parser messageFooter21(@NonNull LanguagePriorityList langs) { + public Xml.@NonNull Parser messageFooter21(@NonNull Languages langs) { return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamMessageFooter21(langs)::parse)) diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/TextBuilderTest.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/TextBuilderTest.java index 2ef7129c4..a12e3d3ff 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/TextBuilderTest.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/TextBuilderTest.java @@ -16,13 +16,12 @@ */ package internal.sdmxdl.format.xml; -import internal.sdmxdl.format.xml.TextBuilder; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNullPointerException; -import static sdmxdl.LanguagePriorityList.ANY; -import static sdmxdl.LanguagePriorityList.parse; +import static sdmxdl.Languages.ANY; +import static sdmxdl.Languages.parse; /** * @author Philippe Charles diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCodelist21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCodelist21Test.java index 768ebd118..c2253f69d 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCodelist21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCodelist21Test.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.Codelist; import sdmxdl.CodelistRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.format.xml.SdmxXmlStreams; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -18,7 +18,7 @@ public class XMLStreamCodelist21Test { @Test public void test() throws Exception { - Xml.Parser> parser = SdmxXmlStreams.codelist21(LanguagePriorityList.ANY); + Xml.Parser> parser = SdmxXmlStreams.codelist21(Languages.ANY); assertThat(parser.parseReader(SdmxXmlSources.ECB_DATA_STRUCTURE::openReader)) .hasSize(9) diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java index 35f0ecd0c..c2b49965d 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java @@ -22,7 +22,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import tests.sdmxdl.format.xml.SdmxXmlSources; import java.io.IOException; @@ -37,7 +37,7 @@ public class XMLStreamFlow20Test { @Test public void test() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow20(LanguagePriorityList.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow20(Languages.ANY)::parse); assertThat(p.parseReader(SdmxXmlSources.OTHER_FLOWS20::openReader)) .containsExactly( diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java index aea393b14..72de6631d 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java @@ -22,7 +22,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import tests.sdmxdl.format.xml.SdmxXmlSources; import java.io.IOException; @@ -37,7 +37,7 @@ public class XMLStreamFlow21Test { @Test public void test() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(LanguagePriorityList.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); assertThat(p.parseReader(SdmxXmlSources.ECB_DATAFLOWS::openReader)) .containsExactly( @@ -64,7 +64,7 @@ public void test() throws IOException { @Test public void testDescription() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(LanguagePriorityList.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); assertThat(p.parseResource(XMLStreamMessageFooter21Test.class, "FlowWithDescription.xml")) .containsExactly( diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21Test.java index 1509d0cd6..0684d66f6 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamMessageFooter21Test.java @@ -2,7 +2,7 @@ import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.format.MessageFooter; import sdmxdl.format.xml.SdmxXmlStreams; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -16,7 +16,7 @@ public class XMLStreamMessageFooter21Test { @Test public void test() throws Exception { - Xml.Parser parser = SdmxXmlStreams.messageFooter21(LanguagePriorityList.ANY); + Xml.Parser parser = SdmxXmlStreams.messageFooter21(Languages.ANY); assertThat(parser.parseResource(XMLStreamMessageFooter21Test.class, "MessageFooter.xml")) .satisfies(msg -> { diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java index 8faa61438..7f78e9575 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java @@ -37,7 +37,7 @@ public class XMLStreamStructure20Test { @Test @SuppressWarnings("null") public void test() throws Exception { - Xml.Parser> p1 = SdmxXmlStreams.struct20(LanguagePriorityList.ANY); + Xml.Parser> p1 = SdmxXmlStreams.struct20(Languages.ANY); assertThat(p1.parseReader(SdmxXmlSources.NBB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("My first dataset"); @@ -66,7 +66,7 @@ public void test() throws Exception { }); }); - Xml.Parser> p2 = SdmxXmlStreams.struct20(LanguagePriorityList.parse("fr")); + Xml.Parser> p2 = SdmxXmlStreams.struct20(Languages.parse("fr")); assertThat(p2.parseReader(SdmxXmlSources.NBB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("Mon premier dataset"); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java index 69cc4c860..455062266 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java @@ -37,7 +37,7 @@ public class XMLStreamStructure21Test { @Test @SuppressWarnings("null") public void test() throws Exception { - Xml.Parser> parser = SdmxXmlStreams.struct21(LanguagePriorityList.ANY); + Xml.Parser> parser = SdmxXmlStreams.struct21(Languages.ANY); assertThat(parser.parseReader(SdmxXmlSources.ECB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("AMECO"); diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java index 5f031955e..3e5478525 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java @@ -6,7 +6,7 @@ import sdmxdl.Connection; import sdmxdl.DataflowRef; import sdmxdl.Key; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.format.protobuf.*; import sdmxdl.format.protobuf.web.MonitorReport; import sdmxdl.format.protobuf.web.SdmxWebSource; @@ -18,7 +18,7 @@ public class SdmxWebManagerService implements sdmxdl.grpc.SdmxWebManager { private final SdmxWebManager manager = GrpcWebFactory.loadManager(); - private final LanguagePriorityList languages = LanguagePriorityList.ANY; + private final Languages languages = Languages.ANY; @Override public Uni getMonitorReport(SourceRequest request) { diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java index d5c8bbd0d..1839be53f 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java @@ -21,7 +21,7 @@ import nbbrd.io.function.IOSupplier; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java index 650177c79..c49c36ab2 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java @@ -21,7 +21,7 @@ import nbbrd.io.function.IOSupplier; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java index 0c0b40aa5..ca8e3aa89 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java @@ -4,7 +4,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; import sdmxdl.web.MonitorReports; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import java.time.Clock; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java index 4b5bef46b..6eacaf3d7 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java @@ -4,8 +4,9 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.format.ServiceSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.time.Clock; @@ -14,6 +15,7 @@ import static java.util.stream.Collectors.toList; +@ServiceSupport @lombok.Builder(toBuilder = true) public final class DualWebCachingSupport implements WebCaching { diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java index 705cb8023..c4a0a1805 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java @@ -19,7 +19,7 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import sdmxdl.*; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.DataRef; import sdmxdl.provider.FileTypedId; @@ -41,11 +41,11 @@ public final class CachedFileClient implements FileClient { public static @NonNull CachedFileClient of( @NonNull FileClient client, @NonNull FileCache cache, - @NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) { + @NonNull SdmxFileSource source, @NonNull Languages languages) { return new CachedFileClient(client, cache, getBase(source, languages)); } - private static URI getBase(SdmxFileSource source, LanguagePriorityList languages) { + private static URI getBase(SdmxFileSource source, Languages languages) { return WebTypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java index 666797b82..d18980610 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java @@ -19,7 +19,7 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; import sdmxdl.*; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; import sdmxdl.provider.WebTypedId; @@ -42,12 +42,12 @@ final class CachedRestClient implements RestClient { static @NonNull RestClient of( @NonNull RestClient client, @NonNull WebCache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { + @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedRestClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } @VisibleForTesting - static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { + static URI getBase(SdmxWebSource source, Languages languages) { return WebTypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java similarity index 80% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java index 60c3d6c5c..074d6efb9 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebDriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java @@ -19,11 +19,12 @@ import lombok.AccessLevel; import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; +import sdmxdl.format.ServiceSupport; import sdmxdl.provider.Validator; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.Collection; @@ -33,16 +34,15 @@ /** * @author Philippe Charles */ +@ServiceSupport @lombok.Builder(toBuilder = true) -public final class WebDriverSupport implements WebDriver { +public final class DriverSupport implements Driver { - @lombok.Getter @NonNull private final String id; - @lombok.Getter @lombok.Builder.Default - private final int rank = UNKNOWN_RANK; + private final int rank = UNKNOWN_DRIVER_RANK; @NonNull private final WebConnector connector; @@ -61,12 +61,22 @@ public final class WebDriverSupport implements WebDriver { private final Validator lazySourceValidator = WebValidators.onDriverId(id); @Override - public boolean isAvailable() { + public @NonNull String getDriverId() { + return id; + } + + @Override + public int getDriverRank() { + return rank; + } + + @Override + public boolean isDriverAvailable() { return availability.test(System.getProperties()); } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { getLazySourceValidator().checkValidity(source); return connector.connect(source, languages, context); @@ -78,7 +88,7 @@ public boolean isAvailable() { } @Override - public @NonNull Collection getSupportedProperties() { + public @NonNull Collection getDriverProperties() { return supportedProperties; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java index 4bcfd0ade..079eb185e 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/LazyNetwork.java @@ -1,9 +1,9 @@ package sdmxdl.provider.web; import lombok.NonNull; -import sdmxdl.web.Network; -import sdmxdl.web.SSLFactory; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; +import sdmxdl.web.spi.URLConnectionFactory; import java.net.ProxySelector; import java.util.function.Supplier; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java index f2e5d622c..931b6df9e 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java @@ -1,7 +1,7 @@ package sdmxdl.provider.web; import lombok.NonNull; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -10,5 +10,5 @@ @FunctionalInterface public interface RestClientSupplier { - @NonNull RestClient get(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException; + @NonNull RestClient get(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index a033c2654..27b8330a6 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -3,7 +3,7 @@ import lombok.NonNull; import sdmxdl.Connection; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.provider.Validator; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -27,11 +27,11 @@ public final class RestConnector implements WebConnector { private final Validator dataflowRefValidator = WebValidators.DEFAULT_DATAFLOW_REF_VALIDATOR; @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { return RestConnection.of(getClient(source, languages, context), dataflowRefValidator, false); } - private RestClient getClient(SdmxWebSource source, LanguagePriorityList languages, WebContext context) throws IOException { + private RestClient getClient(SdmxWebSource source, Languages languages, WebContext context) throws IOException { return CachedRestClient.of( client.get(source, languages, context), context.getCache(source), diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java index bdad0aa60..e5715441a 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java @@ -2,10 +2,11 @@ import lombok.AccessLevel; import lombok.NonNull; -import sdmxdl.web.Network; -import sdmxdl.web.SSLFactory; +import sdmxdl.format.ServiceSupport; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; import sdmxdl.web.spi.Networking; import java.net.ProxySelector; @@ -15,6 +16,7 @@ import java.util.function.Predicate; import java.util.function.Supplier; +@ServiceSupport @lombok.Builder(toBuilder = true) public final class SingleNetworkingSupport implements Networking { @@ -36,7 +38,7 @@ public final class SingleNetworkingSupport implements Networking { private final @NonNull Supplier urlConnectionFactory = Network.getDefault()::getURLConnectionFactory; @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) - private final @NonNull Network singleNetwork = initSingleNetwork(); + private final @NonNull Network singleNetwork = initLazySingleNetwork(); @Override public @NonNull String getNetworkingId() { @@ -63,7 +65,7 @@ public boolean isNetworkingAvailable() { return getSingleNetwork(); } - private Network initSingleNetwork() { + private Network initLazySingleNetwork() { return LazyNetwork .builder() .proxySelector(proxySelector) diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java index 8c5d1b667..64a732545 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java @@ -2,7 +2,7 @@ import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; @@ -11,5 +11,5 @@ @FunctionalInterface public interface WebConnector { - @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException; + @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java index 7bbcdf6c6..585827cce 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java @@ -3,7 +3,7 @@ import nbbrd.io.function.IOSupplier; import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.format.MemCache; import tests.sdmxdl.ext.FakeClock; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java index 72bdb40ec..453015e35 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java @@ -41,7 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.hasItem; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; import static sdmxdl.provider.web.CachedRestClient.getBase; import static tests.sdmxdl.api.KeyAssert.keys; import static tests.sdmxdl.api.RepoSamples.*; @@ -193,7 +193,7 @@ public void testGetBase() { assertThat(getBase(s1, ANY)) .hasToString("cache:rest/id1/1032839954/*") .isEqualTo(getBase(s1, ANY)) - .isNotEqualTo(getBase(s1, LanguagePriorityList.parse("fr"))) + .isNotEqualTo(getBase(s1, Languages.parse("fr"))) .isNotEqualTo(getBase(s1.toBuilder().id("id2").build(), ANY)) .isNotEqualTo(getBase(s1.toBuilder().driver("driver2").build(), ANY)) .isNotEqualTo(getBase(s1.toBuilder().endpointOf("http://localhost/stuff").build(), ANY)) diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java index d2d16cbba..13ca0a9da 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java @@ -160,7 +160,7 @@ public DataFlowStructure fromStructure(DataStructure dsd) { return result; } - public List fromLanguages(LanguagePriorityList l) { + public List fromLanguages(Languages l) { return Locale.LanguageRange.parse(l.toString()); } diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java index 6e000c1f3..1a13b3493 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -35,8 +35,8 @@ import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestClientSupplier; import sdmxdl.provider.web.WebEvents; -import sdmxdl.web.Network; -import sdmxdl.web.SSLFactory; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java index 51f34dded..92012aacb 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -19,26 +19,26 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.EUROSTAT; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class EurostatDriver implements WebDriver { +@ServiceProvider(Driver.class) +public final class EurostatDriver implements Driver { private static final String CONNECTORS_EUROSTAT = "connectors:eurostat"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_EUROSTAT) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(EUROSTAT::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java index 177023e49..c10e51255 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -19,26 +19,26 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.IMF2; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class ImfDriver implements WebDriver { +@ServiceProvider(Driver.class) +public final class ImfDriver implements Driver { private static final String CONNECTORS_IMF = "connectors:imf"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_IMF) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(IMF2::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java index 8367adaca..41d1e67b7 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -31,10 +31,10 @@ import sdmxdl.format.time.StandardReportingFormat; import sdmxdl.format.time.TimeFormats; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.net.URI; import java.util.Map; @@ -49,15 +49,15 @@ * @author Philippe Charles */ @ServiceProvider -public final class InseeDriver implements WebDriver { +public final class InseeDriver implements Driver { private static final String CONNECTORS_INSEE = "connectors:insee"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_INSEE) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(InseeClient::new, OBS_FACTORY))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java index d0421c500..3901eb1ec 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -19,10 +19,10 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.NBB; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; @@ -30,15 +30,15 @@ * @author Philippe Charles */ @ServiceProvider -public final class NbbDriver implements WebDriver { +public final class NbbDriver implements Driver { private static final String CONNECTORS_NBB = "connectors:nbb"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_NBB) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(NBB::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java index b60fd050d..3924cb9aa 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -19,26 +19,26 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.OECD; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class OecdDriver implements WebDriver { +@ServiceProvider(Driver.class) +public final class OecdDriver implements Driver { private static final String CONNECTORS_OECD = "connectors:oecd"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_OECD) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(OECD::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java index 51e67b6b7..f32718ad0 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java @@ -19,9 +19,9 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.RestSdmx20Client; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.net.URI; import java.util.Map; @@ -32,16 +32,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class Sdmx20Driver implements WebDriver { +@ServiceProvider +public final class Sdmx20Driver implements Driver { private static final String CONNECTORS_SDMX_20 = "connectors:sdmx20"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_SDMX_20) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(Sdmx20Client::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .supportedPropertyOf(NEEDS_CREDENTIALS_PROPERTY) diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 0a75d8e91..3661ddb53 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -21,9 +21,9 @@ import it.bancaditalia.oss.sdmx.client.RestSdmxClient; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.net.URI; import java.util.Map; @@ -35,16 +35,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class Sdmx21Driver implements WebDriver { +@ServiceProvider(Driver.class) +public final class Sdmx21Driver implements Driver { private static final String CONNECTORS_SDMX_21 = "connectors:sdmx21"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_SDMX_21) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(Sdmx21Client::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .supportedPropertyOf(NEEDS_CREDENTIALS_PROPERTY) diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java index 513de1a25..11ba68245 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -19,10 +19,10 @@ import internal.sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.net.URI; import java.net.URISyntaxException; @@ -32,16 +32,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class SeDriver implements WebDriver { +@ServiceProvider +public final class SeDriver implements Driver { private static final String CONNECTORS_SE = "connectors:se"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_SE) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(SeClient::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java index 5636d7d6b..9a1706db3 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -20,10 +20,10 @@ import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.net.URI; import java.util.Map; @@ -35,15 +35,15 @@ * @author Philippe Charles */ @ServiceProvider -public final class UisDriver implements WebDriver { +public final class UisDriver implements Driver { private static final String CONNECTORS_UIS = "connectors:uis"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(CONNECTORS_UIS) - .rank(WRAPPED_RANK) + .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(UIS2::new))) .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource diff --git a/sdmx-dl-provider-connectors/src/main/java/module-info.java b/sdmx-dl-provider-connectors/src/main/java/module-info.java index 1f50f338f..905a8cc96 100644 --- a/sdmx-dl-provider-connectors/src/main/java/module-info.java +++ b/sdmx-dl-provider-connectors/src/main/java/module-info.java @@ -1,3 +1,5 @@ +import sdmxdl.web.spi.Driver; + module sdmxdl.provider.connectors { requires static lombok; @@ -11,7 +13,7 @@ requires transitive sdmxdl.api; - provides sdmxdl.web.spi.WebDriver with + provides Driver with internal.sdmxdl.provider.connectors.drivers.EurostatDriver, internal.sdmxdl.provider.connectors.drivers.ImfDriver, internal.sdmxdl.provider.connectors.drivers.InseeDriver, diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java index fc8756f81..492975ca6 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java @@ -42,7 +42,7 @@ public class FacadeResource { public DataRepository nbb() throws IOException { DataRepository result = NBB.get(); if (result == null) { - LanguagePriorityList l = LanguagePriorityList.parse("fr"); + Languages l = Languages.parse("fr"); List structs = struct20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); List flows = flow20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); @@ -63,7 +63,7 @@ public DataRepository nbb() throws IOException { public DataRepository ecb() throws IOException { DataRepository result = ECB.get(); if (result == null) { - LanguagePriorityList l = LanguagePriorityList.parse("fr"); + Languages l = Languages.parse("fr"); List structs = struct21(SdmxXmlSources.ECB_DATA_STRUCTURE, l); List flows = flow21(SdmxXmlSources.ECB_DATAFLOWS, l); @@ -84,11 +84,11 @@ public DataRepository ecb() throws IOException { private static final AtomicReference NBB = new AtomicReference<>(); private static final AtomicReference ECB = new AtomicReference<>(); - private List struct20(ByteSource xml, LanguagePriorityList l) throws IOException { + private List struct20(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.struct20(l).parseReader(xml::openReader); } - private List flow20(ByteSource xml, LanguagePriorityList l) throws IOException { + private List flow20(ByteSource xml, Languages l) throws IOException { // FIXME: find sample of dataflow20 ? return struct20(xml, l).stream() .map(FacadeResource::asDataflow) @@ -101,11 +101,11 @@ List data20(ByteSource xml, DataStructure dsd) throws IOException { } } - private List struct21(ByteSource xml, LanguagePriorityList l) throws IOException { + private List struct21(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.struct21(l).parseReader(xml::openReader); } - private List flow21(ByteSource xml, LanguagePriorityList l) throws IOException { + private List flow21(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.flow21(l).parseReader(xml::openReader); } diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java index 4448be81b..8cb6dfd1d 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java @@ -22,7 +22,7 @@ import tests.sdmxdl.web.WebDriverAssert; import static org.assertj.core.api.Assertions.assertThatCode; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java similarity index 89% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java rename to sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java index 3a1637f9c..06dc44915 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/SdmxDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java @@ -17,7 +17,7 @@ package internal.sdmxdl.provider.ri.file; import lombok.NonNull; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.Marker; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.file.FileInfo; @@ -27,9 +27,9 @@ /** * @author Philippe Charles */ -public interface SdmxDecoder { +public interface Decoder { - @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages) throws IOException; + @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull Languages languages) throws IOException; Marker SDMX_DECODER_MARKER = Marker.parse("SDMX_DECODER"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java index f13ceff1f..913fa6ed6 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java @@ -22,7 +22,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataStructure; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.*; import sdmxdl.provider.file.FileInfo; @@ -34,12 +34,12 @@ * @author Philippe Charles */ @lombok.AllArgsConstructor -public final class XmlDecoder implements SdmxDecoder { +public final class XmlDecoder implements Decoder { private final @Nullable EventListener listener; @Override - public @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList langs) throws IOException { + public @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull Languages langs) throws IOException { MediaType type = probeDataType(source); return FileInfo.of(type, loadStructure(source, langs, type)); } @@ -53,13 +53,13 @@ private MediaType probeDataType(SdmxFileSource source) throws IOException { .orElseThrow(() -> new IOException("Cannot probe data type")); } - private DataStructure loadStructure(SdmxFileSource source, LanguagePriorityList langs, MediaType type) throws IOException { + private DataStructure loadStructure(SdmxFileSource source, Languages langs, MediaType type) throws IOException { return XmlFileSource.isValidFile(source.getStructure()) ? parseStruct(type, langs, source) : decodeStruct(type, source); } - private DataStructure parseStruct(MediaType dataType, LanguagePriorityList langs, SdmxFileSource source) throws IOException { + private DataStructure parseStruct(MediaType dataType, Languages langs, SdmxFileSource source) throws IOException { if (listener != null) { listener.accept(source, SDMX_DECODER_MARKER, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); } @@ -70,7 +70,7 @@ private DataStructure parseStruct(MediaType dataType, LanguagePriorityList langs .orElseThrow(IOException::new); } - private Xml.Parser> getStructParser(MediaType dataType, LanguagePriorityList langs) throws IOException { + private Xml.Parser> getStructParser(MediaType dataType, Languages langs) throws IOException { if (XmlMediaTypes.GENERIC_DATA_20.equals(dataType) || XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_20.equals(dataType)) { return SdmxXmlStreams.struct20(langs); } else if (XmlMediaTypes.GENERIC_DATA_21.equals(dataType) || XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_21.equals(dataType)) { diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java index 4179b9896..9e7c588ea 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java @@ -22,7 +22,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataStructure; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.Series; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.DataCursor; @@ -49,10 +49,10 @@ public class XmlFileClient implements FileClient { private final SdmxFileSource source; @lombok.NonNull - private final LanguagePriorityList languages; + private final Languages languages; @lombok.NonNull - private final SdmxDecoder decoder; + private final Decoder decoder; @Nullable private final Supplier obsFactory; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java index 0dec7cc3d..4211e0d70 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -7,10 +7,10 @@ import sdmxdl.Connection; import sdmxdl.DataStructureRef; import sdmxdl.Dataflow; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileContext; -import sdmxdl.file.spi.FileReader; +import sdmxdl.file.spi.Reader; import sdmxdl.format.ObsParser; import sdmxdl.provider.file.CachedFileClient; import sdmxdl.provider.file.FileClient; @@ -21,7 +21,22 @@ import java.util.Locale; @ServiceProvider -public class XmlReader implements FileReader { +public class XmlReader implements Reader { + + @Override + public @NonNull String getReaderId() { + return "XML"; + } + + @Override + public int getReaderRank() { + return UNKNOWN_READER_RANK; + } + + @Override + public boolean isReaderAvailable() { + return true; + } @Override public boolean canRead(@NonNull SdmxFileSource source) { @@ -29,7 +44,7 @@ public boolean canRead(@NonNull SdmxFileSource source) { } @Override - public @NonNull Connection read(@NonNull SdmxFileSource source, @NonNull LanguagePriorityList languages, @NonNull FileContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection read(@NonNull SdmxFileSource source, @NonNull Languages languages, @NonNull FileContext context) throws IOException, IllegalArgumentException { if (!canRead(source)) { throw new IllegalArgumentException(source.toString()); } @@ -40,7 +55,7 @@ private boolean isXmlFileName(File file) { return file.toString().toLowerCase(Locale.ROOT).endsWith(".xml"); } - private FileClient getClient(SdmxFileSource source, LanguagePriorityList languages, FileContext context) throws IOException { + private FileClient getClient(SdmxFileSource source, Languages languages, FileContext context) throws IOException { FileClient client = new XmlFileClient( source, languages, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java index 0e8f32b11..6b17fe6b4 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java @@ -29,7 +29,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().map(DotStatRestParsers::getFlowFromStructure).collect(Collectors.toList())); } @@ -40,7 +40,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataflowRef ref) { + public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().map(DotStatRestParsers::getFlowFromStructure).findFirst()); } @@ -51,7 +51,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataStructureRef ref) { + public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().findFirst()); } @@ -74,7 +74,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull CodelistRef ref) { + public @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull CodelistRef ref) { throw new UnsupportedOperationException("codelist"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java index 51791af11..f963b17d2 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -28,12 +28,12 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; import sdmxdl.EventListener; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.Marker; import sdmxdl.provider.web.WebEvents; -import sdmxdl.web.Network; +import sdmxdl.web.spi.Authenticator; +import sdmxdl.web.spi.Network; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebAuthenticator; import sdmxdl.web.spi.WebContext; import java.io.File; @@ -71,7 +71,7 @@ public class RiHttpUtils { static final Property HTTP_AGENT = Property.of("http.agent", About.NAME + "/" + About.VERSION, Parser.onString(), Formatter.onString()); - public static @NonNull HttpRequest newRequest(@NonNull URL query, @NonNull List mediaTypes, @NonNull LanguagePriorityList langs) { + public static @NonNull HttpRequest newRequest(@NonNull URL query, @NonNull List mediaTypes, @NonNull Languages langs) { return HttpRequest .builder() .query(query) @@ -154,7 +154,7 @@ private static final class RiHttpAuthenticator implements HttpAuthenticator { private final SdmxWebSource source; @lombok.NonNull - private final List authenticators; + private final List authenticators; private final @Nullable EventListener listener; @@ -183,9 +183,9 @@ private boolean isDifferentAuthScope(URL url) { || url.getPort() != source.getEndpoint().getPort(); } - private PasswordAuthentication getPasswordAuthentication(WebAuthenticator authenticator) { + private PasswordAuthentication getPasswordAuthentication(Authenticator authenticator) { try { - return authenticator.getPasswordAuthentication(source); + return authenticator.getPasswordAuthenticationOrNull(source); } catch (IOException ex) { if (listener != null) { listener.accept(source, RI_HTTP_MARKER, "Failed to get password authentication: " + ex.getMessage()); @@ -194,9 +194,9 @@ private PasswordAuthentication getPasswordAuthentication(WebAuthenticator authen } } - private void invalidate(WebAuthenticator authenticator) { + private void invalidate(Authenticator authenticator) { try { - authenticator.invalidate(source); + authenticator.invalidateAuthentication(source); } catch (IOException ex) { if (listener != null) { listener.accept(source, RI_HTTP_MARKER, "Failed to invalidate password authentication: " + ex.getMessage()); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java index ce167128b..0929e152c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java @@ -46,7 +46,7 @@ @lombok.RequiredArgsConstructor public class RiRestClient implements RestClient { - public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull LanguagePriorityList languages, @NonNull WebContext c, + public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull Languages languages, @NonNull WebContext c, @NonNull RiRestQueries queries, @NonNull RiRestParsers parsers, @NonNull Set supportedFeatures) throws IOException { return new RiRestClient( Marker.of(s), @@ -63,7 +63,7 @@ public class RiRestClient implements RestClient { @lombok.Getter protected final Marker marker; protected final URL endpoint; - protected final LanguagePriorityList langs; + protected final Languages langs; protected final Supplier obsFactory; protected final HttpClient httpClient; protected final RiRestQueries queries; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java index 5370149ec..a752026ab 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java @@ -17,15 +17,15 @@ public interface RiRestParsers { @NonNull List getFlowsTypes(); - @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs); + @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs); @NonNull List getFlowTypes(); - @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataflowRef ref); + @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref); @NonNull List getStructureTypes(); - @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataStructureRef ref); + @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref); @NonNull List getDataTypes(); @@ -33,7 +33,7 @@ public interface RiRestParsers { @NonNull List getCodelistTypes(); - @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull CodelistRef ref); + @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull CodelistRef ref); static , R extends ResourceRef> @NonNull IOFunction, Optional> getResourceSelector(@NonNull R ref) { return list -> list diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java index c15b54839..e7289336e 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java @@ -32,7 +32,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.flow21(langs), mediaType.getCharset()); @@ -47,7 +47,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataflowRef ref) { + public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.flow21(langs).andThen(getResourceSelector(ref)), mediaType.getCharset()); @@ -62,7 +62,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull DataStructureRef ref) { + public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.struct21(langs).andThen(getResourceSelector(ref)), mediaType.getCharset()); @@ -98,7 +98,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs, @NonNull CodelistRef ref) { + public @NonNull FileParser> getCodelistParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull CodelistRef ref) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.codelist21(langs).andThen(getResourceSelector(ref)), mediaType.getCharset()); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java index e62df8992..39d5128ff 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java @@ -5,26 +5,26 @@ import nbbrd.io.sys.OS; import nbbrd.service.ServiceProvider; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebAuthenticator; +import sdmxdl.web.spi.Authenticator; import java.io.IOException; import java.net.PasswordAuthentication; @ServiceProvider -public final class WinPasswordVaultAuthenticator implements WebAuthenticator { +public final class WinPasswordVaultAuthenticator implements Authenticator { @Override - public @NonNull String getId() { + public @NonNull String getAuthenticatorId() { return "WIN_PASSWORD_VAULT"; } @Override - public boolean isAvailable() { + public boolean isAuthenticatorAvailable() { return OS.NAME.equals(OS.Name.WINDOWS); } @Override - public PasswordAuthentication getPasswordAuthentication(SdmxWebSource source) throws IOException { + public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException { try (WinPasswordVault vault = WinPasswordVault.open()) { String message = "Enter your credentials for " + source.getId(); return toPasswordAuthentication(vault.getOrPrompt(getResource(source), message, false)); @@ -32,7 +32,7 @@ public PasswordAuthentication getPasswordAuthentication(SdmxWebSource source) th } @Override - public void invalidate(SdmxWebSource source) throws IOException { + public void invalidateAuthentication(@NonNull SdmxWebSource source) throws IOException { try (WinPasswordVault vault = WinPasswordVault.open()) { vault.invalidate(getResource(source)); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java index 2ff435235..fd45d6105 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -25,10 +25,10 @@ import sdmxdl.provider.Marker; import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.net.URL; @@ -41,16 +41,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class BbkDriver implements WebDriver { +@ServiceProvider(Driver.class) +public final class BbkDriver implements Driver { private static final String RI_BBK = "ri:bbk"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_BBK) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(BbkDriver::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource @@ -66,7 +66,7 @@ public final class BbkDriver implements WebDriver { .build()) .build(); - private static RiRestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + private static RiRestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( Marker.of(s), s.getEndpoint().toURL(), diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java index 5ddad2c54..a47d44233 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java @@ -21,14 +21,14 @@ import internal.sdmxdl.provider.ri.web.RiRestClient; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.EnumSet; @@ -41,16 +41,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class DotStatDriver2 implements WebDriver { +@ServiceProvider(Driver.class) +public final class DotStatDriver2 implements Driver { private static final String RI_DOTSTAT = "ri:dotstat"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_DOTSTAT) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(DotStatDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource @@ -100,7 +100,7 @@ public final class DotStatDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, new DotStatRestQueries(), new DotStatRestParsers(), DOTSTAT_FEATURES); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index a8327c5a0..f14b96a33 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -30,7 +30,7 @@ import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.format.MessageFooter; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; @@ -39,10 +39,10 @@ import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.io.IOException; import java.io.InputStream; @@ -57,15 +57,15 @@ import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static internal.sdmxdl.provider.ri.web.Sdmx21RestParsers.withCharset; import static java.util.Collections.singletonList; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class EurostatDriver2 implements WebDriver { +@ServiceProvider(Driver.class) +public final class EurostatDriver2 implements Driver { public static final IntProperty ASYNC_MAX_RETRIES_PROPERTY = IntProperty.of("asyncMaxRetries", 10); @@ -76,10 +76,10 @@ public final class EurostatDriver2 implements WebDriver { private static final String RI_EUROSTAT = "ri:estat"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_EUROSTAT) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(EurostatDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) .supportedPropertyOf(ASYNC_MAX_RETRIES_PROPERTY) @@ -139,7 +139,7 @@ public final class EurostatDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( Marker.of(s), s.getEndpoint().toURL(), diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index a0b4d93b6..623013c9b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -9,16 +9,16 @@ import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.*; -import sdmxdl.file.FileCache; +import sdmxdl.file.spi.FileCache; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.File; import java.io.IOException; @@ -27,7 +27,7 @@ import java.util.Collection; @ServiceProvider -public final class FileDriver implements WebDriver { +public final class FileDriver implements Driver { private static final String RI_FILE = "ri:file"; @@ -35,10 +35,10 @@ public final class FileDriver implements WebDriver { BooleanProperty.of("enableFileDriver", false); @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_FILE) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(this::newConnection) .supportedPropertyOf(STRUCTURE_PROPERTY) @@ -46,7 +46,7 @@ public final class FileDriver implements WebDriver { private final SdmxFileManager fileManager = SdmxFileManager.ofServiceLoader(); - private @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { + private @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { return fileManager .toBuilder() .onEvent(context.getOnEvent() != null ? (fileSource, marker, message) -> context.getOnEvent().accept(source, marker, message) : null) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java index 9db6a0493..265797454 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java @@ -30,12 +30,12 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.provider.DataRef; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.net.URL; @@ -50,16 +50,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class ImfDriver2 implements WebDriver { +@ServiceProvider +public final class ImfDriver2 implements Driver { private static final String RI_IMF = "ri:imf"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_IMF) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(ImfDriver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource @@ -74,7 +74,7 @@ public final class ImfDriver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, new ImfQueries(), new ImfParsers(), IMF_FEATURES); } @@ -111,7 +111,7 @@ public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStru private static final class ImfParsers extends DotStatRestParsers { @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull LanguagePriorityList langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { return SdmxXmlStreams.flow20(langs); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index 170fbf8f1..2e877d163 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -33,11 +33,11 @@ import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.Marker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.EnumSet; @@ -51,16 +51,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(WebDriver.class) -public final class InseeDriver2 implements WebDriver { +@ServiceProvider(Driver.class) +public final class InseeDriver2 implements Driver { private static final String RI_INSEE = "ri:insee"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_INSEE) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(InseeRestClient::new)) .supportedProperties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource @@ -97,7 +97,7 @@ private static Dimension fixDimensionCodes(Dimension dimension, IOFunction checkInternalErrorRedirect(response)), new NbbQueries(), diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index d618c9745..812273075 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -27,11 +27,11 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.WebTypedId; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.io.IOException; import java.lang.reflect.Type; @@ -51,7 +51,7 @@ import static sdmxdl.provider.web.WebProperties.CACHE_TTL_PROPERTY; @ServiceProvider -public final class PxWebDriver implements WebDriver { +public final class PxWebDriver implements Driver { private static final String RI_PXWEB = "ri:pxweb"; @@ -59,10 +59,10 @@ public final class PxWebDriver implements WebDriver { BooleanProperty.of("enablePxWebDriver", false); @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_PXWEB) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(PxWebDriver::newConnection) .supportedProperties(RI_CONNECTION_PROPERTIES) @@ -79,7 +79,7 @@ public final class PxWebDriver implements WebDriver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { PxWebClient client = new DefaultPxWebClient( Marker.of(source), source.getId().toLowerCase(Locale.ROOT), @@ -250,11 +250,11 @@ private static final class CachedPxWebClient implements PxWebClient { static @NonNull CachedPxWebClient of( @NonNull PxWebClient client, @NonNull WebCache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { + @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedPxWebClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } - private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { + private static URI getBase(SdmxWebSource source, Languages languages) { return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java index 4d0498025..bda691e68 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java @@ -10,10 +10,10 @@ import sdmxdl.provider.ConnectionSupport; import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.net.URI; @@ -34,7 +34,7 @@ import static java.util.Collections.singleton; @ServiceProvider -public final class RngDriver implements WebDriver { +public final class RngDriver implements Driver { private static final String RI_RNG = "ri:rng"; @@ -42,10 +42,10 @@ public final class RngDriver implements WebDriver { BooleanProperty.of("enableRngDriver", false); @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_RNG) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(RngDriver::newConnection) .source(SdmxWebSource @@ -57,7 +57,7 @@ public final class RngDriver implements WebDriver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) { + private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) { RngDriverId config = RngDriverId.parse(source.getEndpoint()); return new RngConnection(Marker.of(source), config); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java index fc07673f7..a2319932c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java @@ -21,13 +21,13 @@ import internal.sdmxdl.provider.ri.web.Sdmx21RestQueries; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; import java.io.IOException; import java.util.EnumSet; @@ -41,15 +41,15 @@ * @author Philippe Charles */ @ServiceProvider -public final class Sdmx21Driver2 implements WebDriver { +public final class Sdmx21Driver2 implements Driver { private static final String RI_SDMX_21 = "ri:sdmx21"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_SDMX_21) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(Sdmx21Driver2::newClient)) .supportedProperties(RI_CONNECTION_PROPERTIES) .supportedPropertyOf(DETAIL_SUPPORTED_PROPERTY) @@ -280,7 +280,7 @@ public final class Sdmx21Driver2 implements WebDriver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, LanguagePriorityList languages, WebContext c) throws IOException { + private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, getQueries(s), getParsers(s), getSupportedFeatures(s)); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index 6bb2f1343..bc92b1f9a 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -19,11 +19,11 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.provider.Marker; import sdmxdl.provider.*; -import sdmxdl.provider.web.WebDriverSupport; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebDriver; +import sdmxdl.web.spi.Driver; import java.io.*; import java.lang.reflect.Type; @@ -53,15 +53,15 @@ import static sdmxdl.provider.web.WebValidators.dataflowRefOf; @ServiceProvider -public final class StatCanDriver implements WebDriver { +public final class StatCanDriver implements Driver { private static final String RI_STATCAN = "ri:statcan"; @lombok.experimental.Delegate - private final WebDriverSupport support = WebDriverSupport + private final DriverSupport support = DriverSupport .builder() .id(RI_STATCAN) - .rank(NATIVE_RANK) + .rank(NATIVE_DRIVER_RANK) .connector(StatCanDriver::newConnection) .supportedProperties(RI_CONNECTION_PROPERTIES) .supportedPropertyOf(CACHE_TTL_PROPERTY) @@ -79,7 +79,7 @@ public final class StatCanDriver implements WebDriver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages, @NonNull WebContext context) throws IOException { + private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { StatCanClient client = new DefaultStatCanClient( Marker.of(source), source.getEndpoint().toURL(), @@ -178,7 +178,7 @@ static class DefaultStatCanClient implements StatCanClient { @lombok.Getter private final Marker marker; private final URL endpoint; - private final LanguagePriorityList langs; + private final Languages langs; private final HttpClient client; @Override @@ -265,11 +265,11 @@ static class CachedStatCanClient implements StatCanClient { static @NonNull CachedStatCanClient of( @NonNull StatCanClient client, @NonNull WebCache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull LanguagePriorityList languages) { + @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedStatCanClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } - private static URI getBase(SdmxWebSource source, LanguagePriorityList languages) { + private static URI getBase(SdmxWebSource source, Languages languages) { return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @@ -418,7 +418,7 @@ static DataStructureRef toDataStructureRef(int productId) throws IllegalArgument return DataStructureRef.of(AGENCY, STRUCT_PREFIX + checkProductId(productId), VERSION); } - static Dataflow toDataFlow(DataTable dataTable, LanguagePriorityList langs) { + static Dataflow toDataFlow(DataTable dataTable, Languages langs) { return Dataflow .builder() .ref(toDataflowRef(dataTable.getProductId())) @@ -427,7 +427,7 @@ static Dataflow toDataFlow(DataTable dataTable, LanguagePriorityList langs) { .build(); } - static DataRepository toSdmxRepository(File fullTable, int productId, LanguagePriorityList langs) throws IOException { + static DataRepository toSdmxRepository(File fullTable, int productId, Languages langs) throws IOException { try (ZipFile zipFile = new ZipFile(fullTable)) { DataStructure dsd = parseStruct(zipFile, langs); @@ -440,7 +440,7 @@ static DataRepository toSdmxRepository(File fullTable, int productId, LanguagePr } } - private static DataStructure parseStruct(ZipFile file, LanguagePriorityList langs) throws IOException { + private static DataStructure parseStruct(ZipFile file, Languages langs) throws IOException { FileParser> parser = SdmxXmlStreams.struct21(langs); try { diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java index de649fa93..7b2612a95 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java @@ -6,14 +6,14 @@ import nbbrd.design.VisibleForTesting; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; -import sdmxdl.web.WebCache; +import sdmxdl.web.spi.Monitor; +import sdmxdl.web.spi.WebCache; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; import sdmxdl.web.MonitorStatus; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebMonitoring; import java.io.IOException; import java.text.NumberFormat; @@ -22,21 +22,21 @@ import java.util.Locale; @ServiceProvider -public final class UpptimeMonitoring implements WebMonitoring { +public final class UpptimeMonitoring implements Monitor { @Override - public @NonNull String getId() { + public @NonNull String getMonitorId() { return "UPPPTIME"; } @Override - public @NonNull String getUriScheme() { + public @NonNull String getMonitorUriScheme() { return UpptimeId.URI_SCHEME; } @Override public @NonNull MonitorReport getReport(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { - WebMonitors.checkMonitor(source.getMonitor(), getUriScheme()); + WebMonitors.checkMonitor(source.getMonitor(), getMonitorUriScheme()); UpptimeId id = UpptimeId.parse(source.getMonitor()); @@ -58,7 +58,7 @@ public final class UpptimeMonitoring implements WebMonitoring { } private MonitorReports createReports(HttpClient client, UpptimeId base, Clock clock) throws IOException { - MonitorReports.Builder result = MonitorReports.builder().uriScheme(getUriScheme()); + MonitorReports.Builder result = MonitorReports.builder().uriScheme(getMonitorUriScheme()); for (UpptimeSummary summary : UpptimeSummary.request(client, base.toSummaryURL())) { result.report(getReport(summary)); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java index 87d08d63b..d726f963f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java @@ -15,7 +15,7 @@ import java.util.Collections; import java.util.List; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; @lombok.Value class UpptimeSummary { diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java index 18881c7be..dbb7649ad 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java @@ -10,8 +10,10 @@ import sdmxdl.provider.web.WebEvents; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.*; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.WebMonitoring; +import sdmxdl.web.spi.Monitor; import javax.net.ssl.HttpsURLConnection; import javax.xml.stream.XMLStreamException; @@ -24,23 +26,23 @@ import java.nio.charset.StandardCharsets; @ServiceProvider -public final class UptimeRobotMonitoring implements WebMonitoring { +public final class UptimeRobotMonitoring implements Monitor { private final URL url = Parser.onURL().parseValue("https://api.uptimerobot.com/v2/getMonitors").orElseThrow(RuntimeException::new); @Override - public @NonNull String getId() { + public @NonNull String getMonitorId() { return "UPTIME_ROBOT"; } @Override - public @NonNull String getUriScheme() { + public @NonNull String getMonitorUriScheme() { return UptimeRobotId.URI_SCHEME; } @Override public @NonNull MonitorReport getReport(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { - WebMonitors.checkMonitor(source.getMonitor(), getUriScheme()); + WebMonitors.checkMonitor(source.getMonitor(), getMonitorUriScheme()); UptimeRobotId id = UptimeRobotId.parse(source.getMonitor()); @@ -100,7 +102,7 @@ private static T post(URL url, String query, IOFunction factory, Proxy proxy = network.getProxySelector().select(toURI(url)).stream().findFirst().orElse(Proxy.NO_PROXY); if (context.getOnEvent() != null) { - context.getOnEvent().accept(source, WEB_MONITORING_MARKER, WebEvents.onQuery(url, proxy)); + context.getOnEvent().accept(source, MONITOR_MARKER, WebEvents.onQuery(url, proxy)); } HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java index ace14feff..4b060a354 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java @@ -20,7 +20,7 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; import nbbrd.io.net.MediaType; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; import javax.net.ssl.HttpsURLConnection; import java.io.IOException; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java index 005af9b0f..78d8a2b97 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java @@ -1,7 +1,7 @@ package internal.util.http; import org.checkerframework.checker.index.qual.NonNegative; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index 235de1b3c..d805d5a87 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -1,3 +1,8 @@ +import sdmxdl.file.spi.Reader; +import sdmxdl.web.spi.Authenticator; +import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.Monitor; + module sdmxdl.provider.ri { requires static lombok; @@ -12,7 +17,7 @@ requires com.google.gson; requires java.logging; - provides sdmxdl.web.spi.WebDriver with + provides Driver with internal.sdmxdl.provider.ri.web.drivers.BbkDriver, internal.sdmxdl.provider.ri.web.drivers.DotStatDriver2, internal.sdmxdl.provider.ri.web.drivers.EurostatDriver2, @@ -25,13 +30,13 @@ internal.sdmxdl.provider.ri.web.drivers.Sdmx21Driver2, internal.sdmxdl.provider.ri.web.drivers.StatCanDriver; - provides sdmxdl.file.spi.FileReader with + provides Reader with internal.sdmxdl.provider.ri.file.readers.XmlReader; - provides sdmxdl.web.spi.WebAuthenticator with + provides Authenticator with internal.sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; - provides sdmxdl.web.spi.WebMonitoring with + provides Monitor with internal.sdmxdl.provider.ri.web.monitors.UpptimeMonitoring, internal.sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java index 4f12f6d57..18849e419 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java @@ -35,7 +35,7 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; /** * @author Philippe Charles @@ -95,6 +95,6 @@ public static SdmxFileSource sourceOf(File compact21) { return SdmxFileSource.builder().data(compact21).build(); } - public static final SdmxDecoder DECODER = new XmlDecoder(null); + public static final Decoder DECODER = new XmlDecoder(null); public static final Dataflow DATAFLOW = Dataflow.builder().ref(DataflowRef.parse("data")).structureRef(DataStructureRef.parse("xyz")).name("label").build(); } diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java index 4f41a707e..03ef37053 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java @@ -87,7 +87,7 @@ private static RiRestClient of(HttpClient executor) throws MalformedURLException return new RiRestClient( Marker.of("abc"), new URL("http://localhost"), - LanguagePriorityList.ANY, + Languages.ANY, ObsParser::newDefault, executor, new Sdmx21RestQueries(false), diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java index 350d94009..89487b344 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java @@ -25,7 +25,7 @@ import static nbbrd.io.net.MediaType.ANY_TYPE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.LIST; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; public class Sdmx21RestParsersTest { diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java index 84fe8b0ba..09b81cbd7 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java @@ -106,7 +106,7 @@ private RiRestClient newClient(RestClientResponseMock response) throws Malformed return NbbDriver2.newClient( Marker.of("NBBFIX2"), new URL("https://stat.nbb.be/restsdmx/sdmx.ashx"), - LanguagePriorityList.ANY, + Languages.ANY, (httpRequest) -> response); } diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java index 21d146378..1254d746a 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java @@ -9,7 +9,7 @@ import java.io.IOException; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; public class RngDriverTest { diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java index 88069fc2c..75494c340 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java @@ -24,7 +24,7 @@ import static internal.sdmxdl.provider.ri.web.drivers.StatCanDriver.Converter.*; import static nbbrd.io.Resource.getResourceAsStream; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.LanguagePriorityList.ANY; +import static sdmxdl.Languages.ANY; public class StatCanDriverTest { @@ -140,12 +140,12 @@ public void testToSdmxRepository(@TempDir File tmp) throws IOException { File x = new File(tmp, fileName); Files.copy(StatCanDriverTest.class.getResourceAsStream(fileName), x.toPath()); - Map labels = new HashMap<>(); + Map labels = new HashMap<>(); labels.put(ANY, "Data Structure"); - labels.put(LanguagePriorityList.parse("en"), "Data Structure"); - labels.put(LanguagePriorityList.parse("fr"), "Structure de données"); + labels.put(Languages.parse("en"), "Data Structure"); + labels.put(Languages.parse("fr"), "Structure de données"); - for (Map.Entry label : labels.entrySet()) { + for (Map.Entry label : labels.entrySet()) { assertThat(toSdmxRepository(x, 10100001, label.getKey())) .satisfies(repo -> { assertThat(repo.getStructures()) diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java index 51fcf29fb..9c4a246dd 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java @@ -20,7 +20,7 @@ import nbbrd.io.curl.CurlHttpURLConnection; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; import java.util.List; import java.util.stream.Collectors; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java index ba473438f..dec8397cf 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java @@ -3,7 +3,7 @@ import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; import sdmxdl.format.xml.XmlMediaTypes; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; import java.io.IOException; import java.net.ProxySelector; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java index eb3503640..b7058749b 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java @@ -27,7 +27,7 @@ import org.assertj.core.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; import javax.net.ssl.*; import java.io.IOException; @@ -103,7 +103,7 @@ public void testHttpOK_GET() throws IOException { wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL)) .withHeader(HTTP_ACCEPT_HEADER, equalTo(GENERIC_DATA_21.toString())) - .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(LanguagePriorityList.ANY.toString())) + .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(Languages.ANY.toString())) .withHeader(HTTP_ACCEPT_ENCODING_HEADER, equalTo("gzip, deflate")) .withHeader(HTTP_LOCATION_HEADER, absent()) .withHeader(HTTP_USER_AGENT_HEADER, equalTo("hello world")) @@ -141,7 +141,7 @@ public void testHttpOK_POST() throws IOException { wire.verify(1, postRequestedFor(urlEqualTo(SAMPLE_URL)) .withHeader(HTTP_ACCEPT_HEADER, equalTo(GENERIC_DATA_21.toString())) - .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(LanguagePriorityList.ANY.toString())) + .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(Languages.ANY.toString())) .withHeader(HTTP_ACCEPT_ENCODING_HEADER, equalTo("gzip, deflate")) .withHeader(HTTP_LOCATION_HEADER, absent()) .withHeader(HTTP_USER_AGENT_HEADER, equalTo("hello world")) @@ -580,7 +580,7 @@ protected List getHttpRedirectionCodes() { return Arrays.asList(301, 302, 303, 307, 308); } - protected static final String ANY_LANG = LanguagePriorityList.ANY.toString(); + protected static final String ANY_LANG = Languages.ANY.toString(); protected static final String SAMPLE_URL = "/first.xml"; protected static final String SECOND_URL = "/second.xml"; protected static final String SAMPLE_XML = "JohnDoe"; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java index f94e86213..9308ae6fe 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java @@ -17,7 +17,7 @@ package internal.util.http; import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import sdmxdl.web.URLConnectionFactory; +import sdmxdl.web.spi.URLConnectionFactory; /** * @author Philippe Charles diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java index 159602561..aad34aea4 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java @@ -18,7 +18,7 @@ import sdmxdl.DataQuery; import sdmxdl.DataflowRef; -import sdmxdl.LanguagePriorityList; +import sdmxdl.Languages; /** * @author Philippe Charles @@ -33,7 +33,7 @@ public class WebRequest { String source; @lombok.NonNull - LanguagePriorityList languages; + Languages languages; @lombok.NonNull DataflowRef flowRef; From 016dc9fef84de239568e73029f26ebf007125fe4 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 11 Jul 2023 13:56:59 +0200 Subject: [PATCH 041/114] Simplify cache --- .../main/java/internal/sdmxdl/NoOpCache.java | 38 ++---- .../java/internal/sdmxdl/NoOpCaching.java | 18 ++- sdmx-dl-api/src/main/java/module-info.java | 11 +- .../src/main/java/sdmxdl/DataRepository.java | 7 +- .../src/main/java/sdmxdl/HasExpiration.java | 18 +++ .../spi/FileCache.java => ext/Cache.java} | 17 +-- .../java/sdmxdl/file/spi/FileCaching.java | 4 +- .../java/sdmxdl/file/spi/FileContext.java | 6 +- .../main/java/sdmxdl/web/MonitorReports.java | 8 +- .../main/java/sdmxdl/web/spi/WebCache.java | 49 -------- .../main/java/sdmxdl/web/spi/WebCaching.java | 10 +- .../main/java/sdmxdl/web/spi/WebContext.java | 11 +- .../ext/{WebCacheTest.java => CacheTest.java} | 5 +- .../java/tests/sdmxdl/ext/CacheAssert.java | 64 +++------- .../main/java/sdmxdl/format/DiskCache.java | 117 +++++------------- .../sdmxdl/format/DiskCachingSupport.java | 73 ++++++----- .../src/main/java/sdmxdl/format/MemCache.java | 79 ++---------- .../java/sdmxdl/format/MemCachingSupport.java | 37 +++--- .../java/sdmxdl/format/DiskCacheTest.java | 40 +++--- .../test/java/sdmxdl/format/MemCacheTest.java | 49 ++++---- .../sdmxdl/format/MemCachingSupportTest.java | 35 +++--- .../{FileTypedId.java => TypedId.java} | 22 ++-- .../main/java/sdmxdl/provider/WebTypedId.java | 101 --------------- .../java/sdmxdl/provider/ext/DualCache.java | 39 ++++++ .../sdmxdl/provider/ext/DualWebCache.java | 58 --------- .../provider/ext/DualWebCachingSupport.java | 16 ++- .../provider/file/CachedFileClient.java | 23 ++-- .../sdmxdl/provider/web/CachedRestClient.java | 48 +++---- .../sdmxdl/provider/web/RestConnector.java | 2 +- .../java/_test/sdmxdl/util/CachingAssert.java | 4 +- .../{WebTypedIdTest.java => TypedIdTest.java} | 8 +- .../provider/web/CachedRestClientTest.java | 12 +- .../provider/ri/file/readers/XmlReader.java | 2 +- .../provider/ri/web/drivers/FileDriver.java | 23 ++-- .../provider/ri/web/drivers/PxWebDriver.java | 26 ++-- .../ri/web/drivers/StatCanDriver.java | 24 ++-- .../ri/web/monitors/UpptimeMonitoring.java | 12 +- 37 files changed, 424 insertions(+), 692 deletions(-) create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/HasExpiration.java rename sdmx-dl-api/src/main/java/sdmxdl/{file/spi/FileCache.java => ext/Cache.java} (72%) delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java rename sdmx-dl-api/src/test/java/sdmxdl/ext/{WebCacheTest.java => CacheTest.java} (55%) rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/{FileTypedId.java => TypedId.java} (74%) delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java rename sdmx-dl-provider-base/src/test/java/sdmxdl/provider/{WebTypedIdTest.java => TypedIdTest.java} (88%) diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java index 30df967df..1b2fa6d30 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCache.java @@ -18,54 +18,30 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.file.spi.FileCache; -import sdmxdl.web.MonitorReports; -import sdmxdl.web.spi.WebCache; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; import java.time.Clock; /** * @author Philippe Charles */ -public enum NoOpCache implements FileCache, WebCache { +public enum NoOpCache implements Cache { INSTANCE; @Override - public @NonNull Clock getFileClock() { + public @NonNull Clock getClock() { return Clock.systemDefaultZone(); } + @Nullable @Override - public @NonNull Clock getWebClock() { - return Clock.systemDefaultZone(); - } - - @Override - public DataRepository getFileRepository(@NonNull String key) { - return null; - } - - @Override - public DataRepository getWebRepository(@NonNull String key) { - return null; - } - - @Override - public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { - } - - @Override - public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { - } - - @Override - public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { + public HasExpiration get(@NonNull String key) { return null; } @Override - public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { + public void put(@NonNull String key, @NonNull HasExpiration value) { } } diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java index 7e5bbad13..eb6ca0b15 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java @@ -2,13 +2,14 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.spi.FileCache; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; +import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.util.Collection; @@ -39,13 +40,18 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { - return FileCache.noOp(); + public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return Cache.noOp(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { - return WebCache.noOp(); + public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return Cache.noOp(); + } + + @Override + public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return Cache.noOp(); } @Override diff --git a/sdmx-dl-api/src/main/java/module-info.java b/sdmx-dl-api/src/main/java/module-info.java index c1777f102..caea56c0f 100644 --- a/sdmx-dl-api/src/main/java/module-info.java +++ b/sdmx-dl-api/src/main/java/module-info.java @@ -1,7 +1,6 @@ +import sdmxdl.file.spi.FileCaching; import sdmxdl.file.spi.Reader; -import sdmxdl.web.spi.Authenticator; -import sdmxdl.web.spi.Driver; -import sdmxdl.web.spi.Monitor; +import sdmxdl.web.spi.*; module sdmxdl.api { @@ -19,11 +18,11 @@ exports sdmxdl.web; exports sdmxdl.web.spi; - uses sdmxdl.file.spi.FileCaching; + uses FileCaching; uses Reader; - uses sdmxdl.web.spi.Networking; + uses Networking; uses Authenticator; - uses sdmxdl.web.spi.WebCaching; + uses WebCaching; uses Driver; uses Monitor; } \ No newline at end of file diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java b/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java index f37514637..e80d8ac36 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java @@ -18,7 +18,6 @@ import lombok.NonNull; -import java.time.Clock; import java.time.Duration; import java.time.Instant; import java.util.List; @@ -29,7 +28,7 @@ */ @lombok.Value @lombok.Builder(toBuilder = true) -public class DataRepository { +public class DataRepository implements HasExpiration { @lombok.NonNull @lombok.Builder.Default @@ -55,10 +54,6 @@ public class DataRepository { @lombok.Builder.Default Instant expirationTime = Instant.MAX; - public boolean isExpired(@NonNull Clock clock) { - return !clock.instant().isBefore(expirationTime); - } - @NonNull public Optional getStructure(@NonNull DataStructureRef ref) { return structures diff --git a/sdmx-dl-api/src/main/java/sdmxdl/HasExpiration.java b/sdmx-dl-api/src/main/java/sdmxdl/HasExpiration.java new file mode 100644 index 000000000..a636a76a6 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/HasExpiration.java @@ -0,0 +1,18 @@ +package sdmxdl; + +import lombok.NonNull; + +import java.time.Clock; +import java.time.Instant; + +/** + * Defines the ability to expire. + */ +public interface HasExpiration { + + @NonNull Instant getExpirationTime(); + + default boolean isExpired(@NonNull Clock clock) { + return !clock.instant().isBefore(getExpirationTime()); + } +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java similarity index 72% rename from sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java rename to sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java index 2f9785235..535e1fe2c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCache.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/Cache.java @@ -14,14 +14,14 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.file.spi; +package sdmxdl.ext; import internal.sdmxdl.NoOpCache; import lombok.NonNull; import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; +import sdmxdl.HasExpiration; import java.time.Clock; @@ -29,16 +29,17 @@ * @author Philippe Charles */ @NotThreadSafe -public interface FileCache { +public interface Cache { - @NonNull Clock getFileClock(); + @NonNull Clock getClock(); - @Nullable DataRepository getFileRepository(@NonNull String key); + @Nullable V get(@NonNull String key); - void putFileRepository(@NonNull String key, @NonNull DataRepository value); + void put(@NonNull String key, @NonNull V value); + @SuppressWarnings("unchecked") @StaticFactoryMethod - static @NonNull FileCache noOp() { - return NoOpCache.INSTANCE; + static @NonNull Cache noOp() { + return (Cache) NoOpCache.INSTANCE; } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java index 40c8af367..15b58dee2 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -8,8 +8,10 @@ import nbbrd.service.ServiceId; import nbbrd.service.ServiceSorter; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; import java.util.Collection; @@ -27,7 +29,7 @@ public interface FileCaching { @ServiceSorter(reverse = true) int getFileCachingRank(); - @NonNull FileCache getFileCache( + @NonNull Cache getReaderCache( @NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index 09116d700..bac941d8a 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -2,8 +2,10 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; @lombok.Value @@ -17,7 +19,7 @@ public class FileContext { @Nullable ErrorListener onError; - public @NonNull FileCache getCache(@NonNull SdmxFileSource source) { - return caching.getFileCache(source, onEvent, onError); + public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source) { + return caching.getReaderCache(source, onEvent, onError); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java index 256ad7f72..a2c0709cc 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/MonitorReports.java @@ -1,15 +1,15 @@ package sdmxdl.web; import lombok.NonNull; +import sdmxdl.HasExpiration; -import java.time.Clock; import java.time.Duration; import java.time.Instant; import java.util.List; @lombok.Value @lombok.Builder(toBuilder = true) -public class MonitorReports { +public class MonitorReports implements HasExpiration { @NonNull String uriScheme; @@ -22,10 +22,6 @@ public class MonitorReports { @lombok.Builder.Default @NonNull Instant expirationTime = Instant.MAX; - public boolean isExpired(@NonNull Clock clock) { - return !clock.instant().isBefore(expirationTime); - } - public static final class Builder { public @NonNull Builder ttl(@NonNull Instant creationTime, @NonNull Duration ttl) { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java deleted file mode 100644 index 1784135a1..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCache.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2016 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package sdmxdl.web.spi; - -import internal.sdmxdl.NoOpCache; -import lombok.NonNull; -import nbbrd.design.NotThreadSafe; -import nbbrd.design.StaticFactoryMethod; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.web.MonitorReports; - -import java.time.Clock; - -/** - * @author Philippe Charles - */ -@NotThreadSafe -public interface WebCache { - - @NonNull Clock getWebClock(); - - @Nullable DataRepository getWebRepository(@NonNull String key); - - void putWebRepository(@NonNull String key, @NonNull DataRepository value); - - @Nullable MonitorReports getWebMonitorReports(@NonNull String key); - - void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value); - - @StaticFactoryMethod - static @NonNull WebCache noOp() { - return NoOpCache.INSTANCE; - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java index eef570aef..b465fdf99 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -8,8 +8,11 @@ import nbbrd.service.ServiceId; import nbbrd.service.ServiceSorter; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.ext.Cache; +import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; import java.util.Collection; @@ -27,7 +30,12 @@ public interface WebCaching { @ServiceSorter(reverse = true) int getWebCachingRank(); - @NonNull WebCache getWebCache( + @NonNull Cache getDriverCache( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); + + @NonNull Cache getMonitorCache( @NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 805e195ed..7c39d3ff8 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -18,8 +18,11 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.ext.Cache; +import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; import java.util.List; @@ -44,8 +47,12 @@ public class WebContext { @lombok.Builder.Default @NonNull Networking networking = Networking.getDefault(); - public @NonNull WebCache getCache(@NonNull SdmxWebSource source) { - return caching.getWebCache(source, onEvent, onError); + public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source) { + return caching.getDriverCache(source, onEvent, onError); + } + + public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source) { + return caching.getMonitorCache(source, onEvent, onError); } public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java similarity index 55% rename from sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java rename to sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java index 236f09576..9c87425ed 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/WebCacheTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java @@ -1,13 +1,12 @@ package sdmxdl.ext; import org.junit.jupiter.api.Test; -import sdmxdl.web.spi.WebCache; import tests.sdmxdl.ext.CacheAssert; -public class WebCacheTest { +public class CacheTest { @Test public void testNoOp() { - CacheAssert.assertCompliance(WebCache.noOp()); + CacheAssert.assertCompliance(Cache.noOp()); } } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java index ce48ec7a9..dfe4b894f 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java @@ -1,8 +1,8 @@ package tests.sdmxdl.ext; import org.assertj.core.api.SoftAssertions; -import sdmxdl.web.spi.WebCache; -import sdmxdl.web.MonitorReports; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; import tests.sdmxdl.api.TckUtil; import java.time.Duration; @@ -14,79 +14,47 @@ @lombok.experimental.UtilityClass public class CacheAssert { - public void assertCompliance(WebCache cache) { + public void assertCompliance(Cache cache) { TckUtil.run(s -> assertCompliance(s, cache)); } - public void assertCompliance(SoftAssertions s, WebCache cache) { + public void assertCompliance(SoftAssertions s, Cache cache) { checkClock(s, cache); checkRepository(s, cache); - checkMonitor(s, cache); } - private static void checkClock(SoftAssertions s, WebCache cache) { - s.assertThat(cache.getWebClock()) - .isEqualTo(cache.getWebClock()) + private static void checkClock(SoftAssertions s, Cache cache) { + s.assertThat(cache.getClock()) + .isEqualTo(cache.getClock()) .isNotNull(); } - private static void checkRepository(SoftAssertions s, WebCache cache) { - s.assertThatThrownBy(() -> cache.putWebRepository(null, REPO)) + private static void checkRepository(SoftAssertions s, Cache cache) { + s.assertThatThrownBy(() -> cache.put(null, REPO)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.putWebRepository("key", null)) + s.assertThatThrownBy(() -> cache.put("key", null)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.getWebRepository(null)) + s.assertThatThrownBy(() -> cache.get(null)) .isInstanceOf(NullPointerException.class); - s.assertThat(cache.getWebRepository("key")) + s.assertThat(cache.get("key")) .isNull(); - s.assertThatCode(() -> cache.putWebRepository("key", REPO.toBuilder().ttl(cache.getWebClock().instant(), Duration.ZERO).build())) + s.assertThatCode(() -> cache.put("key", REPO.toBuilder().ttl(cache.getClock().instant(), Duration.ZERO).build())) .doesNotThrowAnyException(); - s.assertThat(cache.getWebRepository("key")) + s.assertThat(cache.get("key")) .isNull(); - s.assertThatCode(() -> cache.putWebRepository("key", REPO)) + s.assertThatCode(() -> cache.put("key", REPO)) .doesNotThrowAnyException(); - s.assertThat(cache.getWebRepository("key")) + s.assertThat(cache.get("key")) .satisfiesAnyOf( result -> assertThat(result).isNull(), result -> assertThat(result).isEqualTo(REPO) ); } - - private static void checkMonitor(SoftAssertions s, WebCache cache) { - MonitorReports report = MonitorReports.builder().uriScheme("testscheme").build(); - - s.assertThatThrownBy(() -> cache.putWebMonitorReports(null, report)) - .isInstanceOf(NullPointerException.class); - - s.assertThatThrownBy(() -> cache.putWebMonitorReports("key", null)) - .isInstanceOf(NullPointerException.class); - - s.assertThatThrownBy(() -> cache.getWebMonitorReports(null)) - .isInstanceOf(NullPointerException.class); - - s.assertThat(cache.getWebMonitorReports("key")) - .isNull(); - - s.assertThatCode(() -> cache.putWebMonitorReports("key", report.toBuilder().ttl(cache.getWebClock().instant(), Duration.ZERO).build())) - .doesNotThrowAnyException(); - - s.assertThat(cache.getWebMonitorReports("key")) - .isNull(); - - s.assertThatCode(() -> cache.putWebMonitorReports("key", report)) - .doesNotThrowAnyException(); - - s.assertThat(cache.getWebMonitorReports("key")) - .satisfiesAnyOf( - result -> assertThat(result).isNull(), - result -> assertThat(result).isEqualTo(report) - ); - } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index 3d866ae51..74a6d3e2c 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -23,10 +23,8 @@ import nbbrd.io.sys.SystemProperties; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; -import sdmxdl.DataRepository; -import sdmxdl.file.spi.FileCache; -import sdmxdl.web.MonitorReports; -import sdmxdl.web.spi.WebCache; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; import java.io.IOException; import java.nio.file.Files; @@ -35,7 +33,6 @@ import java.util.Locale; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Predicate; import java.util.function.UnaryOperator; import static java.util.Objects.requireNonNull; @@ -43,98 +40,46 @@ /** * @author Philippe Charles */ -@lombok.Getter @lombok.Builder(toBuilder = true) -public final class DiskCache implements FileCache, WebCache { +public final class DiskCache implements Cache { - @lombok.NonNull @lombok.Builder.Default - private final Path root = SDMXDL_TMP_DIR; + private final @NonNull Path root = SDMXDL_TMP_DIR; - @lombok.NonNull @lombok.Builder.Default - private final String fileNamePrefix = "sdmx_"; + private final @NonNull String namePrefix = "sdmx_"; - @lombok.NonNull @lombok.Builder.Default - private final String fileNameSuffix = "_"; + private final @NonNull String nameSuffix = "_"; - @lombok.NonNull @lombok.Builder.Default - private final UnaryOperator fileNameGenerator = NORMALIZE_HASH_CODE; + private final @NonNull UnaryOperator nameGenerator = NORMALIZE_HASH_CODE; - @lombok.NonNull @lombok.Builder.Default - private final FileFormat repositoryFormat = FileFormat.noOp(); - - @lombok.NonNull - @lombok.Builder.Default - private final FileFormat monitorFormat = FileFormat.noOp(); + private final @NonNull FileFormat format = FileFormat.noOp(); private final @Nullable Consumer onRead; private final @Nullable BiConsumer onError; - @lombok.NonNull @lombok.Builder.Default - private final Clock clock = Clock.systemDefaultZone(); + private final @NonNull Clock clock = Clock.systemDefaultZone(); @Override - public @NonNull Clock getFileClock() { + public @NonNull Clock getClock() { return clock; } @Override - public @NonNull Clock getWebClock() { - return clock; - } - - @Override - public @Nullable DataRepository getFileRepository(@NonNull String key) { - return read(repositoryFormat, this::isValid, key, FileType.REPOSITORY); - } - - @Override - public @Nullable DataRepository getWebRepository(@NonNull String key) { - return read(repositoryFormat, this::isValid, key, FileType.REPOSITORY); - } - - @Override - public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { - write(repositoryFormat, key, FileType.REPOSITORY, value); - } - - @Override - public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { - write(repositoryFormat, key, FileType.REPOSITORY, value); - } - - @Override - public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { - return read(monitorFormat, this::isValid, key, FileType.MONITOR); - } - - @Override - public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - write(monitorFormat, key, FileType.MONITOR, value); - } - - private boolean isValid(DataRepository value) { - return !value.isExpired(clock); - } - - private boolean isValid(MonitorReports value) { - return !value.isExpired(clock); - } - - private T read(FileFormat fileFormat, Predicate validator, String key, FileType fileType) { - T result = read(fileFormat, fileType, key); + public @Nullable V get(@NonNull String key) { + Path file = getFile(key); + V result = readFile(file); if (result == null) { reportRead(key, DiskCacheEvent.MISSED); return null; } - if (!validator.test(result)) { - delete(key, fileType, fileFormat); + if (result.isExpired(clock)) { + deleteFile(file); reportRead(key, DiskCacheEvent.EXPIRED); return null; } @@ -142,15 +87,20 @@ private T read(FileFormat fileFormat, Predicate validator, String key, return result; } + @Override + public void put(@NonNull String key, @NonNull V value) { + Path file = getFile(key); + writeFile(file, value); + } + private void reportRead(String key, DiskCacheEvent event) { if (onRead != null) onRead.accept(event.name() + " " + key); } - private T read(FileFormat fileFormat, FileType fileType, String key) { - Path file = getFile(key, fileType, fileFormat); + private V readFile(Path file) { if (Files.exists(file) && Files.isRegularFile(file)) { try { - return FileParser.onParsingLock(fileFormat.getParser()).parsePath(file); + return FileParser.onParsingLock(format.getParser()).parsePath(file); } catch (IOException ex) { if (onError != null) onError.accept("Failed reading '" + file + "'", ex); } @@ -158,11 +108,10 @@ private T read(FileFormat fileFormat, FileType fileType, String key) { return null; } - private void write(FileFormat fileFormat, String key, FileType fileType, T entry) { - Path file = getFile(key, fileType, fileFormat); + private void writeFile(Path file, V value) { ensureParentExists(file); try { - FileFormatter.onFormattingLock(fileFormat.getFormatter()).formatPath(entry, file); + FileFormatter.onFormattingLock(format.getFormatter()).formatPath(value, file); } catch (IOException ex) { if (onError != null) onError.accept("Failed writing '" + file + "'", ex); } @@ -176,8 +125,7 @@ private void ensureParentExists(Path file) { } } - private void delete(String key, FileType fileType, FileFormat fileFormat) { - Path file = getFile(key, fileType, fileFormat); + private void deleteFile(Path file) { try { Files.deleteIfExists(file); } catch (IOException ex) { @@ -186,11 +134,12 @@ private void delete(String key, FileType fileType, FileFormat fileFormat) { } @VisibleForTesting - Path getFile(String key, FileType fileType, FileFormat fileFormat) { - return root.resolve(fileNamePrefix + fileType.name().charAt(0) + fileNameGenerator.apply(key) + fileNameSuffix + fileFormat.getFileExtension()); + Path getFile(String key) { + return root.resolve(namePrefix + nameGenerator.apply(key) + nameSuffix + format.getFileExtension()); } public static final Path SDMXDL_TMP_DIR = requireNonNull(SystemProperties.DEFAULT.getJavaIoTmpdir()).resolve(About.NAME).resolve(About.VERSION); + private static final UnaryOperator NORMALIZE_HASH_CODE = DiskCache::normalizeHashCode; private static String normalizeHashCode(String key) { @@ -198,13 +147,7 @@ private static String normalizeHashCode(String key) { return String.format(Locale.ROOT, hashCode >= 0 ? "0%010d" : "1%010d", Math.abs(hashCode)); } - @VisibleForTesting - enum FileType { - REPOSITORY, MONITOR - } - - @VisibleForTesting - enum DiskCacheEvent { + private enum DiskCacheEvent { HIT, MISSED, EXPIRED } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index 240306bb6..9548be413 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -1,18 +1,18 @@ package sdmxdl.format; +import lombok.AccessLevel; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.Marker; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; -import sdmxdl.file.spi.FileCache; import sdmxdl.file.spi.FileCaching; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.nio.file.Path; @@ -25,39 +25,29 @@ @lombok.Builder(toBuilder = true) public final class DiskCachingSupport implements FileCaching, WebCaching { - @lombok.NonNull - private final String id; + @lombok.Getter(AccessLevel.PRIVATE) + private final @NonNull String id; @lombok.Builder.Default private final int rank = UNKNOWN_WEB_CACHING_RANK; - @lombok.NonNull @lombok.Builder.Default - private final Path root = DiskCache.SDMXDL_TMP_DIR; + private final @NonNull Path root = DiskCache.SDMXDL_TMP_DIR; - @lombok.NonNull @lombok.Builder.Default - private final FileFormat repositoryFormat = FileFormat.noOp(); + private final @NonNull FileFormat repositoryFormat = FileFormat.noOp(); - @lombok.NonNull @lombok.Builder.Default - private final FileFormat monitorFormat = FileFormat.noOp(); + private final @NonNull FileFormat monitorFormat = FileFormat.noOp(); - @lombok.NonNull @lombok.Builder.Default - private final Clock clock = Clock.systemDefaultZone(); + private final @NonNull Clock clock = Clock.systemDefaultZone(); @lombok.Builder.Default private final boolean noCompression = false; - private DiskCache.Builder newFileCacheBuilder() { - return DiskCache - .builder() - .root(root) - .repositoryFormat(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) - .monitorFormat(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat)) - .clock(clock); - } + @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) + private final Marker marker = initLazyMarker(); @Override public @NonNull String getFileCachingId() { @@ -80,18 +70,41 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return newFileCacheBuilder() - .onRead(onEvent != null ? onEvent.asConsumer(source, Marker.parse(id)) : null) - .onError(onError != null ? onError.asBiConsumer(source, Marker.parse(id)) : null) + public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return DiskCache + .builder() + .root(root) + .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) + .namePrefix("R") + .clock(clock) + .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) .build(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return newFileCacheBuilder() - .onRead(onEvent != null ? onEvent.asConsumer(source, Marker.parse(id)) : null) - .onError(onError != null ? onError.asBiConsumer(source, Marker.parse(id)) : null) + public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return DiskCache + .builder() + .root(root) + .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) + .namePrefix("D") + .clock(clock) + .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) + .build(); + } + + @Override + public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return DiskCache + .builder() + .root(root) + .format(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat)) + .namePrefix("M") + .clock(clock) + .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) .build(); } @@ -105,6 +118,10 @@ public int getWebCachingRank() { return Collections.emptyList(); } + private Marker initLazyMarker() { + return Marker.parse(getId()); + } + public static final class Builder { public @NonNull Builder persistence(@NonNull Persistence persistence) { diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java index 155899dd2..1d59c02ec 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCache.java @@ -16,102 +16,49 @@ */ package sdmxdl.format; +import lombok.AccessLevel; import lombok.NonNull; -import nbbrd.design.VisibleForTesting; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.file.spi.FileCache; -import sdmxdl.web.MonitorReports; -import sdmxdl.web.spi.WebCache; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; import java.time.Clock; import java.util.HashMap; import java.util.Map; -import java.util.function.Predicate; /** * @author Philippe Charles */ -@lombok.Getter @lombok.Builder(toBuilder = true) -public final class MemCache implements FileCache, WebCache { +public final class MemCache implements Cache { - @lombok.NonNull + @lombok.Getter(AccessLevel.PACKAGE) @lombok.Builder.Default - private final Map repositories = new HashMap<>(); + private final @NonNull Map map = new HashMap<>(); - @lombok.NonNull @lombok.Builder.Default - private final Map webMonitors = new HashMap<>(); - - @lombok.NonNull - @lombok.Builder.Default - private final Clock clock = Clock.systemDefaultZone(); + private final @NonNull Clock clock = Clock.systemDefaultZone(); @Override - public @NonNull Clock getFileClock() { + public @NonNull Clock getClock() { return clock; } @Override - public @NonNull Clock getWebClock() { - return clock; - } - - @Override - public @Nullable DataRepository getFileRepository(@NonNull String key) { - return getRepository(repositories, clock, key); - } - - @Override - public @Nullable DataRepository getWebRepository(@NonNull String key) { - return getRepository(repositories, clock, key); - } - - @Override - public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { - put(repositories, key, value); - } - - @Override - public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { - put(repositories, key, value); - } - - @Override - public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { - return getMonitorReports(webMonitors, clock, key); - } - - @Override - public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - put(webMonitors, key, value); - } - - @VisibleForTesting - static DataRepository getRepository(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { - return get(reports -> !reports.isExpired(clock), map, key); - } - - @VisibleForTesting - static MonitorReports getMonitorReports(@NonNull Map map, @NonNull Clock clock, @NonNull String key) { - return get(reports -> !reports.isExpired(clock), map, key); - } - - @Nullable - private static T get(@NonNull Predicate validator, @NonNull Map map, @NonNull String key) { - T result = map.get(key); + public @Nullable V get(@NonNull String key) { + V result = map.get(key); if (result == null) { return null; } - if (!validator.test(result)) { + if (result.isExpired(clock)) { map.remove(key); return null; } return result; } - private static void put(@NonNull Map map, @NonNull String key, @NonNull T value) { + @Override + public void put(@NonNull String key, @NonNull V value) { map.put(key, value); } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index dd36b2f88..09c129ee5 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -5,12 +5,11 @@ import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.file.spi.FileCache; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.time.Clock; @@ -65,13 +64,30 @@ public int getWebCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return getCache(); + public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return MemCache + .builder() + .map(repositories.get()) + .clock(clock) + .build(); } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return getCache(); + public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return MemCache + .builder() + .map(repositories.get()) + .clock(clock) + .build(); + } + + @Override + public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + return MemCache + .builder() + .map(webMonitors.get()) + .clock(clock) + .build(); } @Override @@ -84,15 +100,6 @@ public int getWebCachingRank() { return Collections.emptyList(); } - private MemCache getCache() { - return MemCache - .builder() - .repositories(repositories.get()) - .webMonitors(webMonitors.get()) - .clock(clock) - .build(); - } - public static final class Builder { public @NonNull Builder repositoriesOf(@NonNull ConcurrentMap repositories) { diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java index 3eacd55e2..48914ceb7 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java @@ -32,9 +32,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.UnaryOperator; import java.util.stream.Collectors; +import static java.util.function.UnaryOperator.identity; import static org.assertj.core.api.Assertions.assertThat; /** @@ -48,25 +48,25 @@ public void testCompliance() { } @Test - public void testGetSet(@TempDir Path temp) throws IOException { + public void testGetSet(@TempDir Path temp) { FakeClock clock = new FakeClock(); clock.set(1000); - FileFormat serializer = newFakeFileFormat(); + Path root = temp.resolve("testfolder"); List exceptions = new ArrayList<>(); - DiskCache cache = DiskCache - .builder() - .root(temp.resolve("testfolder")) - .fileNameGenerator(UnaryOperator.identity()) - .repositoryFormat(serializer) + DiskCache cache = DiskCache + .builder() + .root(root) + .nameGenerator(identity()) + .format(newFakeFileFormat()) .clock(clock) .onError((message, exception) -> exceptions.add(exception)) .build(); - assertThat(cache.getRoot()) + assertThat(root) .doesNotExist(); - assertThat(cache.getWebRepository("KEY1")) + assertThat(cache.get("KEY1")) .as("Empty directory should return null") .isNull(); @@ -75,25 +75,25 @@ public void testGetSet(@TempDir Path temp) throws IOException { .name("r1") .ttl(clock.instant(), Duration.ofMillis(10)) .build(); - cache.putWebRepository("KEY1", r1); - assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) + cache.put("KEY1", r1); + assertThat(cache.getFile("KEY1")) .exists() .hasContent("r1"); - assertThat(cache.getWebRepository("KEY2")) + assertThat(cache.get("KEY2")) .as("Non-existing key should return null") .isNull(); clock.plus(9); - assertThat(cache.getWebRepository("KEY1")) + assertThat(cache.get("KEY1")) .as("Non-expired key should return value") .isEqualTo(r1); clock.plus(1); - assertThat(cache.getWebRepository("KEY1")) + assertThat(cache.get("KEY1")) .as("Expired key should return null") .isNull(); - assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) + assertThat(cache.getFile("KEY1")) .as("Expired key should be deleted") .doesNotExist(); @@ -106,12 +106,12 @@ public void testGetSet(@TempDir Path temp) throws IOException { .name("r2") .ttl(clock.instant(), Duration.ofMillis(10)) .build(); - cache.putWebRepository("KEY1", r1b); - cache.putWebRepository("KEY1", r2); - assertThat(cache.getFile("KEY1", DiskCache.FileType.REPOSITORY, serializer)) + cache.put("KEY1", r1b); + cache.put("KEY1", r2); + assertThat(cache.getFile("KEY1")) .exists() .hasContent("r2"); - assertThat(cache.getWebRepository("KEY1")) + assertThat(cache.get("KEY1")) .as("Updated key should return updated value") .isEqualTo(r2); diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java index 9e79204f4..c08347f55 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java @@ -19,6 +19,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; import tests.sdmxdl.ext.CacheAssert; +import tests.sdmxdl.ext.FakeClock; import java.time.Clock; import java.time.Duration; @@ -27,7 +28,6 @@ import java.util.HashMap; import java.util.Map; import java.util.TreeMap; -import java.util.concurrent.ConcurrentHashMap; import static org.assertj.core.api.Assertions.assertThat; @@ -42,10 +42,19 @@ public void testCompliance() { } @Test - public void testGetRepository() { + public void testGet() { Map map = new HashMap<>(); - assertThat(MemCache.getRepository(map, clock(1000), "KEY1")) + FakeClock clock = new FakeClock(); + + MemCache x = MemCache + .builder() + .map(map) + .clock(clock) + .build(); + + clock.set(1000); + assertThat(x.get("KEY1")) .as("Empty map should return null") .isNull(); @@ -55,18 +64,21 @@ public void testGetRepository() { .ttl(clock(1000).instant(), Duration.ofMillis(10)) .build(); map.put("KEY1", r1000); - assertThat(MemCache.getRepository(map, clock(1009), "KEY1")) + clock.set(1009); + assertThat(x.get("KEY1")) .as("Non-expired key should return value") .isEqualTo(r1000); - assertThat(MemCache.getRepository(map, clock(1010), "KEY1")) + clock.set(1010); + assertThat(x.get("KEY1")) .as("Expired key should return null") .isNull(); assertThat(map) .as("Expired key should be evicted") .doesNotContainKey("KEY1"); - assertThat(MemCache.getRepository(map, clock(1009), "KEY2")) + clock.set(1009); + assertThat(x.get("KEY2")) .as("Non-existing key should return null") .isNull(); @@ -76,30 +88,19 @@ public void testGetRepository() { .ttl(clock(1009).instant(), Duration.ofMillis(10)) .build(); map.put("KEY1", r1009); - assertThat(MemCache.getRepository(map, clock(1010), "KEY1")) + clock.set(1010); + assertThat(x.get("KEY1")) .as("Updated key should return updated value") .isEqualTo(r1009); } @Test public void testMapFactories() { - assertThat(MemCache.builder().build()) - .satisfies(x -> { - assertThat(x.getRepositories()) - .isInstanceOf(HashMap.class); - - assertThat(x.getWebMonitors()) - .isInstanceOf(HashMap.class); - }); - - assertThat(MemCache.builder().repositories(new TreeMap<>()).webMonitors(new ConcurrentHashMap<>()).build()) - .satisfies(x -> { - assertThat(x.getRepositories()) - .isInstanceOf(TreeMap.class); - - assertThat(x.getWebMonitors()) - .isInstanceOf(ConcurrentHashMap.class); - }); + assertThat(MemCache.builder().build().getMap()) + .isInstanceOf(HashMap.class); + + assertThat(MemCache.builder().map(new TreeMap<>()).build().getMap()) + .isInstanceOf(TreeMap.class); } private static Clock clock(long value) { diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java index 4612eff70..38cb4183e 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java @@ -9,7 +9,6 @@ import java.io.File; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentSkipListMap; import static org.assertj.core.api.Assertions.assertThat; import static sdmxdl.format.MemCachingSupport.builder; @@ -20,33 +19,37 @@ public class MemCachingSupportTest { @EnumSource(Extractor.class) public void testFactories(Extractor extractor) { assertThat(builder().id("").build()) - .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isNotSameAs(extractor.f(x).getRepositories()).isInstanceOf(HashMap.class)) - .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isNotSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(HashMap.class)); + .satisfies(x -> assertThat(extractor.f(x).getMap()).isNotSameAs(extractor.f(x).getMap()).isInstanceOf(HashMap.class)); - assertThat(builder().id("").repositories(ConcurrentHashMap::new).webMonitors(ConcurrentSkipListMap::new).build()) - .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isNotSameAs(extractor.f(x).getRepositories()).isInstanceOf(ConcurrentHashMap.class)) - .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isNotSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(ConcurrentSkipListMap.class)); + assertThat(builder().id("").repositories(ConcurrentHashMap::new).webMonitors(ConcurrentHashMap::new).build()) + .satisfies(x -> assertThat(extractor.f(x).getMap()).isNotSameAs(extractor.f(x).getMap()).isInstanceOf(ConcurrentHashMap.class)); - assertThat(builder().id("").repositoriesOf(new ConcurrentHashMap<>()).webMonitorsOf(new ConcurrentSkipListMap<>()).build()) - .satisfies(x -> assertThat(extractor.f(x).getRepositories()).isSameAs(extractor.f(x).getRepositories()).isInstanceOf(ConcurrentHashMap.class)) - .satisfies(x -> assertThat(extractor.f(x).getWebMonitors()).isSameAs(extractor.f(x).getWebMonitors()).isInstanceOf(ConcurrentSkipListMap.class)); + assertThat(builder().id("").repositoriesOf(new ConcurrentHashMap<>()).webMonitorsOf(new ConcurrentHashMap<>()).build()) + .satisfies(x -> assertThat(extractor.f(x).getMap()).isSameAs(extractor.f(x).getMap()).isInstanceOf(ConcurrentHashMap.class)); } enum Extractor { - FILE { + READER { @Override - MemCache f(MemCachingSupport z) { - return (MemCache) z.getFileCache(FILE_SOURCE, null, null); + MemCache f(MemCachingSupport z) { + return (MemCache) z.getReaderCache(FILE_SOURCE, null, null); } - }, WEB { + }, + DRIVER { @Override - MemCache f(MemCachingSupport z) { - return (MemCache) z.getWebCache(WEB_SOURCE, null, null); + MemCache f(MemCachingSupport z) { + return (MemCache) z.getDriverCache(WEB_SOURCE, null, null); + } + }, + MONITOR { + @Override + MemCache f(MemCachingSupport z) { + return (MemCache) z.getMonitorCache(WEB_SOURCE, null, null); } }; - abstract MemCache f(MemCachingSupport z); + abstract MemCache f(MemCachingSupport z); } private final static SdmxFileSource FILE_SOURCE = SdmxFileSource.builder().data(new File("")).build(); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java similarity index 74% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java index 1839be53f..97c3f99dd 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/FileTypedId.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/TypedId.java @@ -21,7 +21,7 @@ import nbbrd.io.function.IOSupplier; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.DataRepository; -import sdmxdl.file.spi.FileCache; +import sdmxdl.ext.Cache; import java.io.IOException; import java.io.UncheckedIOException; @@ -41,14 +41,14 @@ */ @lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE) @lombok.EqualsAndHashCode -public final class FileTypedId { +public final class TypedId { @NonNull - public static FileTypedId of( + public static TypedId of( @NonNull URI content, @NonNull Function loader, @NonNull Function storer) { - return new FileTypedId<>(content, loader, storer); + return new TypedId<>(content, loader, storer); } @NonNull @@ -62,27 +62,27 @@ public static FileTypedId of( private final Function storer; @NonNull - public FileTypedId with(@NonNull Object o) { - return new FileTypedId<>(resolveURI(content, o.toString()), loader, storer); + public TypedId with(@NonNull Object o) { + return new TypedId<>(resolveURI(content, o.toString()), loader, storer); } @Nullable - public T peek(@NonNull FileCache cache) { - DataRepository repo = cache.getFileRepository(content.toString()); + public T peek(@NonNull Cache cache) { + DataRepository repo = cache.get(content.toString()); return repo != null ? loader.apply(repo) : null; } @NonNull - public T load(@NonNull FileCache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { + public T load(@NonNull Cache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { return load(cache, factory, ttl, o -> true); } @NonNull - public T load(@NonNull FileCache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { + public T load(@NonNull Cache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { T result = peek(cache); if (result == null || !validator.test(result)) { result = factory.getWithIO(); - cache.putFileRepository(content.toString(), storer.apply(result).toBuilder().ttl(cache.getFileClock().instant(), ttl.apply(result)).build()); + cache.put(content.toString(), storer.apply(result).toBuilder().ttl(cache.getClock().instant(), ttl.apply(result)).build()); } return result; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java deleted file mode 100644 index c49c36ab2..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/WebTypedId.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package sdmxdl.provider; - -import lombok.AccessLevel; -import lombok.NonNull; -import nbbrd.io.function.IOSupplier; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.web.spi.WebCache; - -import java.io.IOException; -import java.io.UncheckedIOException; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.time.Duration; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * @param - * @author Philippe Charles - */ -@lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE) -@lombok.EqualsAndHashCode -public final class WebTypedId { - - @NonNull - public static WebTypedId of( - @NonNull URI content, - @NonNull Function loader, - @NonNull Function storer) { - return new WebTypedId<>(content, loader, storer); - } - - @lombok.NonNull - @lombok.Getter - private final URI content; - - @lombok.NonNull - private final Function loader; - - @lombok.NonNull - private final Function storer; - - @NonNull - public WebTypedId with(@NonNull Object o) { - return new WebTypedId<>(resolveURI(content, o.toString()), loader, storer); - } - - @Nullable - public T peek(@NonNull WebCache cache) { - DataRepository repo = cache.getWebRepository(content.toString()); - return repo != null ? loader.apply(repo) : null; - } - - @NonNull - public T load(@NonNull WebCache cache, @NonNull IOSupplier factory, @NonNull Function ttl) throws IOException { - return load(cache, factory, ttl, o -> true); - } - - @NonNull - public T load(@NonNull WebCache cache, @NonNull IOSupplier factory, @NonNull Function ttl, @NonNull Predicate validator) throws IOException { - T result = peek(cache); - if (result == null || !validator.test(result)) { - result = factory.getWithIO(); - cache.putWebRepository(content.toString(), storer.apply(result).toBuilder().ttl(cache.getWebClock().instant(), ttl.apply(result)).build()); - } - return result; - } - - public static URI resolveURI(URI base, String... items) { - return URI.create(Stream.of(items) - .map(item -> { - try { - return URLEncoder.encode(item, StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException ex) { - throw new UncheckedIOException(ex); - } - }) - .collect(Collectors.joining("/", base + "/", ""))); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java new file mode 100644 index 000000000..3260663cb --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualCache.java @@ -0,0 +1,39 @@ +package sdmxdl.provider.ext; + +import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; + +import java.time.Clock; + +@lombok.AllArgsConstructor +public final class DualCache implements Cache { + + private final @NonNull Cache first; + private final @NonNull Cache second; + private final @NonNull Clock clock; + + @Override + public @NonNull Clock getClock() { + return clock; + } + + @Override + public @Nullable V get(@NonNull String key) { + V result = first.get(key); + if (result == null) { + result = second.get(key); + if (result != null) { + first.put(key, result); + } + } + return result; + } + + @Override + public void put(@NonNull String key, @NonNull V value) { + first.put(key, value); + second.put(key, value); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java deleted file mode 100644 index ca8e3aa89..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCache.java +++ /dev/null @@ -1,58 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.web.MonitorReports; -import sdmxdl.web.spi.WebCache; - -import java.time.Clock; - -@lombok.AllArgsConstructor -public final class DualWebCache implements WebCache { - - private final @NonNull WebCache first; - private final @NonNull WebCache second; - private final @NonNull Clock clock; - - @Override - public @NonNull Clock getWebClock() { - return clock; - } - - @Override - public @Nullable DataRepository getWebRepository(@NonNull String key) { - DataRepository result = first.getWebRepository(key); - if (result == null) { - result = second.getWebRepository(key); - if (result != null) { - first.putWebRepository(key, result); - } - } - return result; - } - - @Override - public void putWebRepository(@NonNull String key, @NonNull DataRepository value) { - first.putWebRepository(key, value); - second.putWebRepository(key, value); - } - - @Override - public @Nullable MonitorReports getWebMonitorReports(@NonNull String key) { - MonitorReports result = first.getWebMonitorReports(key); - if (result == null) { - result = second.getWebMonitorReports(key); - if (result != null) { - first.putWebMonitorReports(key, result); - } - } - return result; - } - - @Override - public void putWebMonitorReports(@NonNull String key, @NonNull MonitorReports value) { - first.putWebMonitorReports(key, value); - second.putWebMonitorReports(key, value); - } -} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java index 6eacaf3d7..190efad22 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java @@ -2,11 +2,13 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; +import sdmxdl.ext.Cache; import sdmxdl.format.ServiceSupport; +import sdmxdl.web.MonitorReports; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.WebCaching; import java.time.Clock; @@ -48,9 +50,15 @@ public int getWebCachingRank() { } @Override - public @NonNull WebCache getWebCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - WebCache main = first.getWebCache(source, onEvent, onError); - return new DualWebCache(main, second.getWebCache(source, onEvent, onError), clock); + public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + Cache main = first.getDriverCache(source, onEvent, onError); + return new DualCache<>(main, second.getDriverCache(source, onEvent, onError), clock); + } + + @Override + public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + Cache main = first.getMonitorCache(source, onEvent, onError); + return new DualCache<>(main, second.getMonitorCache(source, onEvent, onError), clock); } @Override diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java index c4a0a1805..27b76d883 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java @@ -19,12 +19,11 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import sdmxdl.*; -import sdmxdl.file.spi.FileCache; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.DataRef; -import sdmxdl.provider.FileTypedId; import sdmxdl.provider.Marker; -import sdmxdl.provider.WebTypedId; +import sdmxdl.provider.TypedId; import java.io.IOException; import java.net.URI; @@ -40,13 +39,13 @@ public final class CachedFileClient implements FileClient { public static @NonNull CachedFileClient of( - @NonNull FileClient client, @NonNull FileCache cache, + @NonNull FileClient client, @NonNull Cache cache, @NonNull SdmxFileSource source, @NonNull Languages languages) { return new CachedFileClient(client, cache, getBase(source, languages)); } private static URI getBase(SdmxFileSource source, Languages languages) { - return WebTypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); + return TypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); } // TODO: replace ttl with file last modification time @@ -56,26 +55,26 @@ private static URI getBase(SdmxFileSource source, Languages languages) { private final FileClient delegate; @lombok.NonNull - private final FileCache cache; + private final Cache cache; @lombok.NonNull private final URI base; @lombok.Getter(lazy = true) - private final FileTypedId idOfDecode = initIdOfDecode(base); + private final TypedId idOfDecode = initIdOfDecode(base); @lombok.Getter(lazy = true) - private final FileTypedId idOfLoadData = initIdOfLoadData(base); + private final TypedId idOfLoadData = initIdOfLoadData(base); - private static FileTypedId initIdOfDecode(URI base) { - return FileTypedId.of(base, + private static TypedId initIdOfDecode(URI base) { + return TypedId.of(base, repo -> FileInfo.of(MediaType.parse(repo.getName()), repo.getStructures().stream().findFirst().orElse(null)), info -> DataRepository.builder().name(info.getDataType().toString()).structure(info.getStructure()).build() ).with("decode"); } - private static FileTypedId initIdOfLoadData(URI base) { - return FileTypedId.of(base, + private static TypedId initIdOfLoadData(URI base) { + return TypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), data -> DataRepository.builder().dataSet(data).build() ).with("loadData"); diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java index d18980610..7d8f447d8 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java @@ -19,10 +19,10 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; import sdmxdl.*; -import sdmxdl.web.spi.WebCache; +import sdmxdl.ext.Cache; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; -import sdmxdl.provider.WebTypedId; +import sdmxdl.provider.TypedId; import sdmxdl.web.SdmxWebSource; import java.io.IOException; @@ -41,21 +41,21 @@ final class CachedRestClient implements RestClient { static @NonNull RestClient of( - @NonNull RestClient client, @NonNull WebCache cache, long ttlInMillis, + @NonNull RestClient client, @NonNull Cache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedRestClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } @VisibleForTesting static URI getBase(SdmxWebSource source, Languages languages) { - return WebTypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); + return TypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); } @lombok.NonNull private final RestClient delegate; @lombok.NonNull - private final WebCache cache; + private final Cache cache; @lombok.NonNull private final URI base; @@ -64,50 +64,50 @@ static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final WebTypedId> idOfFlows = initIdOfFlows(base); + private final TypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfFlow = initIdOfFlow(base); + private final TypedId idOfFlow = initIdOfFlow(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfStruct = initIdOfStruct(base); + private final TypedId idOfStruct = initIdOfStruct(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfSeriesKeysOnly = initIdOfSeriesKeysOnly(base); + private final TypedId idOfSeriesKeysOnly = initIdOfSeriesKeysOnly(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfNoData = initIdOfNoData(base); + private final TypedId idOfNoData = initIdOfNoData(base); - private static WebTypedId> initIdOfFlows(URI base) { - return WebTypedId.of(base, + private static TypedId> initIdOfFlows(URI base) { + return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("flows"); } - private static WebTypedId initIdOfFlow(URI base) { - return WebTypedId.of(base, + private static TypedId initIdOfFlow(URI base) { + return TypedId.of(base, repo -> repo.getFlows().stream().findFirst().orElse(null), flow -> DataRepository.builder().flow(flow).build() ).with("flow"); } - private static WebTypedId initIdOfStruct(URI base) { - return WebTypedId.of(base, + private static TypedId initIdOfStruct(URI base) { + return TypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() ).with("struct"); } - private static WebTypedId initIdOfSeriesKeysOnly(URI base) { - return WebTypedId.of(base, + private static TypedId initIdOfSeriesKeysOnly(URI base) { + return TypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), dataSet -> DataRepository.builder().dataSet(dataSet).build() ).with("seriesKeysOnly"); } - private static WebTypedId initIdOfNoData(URI base) { - return WebTypedId.of(base, + private static TypedId initIdOfNoData(URI base) { + return TypedId.of(base, repo -> repo.getDataSets().stream().findFirst().orElse(null), dataSet -> DataRepository.builder().dataSet(dataSet).build() ).with("noData"); @@ -165,17 +165,17 @@ private List loadDataflowsWithCache() throws IOException { } private DataStructure loadDataStructureWithCache(DataStructureRef ref) throws IOException { - WebTypedId id = getIdOfStruct().with(ref); + TypedId id = getIdOfStruct().with(ref); return id.load(cache, () -> delegate.getStructure(ref), this::getTtl); } private DataSet loadSeriesKeysOnlyWithCache(DataRef ref, DataStructure dsd) throws IOException { - WebTypedId id = getIdOfSeriesKeysOnly().with(ref.getFlowRef()); + TypedId id = getIdOfSeriesKeysOnly().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } private DataSet loadNoDataWithCache(DataRef ref, DataStructure dsd) throws IOException { - WebTypedId id = getIdOfNoData().with(ref.getFlowRef()); + TypedId id = getIdOfNoData().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } @@ -195,7 +195,7 @@ private Dataflow peekDataflowFromCache(DataflowRef ref) { } private Dataflow loadDataflowWithCache(DataflowRef ref) throws IOException { - WebTypedId id = getIdOfFlow().with(ref); + TypedId id = getIdOfFlow().with(ref); return id.load(cache, () -> delegate.getFlow(ref), this::getTtl); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index 27b8330a6..ddfae27a7 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -34,7 +34,7 @@ public final class RestConnector implements WebConnector { private RestClient getClient(SdmxWebSource source, Languages languages, WebContext context) throws IOException { return CachedRestClient.of( client.get(source, languages, context), - context.getCache(source), + context.getDriverCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, languages); diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java index f77c94796..d4a783f66 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/CachingAssert.java @@ -46,8 +46,8 @@ public void reset() { clock.set(0); } - public MemCache newCache() { - return MemCache.builder().repositories(map).webMonitors(monitors).clock(clock).build(); + public MemCache newCache() { + return MemCache.builder().map(map).clock(clock).build(); } } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java similarity index 88% rename from sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java rename to sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java index 585827cce..62824ff58 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/WebTypedIdTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/TypedIdTest.java @@ -3,7 +3,7 @@ import nbbrd.io.function.IOSupplier; import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; -import sdmxdl.web.spi.WebCache; +import sdmxdl.ext.Cache; import sdmxdl.format.MemCache; import tests.sdmxdl.ext.FakeClock; @@ -14,11 +14,11 @@ import static org.assertj.core.api.Assertions.assertThat; -public class WebTypedIdTest { +public class TypedIdTest { @Test public void test() throws IOException { - WebTypedId id = WebTypedId.of( + TypedId id = TypedId.of( URI.create("cache://key"), repo -> Integer.parseInt(repo.getName()), data -> DataRepository.builder().name(Integer.toString(data)).build() @@ -26,7 +26,7 @@ public void test() throws IOException { FakeClock clock = new FakeClock(); - WebCache cache = MemCache.builder().clock(clock).build(); + Cache cache = MemCache.builder().clock(clock).build(); IOSupplier factory = new AtomicInteger()::getAndIncrement; diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java index 453015e35..a226dba95 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.*; import sdmxdl.provider.DataRef; -import sdmxdl.provider.WebTypedId; +import sdmxdl.provider.TypedId; import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.api.RepoSamples; @@ -54,11 +54,11 @@ public class CachedRestClientTest { private final URI base = URI.create("cache:rest"); private final Duration ttl = Duration.ofMillis(100); - private final String flowsId = WebTypedId.resolveURI(base, "flows").toString(); - private final String flowId = WebTypedId.resolveURI(base, "flow", FLOW_REF.toString()).toString(); - private final String structId = WebTypedId.resolveURI(base, "struct", STRUCT_REF.toString()).toString(); - private final String seriesKeysOnlyId = WebTypedId.resolveURI(base, "seriesKeysOnly", FLOW_REF.toString()).toString(); - private final String noDataId = WebTypedId.resolveURI(base, "noData", FLOW_REF.toString()).toString(); + private final String flowsId = TypedId.resolveURI(base, "flows").toString(); + private final String flowId = TypedId.resolveURI(base, "flow", FLOW_REF.toString()).toString(); + private final String structId = TypedId.resolveURI(base, "struct", STRUCT_REF.toString()).toString(); + private final String seriesKeysOnlyId = TypedId.resolveURI(base, "seriesKeysOnly", FLOW_REF.toString()).toString(); + private final String noDataId = TypedId.resolveURI(base, "noData", FLOW_REF.toString()).toString(); private CachedRestClient getClient(CachingAssert.Context ctx) { RestClient original = XRepoRestClient.of(RepoSamples.REPO); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java index 4211e0d70..583abcec1 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -63,7 +63,7 @@ private FileClient getClient(SdmxFileSource source, Languages languages, FileCon ObsParser::newDefault, context.getOnEvent() ); - return CachedFileClient.of(client, context.getCache(source), source, languages); + return CachedFileClient.of(client, context.getReaderCache(source), source, languages); } private static final DataStructureRef EMPTY = DataStructureRef.of("", "", ""); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java index 623013c9b..936b63e66 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -9,13 +9,12 @@ import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.*; -import sdmxdl.file.spi.FileCache; +import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileManager; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.WebContext; @@ -77,8 +76,8 @@ public int getFileCachingRank() { } @Override - public @NonNull FileCache getFileCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { - return new FileCacheAdapter(delegate.getWebCache(webSource, onWebEvent, onWebError)); + public @NonNull Cache getReaderCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { + return new FileCacheAdapter(delegate.getDriverCache(webSource, onWebEvent, onWebError)); } @Override @@ -88,23 +87,23 @@ public int getFileCachingRank() { } @lombok.AllArgsConstructor - private static final class FileCacheAdapter implements FileCache { + private static final class FileCacheAdapter implements Cache { - private final @NonNull WebCache delegate; + private final @NonNull Cache delegate; @Override - public @NonNull Clock getFileClock() { - return delegate.getWebClock(); + public @NonNull Clock getClock() { + return delegate.getClock(); } @Override - public @Nullable DataRepository getFileRepository(@NonNull String key) { - return delegate.getWebRepository(key); + public @Nullable DataRepository get(@NonNull String key) { + return delegate.get(key); } @Override - public void putFileRepository(@NonNull String key, @NonNull DataRepository value) { - delegate.putWebRepository(key, value); + public void put(@NonNull String key, @NonNull DataRepository value) { + delegate.put(key, value); } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index 812273075..a4a0f09fe 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -19,6 +19,7 @@ import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.*; +import sdmxdl.ext.Cache; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.time.ObservationalTimePeriod; @@ -26,12 +27,11 @@ import sdmxdl.provider.ConnectionSupport; import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; -import sdmxdl.provider.WebTypedId; +import sdmxdl.provider.TypedId; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; -import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.WebContext; import java.io.IOException; import java.lang.reflect.Type; @@ -89,7 +89,7 @@ public final class PxWebDriver implements Driver { PxWebClient cachedClient = CachedPxWebClient.of( client, - context.getCache(source), + context.getDriverCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, languages @@ -249,20 +249,20 @@ private FileParser getDataParser(DataStructure dsd, MediaType ignore private static final class CachedPxWebClient implements PxWebClient { static @NonNull CachedPxWebClient of( - @NonNull PxWebClient client, @NonNull WebCache cache, long ttlInMillis, + @NonNull PxWebClient client, @NonNull Cache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedPxWebClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } private static URI getBase(SdmxWebSource source, Languages languages) { - return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); + return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @lombok.NonNull private final PxWebClient delegate; @lombok.NonNull - private final WebCache cache; + private final Cache cache; @lombok.NonNull private final URI base; @@ -271,20 +271,20 @@ private static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final WebTypedId> idOfTables = initIdOfTables(base); + private final TypedId> idOfTables = initIdOfTables(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfMeta = initIdOfMeta(base); + private final TypedId idOfMeta = initIdOfMeta(base); - private static WebTypedId> initIdOfTables(URI base) { - return WebTypedId.of(base, + private static TypedId> initIdOfTables(URI base) { + return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("tables"); } - private static WebTypedId initIdOfMeta(URI base) { - return WebTypedId.of(base, + private static TypedId initIdOfMeta(URI base) { + return TypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() ).with("meta"); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index bc92b1f9a..eadffb726 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -14,6 +14,7 @@ import nbbrd.io.net.MediaType; import nbbrd.service.ServiceProvider; import sdmxdl.*; +import sdmxdl.ext.Cache; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; @@ -21,9 +22,8 @@ import sdmxdl.provider.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCache; -import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.WebContext; import java.io.*; import java.lang.reflect.Type; @@ -89,7 +89,7 @@ public final class StatCanDriver implements Driver { StatCanClient cachedClient = CachedStatCanClient.of( client, - context.getCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), + context.getDriverCache(source), CACHE_TTL_PROPERTY.get(source.getProperties()), source, languages ); @@ -264,20 +264,20 @@ private File getFullTableDownloadSDMX(FullTableDownloadSDMX ref) throws IOExcept static class CachedStatCanClient implements StatCanClient { static @NonNull CachedStatCanClient of( - @NonNull StatCanClient client, @NonNull WebCache cache, long ttlInMillis, + @NonNull StatCanClient client, @NonNull Cache cache, long ttlInMillis, @NonNull SdmxWebSource source, @NonNull Languages languages) { return new CachedStatCanClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } private static URI getBase(SdmxWebSource source, Languages languages) { - return WebTypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); + return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @lombok.NonNull private final StatCanClient delegate; @lombok.NonNull - private final WebCache cache; + private final Cache cache; @lombok.NonNull private final URI base; @@ -286,20 +286,20 @@ private static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final WebTypedId> idOfFlows = initIdOfFlows(base); + private final TypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) - private final WebTypedId idOfRepo = initIdOfRepo(base); + private final TypedId idOfRepo = initIdOfRepo(base); - private static WebTypedId> initIdOfFlows(URI base) { - return WebTypedId.of(base, + private static TypedId> initIdOfFlows(URI base) { + return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("flows"); } - private static WebTypedId initIdOfRepo(URI base) { - return WebTypedId.of(base, identity(), identity()) + private static TypedId initIdOfRepo(URI base) { + return TypedId.of(base, identity(), identity()) .with("structAndData"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java index 7b2612a95..f1a72ed2a 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java @@ -6,13 +6,13 @@ import nbbrd.design.VisibleForTesting; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; -import sdmxdl.web.spi.Monitor; -import sdmxdl.web.spi.WebCache; +import sdmxdl.ext.Cache; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; import sdmxdl.web.MonitorStatus; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Monitor; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -40,14 +40,14 @@ public final class UpptimeMonitoring implements Monitor { UpptimeId id = UpptimeId.parse(source.getMonitor()); - WebCache cache = context.getCache(source); + Cache cache = context.getMonitorCache(source); String key = id.toSummaryURL().toString(); - MonitorReports reports = cache.getWebMonitorReports(key); + MonitorReports reports = cache.get(key); if (reports == null) { - reports = createReports(RiHttpUtils.newClient(source, context), id, cache.getWebClock()); - cache.putWebMonitorReports(key, reports); + reports = createReports(RiHttpUtils.newClient(source, context), id, cache.getClock()); + cache.put(key, reports); } return reports.getReports() From 568115194b8e7a833102b43ee8302af17c95b61d Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 11 Jul 2023 14:49:34 +0200 Subject: [PATCH 042/114] Code cleanup --- .../src/main/java/sdmxdl/ErrorListener.java | 4 +-- .../src/main/java/sdmxdl/EventListener.java | 4 +-- sdmx-dl-api/src/main/java/sdmxdl/Marker.java | 25 ----------------- .../main/java/sdmxdl/web/SdmxWebManager.java | 4 +-- .../src/main/java/sdmxdl/web/spi/Monitor.java | 3 --- .../java/internal/sdmxdl/cli/WebOptions.java | 10 +++---- sdmx-dl-cli/src/test/java/_demo/Demo.java | 23 +++++++++++----- .../sdmxdl/format/DiskCachingSupport.java | 20 +++++--------- .../main/java/sdmxdl/provider/HasMarker.java | 15 +++++++++++ .../src/main/java/sdmxdl/provider/Marker.java | 27 ++++++++----------- .../java/sdmxdl/provider/file/FileClient.java | 3 --- .../java/sdmxdl/provider/web/RestClient.java | 2 -- .../sdmxdl/util/XCountingFileClient.java | 2 +- .../_test/sdmxdl/util/XFailingRestClient.java | 2 +- .../_test/sdmxdl/util/XRepoFileClient.java | 5 ++-- .../_test/sdmxdl/util/XRepoRestClient.java | 3 ++- .../provider/CommonSdmxExceptionsTest.java | 2 +- .../connectors/ConnectorsRestClient.java | 18 ++++++++----- .../sdmxdl/provider/ri/file/Decoder.java | 3 --- .../sdmxdl/provider/ri/file/XmlDecoder.java | 8 +++--- .../provider/ri/file/XmlFileClient.java | 7 +++-- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 11 +++----- .../sdmxdl/provider/ri/web/RiRestClient.java | 3 ++- .../provider/ri/web/drivers/BbkDriver.java | 6 ++--- .../ri/web/drivers/EurostatDriver2.java | 8 +++--- .../provider/ri/web/drivers/InseeDriver2.java | 4 +-- .../provider/ri/web/drivers/NbbDriver2.java | 5 ++-- .../provider/ri/web/drivers/PxWebDriver.java | 2 +- .../provider/ri/web/drivers/RngDriver.java | 2 +- .../ri/web/drivers/StatCanDriver.java | 3 +-- .../web/monitors/UptimeRobotMonitoring.java | 12 +++++---- .../provider/ri/web/RiHttpUtilsTest.java | 3 +-- .../provider/ri/web/RiRestClientTest.java | 2 +- .../ri/web/drivers/NbbDriver2Test.java | 2 +- 34 files changed, 118 insertions(+), 135 deletions(-) delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/Marker.java diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java index 8d8e1b388..1c9180f1c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java @@ -8,9 +8,9 @@ @FunctionalInterface public interface ErrorListener { - void accept(@NonNull S source, @NonNull Marker marker, @NonNull CharSequence message, @NonNull IOException error); + void accept(@NonNull S source, @NonNull String marker, @NonNull CharSequence message, @NonNull IOException error); - default @NonNull BiConsumer asBiConsumer(@NonNull S source, @NonNull Marker marker) { + default @NonNull BiConsumer asBiConsumer(@NonNull S source, @NonNull String marker) { return (message, error) -> accept(source, marker, message, error); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java index b1b2e6168..8d1f71cd5 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java @@ -7,9 +7,9 @@ @FunctionalInterface public interface EventListener { - void accept(@NonNull S source, @NonNull Marker marker, @NonNull CharSequence message); + void accept(@NonNull S source, @NonNull String marker, @NonNull CharSequence message); - default @NonNull Consumer asConsumer(@NonNull S source, @NonNull Marker marker) { + default @NonNull Consumer asConsumer(@NonNull S source, @NonNull String marker) { return message -> accept(source, marker, message); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Marker.java b/sdmx-dl-api/src/main/java/sdmxdl/Marker.java deleted file mode 100644 index f768ebfe7..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/Marker.java +++ /dev/null @@ -1,25 +0,0 @@ -package sdmxdl; - -import lombok.AccessLevel; -import lombok.NonNull; -import nbbrd.design.RepresentableAsString; -import nbbrd.design.StaticFactoryMethod; - -@RepresentableAsString -@lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) -@lombok.EqualsAndHashCode -public class Marker implements CharSequence { - - @lombok.experimental.Delegate(types = CharSequence.class) - private final @NonNull String value; - - @Override - public String toString() { - return value; - } - - @StaticFactoryMethod - public static @NonNull Marker parse(@NonNull CharSequence value) { - return new Marker(value.toString()); - } -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 61346d105..76e57b925 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -46,8 +46,6 @@ @lombok.EqualsAndHashCode(callSuper = false) public class SdmxWebManager extends SdmxManager { - public static final Marker WEB_MANAGER_MARKER = Marker.parse("WEB_MANAGER"); - @StaticFactoryMethod public static @NonNull SdmxWebManager ofServiceLoader() { return SdmxWebManager @@ -139,7 +137,7 @@ private void checkSourceProperties(SdmxWebSource source, Driver driver) { Collection found = source.getProperties().keySet(); String diff = found.stream().filter(item -> !expected.contains(item)).sorted().collect(Collectors.joining(",")); if (!diff.isEmpty()) { - onEvent.accept(source, WEB_MANAGER_MARKER, "Unexpected properties [" + diff + "]"); + onEvent.accept(source, "WEB_MANAGER", "Unexpected properties [" + diff + "]"); } } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java index 02a6d3149..f54646931 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java @@ -5,7 +5,6 @@ import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; -import sdmxdl.Marker; import sdmxdl.web.MonitorReport; import sdmxdl.web.SdmxWebSource; @@ -27,6 +26,4 @@ public interface Monitor { @NonNull SdmxWebSource source, @NonNull WebContext context ) throws IOException, IllegalArgumentException; - - Marker MONITOR_MARKER = Marker.parse("MONITOR"); } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 7aaa5ce27..7082bc8ec 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -27,7 +27,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.Languages; -import sdmxdl.Marker; +import sdmxdl.provider.Marker; import sdmxdl.format.xml.XmlWebSource; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -144,13 +144,13 @@ private List loadCustomSources() throws IOException { @lombok.extern.java.Log private static class LoggingListener { - public void onSourceEvent(SdmxWebSource source, Marker marker, CharSequence message) { + public void onSourceEvent(SdmxWebSource source, String marker, CharSequence message) { if (log.isLoggable(Level.INFO)) { log.info(message.toString()); } } - public void onSourceError(SdmxWebSource source, Marker marker, CharSequence message, IOException error) { + public void onSourceError(SdmxWebSource source, String marker, CharSequence message, IOException error) { if (log.isLoggable(Level.INFO)) { log.log(Level.INFO, message.toString(), error); } @@ -165,7 +165,7 @@ private static class VerboseEventListener { @lombok.NonNull private final VerboseOptions verboseOptions; - public void onSourceEvent(SdmxWebSource source, Marker marker, CharSequence message) { + public void onSourceEvent(SdmxWebSource source, String marker, CharSequence message) { if (main != null) { main.accept(source, marker, message); } @@ -183,7 +183,7 @@ private static class VerboseErrorListener { @lombok.NonNull private final VerboseOptions verboseOptions; - public void onSourceError(SdmxWebSource source, Marker marker, CharSequence message, IOException error) { + public void onSourceError(SdmxWebSource source, String marker, CharSequence message, IOException error) { if (main != null) { main.accept(source, marker, message, error); } diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index 20af9c5a5..8e632d123 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -7,7 +7,9 @@ import sdmxdl.web.SdmxWebSource; import java.io.IOException; +import java.util.stream.Stream; +import static sdmxdl.DataDetail.DATA_ONLY; import static sdmxdl.Languages.ANY; public class Demo { @@ -23,18 +25,25 @@ public static void main(String[] args) throws IOException { try (Connection ecb = manager.getConnection("ECB", ANY)) { DataflowRef exr = DataflowRef.parse("EXR"); - System.out.println(ecb.getFlow(exr).getName()); + printFlow(ecb.getFlow(exr)); Key chf = Key.parse("M.CHF.EUR.SP00.A"); - ecb.getData(exr, DataQuery.builder().key(chf).build()) - .getData() - .stream() - .map(Series::getKey) - .forEach(System.out::println); + DataQuery chfData = DataQuery.builder().key(chf).detail(DATA_ONLY).build(); + try (Stream dataStream = ecb.getDataStream(exr, chfData)) { + dataStream.forEach(Demo::printSeries); + } } } - private static void printEvent(SdmxWebSource source, Marker marker, CharSequence message) { + private static void printFlow(Dataflow flow) { + System.out.println(flow.getName()); + } + + private static void printSeries(Series series) { + System.out.println(series.getKey() + ": " + series.getObs().size() + " observations"); + } + + private static void printEvent(SdmxWebSource source, String marker, CharSequence message) { System.err.println("[" + source.getId() + "] (" + marker + ") " + message); } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index 9548be413..ce01eafd1 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -6,7 +6,6 @@ import sdmxdl.DataRepository; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.Marker; import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileSource; import sdmxdl.file.spi.FileCaching; @@ -46,9 +45,6 @@ public final class DiskCachingSupport implements FileCaching, WebCaching { @lombok.Builder.Default private final boolean noCompression = false; - @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) - private final Marker marker = initLazyMarker(); - @Override public @NonNull String getFileCachingId() { return id; @@ -77,8 +73,8 @@ public int getWebCachingRank() { .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) .namePrefix("R") .clock(clock) - .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) - .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) + .onRead(onEvent != null ? onEvent.asConsumer(source, getFileCachingId()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getFileCachingId()) : null) .build(); } @@ -90,8 +86,8 @@ public int getWebCachingRank() { .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) .namePrefix("D") .clock(clock) - .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) - .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) + .onRead(onEvent != null ? onEvent.asConsumer(source, getWebCachingId()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getWebCachingId()) : null) .build(); } @@ -103,8 +99,8 @@ public int getWebCachingRank() { .format(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat)) .namePrefix("M") .clock(clock) - .onRead(onEvent != null ? onEvent.asConsumer(source, getMarker()) : null) - .onError(onError != null ? onError.asBiConsumer(source, getMarker()) : null) + .onRead(onEvent != null ? onEvent.asConsumer(source, getWebCachingId()) : null) + .onError(onError != null ? onError.asBiConsumer(source, getWebCachingId()) : null) .build(); } @@ -118,10 +114,6 @@ public int getWebCachingRank() { return Collections.emptyList(); } - private Marker initLazyMarker() { - return Marker.parse(getId()); - } - public static final class Builder { public @NonNull Builder persistence(@NonNull Persistence persistence) { diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java index 30ad1374a..4e4ed709f 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java @@ -1,8 +1,23 @@ package sdmxdl.provider; import lombok.NonNull; +import sdmxdl.DataRepository; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.web.SdmxWebSource; public interface HasMarker { @NonNull Marker getMarker(); + + static @NonNull Marker of(@NonNull SdmxWebSource s) { + return Marker.parse(s.getDriver() + ":" + s.getId()); + } + + static @NonNull Marker of(@NonNull SdmxFileSource s) { + return Marker.parse(s.getData().getPath()); + } + + static @NonNull Marker of(@NonNull DataRepository repository) { + return Marker.parse(repository.getName()); + } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Marker.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Marker.java index 45cfe6f40..390b5450e 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Marker.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Marker.java @@ -1,30 +1,25 @@ package sdmxdl.provider; +import lombok.AccessLevel; import lombok.NonNull; -import sdmxdl.DataRepository; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; +import nbbrd.design.RepresentableAsString; +import nbbrd.design.StaticFactoryMethod; -@lombok.Value(staticConstructor = "of") +@RepresentableAsString +@lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) +@lombok.EqualsAndHashCode public class Marker implements CharSequence { @lombok.experimental.Delegate(types = CharSequence.class) - @NonNull String content; + private final @NonNull String value; @Override public String toString() { - return content; + return value; } - public static @NonNull Marker of(@NonNull SdmxWebSource s) { - return new Marker(s.getDriver() + ":" + s.getId()); - } - - public static @NonNull Marker of(@NonNull SdmxFileSource s) { - return new Marker(s.getData().getPath()); - } - - public static @NonNull Marker of(@NonNull DataRepository repository) { - return new Marker(repository.getName()); + @StaticFactoryMethod + public static @NonNull Marker parse(@NonNull CharSequence value) { + return new Marker(value.toString()); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java index 8ee97b87c..9b06f9f82 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileClient.java @@ -1,7 +1,6 @@ package sdmxdl.provider.file; import lombok.NonNull; -import sdmxdl.Marker; import sdmxdl.Series; import sdmxdl.provider.DataRef; import sdmxdl.provider.HasMarker; @@ -16,6 +15,4 @@ public interface FileClient extends HasMarker { @NonNull FileInfo decode() throws IOException; @NonNull Stream loadData(@NonNull FileInfo info, @NonNull DataRef dataRef) throws IOException; - - Marker FILE_CLIENT_MARKER = Marker.parse("FILE_CLIENT"); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java index 442c7f89c..301e279cd 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java @@ -44,6 +44,4 @@ public interface RestClient extends HasMarker { @NonNull Set getSupportedFeatures() throws IOException; void testClient() throws IOException; - - Marker REST_CLIENT_MARKER = sdmxdl.Marker.parse("REST_CLIENT"); } diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingFileClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingFileClient.java index e46ce1911..b49c71ac5 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingFileClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingFileClient.java @@ -1,9 +1,9 @@ package _test.sdmxdl.util; import lombok.NonNull; +import sdmxdl.provider.Marker; import sdmxdl.Series; import sdmxdl.provider.DataRef; -import sdmxdl.provider.Marker; import sdmxdl.provider.file.FileClient; import sdmxdl.provider.file.FileInfo; diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java index b8a41ce50..096316384 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java @@ -36,7 +36,7 @@ public enum XFailingRestClient implements RestClient { TEST_EXPECTED { @Override public @NonNull Marker getMarker() { - return Marker.of(""); + return Marker.parse(""); } @Override diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoFileClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoFileClient.java index 89a312b99..c51ac233d 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoFileClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoFileClient.java @@ -3,9 +3,10 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import sdmxdl.DataRepository; +import sdmxdl.provider.Marker; import sdmxdl.Series; import sdmxdl.provider.DataRef; -import sdmxdl.provider.Marker; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.file.FileClient; import sdmxdl.provider.file.FileInfo; @@ -20,7 +21,7 @@ public final class XRepoFileClient implements FileClient { @Override public @NonNull Marker getMarker() { - return Marker.of(repository); + return HasMarker.of(repository); } @Override diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java index 15175274c..14a0f4558 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java @@ -20,6 +20,7 @@ import sdmxdl.*; import sdmxdl.provider.CommonSdmxExceptions; import sdmxdl.provider.DataRef; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.web.RestClient; @@ -40,7 +41,7 @@ public final class XRepoRestClient implements RestClient { @Override public @NonNull Marker getMarker() { - return Marker.of(repository); + return HasMarker.of(repository); } @Override diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java index a4315d02d..6b0dfbce3 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java @@ -12,7 +12,7 @@ @SuppressWarnings({"ConstantConditions", "ThrowableNotThrown"}) public class CommonSdmxExceptionsTest { - private static final Marker SOURCE = Marker.of("abc"); + private static final Marker SOURCE = Marker.parse("abc"); private static final DataflowRef DATAFLOW_REF = DataflowRef.parse("df"); private static final DataStructureRef DATA_STRUCTURE_REF = DataStructureRef.parse("ds"); private static final CodelistRef CODELIST_REF = CodelistRef.parse("cl"); diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java index 1a13b3493..02c97ddee 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -31,13 +31,14 @@ import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.DataRef; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestClientSupplier; import sdmxdl.provider.web.WebEvents; +import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.SSLFactory; -import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -80,7 +81,7 @@ public interface GenericSupplier { RestSdmxClient client = supplier.get(); client.setEndpoint(source.getEndpoint()); configure(client, source, context); - return new ConnectorsRestClient(Marker.of(source), client, obsFactory); + return new ConnectorsRestClient(HasMarker.of(source), client, obsFactory); } catch (URISyntaxException ex) { throw new RuntimeException(ex); } @@ -95,7 +96,7 @@ public interface GenericSupplier { return (source, languages, context) -> { RestSdmxClient client = supplier.get(source.getEndpoint(), source.getProperties()); configure(client, source, context); - return new ConnectorsRestClient(Marker.of(source), client, obsFactory); + return new ConnectorsRestClient(HasMarker.of(source), client, obsFactory); }; } @@ -217,7 +218,7 @@ private static void configure(RestSdmxClient client, SdmxWebSource source, WebCo client.setSslSocketFactory(sslFactory.getSSLSocketFactory()); client.setHostnameVerifier(sslFactory.getHostnameVerifier()); client.setMaxRedirects(MAX_REDIRECTS_PROPERTY.get(source.getProperties())); - RestSdmxEventListener eventListener = new DefaultRestSdmxEventListener(source, context.getOnEvent()); + RestSdmxEventListener eventListener = new DefaultRestSdmxEventListener(source, context.getOnEvent(), client.getName()); client.setRedirectionEventListener(eventListener); client.setOpenEventListener(eventListener); } @@ -225,20 +226,23 @@ private static void configure(RestSdmxClient client, SdmxWebSource source, WebCo @lombok.AllArgsConstructor private static final class DefaultRestSdmxEventListener implements RestSdmxEventListener { - @lombok.NonNull + @NonNull private final SdmxWebSource source; private final @Nullable EventListener listener; + @NonNull + private final String marker; + @Override public void onSdmxEvent(RestSdmxEvent event) { if (listener != null) { if (event instanceof RedirectionEvent) { RedirectionEvent redirectionEvent = (RedirectionEvent) event; - listener.accept(source, REST_CLIENT_MARKER, WebEvents.onRedirection(redirectionEvent.getUrl(), redirectionEvent.getRedirection())); + listener.accept(source, marker, WebEvents.onRedirection(redirectionEvent.getUrl(), redirectionEvent.getRedirection())); } else if (event instanceof OpenEvent) { OpenEvent openEvent = (OpenEvent) event; - listener.accept(source, REST_CLIENT_MARKER, WebEvents.onQuery(openEvent.getUrl(), openEvent.getProxy())); + listener.accept(source, marker, WebEvents.onQuery(openEvent.getUrl(), openEvent.getProxy())); } } } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java index 06dc44915..c90c09234 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java @@ -18,7 +18,6 @@ import lombok.NonNull; import sdmxdl.Languages; -import sdmxdl.Marker; import sdmxdl.file.SdmxFileSource; import sdmxdl.provider.file.FileInfo; @@ -30,6 +29,4 @@ public interface Decoder { @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull Languages languages) throws IOException; - - Marker SDMX_DECODER_MARKER = Marker.parse("SDMX_DECODER"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java index 913fa6ed6..d0d0975e3 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java @@ -46,7 +46,7 @@ public final class XmlDecoder implements Decoder { private MediaType probeDataType(SdmxFileSource source) throws IOException { if (listener != null) { - listener.accept(source, SDMX_DECODER_MARKER, "Probing data type from '" + source.getData() + "'"); + listener.accept(source, MARKER, "Probing data type from '" + source.getData() + "'"); } return XmlMediaTypeProbe.of() .parseFile(source.getData()) @@ -61,7 +61,7 @@ private DataStructure loadStructure(SdmxFileSource source, Languages langs, Medi private DataStructure parseStruct(MediaType dataType, Languages langs, SdmxFileSource source) throws IOException { if (listener != null) { - listener.accept(source, SDMX_DECODER_MARKER, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); + listener.accept(source, MARKER, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); } return getStructParser(dataType, langs) .parseFile(source.getStructure()) @@ -81,7 +81,7 @@ private Xml.Parser> getStructParser(MediaType dataType, Lang private DataStructure decodeStruct(MediaType dataType, SdmxFileSource source) throws IOException { if (listener != null) { - listener.accept(source, SDMX_DECODER_MARKER, "Decoding structure from '" + source.getData() + "' with data type '" + dataType + "'"); + listener.accept(source, MARKER, "Decoding structure from '" + source.getData() + "' with data type '" + dataType + "'"); } return getStructDecoder(dataType) .parseFile(source.getData()); @@ -99,4 +99,6 @@ private static Xml.Parser getStructDecoder(MediaType o) throws IO } throw new IOException("Don't know how to handle '" + o + "'"); } + + private static final String MARKER = "XML_DECODER"; } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java index 9e7c588ea..da8818f31 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java @@ -30,6 +30,7 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.DataRef; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.file.FileClient; import sdmxdl.provider.file.FileInfo; @@ -61,7 +62,7 @@ public class XmlFileClient implements FileClient { @Override public @NonNull Marker getMarker() { - return Marker.of(source); + return HasMarker.of(source); } @Override @@ -82,7 +83,7 @@ public void testClient() throws IOException { @Override public @NonNull Stream loadData(@NonNull FileInfo info, @NonNull DataRef dataRef) throws IOException { if (listener != null) { - listener.accept(source, FILE_CLIENT_MARKER, "Loading data from file '" + source.getData() + "'"); + listener.accept(source, MARKER, "Loading data from file '" + source.getData() + "'"); } return dataRef.getQuery().execute( getDataSupplier(info.getDataType(), info.getStructure()) @@ -103,4 +104,6 @@ private Xml.Parser getDataSupplier(MediaType dataType, DataStructure } throw new IOException("Don't known how to handle type '" + dataType + "'"); } + + private static final String MARKER = "XML_FILE_CLIENT"; } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java index f963b17d2..092486f13 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -29,11 +29,10 @@ import sdmxdl.About; import sdmxdl.EventListener; import sdmxdl.Languages; -import sdmxdl.Marker; import sdmxdl.provider.web.WebEvents; +import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Network; -import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import java.io.File; @@ -106,7 +105,7 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl .sslSocketFactory(() -> network.getSSLFactory().getSSLSocketFactory()) .hostnameVerifier(() -> network.getSSLFactory().getHostnameVerifier()) .urlConnectionFactory(network::getURLConnectionFactory) - .listener(context.getOnEvent() != null ? new RiHttpEventListener(context.getOnEvent().asConsumer(source, RI_HTTP_MARKER)) : HttpEventListener.noOp()) + .listener(context.getOnEvent() != null ? new RiHttpEventListener(context.getOnEvent().asConsumer(source, "RI_HTTP")) : HttpEventListener.noOp()) .authenticator(new RiHttpAuthenticator(source, context.getAuthenticators(), context.getOnEvent())) .userAgent(HTTP_AGENT.get(System.getProperties())) .build(); @@ -188,7 +187,7 @@ private PasswordAuthentication getPasswordAuthentication(Authenticator authentic return authenticator.getPasswordAuthenticationOrNull(source); } catch (IOException ex) { if (listener != null) { - listener.accept(source, RI_HTTP_MARKER, "Failed to get password authentication: " + ex.getMessage()); + listener.accept(source, authenticator.getAuthenticatorId(), "Failed to get password authentication: " + ex.getMessage()); } return null; } @@ -199,11 +198,9 @@ private void invalidate(Authenticator authenticator) { authenticator.invalidateAuthentication(source); } catch (IOException ex) { if (listener != null) { - listener.accept(source, RI_HTTP_MARKER, "Failed to invalidate password authentication: " + ex.getMessage()); + listener.accept(source, authenticator.getAuthenticatorId(), "Failed to invalidate password authentication: " + ex.getMessage()); } } } } - - public static final Marker RI_HTTP_MARKER = Marker.parse("RI_HTTP"); } diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java index 0929e152c..37a7e86e1 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java @@ -24,6 +24,7 @@ import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.DataRef; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.web.RestClient; import sdmxdl.web.SdmxWebSource; @@ -49,7 +50,7 @@ public class RiRestClient implements RestClient { public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull Languages languages, @NonNull WebContext c, @NonNull RiRestQueries queries, @NonNull RiRestParsers parsers, @NonNull Set supportedFeatures) throws IOException { return new RiRestClient( - Marker.of(s), + HasMarker.of(s), s.getEndpoint().toURL(), languages, ObsParser::newDefault, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java index fd45d6105..75681e180 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -22,10 +22,10 @@ import nbbrd.service.ServiceProvider; import sdmxdl.*; import sdmxdl.format.ObsParser; -import sdmxdl.provider.Marker; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.DriverSupport; +import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -68,7 +68,7 @@ public final class BbkDriver implements Driver { private static RiRestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( - Marker.of(s), + HasMarker.of(s), s.getEndpoint().toURL(), languages, ObsParser::newDefault, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index f14b96a33..c92f76a67 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -35,14 +35,14 @@ import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.format.xml.XmlMediaTypes; -import sdmxdl.provider.Marker; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebContext; import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.WebContext; import java.io.IOException; import java.io.InputStream; @@ -141,7 +141,7 @@ public final class EurostatDriver2 implements Driver { private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( - Marker.of(s), + HasMarker.of(s), s.getEndpoint().toURL(), languages, ObsParser::newDefault, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index 2e877d163..03a1a057b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -31,7 +31,7 @@ import sdmxdl.format.time.StandardReportingFormat; import sdmxdl.format.time.TimeFormats; import sdmxdl.format.xml.XmlMediaTypes; -import sdmxdl.provider.Marker; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; @@ -99,7 +99,7 @@ private final static class InseeRestClient extends RiRestClient { InseeRestClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { super( - Marker.of(s), + HasMarker.of(s), s.getEndpoint().toURL(), languages, OBS_FACTORY, diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java index 3dcf4fee7..62d99201c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java @@ -29,9 +29,10 @@ import sdmxdl.DataStructureRef; import sdmxdl.Feature; import sdmxdl.Languages; +import sdmxdl.provider.Marker; import sdmxdl.format.ObsParser; import sdmxdl.provider.DataRef; -import sdmxdl.provider.Marker; +import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; @@ -80,7 +81,7 @@ public final class NbbDriver2 implements Driver { private static RiRestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { return newClient( - Marker.of(s), + HasMarker.of(s), s.getEndpoint().toURL(), languages, RiHttpUtils.newClient(s, c) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index a4a0f09fe..829159e37 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -81,7 +81,7 @@ public final class PxWebDriver implements Driver { private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { PxWebClient client = new DefaultPxWebClient( - Marker.of(source), + HasMarker.of(source), source.getId().toLowerCase(Locale.ROOT), source.getEndpoint().toURL(), RiHttpUtils.newClient(source, context) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java index bda691e68..6f6d14bdd 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java @@ -60,7 +60,7 @@ public final class RngDriver implements Driver { private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) { RngDriverId config = RngDriverId.parse(source.getEndpoint()); - return new RngConnection(Marker.of(source), config); + return new RngConnection(HasMarker.of(source), config); } @RepresentableAs(URI.class) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index eadffb726..003d1f6ae 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -18,7 +18,6 @@ import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; -import sdmxdl.provider.Marker; import sdmxdl.provider.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; @@ -81,7 +80,7 @@ public final class StatCanDriver implements Driver { private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { StatCanClient client = new DefaultStatCanClient( - Marker.of(source), + HasMarker.of(source), source.getEndpoint().toURL(), languages, newClient(source, context) diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java index dbb7649ad..157f5dfce 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java @@ -9,11 +9,13 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.WebEvents; import sdmxdl.provider.web.WebMonitors; -import sdmxdl.web.*; +import sdmxdl.web.MonitorReport; +import sdmxdl.web.MonitorStatus; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Monitor; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.spi.WebContext; -import sdmxdl.web.spi.Monitor; import javax.net.ssl.HttpsURLConnection; import javax.xml.stream.XMLStreamException; @@ -47,7 +49,7 @@ public final class UptimeRobotMonitoring implements Monitor { UptimeRobotId id = UptimeRobotId.parse(source.getMonitor()); Xml.Parser parser = Stax.StreamParser.valueOf(UptimeRobotMonitoring::parseReport); - return post(url, id.toBody(), parser::parseReader, context, source); + return post(url, id.toBody(), parser::parseReader, context, source, getMonitorId()); } @lombok.AllArgsConstructor @@ -95,14 +97,14 @@ private static URI toURI(URL url) throws IOException { } @MightBePromoted - private static T post(URL url, String query, IOFunction factory, WebContext context, SdmxWebSource source) throws IOException { + private static T post(URL url, String query, IOFunction factory, WebContext context, SdmxWebSource source, String monitorId) throws IOException { byte[] data = query.getBytes(StandardCharsets.UTF_8); Network network = context.getNetwork(source); Proxy proxy = network.getProxySelector().select(toURI(url)).stream().findFirst().orElse(Proxy.NO_PROXY); if (context.getOnEvent() != null) { - context.getOnEvent().accept(source, MONITOR_MARKER, WebEvents.onQuery(url, proxy)); + context.getOnEvent().accept(source, monitorId, WebEvents.onQuery(url, proxy)); } HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy); diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java index 905668131..8a1593b17 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java @@ -5,7 +5,6 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; -import sdmxdl.Marker; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import tests.sdmxdl.web.WebDriverAssert; @@ -125,7 +124,7 @@ public List pop() { return result; } - public void onSourceEvent(@NonNull SdmxWebSource source, @NonNull Marker marker, @NonNull CharSequence message) { + public void onSourceEvent(@NonNull SdmxWebSource source, @NonNull String marker, @NonNull CharSequence message) { events.add(new Event(source, message.toString())); } } diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java index 03ef37053..6e875f955 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java @@ -85,7 +85,7 @@ public void testGetCodelist() throws IOException { private static RiRestClient of(HttpClient executor) throws MalformedURLException { return new RiRestClient( - Marker.of("abc"), + Marker.parse("abc"), new URL("http://localhost"), Languages.ANY, ObsParser::newDefault, diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java index 09b81cbd7..4cf7b87ac 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java @@ -104,7 +104,7 @@ public void testCheckInternalErrorRedirect() { private RiRestClient newClient(RestClientResponseMock response) throws MalformedURLException { return NbbDriver2.newClient( - Marker.of("NBBFIX2"), + Marker.parse("NBBFIX2"), new URL("https://stat.nbb.be/restsdmx/sdmx.ashx"), Languages.ANY, (httpRequest) -> response); From ff91c3a15541667506782dbbcaa05769c50ef121 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 18 Jul 2023 14:47:42 +0200 Subject: [PATCH 043/114] Fix OverlappingFileLockException in disk cache --- .../main/java/sdmxdl/format/DiskCache.java | 6 +- .../sdmxdl/format/DiskCachingSupport.java | 18 ++--- .../main/java/sdmxdl/format/FileFormat.java | 8 ++ .../main/java/sdmxdl/format/LockingCache.java | 80 +++++++++++++++++++ 4 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java index 74a6d3e2c..3b30a8c40 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCache.java @@ -18,8 +18,6 @@ import lombok.NonNull; import nbbrd.design.VisibleForTesting; -import nbbrd.io.FileFormatter; -import nbbrd.io.FileParser; import nbbrd.io.sys.SystemProperties; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.About; @@ -100,7 +98,7 @@ private void reportRead(String key, DiskCacheEvent event) { private V readFile(Path file) { if (Files.exists(file) && Files.isRegularFile(file)) { try { - return FileParser.onParsingLock(format.getParser()).parsePath(file); + return format.getParser().parsePath(file); } catch (IOException ex) { if (onError != null) onError.accept("Failed reading '" + file + "'", ex); } @@ -111,7 +109,7 @@ private V readFile(Path file) { private void writeFile(Path file, V value) { ensureParentExists(file); try { - FileFormatter.onFormattingLock(format.getFormatter()).formatPath(value, file); + format.getFormatter().formatPath(value, file); } catch (IOException ex) { if (onError != null) onError.accept("Failed writing '" + file + "'", ex); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index ce01eafd1..c02b094e0 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -67,41 +67,41 @@ public int getWebCachingRank() { @Override public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return DiskCache + return new LockingCache<>(DiskCache .builder() .root(root) - .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) + .format(FileFormat.lock(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat))) .namePrefix("R") .clock(clock) .onRead(onEvent != null ? onEvent.asConsumer(source, getFileCachingId()) : null) .onError(onError != null ? onError.asBiConsumer(source, getFileCachingId()) : null) - .build(); + .build()); } @Override public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return DiskCache + return new LockingCache<>(DiskCache .builder() .root(root) - .format(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat)) + .format(FileFormat.lock(noCompression ? repositoryFormat : FileFormat.gzip(repositoryFormat))) .namePrefix("D") .clock(clock) .onRead(onEvent != null ? onEvent.asConsumer(source, getWebCachingId()) : null) .onError(onError != null ? onError.asBiConsumer(source, getWebCachingId()) : null) - .build(); + .build()); } @Override public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - return DiskCache + return new LockingCache<>(DiskCache .builder() .root(root) - .format(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat)) + .format(FileFormat.lock(noCompression ? monitorFormat : FileFormat.gzip(monitorFormat))) .namePrefix("M") .clock(clock) .onRead(onEvent != null ? onEvent.asConsumer(source, getWebCachingId()) : null) .onError(onError != null ? onError.asBiConsumer(source, getWebCachingId()) : null) - .build(); + .build()); } @Override diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/FileFormat.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/FileFormat.java index 0039c7df8..0d7b8be6c 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/FileFormat.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/FileFormat.java @@ -39,6 +39,14 @@ public class FileFormat { ); } + public static @NonNull FileFormat lock(@NonNull FileFormat delegate) { + return new FileFormat<>( + FileParser.onParsingLock(delegate.getParser()), + FileFormatter.onFormattingLock(delegate.getFormatter()), + delegate.getFileExtension() + ); + } + @MightBePromoted private static @NonNull FileParser noOpParser() { return FileParser.onParsingStream((resource) -> { diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java new file mode 100644 index 000000000..2cc92fd6b --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java @@ -0,0 +1,80 @@ +package sdmxdl.format; + +import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; + +import java.time.Clock; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@lombok.AllArgsConstructor +final class LockingCache implements Cache { + + private final @NonNull Cache delegate; + + @Override + public @NonNull Clock getClock() { + return delegate.getClock(); + } + + @Override + public @Nullable V get(@NonNull String key) { + LockByKey lockByKey = new LockByKey(); + try { + lockByKey.lock(key); + return delegate.get(key); + } finally { + lockByKey.unlock(key); + } + } + + @Override + public void put(@NonNull String key, @NonNull V value) { + LockByKey lockByKey = new LockByKey(); + try { + lockByKey.lock(key); + delegate.put(key, value); + } finally { + lockByKey.unlock(key); + } + } + + // https://www.baeldung.com/java-acquire-lock-by-key + private static final class LockByKey { + + private static final class LockWrapper { + private final Lock lock = new ReentrantLock(); + private final AtomicInteger numberOfThreadsInQueue = new AtomicInteger(1); + + private LockWrapper addThreadInQueue() { + numberOfThreadsInQueue.incrementAndGet(); + return this; + } + + private int removeThreadFromQueue() { + return numberOfThreadsInQueue.decrementAndGet(); + } + + } + + private static final ConcurrentHashMap LOCKS = new ConcurrentHashMap<>(); + + public void lock(String key) { + LockWrapper lockWrapper = LOCKS.compute(key, (k, v) -> v == null ? new LockWrapper() : v.addThreadInQueue()); + lockWrapper.lock.lock(); + } + + public void unlock(String key) { + LockWrapper lockWrapper = LOCKS.get(key); + lockWrapper.lock.unlock(); + if (lockWrapper.removeThreadFromQueue() == 0) { + // NB : We pass in the specific value to remove to handle the case where another thread would queue right before the removal + LOCKS.remove(key, lockWrapper); + } + } + } +} From 711a1da9c6a7e42b9863dda265e70fb2c261458c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jul 2023 04:15:12 +0000 Subject: [PATCH 044/114] Bump java-io-bom from 0.0.24 to 0.0.25 Bumps [java-io-bom](https://github.com/nbbrd/java-io-util) from 0.0.24 to 0.0.25. - [Release notes](https://github.com/nbbrd/java-io-util/releases) - [Changelog](https://github.com/nbbrd/java-io-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-io-util/compare/v0.0.24...v0.0.25) --- updated-dependencies: - dependency-name: com.github.nbbrd.java-io-util:java-io-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e4ec0cb65..9c709873d 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.24 + 0.0.25 pom import From 6863839a6348f58c0bba67a264e0f4232fbce986 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 19 Jul 2023 08:51:29 +0200 Subject: [PATCH 045/114] Add standalone module --- pom.xml | 1 + sdmx-dl-standalone/pom.xml | 90 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 sdmx-dl-standalone/pom.xml diff --git a/pom.xml b/pom.xml index 9c709873d..b7ec53b28 100644 --- a/pom.xml +++ b/pom.xml @@ -242,6 +242,7 @@ sdmx-dl-cli sdmx-dl-desktop sdmx-dl-bom + sdmx-dl-standalone diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml new file mode 100644 index 000000000..24c7b56d7 --- /dev/null +++ b/sdmx-dl-standalone/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + + com.github.nbbrd.sdmx-dl + sdmx-dl-parent + 3.0.0-beta.12-SNAPSHOT + + + sdmx-dl-standalone + + sdmx-dl-standalone + Easily download official statistics - Standalone + https://github.com/nbbrd/sdmx-dl + + + + ${project.groupId} + sdmx-dl-provider-ri + ${project.version} + + + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + package + + shade + + + + + + + *:* + + **/module-info.class + **/pom.properties + **/pom.xml + META-INF/MANIFEST.MF + META-INF/NOTICE + META-INF/LICENSE + META-INF/LICENSE.txt + + + + + + + + + + + sdmxdl.format + standalone.sdmxdl.format + + + sdmxdl.provider + standalone.sdmxdl.provider + + + internal + standalone.internal + + + nbbrd + standalone.nbbrd + + + com + standalone.com + + + false + + + + + \ No newline at end of file From 63c4d6d00866a7849b2e76b8ed3dcc6a6aceb531 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 19 Jul 2023 09:30:32 +0200 Subject: [PATCH 046/114] Code cleanup --- .../sdmxdl/desktop/SdmxAutoCompletion.java | 6 +-- .../xml/XMLStreamCompactDataCursorTest.java | 3 +- .../sdmxdl/format/xml/SdmxXmlSources.java | 4 +- .../src/main/java/module-info.java | 19 ++++----- .../provider/connectors/Connectors.java | 2 +- .../connectors/ConnectorsConfigFix.java | 2 +- .../connectors/ConnectorsRestClient.java | 2 +- .../connectors/HasDetailSupported.java | 2 +- .../connectors/PortableTimeSeriesCursor.java | 2 +- .../connectors/drivers/EurostatDriver.java | 6 +-- .../connectors/drivers/ImfDriver.java | 6 +-- .../connectors/drivers/InseeDriver.java | 8 ++-- .../connectors/drivers/NbbDriver.java | 6 +-- .../connectors/drivers/OecdDriver.java | 6 +-- .../connectors/drivers/Sdmx20Driver.java | 8 ++-- .../connectors/drivers/Sdmx21Driver.java | 10 ++--- .../provider/connectors/drivers/SeDriver.java | 8 ++-- .../connectors/drivers/UisDriver.java | 7 ++-- .../samples/ConnectorsResource.java | 4 +- .../provider}/connectors/ConnectorsTest.java | 4 +- .../PortableTimeSeriesCursorTest.java | 6 +-- .../drivers/EurostatDriverTest.java | 4 +- .../connectors/drivers/ImfDriverTest.java | 4 +- .../connectors/drivers/InseeDriverTest.java | 4 +- .../connectors/drivers/NbbDriverTest.java | 4 +- .../connectors/drivers/OecdDriverTest.java | 4 +- .../connectors/drivers/Sdmx20DriverTest.java | 4 +- .../connectors/drivers/Sdmx21DriverTest.java | 4 +- .../connectors/drivers/UisDriverTest.java | 4 +- .../util/credentials/WinPasswordVault.java | 36 ++++++++--------- .../src/main/java/module-info.java | 37 ++++++++++-------- .../sdmxdl/provider/ri/file/Decoder.java | 2 +- .../sdmxdl/provider/ri/file/XmlDecoder.java | 2 +- .../provider/ri/file/XmlFileClient.java | 2 +- .../provider/ri/file/readers/XmlReader.java | 6 +-- .../provider/ri/web/DotStatRestParsers.java | 2 +- .../provider/ri/web/DotStatRestQueries.java | 2 +- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 2 +- .../sdmxdl/provider/ri/web/RiRestClient.java | 2 +- .../sdmxdl/provider/ri/web/RiRestErrors.java | 2 +- .../sdmxdl/provider/ri/web/RiRestParsers.java | 2 +- .../sdmxdl/provider/ri/web/RiRestQueries.java | 2 +- .../provider/ri/web/Sdmx21RestErrors.java | 2 +- .../provider/ri/web/Sdmx21RestParsers.java | 4 +- .../provider/ri/web/Sdmx21RestQueries.java | 2 +- .../WinPasswordVaultAuthenticator.java | 2 +- .../provider/ri/web/drivers/BbkDriver.java | 6 +-- .../ri/web/drivers/DotStatDriver2.java | 10 ++--- .../ri/web/drivers/EurostatDriver2.java | 8 ++-- .../provider/ri/web/drivers/FileDriver.java | 2 +- .../provider/ri/web/drivers/ImfDriver2.java | 10 ++--- .../provider/ri/web/drivers/InseeDriver2.java | 6 +-- .../provider/ri/web/drivers/NbbDriver2.java | 8 ++-- .../provider/ri/web/drivers/PxWebDriver.java | 6 +-- .../provider/ri/web/drivers/RngDriver.java | 2 +- .../ri/web/drivers/Sdmx21Driver2.java | 10 ++--- .../ri/web/drivers/StatCanDriver.java | 6 +-- .../provider/ri/web/monitors/UpptimeId.java | 2 +- .../ri/web/monitors/UpptimeMonitoring.java | 4 +- .../ri/web/monitors/UpptimeSummary.java | 4 +- .../ri/web/monitors/UptimeRobotId.java | 2 +- .../web/monitors/UptimeRobotMonitoring.java | 2 +- .../provider/ri/file/XmlFileClientTest.java | 5 ++- .../ri/file/readers/XmlReaderTest.java | 3 +- .../provider/ri/web/RiHttpUtilsTest.java | 3 +- .../provider/ri/web/RiRestClientTest.java | 6 ++- .../provider/ri/web/RiRestParsersTest.java | 3 +- .../ri/web/Sdmx21RestParsersTest.java | 4 +- .../ri/web/Sdmx21RestQueriesTest.java | 3 +- .../ri/web/drivers/BbkDriverTest.java | 3 +- .../ri/web/drivers/DotStatDriver2Test.java | 3 +- .../ri/web/drivers/EurostatDriver2Test.java | 3 +- .../ri/web/drivers/FileDriverTest.java | 3 +- .../ri/web/drivers/ImfDriver2Test.java | 3 +- .../ri/web/drivers/InseeDriver2Test.java | 5 ++- .../ri/web/drivers/NbbDriver2Test.java | 7 ++-- .../ri/web/drivers/PxWebDriverTest.java | 2 +- .../ri/web/drivers/RngDriverTest.java | 3 +- .../ri/web/drivers/Sdmx21Driver2Test.java | 3 +- .../ri/web/drivers/StatCanDriverTest.java | 12 +++--- .../ri/web/monitors/UpptimeIdTest.java | 2 +- .../ri/web/monitors/UpptimeSummaryTest.java | 2 +- .../provider/ri/web/monitors/UpptimeTest.java | 2 +- .../ri/web/monitors/UptimeRobotIdTest.java | 2 +- .../ri/web/drivers/doris-table-query.json | 0 .../ri/web/drivers/statcan-10100001.zip | Bin .../ri/web/drivers/statcan-34100158.zip | Bin .../ri/web/drivers/statcan-datatables.json | 0 .../ri/web/drivers/statfin-config.json | 0 .../ri/web/drivers/statfin-table-meta.json | 0 .../ri/web/drivers/statfin-tables.json | 0 .../provider/ri/web/monitors/summary.json | 0 92 files changed, 225 insertions(+), 207 deletions(-) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/Connectors.java (99%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/ConnectorsConfigFix.java (98%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/ConnectorsRestClient.java (99%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/HasDetailSupported.java (94%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java (99%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/EurostatDriver.java (90%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/ImfDriver.java (89%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/InseeDriver.java (95%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/NbbDriver.java (89%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/OecdDriver.java (90%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java (85%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java (97%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/SeDriver.java (88%) rename sdmx-dl-provider-connectors/src/main/java/{internal => }/sdmxdl/provider/connectors/drivers/UisDriver.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/ConnectorsTest.java (97%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/PortableTimeSeriesCursorTest.java (95%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/EurostatDriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/ImfDriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/InseeDriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/NbbDriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/OecdDriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/Sdmx20DriverTest.java (92%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/Sdmx21DriverTest.java (89%) rename sdmx-dl-provider-connectors/src/test/java/{internal/sdmxld => sdmxdl/provider}/connectors/drivers/UisDriverTest.java (89%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/file/Decoder.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/file/XmlDecoder.java (99%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/file/XmlFileClient.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/file/readers/XmlReader.java (93%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/DotStatRestParsers.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/DotStatRestQueries.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/RiHttpUtils.java (99%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/RiRestClient.java (99%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/RiRestErrors.java (93%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/RiRestParsers.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/RiRestQueries.java (95%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/Sdmx21RestErrors.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/Sdmx21RestParsers.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/Sdmx21RestQueries.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/BbkDriver.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java (94%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/FileDriver.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/ImfDriver2.java (93%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/InseeDriver2.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/NbbDriver2.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/PxWebDriver.java (99%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/RngDriver.java (99%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/drivers/StatCanDriver.java (98%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeId.java (97%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java (94%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java (96%) rename sdmx-dl-provider-ri/src/main/java/{internal => }/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java (99%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/file/XmlFileClientTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/file/readers/XmlReaderTest.java (93%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/RiHttpUtilsTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/RiRestClientTest.java (95%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/RiRestParsersTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java (97%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java (97%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java (90%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java (70%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/FileDriverTest.java (94%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java (91%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java (91%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java (95%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/RngDriverTest.java (92%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java (91%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java (94%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/monitors/UpptimeTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/{internal => }/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java (88%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/doris-table-query.json (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statcan-datatables.json (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statfin-config.json (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/drivers/statfin-tables.json (100%) rename sdmx-dl-provider-ri/src/test/resources/{internal => }/sdmxdl/provider/ri/web/monitors/summary.json (100%) diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index acf51aa92..775049407 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -27,10 +27,10 @@ import sdmxdl.Dimension; import sdmxdl.*; import sdmxdl.desktop.MainComponent; -import sdmxdl.web.spi.Network; -import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; import javax.imageio.ImageIO; import javax.net.ssl.HttpsURLConnection; @@ -309,7 +309,7 @@ public static ImageIcon getDefaultIcon() { private static final ImageIcon sdmxIcon = new ImageIcon(loadImage()); private static Image loadImage() { - try (InputStream stream = Resource.getResourceAsStream(MainComponent.class, "sdmx-logo.png").orElseThrow(RuntimeException::new)) { + try (InputStream stream = Resource.newInputStream(MainComponent.class, "sdmx-logo.png")) { return ImageIO.read(stream); } catch (IOException ex) { throw new UncheckedIOException(ex); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java index 724903283..df406ea52 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java @@ -29,7 +29,6 @@ import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; @@ -137,7 +136,7 @@ public void testCompactData21() throws Exception { @Test public void testMissingSeriesHeader() throws IOException, XMLStreamException { - ByteSource xml = () -> Resource.getResourceAsStream(XMLStreamCompactDataCursorTest.class, "10100139_187.xml").orElseThrow(FileNotFoundException::new); + ByteSource xml = () -> Resource.newInputStream(XMLStreamCompactDataCursorTest.class, "10100139_187.xml"); Key.Builder builder = Key.builder(asList("A", "B")); ObsParser obsParser = ObsParser.newDefault(); diff --git a/sdmx-dl-format-xml/src/test/java/tests/sdmxdl/format/xml/SdmxXmlSources.java b/sdmx-dl-format-xml/src/test/java/tests/sdmxdl/format/xml/SdmxXmlSources.java index a6fa62d3e..d6b042586 100644 --- a/sdmx-dl-format-xml/src/test/java/tests/sdmxdl/format/xml/SdmxXmlSources.java +++ b/sdmx-dl-format-xml/src/test/java/tests/sdmxdl/format/xml/SdmxXmlSources.java @@ -19,8 +19,6 @@ import nbbrd.io.Resource; import tests.sdmxdl.api.ByteSource; -import java.io.IOException; - /** * @author Philippe Charles */ @@ -28,7 +26,7 @@ public class SdmxXmlSources { private static ByteSource of(String name) { - return () -> Resource.getResourceAsStream(SdmxXmlSources.class, name).orElseThrow(IOException::new); + return () -> Resource.newInputStream(SdmxXmlSources.class, name); } public static final ByteSource ECB_DATAFLOWS = of("ecb/EcbDataflows.xml"); diff --git a/sdmx-dl-provider-connectors/src/main/java/module-info.java b/sdmx-dl-provider-connectors/src/main/java/module-info.java index 905a8cc96..f3599778a 100644 --- a/sdmx-dl-provider-connectors/src/main/java/module-info.java +++ b/sdmx-dl-provider-connectors/src/main/java/module-info.java @@ -1,3 +1,4 @@ +import sdmxdl.provider.connectors.drivers.*; import sdmxdl.web.spi.Driver; module sdmxdl.provider.connectors { @@ -14,13 +15,13 @@ requires transitive sdmxdl.api; provides Driver with - internal.sdmxdl.provider.connectors.drivers.EurostatDriver, - internal.sdmxdl.provider.connectors.drivers.ImfDriver, - internal.sdmxdl.provider.connectors.drivers.InseeDriver, - internal.sdmxdl.provider.connectors.drivers.NbbDriver, - internal.sdmxdl.provider.connectors.drivers.OecdDriver, - internal.sdmxdl.provider.connectors.drivers.Sdmx20Driver, - internal.sdmxdl.provider.connectors.drivers.Sdmx21Driver, - internal.sdmxdl.provider.connectors.drivers.SeDriver, - internal.sdmxdl.provider.connectors.drivers.UisDriver; + EurostatDriver, + ImfDriver, + InseeDriver, + NbbDriver, + OecdDriver, + Sdmx20Driver, + Sdmx21Driver, + SeDriver, + UisDriver; } \ No newline at end of file diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java index 13ca0a9da..4bed39dbe 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/Connectors.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors; +package sdmxdl.provider.connectors; import it.bancaditalia.oss.sdmx.api.Codelist; import it.bancaditalia.oss.sdmx.api.Dataflow; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsConfigFix.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java similarity index 98% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsConfigFix.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java index 393fed762..a8b8a9bb4 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsConfigFix.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors; +package sdmxdl.provider.connectors; import it.bancaditalia.oss.sdmx.util.Configuration; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java index 02c97ddee..c22963d5f 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors; +package sdmxdl.provider.connectors; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import it.bancaditalia.oss.sdmx.client.RestSdmxClient; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/HasDetailSupported.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java similarity index 94% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/HasDetailSupported.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java index a46eb27ea..46633b96b 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/HasDetailSupported.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors; +package sdmxdl.provider.connectors; /** * diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java index baa4a0eaa..209a685c3 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors; +package sdmxdl.provider.connectors; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import lombok.NonNull; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java similarity index 90% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java index 92012aacb..984db845c 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.EUROSTAT; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,7 +24,7 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java similarity index 89% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java index c10e51255..0d42b9aeb 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.IMF2; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,7 +24,7 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java similarity index 95% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java index 41d1e67b7..de8776ac9 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -14,10 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; -import internal.sdmxdl.provider.connectors.HasDetailSupported; +import sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.HasDetailSupported; import it.bancaditalia.oss.sdmx.api.Codelist; import it.bancaditalia.oss.sdmx.api.DataFlowStructure; import it.bancaditalia.oss.sdmx.api.Dimension; @@ -41,7 +41,7 @@ import java.util.function.Supplier; import java.util.logging.Level; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; import static sdmxdl.provider.SdmxFix.Category.CONTENT; diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java similarity index 89% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java index 3901eb1ec..e40c363d2 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.NBB; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,7 +24,7 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java similarity index 90% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java index 3924cb9aa..d417bfa64 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.OECD; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,7 +24,7 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java similarity index 85% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java index f32718ad0..74174769c 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.RestSdmx20Client; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -26,8 +26,8 @@ import java.net.URI; import java.util.Map; -import static internal.sdmxdl.provider.connectors.Connectors.NEEDS_CREDENTIALS_PROPERTY; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.Connectors.NEEDS_CREDENTIALS_PROPERTY; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java similarity index 97% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 3661ddb53..9bad7fa26 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -14,10 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; -import internal.sdmxdl.provider.connectors.HasDetailSupported; +import sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.HasDetailSupported; import it.bancaditalia.oss.sdmx.client.RestSdmxClient; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.RestConnector; @@ -28,8 +28,8 @@ import java.net.URI; import java.util.Map; -import static internal.sdmxdl.provider.connectors.Connectors.*; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.Connectors.*; +import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; /** diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java similarity index 88% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java index 11ba68245..971ada01b 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -27,8 +27,6 @@ import java.net.URI; import java.net.URISyntaxException; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; - /** * @author Philippe Charles */ @@ -43,7 +41,7 @@ public final class SeDriver implements Driver { .id(CONNECTORS_SE) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(SeClient::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .supportedProperties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("SE") diff --git a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java similarity index 89% rename from sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java index 9a1706db3..1fbc4a09f 100644 --- a/sdmx-dl-provider-connectors/src/main/java/internal/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.ConnectorsRestClient; +import sdmxdl.provider.connectors.ConnectorsRestClient; import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; import sdmxdl.provider.SdmxFix; @@ -28,7 +28,6 @@ import java.net.URI; import java.util.Map; -import static internal.sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.ENDPOINT; /** @@ -45,7 +44,7 @@ public final class UisDriver implements Driver { .id(CONNECTORS_UIS) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(UIS2::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .supportedProperties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("UIS") diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java index 449493065..49c592b58 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java @@ -16,8 +16,6 @@ */ package _test.sdmxdl.connectors.samples; -import internal.sdmxdl.provider.connectors.Connectors; -import internal.sdmxdl.provider.connectors.PortableTimeSeriesCursor; import it.bancaditalia.oss.sdmx.api.Dataflow; import it.bancaditalia.oss.sdmx.api.Dimension; import it.bancaditalia.oss.sdmx.api.*; @@ -27,6 +25,8 @@ import lombok.NonNull; import sdmxdl.*; import sdmxdl.format.ObsParser; +import sdmxdl.provider.connectors.Connectors; +import sdmxdl.provider.connectors.PortableTimeSeriesCursor; import tests.sdmxdl.api.ByteSource; import tests.sdmxdl.format.xml.SdmxXmlSources; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/ConnectorsTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java similarity index 97% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/ConnectorsTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java index cb5f770e3..41bd09574 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/ConnectorsTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors; +package sdmxdl.provider.connectors; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ import java.net.HttpURLConnection; -import static internal.sdmxdl.provider.connectors.Connectors.*; +import static sdmxdl.provider.connectors.Connectors.*; import static it.bancaditalia.oss.sdmx.exceptions.SdmxExceptionFactory.createRestException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/PortableTimeSeriesCursorTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java similarity index 95% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/PortableTimeSeriesCursorTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java index 58bfb565b..20826f765 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/PortableTimeSeriesCursorTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java @@ -14,11 +14,11 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors; +package sdmxdl.provider.connectors; import _test.sdmxdl.connectors.samples.ConnectorsResource; -import internal.sdmxdl.provider.connectors.Connectors; -import internal.sdmxdl.provider.connectors.PortableTimeSeriesCursor; +import sdmxdl.provider.connectors.Connectors; +import sdmxdl.provider.connectors.PortableTimeSeriesCursor; import it.bancaditalia.oss.sdmx.api.DataFlowStructure; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import org.junit.jupiter.api.BeforeAll; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/EurostatDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/EurostatDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java index 7d73f6329..3e8d3c6ab 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/EurostatDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.EurostatDriver; +import sdmxdl.provider.connectors.drivers.EurostatDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/ImfDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/ImfDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java index 77e992636..542a46b74 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/ImfDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.ImfDriver; +import sdmxdl.provider.connectors.drivers.ImfDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/InseeDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/InseeDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java index ce2b33f2e..e3d5e77b6 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/InseeDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.InseeDriver; +import sdmxdl.provider.connectors.drivers.InseeDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/NbbDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/NbbDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java index e464d5bb6..31f5ca136 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/NbbDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.NbbDriver; +import sdmxdl.provider.connectors.drivers.NbbDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/OecdDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/OecdDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java index defa17805..8ce84ee66 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/OecdDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.OecdDriver; +import sdmxdl.provider.connectors.drivers.OecdDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java similarity index 92% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java index 8cb6dfd1d..647fc7269 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.Sdmx20Driver; +import sdmxdl.provider.connectors.drivers.Sdmx20Driver; import org.junit.jupiter.api.Test; import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx21DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx21DriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java index 14cb74e61..2b500a6e4 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/Sdmx21DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.Sdmx21Driver; +import sdmxdl.provider.connectors.drivers.Sdmx21Driver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/UisDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java similarity index 89% rename from sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/UisDriverTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java index b8385cb6f..7fec4b01b 100644 --- a/sdmx-dl-provider-connectors/src/test/java/internal/sdmxld/connectors/drivers/UisDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxld.connectors.drivers; +package sdmxdl.provider.connectors.drivers; -import internal.sdmxdl.provider.connectors.drivers.UisDriver; +import sdmxdl.provider.connectors.drivers.UisDriver; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/credentials/WinPasswordVault.java b/sdmx-dl-provider-ri/src/main/java/internal/util/credentials/WinPasswordVault.java index 9c260e97b..3b8ae48b0 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/credentials/WinPasswordVault.java +++ b/sdmx-dl-provider-ri/src/main/java/internal/util/credentials/WinPasswordVault.java @@ -2,14 +2,17 @@ import com.github.tuupertunut.powershelllibjava.PowerShell; import com.github.tuupertunut.powershelllibjava.PowerShellExecutionException; -import nbbrd.io.Resource; +import lombok.NonNull; import nbbrd.io.picocsv.Picocsv; import nbbrd.io.text.TextParser; +import nbbrd.io.text.TextResource; import nbbrd.picocsv.Csv; -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.util.Optional; +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.IOException; + +import static java.nio.charset.StandardCharsets.UTF_8; public final class WinPasswordVault implements Closeable { @@ -17,30 +20,26 @@ public final class WinPasswordVault implements Closeable { @lombok.Value public static class PasswordCredential { - @lombok.NonNull - String resource; + @NonNull String resource; - @lombok.NonNull - String userName; + @NonNull String userName; - @lombok.NonNull - char[] password; + @NonNull char[] password; } - public static WinPasswordVault open() throws IOException { + public static @NonNull WinPasswordVault open() throws IOException { WinPasswordVault result = new WinPasswordVault(); result.exec(loadCode()); return result; } - @lombok.NonNull - private final PowerShell psSession; + private final @NonNull PowerShell psSession; private WinPasswordVault() throws IOException { psSession = PowerShell.open(); } - public PasswordCredential getOrPrompt(String resource, String message, boolean force) throws IOException { + public @NonNull PasswordCredential getOrPrompt(@NonNull String resource, @NonNull String message, boolean force) throws IOException { String resourceParam = PowerShell.escapePowerShellString(resource); String messageParam = PowerShell.escapePowerShellString(message); String forceParam = force ? "$true" : "$false"; @@ -53,7 +52,7 @@ public PasswordCredential getOrPrompt(String resource, String message, boolean f return CREDENTIAL_PARSER.parseChars(result); } - public void invalidate(String resource) throws IOException { + public void invalidate(@NonNull String resource) throws IOException { String resourceParam = PowerShell.escapePowerShellString(resource); exec("InvalidateCredential -resource " + resourceParam); } @@ -90,11 +89,8 @@ private static PasswordCredential parseCsv(Csv.Reader reader) throws IOException } private static String[] loadCode() throws IOException { - Optional script = Resource.getResourceAsStream(WinPasswordVault.class, "WinPasswordVault.ps1"); - try (InputStream stream = script.orElseThrow(() -> new IOException("Cannot find WinPasswordVault script"))) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { - return reader.lines().toArray(String[]::new); - } + try (BufferedReader reader = TextResource.newBufferedReader(WinPasswordVault.class, "WinPasswordVault.ps1", UTF_8.newDecoder())) { + return reader.lines().toArray(String[]::new); } } } diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index d805d5a87..377c4dd96 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -1,3 +1,8 @@ +import sdmxdl.provider.ri.file.readers.XmlReader; +import sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; +import sdmxdl.provider.ri.web.drivers.*; +import sdmxdl.provider.ri.web.monitors.UpptimeMonitoring; +import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; import sdmxdl.file.spi.Reader; import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Driver; @@ -18,27 +23,27 @@ requires java.logging; provides Driver with - internal.sdmxdl.provider.ri.web.drivers.BbkDriver, - internal.sdmxdl.provider.ri.web.drivers.DotStatDriver2, - internal.sdmxdl.provider.ri.web.drivers.EurostatDriver2, - internal.sdmxdl.provider.ri.web.drivers.FileDriver, - internal.sdmxdl.provider.ri.web.drivers.ImfDriver2, - internal.sdmxdl.provider.ri.web.drivers.InseeDriver2, - internal.sdmxdl.provider.ri.web.drivers.NbbDriver2, - internal.sdmxdl.provider.ri.web.drivers.PxWebDriver, - internal.sdmxdl.provider.ri.web.drivers.RngDriver, - internal.sdmxdl.provider.ri.web.drivers.Sdmx21Driver2, - internal.sdmxdl.provider.ri.web.drivers.StatCanDriver; + BbkDriver, + DotStatDriver2, + EurostatDriver2, + FileDriver, + ImfDriver2, + InseeDriver2, + NbbDriver2, + PxWebDriver, + RngDriver, + Sdmx21Driver2, + StatCanDriver; provides Reader with - internal.sdmxdl.provider.ri.file.readers.XmlReader; + XmlReader; provides Authenticator with - internal.sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; + WinPasswordVaultAuthenticator; provides Monitor with - internal.sdmxdl.provider.ri.web.monitors.UpptimeMonitoring, - internal.sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; + UpptimeMonitoring, + UptimeRobotMonitoring; - opens internal.sdmxdl.provider.ri.web.monitors to com.google.gson; + opens sdmxdl.provider.ri.web.monitors to com.google.gson; } \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java index c90c09234..8262e14cf 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/Decoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.file; import lombok.NonNull; import sdmxdl.Languages; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java index d0d0975e3..661e0df21 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.file; import lombok.NonNull; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java index da8818f31..0a81733ae 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.file; import lombok.NonNull; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java similarity index 93% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java index 583abcec1..915a4abc7 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java @@ -1,7 +1,7 @@ -package internal.sdmxdl.provider.ri.file.readers; +package sdmxdl.provider.ri.file.readers; -import internal.sdmxdl.provider.ri.file.XmlDecoder; -import internal.sdmxdl.provider.ri.file.XmlFileClient; +import sdmxdl.provider.ri.file.XmlDecoder; +import sdmxdl.provider.ri.file.XmlFileClient; import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.Connection; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java index 6b17fe6b4..3a0056f50 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import lombok.NonNull; import nbbrd.io.FileParser; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestQueries.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java index 7218db341..c268d7b82 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/DotStatRestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.URLQueryBuilder; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java index 092486f13..2c9beca28 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.*; import internal.util.http.ext.DumpingClient; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java index 37a7e86e1..63cc55d47 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.HttpClient; import internal.util.http.HttpRequest; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java similarity index 93% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestErrors.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java index 7478d19ff..5b4157b65 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.HttpResponseException; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java index a752026ab..458932821 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import lombok.NonNull; import nbbrd.io.FileParser; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java similarity index 95% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestQueries.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java index 997ea31b2..329272e5e 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/RiRestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.URLQueryBuilder; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestErrors.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java index 6f18a2905..d25ba3115 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.HttpResponseException; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java index e7289336e..04d56a97b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import lombok.NonNull; import nbbrd.design.VisibleForTesting; @@ -19,7 +19,7 @@ import java.util.Optional; import java.util.function.Supplier; -import static internal.sdmxdl.provider.ri.web.RiRestParsers.getResourceSelector; +import static sdmxdl.provider.ri.web.RiRestParsers.getResourceSelector; import static java.util.Collections.singletonList; import static nbbrd.io.xml.Xml.APPLICATION_XML_UTF_8; import static sdmxdl.format.xml.XmlMediaTypes.*; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueries.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java index 811892a13..4f4e933d6 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.URLQueryBuilder; import lombok.AccessLevel; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java index 39d5128ff..87574bf6b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.authenticators; +package sdmxdl.provider.ri.web.authenticators; import internal.util.credentials.WinPasswordVault; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java index 75681e180..9f3dd42f7 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -14,9 +14,8 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.*; import internal.util.http.URLQueryBuilder; import nbbrd.design.VisibleForTesting; import nbbrd.service.ServiceProvider; @@ -24,6 +23,7 @@ import sdmxdl.format.ObsParser; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.ri.web.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -35,8 +35,8 @@ import java.util.EnumSet; import java.util.Set; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.QUERY; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java similarity index 94% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java index a47d44233..ff332ed3b 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java @@ -14,11 +14,11 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.DotStatRestParsers; -import internal.sdmxdl.provider.ri.web.DotStatRestQueries; -import internal.sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.web.DotStatRestParsers; +import sdmxdl.provider.ri.web.DotStatRestQueries; +import sdmxdl.provider.ri.web.RiRestClient; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; import sdmxdl.Languages; @@ -34,7 +34,7 @@ import java.util.EnumSet; import java.util.Set; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.ENDPOINT; import static sdmxdl.provider.SdmxFix.Category.QUERY; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index c92f76a67..5d12a2c5c 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -14,9 +14,8 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.*; import internal.util.http.HttpClient; import internal.util.http.HttpRequest; import internal.util.http.HttpResponse; @@ -37,6 +36,7 @@ import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.ri.web.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; @@ -54,12 +54,12 @@ import java.util.Set; import java.util.zip.ZipInputStream; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static internal.sdmxdl.provider.ri.web.Sdmx21RestParsers.withCharset; import static java.util.Collections.singletonList; import static sdmxdl.Languages.ANY; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.Sdmx21RestParsers.withCharset; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java index 936b63e66..5828f5478 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import lombok.NonNull; import nbbrd.design.VisibleForTesting; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java similarity index 93% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java index 265797454..35dd97514 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java @@ -14,11 +14,11 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.DotStatRestParsers; -import internal.sdmxdl.provider.ri.web.DotStatRestQueries; -import internal.sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.web.DotStatRestParsers; +import sdmxdl.provider.ri.web.DotStatRestQueries; +import sdmxdl.provider.ri.web.RiRestClient; import internal.util.http.URLQueryBuilder; import lombok.NonNull; import nbbrd.io.FileParser; @@ -44,7 +44,7 @@ import java.util.Set; import java.util.function.Supplier; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.QUERY; /** diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index 03a1a057b..3a20af2c4 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -14,9 +14,8 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.*; import lombok.NonNull; import nbbrd.design.VisibleForTesting; import nbbrd.io.FileParser; @@ -33,6 +32,7 @@ import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.ri.web.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -43,10 +43,10 @@ import java.util.EnumSet; import java.util.function.Supplier; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; import static sdmxdl.provider.SdmxFix.Category.CONTENT; import static sdmxdl.provider.SdmxFix.Category.MEDIA_TYPE; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java index 62d99201c..8f8cc2460 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java @@ -14,9 +14,8 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.*; import internal.util.http.HttpClient; import internal.util.http.HttpResponse; import internal.util.http.HttpResponseException; @@ -29,11 +28,12 @@ import sdmxdl.DataStructureRef; import sdmxdl.Feature; import sdmxdl.Languages; -import sdmxdl.provider.Marker; import sdmxdl.format.ObsParser; import sdmxdl.provider.DataRef; import sdmxdl.provider.HasMarker; +import sdmxdl.provider.Marker; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.ri.web.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -44,10 +44,10 @@ import java.net.URL; import java.util.EnumSet; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index 829159e37..bc5a90632 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -1,7 +1,7 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import com.google.gson.*; -import internal.sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.web.RiHttpUtils; import internal.util.CollectionUtil; import internal.util.gson.GsonIO; import internal.util.http.HttpClient; @@ -42,7 +42,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static internal.util.CollectionUtil.indexedStreamOf; import static internal.util.CollectionUtil.zip; import static internal.util.gson.GsonUtil.asStream; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java index 6f6d14bdd..595db06ee 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/RngDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import lombok.NonNull; import nbbrd.design.RepresentableAs; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java index a2319932c..e4246672f 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java @@ -14,11 +14,11 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; -import internal.sdmxdl.provider.ri.web.RiRestClient; -import internal.sdmxdl.provider.ri.web.Sdmx21RestParsers; -import internal.sdmxdl.provider.ri.web.Sdmx21RestQueries; +import sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.web.Sdmx21RestParsers; +import sdmxdl.provider.ri.web.Sdmx21RestQueries; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; import sdmxdl.Languages; @@ -33,7 +33,7 @@ import java.util.EnumSet; import java.util.Set; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; import static sdmxdl.provider.web.WebProperties.TRAILING_SLASH_REQUIRED_PROPERTY; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index 003d1f6ae..e0f564438 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import com.google.gson.*; import internal.util.http.HttpClient; @@ -41,8 +41,8 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static internal.sdmxdl.provider.ri.web.RiHttpUtils.newClient; +import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.web.RiHttpUtils.newClient; import static java.util.Arrays.asList; import static java.util.function.Function.identity; import static java.util.regex.Pattern.compile; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeId.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeId.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java index 35588a411..5fabe7886 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeId.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import internal.util.http.URLQueryBuilder; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java index f1a72ed2a..e12b483c7 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java @@ -1,6 +1,6 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; -import internal.sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.web.RiHttpUtils; import internal.util.http.HttpClient; import lombok.NonNull; import nbbrd.design.VisibleForTesting; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java similarity index 94% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java index d726f963f..a71185096 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java @@ -1,7 +1,7 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import com.google.gson.*; -import internal.sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.web.RiHttpUtils; import internal.util.http.HttpClient; import internal.util.http.HttpResponse; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java index 22bce4f25..85fa85ddb 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import lombok.NonNull; import nbbrd.design.RepresentableAs; diff --git a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java index 157f5dfce..5c20da793 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import lombok.NonNull; import nbbrd.design.MightBePromoted; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java index 18849e419..f22ff2bf2 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/XmlFileClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java @@ -14,10 +14,13 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.file; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import sdmxdl.provider.ri.file.Decoder; +import sdmxdl.provider.ri.file.XmlDecoder; +import sdmxdl.provider.ri.file.XmlFileClient; import sdmxdl.*; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.XmlMediaTypes; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/readers/XmlReaderTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java similarity index 93% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/readers/XmlReaderTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java index 50ff71af9..53bec2a9a 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/file/readers/XmlReaderTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java @@ -1,7 +1,8 @@ -package internal.sdmxdl.provider.ri.file.readers; +package sdmxdl.provider.ri.file.readers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import sdmxdl.provider.ri.file.readers.XmlReader; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.XmlFileSource; import tests.sdmxdl.file.FileReaderAssert; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java index 8a1593b17..22c5a5169 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java @@ -1,10 +1,11 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.HttpEventListener; import internal.util.http.HttpRequest; import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.RiHttpUtils; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import tests.sdmxdl.web.WebDriverAssert; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java index 6e875f955..87465b00c 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java @@ -1,10 +1,14 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import internal.util.http.HttpClient; import internal.util.http.HttpResponseException; import internal.util.http.ext.DumpingClientTest; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.web.Sdmx21RestErrors; +import sdmxdl.provider.ri.web.Sdmx21RestParsers; +import sdmxdl.provider.ri.web.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.Marker; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestParsersTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java index 0f7f0bc96..75a32128d 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/RiRestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java @@ -1,7 +1,8 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.RiRestParsers; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java similarity index 97% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java index 89487b344..e9830d08d 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import nbbrd.io.FileParser; import nbbrd.io.net.MediaType; @@ -21,11 +21,11 @@ import java.util.function.Function; import java.util.stream.Stream; -import static internal.sdmxdl.provider.ri.web.Sdmx21RestParsers.*; import static nbbrd.io.net.MediaType.ANY_TYPE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.LIST; import static sdmxdl.Languages.ANY; +import static sdmxdl.provider.ri.web.Sdmx21RestParsers.*; public class Sdmx21RestParsersTest { diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java index 19a98c762..142541df0 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java @@ -14,11 +14,12 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.web; import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.provider.DataRef; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java similarity index 97% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java index ac5c26838..48ed113fb 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.BbkDriver; import sdmxdl.DataQuery; import sdmxdl.DataStructureRef; import sdmxdl.DataflowRef; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java similarity index 90% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java index 209fe471e..40d2ae684 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.DotStatDriver2; import tests.sdmxdl.web.WebDriverAssert; /** diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java similarity index 70% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java index a865f825e..0b3a84f1b 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java @@ -1,6 +1,7 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.EurostatDriver2; import tests.sdmxdl.web.WebDriverAssert; public class EurostatDriver2Test { diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/FileDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java similarity index 94% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/FileDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java index 1e577ff3b..40bd7df12 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/FileDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.FileDriver; import tests.sdmxdl.web.WebDriverAssert; import java.io.IOException; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java similarity index 91% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java index a4ba91041..4fc5efbb0 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.ImfDriver2; import tests.sdmxdl.web.WebDriverAssert; /** diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java similarity index 91% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java index a8bb476e8..d2ab9a9ef 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java @@ -1,15 +1,16 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.InseeDriver2; import sdmxdl.format.time.*; import tests.sdmxdl.web.WebDriverAssert; import java.time.Year; import java.time.YearMonth; -import static internal.sdmxdl.provider.ri.web.drivers.InseeDriver2.REPORTING_TWO_MONTH; +import static sdmxdl.provider.ri.web.drivers.InseeDriver2.REPORTING_TWO_MONTH; import static org.assertj.core.api.Assertions.assertThat; import static sdmxdl.format.time.StandardReportingFormat.REPORTING_QUARTER; import static sdmxdl.format.time.StandardReportingFormat.REPORTING_SEMESTER; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java index 4cf7b87ac..e86240280 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java @@ -14,13 +14,14 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import _test.sdmxdl.ri.RestClientResponseMock; -import internal.sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.web.RiRestClient; import internal.util.http.HttpResponseException; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.NbbDriver2; import sdmxdl.*; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; @@ -32,7 +33,7 @@ import java.net.URL; import java.util.concurrent.atomic.AtomicInteger; -import static internal.sdmxdl.provider.ri.web.drivers.NbbDriver2.checkInternalErrorRedirect; +import static sdmxdl.provider.ri.web.drivers.NbbDriver2.checkInternalErrorRedirect; import static org.assertj.core.api.Assertions.*; import static sdmxdl.DataDetail.FULL; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java index a7e2446d0..134ecddc0 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.assertj.core.data.Index; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java similarity index 92% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java index 1254d746a..8e687863b 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/RngDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java @@ -1,6 +1,7 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.RngDriver; import sdmxdl.Connection; import sdmxdl.DataQuery; import sdmxdl.Dataflow; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java similarity index 91% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java index 858140b7d..a10a79bd2 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.web.drivers.Sdmx21Driver2; import tests.sdmxdl.web.WebDriverAssert; /** diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java index 75494c340..45f1f0a82 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java @@ -1,6 +1,7 @@ -package internal.sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.web.drivers; import nbbrd.design.MightBePromoted; +import nbbrd.io.Resource; import nbbrd.io.text.TextParser; import org.assertj.core.api.Assertions; import org.assertj.core.api.Condition; @@ -12,8 +13,8 @@ import tests.sdmxdl.web.WebDriverAssert; import java.io.File; -import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.time.LocalDate; @@ -21,10 +22,9 @@ import java.util.HashMap; import java.util.Map; -import static internal.sdmxdl.provider.ri.web.drivers.StatCanDriver.Converter.*; -import static nbbrd.io.Resource.getResourceAsStream; import static org.assertj.core.api.Assertions.*; import static sdmxdl.Languages.ANY; +import static sdmxdl.provider.ri.web.drivers.StatCanDriver.Converter.*; public class StatCanDriverTest { @@ -176,7 +176,9 @@ public void testToSdmxRepository(@TempDir File tmp) throws IOException { public void testRevisions(@TempDir File tmp) throws IOException { String fileName = "statcan-34100158.zip"; File x = new File(tmp, fileName); - Files.copy(getResourceAsStream(StatCanDriverTest.class, fileName).orElseThrow(FileNotFoundException::new), x.toPath()); + try (InputStream stream = Resource.newInputStream(StatCanDriverTest.class, fileName)) { + Files.copy(stream, x.toPath()); + } assertThat(toSdmxRepository(x, 34100158, ANY).getDataSets().get(0).getData()) .has(uniqueKeys()) diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java index fb7c953af..18ff55857 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java similarity index 94% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java index bbf7ad75b..9d676b340 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import nbbrd.io.text.TextResource; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java index 218e625c6..663ecc5f4 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UpptimeTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import org.junit.jupiter.api.Test; import sdmxdl.web.MonitorReport; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java similarity index 88% rename from sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java index da81cb137..0ea233a51 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.web.monitors; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/doris-table-query.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/doris-table-query.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/doris-table-query.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/doris-table-query.json diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-datatables.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-datatables.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statcan-datatables.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-datatables.json diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-config.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-config.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-config.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-config.json diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-tables.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-tables.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/drivers/statfin-tables.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-tables.json diff --git a/sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/monitors/summary.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/monitors/summary.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/internal/sdmxdl/provider/ri/web/monitors/summary.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/monitors/summary.json From 2c5bca500d90e8bc1fe3dc0711f0bf92a3bd3ce1 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 19 Jul 2023 11:39:32 +0200 Subject: [PATCH 047/114] Add RI networking --- docs/content/cli/options.md | 18 +-- pom.xml | 4 + .../sdmxdl/web/spi/DefaultNetworking.java | 10 +- .../main/java/sdmxdl/web/spi/Networking.java | 10 +- .../main/java/sdmxdl/web/spi/WebContext.java | 2 +- .../sdmxdl/web/DefaultNetworkTest.java | 12 ++ .../sdmxdl/web/spi/DefaultNetworkingTest.java | 12 ++ .../test/java/tests/sdmxdl/api/TckUtil.java | 10 ++ .../tests/sdmxdl/web/spi/NetworkAssert.java | 22 +++ .../sdmxdl/web/spi/NetworkingAssert.java | 39 +++++ .../sdmxdl/web/spi/SSLFactoryAssert.java | 18 +++ sdmx-dl-cli/pom.xml | 31 +--- .../internal/sdmxdl/cli/NetworkOptions.java | 46 +++--- .../internal/sdmxdl/cli/WebNetOptions.java | 70 ++------ .../java/internal/sdmxdl/cli/ext/Anchor.java | 2 +- .../internal/sdmxdl/cli/ext/ProxyOptions.java | 24 --- .../internal/sdmxdl/cli/ext/SslOptions.java | 30 ---- sdmx-dl-cli/src/test/java/_demo/Demo.java | 3 - .../sdmxdl/cli/NetworkOptionsTest.java | 152 ++++++++++++++++++ sdmx-dl-desktop/pom.xml | 31 +--- .../sdmxdl/desktop/DesktopWebFactory.java | 3 - .../java/sdmxdl/desktop/MainComponent.java | 4 +- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 7 +- .../sdmxdl/provider/PropertiesSupport.java | 40 +++++ .../src/main/java/sdmxdl/provider/Slow.java | 9 ++ .../main/java/sdmxdl/provider/Suppliers.java | 22 +++ .../provider/web/SingleNetworkingSupport.java | 12 +- .../web/SingleNetworkingSupportTest.java | 12 ++ sdmx-dl-provider-ri/pom.xml | 21 +++ .../src/main/java/module-info.java | 8 + .../provider/ri/web/networking/RiNetwork.java | 54 +++++++ .../ri/web/networking/RiNetworking.java | 78 +++++++++ .../ri/web/networking/RiSSLFactory.java | 55 +++++++ .../ri/web/networking/RiNetworkingTest.java | 13 ++ .../ri/web/networking/RiSSLFactoryTest.java | 32 ++++ 35 files changed, 703 insertions(+), 213 deletions(-) create mode 100644 sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java create mode 100644 sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkingTest.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java delete mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/ProxyOptions.java delete mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/SslOptions.java create mode 100644 sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Slow.java create mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Suppliers.java create mode 100644 sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/SingleNetworkingSupportTest.java create mode 100644 sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java create mode 100644 sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java create mode 100644 sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java create mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java create mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java diff --git a/docs/content/cli/options.md b/docs/content/cli/options.md index d6654f3bc..9a80b05e7 100644 --- a/docs/content/cli/options.md +++ b/docs/content/cli/options.md @@ -49,12 +49,12 @@ The format is [RFC4180](https://tools.ietf.org/html/rfc4180). Network-related options used to deal with performance, proxies, security and authentication. -| Name | Shortcut | Parameter | Description | -|----------------------------------------------------------------------|----------|----------------------------------------|-----------------------------------------------------------------| -| `--curl` | - | - | Use curl backend instead of JDK. | -| `--no-cache` | - | - | Disable caching. | -| `--auto-proxy` | - | - | Enable automatic proxy detection. | -| `--no-default-ssl` | - | - | Disable default truststore. | -| `--no-system-ssl` | - | - | Disable system truststore. | -| `--no-system-auth` | - | - | Disable system authentication. | -| `--user` | - | [``](../datatypes#user) | Specify the user and password to use for server authentication. | +| Name | Shortcut | Parameter | Description | +|------------------------------------------------------------------------|----------|----------------------------------------|-----------------------------------------------------------------| +| `--[no-]auto-proxy` | - | - | Enable automatic proxy detection. | +| `--[no-]curl` | - | - | Use curl backend instead of JDK. | +| `--[no-]default-ssl` | - | - | Disable default truststore. | +| `--[no-]system-ssl` | - | - | Disable system truststore. | +| `--no-cache` | - | - | Disable caching. | +| `--system-auth` | - | - | Disable system authentication. | +| `--user` | - | [``](../datatypes#user) | Specify the user and password to use for server authentication. | diff --git a/pom.xml b/pom.xml index b7ec53b28..7fd416cc8 100644 --- a/pom.xml +++ b/pom.xml @@ -277,6 +277,10 @@ maven-surefire-plugin false + + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java index 98d169c64..b4a80f6dd 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java @@ -1,8 +1,11 @@ package internal.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.spi.Network; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Network; import sdmxdl.web.spi.Networking; import java.util.Collection; @@ -33,7 +36,10 @@ public boolean isNetworkingAvailable() { } @Override - public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { + public @NonNull Network getNetwork( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { return Network.getDefault(); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java index c7defa530..014cf1aca 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java @@ -5,6 +5,9 @@ import nbbrd.design.StaticFactoryMethod; import nbbrd.design.ThreadSafe; import nbbrd.service.*; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.web.SdmxWebSource; import java.util.Collection; @@ -28,10 +31,15 @@ public interface Networking { @NonNull Collection getNetworkingProperties(); - @NonNull Network getNetwork(@NonNull SdmxWebSource source); + @NonNull Network getNetwork( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); int UNKNOWN_NETWORKING_RANK = -1; + String NETWORKING_PROPERTY_PREFIX = "sdmxdl.networking"; + @StaticFactoryMethod static @NonNull Networking getDefault() { return DefaultNetworking.INSTANCE; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 7c39d3ff8..081f452d1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -56,6 +56,6 @@ public class WebContext { } public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { - return networking.getNetwork(source); + return networking.getNetwork(source, onEvent, onError); } } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java new file mode 100644 index 000000000..ca819e11b --- /dev/null +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java @@ -0,0 +1,12 @@ +package internal.sdmxdl.web; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.NetworkAssert; + +public class DefaultNetworkTest { + + @Test + public void testCompliance() { + NetworkAssert.assertCompliance(DefaultNetwork.INSTANCE); + } +} diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkingTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkingTest.java new file mode 100644 index 000000000..ab48b9977 --- /dev/null +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkingTest.java @@ -0,0 +1,12 @@ +package internal.sdmxdl.web.spi; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.NetworkingAssert; + +public class DefaultNetworkingTest { + + @Test + public void testCompliance() { + NetworkingAssert.assertCompliance(DefaultNetworking.INSTANCE); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/TckUtil.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/TckUtil.java index 16d5654e1..c75828297 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/TckUtil.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/TckUtil.java @@ -1,12 +1,20 @@ package tests.sdmxdl.api; +import lombok.NonNull; +import org.assertj.core.api.Condition; import org.assertj.core.api.SoftAssertions; import org.assertj.core.description.Description; import org.assertj.core.description.TextDescription; +import java.util.regex.Pattern; + @lombok.experimental.UtilityClass public class TckUtil { + public static @NonNull Condition startingWith(@NonNull String prefix) { + return new Condition<>(o -> o.startsWith(prefix), "start with " + prefix); + } + @FunctionalInterface public interface TckTests { void run(SoftAssertions s) throws Exception; @@ -25,4 +33,6 @@ public static void run(TckTests tests) { public static Description nullDescriptionOf(String method, String parameter) { return new TextDescription("Expecting '%s' to raise NPE when called with null %s", method, parameter); } + + public static final Pattern SCREAMING_SNAKE_CASE = Pattern.compile("^[A-Z0-9]+(?:_[A-Z0-9]+)*$"); } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java new file mode 100644 index 000000000..628fcac60 --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java @@ -0,0 +1,22 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.spi.Network; + +import static org.assertj.core.api.Assertions.assertThat; + +@lombok.experimental.UtilityClass +public class NetworkAssert { + + public static void assertCompliance(@NonNull Network x) { + assertThat(x.getProxySelector()) + .isNotNull(); + + assertThat(x.getSSLFactory()) + .isNotNull() + .satisfies(SSLFactoryAssert::assertCompliance); + + assertThat(x.getURLConnectionFactory()) + .isNotNull(); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java new file mode 100644 index 000000000..1e8f9e6f0 --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java @@ -0,0 +1,39 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Networking; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNullPointerException; +import static sdmxdl.web.spi.Networking.NETWORKING_PROPERTY_PREFIX; +import static tests.sdmxdl.api.TckUtil.SCREAMING_SNAKE_CASE; +import static tests.sdmxdl.api.TckUtil.startingWith; + +@lombok.experimental.UtilityClass +public class NetworkingAssert { + + @SuppressWarnings("DataFlowIssue") + public static void assertCompliance(@NonNull Networking x) { + assertThat(x.getNetworkingId()) + .containsPattern(SCREAMING_SNAKE_CASE); + + assertThat(x.getNetworkingProperties()) + .are(startingWith(NETWORKING_PROPERTY_PREFIX)) + .doesNotHaveDuplicates(); + + assertThatNullPointerException() + .isThrownBy(() -> x.getNetwork(null, null, null)); + + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver("SDMX21") + .endpointOf("http://localhost") + .build(); + + assertThat(x.getNetwork(validSource, null, null)) + .isNotNull() + .satisfies(NetworkAssert::assertCompliance); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java new file mode 100644 index 000000000..a40681ee7 --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java @@ -0,0 +1,18 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.spi.SSLFactory; + +import static org.assertj.core.api.Assertions.assertThat; + +@lombok.experimental.UtilityClass +public class SSLFactoryAssert { + + public static void assertCompliance(@NonNull SSLFactory x) { + assertThat(x.getSSLSocketFactory()) + .isNotNull(); + + assertThat(x.getHostnameVerifier()) + .isNotNull(); + } +} diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 187c31dea..7510c36f7 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -55,6 +55,11 @@ sdmx-dl-provider-base ${project.version} + + ${project.groupId} + sdmx-dl-provider-ri + ${project.version} + ${project.groupId} sdmx-dl-format-xml @@ -90,39 +95,13 @@ picocli-jansi-graalvm 1.2.0 - - com.github.nbbrd.java-net-proxy - java-net-proxy - 1.0.1 - - - io.github.hakky54 - sslcontext-kickstart - 8.1.2 - - - slf4j-api - org.slf4j - - - com.github.nbbrd.java-console-properties java-console-properties 1.4.0 - - com.github.nbbrd.java-io-util - java-io-curl - - - ${project.groupId} - sdmx-dl-provider-ri - ${project.version} - runtime - org.slf4j slf4j-jdk14 diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java index c19cf2835..d509d3f1e 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java @@ -2,43 +2,51 @@ import internal.sdmxdl.cli.ext.AuthOptions; import internal.sdmxdl.cli.ext.CacheOptions; -import internal.sdmxdl.cli.ext.ProxyOptions; -import internal.sdmxdl.cli.ext.SslOptions; -import nbbrd.io.curl.CurlHttpURLConnection; import picocli.CommandLine; -import sdmxdl.web.spi.URLConnectionFactory; @lombok.Getter @lombok.Setter public class NetworkOptions { @CommandLine.Option( - names = "--dummy-network-option", - hidden = true, - defaultValue = "false" + names = {"--auto-proxy"}, + negatable = true, + defaultValue = "${env:SDMXDL_NETWORKING_AUTOPROXY:-false}", + fallbackValue = "true", + descriptionKey = "cli.autoProxy" ) - private boolean dummyNetworkOption; + private boolean autoProxy; @CommandLine.Option( names = "--curl", - defaultValue = "false", + negatable = true, + defaultValue = "${env:SDMXDL_NETWORKING_CURLBACKEND:-false}", + fallbackValue = "true", descriptionKey = "cli.sdmx.curl" ) - private boolean curl; + private boolean curlBackend; - @CommandLine.ArgGroup(validate = false) - private CacheOptions cacheOptions = new CacheOptions(); + @CommandLine.Option( + names = {"--no-default-ssl"}, + negatable = true, + defaultValue = "${env:SDMXDL_NETWORKING_NODEFAULTSSL:-false}", + fallbackValue = "true", + descriptionKey = "cli.noDefaultSsl" + ) + boolean noDefaultSsl; - @CommandLine.ArgGroup(validate = false) - private ProxyOptions proxyOptions = new ProxyOptions(); + @CommandLine.Option( + names = {"--no-system-ssl"}, + negatable = true, + defaultValue = "${env:SDMXDL_NETWORKING_NOSYSTEMSSL:-false}", + fallbackValue = "true", + descriptionKey = "cli.noSystemSsl" + ) + boolean noSystemSsl; @CommandLine.ArgGroup(validate = false) - private SslOptions sslOptions = new SslOptions(); + private CacheOptions cacheOptions = new CacheOptions(); @CommandLine.ArgGroup(validate = false) private AuthOptions authOptions = new AuthOptions(); - - public URLConnectionFactory getURLConnectionFactory() { - return isCurl() ? CurlHttpURLConnection::of : URLConnectionFactory.getDefault(); - } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index a5e402f5d..795feeee4 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -21,22 +21,18 @@ import internal.sdmxdl.cli.ext.CacheOptions; import internal.sdmxdl.cli.ext.VerboseOptions; import internal.util.AuthenticatorLoader; -import lombok.NonNull; -import nl.altindag.ssl.SSLFactory; import picocli.CommandLine; import sdmxdl.format.DiskCache; import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.MemCachingSupport; import sdmxdl.provider.ext.DualWebCachingSupport; -import sdmxdl.provider.web.SingleNetworkingSupport; +import sdmxdl.provider.ri.web.networking.RiNetworking; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.WebCaching; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSocketFactory; import java.io.IOException; import java.net.URI; import java.nio.file.Path; @@ -44,8 +40,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Supplier; import java.util.stream.Collectors; /** @@ -70,8 +64,8 @@ public SdmxWebManager loadManager() throws IOException { SdmxWebManager defaultManager = super.loadManager(); return defaultManager .toBuilder() - .networking(getNetworking(getNetworkOptions(), getVerboseOptions())) - .caching(getCacheProvider(getNetworkOptions().getCacheOptions(), getVerboseOptions())) + .networking(getNetworking(getNetworkOptions())) + .caching(getWebCaching(getNetworkOptions().getCacheOptions(), getVerboseOptions())) .clearAuthenticators() .authenticators(getAuthenticators()) .customSources(getForcedSslSources(defaultManager)) @@ -112,16 +106,14 @@ private List getAuthenticators() { return result; } - private static final String CACHE_ANCHOR = "CCH"; - - private static WebCaching getCacheProvider(CacheOptions cacheOptions, VerboseOptions verboseOptions) { + private static WebCaching getWebCaching(CacheOptions cacheOptions, VerboseOptions verboseOptions) { if (cacheOptions.isNoCache()) { return WebCaching.noOp(); } Clock clock = Clock.systemDefaultZone(); Path root = cacheOptions.getCacheFolder() != null ? cacheOptions.getCacheFolder().toPath() : DiskCache.SDMXDL_TMP_DIR; - reportConfig(verboseOptions, root); + reportCaching(verboseOptions, root); return DualWebCachingSupport .builder() @@ -143,52 +135,16 @@ private static WebCaching getCacheProvider(CacheOptions cacheOptions, VerboseOpt .build(); } - private static void reportConfig(VerboseOptions verboseOptions, Path root) { - if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(Anchor.CCH, "Using cache folder '" + root + "'"); - } - - private static Networking getNetworking(NetworkOptions networkOptions, VerboseOptions verboseOptions) { - return SingleNetworkingSupport - .builder() - .id("DRY") - .proxySelector(memoize(networkOptions.getProxyOptions()::getProxySelector, "Loading proxy selector", verboseOptions)) - .sslFactory(memoize(() -> new SSLFactoryAdapter(networkOptions.getSslOptions().getSSLFactory()), "Loading SSL factory", verboseOptions)) - .urlConnectionFactory(memoize(networkOptions::getURLConnectionFactory, "Loading URL connection factory", verboseOptions)) - .build(); - } - - private static void reportNetwork(VerboseOptions verboseOptions, String msg) { + private static void reportCaching(VerboseOptions verboseOptions, Path root) { if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(Anchor.NET, msg); + verboseOptions.reportToErrorStream(Anchor.CFG, "Using cache folder '" + root + "'"); } - private static Supplier memoize(Supplier supplier, String message, VerboseOptions verboseOptions) { - AtomicReference ref = new AtomicReference<>(); - return () -> { - T result = ref.get(); - if (result == null) { - reportNetwork(verboseOptions, message); - result = supplier.get(); - ref.set(result); - } - return result; - }; - } - - @lombok.AllArgsConstructor - private static final class SSLFactoryAdapter implements sdmxdl.web.spi.SSLFactory { - - private final @NonNull SSLFactory delegate; - - @Override - public @NonNull SSLSocketFactory getSSLSocketFactory() { - return delegate.getSslSocketFactory(); - } - - @Override - public @NonNull HostnameVerifier getHostnameVerifier() { - return delegate.getHostnameVerifier(); - } + private static Networking getNetworking(NetworkOptions networkOptions) { + System.setProperty(RiNetworking.AUTO_PROXY_PROPERTY.getKey(), Boolean.toString(networkOptions.isAutoProxy())); + System.setProperty(RiNetworking.NO_DEFAULT_SSL_PROPERTY.getKey(), Boolean.toString(networkOptions.isNoDefaultSsl())); + System.setProperty(RiNetworking.NO_SYSTEM_SSL_PROPERTY.getKey(), Boolean.toString(networkOptions.isNoSystemSsl())); + System.setProperty(RiNetworking.CURL_BACKEND_PROPERTY.getKey(), Boolean.toString(networkOptions.isCurlBackend())); + return new RiNetworking(); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java index cef4f2b0f..eabdd214d 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/Anchor.java @@ -1,5 +1,5 @@ package internal.sdmxdl.cli.ext; public enum Anchor { - CFG, CCH, NET, WEB + CFG, WEB } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/ProxyOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/ProxyOptions.java deleted file mode 100644 index 5562d89ee..000000000 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/ProxyOptions.java +++ /dev/null @@ -1,24 +0,0 @@ -package internal.sdmxdl.cli.ext; - -import nbbrd.net.proxy.SystemProxySelector; -import picocli.CommandLine; - -import java.net.ProxySelector; - -@lombok.Getter -@lombok.Setter -public class ProxyOptions { - - @CommandLine.Option( - names = {"--auto-proxy"}, - defaultValue = "false", - descriptionKey = "cli.autoProxy" - ) - boolean autoProxyDetection; - - public ProxySelector getProxySelector() { - return isAutoProxyDetection() - ? SystemProxySelector.ofServiceLoader() - : ProxySelector.getDefault(); - } -} diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/SslOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/SslOptions.java deleted file mode 100644 index e54be4d9e..000000000 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/SslOptions.java +++ /dev/null @@ -1,30 +0,0 @@ -package internal.sdmxdl.cli.ext; - -import nl.altindag.ssl.SSLFactory; -import picocli.CommandLine; - -@lombok.Getter -@lombok.Setter -public class SslOptions { - - @CommandLine.Option( - names = {"--no-default-ssl"}, - defaultValue = "false", - descriptionKey = "cli.noDefaultSsl" - ) - boolean noDefaultSsl; - - @CommandLine.Option( - names = {"--no-system-ssl"}, - defaultValue = "false", - descriptionKey = "cli.noSystemSsl" - ) - boolean noSystemSsl; - - public SSLFactory getSSLFactory() { - SSLFactory.Builder result = SSLFactory.builder(); - if (!isNoDefaultSsl()) result.withDefaultTrustMaterial(); - if (!isNoSystemSsl()) result.withSystemTrustMaterial(); - return result.build(); - } -} diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index 8e632d123..bbec41310 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -1,8 +1,6 @@ package _demo; -import nbbrd.io.curl.CurlHttpURLConnection; import sdmxdl.*; -import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -19,7 +17,6 @@ public static void main(String[] args) throws IOException { SdmxWebManager manager = SdmxWebManager.ofServiceLoader() .toBuilder() - .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .onEvent(Demo::printEvent) .build(); diff --git a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java new file mode 100644 index 000000000..87f12fd0c --- /dev/null +++ b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java @@ -0,0 +1,152 @@ +package internal.sdmxdl.cli; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ClearEnvironmentVariable; +import org.junitpioneer.jupiter.SetEnvironmentVariable; +import picocli.CommandLine; + +import java.util.concurrent.Callable; + +import static org.assertj.core.api.Assertions.assertThat; + +public class NetworkOptionsTest { + + @Nested + class AutoProxyOptionTest { + @Test + @ClearEnvironmentVariable(key = "SDMXDL_NETWORKING_AUTOPROXY") + public void testWithoutEnv() { + Holder x = new Holder(); + assertThat(x.execute().isAutoProxy()).isFalse(); + assertThat(x.execute("--auto-proxy").isAutoProxy()).isTrue(); + assertThat(x.execute("--no-auto-proxy").isAutoProxy()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_AUTOPROXY", value = "false") + public void testWithEnvFalse() { + Holder x = new Holder(); + assertThat(x.execute().isAutoProxy()).isFalse(); + assertThat(x.execute("--auto-proxy").isAutoProxy()).isTrue(); + assertThat(x.execute("--no-auto-proxy").isAutoProxy()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_AUTOPROXY", value = "true") + public void testWithEnvTrue() { + Holder x = new Holder(); + assertThat(x.execute().isAutoProxy()).isTrue(); + assertThat(x.execute("--auto-proxy").isAutoProxy()).isTrue(); + assertThat(x.execute("--no-auto-proxy").isAutoProxy()).isFalse(); + } + } + + @Nested + class CurlBackendOptionTest { + @Test + @ClearEnvironmentVariable(key = "SDMXDL_NETWORKING_CURLBACKEND") + public void testWithoutEnv() { + Holder x = new Holder(); + assertThat(x.execute().isCurlBackend()).isFalse(); + assertThat(x.execute("--curl").isCurlBackend()).isTrue(); + assertThat(x.execute("--no-curl").isCurlBackend()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_CURLBACKEND", value = "false") + public void testWithEnvFalse() { + Holder x = new Holder(); + assertThat(x.execute().isCurlBackend()).isFalse(); + assertThat(x.execute("--curl").isCurlBackend()).isTrue(); + assertThat(x.execute("--no-curl").isCurlBackend()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_CURLBACKEND", value = "true") + public void testWithEnvTrue() { + Holder x = new Holder(); + assertThat(x.execute().isCurlBackend()).isTrue(); + assertThat(x.execute("--curl").isCurlBackend()).isTrue(); + assertThat(x.execute("--no-curl").isCurlBackend()).isFalse(); + } + } + + @Nested + class NoDefaultSslOptionTest { + @Test + @ClearEnvironmentVariable(key = "SDMXDL_NETWORKING_NODEFAULTSSL") + public void testWithoutEnv() { + Holder x = new Holder(); + assertThat(x.execute().isNoDefaultSsl()).isFalse(); + assertThat(x.execute("--no-default-ssl").isNoDefaultSsl()).isTrue(); + assertThat(x.execute("--default-ssl").isNoDefaultSsl()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_NODEFAULTSSL", value = "false") + public void testWithEnvFalse() { + Holder x = new Holder(); + assertThat(x.execute().isNoDefaultSsl()).isFalse(); + assertThat(x.execute("--no-default-ssl").isNoDefaultSsl()).isTrue(); + assertThat(x.execute("--default-ssl").isNoDefaultSsl()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_NODEFAULTSSL", value = "true") + public void testWithEnvTrue() { + Holder x = new Holder(); + assertThat(x.execute().isNoDefaultSsl()).isTrue(); + assertThat(x.execute("--no-default-ssl").isNoDefaultSsl()).isTrue(); + assertThat(x.execute("--default-ssl").isNoDefaultSsl()).isFalse(); + } + } + + @Nested + class NoSystemSslOptionTest { + @Test + @ClearEnvironmentVariable(key = "SDMXDL_NETWORKING_NOSYSTEMSSL") + public void testWithoutEnv() { + Holder x = new Holder(); + assertThat(x.execute().isNoSystemSsl()).isFalse(); + assertThat(x.execute("--no-system-ssl").isNoSystemSsl()).isTrue(); + assertThat(x.execute("--system-ssl").isNoSystemSsl()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_NOSYSTEMSSL", value = "false") + public void testWithEnvFalse() { + Holder x = new Holder(); + assertThat(x.execute().isNoSystemSsl()).isFalse(); + assertThat(x.execute("--no-system-ssl").isNoSystemSsl()).isTrue(); + assertThat(x.execute("--system-ssl").isNoSystemSsl()).isFalse(); + } + + @Test + @SetEnvironmentVariable(key = "SDMXDL_NETWORKING_NOSYSTEMSSL", value = "true") + public void testWithEnvTrue() { + Holder x = new Holder(); + assertThat(x.execute().isNoSystemSsl()).isTrue(); + assertThat(x.execute("--no-system-ssl").isNoSystemSsl()).isTrue(); + assertThat(x.execute("--system-ssl").isNoSystemSsl()).isFalse(); + } + } + + @CommandLine.Command + static class Holder implements Callable { + + @CommandLine.Mixin + NetworkOptions options; + + @Override + public Void call() { + return null; + } + + NetworkOptions execute(String... args) { + CommandLine cmd = new CommandLine(this); + cmd.execute(args); + return options; + } + } +} diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index f9a7cfec7..2ace034f5 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -63,6 +63,11 @@ sdmx-dl-provider-base ${project.version} + + ${project.groupId} + sdmx-dl-provider-ri + ${project.version} + ${project.groupId} sdmx-dl-format-xml @@ -78,22 +83,6 @@ sdmx-dl-format-csv ${project.version} - - com.github.nbbrd.java-net-proxy - java-net-proxy - 1.0.1 - - - io.github.hakky54 - sslcontext-kickstart - 8.1.2 - - - slf4j-api - org.slf4j - - - com.github.nbbrd.java-desktop-util java-desktop-util-swing @@ -131,18 +120,8 @@ miglayout-swing 5.3 - - com.github.nbbrd.java-io-util - java-io-curl - - - ${project.groupId} - sdmx-dl-provider-ri - ${project.version} - runtime - ${project.groupId} sdmx-dl-format-protobuf diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index fe524ad71..7b60f5363 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -1,7 +1,5 @@ package internal.sdmxdl.desktop; -import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; public class DesktopWebFactory { @@ -13,7 +11,6 @@ public class DesktopWebFactory { public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() - .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) .onEvent((source, marker, msg) -> System.out.println(source.getId() + ": " + msg)) .build(); } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index cd115a819..1ff7d521d 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -17,10 +17,10 @@ import org.kordamp.ikonli.swing.FontIcon; import sdmxdl.DataflowRef; import sdmxdl.Languages; -import sdmxdl.web.spi.Network; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.Network; import javax.imageio.ImageIO; import javax.swing.*; @@ -100,7 +100,7 @@ public void setDataSources(@NonNull DefaultListModel dataSources) private URLConnection openConnection(URL url) throws IOException { try { SdmxWebSource source = SdmxWebSource.builder().id("").driver("").endpoint(url.toURI()).build(); - Network network = getSdmxManager().getNetworking().getNetwork(source); + Network network = getSdmxManager().getNetworking().getNetwork(source, null, null); return network.getURLConnectionFactory().openConnection(url, Proxy.NO_PROXY); } catch (URISyntaxException ex) { throw new IOException(ex); diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index d0e8e25ec..6508094a6 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -1,16 +1,11 @@ package sdmxdl.grpc; -import nbbrd.io.curl.CurlHttpURLConnection; -import sdmxdl.provider.web.SingleNetworkingSupport; import sdmxdl.web.SdmxWebManager; @lombok.experimental.UtilityClass class GrpcWebFactory { public static SdmxWebManager loadManager() { - return SdmxWebManager.ofServiceLoader() - .toBuilder() - .networking(SingleNetworkingSupport.builder().id("CURL").urlConnectionFactoryOf(CurlHttpURLConnection::of).build()) - .build(); + return SdmxWebManager.ofServiceLoader(); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java new file mode 100644 index 000000000..b1786194f --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java @@ -0,0 +1,40 @@ +package sdmxdl.provider; + +import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.web.SdmxWebSource; + +import java.util.Locale; +import java.util.Map; +import java.util.Properties; +import java.util.function.Function; + +@lombok.experimental.UtilityClass +public class PropertiesSupport { + + public static @NonNull Function asFunction(@NonNull SdmxWebSource source) { + return key -> PropertiesSupport.getProperty(source.getProperties(), key); + } + + public static @Nullable String getProperty( + @NonNull Map properties, + @NonNull String key) { + return getProperty(properties, System.getProperties(), System.getenv(), key); + } + + public static @Nullable String getProperty( + @NonNull Map properties, + @NonNull Properties system, + @NonNull Map env, + @NonNull String key) { + String result; + if ((result = properties.get(key)) != null) return result; + if ((result = system.getProperty(key)) != null) return result; + if ((result = env.get(toEnvKey(key))) != null) return result; + return null; + } + + private static String toEnvKey(String key) { + return key.replace('.', '_').toUpperCase(Locale.ROOT); + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Slow.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Slow.java new file mode 100644 index 000000000..f817a57d8 --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Slow.java @@ -0,0 +1,9 @@ +package sdmxdl.provider; + +import java.lang.annotation.*; + +@Documented +@Target({ElementType.FIELD, ElementType.METHOD}) +@Retention(RetentionPolicy.SOURCE) +public @interface Slow { +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Suppliers.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Suppliers.java new file mode 100644 index 000000000..516eee02b --- /dev/null +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/Suppliers.java @@ -0,0 +1,22 @@ +package sdmxdl.provider; + +import lombok.NonNull; + +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +@lombok.experimental.UtilityClass +public class Suppliers { + + public static @NonNull Supplier memoize(@NonNull Supplier supplier) { + AtomicReference ref = new AtomicReference<>(); + return () -> { + T result = ref.get(); + if (result == null) { + result = supplier.get(); + ref.set(result); + } + return result; + }; + } +} diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java index e5715441a..f59c39154 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java @@ -2,12 +2,15 @@ import lombok.AccessLevel; import lombok.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; import sdmxdl.format.ServiceSupport; +import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.SSLFactory; -import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.URLConnectionFactory; -import sdmxdl.web.spi.Networking; import java.net.ProxySelector; import java.util.Collection; @@ -61,7 +64,10 @@ public boolean isNetworkingAvailable() { } @Override - public @NonNull Network getNetwork(@NonNull SdmxWebSource ignore) { + public @NonNull Network getNetwork( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { return getSingleNetwork(); } diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/SingleNetworkingSupportTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/SingleNetworkingSupportTest.java new file mode 100644 index 000000000..642a0c3be --- /dev/null +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/SingleNetworkingSupportTest.java @@ -0,0 +1,12 @@ +package sdmxdl.provider.web; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.NetworkingAssert; + +public class SingleNetworkingSupportTest { + + @Test + public void testCompliance() { + NetworkingAssert.assertCompliance(SingleNetworkingSupport.builder().id("TEST").build()); + } +} diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index c66b02f5d..ebaff7138 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -69,6 +69,27 @@ com.github.nbbrd.java-io-util java-io-curl + + io.github.hakky54 + sslcontext-kickstart + 8.1.2 + + + slf4j-api + org.slf4j + + + + + com.github.nbbrd.java-net-proxy + java-net-proxy + 1.0.1 + + + slf4j-api + org.slf4j + ${slf4j.version} + diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index 377c4dd96..f55e7de1d 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -4,9 +4,11 @@ import sdmxdl.provider.ri.web.monitors.UpptimeMonitoring; import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; import sdmxdl.file.spi.Reader; +import sdmxdl.provider.ri.web.networking.RiNetworking; import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.Monitor; +import sdmxdl.web.spi.Networking; module sdmxdl.provider.ri { @@ -21,6 +23,9 @@ requires com.github.tuupertunut.powershelllibjava; requires com.google.gson; requires java.logging; + requires nl.altindag.ssl; + requires nbbrd.io.curl; + requires nbbrd.net.proxy; provides Driver with BbkDriver, @@ -45,5 +50,8 @@ UpptimeMonitoring, UptimeRobotMonitoring; + provides Networking with + RiNetworking; + opens sdmxdl.provider.ri.web.monitors to com.google.gson; } \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java new file mode 100644 index 000000000..0fae44512 --- /dev/null +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java @@ -0,0 +1,54 @@ +package sdmxdl.provider.ri.web.networking; + +import lombok.NonNull; +import nbbrd.io.curl.CurlHttpURLConnection; +import nbbrd.net.proxy.SystemProxySelector; +import sdmxdl.provider.Slow; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.SSLFactory; +import sdmxdl.web.spi.URLConnectionFactory; + +import java.net.ProxySelector; +import java.util.function.Supplier; + +import static sdmxdl.provider.Suppliers.memoize; + +@lombok.Builder +@lombok.ToString +class RiNetwork implements Network { + + @lombok.Builder.Default + private final boolean autoProxy = false; + + @lombok.Builder.Default + private final boolean noSystemSSL = false; + + @lombok.Builder.Default + private final boolean noDefaultSSL = false; + + @lombok.Builder.Default + private final boolean curlBackend = false; + + @Override + public @NonNull ProxySelector getProxySelector() { + return autoProxy ? MEMOIZED_AUTO_PROXY.get() : ProxySelector.getDefault(); + } + + @Override + public @NonNull SSLFactory getSSLFactory() { + return RiSSLFactory + .builder() + .noDefaultTrustMaterial(noDefaultSSL) + .noSystemTrustMaterial(noSystemSSL) + .build(); + } + + @Override + public @NonNull URLConnectionFactory getURLConnectionFactory() { + return curlBackend ? CurlHttpURLConnection::of : URLConnectionFactory.getDefault(); + } + + @Slow + private static final Supplier MEMOIZED_AUTO_PROXY + = memoize(SystemProxySelector::ofServiceLoader); +} diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java new file mode 100644 index 000000000..b88fe3276 --- /dev/null +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java @@ -0,0 +1,78 @@ +package sdmxdl.provider.ri.web.networking; + +import lombok.NonNull; +import nbbrd.io.text.BooleanProperty; +import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; +import sdmxdl.provider.PropertiesSupport; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Network; +import sdmxdl.web.spi.Networking; + +import java.util.Collection; +import java.util.function.Function; + +import static nbbrd.io.text.BaseProperty.keysOf; + +@ServiceProvider +public final class RiNetworking implements Networking { + + public static final BooleanProperty AUTO_PROXY_PROPERTY + = BooleanProperty.of("sdmxdl.networking.autoProxy", false); + + public static final BooleanProperty NO_SYSTEM_SSL_PROPERTY + = BooleanProperty.of("sdmxdl.networking.noSystemSSL", false); + + public static final BooleanProperty NO_DEFAULT_SSL_PROPERTY + = BooleanProperty.of("sdmxdl.networking.noDefaultSSL", false); + + public static final BooleanProperty CURL_BACKEND_PROPERTY + = BooleanProperty.of("sdmxdl.networking.curlBackend", false); + + @Override + public @NonNull String getNetworkingId() { + return "RI_NETWORKING"; + } + + @Override + public int getNetworkingRank() { + return 100; + } + + @Override + public boolean isNetworkingAvailable() { + return true; + } + + @Override + public @NonNull Collection getNetworkingProperties() { + return keysOf( + AUTO_PROXY_PROPERTY, + NO_SYSTEM_SSL_PROPERTY, + NO_DEFAULT_SSL_PROPERTY, + CURL_BACKEND_PROPERTY + ); + } + + @Override + public @NonNull Network getNetwork( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { + RiNetwork result = getNetwork(PropertiesSupport.asFunction(source)); + if (onEvent != null) onEvent.accept(source, getNetworkingId(), "Using " + result); + return result; + } + + private static RiNetwork getNetwork(Function properties) { + return RiNetwork + .builder() + .autoProxy(AUTO_PROXY_PROPERTY.get(properties)) + .noDefaultSSL(NO_DEFAULT_SSL_PROPERTY.get(properties)) + .noSystemSSL(NO_SYSTEM_SSL_PROPERTY.get(properties)) + .curlBackend(CURL_BACKEND_PROPERTY.get(properties)) + .build(); + } +} diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java new file mode 100644 index 000000000..9dda4a8f9 --- /dev/null +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java @@ -0,0 +1,55 @@ +package sdmxdl.provider.ri.web.networking; + +import lombok.AccessLevel; +import lombok.NonNull; +import nl.altindag.ssl.util.TrustManagerUtils; +import sdmxdl.provider.Slow; +import sdmxdl.web.spi.SSLFactory; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.X509ExtendedTrustManager; +import java.util.Optional; +import java.util.function.Supplier; + +import static sdmxdl.provider.Suppliers.memoize; + +@lombok.Builder +final class RiSSLFactory implements SSLFactory { + + @lombok.Builder.Default + private final boolean noDefaultTrustMaterial = false; + + @lombok.Builder.Default + private final boolean noSystemTrustMaterial = false; + + @lombok.Getter(value = AccessLevel.PRIVATE, lazy = true) + private final @NonNull nl.altindag.ssl.SSLFactory lazyDelegate = initLazyDelegate(); + + @Slow + private nl.altindag.ssl.SSLFactory initLazyDelegate() { + nl.altindag.ssl.SSLFactory.Builder result = nl.altindag.ssl.SSLFactory.builder(); + if (!noDefaultTrustMaterial) result.withTrustMaterial(MEMOIZED_DEFAULT_TRUST_MATERIAL.get()); + if (!noSystemTrustMaterial) MEMOIZED_SYSTEM_TRUST_MATERIAL.get().ifPresent(result::withTrustMaterial); + if (noDefaultTrustMaterial && noSystemTrustMaterial) result.withDummyTrustMaterial(); + return result.build(); + } + + @Override + public @NonNull SSLSocketFactory getSSLSocketFactory() { + return getLazyDelegate().getSslSocketFactory(); + } + + @Override + public @NonNull HostnameVerifier getHostnameVerifier() { + return getLazyDelegate().getHostnameVerifier(); + } + + @Slow + private static final Supplier MEMOIZED_DEFAULT_TRUST_MATERIAL + = memoize(TrustManagerUtils::createTrustManagerWithJdkTrustedCertificates); + + @Slow + private static final Supplier> MEMOIZED_SYSTEM_TRUST_MATERIAL + = memoize(TrustManagerUtils::createTrustManagerWithSystemTrustedCertificates); +} diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java new file mode 100644 index 000000000..9b99b84e2 --- /dev/null +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java @@ -0,0 +1,13 @@ +package sdmxdl.provider.ri.web.networking; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.NetworkingAssert; + +public class RiNetworkingTest { + + @Test + public void testCompliance() { + NetworkingAssert.assertCompliance(new RiNetworking()); + } +} + diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java new file mode 100644 index 000000000..e28c839fb --- /dev/null +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java @@ -0,0 +1,32 @@ +package sdmxdl.provider.ri.web.networking; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static tests.sdmxdl.web.spi.SSLFactoryAssert.assertCompliance; + +public class RiSSLFactoryTest { + + @ParameterizedTest(name = "noDefaultTrustMaterial={0}, noSystemTrustMaterial={1}") + @MethodSource("provideComplianceArgs") + public void testCompliance(boolean noDefaultTrustMaterial, boolean noSystemTrustMaterial) { + assertCompliance(RiSSLFactory + .builder() + .noDefaultTrustMaterial(noDefaultTrustMaterial) + .noSystemTrustMaterial(noSystemTrustMaterial) + .build() + ); + } + + private static Stream provideComplianceArgs() { + return Stream.of( + Arguments.of(false, false), + Arguments.of(false, true), + Arguments.of(true, false), + Arguments.of(true, true) + ); + } +} From e1b583c82f5ad15c776f1782084553e658400ead Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 25 Jul 2023 09:24:14 +0200 Subject: [PATCH 048/114] Fix surefire config on JDK8 --- pom.xml | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 7fd416cc8..584755a9b 100644 --- a/pom.xml +++ b/pom.xml @@ -270,21 +270,6 @@ 1.8 1.8 - - - - org.apache.maven.plugins - maven-surefire-plugin - - false - - --add-opens java.base/java.util=ALL-UNNAMED - --add-opens java.base/java.lang=ALL-UNNAMED - - - - - @@ -414,6 +399,17 @@ + + org.apache.maven.plugins + maven-surefire-plugin + + false + + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + + + From 0e84f55658ce822c8c1f5d588b12321df32b0514 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 25 Jul 2023 09:42:04 +0200 Subject: [PATCH 049/114] Code cleanup --- .../sdmxdl/web/{ => spi}/DefaultNetwork.java | 2 +- .../web/{ => spi}/DefaultSSLFactory.java | 2 +- .../src/main/java/sdmxdl/web/spi/Driver.java | 2 + .../src/main/java/sdmxdl/web/spi/Network.java | 2 +- .../main/java/sdmxdl/web/spi/SSLFactory.java | 2 +- .../sdmxdl/web/DefaultNetworkTest.java | 6 +- .../sdmxdl/web/spi/DefaultNetworkTest.java | 13 +++++ .../sdmxdl/web/spi/DefaultSSLFactoryTest.java | 12 ++++ .../web/spi/FailsafeConnectionTest.java | 6 +- .../sdmxdl/web/spi/FailsafeDriverTest.java | 12 ++-- .../java/sdmxdl/ext/SdmxCubeUtilTest.java | 14 ++--- .../java/sdmxdl/web/NetworkFactoryTest.java | 13 ----- .../java/sdmxdl/web/SdmxWebManagerTest.java | 2 +- .../test/java/sdmxdl/web/spi/NetworkTest.java | 13 +++++ .../java/tests/sdmxdl/ext/NetworkAssert.java | 19 ------ .../ReaderAssert.java} | 4 +- .../sdmxdl/web/WebAuthenticatorAssert.java | 42 -------------- .../tests/sdmxdl/web/WebDriverAssert.java | 49 ---------------- .../sdmxdl/web/spi/AuthenticatorAssert.java | 43 ++++++++++++++ .../tests/sdmxdl/web/spi/DriverAssert.java | 58 +++++++++++++++++++ .../sdmxdl/web/{ => spi}/MockedDriver.java | 4 +- .../tests/sdmxdl/web/spi/MonitorAssert.java | 35 +++++++++++ .../tests/sdmxdl/web/spi/NetworkAssert.java | 8 +-- .../sdmxdl/web/spi/NetworkingAssert.java | 13 +++-- .../sdmxdl/web/spi/SSLFactoryAssert.java | 6 +- .../sdmxdl/cli/ConstantAuthenticatorTest.java | 27 +++++++++ .../drivers/EurostatDriverTest.java | 5 +- .../connectors/drivers/ImfDriverTest.java | 5 +- .../connectors/drivers/InseeDriverTest.java | 5 +- .../connectors/drivers/NbbDriverTest.java | 5 +- .../connectors/drivers/OecdDriverTest.java | 5 +- .../connectors/drivers/Sdmx20DriverTest.java | 7 +-- .../connectors/drivers/Sdmx21DriverTest.java | 5 +- .../connectors/drivers/UisDriverTest.java | 5 +- .../src/main/java/module-info.java | 8 +-- ...imeMonitoring.java => UpptimeMonitor.java} | 4 +- ...onitoring.java => UptimeRobotMonitor.java} | 4 +- .../ri/file/readers/XmlReaderTest.java | 9 ++- .../provider/ri/web/RiHttpUtilsTest.java | 7 +-- .../ri/web/drivers/BbkDriverTest.java | 5 +- .../ri/web/drivers/DotStatDriver2Test.java | 5 +- .../ri/web/drivers/EurostatDriver2Test.java | 5 +- .../ri/web/drivers/FileDriverTest.java | 5 +- .../ri/web/drivers/ImfDriver2Test.java | 5 +- .../ri/web/drivers/InseeDriver2Test.java | 5 +- .../ri/web/drivers/NbbDriver2Test.java | 5 +- .../ri/web/drivers/RngDriverTest.java | 7 +-- .../ri/web/drivers/Sdmx21Driver2Test.java | 5 +- .../ri/web/drivers/StatCanDriverTest.java | 6 +- .../ri/web/monitors/UpptimeMonitorTest.java | 25 ++++++++ .../provider/ri/web/monitors/UpptimeTest.java | 6 +- .../web/monitors/UptimeRobotMonitorTest.java | 25 ++++++++ .../ri/web/networking/RiNetworkingTest.java | 5 +- 53 files changed, 356 insertions(+), 241 deletions(-) rename sdmx-dl-api/src/main/java/internal/sdmxdl/web/{ => spi}/DefaultNetwork.java (94%) rename sdmx-dl-api/src/main/java/internal/sdmxdl/web/{ => spi}/DefaultSSLFactory.java (94%) create mode 100644 sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkTest.java create mode 100644 sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultSSLFactoryTest.java delete mode 100644 sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java create mode 100644 sdmx-dl-api/src/test/java/sdmxdl/web/spi/NetworkTest.java delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java rename sdmx-dl-api/src/test/java/tests/sdmxdl/file/{FileReaderAssert.java => spi/ReaderAssert.java} (97%) delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java delete mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java rename sdmx-dl-api/src/test/java/tests/sdmxdl/web/{ => spi}/MockedDriver.java (98%) create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java create mode 100644 sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/{UpptimeMonitoring.java => UpptimeMonitor.java} (98%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/{UptimeRobotMonitoring.java => UptimeRobotMonitor.java} (98%) create mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java create mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetwork.java similarity index 94% rename from sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java rename to sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetwork.java index 2cb9db879..f73c7837a 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultNetwork.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetwork.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.web; +package internal.sdmxdl.web.spi; import lombok.NonNull; import sdmxdl.web.spi.Network; diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultSSLFactory.java similarity index 94% rename from sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java rename to sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultSSLFactory.java index cdaef4295..cdf63caba 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/DefaultSSLFactory.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultSSLFactory.java @@ -1,4 +1,4 @@ -package internal.sdmxdl.web; +package internal.sdmxdl.web.spi; import lombok.NonNull; import sdmxdl.web.spi.SSLFactory; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java index a0ca25cd2..2d30ce6ae 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java @@ -60,4 +60,6 @@ public interface Driver { int NATIVE_DRIVER_RANK = Byte.MAX_VALUE; int WRAPPED_DRIVER_RANK = 0; int UNKNOWN_DRIVER_RANK = -1; + + String DRIVER_PROPERTY_PREFIX = "sdmxdl.driver"; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java index b1de3d42c..3378912be 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Network.java @@ -1,6 +1,6 @@ package sdmxdl.web.spi; -import internal.sdmxdl.web.DefaultNetwork; +import internal.sdmxdl.web.spi.DefaultNetwork; import lombok.NonNull; import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java index 423ccc0a5..63e3bb4a0 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/SSLFactory.java @@ -1,6 +1,6 @@ package sdmxdl.web.spi; -import internal.sdmxdl.web.DefaultSSLFactory; +import internal.sdmxdl.web.spi.DefaultSSLFactory; import lombok.NonNull; import nbbrd.design.NotThreadSafe; import nbbrd.design.StaticFactoryMethod; diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java index ca819e11b..54fad6bab 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/DefaultNetworkTest.java @@ -1,12 +1,14 @@ package internal.sdmxdl.web; +import internal.sdmxdl.web.spi.DefaultNetwork; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.spi.NetworkAssert; + +import static tests.sdmxdl.web.spi.NetworkAssert.assertCompliance; public class DefaultNetworkTest { @Test public void testCompliance() { - NetworkAssert.assertCompliance(DefaultNetwork.INSTANCE); + assertCompliance(DefaultNetwork.INSTANCE); } } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkTest.java new file mode 100644 index 000000000..e07729652 --- /dev/null +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultNetworkTest.java @@ -0,0 +1,13 @@ +package internal.sdmxdl.web.spi; + +import org.junit.jupiter.api.Test; + +import static tests.sdmxdl.web.spi.NetworkAssert.assertCompliance; + +public class DefaultNetworkTest { + + @Test + public void testCompliance() { + assertCompliance(DefaultNetwork.INSTANCE); + } +} diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultSSLFactoryTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultSSLFactoryTest.java new file mode 100644 index 000000000..b468aa95d --- /dev/null +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/DefaultSSLFactoryTest.java @@ -0,0 +1,12 @@ +package internal.sdmxdl.web.spi; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.SSLFactoryAssert; + +public class DefaultSSLFactoryTest { + + @Test + public void testCompliance() { + SSLFactoryAssert.assertCompliance(DefaultSSLFactory.INSTANCE); + } +} diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java index b3444252c..7bdcb6cee 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java @@ -25,8 +25,8 @@ import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.api.ConnectionAssert; import tests.sdmxdl.api.RepoSamples; -import tests.sdmxdl.web.MockedDriver; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.MockedDriver; +import tests.sdmxdl.web.spi.DriverAssert; import java.util.EnumSet; @@ -46,7 +46,7 @@ public void testCompliance() { SdmxWebSource source = driver.getDefaultSources().iterator().next(); ConnectionAssert.assertCompliance( - () -> FailsafeConnection.wrap(driver.connect(source, ANY, WebDriverAssert.noOpWebContext())), + () -> FailsafeConnection.wrap(driver.connect(source, ANY, DriverAssert.noOpWebContext())), ConnectionAssert.Sample .builder() .validFlow(RepoSamples.FLOW_REF) diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java index 90234b503..f57fd4221 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeDriverTest.java @@ -21,8 +21,8 @@ import _test.sdmxdl.TestDriver; import org.junit.jupiter.api.Test; import sdmxdl.web.spi.Driver; -import tests.sdmxdl.web.MockedDriver; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.MockedDriver; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; @@ -38,7 +38,7 @@ public class FailsafeDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance( + DriverAssert.assertCompliance( FailsafeDriver.wrap(MockedDriver.builder().build()) ); } @@ -83,20 +83,20 @@ public void testIsAvailable() { @Test public void testConnect() throws IOException { failsafe.reset(); - assertThat(valid.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) + assertThat(valid.connect(TestDriver.SOURCE, ANY, DriverAssert.noOpWebContext())) .isNotNull() .isInstanceOf(FailsafeConnection.class); failsafe.assertEmpty(); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> failing.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) + .isThrownBy(() -> failing.connect(TestDriver.SOURCE, ANY, DriverAssert.noOpWebContext())) .withCauseInstanceOf(CustomException.class); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> nul.connect(TestDriver.SOURCE, ANY, WebDriverAssert.noOpWebContext())) + .isThrownBy(() -> nul.connect(TestDriver.SOURCE, ANY, DriverAssert.noOpWebContext())) .withNoCause(); failsafe.assertUnexpectedNull("unexpected null"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java index 9aa88e1b2..87961aa18 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java @@ -8,8 +8,8 @@ import sdmxdl.Series; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import tests.sdmxdl.web.MockedDriver; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.MockedDriver; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; import java.util.EnumSet; @@ -51,7 +51,7 @@ public void testGetAllSeries() throws IOException { for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(null, FLOW_REF, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(c, null, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(c, FLOW_REF, null)); @@ -77,7 +77,7 @@ public void testGetAllSeriesWithData() throws IOException { for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(null, FLOW_REF, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(c, null, ALL)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(c, FLOW_REF, null)); @@ -103,7 +103,7 @@ public void testGetSeries() throws IOException { for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(null, FLOW_REF, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(c, null, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(c, FLOW_REF, null)); @@ -123,7 +123,7 @@ public void testGetSeriesWithData() throws IOException { for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(null, FLOW_REF, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(c, null, K1)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(c, FLOW_REF, null)); @@ -143,7 +143,7 @@ public void testGetChildren() throws IOException { for (Driver driver : getDrivers()) { SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection c = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(null, FLOW_REF, ALL, 0)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(c, null, ALL, 0)); assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(c, FLOW_REF, null, 0)); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java deleted file mode 100644 index 51c46081d..000000000 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/NetworkFactoryTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package sdmxdl.web; - -import org.junit.jupiter.api.Test; -import sdmxdl.web.spi.Network; -import tests.sdmxdl.ext.NetworkAssert; - -public class NetworkFactoryTest { - - @Test - public void testGetDefault() { - NetworkAssert.assertCompliance(Network.getDefault()); - } -} diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index cd7d3a3d5..e5795f95f 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -24,7 +24,7 @@ import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.Driver; import tests.sdmxdl.api.SdmxManagerAssert; -import tests.sdmxdl.web.MockedDriver; +import tests.sdmxdl.web.spi.MockedDriver; import java.io.IOException; import java.util.AbstractMap; diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/spi/NetworkTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/spi/NetworkTest.java new file mode 100644 index 000000000..722852748 --- /dev/null +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/spi/NetworkTest.java @@ -0,0 +1,13 @@ +package sdmxdl.web.spi; + +import org.junit.jupiter.api.Test; + +import static tests.sdmxdl.web.spi.NetworkAssert.assertCompliance; + +public class NetworkTest { + + @Test + public void testGetDefault() { + assertCompliance(Network.getDefault()); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java deleted file mode 100644 index a0267021e..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/NetworkAssert.java +++ /dev/null @@ -1,19 +0,0 @@ -package tests.sdmxdl.ext; - -import org.assertj.core.api.SoftAssertions; -import sdmxdl.web.spi.Network; -import tests.sdmxdl.api.TckUtil; - -@lombok.experimental.UtilityClass -public class NetworkAssert { - - public void assertCompliance(Network network) { - TckUtil.run(s -> assertCompliance(s, network)); - } - - public void assertCompliance(SoftAssertions s, Network network) { - s.assertThat(network.getProxySelector()).isNotNull(); - s.assertThat(network.getSSLFactory()).isNotNull(); - s.assertThat(network.getURLConnectionFactory()).isNotNull(); - } -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java similarity index 97% rename from sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java rename to sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java index 1b679c6a4..1da3080f5 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/FileReaderAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java @@ -1,4 +1,4 @@ -package tests.sdmxdl.file; +package tests.sdmxdl.file.spi; import org.assertj.core.api.SoftAssertions; import sdmxdl.Connection; @@ -10,7 +10,7 @@ import static sdmxdl.Languages.ANY; @lombok.experimental.UtilityClass -public class FileReaderAssert { +public class ReaderAssert { public FileContext noOpFileContext() { return FileContext.builder().build(); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java deleted file mode 100644 index 23f7aa353..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebAuthenticatorAssert.java +++ /dev/null @@ -1,42 +0,0 @@ -package tests.sdmxdl.web; - -import org.assertj.core.api.SoftAssertions; -import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.Authenticator; -import tests.sdmxdl.api.TckUtil; - -@SuppressWarnings("ConstantConditions") -@lombok.experimental.UtilityClass -public class WebAuthenticatorAssert { - - @lombok.Value - @lombok.Builder(toBuilder = true) - public static class Sample { - SdmxWebSource source; - } - - public void assertCompliance(Authenticator actual, Sample sample) { - TckUtil.run(s -> assertCompliance(s, actual, sample)); - } - - public void assertCompliance(SoftAssertions s, Authenticator actual, Sample sample) { - checkGetPasswordAuthentication(s, actual, sample); - checkInvalidate(s, actual, sample); - } - - private void checkGetPasswordAuthentication(SoftAssertions s, Authenticator actual, Sample sample) { - s.assertThatThrownBy(() -> actual.getPasswordAuthenticationOrNull(null)) - .isInstanceOf(NullPointerException.class); - - s.assertThatCode(() -> actual.getPasswordAuthenticationOrNull(sample.source)). - doesNotThrowAnyException(); - } - - private void checkInvalidate(SoftAssertions s, Authenticator actual, Sample sample) { - s.assertThatThrownBy(() -> actual.invalidateAuthentication(null)) - .isInstanceOf(NullPointerException.class); - - s.assertThatCode(() -> actual.invalidateAuthentication(sample.source)) - .doesNotThrowAnyException(); - } -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java deleted file mode 100644 index 9493a237f..000000000 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/WebDriverAssert.java +++ /dev/null @@ -1,49 +0,0 @@ -package tests.sdmxdl.web; - -import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.Driver; -import sdmxdl.web.spi.WebContext; - -import static org.assertj.core.api.Assertions.*; -import static sdmxdl.Languages.ANY; - -@lombok.experimental.UtilityClass -public class WebDriverAssert { - - public WebContext noOpWebContext() { - return WebContext.builder().build(); - } - - @SuppressWarnings("null") - public void assertCompliance(Driver d) { - SdmxWebSource validSource = SdmxWebSource - .builder() - .id("valid") - .driver(d.getDriverId()) - .endpointOf("http://localhost") - .build(); - - SdmxWebSource invalidSource = validSource.toBuilder().driver("").build(); - - WebContext context = WebDriverAssert.noOpWebContext(); - - assertThat(d.getDriverId()).isNotBlank(); - - assertThatNullPointerException().isThrownBy(() -> d.connect(null, ANY, context)); - assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, null, context)); - assertThatNullPointerException().isThrownBy(() -> d.connect(validSource, ANY, null)); - - assertThatIllegalArgumentException().isThrownBy(() -> d.connect(invalidSource, ANY, context)); - - assertThat(d.getDefaultSources()).allSatisfy(o -> checkSource(o, d)); - - assertThat(d.getClass()).isFinal(); - } - - private void checkSource(SdmxWebSource o, Driver d) { - assertThat(o.getId()).isNotBlank(); - assertThat(o.getProperties()).isNotNull(); - assertThat(o.getDriver()).isEqualTo(d.getDriverId()); - assertThat(o.getProperties().keySet()).isSubsetOf(d.getDriverProperties()); - } -} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java new file mode 100644 index 000000000..4f7dbc21a --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java @@ -0,0 +1,43 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Authenticator; + +import static org.assertj.core.api.Assertions.*; +import static tests.sdmxdl.api.TckUtil.SCREAMING_SNAKE_CASE; + +@SuppressWarnings("ConstantConditions") +@lombok.experimental.UtilityClass +public class AuthenticatorAssert { + + @lombok.Value + @lombok.Builder(toBuilder = true) + public static class Sample { + SdmxWebSource source; + } + + public void assertCompliance(@NonNull Authenticator authenticator, @NonNull Sample sample) { + assertThat(authenticator.getAuthenticatorId()) + .containsPattern(SCREAMING_SNAKE_CASE); + + checkGetPasswordAuthentication(authenticator, sample); + checkInvalidate(authenticator, sample); + } + + private void checkGetPasswordAuthentication(Authenticator authenticator, Sample sample) { + assertThatThrownBy(() -> authenticator.getPasswordAuthenticationOrNull(null)) + .isInstanceOf(NullPointerException.class); + + assertThatCode(() -> authenticator.getPasswordAuthenticationOrNull(sample.source)). + doesNotThrowAnyException(); + } + + private void checkInvalidate(Authenticator authenticator, Sample sample) { + assertThatThrownBy(() -> authenticator.invalidateAuthentication(null)) + .isInstanceOf(NullPointerException.class); + + assertThatCode(() -> authenticator.invalidateAuthentication(sample.source)) + .doesNotThrowAnyException(); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java new file mode 100644 index 000000000..3ba02a34a --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java @@ -0,0 +1,58 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Driver; +import sdmxdl.web.spi.WebContext; + +import static org.assertj.core.api.Assertions.*; +import static sdmxdl.Languages.ANY; + +@lombok.experimental.UtilityClass +public class DriverAssert { + + public WebContext noOpWebContext() { + return WebContext.builder().build(); + } + + @SuppressWarnings("null") + public void assertCompliance(@NonNull Driver driver) { + assertThat(driver.getDriverId()) +// .containsPattern(SCREAMING_SNAKE_CASE) + .isNotBlank(); + + assertThat(driver.getDriverProperties()) +// .are(startingWith(DRIVER_PROPERTY_PREFIX)) + .doesNotHaveDuplicates(); + + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver(driver.getDriverId()) + .endpointOf("http://localhost") + .build(); + + SdmxWebSource invalidSource = validSource.toBuilder().driver("").build(); + + WebContext context = DriverAssert.noOpWebContext(); + + assertThat(driver.getDriverId()).isNotBlank(); + + assertThatNullPointerException().isThrownBy(() -> driver.connect(null, ANY, context)); + assertThatNullPointerException().isThrownBy(() -> driver.connect(validSource, null, context)); + assertThatNullPointerException().isThrownBy(() -> driver.connect(validSource, ANY, null)); + + assertThatIllegalArgumentException().isThrownBy(() -> driver.connect(invalidSource, ANY, context)); + + assertThat(driver.getDefaultSources()).allSatisfy(o -> checkSource(o, driver)); + + assertThat(driver.getClass()).isFinal(); + } + + private void checkSource(SdmxWebSource o, Driver d) { + assertThat(o.getId()).isNotBlank(); + assertThat(o.getProperties()).isNotNull(); + assertThat(o.getDriver()).isEqualTo(d.getDriverId()); + assertThat(o.getProperties().keySet()).isSubsetOf(d.getDriverProperties()); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java similarity index 98% rename from sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java rename to sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java index 7fa34d7d1..060de892e 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java @@ -1,4 +1,4 @@ -package tests.sdmxdl.web; +package tests.sdmxdl.web.spi; import lombok.NonNull; import sdmxdl.*; @@ -18,7 +18,7 @@ public final class MockedDriver implements Driver { @lombok.Builder.Default - private final String id = "mockedDriver"; + private final String id = "MOCKED_DRIVER"; @lombok.Builder.Default private final int rank = Driver.UNKNOWN_DRIVER_RANK; diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java new file mode 100644 index 000000000..ffa69b219 --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java @@ -0,0 +1,35 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.Monitor; +import sdmxdl.web.spi.WebContext; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNullPointerException; +import static tests.sdmxdl.api.TckUtil.SCREAMING_SNAKE_CASE; + +@SuppressWarnings("ConstantConditions") +@lombok.experimental.UtilityClass +public class MonitorAssert { + + @lombok.Value + @lombok.Builder(toBuilder = true) + public static class Sample { + SdmxWebSource validSource; + } + + public void assertCompliance(@NonNull Monitor monitor, @NonNull Sample sample) { + assertThat(monitor.getMonitorId()) + .containsPattern(SCREAMING_SNAKE_CASE); + + assertThat(monitor.getMonitorUriScheme()) + .isNotBlank(); + + assertThatNullPointerException() + .isThrownBy(() -> monitor.getReport(null, WebContext.builder().build())); + + assertThatNullPointerException() + .isThrownBy(() -> monitor.getReport(sample.validSource, null)); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java index 628fcac60..51d683573 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkAssert.java @@ -8,15 +8,15 @@ @lombok.experimental.UtilityClass public class NetworkAssert { - public static void assertCompliance(@NonNull Network x) { - assertThat(x.getProxySelector()) + public static void assertCompliance(@NonNull Network network) { + assertThat(network.getProxySelector()) .isNotNull(); - assertThat(x.getSSLFactory()) + assertThat(network.getSSLFactory()) .isNotNull() .satisfies(SSLFactoryAssert::assertCompliance); - assertThat(x.getURLConnectionFactory()) + assertThat(network.getURLConnectionFactory()) .isNotNull(); } } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java index 1e8f9e6f0..904cfe889 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java @@ -14,16 +14,17 @@ public class NetworkingAssert { @SuppressWarnings("DataFlowIssue") - public static void assertCompliance(@NonNull Networking x) { - assertThat(x.getNetworkingId()) - .containsPattern(SCREAMING_SNAKE_CASE); + public static void assertCompliance(@NonNull Networking networking) { + assertThat(networking.getNetworkingId()) + .containsPattern(SCREAMING_SNAKE_CASE) + .isNotBlank(); - assertThat(x.getNetworkingProperties()) + assertThat(networking.getNetworkingProperties()) .are(startingWith(NETWORKING_PROPERTY_PREFIX)) .doesNotHaveDuplicates(); assertThatNullPointerException() - .isThrownBy(() -> x.getNetwork(null, null, null)); + .isThrownBy(() -> networking.getNetwork(null, null, null)); SdmxWebSource validSource = SdmxWebSource .builder() @@ -32,7 +33,7 @@ public static void assertCompliance(@NonNull Networking x) { .endpointOf("http://localhost") .build(); - assertThat(x.getNetwork(validSource, null, null)) + assertThat(networking.getNetwork(validSource, null, null)) .isNotNull() .satisfies(NetworkAssert::assertCompliance); } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java index a40681ee7..21908ea60 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/SSLFactoryAssert.java @@ -8,11 +8,11 @@ @lombok.experimental.UtilityClass public class SSLFactoryAssert { - public static void assertCompliance(@NonNull SSLFactory x) { - assertThat(x.getSSLSocketFactory()) + public static void assertCompliance(@NonNull SSLFactory sslFactory) { + assertThat(sslFactory.getSSLSocketFactory()) .isNotNull(); - assertThat(x.getHostnameVerifier()) + assertThat(sslFactory.getHostnameVerifier()) .isNotNull(); } } diff --git a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java new file mode 100644 index 000000000..543ee236c --- /dev/null +++ b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java @@ -0,0 +1,27 @@ +package internal.sdmxdl.cli; + +import org.junit.jupiter.api.Test; +import sdmxdl.web.SdmxWebSource; +import tests.sdmxdl.web.spi.AuthenticatorAssert; + +import java.net.PasswordAuthentication; + +import static tests.sdmxdl.web.spi.AuthenticatorAssert.assertCompliance; + +public class ConstantAuthenticatorTest { + + @Test + public void testCompliance() { + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver("driver") + .endpointOf("http://localhost") + .build(); + + assertCompliance( + new ConstantAuthenticator(new PasswordAuthentication("userName", "password".toCharArray())), + AuthenticatorAssert.Sample.builder().source(validSource).build() + ); + } +} diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java index 3e8d3c6ab..90812e210 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/EurostatDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.EurostatDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class EurostatDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new EurostatDriver()); + DriverAssert.assertCompliance(new EurostatDriver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java index 542a46b74..33fe38b1b 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ImfDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.ImfDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class ImfDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new ImfDriver()); + DriverAssert.assertCompliance(new ImfDriver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java index e3d5e77b6..fdcee817d 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/InseeDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.InseeDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class InseeDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new InseeDriver()); + DriverAssert.assertCompliance(new InseeDriver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java index 31f5ca136..f985cb5a9 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/NbbDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.NbbDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class NbbDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new NbbDriver()); + DriverAssert.assertCompliance(new NbbDriver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java index 8ce84ee66..cd3fe7a2a 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/OecdDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.OecdDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class OecdDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new OecdDriver()); + DriverAssert.assertCompliance(new OecdDriver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java index 647fc7269..935a39d90 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java @@ -16,10 +16,9 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.Sdmx20Driver; import org.junit.jupiter.api.Test; import sdmxdl.web.SdmxWebSource; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import static org.assertj.core.api.Assertions.assertThatCode; import static sdmxdl.Languages.ANY; @@ -31,14 +30,14 @@ public class Sdmx20DriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new Sdmx20Driver()); + DriverAssert.assertCompliance(new Sdmx20Driver()); } @Test public void testConnect() { SdmxWebSource x = SdmxWebSource.builder().id("localhost").driver("connectors:sdmx20").endpointOf("http://localhost").build(); - assertThatCode(() -> new Sdmx20Driver().connect(x, ANY, WebDriverAssert.noOpWebContext()).close()) + assertThatCode(() -> new Sdmx20Driver().connect(x, ANY, DriverAssert.noOpWebContext()).close()) .doesNotThrowAnyException(); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java index 2b500a6e4..729fa3423 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx21DriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.Sdmx21Driver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class Sdmx21DriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new Sdmx21Driver()); + DriverAssert.assertCompliance(new Sdmx21Driver()); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java index 7fec4b01b..c58d10f26 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/UisDriverTest.java @@ -16,9 +16,8 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.drivers.UisDriver; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class UisDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new UisDriver()); + DriverAssert.assertCompliance(new UisDriver()); } } diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index f55e7de1d..600379351 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -1,8 +1,8 @@ import sdmxdl.provider.ri.file.readers.XmlReader; import sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; import sdmxdl.provider.ri.web.drivers.*; -import sdmxdl.provider.ri.web.monitors.UpptimeMonitoring; -import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitoring; +import sdmxdl.provider.ri.web.monitors.UpptimeMonitor; +import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitor; import sdmxdl.file.spi.Reader; import sdmxdl.provider.ri.web.networking.RiNetworking; import sdmxdl.web.spi.Authenticator; @@ -47,8 +47,8 @@ WinPasswordVaultAuthenticator; provides Monitor with - UpptimeMonitoring, - UptimeRobotMonitoring; + UpptimeMonitor, + UptimeRobotMonitor; provides Networking with RiNetworking; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java index e12b483c7..09b61cfce 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java @@ -1,12 +1,12 @@ package sdmxdl.provider.ri.web.monitors; -import sdmxdl.provider.ri.web.RiHttpUtils; import internal.util.http.HttpClient; import lombok.NonNull; import nbbrd.design.VisibleForTesting; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import sdmxdl.ext.Cache; +import sdmxdl.provider.ri.web.RiHttpUtils; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; @@ -22,7 +22,7 @@ import java.util.Locale; @ServiceProvider -public final class UpptimeMonitoring implements Monitor { +public final class UpptimeMonitor implements Monitor { @Override public @NonNull String getMonitorId() { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java index 5c20da793..88277eef2 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitoring.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java @@ -28,7 +28,7 @@ import java.nio.charset.StandardCharsets; @ServiceProvider -public final class UptimeRobotMonitoring implements Monitor { +public final class UptimeRobotMonitor implements Monitor { private final URL url = Parser.onURL().parseValue("https://api.uptimerobot.com/v2/getMonitors").orElseThrow(RuntimeException::new); @@ -48,7 +48,7 @@ public final class UptimeRobotMonitoring implements Monitor { UptimeRobotId id = UptimeRobotId.parse(source.getMonitor()); - Xml.Parser parser = Stax.StreamParser.valueOf(UptimeRobotMonitoring::parseReport); + Xml.Parser parser = Stax.StreamParser.valueOf(UptimeRobotMonitor::parseReport); return post(url, id.toBody(), parser::parseReader, context, source, getMonitorId()); } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java index 53bec2a9a..3549c2208 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java @@ -2,10 +2,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import sdmxdl.provider.ri.file.readers.XmlReader; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.XmlFileSource; -import tests.sdmxdl.file.FileReaderAssert; +import tests.sdmxdl.file.spi.ReaderAssert; import tests.sdmxdl.format.xml.SdmxXmlSources; import java.io.File; @@ -24,11 +23,11 @@ public void testCompliance(@TempDir Path temp) throws IOException { SdmxFileSource invalidSource = SdmxFileSource.builder().data(temp.resolve("invalid.csv").toFile()).build(); String invalidName = "invalid.csv"; - FileReaderAssert.assertCompliance( + ReaderAssert.assertCompliance( new XmlReader(), - FileReaderAssert.Sample + ReaderAssert.Sample .builder() - .context(FileReaderAssert.noOpFileContext()) + .context(ReaderAssert.noOpFileContext()) .validSource(validSource) .validName(validName) .invalidSource(invalidSource) diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java index 22c5a5169..aa7097b2b 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java @@ -5,10 +5,9 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.RiHttpUtils; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.net.*; import java.util.ArrayList; @@ -37,12 +36,12 @@ public void testFactory() { @Test public void testUserAgent() { - assertThat(RiHttpUtils.newContext(source, WebDriverAssert.noOpWebContext()).getUserAgent()) + assertThat(RiHttpUtils.newContext(source, DriverAssert.noOpWebContext()).getUserAgent()) .startsWith("sdmx-dl/"); String previous = System.setProperty(RiHttpUtils.HTTP_AGENT.getKey(), "hello world"); try { - assertThat(RiHttpUtils.newContext(source, WebDriverAssert.noOpWebContext()).getUserAgent()) + assertThat(RiHttpUtils.newContext(source, DriverAssert.noOpWebContext()).getUserAgent()) .startsWith("hello world"); } finally { if (previous != null) diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java index 48ed113fb..d63c3911a 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java @@ -17,13 +17,12 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.BbkDriver; import sdmxdl.DataQuery; import sdmxdl.DataStructureRef; import sdmxdl.DataflowRef; import sdmxdl.Key; import sdmxdl.provider.DataRef; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.net.MalformedURLException; import java.net.URL; @@ -39,7 +38,7 @@ public class BbkDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new BbkDriver()); + DriverAssert.assertCompliance(new BbkDriver()); } @Test diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java index 40d2ae684..512123e9f 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java @@ -17,8 +17,7 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.DotStatDriver2; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class DotStatDriver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new DotStatDriver2()); + DriverAssert.assertCompliance(new DotStatDriver2()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java index 0b3a84f1b..51200bb93 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java @@ -1,13 +1,12 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.EurostatDriver2; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; public class EurostatDriver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new EurostatDriver2()); + DriverAssert.assertCompliance(new EurostatDriver2()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java index 40bd7df12..c27fcae9e 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java @@ -17,8 +17,7 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.FileDriver; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; import java.net.URI; @@ -33,7 +32,7 @@ public class FileDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new FileDriver()); + DriverAssert.assertCompliance(new FileDriver()); } @Test diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java index 4fc5efbb0..9fe24c859 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java @@ -17,8 +17,7 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.ImfDriver2; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class ImfDriver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new ImfDriver2()); + DriverAssert.assertCompliance(new ImfDriver2()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java index d2ab9a9ef..f44893910 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java @@ -3,9 +3,8 @@ import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.InseeDriver2; import sdmxdl.format.time.*; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.time.Year; import java.time.YearMonth; @@ -20,7 +19,7 @@ public class InseeDriver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new InseeDriver2()); + DriverAssert.assertCompliance(new InseeDriver2()); } @Test diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java index e86240280..c1272ef00 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java @@ -21,11 +21,10 @@ import internal.util.http.HttpResponseException; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.NbbDriver2; import sdmxdl.*; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import javax.net.ssl.HttpsURLConnection; import java.io.IOException; @@ -44,7 +43,7 @@ public class NbbDriver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new NbbDriver2()); + DriverAssert.assertCompliance(new NbbDriver2()); } @Test diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java index 8e687863b..6dd2521db 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java @@ -1,12 +1,11 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.RngDriver; import sdmxdl.Connection; import sdmxdl.DataQuery; import sdmxdl.Dataflow; import sdmxdl.web.SdmxWebSource; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; @@ -16,7 +15,7 @@ public class RngDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new RngDriver()); + DriverAssert.assertCompliance(new RngDriver()); } public static void main(String[] args) throws IOException { @@ -24,7 +23,7 @@ public static void main(String[] args) throws IOException { for (SdmxWebSource source : x.getDefaultSources()) { System.out.println(source); - try (Connection conn = x.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection conn = x.connect(source, ANY, DriverAssert.noOpWebContext())) { for (Dataflow dataflow : conn.getFlows()) { System.out.println(dataflow); System.out.println(conn.getStructure(dataflow.getRef())); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java index a10a79bd2..be2077991 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java @@ -17,8 +17,7 @@ package sdmxdl.provider.ri.web.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.drivers.Sdmx21Driver2; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; /** * @author Philippe Charles @@ -27,6 +26,6 @@ public class Sdmx21Driver2Test { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new Sdmx21Driver2()); + DriverAssert.assertCompliance(new Sdmx21Driver2()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java index 45f1f0a82..8c1407ab0 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.io.TempDir; import sdmxdl.*; import sdmxdl.web.SdmxWebSource; -import tests.sdmxdl.web.WebDriverAssert; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.File; import java.io.IOException; @@ -30,14 +30,14 @@ public class StatCanDriverTest { @Test public void testCompliance() { - WebDriverAssert.assertCompliance(new StatCanDriver()); + DriverAssert.assertCompliance(new StatCanDriver()); } @Test public void testConnectionArgs() throws IOException { StatCanDriver driver = new StatCanDriver(); SdmxWebSource source = driver.getDefaultSources().iterator().next(); - try (Connection connection = driver.connect(source, ANY, WebDriverAssert.noOpWebContext())) { + try (Connection connection = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { DataflowRef badDataflowRef = DataflowRef.parse("F_10100001"); String msg = "Expecting DataflowRef id 'F_10100001' to match pattern 'DF_\\d+'"; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java new file mode 100644 index 000000000..50499d686 --- /dev/null +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java @@ -0,0 +1,25 @@ +package sdmxdl.provider.ri.web.monitors; + +import org.junit.jupiter.api.Test; +import sdmxdl.web.SdmxWebSource; +import tests.sdmxdl.web.spi.MonitorAssert; + +import static tests.sdmxdl.web.spi.MonitorAssert.assertCompliance; + +public class UpptimeMonitorTest { + + @Test + public void testCompliance() { + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver("driver") + .endpointOf("http://localhost") + .build(); + + assertCompliance( + new UpptimeMonitor(), + MonitorAssert.Sample.builder().validSource(validSource).build() + ); + } +} diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java index 663ecc5f4..50f61885b 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java @@ -12,7 +12,7 @@ public class UpptimeTest { @Test public void testGetReport() throws MalformedURLException { - assertThat(UpptimeMonitoring.getReport(new UpptimeSummary("ABS", "up", "100.00%", 4674))) + assertThat(UpptimeMonitor.getReport(new UpptimeSummary("ABS", "up", "100.00%", 4674))) .isEqualTo(MonitorReport .builder() .source("ABS") @@ -21,7 +21,7 @@ public void testGetReport() throws MalformedURLException { .averageResponseTime(4674L) .build()); - assertThat(UpptimeMonitoring.getReport(new UpptimeSummary("ILO", "down", "20.97%", 14989))) + assertThat(UpptimeMonitor.getReport(new UpptimeSummary("ILO", "down", "20.97%", 14989))) .isEqualTo(MonitorReport .builder() .source("ILO") @@ -30,7 +30,7 @@ public void testGetReport() throws MalformedURLException { .averageResponseTime(14989L) .build()); - assertThat(UpptimeMonitoring.getReport(new UpptimeSummary("ILO", "down", "X", -1))) + assertThat(UpptimeMonitor.getReport(new UpptimeSummary("ILO", "down", "X", -1))) .isEqualTo(MonitorReport .builder() .source("ILO") diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java new file mode 100644 index 000000000..ebe508194 --- /dev/null +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java @@ -0,0 +1,25 @@ +package sdmxdl.provider.ri.web.monitors; + +import org.junit.jupiter.api.Test; +import sdmxdl.web.SdmxWebSource; +import tests.sdmxdl.web.spi.MonitorAssert; + +import static tests.sdmxdl.web.spi.MonitorAssert.assertCompliance; + +public class UptimeRobotMonitorTest { + + @Test + public void testCompliance() { + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver("driver") + .endpointOf("http://localhost") + .build(); + + assertCompliance( + new UpptimeMonitor(), + MonitorAssert.Sample.builder().validSource(validSource).build() + ); + } +} diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java index 9b99b84e2..bdf3b4336 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java @@ -1,13 +1,14 @@ package sdmxdl.provider.ri.web.networking; import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.spi.NetworkingAssert; + +import static tests.sdmxdl.web.spi.NetworkingAssert.assertCompliance; public class RiNetworkingTest { @Test public void testCompliance() { - NetworkingAssert.assertCompliance(new RiNetworking()); + assertCompliance(new RiNetworking()); } } From 66790d3b9114f64a1d0e0a0afcf332bec1cf5bd9 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 25 Jul 2023 11:45:54 +0200 Subject: [PATCH 050/114] Change pattern of drivers properties --- CHANGELOG.md | 6 +++ docs/tmp/sources.csv | 38 +++++++++---------- .../tests/sdmxdl/web/spi/DriverAssert.java | 4 +- .../src/test/java/_test/FileSample.java | 5 ++- .../sdmxdl/cli/ListDriversCommandTest.java | 2 +- ...bProperties.java => DriverProperties.java} | 28 +++++++------- .../sdmxdl/provider/web/DriverSupport.java | 8 ++-- .../sdmxdl/provider/web/RestConnector.java | 2 +- .../provider/connectors/Connectors.java | 8 ++-- .../connectors/ConnectorsRestClient.java | 2 +- .../connectors/drivers/EurostatDriver.java | 2 +- .../connectors/drivers/ImfDriver.java | 2 +- .../connectors/drivers/InseeDriver.java | 2 +- .../connectors/drivers/NbbDriver.java | 2 +- .../connectors/drivers/OecdDriver.java | 2 +- .../connectors/drivers/Sdmx20Driver.java | 4 +- .../connectors/drivers/Sdmx21Driver.java | 12 +++--- .../provider/connectors/drivers/SeDriver.java | 2 +- .../connectors/drivers/UisDriver.java | 2 +- .../sdmxdl/provider/ri/web/RiHttpUtils.java | 6 +-- .../provider/ri/web/drivers/BbkDriver.java | 2 +- .../ri/web/drivers/DotStatDriver2.java | 2 +- .../ri/web/drivers/EurostatDriver2.java | 10 ++--- .../provider/ri/web/drivers/FileDriver.java | 10 ++--- .../provider/ri/web/drivers/ImfDriver2.java | 2 +- .../provider/ri/web/drivers/InseeDriver2.java | 2 +- .../provider/ri/web/drivers/NbbDriver2.java | 2 +- .../provider/ri/web/drivers/PxWebDriver.java | 6 +-- .../ri/web/drivers/Sdmx21Driver2.java | 18 ++++----- .../ri/web/drivers/StatCanDriver.java | 6 +-- 30 files changed, 106 insertions(+), 93 deletions(-) rename sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/{WebProperties.java => DriverProperties.java} (70%) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbb174a1c..f7d967270 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Added + +- ![PROVIDER] Add RI networking +- ![PROVIDER] Add support of environment variables + ### Fixed - ![PROVIDER] Fix file locking in cache @@ -19,6 +24,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Refactor listeners API [#506](https://github.com/nbbrd/sdmx-dl/issues/506) - ![API] Handle languages per connection instead of per manager [#507](https://github.com/nbbrd/sdmx-dl/issues/507) - ![API] Simplify naming and structure [#508](https://github.com/nbbrd/sdmx-dl/issues/508) +- ![API] Change pattern of drivers properties - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/docs/tmp/sources.csv b/docs/tmp/sources.csv index 69c28d079..0969810e7 100644 --- a/docs/tmp/sources.csv +++ b/docs/tmp/sources.csv @@ -1,34 +1,34 @@ Name,Description,Aliases,Driver,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages -ABS,Australian Bureau of Statistics,,ri:sdmx21,https://api.data.abs.gov.au,detailSupported=true,https://explore.data.abs.gov.au,upptime:/nbbrd/sdmx-upptime/ABS,https://nbbrd.github.io/sdmx-upptime/history/abs,en +ABS,Australian Bureau of Statistics,,ri:sdmx21,https://api.data.abs.gov.au,sdmxdl.driver.detailSupported=true,https://explore.data.abs.gov.au,upptime:/nbbrd/sdmx-upptime/ABS,https://nbbrd.github.io/sdmx-upptime/history/abs,en BBK,Deutsche Bundesbank,,ri:bbk,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" -BIS,Bank for International Settlements,,ri:sdmx21,https://stats.bis.org/api/v1,detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en +BIS,Bank for International Settlements,,ri:sdmx21,https://stats.bis.org/api/v1,sdmxdl.driver.detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en CAMSTAT,National Institute of Statistics of Cambodia,,ri:sdmx21,https://nsiws-stable-camstat-live.officialstatistics.org/rest,,http://camstat.nis.gov.kh/?locale=en&start=0,upptime:/nbbrd/sdmx-upptime/CAMSTAT,https://nbbrd.github.io/sdmx-upptime/history/camstat,"en,km" -ECB,European Central Bank,,ri:sdmx21,https://data-api.ecb.europa.eu/service,detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en +ECB,European Central Bank,,ri:sdmx21,https://data-api.ecb.europa.eu/service,sdmxdl.driver.detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en EC_DG_COMP,European Commission - Directorate General for Competition,,ri:estat,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,ri:estat,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,ri:estat,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en -ESCAP,Economic and Social Commission for Asia and the Pacific,,ri:sdmx21,https://api-dataexplorer.unescap.org/rest,detailSupported=true,https://dataexplorer.unescap.org/,upptime:/nbbrd/sdmx-upptime/ESCAP,https://nbbrd.github.io/sdmx-upptime/history/escap,en +ESCAP,Economic and Social Commission for Asia and the Pacific,,ri:sdmx21,https://api-dataexplorer.unescap.org/rest,sdmxdl.driver.detailSupported=true,https://dataexplorer.unescap.org/,upptime:/nbbrd/sdmx-upptime/ESCAP,https://nbbrd.github.io/sdmx-upptime/history/escap,en ESTAT,Eurostat,EUROSTAT,ri:estat,https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/data/database,upptime:/nbbrd/sdmx-upptime/ESTAT,https://nbbrd.github.io/sdmx-upptime/history/estat,"en,de,fr" ESTAT_COMEXT,Eurostat - International trade in goods statistics (ITGS),,ri:estat,https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview,upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT,https://nbbrd.github.io/sdmx-upptime/history/estat_comext,en -ILO,International Labour Organization,,ri:sdmx21,https://www.ilo.org/sdmx/rest,detailSupported=true,https://ilostat.ilo.org/data/,upptime:/nbbrd/sdmx-upptime/ILO,https://nbbrd.github.io/sdmx-upptime/history/ilo,"en,es,fr" +ILO,International Labour Organization,,ri:sdmx21,https://www.ilo.org/sdmx/rest,sdmxdl.driver.detailSupported=true,https://ilostat.ilo.org/data/,upptime:/nbbrd/sdmx-upptime/ILO,https://nbbrd.github.io/sdmx-upptime/history/ilo,"en,es,fr" IMF,International Monetary Fund,,ri:imf,http://dataservices.imf.org/REST/SDMX_XML.svc,,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF,https://nbbrd.github.io/sdmx-upptime/history/imf,en -IMF_SDMX_CENTRAL,International Monetary Fund (SDMX Central),,ri:sdmx21,https://sdmxcentral.imf.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL,https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central,"en,fr" -INEGI,"National Institute of Statistics, Geography and Informatics",,ri:sdmx21,https://sdmx.snieg.mx/service/Rest,"detailSupported=true,trailingSlashRequired=true",https://sdmx.snieg.mx,upptime:/nbbrd/sdmx-upptime/INEGI,https://nbbrd.github.io/sdmx-upptime/history/inegi,"en,es" +IMF_SDMX_CENTRAL,International Monetary Fund (SDMX Central),,ri:sdmx21,https://sdmxcentral.imf.org/ws/public/sdmxapi/rest,sdmxdl.driver.detailSupported=true,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL,https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central,"en,fr" +INEGI,"National Institute of Statistics, Geography and Informatics",,ri:sdmx21,https://sdmx.snieg.mx/service/Rest,"sdmxdl.driver.detailSupported=true,sdmxdl.driver.trailingSlash=true",https://sdmx.snieg.mx,upptime:/nbbrd/sdmx-upptime/INEGI,https://nbbrd.github.io/sdmx-upptime/history/inegi,"en,es" INSEE,National Institute of Statistics and Economic Studies,,ri:insee,https://bdm.insee.fr/series/sdmx,,https://www.insee.fr/fr/statistiques,upptime:/nbbrd/sdmx-upptime/INSEE,https://nbbrd.github.io/sdmx-upptime/history/insee,"en,fr" -ISTAT,Italian National Institute of Statistics,,ri:sdmx21,https://esploradati.istat.it/SDMXWS/rest,detailSupported=true,https://esploradati.istat.it/databrowser/,upptime:/nbbrd/sdmx-upptime/ISTAT,https://nbbrd.github.io/sdmx-upptime/history/istat,"en,it" -NB,Norges Bank,,ri:sdmx21,https://data.norges-bank.no/api,detailSupported=true,https://www.norges-bank.no/en/topics/Statistics/,upptime:/nbbrd/sdmx-upptime/NB,https://nbbrd.github.io/sdmx-upptime/history/nb,"en,no" +ISTAT,Italian National Institute of Statistics,,ri:sdmx21,https://esploradati.istat.it/SDMXWS/rest,sdmxdl.driver.detailSupported=true,https://esploradati.istat.it/databrowser/,upptime:/nbbrd/sdmx-upptime/ISTAT,https://nbbrd.github.io/sdmx-upptime/history/istat,"en,it" +NB,Norges Bank,,ri:sdmx21,https://data.norges-bank.no/api,sdmxdl.driver.detailSupported=true,https://www.norges-bank.no/en/topics/Statistics/,upptime:/nbbrd/sdmx-upptime/NB,https://nbbrd.github.io/sdmx-upptime/history/nb,"en,no" NBB,National Bank of Belgium,,ri:nbb,https://stat.nbb.be/restsdmx/sdmx.ashx,,https://stat.nbb.be,upptime:/nbbrd/sdmx-upptime/NBB,https://nbbrd.github.io/sdmx-upptime/history/nbb,"en,de,fr,nl" OECD,The Organisation for Economic Co-operation and Development,,ri:dotstat,https://stats.oecd.org/restsdmx/sdmx.ashx,,https://stats.oecd.org,upptime:/nbbrd/sdmx-upptime/OECD,https://nbbrd.github.io/sdmx-upptime/history/oecd,"en,es,fr,it" SE,Statistics Estonia,,ri:dotstat,http://andmebaas.stat.ee/restsdmx/sdmx.ashx,,http://andmebaas.stat.ee,upptime:/nbbrd/sdmx-upptime/SE,https://nbbrd.github.io/sdmx-upptime/history/se,"en,et" -SGR,SDMX Global Registry,,ri:sdmx21,https://registry.sdmx.org/ws/rest,detailSupported=true,https://registry.sdmx.org/overview.html,upptime:/nbbrd/sdmx-upptime/SGR,https://nbbrd.github.io/sdmx-upptime/history/sgr,en -SIMEL,El Salvador Labor Market Information System,,ri:sdmx21,https://disseminatesimel.mtps.gob.sv/rest,detailSupported=true,https://datasimel.mtps.gob.sv/,upptime:/nbbrd/sdmx-upptime/SIMEL,https://nbbrd.github.io/sdmx-upptime/history/simel,"en,es" -SPC,Pacific Data Hub,,ri:sdmx21,https://stats-nsi-stable.pacificdata.org/rest,detailSupported=true,https://stats.pacificdata.org/?locale=en,upptime:/nbbrd/sdmx-upptime/SPC,https://nbbrd.github.io/sdmx-upptime/history/spc,"en,fr" -STATCAN,Statistics Canada,,ri:statcan,https://www150.statcan.gc.ca/t1/wds/rest,cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" -STATEC,National Institute of statistics and economic studies of the Grand Duchy of Luxembourg,,ri:sdmx21,https://lustat.statec.lu/rest,detailSupported=true,https://lustat.statec.lu,upptime:/nbbrd/sdmx-upptime/STATEC,https://nbbrd.github.io/sdmx-upptime/history/statec,"en,fr" -TNSO,National Statistical Office of Thailand,,ri:sdmx21,https://ns1-oshub.nso.go.th/rest,detailSupported=true,https://oshub.nso.go.th/?lc=en,upptime:/nbbrd/sdmx-upptime/TNSO,https://nbbrd.github.io/sdmx-upptime/history/tnso,"en,th" +SGR,SDMX Global Registry,,ri:sdmx21,https://registry.sdmx.org/ws/rest,sdmxdl.driver.detailSupported=true,https://registry.sdmx.org/overview.html,upptime:/nbbrd/sdmx-upptime/SGR,https://nbbrd.github.io/sdmx-upptime/history/sgr,en +SIMEL,El Salvador Labor Market Information System,,ri:sdmx21,https://disseminatesimel.mtps.gob.sv/rest,sdmxdl.driver.detailSupported=true,https://datasimel.mtps.gob.sv/,upptime:/nbbrd/sdmx-upptime/SIMEL,https://nbbrd.github.io/sdmx-upptime/history/simel,"en,es" +SPC,Pacific Data Hub,,ri:sdmx21,https://stats-nsi-stable.pacificdata.org/rest,sdmxdl.driver.detailSupported=true,https://stats.pacificdata.org/?locale=en,upptime:/nbbrd/sdmx-upptime/SPC,https://nbbrd.github.io/sdmx-upptime/history/spc,"en,fr" +STATCAN,Statistics Canada,,ri:statcan,https://www150.statcan.gc.ca/t1/wds/rest,sdmxdl.driver.cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" +STATEC,National Institute of statistics and economic studies of the Grand Duchy of Luxembourg,,ri:sdmx21,https://lustat.statec.lu/rest,sdmxdl.driver.detailSupported=true,https://lustat.statec.lu,upptime:/nbbrd/sdmx-upptime/STATEC,https://nbbrd.github.io/sdmx-upptime/history/statec,"en,fr" +TNSO,National Statistical Office of Thailand,,ri:sdmx21,https://ns1-oshub.nso.go.th/rest,sdmxdl.driver.detailSupported=true,https://oshub.nso.go.th/?lc=en,upptime:/nbbrd/sdmx-upptime/TNSO,https://nbbrd.github.io/sdmx-upptime/history/tnso,"en,th" UIS,Unesco Institute for Statistics,,ri:dotstat,http://data.uis.unesco.org/RestSDMX/sdmx.ashx,,http://data.uis.unesco.org,upptime:/nbbrd/sdmx-upptime/UIS,https://nbbrd.github.io/sdmx-upptime/history/uis,"en,fr" UKDS,UK Data Service,,ri:dotstat,https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx,,https://stats2.digitalresources.jisc.ac.uk/,upptime:/nbbrd/sdmx-upptime/UKDS,https://nbbrd.github.io/sdmx-upptime/history/ukds,en -UNDATA,Data access system to UN databases,,ri:sdmx21,https://data.un.org/WS/rest,detailSupported=true,https://data.un.org/SdmxBrowser/start,upptime:/nbbrd/sdmx-upptime/UNDATA,https://nbbrd.github.io/sdmx-upptime/history/undata,en -UNICEF,UN International Children's Emergency Fund,,ri:sdmx21,https://sdmx.data.unicef.org/ws/public/sdmxapi/rest,detailSupported=true,https://data.unicef.org/,upptime:/nbbrd/sdmx-upptime/UNICEF,https://nbbrd.github.io/sdmx-upptime/history/unicef,en -WB,World Bank,,ri:sdmx21,https://api.worldbank.org/v2/sdmx/rest,"detailSupported=true,trailingSlashRequired=true",https://data.worldbank.org,upptime:/nbbrd/sdmx-upptime/WB,https://nbbrd.github.io/sdmx-upptime/history/wb,"en,es,fr" -WITS,World Integrated Trade Solution,,ri:sdmx21,http://wits.worldbank.org/API/V1/SDMX/V21/rest,trailingSlashRequired=true,https://wits.worldbank.org,upptime:/nbbrd/sdmx-upptime/WITS,https://nbbrd.github.io/sdmx-upptime/history/wits,"en,es" +UNDATA,Data access system to UN databases,,ri:sdmx21,https://data.un.org/WS/rest,sdmxdl.driver.detailSupported=true,https://data.un.org/SdmxBrowser/start,upptime:/nbbrd/sdmx-upptime/UNDATA,https://nbbrd.github.io/sdmx-upptime/history/undata,en +UNICEF,UN International Children's Emergency Fund,,ri:sdmx21,https://sdmx.data.unicef.org/ws/public/sdmxapi/rest,sdmxdl.driver.detailSupported=true,https://data.unicef.org/,upptime:/nbbrd/sdmx-upptime/UNICEF,https://nbbrd.github.io/sdmx-upptime/history/unicef,en +WB,World Bank,,ri:sdmx21,https://api.worldbank.org/v2/sdmx/rest,"sdmxdl.driver.detailSupported=true,sdmxdl.driver.trailingSlash=true",https://data.worldbank.org,upptime:/nbbrd/sdmx-upptime/WB,https://nbbrd.github.io/sdmx-upptime/history/wb,"en,es,fr" +WITS,World Integrated Trade Solution,,ri:sdmx21,http://wits.worldbank.org/API/V1/SDMX/V21/rest,sdmxdl.driver.trailingSlash=true,https://wits.worldbank.org,upptime:/nbbrd/sdmx-upptime/WITS,https://nbbrd.github.io/sdmx-upptime/history/wits,"en,es" diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java index 3ba02a34a..5fff616ad 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java @@ -7,6 +7,8 @@ import static org.assertj.core.api.Assertions.*; import static sdmxdl.Languages.ANY; +import static sdmxdl.web.spi.Driver.DRIVER_PROPERTY_PREFIX; +import static tests.sdmxdl.api.TckUtil.startingWith; @lombok.experimental.UtilityClass public class DriverAssert { @@ -22,7 +24,7 @@ public void assertCompliance(@NonNull Driver driver) { .isNotBlank(); assertThat(driver.getDriverProperties()) -// .are(startingWith(DRIVER_PROPERTY_PREFIX)) + .are(startingWith(DRIVER_PROPERTY_PREFIX)) .doesNotHaveDuplicates(); SdmxWebSource validSource = SdmxWebSource diff --git a/sdmx-dl-cli/src/test/java/_test/FileSample.java b/sdmx-dl-cli/src/test/java/_test/FileSample.java index e464e6c21..0e81ae316 100644 --- a/sdmx-dl-cli/src/test/java/_test/FileSample.java +++ b/sdmx-dl-cli/src/test/java/_test/FileSample.java @@ -1,5 +1,6 @@ package _test; +import sdmxdl.provider.ri.web.drivers.FileDriver; import sdmxdl.web.SdmxWebSource; import sdmxdl.format.xml.XmlWebSource; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -33,13 +34,13 @@ public static File create(Path temp) throws IOException { return source; } - private static SdmxWebSource sourceOf(String name, File data, File struct) throws MalformedURLException { + private static SdmxWebSource sourceOf(String name, File data, File struct) { return SdmxWebSource .builder() .id(name) .driver("ri:file") .endpoint(data.toURI()) - .property("structureURL", struct.toURI().toURL().toString()) + .propertyOf(FileDriver.STRUCTURE_URI_PROPERTY, struct.toURI()) .build(); } } diff --git a/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListDriversCommandTest.java b/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListDriversCommandTest.java index fcac57890..5be3846d5 100644 --- a/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListDriversCommandTest.java +++ b/sdmx-dl-cli/src/test/java/sdmxdl/cli/ListDriversCommandTest.java @@ -46,7 +46,7 @@ public void testContent(@TempDir Path temp) throws IOException { assertThat(FileSample.readAll(out)) .contains("Name,SupportedProperties", atIndex(0)) - .contains("ri:file,structureURL") + .contains("ri:file,sdmxdl.driver.structureURI") .hasSizeGreaterThan(2); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebProperties.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverProperties.java similarity index 70% rename from sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebProperties.java rename to sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverProperties.java index 81884c033..25bf5f7a7 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebProperties.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverProperties.java @@ -22,27 +22,29 @@ import java.util.concurrent.TimeUnit; +import static sdmxdl.web.spi.Driver.DRIVER_PROPERTY_PREFIX; + /** * @author Philippe Charles */ @lombok.experimental.UtilityClass -public class WebProperties { - +public class DriverProperties { + /** - * Defines the timeout value (in milliseconds) to be used when opening an + * Defines the timeout value (in milliseconds) to be used when opening a * URL connection. A timeout of zero is interpreted as an infinite timeout. * Default value is 2 minutes. */ public static final IntProperty CONNECT_TIMEOUT_PROPERTY = - IntProperty.of("connectTimeout", (int) TimeUnit.MINUTES.toMillis(2)); + IntProperty.of(DRIVER_PROPERTY_PREFIX + ".connectTimeout", (int) TimeUnit.MINUTES.toMillis(2)); /** * Defines the timeout value (in milliseconds) to be used when reading an - * input stream from an URL connection. A timeout of zero is interpreted as + * input stream from a URL connection. A timeout of zero is interpreted as * an infinite timeout. Default value is 2 minutes. */ public static final IntProperty READ_TIMEOUT_PROPERTY = - IntProperty.of("readTimeout", (int) TimeUnit.MINUTES.toMillis(2)); + IntProperty.of(DRIVER_PROPERTY_PREFIX + ".readTimeout", (int) TimeUnit.MINUTES.toMillis(2)); /** * Defines the duration (in milliseconds) of response storage in the cache. @@ -50,30 +52,30 @@ public class WebProperties { * is 5 minutes. */ public static final LongProperty CACHE_TTL_PROPERTY = - LongProperty.of("cacheTtl", TimeUnit.MINUTES.toMillis(5)); + LongProperty.of(DRIVER_PROPERTY_PREFIX + ".cacheTtl", TimeUnit.MINUTES.toMillis(5)); /** * Defines the max number of redirects to be followed by HTTP client. This * limit is intended to prevent infinite loop. Default value is 5. */ public static final IntProperty MAX_REDIRECTS_PROPERTY = - IntProperty.of("maxRedirects", 5); + IntProperty.of(DRIVER_PROPERTY_PREFIX + ".maxRedirects", 5); /** * Defines if detail query is supported. Default value is false. */ public static final BooleanProperty DETAIL_SUPPORTED_PROPERTY = - BooleanProperty.of("detailSupported", false); + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".detailSupported", false); /** * Defines if trailing slash is required in queries. Default value is false. */ - public static final BooleanProperty TRAILING_SLASH_REQUIRED_PROPERTY = - BooleanProperty.of("trailingSlashRequired", false); + public static final BooleanProperty TRAILING_SLASH_PROPERTY = + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".trailingSlash", false); /** * Defines if preemptive authentication should be used. Default value is false. */ - public static final BooleanProperty PREEMPTIVE_AUTHENTICATION_PROPERTY = - BooleanProperty.of("preemptiveAuthentication", false); + public static final BooleanProperty PREEMPTIVE_AUTH_PROPERTY = + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".preemptiveAuth", false); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java index 074d6efb9..92b911430 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java @@ -51,7 +51,7 @@ public final class DriverSupport implements Driver { private final Collection sources; @lombok.Singular - private final Collection supportedProperties; + private final Collection properties; @lombok.NonNull @lombok.Builder.Default @@ -89,14 +89,14 @@ public boolean isDriverAvailable() { @Override public @NonNull Collection getDriverProperties() { - return supportedProperties; + return properties; } public static final class Builder { @NonNull - public Builder supportedPropertyOf(@NonNull CharSequence property) { - return supportedProperty(property.toString()); + public Builder propertyOf(@NonNull CharSequence property) { + return property(property.toString()); } } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index ddfae27a7..fad4e6ee1 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -10,7 +10,7 @@ import java.io.IOException; -import static sdmxdl.provider.web.WebProperties.CACHE_TTL_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; @lombok.Builder public final class RestConnector implements WebConnector { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java index 4bed39dbe..2cb04ffe1 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java @@ -30,6 +30,8 @@ import java.util.Locale; import java.util.stream.Collectors; +import static sdmxdl.web.spi.Driver.DRIVER_PROPERTY_PREFIX; + /** * @author Philippe Charles */ @@ -169,11 +171,11 @@ public boolean isNoResultMatchingQuery(SdmxException ex) { } public static final BooleanProperty SUPPORTS_COMPRESSION_PROPERTY = - BooleanProperty.of("supportsCompression", false); + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".supportsCompression", false); public static final BooleanProperty NEEDS_CREDENTIALS_PROPERTY = - BooleanProperty.of("needsCredentials", false); + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".needsCredentials", false); public static final BooleanProperty NEEDS_URL_ENCODING_PROPERTY = - BooleanProperty.of("needsURLEncoding", false); + BooleanProperty.of(DRIVER_PROPERTY_PREFIX + ".needsURLEncoding", false); } diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java index c22963d5f..fb79232f5 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java @@ -49,7 +49,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static sdmxdl.provider.web.WebProperties.*; +import static sdmxdl.provider.web.DriverProperties.*; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java index 984db845c..224e4300b 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -40,7 +40,7 @@ public final class EurostatDriver implements Driver { .id(CONNECTORS_EUROSTAT) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(EUROSTAT::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .properties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("ESTAT") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java index 0d42b9aeb..174967bf7 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -40,7 +40,7 @@ public final class ImfDriver implements Driver { .id(CONNECTORS_IMF) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(IMF2::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .properties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("IMF") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java index de8776ac9..0a734469d 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -59,7 +59,7 @@ public final class InseeDriver implements Driver { .id(CONNECTORS_INSEE) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(InseeClient::new, OBS_FACTORY))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .properties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("INSEE") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java index e40c363d2..53e400d83 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -40,7 +40,7 @@ public final class NbbDriver implements Driver { .id(CONNECTORS_NBB) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(NBB::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .properties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("NBB") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java index d417bfa64..4c1c64220 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -40,7 +40,7 @@ public final class OecdDriver implements Driver { .id(CONNECTORS_OECD) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(OECD::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) + .properties(CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("OECD") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java index 74174769c..756a4a47a 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java @@ -43,8 +43,8 @@ public final class Sdmx20Driver implements Driver { .id(CONNECTORS_SDMX_20) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(Sdmx20Client::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .supportedPropertyOf(NEEDS_CREDENTIALS_PROPERTY) + .properties(CONNECTORS_CONNECTION_PROPERTIES) + .propertyOf(NEEDS_CREDENTIALS_PROPERTY) .build(); private static final class Sdmx20Client extends RestSdmx20Client { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 9bad7fa26..046d66391 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -30,7 +30,7 @@ import static sdmxdl.provider.connectors.Connectors.*; import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; -import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.DETAIL_SUPPORTED_PROPERTY; /** * @author Philippe Charles @@ -46,11 +46,11 @@ public final class Sdmx21Driver implements Driver { .id(CONNECTORS_SDMX_21) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(Sdmx21Client::new))) - .supportedProperties(CONNECTORS_CONNECTION_PROPERTIES) - .supportedPropertyOf(NEEDS_CREDENTIALS_PROPERTY) - .supportedPropertyOf(NEEDS_URL_ENCODING_PROPERTY) - .supportedPropertyOf(SUPPORTS_COMPRESSION_PROPERTY) - .supportedPropertyOf(DETAIL_SUPPORTED_PROPERTY) + .properties(CONNECTORS_CONNECTION_PROPERTIES) + .propertyOf(NEEDS_CREDENTIALS_PROPERTY) + .propertyOf(NEEDS_URL_ENCODING_PROPERTY) + .propertyOf(SUPPORTS_COMPRESSION_PROPERTY) + .propertyOf(DETAIL_SUPPORTED_PROPERTY) .source(SdmxWebSource .builder() .id("ABS") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java index 971ada01b..e3765b632 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -41,7 +41,7 @@ public final class SeDriver implements Driver { .id(CONNECTORS_SE) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(SeClient::new))) - .supportedProperties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) + .properties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("SE") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java index 1fbc4a09f..cab0dc5d0 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -44,7 +44,7 @@ public final class UisDriver implements Driver { .id(CONNECTORS_UIS) .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(UIS2::new))) - .supportedProperties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) + .properties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("UIS") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java index 2c9beca28..5d3e3dadf 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java @@ -46,7 +46,7 @@ import java.util.function.Consumer; import java.util.function.Supplier; -import static sdmxdl.provider.web.WebProperties.*; +import static sdmxdl.provider.web.DriverProperties.*; /** * @author Philippe Charles @@ -58,7 +58,7 @@ public class RiHttpUtils { CONNECT_TIMEOUT_PROPERTY, READ_TIMEOUT_PROPERTY, MAX_REDIRECTS_PROPERTY, - PREEMPTIVE_AUTHENTICATION_PROPERTY + PREEMPTIVE_AUTH_PROPERTY ); // TODO: document these options? @@ -100,7 +100,7 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl .readTimeout(READ_TIMEOUT_PROPERTY.get(source.getProperties())) .connectTimeout(CONNECT_TIMEOUT_PROPERTY.get(source.getProperties())) .maxRedirects(MAX_REDIRECTS_PROPERTY.get(source.getProperties())) - .preemptiveAuthentication(PREEMPTIVE_AUTHENTICATION_PROPERTY.get(source.getProperties())) + .preemptiveAuthentication(PREEMPTIVE_AUTH_PROPERTY.get(source.getProperties())) .proxySelector(network::getProxySelector) .sslSocketFactory(() -> network.getSSLFactory().getSSLSocketFactory()) .hostnameVerifier(() -> network.getSSLFactory().getHostnameVerifier()) diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java index 9f3dd42f7..3b5e41cff 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java @@ -52,7 +52,7 @@ public final class BbkDriver implements Driver { .id(RI_BBK) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(BbkDriver::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) + .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("BBK") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java index ff332ed3b..9f6383bf5 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java @@ -52,7 +52,7 @@ public final class DotStatDriver2 implements Driver { .id(RI_DOTSTAT) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(DotStatDriver2::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) + .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("OECD") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java index 5d12a2c5c..168183cec 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java @@ -68,10 +68,10 @@ public final class EurostatDriver2 implements Driver { public static final IntProperty ASYNC_MAX_RETRIES_PROPERTY = - IntProperty.of("asyncMaxRetries", 10); + IntProperty.of(DRIVER_PROPERTY_PREFIX + ".asyncMaxRetries", 10); public static final LongProperty ASYNC_SLEEP_TIME_PROPERTY = - LongProperty.of("asyncSleepTime", 6000); + LongProperty.of(DRIVER_PROPERTY_PREFIX + ".asyncSleepTime", 6000); private static final String RI_EUROSTAT = "ri:estat"; @@ -81,9 +81,9 @@ public final class EurostatDriver2 implements Driver { .id(RI_EUROSTAT) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(EurostatDriver2::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) - .supportedPropertyOf(ASYNC_MAX_RETRIES_PROPERTY) - .supportedPropertyOf(ASYNC_SLEEP_TIME_PROPERTY) + .properties(RI_CONNECTION_PROPERTIES) + .propertyOf(ASYNC_MAX_RETRIES_PROPERTY) + .propertyOf(ASYNC_SLEEP_TIME_PROPERTY) .source(SdmxWebSource .builder() .id("ESTAT") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java index 5828f5478..23995044d 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java @@ -28,6 +28,9 @@ @ServiceProvider public final class FileDriver implements Driver { + public static final Property STRUCTURE_URI_PROPERTY + = Property.of(DRIVER_PROPERTY_PREFIX + ".structureURI", null, Parser.onURI(), Formatter.onURI()); + private static final String RI_FILE = "ri:file"; private static final BooleanProperty ENABLE = @@ -40,7 +43,7 @@ public final class FileDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(this::newConnection) - .supportedPropertyOf(STRUCTURE_PROPERTY) + .propertyOf(STRUCTURE_URI_PROPERTY) .build(); private final SdmxFileManager fileManager = SdmxFileManager.ofServiceLoader(); @@ -111,7 +114,7 @@ private static SdmxFileSource toFileSource(SdmxWebSource source) throws IOExcept return SdmxFileSource .builder() .data(toFile(source.getEndpoint())) - .structure(toFile(STRUCTURE_PROPERTY.get(source.getProperties()))) + .structure(toFile(STRUCTURE_URI_PROPERTY.get(source.getProperties()))) .build(); } @@ -126,7 +129,4 @@ static File toFile(URI endpoint) throws IOException { } return null; } - - private static final Property STRUCTURE_PROPERTY = - Property.of("structureURL", null, Parser.onURI(), Formatter.onURI()); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java index 35dd97514..2fd8daf58 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java @@ -61,7 +61,7 @@ public final class ImfDriver2 implements Driver { .id(RI_IMF) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(ImfDriver2::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) + .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("IMF") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java index 3a20af2c4..e3b2bba63 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java @@ -62,7 +62,7 @@ public final class InseeDriver2 implements Driver { .id(RI_INSEE) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(InseeRestClient::new)) - .supportedProperties(RI_CONNECTION_PROPERTIES) + .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("INSEE") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java index 8f8cc2460..739375dcc 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java @@ -63,7 +63,7 @@ public final class NbbDriver2 implements Driver { .id(RI_NBB) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(NbbDriver2::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) + .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("NBB") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java index bc5a90632..2c3cb0e7d 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java @@ -48,7 +48,7 @@ import static internal.util.gson.GsonUtil.asStream; import static internal.util.gson.GsonUtil.getAsString; import static java.util.stream.Collectors.toList; -import static sdmxdl.provider.web.WebProperties.CACHE_TTL_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; @ServiceProvider public final class PxWebDriver implements Driver { @@ -65,8 +65,8 @@ public final class PxWebDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(PxWebDriver::newConnection) - .supportedProperties(RI_CONNECTION_PROPERTIES) - .supportedPropertyOf(CACHE_TTL_PROPERTY) + .properties(RI_CONNECTION_PROPERTIES) + .propertyOf(CACHE_TTL_PROPERTY) .source(SdmxWebSource .builder() .id("STATFIN") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java index e4246672f..1e2e030b7 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java @@ -34,8 +34,8 @@ import java.util.Set; import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.provider.web.WebProperties.DETAIL_SUPPORTED_PROPERTY; -import static sdmxdl.provider.web.WebProperties.TRAILING_SLASH_REQUIRED_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.DETAIL_SUPPORTED_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.TRAILING_SLASH_PROPERTY; /** * @author Philippe Charles @@ -51,9 +51,9 @@ public final class Sdmx21Driver2 implements Driver { .id(RI_SDMX_21) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(Sdmx21Driver2::newClient)) - .supportedProperties(RI_CONNECTION_PROPERTIES) - .supportedPropertyOf(DETAIL_SUPPORTED_PROPERTY) - .supportedPropertyOf(TRAILING_SLASH_REQUIRED_PROPERTY) + .properties(RI_CONNECTION_PROPERTIES) + .propertyOf(DETAIL_SUPPORTED_PROPERTY) + .propertyOf(TRAILING_SLASH_PROPERTY) .source(SdmxWebSource .builder() .id("ABS") @@ -142,7 +142,7 @@ public final class Sdmx21Driver2 implements Driver { .driver(RI_SDMX_21) .endpointOf("https://sdmx.snieg.mx/service/Rest") .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) - .propertyOf(TRAILING_SLASH_REQUIRED_PROPERTY, true) + .propertyOf(TRAILING_SLASH_PROPERTY, true) .websiteOf("https://sdmx.snieg.mx") .monitorOf("upptime:/nbbrd/sdmx-upptime/INEGI") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/inegi") @@ -261,7 +261,7 @@ public final class Sdmx21Driver2 implements Driver { .driver(RI_SDMX_21) .endpointOf("https://api.worldbank.org/v2/sdmx/rest") .propertyOf(DETAIL_SUPPORTED_PROPERTY, true) - .propertyOf(TRAILING_SLASH_REQUIRED_PROPERTY, true) + .propertyOf(TRAILING_SLASH_PROPERTY, true) .websiteOf("https://data.worldbank.org") .monitorOf("upptime:/nbbrd/sdmx-upptime/WB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/wb") @@ -273,7 +273,7 @@ public final class Sdmx21Driver2 implements Driver { .name("es", "Solución Comercial Integrada Mundial") .driver(RI_SDMX_21) .endpointOf("http://wits.worldbank.org/API/V1/SDMX/V21/rest") - .propertyOf(TRAILING_SLASH_REQUIRED_PROPERTY, true) + .propertyOf(TRAILING_SLASH_PROPERTY, true) .websiteOf("https://wits.worldbank.org") .monitorOf("upptime:/nbbrd/sdmx-upptime/WITS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/wits") @@ -287,7 +287,7 @@ private static RestClient newClient(SdmxWebSource s, Languages languages, WebCon private static Sdmx21RestQueries getQueries(SdmxWebSource s) { return Sdmx21RestQueries .builder() - .trailingSlashRequired(TRAILING_SLASH_REQUIRED_PROPERTY.get(s.getProperties())) + .trailingSlashRequired(TRAILING_SLASH_PROPERTY.get(s.getProperties())) .build(); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java index e0f564438..cfea91be9 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java @@ -48,7 +48,7 @@ import static java.util.regex.Pattern.compile; import static java.util.stream.Collectors.toMap; import static sdmxdl.DataSet.toDataSet; -import static sdmxdl.provider.web.WebProperties.CACHE_TTL_PROPERTY; +import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; import static sdmxdl.provider.web.WebValidators.dataflowRefOf; @ServiceProvider @@ -62,8 +62,8 @@ public final class StatCanDriver implements Driver { .id(RI_STATCAN) .rank(NATIVE_DRIVER_RANK) .connector(StatCanDriver::newConnection) - .supportedProperties(RI_CONNECTION_PROPERTIES) - .supportedPropertyOf(CACHE_TTL_PROPERTY) + .properties(RI_CONNECTION_PROPERTIES) + .propertyOf(CACHE_TTL_PROPERTY) .source(SdmxWebSource .builder() .id("STATCAN") From ae83fc13bfe037dc9d11e5cfec94bbcca1af2dd7 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 25 Jul 2023 13:20:29 +0200 Subject: [PATCH 051/114] Fix check of web sources properties --- CHANGELOG.md | 5 +++-- sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7d967270..83604257f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added -- ![PROVIDER] Add RI networking -- ![PROVIDER] Add support of environment variables +- ![PROVIDER] Allow networking configuration by environment variables +- ![PROVIDER] Allow networking configuration per source [#493](https://github.com/nbbrd/sdmx-dl/issues/493) ### Fixed @@ -28,6 +28,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project +- ![CLI] Use environment variables as default values - ![GRPC] Migrate gRPC module to Quarkus framework ## [3.0.0-beta.11] - 2023-06-02 diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 76e57b925..35db0f58b 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -133,7 +133,10 @@ public class SdmxWebManager extends SdmxManager { private void checkSourceProperties(SdmxWebSource source, Driver driver) { if (onEvent != null) { - Collection expected = driver.getDriverProperties(); + Collection expected = new ArrayList<>(); + expected.addAll(driver.getDriverProperties()); + expected.addAll(networking.getNetworkingProperties()); + expected.addAll(caching.getWebCachingProperties()); Collection found = source.getProperties().keySet(); String diff = found.stream().filter(item -> !expected.contains(item)).sorted().collect(Collectors.joining(",")); if (!diff.isEmpty()) { From 099afebc8a8e052fb0bf8ee434947fa2807edac3 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 25 Jul 2023 14:51:13 +0200 Subject: [PATCH 052/114] Add RiCaching --- CHANGELOG.md | 4 +- .../java/sdmxdl/file/spi/FileCaching.java | 2 + .../main/java/sdmxdl/web/spi/WebCaching.java | 2 + .../java/internal/sdmxdl/NoOpCachingTest.java | 16 ++ .../src/test/java/sdmxdl/ext/CacheTest.java | 7 +- .../java/tests/sdmxdl/ext/CacheAssert.java | 39 ++-- .../sdmxdl/file/spi/FileCachingAssert.java | 41 +++++ .../sdmxdl/web/spi/WebCachingAssert.java | 48 +++++ .../sdmxdl/cli/{ext => }/AuthOptions.java | 24 ++- ...orkOptions.java => NetworkingOptions.java} | 18 +- .../sdmxdl/cli/WebCachingOptions.java | 40 +++++ .../sdmxdl/cli/WebContextOptions.java | 17 ++ .../internal/sdmxdl/cli/WebNetOptions.java | 86 +-------- .../internal/sdmxdl/cli/ext/CacheOptions.java | 63 ------- ...nsTest.java => NetworkingOptionsTest.java} | 6 +- .../sdmxdl/format/NoOpPersistence.java | 32 ++++ .../main/java/sdmxdl/format/LockingCache.java | 2 +- .../java/sdmxdl/format/spi/Persistence.java | 5 + .../java/sdmxdl/format/DiskCacheTest.java | 7 +- .../test/java/sdmxdl/format/MemCacheTest.java | 7 +- .../sdmxdl/format/MemCachingSupportTest.java | 10 ++ .../format/time/DiskCachingSupportTest.java | 17 ++ .../src/main/java/module-info.java | 4 - .../java/sdmxdl/format/kryo/KryoProvider.java | 15 +- .../src/main/java/module-info.java | 8 - .../sdmxdl/format/protobuf/JsonProvider.java | 15 +- .../format/protobuf/ProtobufProvider.java | 15 +- .../sdmxdl/provider/PropertiesSupport.java | 6 + .../provider/ext/DualWebCachingSupport.java | 68 ------- .../src/main/java/module-info.java | 15 +- .../sdmxdl/provider/ri/caching/RiCaching.java | 166 ++++++++++++++++++ .../provider/ri/caching/RiCachingTest.java | 16 ++ 32 files changed, 509 insertions(+), 312 deletions(-) create mode 100644 sdmx-dl-api/src/test/java/internal/sdmxdl/NoOpCachingTest.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java create mode 100644 sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java rename sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/{ext => }/AuthOptions.java (65%) rename sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/{NetworkOptions.java => NetworkingOptions.java} (65%) create mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebCachingOptions.java create mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebContextOptions.java delete mode 100644 sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java rename sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/{NetworkOptionsTest.java => NetworkingOptionsTest.java} (97%) create mode 100644 sdmx-dl-format-base/src/main/java/internal/sdmxdl/format/NoOpPersistence.java create mode 100644 sdmx-dl-format-base/src/test/java/sdmxdl/format/time/DiskCachingSupportTest.java delete mode 100644 sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java create mode 100644 sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java create mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/caching/RiCachingTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 83604257f..0d0319213 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added -- ![PROVIDER] Allow networking configuration by environment variables -- ![PROVIDER] Allow networking configuration per source [#493](https://github.com/nbbrd/sdmx-dl/issues/493) +- ![PROVIDER] Allow caching & networking configuration by environment variables [#516](https://github.com/nbbrd/sdmx-dl/issues/516) +- ![PROVIDER] Allow caching & networking configuration per source [#493](https://github.com/nbbrd/sdmx-dl/issues/493) ### Fixed diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java index 15b58dee2..6d50574ad 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -42,4 +42,6 @@ public interface FileCaching { } int UNKNOWN_FILE_CACHING_RANK = -1; + + String FILE_CACHING_PROPERTY_PREFIX = "sdmxdl.caching"; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java index b465fdf99..6d7f95b33 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -48,4 +48,6 @@ public interface WebCaching { } int UNKNOWN_WEB_CACHING_RANK = -1; + + String WEB_CACHING_PROPERTY_PREFIX = "sdmxdl.caching"; } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/NoOpCachingTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/NoOpCachingTest.java new file mode 100644 index 000000000..25f58842f --- /dev/null +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/NoOpCachingTest.java @@ -0,0 +1,16 @@ +package internal.sdmxdl; + +import org.junit.jupiter.api.Test; + +import static tests.sdmxdl.file.spi.FileCachingAssert.assertFileCompliance; +import static tests.sdmxdl.web.spi.WebCachingAssert.assertWebCompliance; + +public class NoOpCachingTest { + + @Test + public void testCompliance() { + NoOpCaching x = NoOpCaching.INSTANCE; + assertFileCompliance(x); + assertWebCompliance(x); + } +} diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java index 9c87425ed..52985acc0 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/CacheTest.java @@ -1,12 +1,15 @@ package sdmxdl.ext; import org.junit.jupiter.api.Test; -import tests.sdmxdl.ext.CacheAssert; + +import static tests.sdmxdl.ext.CacheAssert.assertMonitorCompliance; +import static tests.sdmxdl.ext.CacheAssert.assertRepositoryCompliance; public class CacheTest { @Test public void testNoOp() { - CacheAssert.assertCompliance(Cache.noOp()); + assertMonitorCompliance(Cache.noOp()); + assertRepositoryCompliance(Cache.noOp()); } } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java index dfe4b894f..c50f34f68 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/CacheAssert.java @@ -1,57 +1,56 @@ package tests.sdmxdl.ext; -import org.assertj.core.api.SoftAssertions; -import sdmxdl.HasExpiration; +import sdmxdl.DataRepository; import sdmxdl.ext.Cache; -import tests.sdmxdl.api.TckUtil; +import sdmxdl.web.MonitorReports; import java.time.Duration; -import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.*; import static tests.sdmxdl.api.RepoSamples.REPO; @SuppressWarnings("ConstantConditions") @lombok.experimental.UtilityClass public class CacheAssert { - public void assertCompliance(Cache cache) { - TckUtil.run(s -> assertCompliance(s, cache)); + public static void assertMonitorCompliance(Cache cache) { + checkClock(cache); } - public void assertCompliance(SoftAssertions s, Cache cache) { - checkClock(s, cache); - checkRepository(s, cache); + public static void assertRepositoryCompliance(Cache cache) { + checkClock(cache); + checkRepository(cache); } - private static void checkClock(SoftAssertions s, Cache cache) { - s.assertThat(cache.getClock()) + private static void checkClock(Cache cache) { + assertThat(cache.getClock()) .isEqualTo(cache.getClock()) .isNotNull(); } - private static void checkRepository(SoftAssertions s, Cache cache) { - s.assertThatThrownBy(() -> cache.put(null, REPO)) + private static void checkRepository(Cache cache) { + assertThatThrownBy(() -> cache.put(null, REPO)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.put("key", null)) + assertThatThrownBy(() -> cache.put("key", null)) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> cache.get(null)) + assertThatThrownBy(() -> cache.get(null)) .isInstanceOf(NullPointerException.class); - s.assertThat(cache.get("key")) + assertThat(cache.get("key")) .isNull(); - s.assertThatCode(() -> cache.put("key", REPO.toBuilder().ttl(cache.getClock().instant(), Duration.ZERO).build())) + assertThatCode(() -> cache.put("key", REPO.toBuilder().ttl(cache.getClock().instant(), Duration.ZERO).build())) .doesNotThrowAnyException(); - s.assertThat(cache.get("key")) + assertThat(cache.get("key")) .isNull(); - s.assertThatCode(() -> cache.put("key", REPO)) + assertThatCode(() -> cache.put("key", REPO)) .doesNotThrowAnyException(); - s.assertThat(cache.get("key")) + assertThat(cache.get("key")) .satisfiesAnyOf( result -> assertThat(result).isNull(), result -> assertThat(result).isEqualTo(REPO) diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java new file mode 100644 index 000000000..8b9a67b7b --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java @@ -0,0 +1,41 @@ +package tests.sdmxdl.file.spi; + +import lombok.NonNull; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; +import tests.sdmxdl.ext.CacheAssert; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNullPointerException; +import static sdmxdl.file.spi.FileCaching.FILE_CACHING_PROPERTY_PREFIX; +import static tests.sdmxdl.api.TckUtil.SCREAMING_SNAKE_CASE; +import static tests.sdmxdl.api.TckUtil.startingWith; + +@lombok.experimental.UtilityClass +public class FileCachingAssert { + + @SuppressWarnings("DataFlowIssue") + public static void assertFileCompliance(@NonNull FileCaching caching) { + assertThat(caching.getFileCachingId()) + .containsPattern(SCREAMING_SNAKE_CASE) + .isNotBlank(); + + assertThat(caching.getFileCachingProperties()) + .are(startingWith(FILE_CACHING_PROPERTY_PREFIX)) + .doesNotHaveDuplicates(); + + assertThatNullPointerException() + .isThrownBy(() -> caching.getReaderCache(null, null, null)); + + SdmxFileSource validSource = SdmxFileSource + .builder() + .data(new File("hello.xml")) + .build(); + + assertThat(caching.getReaderCache(validSource, null, null)) + .isNotNull() + .satisfies(CacheAssert::assertRepositoryCompliance); + } +} diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java new file mode 100644 index 000000000..f642a0525 --- /dev/null +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java @@ -0,0 +1,48 @@ +package tests.sdmxdl.web.spi; + +import lombok.NonNull; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.WebCaching; +import tests.sdmxdl.ext.CacheAssert; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNullPointerException; +import static sdmxdl.web.spi.WebCaching.WEB_CACHING_PROPERTY_PREFIX; +import static tests.sdmxdl.api.TckUtil.SCREAMING_SNAKE_CASE; +import static tests.sdmxdl.api.TckUtil.startingWith; + +@lombok.experimental.UtilityClass +public class WebCachingAssert { + + @SuppressWarnings("DataFlowIssue") + public static void assertWebCompliance(@NonNull WebCaching caching) { + assertThat(caching.getWebCachingId()) + .containsPattern(SCREAMING_SNAKE_CASE) + .isNotBlank(); + + assertThat(caching.getWebCachingProperties()) + .are(startingWith(WEB_CACHING_PROPERTY_PREFIX)) + .doesNotHaveDuplicates(); + + assertThatNullPointerException() + .isThrownBy(() -> caching.getMonitorCache(null, null, null)); + + assertThatNullPointerException() + .isThrownBy(() -> caching.getDriverCache(null, null, null)); + + SdmxWebSource validSource = SdmxWebSource + .builder() + .id("valid") + .driver("SDMX21") + .endpointOf("http://localhost") + .build(); + + assertThat(caching.getMonitorCache(validSource, null, null)) + .isNotNull() + .satisfies(CacheAssert::assertMonitorCompliance); + + assertThat(caching.getDriverCache(validSource, null, null)) + .isNotNull() + .satisfies(CacheAssert::assertRepositoryCompliance); + } +} diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/AuthOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/AuthOptions.java similarity index 65% rename from sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/AuthOptions.java rename to sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/AuthOptions.java index 156af6df1..4d776fbcb 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/AuthOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/AuthOptions.java @@ -1,8 +1,13 @@ -package internal.sdmxdl.cli.ext; +package internal.sdmxdl.cli; +import internal.util.AuthenticatorLoader; import picocli.CommandLine; +import sdmxdl.web.spi.Authenticator; import java.net.PasswordAuthentication; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; @lombok.Getter @lombok.Setter @@ -50,4 +55,21 @@ static PasswordAuthentication getNoUser() { return new PasswordAuthentication(null, new char[0]); } } + + public List getAuthenticators() { + if (hasUsername() && hasPassword()) { + return Collections.singletonList(new ConstantAuthenticator(getUser())); + } + List result = new ArrayList<>(); + if (!isNoSystemAuth()) { + result.addAll(AuthenticatorLoader.load()); + } + if (result.isEmpty()) { + ConsoleAuthenticator fallback = new ConsoleAuthenticator(); + if (fallback.isAuthenticatorAvailable()) { + result.add(fallback); + } + } + return result; + } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java similarity index 65% rename from sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java rename to sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java index d509d3f1e..8163e8922 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java @@ -1,12 +1,12 @@ package internal.sdmxdl.cli; -import internal.sdmxdl.cli.ext.AuthOptions; -import internal.sdmxdl.cli.ext.CacheOptions; import picocli.CommandLine; +import sdmxdl.provider.ri.web.networking.RiNetworking; +import sdmxdl.web.spi.Networking; @lombok.Getter @lombok.Setter -public class NetworkOptions { +public class NetworkingOptions { @CommandLine.Option( names = {"--auto-proxy"}, @@ -44,9 +44,11 @@ public class NetworkOptions { ) boolean noSystemSsl; - @CommandLine.ArgGroup(validate = false) - private CacheOptions cacheOptions = new CacheOptions(); - - @CommandLine.ArgGroup(validate = false) - private AuthOptions authOptions = new AuthOptions(); + public Networking getNetworking() { + System.setProperty(RiNetworking.AUTO_PROXY_PROPERTY.getKey(), Boolean.toString(isAutoProxy())); + System.setProperty(RiNetworking.NO_DEFAULT_SSL_PROPERTY.getKey(), Boolean.toString(isNoDefaultSsl())); + System.setProperty(RiNetworking.NO_SYSTEM_SSL_PROPERTY.getKey(), Boolean.toString(isNoSystemSsl())); + System.setProperty(RiNetworking.CURL_BACKEND_PROPERTY.getKey(), Boolean.toString(isCurlBackend())); + return new RiNetworking(); + } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebCachingOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebCachingOptions.java new file mode 100644 index 000000000..0ab45d87a --- /dev/null +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebCachingOptions.java @@ -0,0 +1,40 @@ +package internal.sdmxdl.cli; + +import picocli.CommandLine; +import sdmxdl.provider.ri.caching.RiCaching; +import sdmxdl.web.spi.WebCaching; + +import java.io.File; + +@lombok.Getter +@lombok.Setter +public class WebCachingOptions { + + @CommandLine.Option( + names = {"--no-cache"}, + negatable = true, + defaultValue = "${env:SDMXDL_CACHING_NOCACHE:-false}", + fallbackValue = "true", + descriptionKey = "cli.noCache" + ) + private boolean noCache; + + @CommandLine.Option( + names = {"--cache-folder"}, + paramLabel = "", + descriptionKey = "cli.cacheFolder", + hidden = true + ) + private File cacheFolder; + + public WebCaching getWebCaching() { + System.setProperty(RiCaching.NO_CACHE_PROPERTY.getKey(), Boolean.toString(isNoCache())); + File cacheFolder = getCacheFolder(); + if (cacheFolder == null) { + System.clearProperty(RiCaching.CACHE_FOLDER.getKey()); + } else { + System.setProperty(RiCaching.CACHE_FOLDER.getKey(), cacheFolder.toString()); + } + return new RiCaching(); + } +} diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebContextOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebContextOptions.java new file mode 100644 index 000000000..dde5fd03f --- /dev/null +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebContextOptions.java @@ -0,0 +1,17 @@ +package internal.sdmxdl.cli; + +import picocli.CommandLine; + +@lombok.Getter +@lombok.Setter +public class WebContextOptions { + + @CommandLine.ArgGroup(validate = false) + private NetworkingOptions networkOptions = new NetworkingOptions(); + + @CommandLine.ArgGroup(validate = false) + private WebCachingOptions cachingOptions = new WebCachingOptions(); + + @CommandLine.ArgGroup(validate = false) + private AuthOptions authOptions = new AuthOptions(); +} diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index 795feeee4..a427ac835 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -16,29 +16,12 @@ */ package internal.sdmxdl.cli; -import internal.sdmxdl.cli.ext.Anchor; -import internal.sdmxdl.cli.ext.AuthOptions; -import internal.sdmxdl.cli.ext.CacheOptions; -import internal.sdmxdl.cli.ext.VerboseOptions; -import internal.util.AuthenticatorLoader; import picocli.CommandLine; -import sdmxdl.format.DiskCache; -import sdmxdl.format.DiskCachingSupport; -import sdmxdl.format.MemCachingSupport; -import sdmxdl.provider.ext.DualWebCachingSupport; -import sdmxdl.provider.ri.web.networking.RiNetworking; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.Authenticator; -import sdmxdl.web.spi.Networking; -import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.net.URI; -import java.nio.file.Path; -import java.time.Clock; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -50,7 +33,7 @@ public class WebNetOptions extends WebOptions { @CommandLine.ArgGroup(validate = false, headingKey = "network") - private NetworkOptions networkOptions = new NetworkOptions(); + private WebContextOptions contextOptions = new WebContextOptions(); @CommandLine.Option( names = {"--force-ssl"}, @@ -64,10 +47,11 @@ public SdmxWebManager loadManager() throws IOException { SdmxWebManager defaultManager = super.loadManager(); return defaultManager .toBuilder() - .networking(getNetworking(getNetworkOptions())) - .caching(getWebCaching(getNetworkOptions().getCacheOptions(), getVerboseOptions())) + .networking(getContextOptions().getNetworkOptions().getNetworking()) + .caching(getContextOptions().getCachingOptions().getWebCaching()) .clearAuthenticators() - .authenticators(getAuthenticators()) + .authenticators(getContextOptions().getAuthOptions().getAuthenticators()) + .clearCustomSources() .customSources(getForcedSslSources(defaultManager)) .build(); } @@ -87,64 +71,4 @@ private static URI toHttps(URI url) { ? URI.create("https" + url.toString().substring(4)) : url; } - - private List getAuthenticators() { - AuthOptions authOptions = networkOptions.getAuthOptions(); - if (authOptions.hasUsername() && authOptions.hasPassword()) { - return Collections.singletonList(new ConstantAuthenticator(authOptions.getUser())); - } - List result = new ArrayList<>(); - if (!authOptions.isNoSystemAuth()) { - result.addAll(AuthenticatorLoader.load()); - } - if (result.isEmpty()) { - ConsoleAuthenticator fallback = new ConsoleAuthenticator(); - if (fallback.isAuthenticatorAvailable()) { - result.add(fallback); - } - } - return result; - } - - private static WebCaching getWebCaching(CacheOptions cacheOptions, VerboseOptions verboseOptions) { - if (cacheOptions.isNoCache()) { - return WebCaching.noOp(); - } - - Clock clock = Clock.systemDefaultZone(); - Path root = cacheOptions.getCacheFolder() != null ? cacheOptions.getCacheFolder().toPath() : DiskCache.SDMXDL_TMP_DIR; - reportCaching(verboseOptions, root); - - return DualWebCachingSupport - .builder() - .id("DRY") - .first(MemCachingSupport - .builder() - .id("MEM") - .clock(clock) - .build()) - .second(DiskCachingSupport - .builder() - .id("DISK") - .root(root) - .persistence(cacheOptions.getCacheFormat()) - .clock(clock) - .noCompression(cacheOptions.isNoCacheCompression()) - .build()) - .clock(clock) - .build(); - } - - private static void reportCaching(VerboseOptions verboseOptions, Path root) { - if (verboseOptions.isVerbose()) - verboseOptions.reportToErrorStream(Anchor.CFG, "Using cache folder '" + root + "'"); - } - - private static Networking getNetworking(NetworkOptions networkOptions) { - System.setProperty(RiNetworking.AUTO_PROXY_PROPERTY.getKey(), Boolean.toString(networkOptions.isAutoProxy())); - System.setProperty(RiNetworking.NO_DEFAULT_SSL_PROPERTY.getKey(), Boolean.toString(networkOptions.isNoDefaultSsl())); - System.setProperty(RiNetworking.NO_SYSTEM_SSL_PROPERTY.getKey(), Boolean.toString(networkOptions.isNoSystemSsl())); - System.setProperty(RiNetworking.CURL_BACKEND_PROPERTY.getKey(), Boolean.toString(networkOptions.isCurlBackend())); - return new RiNetworking(); - } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java deleted file mode 100644 index 72d99cbd4..000000000 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ext/CacheOptions.java +++ /dev/null @@ -1,63 +0,0 @@ -package internal.sdmxdl.cli.ext; - -import picocli.CommandLine; -import sdmxdl.format.spi.Persistence; -import sdmxdl.format.spi.PersistenceLoader; - -import java.io.File; -import java.util.List; -import java.util.NoSuchElementException; - -@lombok.Getter -@lombok.Setter -public class CacheOptions { - - @CommandLine.Option( - names = {"--no-cache"}, - defaultValue = "false", - descriptionKey = "cli.noCache" - ) - private boolean noCache; - - @CommandLine.Option( - names = {"--no-cache-compression"}, - defaultValue = "false", - descriptionKey = "cli.noCacheCompression", - hidden = true - ) - private boolean noCacheCompression; - - @CommandLine.Option( - names = {"--cache-folder"}, - paramLabel = "", - descriptionKey = "cli.cacheFolder", - hidden = true - ) - private File cacheFolder; - - @CommandLine.Option( - names = {"--cache-format"}, - paramLabel = "", - descriptionKey = "cli.cacheFormat", - defaultValue = "PROTOBUF", - converter = FileFormatters.class, - hidden = true - ) - private Persistence cacheFormat = PROVIDERS.stream() - .filter(provider -> provider.getPersistenceId().equals("PROTOBUF")) - .findFirst() - .orElseThrow(NoSuchElementException::new); - - private static final List PROVIDERS = PersistenceLoader.load(); - - private static final class FileFormatters implements CommandLine.ITypeConverter { - - @Override - public Persistence convert(String value) throws Exception { - return PROVIDERS.stream() - .filter(provider -> provider.getPersistenceId().equals(value)) - .findFirst() - .orElseThrow(NoSuchElementException::new); - } - } -} diff --git a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkingOptionsTest.java similarity index 97% rename from sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java rename to sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkingOptionsTest.java index 87f12fd0c..a52ce4ecb 100644 --- a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkOptionsTest.java +++ b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/NetworkingOptionsTest.java @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class NetworkOptionsTest { +public class NetworkingOptionsTest { @Nested class AutoProxyOptionTest { @@ -136,14 +136,14 @@ public void testWithEnvTrue() { static class Holder implements Callable { @CommandLine.Mixin - NetworkOptions options; + NetworkingOptions options; @Override public Void call() { return null; } - NetworkOptions execute(String... args) { + NetworkingOptions execute(String... args) { CommandLine cmd = new CommandLine(this); cmd.execute(args); return options; diff --git a/sdmx-dl-format-base/src/main/java/internal/sdmxdl/format/NoOpPersistence.java b/sdmx-dl-format-base/src/main/java/internal/sdmxdl/format/NoOpPersistence.java new file mode 100644 index 000000000..35d7822e2 --- /dev/null +++ b/sdmx-dl-format-base/src/main/java/internal/sdmxdl/format/NoOpPersistence.java @@ -0,0 +1,32 @@ +package internal.sdmxdl.format; + +import lombok.NonNull; +import sdmxdl.DataRepository; +import sdmxdl.format.FileFormat; +import sdmxdl.format.spi.Persistence; +import sdmxdl.web.MonitorReports; + +public enum NoOpPersistence implements Persistence { + + INSTANCE; + + @Override + public @NonNull String getPersistenceId() { + return "NO_OP"; + } + + @Override + public int getPersistenceRank() { + return UNKNOWN_PERSISTENCE_RANK; + } + + @Override + public @NonNull FileFormat getMonitorReportsFormat() throws IllegalArgumentException { + return FileFormat.noOp(); + } + + @Override + public @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException { + return FileFormat.noOp(); + } +} diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java index 2cc92fd6b..e5702d2fd 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/LockingCache.java @@ -12,7 +12,7 @@ import java.util.concurrent.locks.ReentrantLock; @lombok.AllArgsConstructor -final class LockingCache implements Cache { +public final class LockingCache implements Cache { private final @NonNull Cache delegate; diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java index 0b5324979..f388b8fc4 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/spi/Persistence.java @@ -1,5 +1,6 @@ package sdmxdl.format.spi; +import internal.sdmxdl.format.NoOpPersistence; import lombok.NonNull; import nbbrd.service.Quantifier; import nbbrd.service.ServiceDefinition; @@ -25,4 +26,8 @@ public interface Persistence { @NonNull FileFormat getDataRepositoryFormat() throws IllegalArgumentException; int UNKNOWN_PERSISTENCE_RANK = -1; + + static @NonNull Persistence noOp() { + return NoOpPersistence.INSTANCE; + } } diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java index 48914ceb7..55cd6a028 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/DiskCacheTest.java @@ -21,7 +21,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import sdmxdl.DataRepository; -import tests.sdmxdl.ext.CacheAssert; +import sdmxdl.web.MonitorReports; import tests.sdmxdl.ext.FakeClock; import java.io.*; @@ -36,6 +36,8 @@ import static java.util.function.UnaryOperator.identity; import static org.assertj.core.api.Assertions.assertThat; +import static tests.sdmxdl.ext.CacheAssert.assertMonitorCompliance; +import static tests.sdmxdl.ext.CacheAssert.assertRepositoryCompliance; /** * @author Philippe Charles @@ -44,7 +46,8 @@ public class DiskCacheTest { @Test public void testCompliance() { - CacheAssert.assertCompliance(DiskCache.builder().build()); + assertMonitorCompliance(DiskCache.builder().build()); + assertRepositoryCompliance(DiskCache.builder().build()); } @Test diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java index c08347f55..b9066e885 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCacheTest.java @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import sdmxdl.DataRepository; -import tests.sdmxdl.ext.CacheAssert; +import sdmxdl.web.MonitorReports; import tests.sdmxdl.ext.FakeClock; import java.time.Clock; @@ -30,6 +30,8 @@ import java.util.TreeMap; import static org.assertj.core.api.Assertions.assertThat; +import static tests.sdmxdl.ext.CacheAssert.assertMonitorCompliance; +import static tests.sdmxdl.ext.CacheAssert.assertRepositoryCompliance; /** * @author Philippe Charles @@ -38,7 +40,8 @@ public class MemCacheTest { @Test public void testCompliance() { - CacheAssert.assertCompliance(MemCache.builder().build()); + assertMonitorCompliance(MemCache.builder().build()); + assertRepositoryCompliance(MemCache.builder().build()); } @Test diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java index 38cb4183e..86424609e 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java @@ -1,6 +1,7 @@ package sdmxdl.format; import nbbrd.io.text.Parser; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import sdmxdl.file.SdmxFileSource; @@ -12,9 +13,18 @@ import static org.assertj.core.api.Assertions.assertThat; import static sdmxdl.format.MemCachingSupport.builder; +import static tests.sdmxdl.file.spi.FileCachingAssert.assertFileCompliance; +import static tests.sdmxdl.web.spi.WebCachingAssert.assertWebCompliance; public class MemCachingSupportTest { + @Test + public void testCompliance() { + MemCachingSupport x = MemCachingSupport.builder().id("COMPLIANCE").build(); + assertFileCompliance(x); + assertWebCompliance(x); + } + @ParameterizedTest @EnumSource(Extractor.class) public void testFactories(Extractor extractor) { diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/time/DiskCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/time/DiskCachingSupportTest.java new file mode 100644 index 000000000..f029be90f --- /dev/null +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/time/DiskCachingSupportTest.java @@ -0,0 +1,17 @@ +package sdmxdl.format.time; + +import org.junit.jupiter.api.Test; +import sdmxdl.format.DiskCachingSupport; + +import static tests.sdmxdl.file.spi.FileCachingAssert.assertFileCompliance; +import static tests.sdmxdl.web.spi.WebCachingAssert.assertWebCompliance; + +public class DiskCachingSupportTest { + + @Test + public void testCompliance() { + DiskCachingSupport x = DiskCachingSupport.builder().id("COMPLIANCE").build(); + assertFileCompliance(x); + assertWebCompliance(x); + } +} diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index d3261e86e..d29f29d0c 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -1,5 +1,3 @@ -import sdmxdl.file.spi.FileCaching; -import sdmxdl.web.spi.WebCaching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.kryo { @@ -13,7 +11,5 @@ exports sdmxdl.format.kryo; - provides FileCaching with sdmxdl.format.kryo.KryoProvider; - provides WebCaching with sdmxdl.format.kryo.KryoProvider; provides Persistence with sdmxdl.format.kryo.KryoProvider; } \ No newline at end of file diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index 5cee0c08e..b6818a879 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -3,30 +3,17 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; -import sdmxdl.file.spi.FileCaching; -import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; -import sdmxdl.web.spi.WebCaching; @ServiceProvider(Persistence.class) -@ServiceProvider(FileCaching.class) -@ServiceProvider(WebCaching.class) -public final class KryoProvider implements Persistence, FileCaching, WebCaching { +public final class KryoProvider implements Persistence { private static final String ID = "KRYO"; private static final int RANK = 400; - @lombok.experimental.Delegate - private final DiskCachingSupport caching = DiskCachingSupport - .builder() - .id(ID) - .rank(RANK) - .persistence(this) - .build(); - @Override public @NonNull String getPersistenceId() { return ID; diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index dfecc35b2..cdac48050 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -1,5 +1,3 @@ -import sdmxdl.file.spi.FileCaching; -import sdmxdl.web.spi.WebCaching; import sdmxdl.format.spi.Persistence; module sdmxdl.format.protobuf { @@ -15,12 +13,6 @@ exports sdmxdl.format.protobuf; exports sdmxdl.format.protobuf.web; - provides FileCaching with - sdmxdl.format.protobuf.JsonProvider, - sdmxdl.format.protobuf.ProtobufProvider; - provides WebCaching with - sdmxdl.format.protobuf.JsonProvider, - sdmxdl.format.protobuf.ProtobufProvider; provides Persistence with sdmxdl.format.protobuf.JsonProvider, sdmxdl.format.protobuf.ProtobufProvider; diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index 9768668e7..f215fa800 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -2,11 +2,8 @@ import com.google.protobuf.util.JsonFormat; import nbbrd.service.ServiceProvider; -import sdmxdl.file.spi.FileCaching; -import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; -import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.io.Reader; @@ -16,9 +13,7 @@ import static nbbrd.io.text.TextParser.onParsingReader; @ServiceProvider(Persistence.class) -@ServiceProvider(FileCaching.class) -@ServiceProvider(WebCaching.class) -public final class JsonProvider implements Persistence, FileCaching, WebCaching { +public final class JsonProvider implements Persistence { private final JsonFormat.Parser parser = JsonFormat.parser(); @@ -36,14 +31,6 @@ public final class JsonProvider implements Persistence, FileCaching, WebCaching .fileExtension(".json") .build(); - @lombok.experimental.Delegate - private final DiskCachingSupport caching = DiskCachingSupport - .builder() - .id(persistence.getPersistenceId()) - .rank(persistence.getPersistenceRank()) - .persistence(persistence) - .build(); - private sdmxdl.format.protobuf.web.MonitorReports parseJsonReports(Reader reader) throws IOException { sdmxdl.format.protobuf.web.MonitorReports.Builder builder = sdmxdl.format.protobuf.web.MonitorReports.newBuilder(); parser.merge(reader, builder); diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index 97275652a..95220b0bf 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -2,12 +2,9 @@ import com.google.protobuf.MessageLite; import nbbrd.service.ServiceProvider; -import sdmxdl.file.spi.FileCaching; -import sdmxdl.format.DiskCachingSupport; import sdmxdl.format.protobuf.web.MonitorReports; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; -import sdmxdl.web.spi.WebCaching; import java.io.IOException; import java.io.OutputStream; @@ -16,9 +13,7 @@ import static nbbrd.io.FileParser.onParsingStream; @ServiceProvider(Persistence.class) -@ServiceProvider(FileCaching.class) -@ServiceProvider(WebCaching.class) -public final class ProtobufProvider implements Persistence, FileCaching, WebCaching { +public final class ProtobufProvider implements Persistence { @lombok.experimental.Delegate private final PersistenceSupport persistence = PersistenceSupport @@ -32,14 +27,6 @@ public final class ProtobufProvider implements Persistence, FileCaching, WebCach .fileExtension(".protobuf") .build(); - @lombok.experimental.Delegate - private final DiskCachingSupport caching = DiskCachingSupport - .builder() - .id(persistence.getPersistenceId()) - .rank(persistence.getPersistenceRank()) - .persistence(persistence) - .build(); - private void writeProtobuf(MessageLite message, OutputStream outputStream) throws IOException { message.writeTo(outputStream); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java index b1786194f..3f0c32dd2 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java @@ -2,8 +2,10 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.file.SdmxFileSource; import sdmxdl.web.SdmxWebSource; +import java.util.Collections; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -12,6 +14,10 @@ @lombok.experimental.UtilityClass public class PropertiesSupport { + public static @NonNull Function asFunction(@NonNull SdmxFileSource source) { + return key -> PropertiesSupport.getProperty(Collections.emptyMap(), key); + } + public static @NonNull Function asFunction(@NonNull SdmxWebSource source) { return key -> PropertiesSupport.getProperty(source.getProperties(), key); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java deleted file mode 100644 index 190efad22..000000000 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/DualWebCachingSupport.java +++ /dev/null @@ -1,68 +0,0 @@ -package sdmxdl.provider.ext; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataRepository; -import sdmxdl.ErrorListener; -import sdmxdl.EventListener; -import sdmxdl.ext.Cache; -import sdmxdl.format.ServiceSupport; -import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; -import sdmxdl.web.spi.WebCaching; - -import java.time.Clock; -import java.util.Collection; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; - -@ServiceSupport -@lombok.Builder(toBuilder = true) -public final class DualWebCachingSupport implements WebCaching { - - @lombok.NonNull - private final String id; - - @lombok.Builder.Default - private final int rank = UNKNOWN_WEB_CACHING_RANK; - - @lombok.NonNull - @lombok.Builder.Default - private final WebCaching first = WebCaching.noOp(); - - @lombok.NonNull - @lombok.Builder.Default - private final WebCaching second = WebCaching.noOp(); - - @lombok.NonNull - @lombok.Builder.Default - private final Clock clock = Clock.systemDefaultZone(); - - @Override - public @NonNull String getWebCachingId() { - return id; - } - - @Override - public int getWebCachingRank() { - return rank; - } - - @Override - public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - Cache main = first.getDriverCache(source, onEvent, onError); - return new DualCache<>(main, second.getDriverCache(source, onEvent, onError), clock); - } - - @Override - public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { - Cache main = first.getMonitorCache(source, onEvent, onError); - return new DualCache<>(main, second.getMonitorCache(source, onEvent, onError), clock); - } - - @Override - public @NonNull Collection getWebCachingProperties() { - return Stream.concat(first.getWebCachingProperties().stream(), second.getWebCachingProperties().stream()).collect(toList()); - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index 600379351..8634ed1d5 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -1,14 +1,13 @@ +import sdmxdl.file.spi.FileCaching; +import sdmxdl.file.spi.Reader; +import sdmxdl.provider.ri.caching.RiCaching; import sdmxdl.provider.ri.file.readers.XmlReader; import sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; import sdmxdl.provider.ri.web.drivers.*; import sdmxdl.provider.ri.web.monitors.UpptimeMonitor; import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitor; -import sdmxdl.file.spi.Reader; import sdmxdl.provider.ri.web.networking.RiNetworking; -import sdmxdl.web.spi.Authenticator; -import sdmxdl.web.spi.Driver; -import sdmxdl.web.spi.Monitor; -import sdmxdl.web.spi.Networking; +import sdmxdl.web.spi.*; module sdmxdl.provider.ri { @@ -53,5 +52,11 @@ provides Networking with RiNetworking; + provides FileCaching with + RiCaching; + + provides WebCaching with + RiCaching; + opens sdmxdl.provider.ri.web.monitors to com.google.gson; } \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java new file mode 100644 index 000000000..71acad3ed --- /dev/null +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java @@ -0,0 +1,166 @@ +package sdmxdl.provider.ri.caching; + +import lombok.AccessLevel; +import lombok.NonNull; +import nbbrd.io.text.BooleanProperty; +import nbbrd.io.text.Formatter; +import nbbrd.io.text.Parser; +import nbbrd.io.text.Property; +import nbbrd.service.ServiceProvider; +import org.checkerframework.checker.nullness.qual.Nullable; +import sdmxdl.DataRepository; +import sdmxdl.ErrorListener; +import sdmxdl.EventListener; +import sdmxdl.HasExpiration; +import sdmxdl.ext.Cache; +import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.spi.FileCaching; +import sdmxdl.format.DiskCache; +import sdmxdl.format.DiskCachingSupport; +import sdmxdl.format.MemCache; +import sdmxdl.format.spi.Persistence; +import sdmxdl.format.spi.PersistenceLoader; +import sdmxdl.provider.PropertiesSupport; +import sdmxdl.provider.Slow; +import sdmxdl.provider.ext.DualCache; +import sdmxdl.web.MonitorReports; +import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.spi.WebCaching; + +import java.io.File; +import java.util.Collection; +import java.util.function.Function; + +import static nbbrd.io.text.BaseProperty.keysOf; + +@ServiceProvider(FileCaching.class) +@ServiceProvider(WebCaching.class) +public final class RiCaching implements FileCaching, WebCaching { + + public static final BooleanProperty NO_CACHE_PROPERTY + = BooleanProperty.of("sdmxdl.caching.noCache", false); + + public static final Property CACHE_FOLDER + = Property.of("sdmxdl.caching.cacheFolder", null, Parser.onFile(), Formatter.onFile()); + + @lombok.Getter(value = AccessLevel.PRIVATE, lazy = true) + private final DiskCachingSupport lazyDelegate = initLazyDelegate(); + + @Slow + private DiskCachingSupport initLazyDelegate() { + return DiskCachingSupport + .builder() + .id("RI_CACHING") + .rank(100) + .persistence(PersistenceLoader.load() + .stream() + .findFirst() + .orElseGet(Persistence::noOp)) + .build(); + } + + private DiskCachingSupport withRoot(File root) { + return getLazyDelegate() + .toBuilder() + .root(root.toPath()) + .build(); + } + + private Cache dry(Cache cache) { + return new DualCache<>( + MemCache.builder().clock(cache.getClock()).build(), + cache, + cache.getClock() + ); + } + + @Override + public @NonNull String getWebCachingId() { + return getLazyDelegate().getWebCachingId(); + } + + @Override + public int getWebCachingRank() { + return getLazyDelegate().getWebCachingRank(); + } + + @Override + public @NonNull Cache getDriverCache( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { + + Function function = PropertiesSupport.asFunction(source); + + if (NO_CACHE_PROPERTY.get(function)) { + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Cache disabled"); + return Cache.noOp(); + } + + File root = CACHE_FOLDER.get(function); + if (root == null) root = DiskCache.SDMXDL_TMP_DIR.toFile(); + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Using cache folder '" + root + "'"); + + return dry(withRoot(root).getDriverCache(source, onEvent, onError)); + } + + @Override + public @NonNull Cache getMonitorCache( + @NonNull SdmxWebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { + + Function function = PropertiesSupport.asFunction(source); + + if (NO_CACHE_PROPERTY.get(function)) { + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Cache disabled"); + return Cache.noOp(); + } + + File root = CACHE_FOLDER.get(function); + if (root == null) root = DiskCache.SDMXDL_TMP_DIR.toFile(); + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Using cache folder '" + root + "'"); + + return dry(withRoot(root).getMonitorCache(source, onEvent, onError)); + } + + @Override + public @NonNull Collection getWebCachingProperties() { + return keysOf(NO_CACHE_PROPERTY, CACHE_FOLDER); + } + + @Override + public @NonNull String getFileCachingId() { + return getLazyDelegate().getFileCachingId(); + } + + @Override + public int getFileCachingRank() { + return getLazyDelegate().getFileCachingRank(); + } + + @Override + public @NonNull Cache getReaderCache( + @NonNull SdmxFileSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { + + Function function = PropertiesSupport.asFunction(source); + + if (NO_CACHE_PROPERTY.get(function)) { + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Cache disabled"); + return Cache.noOp(); + } + + File root = CACHE_FOLDER.get(function); + if (root == null) root = DiskCache.SDMXDL_TMP_DIR.toFile(); + if (onEvent != null) onEvent.accept(source, getWebCachingId(), "Using cache folder '" + root + "'"); + + return dry(withRoot(root).getReaderCache(source, onEvent, onError)); + } + + @Override + public @NonNull Collection getFileCachingProperties() { + return keysOf(NO_CACHE_PROPERTY, CACHE_FOLDER); + } +} diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/caching/RiCachingTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/caching/RiCachingTest.java new file mode 100644 index 000000000..e2e5acc69 --- /dev/null +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/caching/RiCachingTest.java @@ -0,0 +1,16 @@ +package sdmxdl.provider.ri.caching; + +import org.junit.jupiter.api.Test; + +import static tests.sdmxdl.file.spi.FileCachingAssert.assertFileCompliance; +import static tests.sdmxdl.web.spi.WebCachingAssert.assertWebCompliance; + +public class RiCachingTest { + + @Test + public void testCompliance() { + RiCaching x = new RiCaching(); + assertFileCompliance(x); + assertWebCompliance(x); + } +} From 385d5c1ca290544b1d2dad18269080e0da888625 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 26 Jul 2023 14:04:58 +0200 Subject: [PATCH 053/114] Allow sources configuration by environment variables --- .../java/internal/sdmxdl/cli/WebOptions.java | 16 ++++++---- sdmx-dl-cli/src/test/java/_demo/Demo.java | 2 ++ .../sdmxdl/desktop/DesktopWebFactory.java | 15 ++++++++++ .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 19 +++++++++++- .../grpc/SdmxWebManagerServiceTest.java | 2 +- .../provider/ri/web/SourceProperties.java | 29 +++++++++++++++++++ 6 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 7082bc8ec..56a257e5e 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -27,14 +27,12 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.Languages; -import sdmxdl.provider.Marker; -import sdmxdl.format.xml.XmlWebSource; +import sdmxdl.provider.ri.web.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; import java.io.File; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -42,6 +40,8 @@ import java.util.concurrent.Future; import java.util.logging.Level; +import static java.util.Collections.emptyList; + /** * @author Philippe Charles */ @@ -54,6 +54,7 @@ public class WebOptions { @CommandLine.Option( names = {"-s", "--sources"}, + defaultValue = "${env:SDMXDL_SOURCES}", paramLabel = "", descriptionKey = "cli.sdmx.sourcesFile" ) @@ -132,13 +133,16 @@ private SdmxWebManager loadDefaultWebManager() { @ReturnNew private List loadCustomSources() throws IOException { - if (sourcesFile != null) { + if (isNoConfig()) return emptyList(); + if (sourcesFile != null && sourcesFile.exists() && sourcesFile.isFile()) { + System.setProperty(SourceProperties.SOURCES.getKey(), sourcesFile.toString()); if (verboseOptions.isVerbose()) { verboseOptions.reportToErrorStream(Anchor.CFG, "Using source file '" + sourcesFile + "'"); } - return XmlWebSource.getParser().parseFile(sourcesFile); + } else { + System.clearProperty(SourceProperties.SOURCES.getKey()); } - return Collections.emptyList(); + return SourceProperties.loadCustomSources(); } @lombok.extern.java.Log diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index bbec41310..f387c1438 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -1,6 +1,7 @@ package _demo; import sdmxdl.*; +import sdmxdl.provider.ri.web.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -18,6 +19,7 @@ public static void main(String[] args) throws IOException { SdmxWebManager manager = SdmxWebManager.ofServiceLoader() .toBuilder() .onEvent(Demo::printEvent) + .customSources(SourceProperties.loadCustomSources()) .build(); try (Connection ecb = manager.getConnection("ECB", ANY)) { diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index 7b60f5363..99f7d4ac9 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -1,6 +1,12 @@ package internal.sdmxdl.desktop; +import sdmxdl.provider.ri.web.SourceProperties; import sdmxdl.web.SdmxWebManager; +import sdmxdl.web.SdmxWebSource; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; public class DesktopWebFactory { @@ -12,6 +18,15 @@ public static SdmxWebManager loadManager() { return SdmxWebManager.ofServiceLoader() .toBuilder() .onEvent((source, marker, msg) -> System.out.println(source.getId() + ": " + msg)) + .customSources(getCustomSources()) .build(); } + + private static List getCustomSources() { + try { + return SourceProperties.loadCustomSources(); + } catch (IOException e) { + return Collections.emptyList(); + } + } } diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index 6508094a6..a93762315 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -1,11 +1,28 @@ package sdmxdl.grpc; +import sdmxdl.provider.ri.web.SourceProperties; import sdmxdl.web.SdmxWebManager; +import sdmxdl.web.SdmxWebSource; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; @lombok.experimental.UtilityClass class GrpcWebFactory { public static SdmxWebManager loadManager() { - return SdmxWebManager.ofServiceLoader(); + return SdmxWebManager.ofServiceLoader() + .toBuilder() + .customSources(getCustomSources()) + .build(); + } + + private static List getCustomSources() { + try { + return SourceProperties.loadCustomSources(); + } catch (IOException e) { + return Collections.emptyList(); + } } } diff --git a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java index 1fe08a1e6..47c950a7c 100644 --- a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java +++ b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java @@ -21,7 +21,7 @@ public void testGetSources() { Empty request = Empty.newBuilder().build(); List response = grpc.getSources(request).collect().asList().await().atMost(Duration.ofSeconds(5)); assertThat(response) - .hasSize(34) + .hasSizeGreaterThan(34) .extracting(SdmxWebSource::getId) .contains("ECB"); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java new file mode 100644 index 000000000..75fab848c --- /dev/null +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java @@ -0,0 +1,29 @@ +package sdmxdl.provider.ri.web; + +import nbbrd.design.ReturnNew; +import nbbrd.io.text.Formatter; +import nbbrd.io.text.Parser; +import nbbrd.io.text.Property; +import sdmxdl.format.xml.XmlWebSource; +import sdmxdl.provider.PropertiesSupport; +import sdmxdl.web.SdmxWebSource; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; + +@lombok.experimental.UtilityClass +public class SourceProperties { + + public static final Property SOURCES = + Property.of("sdmxdl.sources", null, Parser.onFile(), Formatter.onFile()); + + @ReturnNew + public static List loadCustomSources() throws IOException { + File sourcesFile = SourceProperties.SOURCES.get(key -> PropertiesSupport.getProperty(emptyMap(), key)); + return sourcesFile != null ? XmlWebSource.getParser().parseFile(sourcesFile) : emptyList(); + } +} From bff4ed940a982704e070978244edbcc8550a717a Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 26 Jul 2023 15:01:01 +0200 Subject: [PATCH 054/114] Fix standalone module dependencies --- sdmx-dl-format-protobuf/pom.xml | 20 ++++++++++++++++++++ sdmx-dl-standalone/pom.xml | 33 +++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/sdmx-dl-format-protobuf/pom.xml b/sdmx-dl-format-protobuf/pom.xml index 5897aceb0..a3c7fdefb 100644 --- a/sdmx-dl-format-protobuf/pom.xml +++ b/sdmx-dl-format-protobuf/pom.xml @@ -56,10 +56,30 @@ protobuf-java-util ${protobuf.version} + + com.google.code.findbugs + jsr305 + com.google.errorprone error_prone_annotations + + com.google.j2objc + j2objc-annotations + + + org.checkerframework + checker-qual + + + com.google.guava + failureaccess + + + com.google.guava + listenablefuture + diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index 24c7b56d7..c096e0fb9 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -22,6 +22,16 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-format-kryo + ${project.version} + + + org.slf4j + slf4j-jdk14 + ${slf4j.version} + @@ -50,6 +60,7 @@ META-INF/NOTICE META-INF/LICENSE META-INF/LICENSE.txt + **/*.proto @@ -63,26 +74,36 @@ sdmxdl.format - standalone.sdmxdl.format + standalone_sdmxdl.sdmxdl.format sdmxdl.provider - standalone.sdmxdl.provider + standalone_sdmxdl.sdmxdl.provider internal - standalone.internal + standalone_sdmxdl.internal nbbrd - standalone.nbbrd + standalone_sdmxdl.nbbrd com - standalone.com + standalone_sdmxdl.com + + + nl + standalone_sdmxdl.nl + + + org + standalone_sdmxdl.org - false + true + true + ${project.build.directory}/dependency-reduced-pom.xml From 6c63d46c1e2d01038d1259d05378ee8c2fb09c30 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 26 Jul 2023 15:51:18 +0200 Subject: [PATCH 055/114] Fix tests on some environments --- .../src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java index 47c950a7c..a4a03e2b3 100644 --- a/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java +++ b/sdmx-dl-grpc/src/test/java/sdmxdl/grpc/SdmxWebManagerServiceTest.java @@ -21,7 +21,7 @@ public void testGetSources() { Empty request = Empty.newBuilder().build(); List response = grpc.getSources(request).collect().asList().await().atMost(Duration.ofSeconds(5)); assertThat(response) - .hasSizeGreaterThan(34) + .hasSizeGreaterThanOrEqualTo(34) .extracting(SdmxWebSource::getId) .contains("ECB"); } From f98f392e85810b28071c3f38262a9886c9bd13de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 04:18:51 +0000 Subject: [PATCH 056/114] Bump org.junit:junit-bom from 5.9.3 to 5.10.0 Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.9.3 to 5.10.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.9.3...r5.10.0) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 584755a9b..dbfeb9ba7 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ org.junit junit-bom - 5.9.3 + 5.10.0 pom import From 4b2b120a140ad3a5b675b9df314f9831856c30fb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jul 2023 04:18:35 +0000 Subject: [PATCH 057/114] Bump quarkus.platform.version from 3.2.0.Final to 3.2.2.Final Bumps `quarkus.platform.version` from 3.2.0.Final to 3.2.2.Final. Updates `io.quarkus.platform:quarkus-bom` from 3.2.0.Final to 3.2.2.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.2.0.Final...3.2.2.Final) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.2.0.Final to 3.2.2.Final - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.2.0.Final...3.2.2.Final) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 0ea1c68ad..69564ff4c 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.2.0.Final + 3.2.2.Final true true From 21c99f1a0a28ae52dd3d1a476a996f83fd1fcbb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jul 2023 09:26:43 +0000 Subject: [PATCH 058/114] Bump io.github.hakky54:sslcontext-kickstart from 8.1.2 to 8.1.4 Bumps [io.github.hakky54:sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.1.2 to 8.1.4. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.1.2...v8.1.4) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-provider-ri/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index ebaff7138..6199ddbcf 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -72,7 +72,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.2 + 8.1.4 slf4j-api From accd72e469fde95d1ad6cf5818dedf7326392812 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 04:41:58 +0000 Subject: [PATCH 059/114] Bump picocli.version from 4.7.4 to 4.7.5 Bumps `picocli.version` from 4.7.4 to 4.7.5. Updates `info.picocli:picocli` from 4.7.4 to 4.7.5 - [Release notes](https://github.com/remkop/picocli/releases) - [Changelog](https://github.com/remkop/picocli/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/remkop/picocli/compare/v4.7.4...v4.7.5) Updates `info.picocli:picocli-codegen` from 4.7.4 to 4.7.5 - [Release notes](https://github.com/remkop/picocli/releases) - [Changelog](https://github.com/remkop/picocli/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/remkop/picocli/compare/v4.7.4...v4.7.5) --- updated-dependencies: - dependency-name: info.picocli:picocli dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: info.picocli:picocli-codegen dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbfeb9ba7..47e31d15e 100644 --- a/pom.xml +++ b/pom.xml @@ -284,7 +284,7 @@ 1.18.28 1.7.0 1.4.0 - 4.7.4 + 4.7.5 From 828e04a102fb13c65c742994c4698e9221d8b3ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Aug 2023 04:09:09 +0000 Subject: [PATCH 060/114] Bump com.formdev:flatlaf from 3.1.1 to 3.2 Bumps [com.formdev:flatlaf](https://github.com/JFormDesigner/FlatLaf) from 3.1.1 to 3.2. - [Release notes](https://github.com/JFormDesigner/FlatLaf/releases) - [Changelog](https://github.com/JFormDesigner/FlatLaf/blob/main/CHANGELOG.md) - [Commits](https://github.com/JFormDesigner/FlatLaf/compare/3.1.1...3.2) --- updated-dependencies: - dependency-name: com.formdev:flatlaf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-desktop/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 2ace034f5..bf08dcdde 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -98,7 +98,7 @@ com.formdev flatlaf - 3.1.1 + 3.2 org.kordamp.ikonli From 1e0b78883bce44524ff11f9d253b123411bbfc68 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 04:36:13 +0000 Subject: [PATCH 061/114] Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.3.0 to 3.4.0 Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.3.0...enforcer-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47e31d15e..a4b79dd0c 100644 --- a/pom.xml +++ b/pom.xml @@ -453,7 +453,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.3.0 + 3.4.0 org.kordamp.maven From 6859e86243b16602bab7c71704c5255e80e88435 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 04:22:12 +0000 Subject: [PATCH 062/114] Bump io.github.hakky54:sslcontext-kickstart from 8.1.4 to 8.1.5 Bumps [io.github.hakky54:sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.1.4 to 8.1.5. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.1.4...v8.1.5) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-provider-ri/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index 6199ddbcf..54626e3b3 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -72,7 +72,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.4 + 8.1.5 slf4j-api From 8ea604dbf9b99d258beca7da7e3a52b99678e8d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 04:54:00 +0000 Subject: [PATCH 063/114] Bump org.checkerframework:checker-qual from 3.36.0 to 3.37.0 Bumps [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) from 3.36.0 to 3.37.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.36.0...checker-framework-3.37.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker-qual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4b79dd0c..00fa59748 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.checkerframework checker-qual - 3.36.0 + 3.37.0 From 265400d21543d9d300ff8f94387270002bb19242 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 04:32:02 +0000 Subject: [PATCH 064/114] Bump quarkus.platform.version from 3.2.2.Final to 3.3.0 Bumps `quarkus.platform.version` from 3.2.2.Final to 3.3.0. Updates `io.quarkus.platform:quarkus-bom` from 3.2.2.Final to 3.3.0 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.2.2.Final...3.3.0) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.2.2.Final to 3.3.0 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.2.2.Final...3.3.0) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 69564ff4c..7cec32bd1 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.2.2.Final + 3.3.0 true true From 9cfb6a1ed33c91000f0b5a18ed47a24c2a05c096 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 28 Aug 2023 15:27:54 +0200 Subject: [PATCH 065/114] Move PxWebDriver to its own module --- CHANGELOG.md | 1 + pom.xml | 1 + sdmx-dl-cli/pom.xml | 5 ++ sdmx-dl-desktop/pom.xml | 5 ++ sdmx-dl-grpc/pom.xml | 9 ++- sdmx-dl-provider-px/pom.xml | 70 +++++++++++++++++++ .../src/main/java/module-info.java | 19 +++++ .../provider/px/drivers}/CollectionUtil.java | 7 +- .../sdmxdl/provider/px/drivers}/GsonIO.java | 6 +- .../sdmxdl/provider/px/drivers}/GsonUtil.java | 6 +- .../provider/px}/drivers/PxWebDriver.java | 35 ++++------ .../provider/px}/drivers/PxWebDriverTest.java | 20 ++++-- .../provider/px}/drivers/statfin-config.json | 0 .../px}/drivers/statfin-table-meta.json | 0 .../provider/px}/drivers/statfin-tables.json | 0 .../src/main/java/module-info.java | 4 +- sdmx-dl-standalone/pom.xml | 5 ++ 17 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 sdmx-dl-provider-px/pom.xml create mode 100644 sdmx-dl-provider-px/src/main/java/module-info.java rename {sdmx-dl-provider-ri/src/main/java/internal/util => sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers}/CollectionUtil.java (87%) rename {sdmx-dl-provider-ri/src/main/java/internal/util/gson => sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers}/GsonIO.java (97%) rename {sdmx-dl-provider-ri/src/main/java/internal/util/gson => sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers}/GsonUtil.java (84%) rename {sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web => sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px}/drivers/PxWebDriver.java (94%) rename {sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web => sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px}/drivers/PxWebDriverTest.java (85%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px}/drivers/statfin-config.json (100%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px}/drivers/statfin-table-meta.json (100%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px}/drivers/statfin-tables.json (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d0319213..493790296 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project +- ![PROVIDER] Move PxWebDriver to its own module - ![CLI] Use environment variables as default values - ![GRPC] Migrate gRPC module to Quarkus framework diff --git a/pom.xml b/pom.xml index 00fa59748..fcd41a614 100644 --- a/pom.xml +++ b/pom.xml @@ -238,6 +238,7 @@ sdmx-dl-provider-base sdmx-dl-provider-ri sdmx-dl-provider-connectors + sdmx-dl-provider-px sdmx-dl-testing sdmx-dl-cli sdmx-dl-desktop diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 7510c36f7..e77ed0587 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -60,6 +60,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-px + ${project.version} + ${project.groupId} sdmx-dl-format-xml diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index bf08dcdde..00c6ce517 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -68,6 +68,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-px + ${project.version} + ${project.groupId} sdmx-dl-format-xml diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 7cec32bd1..69c903d8b 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -51,12 +51,17 @@ com.github.nbbrd.sdmx-dl - sdmx-dl-format-protobuf + sdmx-dl-provider-ri + ${project.version} + + + ${project.groupId} + sdmx-dl-provider-px ${project.version} com.github.nbbrd.sdmx-dl - sdmx-dl-provider-ri + sdmx-dl-format-protobuf ${project.version} diff --git a/sdmx-dl-provider-px/pom.xml b/sdmx-dl-provider-px/pom.xml new file mode 100644 index 000000000..41590e7e4 --- /dev/null +++ b/sdmx-dl-provider-px/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + + com.github.nbbrd.sdmx-dl + sdmx-dl-parent + 3.0.0-beta.12-SNAPSHOT + + + sdmx-dl-provider-px + jar + + sdmx-dl-provider-px + Easily download official statistics - PX + https://github.com/nbbrd/sdmx-dl + + + + + org.checkerframework + checker-qual + provided + + + org.projectlombok + lombok + provided + + + com.github.nbbrd.java-service-util + java-service-processor + provided + + + com.github.nbbrd.java-design-util + java-design-processor + provided + + + + + ${project.groupId} + sdmx-dl-provider-ri + ${project.version} + + + + + ${project.groupId} + sdmx-dl-api + ${project.version} + tests + test-jar + test + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + \ No newline at end of file diff --git a/sdmx-dl-provider-px/src/main/java/module-info.java b/sdmx-dl-provider-px/src/main/java/module-info.java new file mode 100644 index 000000000..daa09816b --- /dev/null +++ b/sdmx-dl-provider-px/src/main/java/module-info.java @@ -0,0 +1,19 @@ +import sdmxdl.provider.px.drivers.PxWebDriver; +import sdmxdl.web.spi.Driver; + +module sdmxdl.provider.px { + + requires static lombok; + requires static nbbrd.design; + requires static nbbrd.service; + requires static org.checkerframework.checker.qual; + + requires sdmxdl.api; + requires sdmxdl.format.xml; + requires sdmxdl.provider.ri; + requires sdmxdl.provider.base; + requires com.google.gson; + + provides Driver with + PxWebDriver; +} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/CollectionUtil.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/CollectionUtil.java similarity index 87% rename from sdmx-dl-provider-ri/src/main/java/internal/util/CollectionUtil.java rename to sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/CollectionUtil.java index 8426439fb..24fe7121e 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/CollectionUtil.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/CollectionUtil.java @@ -1,11 +1,14 @@ -package internal.util; +package sdmxdl.provider.px.drivers; + +import nbbrd.design.MightBePromoted; import java.util.*; import java.util.stream.IntStream; import java.util.stream.Stream; +@MightBePromoted @lombok.experimental.UtilityClass -public class CollectionUtil { +class CollectionUtil { public static Map zip(Collection keys, Collection values) { Map result = new HashMap<>(); diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonIO.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonIO.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonIO.java rename to sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonIO.java index 05e362242..f5bc32a80 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonIO.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonIO.java @@ -1,7 +1,8 @@ -package internal.util.gson; +package sdmxdl.provider.px.drivers; import com.google.gson.*; import lombok.NonNull; +import nbbrd.design.MightBePromoted; import nbbrd.io.text.TextFormatter; import nbbrd.io.text.TextParser; @@ -9,8 +10,9 @@ import java.nio.charset.Charset; import java.util.Map; +@MightBePromoted @lombok.experimental.UtilityClass -public class GsonIO { +class GsonIO { @lombok.Builder public static final class GsonParser implements TextParser { diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonUtil.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonUtil.java similarity index 84% rename from sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonUtil.java rename to sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonUtil.java index 59424e6a3..a4fde3cf5 100644 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/gson/GsonUtil.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/GsonUtil.java @@ -1,15 +1,17 @@ -package internal.util.gson; +package sdmxdl.provider.px.drivers; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import nbbrd.design.MightBePromoted; import java.util.NoSuchElementException; import java.util.stream.Stream; import java.util.stream.StreamSupport; +@MightBePromoted @lombok.experimental.UtilityClass -public class GsonUtil { +class GsonUtil { public static String getAsString(JsonObject obj, String memberName) { if (obj.has(memberName)) return obj.get(memberName).getAsString(); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java similarity index 94% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java rename to sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java index 2c3cb0e7d..d4384b7dc 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java @@ -1,9 +1,6 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.px.drivers; import com.google.gson.*; -import sdmxdl.provider.ri.web.RiHttpUtils; -import internal.util.CollectionUtil; -import internal.util.gson.GsonIO; import internal.util.http.HttpClient; import internal.util.http.HttpMethod; import internal.util.http.HttpRequest; @@ -28,6 +25,7 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.TypedId; +import sdmxdl.provider.ri.web.RiHttpUtils; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; @@ -42,11 +40,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static internal.util.CollectionUtil.indexedStreamOf; -import static internal.util.CollectionUtil.zip; -import static internal.util.gson.GsonUtil.asStream; -import static internal.util.gson.GsonUtil.getAsString; import static java.util.stream.Collectors.toList; import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; @@ -65,7 +58,7 @@ public final class PxWebDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(PxWebDriver::newConnection) - .properties(RI_CONNECTION_PROPERTIES) + .properties(RiHttpUtils.RI_CONNECTION_PROPERTIES) .propertyOf(CACHE_TTL_PROPERTY) .source(SdmxWebSource .builder() @@ -470,9 +463,9 @@ private static final class TableDeserializer implements JsonDeserializer public Table deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject obj = json.getAsJsonObject(); return new Table( - getAsString(obj, "id"), - getAsString(obj, "path"), - getAsString(obj, "title") + GsonUtil.getAsString(obj, "id"), + GsonUtil.getAsString(obj, "path"), + GsonUtil.getAsString(obj, "title") ); } } @@ -495,7 +488,7 @@ DataStructure toDataStructure(DataStructureRef ref) { } List toDimensionList() { - return indexedStreamOf(variables) + return CollectionUtil.indexedStreamOf(variables) .filter(item -> !item.getElement().isTime()) .map(item -> item.getElement().toDimension(item.getIndex() + 1)) .collect(Collectors.toList()); @@ -520,7 +513,7 @@ public TableMeta deserialize(JsonElement json, Type typeOfT, JsonDeserialization JsonObject x = json.getAsJsonObject(); JsonArray y = x.getAsJsonArray("variables"); return new TableMeta( - asStream(y).map(o -> context.deserialize(o, TableVariable.class)).collect(toList()) + GsonUtil.asStream(y).map(o -> context.deserialize(o, TableVariable.class)).collect(toList()) ); } } @@ -544,7 +537,7 @@ Dimension toDimension(int position) { .codelist(Codelist .builder() .ref(CodelistRef.parse(code)) - .codes(zip(values, valueTexts)) + .codes(CollectionUtil.zip(values, valueTexts)) .build()) .build(); } @@ -557,10 +550,10 @@ private static final class TableVariableDeserializer implements JsonDeserializer public TableVariable deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject x = json.getAsJsonObject(); return new TableVariable( - getAsString(x, "code"), - getAsString(x, "text"), - asStream(x.getAsJsonArray("values")).map(JsonElement::getAsString).collect(toList()), - asStream(x.getAsJsonArray("valueTexts")).map(JsonElement::getAsString).collect(toList()), + GsonUtil.getAsString(x, "code"), + GsonUtil.getAsString(x, "text"), + GsonUtil.asStream(x.getAsJsonArray("values")).map(JsonElement::getAsString).collect(toList()), + GsonUtil.asStream(x.getAsJsonArray("valueTexts")).map(JsonElement::getAsString).collect(toList()), x.has("time") && x.get("time").getAsBoolean() ); } @@ -574,7 +567,7 @@ static class TableQuery { Map> itemFilters; static TableQuery fromDataStructureAndKey(DataStructure dsd, Key key) { - return new TableQuery(indexedStreamOf(dsd.getDimensionList()) + return new TableQuery(CollectionUtil.indexedStreamOf(dsd.getDimensionList()) .collect(Collectors.toMap( dimension -> dimension.getElement().getId(), dimension -> fromDimensionAndKey(dimension, key)) diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java b/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java similarity index 85% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java rename to sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java index 134ecddc0..3c783925e 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/PxWebDriverTest.java +++ b/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java @@ -1,11 +1,14 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.px.drivers; import org.assertj.core.data.Index; import org.junit.jupiter.api.Test; import sdmxdl.DataStructureRef; -import wiremock.com.google.common.collect.ImmutableMap; +import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; @@ -15,6 +18,11 @@ public class PxWebDriverTest { + @Test + public void testCompliance() { + DriverAssert.assertCompliance(new PxWebDriver()); + } + @Test public void testConfig() throws IOException { assertThat(PxWebDriver.Config.JSON_PARSER.parseResource(PxWebDriverTest.class, "statfin-config.json", UTF_8)) @@ -56,9 +64,11 @@ public void testTableMeta() throws IOException { @Test public void testTableQuery() throws IOException { - PxWebDriver.TableQuery query = new PxWebDriver.TableQuery( - ImmutableMap.of("kon", asList("1", "2"), "ContentsCode", singletonList("BE0101N1")) - ); + Map> itemFilters = new HashMap<>(); + itemFilters.put("kon", asList("1", "2")); + itemFilters.put("ContentsCode", singletonList("BE0101N1")); + + PxWebDriver.TableQuery query = new PxWebDriver.TableQuery(itemFilters); // System.out.println(PxWebDriver.TableQuery.FORMATTER.formatToString(query)); diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-config.json b/sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-config.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-config.json rename to sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-config.json diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json b/sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-table-meta.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-table-meta.json rename to sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-table-meta.json diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-tables.json b/sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-tables.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statfin-tables.json rename to sdmx-dl-provider-px/src/test/resources/sdmxdl/provider/px/drivers/statfin-tables.json diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index 8634ed1d5..c9e18a957 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -26,6 +26,9 @@ requires nbbrd.io.curl; requires nbbrd.net.proxy; + exports sdmxdl.provider.ri.web to sdmxdl.provider.px; + exports internal.util.http to sdmxdl.provider.px; + provides Driver with BbkDriver, DotStatDriver2, @@ -34,7 +37,6 @@ ImfDriver2, InseeDriver2, NbbDriver2, - PxWebDriver, RngDriver, Sdmx21Driver2, StatCanDriver; diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index c096e0fb9..3cb0624ba 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -22,6 +22,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-px + ${project.version} + ${project.groupId} sdmx-dl-format-kryo From 57dff9f380597158c21bc49e853eca9c1669b2c0 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 28 Aug 2023 16:41:57 +0200 Subject: [PATCH 066/114] Code cleanup --- docs/content/api/_index.md | 1 + .../sdmxdl/desktop/DesktopWebFactory.java | 1 + .../src/main/javadoc/EmptyJavaDoc.java | 6 +++ ...estClientTest.java => CurlClientTest.java} | 2 +- .../util/http/DefaultHttpClientTest.java | 8 ++-- ...estClientTest.java => HttpClientTest.java} | 42 +++++++++---------- ...RestClientTest.java => JdkClientTest.java} | 2 +- 7 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 sdmx-dl-provider-px/src/main/javadoc/EmptyJavaDoc.java rename sdmx-dl-provider-ri/src/test/java/internal/util/http/{CurlRestClientTest.java => CurlClientTest.java} (96%) rename sdmx-dl-provider-ri/src/test/java/internal/util/http/{HttpRestClientTest.java => HttpClientTest.java} (95%) rename sdmx-dl-provider-ri/src/test/java/internal/util/http/{JdkRestClientTest.java => JdkClientTest.java} (95%) diff --git a/docs/content/api/_index.md b/docs/content/api/_index.md index 94396406e..d6f8fa3c0 100644 --- a/docs/content/api/_index.md +++ b/docs/content/api/_index.md @@ -21,6 +21,7 @@ flowchart BT provider-base[base] connectors ri + px end testing cli diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index 99f7d4ac9..a663b9ef4 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -12,6 +12,7 @@ public class DesktopWebFactory { static { System.setProperty("enableRngDriver", "true"); + System.setProperty("enablePxWebDriver", "true"); } public static SdmxWebManager loadManager() { diff --git a/sdmx-dl-provider-px/src/main/javadoc/EmptyJavaDoc.java b/sdmx-dl-provider-px/src/main/javadoc/EmptyJavaDoc.java new file mode 100644 index 000000000..530579d47 --- /dev/null +++ b/sdmx-dl-provider-px/src/main/javadoc/EmptyJavaDoc.java @@ -0,0 +1,6 @@ +/** + * Workaround for JavaDoc issues with Lombok. + */ +public class EmptyJavaDoc { + +} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java rename to sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java index 9c4a246dd..a481bfbe9 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java @@ -28,7 +28,7 @@ /** * @author Philippe Charles */ -public class CurlRestClientTest extends DefaultHttpClientTest { +public class CurlClientTest extends DefaultHttpClientTest { @Override protected URLConnectionFactory getURLConnectionFactory() { diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java index dec8397cf..75490c872 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java @@ -16,14 +16,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIOException; -public abstract class DefaultHttpClientTest extends HttpRestClientTest { +public abstract class DefaultHttpClientTest extends HttpClientTest { abstract protected URLConnectionFactory getURLConnectionFactory(); abstract protected boolean isHttpsURLConnectionSupported(); @Override - protected HttpClient getRestClient(HttpContext context) { + protected HttpClient getClient(HttpContext context) { return new DefaultHttpClient( context .toBuilder() @@ -53,7 +53,7 @@ public void testLazyNetwork() throws IOException { .sslSocketFactory(counting(this::wireSSLSocketFactory, sslSocketFactoryCount)) .hostnameVerifier(counting(this::wireHostnameVerifier, hostnameVerifierCount)) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); @@ -81,7 +81,7 @@ public void testDefaultResponse() throws IOException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(ok())); diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java rename to sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java index b7058749b..ce7f4fc89 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java @@ -55,9 +55,9 @@ /** * @author Philippe Charles */ -public abstract class HttpRestClientTest { +public abstract class HttpClientTest { - abstract protected HttpClient getRestClient(HttpContext context); + abstract protected HttpClient getClient(HttpContext context); abstract protected WireMockConfiguration getWireMockConfiguration(); @@ -71,7 +71,7 @@ public void testNPE() { HttpContext context = HttpContext .builder() .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); assertThatNullPointerException() .isThrownBy(() -> x.send(null)); @@ -85,7 +85,7 @@ public void testHttpOK_GET() throws IOException { .hostnameVerifier(this::wireHostnameVerifier) .userAgent("hello world") .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); @@ -121,7 +121,7 @@ public void testHttpOK_POST() throws IOException { .hostnameVerifier(this::wireHostnameVerifier) .userAgent("hello world") .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(post(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); @@ -158,7 +158,7 @@ public void testMultiMediaTypes() throws IOException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); @@ -181,7 +181,7 @@ public void testHttpError() { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); String customErrorMessage = "Custom error message"; @@ -210,7 +210,7 @@ public void testInvalidProtocol() { HttpContext context = HttpContext .builder() .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); assertThatIOException() .isThrownBy(() -> x.send(HttpRequest.builder().query(new URL("ftp://localhost")).mediaType(Xml.APPLICATION_XML_UTF_8).build())) @@ -222,7 +222,7 @@ public void testInvalidHost() { HttpContext context = HttpContext .builder() .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); assertThatIOException() .isThrownBy(() -> x.send(HttpRequest.builder().query(new URL("http://localhoooooost")).mediaType(Xml.APPLICATION_XML_UTF_8).build())) @@ -237,7 +237,7 @@ public void testRedirect() throws IOException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); String absoluteSecondURL = wireURL(SECOND_URL).toString(); @@ -266,7 +266,7 @@ public void testMaxRedirect() throws MalformedURLException { .hostnameVerifier(this::wireHostnameVerifier) .maxRedirects(0) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); String absoluteSecondURL = wireURL(SECOND_URL).toString(); @@ -291,7 +291,7 @@ public void testInvalidRedirect() throws MalformedURLException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); for (int redirection : getHttpRedirectionCodes()) { wire.resetAll(); @@ -311,7 +311,7 @@ public void testDowngradingRedirect() throws MalformedURLException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); String location = wireHttpUrl(SECOND_URL); @@ -332,7 +332,7 @@ public void testInvalidSSL() { HttpContext context = HttpContext .builder() .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); @@ -355,7 +355,7 @@ public void testReadTimeout() { .hostnameVerifier(this::wireHostnameVerifier) .readTimeout(readTimeout) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML).withFixedDelay(readTimeout * 2))); @@ -375,7 +375,7 @@ public void testValidAuth() throws IOException { .authenticator(authenticatorOf("user", "password")) .preemptiveAuthentication(preemptive) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); @@ -399,7 +399,7 @@ public void testNoAuth() { .authenticator(HttpAuthenticator.noOp()) .preemptiveAuthentication(preemptive) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); @@ -427,7 +427,7 @@ public void testInvalidAuth() { .authenticator(authenticatorOf("user", "xyz")) .preemptiveAuthentication(preemptive) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); @@ -456,7 +456,7 @@ public void testInsecureAuth() throws MalformedURLException { .authenticator(authenticatorOf("user", "password")) .preemptiveAuthentication(preemptive) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); @@ -482,7 +482,7 @@ public void testMissingAuth() throws IOException { .authenticator(authenticatorOf("user", "password")) .preemptiveAuthentication(preemptive) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized())); @@ -503,7 +503,7 @@ public void testDoubleDotInURL() throws IOException { .sslSocketFactory(this::wireSSLSocketFactory) .hostnameVerifier(this::wireHostnameVerifier) .build(); - HttpClient x = getRestClient(context); + HttpClient x = getClient(context); wire.resetAll(); wire.stubFor(get("/abc/../first.xml").willReturn(okXml(SAMPLE_XML))); diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java rename to sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java index 9308ae6fe..0de52e9b0 100644 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java @@ -22,7 +22,7 @@ /** * @author Philippe Charles */ -public class JdkRestClientTest extends DefaultHttpClientTest { +public class JdkClientTest extends DefaultHttpClientTest { @Override protected URLConnectionFactory getURLConnectionFactory() { From 60ee3738867907a9d508723717f74e69962fdf4d Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 29 Aug 2023 09:48:57 +0200 Subject: [PATCH 067/114] Move dialects drivers to their own module --- CHANGELOG.md | 1 + docs/content/api/_index.md | 1 + docs/tmp/sources.csv | 28 +++---- pom.xml | 1 + sdmx-dl-bom/pom.xml | 10 +++ sdmx-dl-cli/pom.xml | 5 ++ sdmx-dl-desktop/pom.xml | 5 ++ sdmx-dl-grpc/pom.xml | 5 ++ sdmx-dl-provider-dialects/pom.xml | 70 ++++++++++++++++++ .../src/main/java/module-info.java | 25 +++++++ .../dialects/drivers/BbkDialectDriver.java | 16 ++-- .../drivers/DotStatDialectDriver.java | 24 +++--- .../dialects/drivers}/DotStatRestParsers.java | 3 +- .../dialects/drivers}/DotStatRestQueries.java | 3 +- .../dialects/drivers/EstatDialectDriver.java | 24 +++--- .../dialects/drivers/ImfDialectDriver.java | 16 ++-- .../dialects/drivers/InseeDialectDriver.java | 14 ++-- .../dialects/drivers/NbbDialectDriver.java | 16 ++-- .../drivers/StatCanDialectDriver.java | 14 ++-- .../src/main/javadoc/EmptyJavaDoc.java | 6 ++ .../java/_tests}/RestClientResponseMock.java | 2 +- .../drivers/BbkDialectDriverTest.java | 8 +- .../drivers/DotStatDialectDriverTest.java | 6 +- .../drivers/EstatDialectDriverTest.java | 12 +++ .../drivers/ImfDialectDriverTest.java | 6 +- .../drivers/InseeDialectDriverTest.java | 10 +-- .../drivers/NbbDialectDriverTest.java | 14 ++-- .../drivers/StatCanDialectDriverTest.java | 20 ++--- .../dialects}/drivers/statcan-10100001.zip | Bin .../dialects}/drivers/statcan-34100158.zip | Bin .../dialects}/drivers/statcan-datatables.json | 0 .../src/main/java/module-info.java | 18 ++--- .../ri/web/drivers/EurostatDriver2Test.java | 12 --- sdmx-dl-standalone/pom.xml | 5 ++ 34 files changed, 271 insertions(+), 129 deletions(-) create mode 100644 sdmx-dl-provider-dialects/pom.xml create mode 100644 sdmx-dl-provider-dialects/src/main/java/module-info.java rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java (92%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java (89%) rename {sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers}/DotStatRestParsers.java (97%) rename {sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers}/DotStatRestQueries.java (95%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java (94%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java (91%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java (95%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java (92%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java => sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java (98%) create mode 100644 sdmx-dl-provider-dialects/src/main/javadoc/EmptyJavaDoc.java rename {sdmx-dl-provider-ri/src/test/java/_test/sdmxdl/ri => sdmx-dl-provider-dialects/src/test/java/_tests}/RestClientResponseMock.java (97%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java (92%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriverTest.java (85%) create mode 100644 sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/EstatDialectDriverTest.java rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/ImfDialectDriverTest.java (85%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/InseeDialectDriverTest.java (84%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java (91%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java => sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java (92%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects}/drivers/statcan-10100001.zip (100%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects}/drivers/statcan-34100158.zip (100%) rename {sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web => sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects}/drivers/statcan-datatables.json (100%) delete mode 100644 sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 493790296..5614dcbe7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project - ![PROVIDER] Move PxWebDriver to its own module +- ![PROVIDER] Move dialects drivers to their own module - ![CLI] Use environment variables as default values - ![GRPC] Migrate gRPC module to Quarkus framework diff --git a/docs/content/api/_index.md b/docs/content/api/_index.md index d6f8fa3c0..44b2cbae5 100644 --- a/docs/content/api/_index.md +++ b/docs/content/api/_index.md @@ -21,6 +21,7 @@ flowchart BT provider-base[base] connectors ri + dialects px end testing diff --git a/docs/tmp/sources.csv b/docs/tmp/sources.csv index 0969810e7..b4dd92031 100644 --- a/docs/tmp/sources.csv +++ b/docs/tmp/sources.csv @@ -1,33 +1,33 @@ Name,Description,Aliases,Driver,Endpoint,Properties,Website,Monitor,MonitorWebsite,Languages ABS,Australian Bureau of Statistics,,ri:sdmx21,https://api.data.abs.gov.au,sdmxdl.driver.detailSupported=true,https://explore.data.abs.gov.au,upptime:/nbbrd/sdmx-upptime/ABS,https://nbbrd.github.io/sdmx-upptime/history/abs,en -BBK,Deutsche Bundesbank,,ri:bbk,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" +BBK,Deutsche Bundesbank,,dialects:bbk,https://api.statistiken.bundesbank.de/rest,,https://www.bundesbank.de/en/statistics/time-series-databases,upptime:/nbbrd/sdmx-upptime/BBK,https://nbbrd.github.io/sdmx-upptime/history/bbk,"en,de" BIS,Bank for International Settlements,,ri:sdmx21,https://stats.bis.org/api/v1,sdmxdl.driver.detailSupported=true,https://stats.bis.org/statx/toc/LBS.html,upptime:/nbbrd/sdmx-upptime/BIS,https://nbbrd.github.io/sdmx-upptime/history/bis,en CAMSTAT,National Institute of Statistics of Cambodia,,ri:sdmx21,https://nsiws-stable-camstat-live.officialstatistics.org/rest,,http://camstat.nis.gov.kh/?locale=en&start=0,upptime:/nbbrd/sdmx-upptime/CAMSTAT,https://nbbrd.github.io/sdmx-upptime/history/camstat,"en,km" ECB,European Central Bank,,ri:sdmx21,https://data-api.ecb.europa.eu/service,sdmxdl.driver.detailSupported=true,https://data.ecb.europa.eu/,upptime:/nbbrd/sdmx-upptime/ECB,https://nbbrd.github.io/sdmx-upptime/history/ecb,en -EC_DG_COMP,European Commission - Directorate General for Competition,,ri:estat,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en -EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,ri:estat,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en -EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,ri:estat,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en +EC_DG_COMP,European Commission - Directorate General for Competition,,dialects:estat,https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=comp,upptime:/nbbrd/sdmx-upptime/EC_DG_COMP,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp,en +EC_DG_EMPL,"European Commission - Directorate General for Employment, Social Affairs and inclusion",,dialects:estat,https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=empl,upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl,en +EC_DG_GROW,"European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs",,dialects:estat,https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1,,https://data.europa.eu/data/datasets?catalog=grow,upptime:/nbbrd/sdmx-upptime/EC_DG_GROW,https://nbbrd.github.io/sdmx-upptime/history/ec_dg_grow,en ESCAP,Economic and Social Commission for Asia and the Pacific,,ri:sdmx21,https://api-dataexplorer.unescap.org/rest,sdmxdl.driver.detailSupported=true,https://dataexplorer.unescap.org/,upptime:/nbbrd/sdmx-upptime/ESCAP,https://nbbrd.github.io/sdmx-upptime/history/escap,en -ESTAT,Eurostat,EUROSTAT,ri:estat,https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/data/database,upptime:/nbbrd/sdmx-upptime/ESTAT,https://nbbrd.github.io/sdmx-upptime/history/estat,"en,de,fr" -ESTAT_COMEXT,Eurostat - International trade in goods statistics (ITGS),,ri:estat,https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview,upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT,https://nbbrd.github.io/sdmx-upptime/history/estat_comext,en +ESTAT,Eurostat,EUROSTAT,dialects:estat,https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/data/database,upptime:/nbbrd/sdmx-upptime/ESTAT,https://nbbrd.github.io/sdmx-upptime/history/estat,"en,de,fr" +ESTAT_COMEXT,Eurostat - International trade in goods statistics (ITGS),,dialects:estat,https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1,,https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview,upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT,https://nbbrd.github.io/sdmx-upptime/history/estat_comext,en ILO,International Labour Organization,,ri:sdmx21,https://www.ilo.org/sdmx/rest,sdmxdl.driver.detailSupported=true,https://ilostat.ilo.org/data/,upptime:/nbbrd/sdmx-upptime/ILO,https://nbbrd.github.io/sdmx-upptime/history/ilo,"en,es,fr" -IMF,International Monetary Fund,,ri:imf,http://dataservices.imf.org/REST/SDMX_XML.svc,,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF,https://nbbrd.github.io/sdmx-upptime/history/imf,en +IMF,International Monetary Fund,,dialects:imf,http://dataservices.imf.org/REST/SDMX_XML.svc,,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF,https://nbbrd.github.io/sdmx-upptime/history/imf,en IMF_SDMX_CENTRAL,International Monetary Fund (SDMX Central),,ri:sdmx21,https://sdmxcentral.imf.org/ws/public/sdmxapi/rest,sdmxdl.driver.detailSupported=true,https://data.imf.org,upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL,https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central,"en,fr" INEGI,"National Institute of Statistics, Geography and Informatics",,ri:sdmx21,https://sdmx.snieg.mx/service/Rest,"sdmxdl.driver.detailSupported=true,sdmxdl.driver.trailingSlash=true",https://sdmx.snieg.mx,upptime:/nbbrd/sdmx-upptime/INEGI,https://nbbrd.github.io/sdmx-upptime/history/inegi,"en,es" -INSEE,National Institute of Statistics and Economic Studies,,ri:insee,https://bdm.insee.fr/series/sdmx,,https://www.insee.fr/fr/statistiques,upptime:/nbbrd/sdmx-upptime/INSEE,https://nbbrd.github.io/sdmx-upptime/history/insee,"en,fr" +INSEE,National Institute of Statistics and Economic Studies,,dialects:insee,https://bdm.insee.fr/series/sdmx,,https://www.insee.fr/fr/statistiques,upptime:/nbbrd/sdmx-upptime/INSEE,https://nbbrd.github.io/sdmx-upptime/history/insee,"en,fr" ISTAT,Italian National Institute of Statistics,,ri:sdmx21,https://esploradati.istat.it/SDMXWS/rest,sdmxdl.driver.detailSupported=true,https://esploradati.istat.it/databrowser/,upptime:/nbbrd/sdmx-upptime/ISTAT,https://nbbrd.github.io/sdmx-upptime/history/istat,"en,it" NB,Norges Bank,,ri:sdmx21,https://data.norges-bank.no/api,sdmxdl.driver.detailSupported=true,https://www.norges-bank.no/en/topics/Statistics/,upptime:/nbbrd/sdmx-upptime/NB,https://nbbrd.github.io/sdmx-upptime/history/nb,"en,no" -NBB,National Bank of Belgium,,ri:nbb,https://stat.nbb.be/restsdmx/sdmx.ashx,,https://stat.nbb.be,upptime:/nbbrd/sdmx-upptime/NBB,https://nbbrd.github.io/sdmx-upptime/history/nbb,"en,de,fr,nl" -OECD,The Organisation for Economic Co-operation and Development,,ri:dotstat,https://stats.oecd.org/restsdmx/sdmx.ashx,,https://stats.oecd.org,upptime:/nbbrd/sdmx-upptime/OECD,https://nbbrd.github.io/sdmx-upptime/history/oecd,"en,es,fr,it" -SE,Statistics Estonia,,ri:dotstat,http://andmebaas.stat.ee/restsdmx/sdmx.ashx,,http://andmebaas.stat.ee,upptime:/nbbrd/sdmx-upptime/SE,https://nbbrd.github.io/sdmx-upptime/history/se,"en,et" +NBB,National Bank of Belgium,,dialects:nbb,https://stat.nbb.be/restsdmx/sdmx.ashx,,https://stat.nbb.be,upptime:/nbbrd/sdmx-upptime/NBB,https://nbbrd.github.io/sdmx-upptime/history/nbb,"en,de,fr,nl" +OECD,The Organisation for Economic Co-operation and Development,,dialects:dotstat,https://stats.oecd.org/restsdmx/sdmx.ashx,,https://stats.oecd.org,upptime:/nbbrd/sdmx-upptime/OECD,https://nbbrd.github.io/sdmx-upptime/history/oecd,"en,es,fr,it" +SE,Statistics Estonia,,dialects:dotstat,http://andmebaas.stat.ee/restsdmx/sdmx.ashx,,http://andmebaas.stat.ee,upptime:/nbbrd/sdmx-upptime/SE,https://nbbrd.github.io/sdmx-upptime/history/se,"en,et" SGR,SDMX Global Registry,,ri:sdmx21,https://registry.sdmx.org/ws/rest,sdmxdl.driver.detailSupported=true,https://registry.sdmx.org/overview.html,upptime:/nbbrd/sdmx-upptime/SGR,https://nbbrd.github.io/sdmx-upptime/history/sgr,en SIMEL,El Salvador Labor Market Information System,,ri:sdmx21,https://disseminatesimel.mtps.gob.sv/rest,sdmxdl.driver.detailSupported=true,https://datasimel.mtps.gob.sv/,upptime:/nbbrd/sdmx-upptime/SIMEL,https://nbbrd.github.io/sdmx-upptime/history/simel,"en,es" SPC,Pacific Data Hub,,ri:sdmx21,https://stats-nsi-stable.pacificdata.org/rest,sdmxdl.driver.detailSupported=true,https://stats.pacificdata.org/?locale=en,upptime:/nbbrd/sdmx-upptime/SPC,https://nbbrd.github.io/sdmx-upptime/history/spc,"en,fr" -STATCAN,Statistics Canada,,ri:statcan,https://www150.statcan.gc.ca/t1/wds/rest,sdmxdl.driver.cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" +STATCAN,Statistics Canada,,dialects:statcan,https://www150.statcan.gc.ca/t1/wds/rest,sdmxdl.driver.cacheTtl=3600000,https://www150.statcan.gc.ca/n1/en/type/data?MM=1,upptime:/nbbrd/sdmx-upptime/STATCAN,https://nbbrd.github.io/sdmx-upptime/history/statcan,"en,fr" STATEC,National Institute of statistics and economic studies of the Grand Duchy of Luxembourg,,ri:sdmx21,https://lustat.statec.lu/rest,sdmxdl.driver.detailSupported=true,https://lustat.statec.lu,upptime:/nbbrd/sdmx-upptime/STATEC,https://nbbrd.github.io/sdmx-upptime/history/statec,"en,fr" TNSO,National Statistical Office of Thailand,,ri:sdmx21,https://ns1-oshub.nso.go.th/rest,sdmxdl.driver.detailSupported=true,https://oshub.nso.go.th/?lc=en,upptime:/nbbrd/sdmx-upptime/TNSO,https://nbbrd.github.io/sdmx-upptime/history/tnso,"en,th" -UIS,Unesco Institute for Statistics,,ri:dotstat,http://data.uis.unesco.org/RestSDMX/sdmx.ashx,,http://data.uis.unesco.org,upptime:/nbbrd/sdmx-upptime/UIS,https://nbbrd.github.io/sdmx-upptime/history/uis,"en,fr" -UKDS,UK Data Service,,ri:dotstat,https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx,,https://stats2.digitalresources.jisc.ac.uk/,upptime:/nbbrd/sdmx-upptime/UKDS,https://nbbrd.github.io/sdmx-upptime/history/ukds,en +UIS,Unesco Institute for Statistics,,dialects:dotstat,http://data.uis.unesco.org/RestSDMX/sdmx.ashx,,http://data.uis.unesco.org,upptime:/nbbrd/sdmx-upptime/UIS,https://nbbrd.github.io/sdmx-upptime/history/uis,"en,fr" +UKDS,UK Data Service,,dialects:dotstat,https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx,,https://stats2.digitalresources.jisc.ac.uk/,upptime:/nbbrd/sdmx-upptime/UKDS,https://nbbrd.github.io/sdmx-upptime/history/ukds,en UNDATA,Data access system to UN databases,,ri:sdmx21,https://data.un.org/WS/rest,sdmxdl.driver.detailSupported=true,https://data.un.org/SdmxBrowser/start,upptime:/nbbrd/sdmx-upptime/UNDATA,https://nbbrd.github.io/sdmx-upptime/history/undata,en UNICEF,UN International Children's Emergency Fund,,ri:sdmx21,https://sdmx.data.unicef.org/ws/public/sdmxapi/rest,sdmxdl.driver.detailSupported=true,https://data.unicef.org/,upptime:/nbbrd/sdmx-upptime/UNICEF,https://nbbrd.github.io/sdmx-upptime/history/unicef,en WB,World Bank,,ri:sdmx21,https://api.worldbank.org/v2/sdmx/rest,"sdmxdl.driver.detailSupported=true,sdmxdl.driver.trailingSlash=true",https://data.worldbank.org,upptime:/nbbrd/sdmx-upptime/WB,https://nbbrd.github.io/sdmx-upptime/history/wb,"en,es,fr" diff --git a/pom.xml b/pom.xml index fcd41a614..d1b36315d 100644 --- a/pom.xml +++ b/pom.xml @@ -237,6 +237,7 @@ sdmx-dl-format-xml sdmx-dl-provider-base sdmx-dl-provider-ri + sdmx-dl-provider-dialects sdmx-dl-provider-connectors sdmx-dl-provider-px sdmx-dl-testing diff --git a/sdmx-dl-bom/pom.xml b/sdmx-dl-bom/pom.xml index 2def4890a..ffc1c80ef 100644 --- a/sdmx-dl-bom/pom.xml +++ b/sdmx-dl-bom/pom.xml @@ -80,6 +80,16 @@ ${project.groupId} ${project.version} + + sdmx-dl-provider-dialects + ${project.groupId} + ${project.version} + + + sdmx-dl-provider-px + ${project.groupId} + ${project.version} + sdmx-dl-provider-base ${project.groupId} diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index e77ed0587..5d4c72220 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -60,6 +60,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-dialects + ${project.version} + ${project.groupId} sdmx-dl-provider-px diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 00c6ce517..02b1d4c0d 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -68,6 +68,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-dialects + ${project.version} + ${project.groupId} sdmx-dl-provider-px diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 69c903d8b..84c05a327 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -54,6 +54,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-dialects + ${project.version} + ${project.groupId} sdmx-dl-provider-px diff --git a/sdmx-dl-provider-dialects/pom.xml b/sdmx-dl-provider-dialects/pom.xml new file mode 100644 index 000000000..dfe8a5533 --- /dev/null +++ b/sdmx-dl-provider-dialects/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + + com.github.nbbrd.sdmx-dl + sdmx-dl-parent + 3.0.0-beta.12-SNAPSHOT + + + sdmx-dl-provider-dialects + jar + + sdmx-dl-provider-dialects + Easily download official statistics - Dialects + https://github.com/nbbrd/sdmx-dl + + + + + org.checkerframework + checker-qual + provided + + + org.projectlombok + lombok + provided + + + com.github.nbbrd.java-service-util + java-service-processor + provided + + + com.github.nbbrd.java-design-util + java-design-processor + provided + + + + + ${project.groupId} + sdmx-dl-provider-ri + ${project.version} + + + + + ${project.groupId} + sdmx-dl-api + ${project.version} + tests + test-jar + test + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + \ No newline at end of file diff --git a/sdmx-dl-provider-dialects/src/main/java/module-info.java b/sdmx-dl-provider-dialects/src/main/java/module-info.java new file mode 100644 index 000000000..0bf4a0169 --- /dev/null +++ b/sdmx-dl-provider-dialects/src/main/java/module-info.java @@ -0,0 +1,25 @@ +import sdmxdl.provider.dialects.drivers.*; +import sdmxdl.web.spi.Driver; + +module sdmxdl.provider.dialects { + + requires static lombok; + requires static nbbrd.design; + requires static nbbrd.service; + requires static org.checkerframework.checker.qual; + + requires sdmxdl.api; + requires sdmxdl.format.xml; + requires sdmxdl.provider.ri; + requires sdmxdl.provider.base; + requires com.google.gson; + + provides Driver with + BbkDialectDriver, + DotStatDialectDriver, + EstatDialectDriver, + ImfDialectDriver, + InseeDialectDriver, + NbbDialectDriver, + StatCanDialectDriver; +} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java similarity index 92% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java index 3b5e41cff..b245b96b1 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/BbkDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import internal.util.http.URLQueryBuilder; +import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.service.ServiceProvider; import sdmxdl.*; @@ -41,24 +42,25 @@ /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) -public final class BbkDriver implements Driver { +@DirectImpl +@ServiceProvider +public final class BbkDialectDriver implements Driver { - private static final String RI_BBK = "ri:bbk"; + private static final String DIALECTS_BBK = "dialects:bbk"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_BBK) + .id(DIALECTS_BBK) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(BbkDriver::newClient)) + .connector(RestConnector.of(BbkDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("BBK") .name("en", "Deutsche Bundesbank") .name("de", "Deutsche Bundesbank") - .driver(RI_BBK) + .driver(DIALECTS_BBK) .endpointOf("https://api.statistiken.bundesbank.de/rest") .websiteOf("https://www.bundesbank.de/en/statistics/time-series-databases") .monitorOf("upptime:/nbbrd/sdmx-upptime/BBK") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java similarity index 89% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java index 9f6383bf5..427965c85 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java @@ -14,10 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; -import sdmxdl.provider.ri.web.DotStatRestParsers; -import sdmxdl.provider.ri.web.DotStatRestQueries; +import nbbrd.design.DirectImpl; import sdmxdl.provider.ri.web.RiRestClient; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; @@ -41,17 +40,18 @@ /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) -public final class DotStatDriver2 implements Driver { +@DirectImpl +@ServiceProvider +public final class DotStatDialectDriver implements Driver { - private static final String RI_DOTSTAT = "ri:dotstat"; + private static final String DIALECTS_DOTSTAT = "dialects:dotstat"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_DOTSTAT) + .id(DIALECTS_DOTSTAT) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(DotStatDriver2::newClient)) + .connector(RestConnector.of(DotStatDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() @@ -60,7 +60,7 @@ public final class DotStatDriver2 implements Driver { .name("es", "Organización para la Cooperación y el Desarrollo Económicos") .name("fr", "Organisation de coopération et de développement économiques") .name("it", "Organizzazione per la Cooperazione e lo Sviluppo Economico") - .driver(RI_DOTSTAT) + .driver(DIALECTS_DOTSTAT) .endpointOf("https://stats.oecd.org/restsdmx/sdmx.ashx") .websiteOf("https://stats.oecd.org") .monitorOf("upptime:/nbbrd/sdmx-upptime/OECD") @@ -71,7 +71,7 @@ public final class DotStatDriver2 implements Driver { .id("SE") .name("en", "Statistics Estonia") .name("et", "Statistikaameti") - .driver(RI_DOTSTAT) + .driver(DIALECTS_DOTSTAT) .endpointOf("http://andmebaas.stat.ee/restsdmx/sdmx.ashx") .websiteOf("http://andmebaas.stat.ee") .monitorOf("upptime:/nbbrd/sdmx-upptime/SE") @@ -82,7 +82,7 @@ public final class DotStatDriver2 implements Driver { .id("UIS") .name("en", "Unesco Institute for Statistics") .name("fr", "Unesco Institut de statistique") - .driver(RI_DOTSTAT) + .driver(DIALECTS_DOTSTAT) .endpointOf(UIS_ENDPOINT) .websiteOf("http://data.uis.unesco.org") .monitorOf("upptime:/nbbrd/sdmx-upptime/UIS") @@ -92,7 +92,7 @@ public final class DotStatDriver2 implements Driver { .builder() .id("UKDS") .name("en", "UK Data Service") - .driver(RI_DOTSTAT) + .driver(DIALECTS_DOTSTAT) .endpointOf("https://stats2.digitalresources.jisc.ac.uk/restsdmx/sdmx.ashx") .websiteOf("https://stats2.digitalresources.jisc.ac.uk/") .monitorOf("upptime:/nbbrd/sdmx-upptime/UKDS") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java index 3a0056f50..a73eaf7ff 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestParsers.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.dialects.drivers; import lombok.NonNull; import nbbrd.io.FileParser; @@ -10,6 +10,7 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.SdmxFix; +import sdmxdl.provider.ri.web.RiRestParsers; import java.util.List; import java.util.Optional; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java similarity index 95% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java index c268d7b82..e346dcc18 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/DotStatRestQueries.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.dialects.drivers; import internal.util.http.URLQueryBuilder; import lombok.NonNull; @@ -6,6 +6,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.DataflowRef; import sdmxdl.provider.DataRef; +import sdmxdl.provider.ri.web.RiRestQueries; import java.net.URL; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java similarity index 94% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java index 168183cec..0ef66ae40 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import internal.util.http.HttpClient; import internal.util.http.HttpRequest; @@ -22,6 +22,7 @@ import internal.util.http.HttpResponseException; import internal.util.http.ext.InterceptingClient; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.io.Resource; import nbbrd.io.net.MediaType; import nbbrd.io.text.IntProperty; @@ -64,8 +65,9 @@ /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) -public final class EurostatDriver2 implements Driver { +@DirectImpl +@ServiceProvider +public final class EstatDialectDriver implements Driver { public static final IntProperty ASYNC_MAX_RETRIES_PROPERTY = IntProperty.of(DRIVER_PROPERTY_PREFIX + ".asyncMaxRetries", 10); @@ -73,14 +75,14 @@ public final class EurostatDriver2 implements Driver { public static final LongProperty ASYNC_SLEEP_TIME_PROPERTY = LongProperty.of(DRIVER_PROPERTY_PREFIX + ".asyncSleepTime", 6000); - private static final String RI_EUROSTAT = "ri:estat"; + private static final String DIALECTS_EUROSTAT = "dialects:estat"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_EUROSTAT) + .id(DIALECTS_EUROSTAT) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(EurostatDriver2::newClient)) + .connector(RestConnector.of(EstatDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .propertyOf(ASYNC_MAX_RETRIES_PROPERTY) .propertyOf(ASYNC_SLEEP_TIME_PROPERTY) @@ -91,7 +93,7 @@ public final class EurostatDriver2 implements Driver { .name("en", "Eurostat") .name("de", "Eurostat") .name("fr", "Eurostat") - .driver(RI_EUROSTAT) + .driver(DIALECTS_EUROSTAT) .endpointOf("https://ec.europa.eu/eurostat/api/dissemination/sdmx/2.1") .websiteOf("https://ec.europa.eu/eurostat/data/database") .monitorOf("upptime:/nbbrd/sdmx-upptime/ESTAT") @@ -101,7 +103,7 @@ public final class EurostatDriver2 implements Driver { .builder() .id("ESTAT_COMEXT") .name("en", "Eurostat - International trade in goods statistics (ITGS)") - .driver(RI_EUROSTAT) + .driver(DIALECTS_EUROSTAT) .endpointOf("https://ec.europa.eu/eurostat/api/comext/dissemination/sdmx/2.1") .websiteOf("https://ec.europa.eu/eurostat/web/international-trade-in-goods/overview") .monitorOf("upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT") @@ -111,7 +113,7 @@ public final class EurostatDriver2 implements Driver { .builder() .id("EC_DG_COMP") .name("en", "European Commission - Directorate General for Competition") - .driver(RI_EUROSTAT) + .driver(DIALECTS_EUROSTAT) .endpointOf("https://webgate.ec.europa.eu/comp/redisstat/api/dissemination/sdmx/2.1") .websiteOf("https://data.europa.eu/data/datasets?catalog=comp") .monitorOf("upptime:/nbbrd/sdmx-upptime/EC_DG_COMP") @@ -121,7 +123,7 @@ public final class EurostatDriver2 implements Driver { .builder() .id("EC_DG_EMPL") .name("en", "European Commission - Directorate General for Employment, Social Affairs and inclusion") - .driver(RI_EUROSTAT) + .driver(DIALECTS_EUROSTAT) .endpointOf("https://webgate.ec.europa.eu/empl/redisstat/api/dissemination/sdmx/2.1") .websiteOf("https://data.europa.eu/data/datasets?catalog=empl") .monitorOf("upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL") @@ -131,7 +133,7 @@ public final class EurostatDriver2 implements Driver { .builder() .id("EC_DG_GROW") .name("en", "European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs") - .driver(RI_EUROSTAT) + .driver(DIALECTS_EUROSTAT) .endpointOf("https://webgate.ec.europa.eu/grow/redisstat/api/dissemination/sdmx/2.1") .websiteOf("https://data.europa.eu/data/datasets?catalog=grow") .monitorOf("upptime:/nbbrd/sdmx-upptime/EC_DG_GROW") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java similarity index 91% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java index 2fd8daf58..93bd7d42a 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/ImfDriver2.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java @@ -14,10 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; -import sdmxdl.provider.ri.web.DotStatRestParsers; -import sdmxdl.provider.ri.web.DotStatRestQueries; +import nbbrd.design.DirectImpl; import sdmxdl.provider.ri.web.RiRestClient; import internal.util.http.URLQueryBuilder; import lombok.NonNull; @@ -50,23 +49,24 @@ /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider -public final class ImfDriver2 implements Driver { +public final class ImfDialectDriver implements Driver { - private static final String RI_IMF = "ri:imf"; + private static final String DIALECTS_IMF = "dialects:imf"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_IMF) + .id(DIALECTS_IMF) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(ImfDriver2::newClient)) + .connector(RestConnector.of(ImfDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() .id("IMF") .name("en", "International Monetary Fund") - .driver(RI_IMF) + .driver(DIALECTS_IMF) .endpointOf("http://dataservices.imf.org/REST/SDMX_XML.svc") .websiteOf("https://data.imf.org") .monitorOf("upptime:/nbbrd/sdmx-upptime/IMF") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java similarity index 95% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java index e3b2bba63..8a447f641 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/InseeDriver2.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java @@ -14,9 +14,10 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.io.FileParser; import nbbrd.io.function.IOFunction; @@ -51,15 +52,16 @@ /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) -public final class InseeDriver2 implements Driver { +@DirectImpl +@ServiceProvider +public final class InseeDialectDriver implements Driver { - private static final String RI_INSEE = "ri:insee"; + private static final String DIALECTS_INSEE = "dialects:insee"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_INSEE) + .id(DIALECTS_INSEE) .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(InseeRestClient::new)) .properties(RI_CONNECTION_PROPERTIES) @@ -68,7 +70,7 @@ public final class InseeDriver2 implements Driver { .id("INSEE") .name("en", "National Institute of Statistics and Economic Studies") .name("fr", "Institut national de la statistique et des études économiques") - .driver(RI_INSEE) + .driver(DIALECTS_INSEE) .endpointOf("https://bdm.insee.fr/series/sdmx") .websiteOf("https://www.insee.fr/fr/statistiques") .monitorOf("upptime:/nbbrd/sdmx-upptime/INSEE") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java similarity index 92% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java index 739375dcc..16e40ff82 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/NbbDriver2.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import internal.util.http.HttpClient; import internal.util.http.HttpResponse; @@ -22,6 +22,7 @@ import internal.util.http.URLQueryBuilder; import internal.util.http.ext.InterceptingClient; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.io.net.MediaType; import nbbrd.service.ServiceProvider; @@ -52,17 +53,18 @@ /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) -public final class NbbDriver2 implements Driver { +@DirectImpl +@ServiceProvider +public final class NbbDialectDriver implements Driver { - private static final String RI_NBB = "ri:nbb"; + private static final String DIALECTS_NBB = "dialects:nbb"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_NBB) + .id(DIALECTS_NBB) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(NbbDriver2::newClient)) + .connector(RestConnector.of(NbbDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .source(SdmxWebSource .builder() @@ -71,7 +73,7 @@ public final class NbbDriver2 implements Driver { .name("de", "Belgische National Bank") .name("fr", "Banque Nationale de Belgique") .name("nl", "Nationale Bank van België") - .driver(RI_NBB) + .driver(DIALECTS_NBB) .endpointOf("https://stat.nbb.be/restsdmx/sdmx.ashx") .websiteOf("https://stat.nbb.be") .monitorOf("upptime:/nbbrd/sdmx-upptime/NBB") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java rename to sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java index cfea91be9..c98fd1bad 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/StatCanDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import com.google.gson.*; import internal.util.http.HttpClient; @@ -6,6 +6,7 @@ import internal.util.http.HttpResponse; import internal.util.http.URLQueryBuilder; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.MightBePromoted; import nbbrd.design.VisibleForTesting; import nbbrd.io.FileParser; @@ -51,17 +52,18 @@ import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; import static sdmxdl.provider.web.WebValidators.dataflowRefOf; +@DirectImpl @ServiceProvider -public final class StatCanDriver implements Driver { +public final class StatCanDialectDriver implements Driver { - private static final String RI_STATCAN = "ri:statcan"; + private static final String DIALECTS_STATCAN = "dialects:statcan"; @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_STATCAN) + .id(DIALECTS_STATCAN) .rank(NATIVE_DRIVER_RANK) - .connector(StatCanDriver::newConnection) + .connector(StatCanDialectDriver::newConnection) .properties(RI_CONNECTION_PROPERTIES) .propertyOf(CACHE_TTL_PROPERTY) .source(SdmxWebSource @@ -69,7 +71,7 @@ public final class StatCanDriver implements Driver { .id("STATCAN") .name("en", "Statistics Canada") .name("fr", "Statistique Canada") - .driver(RI_STATCAN) + .driver(DIALECTS_STATCAN) .endpointOf("https://www150.statcan.gc.ca/t1/wds/rest") .websiteOf("https://www150.statcan.gc.ca/n1/en/type/data?MM=1") .propertyOf(CACHE_TTL_PROPERTY, Long.toString(Duration.ofHours(1).toMillis())) diff --git a/sdmx-dl-provider-dialects/src/main/javadoc/EmptyJavaDoc.java b/sdmx-dl-provider-dialects/src/main/javadoc/EmptyJavaDoc.java new file mode 100644 index 000000000..530579d47 --- /dev/null +++ b/sdmx-dl-provider-dialects/src/main/javadoc/EmptyJavaDoc.java @@ -0,0 +1,6 @@ +/** + * Workaround for JavaDoc issues with Lombok. + */ +public class EmptyJavaDoc { + +} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/test/java/_test/sdmxdl/ri/RestClientResponseMock.java b/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java similarity index 97% rename from sdmx-dl-provider-ri/src/test/java/_test/sdmxdl/ri/RestClientResponseMock.java rename to sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java index 7d0b7cf7a..7454cc347 100644 --- a/sdmx-dl-provider-ri/src/test/java/_test/sdmxdl/ri/RestClientResponseMock.java +++ b/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java @@ -1,4 +1,4 @@ -package _test.sdmxdl.ri; +package _tests; import internal.util.http.HttpResponse; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java similarity index 92% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java index d63c3911a..906cdd550 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/BbkDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import org.junit.jupiter.api.Test; import sdmxdl.DataQuery; @@ -34,18 +34,18 @@ /** * @author Philippe Charles */ -public class BbkDriverTest { +public class BbkDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new BbkDriver()); + DriverAssert.assertCompliance(new BbkDialectDriver()); } @Test public void testQueries() throws MalformedURLException { URL endpoint = new URL(" https://api.statistiken.bundesbank.de/rest"); - BbkDriver.BbkQueries queries = new BbkDriver.BbkQueries(); + BbkDialectDriver.BbkQueries queries = new BbkDialectDriver.BbkQueries(); assertThat(queries.getFlowsQuery(endpoint).build()) .describedAs("SdmxFix#1 + SdmxFix#2 + SdmxFix#3") diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriverTest.java similarity index 85% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriverTest.java index 9fe24c859..ff9199e2f 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/ImfDriver2Test.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriverTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.spi.DriverAssert; @@ -22,10 +22,10 @@ /** * @author Philippe Charles */ -public class ImfDriver2Test { +public class DotStatDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new ImfDriver2()); + DriverAssert.assertCompliance(new DotStatDialectDriver()); } } diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/EstatDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/EstatDialectDriverTest.java new file mode 100644 index 000000000..133ca545a --- /dev/null +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/EstatDialectDriverTest.java @@ -0,0 +1,12 @@ +package sdmxdl.provider.dialects.drivers; + +import org.junit.jupiter.api.Test; +import tests.sdmxdl.web.spi.DriverAssert; + +public class EstatDialectDriverTest { + + @Test + public void testCompliance() { + DriverAssert.assertCompliance(new EstatDialectDriver()); + } +} diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/ImfDialectDriverTest.java similarity index 85% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/ImfDialectDriverTest.java index 512123e9f..a9bfbf66a 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/DotStatDriver2Test.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/ImfDialectDriverTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.spi.DriverAssert; @@ -22,10 +22,10 @@ /** * @author Philippe Charles */ -public class DotStatDriver2Test { +public class ImfDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new DotStatDriver2()); + DriverAssert.assertCompliance(new ImfDialectDriver()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/InseeDialectDriverTest.java similarity index 84% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/InseeDialectDriverTest.java index f44893910..6272afe38 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/InseeDriver2Test.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/InseeDialectDriverTest.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; @@ -9,22 +9,22 @@ import java.time.Year; import java.time.YearMonth; -import static sdmxdl.provider.ri.web.drivers.InseeDriver2.REPORTING_TWO_MONTH; +import static sdmxdl.provider.dialects.drivers.InseeDialectDriver.REPORTING_TWO_MONTH; import static org.assertj.core.api.Assertions.assertThat; import static sdmxdl.format.time.StandardReportingFormat.REPORTING_QUARTER; import static sdmxdl.format.time.StandardReportingFormat.REPORTING_SEMESTER; import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; -public class InseeDriver2Test { +public class InseeDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new InseeDriver2()); + DriverAssert.assertCompliance(new InseeDialectDriver()); } @Test public void testPeriodParser() { - Parser x = InseeDriver2.EXTENDED_TIME_PARSER; + Parser x = InseeDialectDriver.EXTENDED_TIME_PARSER; assertThat(x.parse("2013")).isEqualTo(GregorianTimePeriod.Year.of(Year.of(2013))); assertThat(x.parse("1990-09")).isEqualTo(GregorianTimePeriod.YearMonth.of(YearMonth.of(1990, 9))); assertThat(x.parse("2014-Q3")).isEqualTo(ReportingTimePeriod.of(REPORTING_QUARTER, StandardReportingPeriod.parse("2014-Q3"))); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java similarity index 91% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java index c1272ef00..edf331764 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/NbbDriver2Test.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java @@ -14,9 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; -import _test.sdmxdl.ri.RestClientResponseMock; +import _tests.RestClientResponseMock; import sdmxdl.provider.ri.web.RiRestClient; import internal.util.http.HttpResponseException; import nbbrd.io.net.MediaType; @@ -32,25 +32,25 @@ import java.net.URL; import java.util.concurrent.atomic.AtomicInteger; -import static sdmxdl.provider.ri.web.drivers.NbbDriver2.checkInternalErrorRedirect; +import static sdmxdl.provider.dialects.drivers.NbbDialectDriver.checkInternalErrorRedirect; import static org.assertj.core.api.Assertions.*; import static sdmxdl.DataDetail.FULL; /** * @author Philippe Charles */ -public class NbbDriver2Test { +public class NbbDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new NbbDriver2()); + DriverAssert.assertCompliance(new NbbDialectDriver()); } @Test public void testQueries() throws MalformedURLException { URL endpoint = new URL("https://stat.nbb.be/restsdmx/sdmx.ashx"); - NbbDriver2.NbbQueries queries = new NbbDriver2.NbbQueries(); + NbbDialectDriver.NbbQueries queries = new NbbDialectDriver.NbbQueries(); assertThat(queries.getDataQuery(endpoint, DataRef.of(DataflowRef.parse("EXR"), DataQuery.builder().key(Key.parse("AUD.M")).detail(FULL).build()), DataStructureRef.parse("abc"))) .describedAs("SdmxFix#1") @@ -103,7 +103,7 @@ public void testCheckInternalErrorRedirect() { } private RiRestClient newClient(RestClientResponseMock response) throws MalformedURLException { - return NbbDriver2.newClient( + return NbbDialectDriver.newClient( Marker.parse("NBBFIX2"), new URL("https://stat.nbb.be/restsdmx/sdmx.ashx"), Languages.ANY, diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java similarity index 92% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java rename to sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java index 8c1407ab0..1efcf21df 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/StatCanDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.dialects.drivers; import nbbrd.design.MightBePromoted; import nbbrd.io.Resource; @@ -24,18 +24,18 @@ import static org.assertj.core.api.Assertions.*; import static sdmxdl.Languages.ANY; -import static sdmxdl.provider.ri.web.drivers.StatCanDriver.Converter.*; +import static sdmxdl.provider.dialects.drivers.StatCanDialectDriver.Converter.*; -public class StatCanDriverTest { +public class StatCanDialectDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new StatCanDriver()); + DriverAssert.assertCompliance(new StatCanDialectDriver()); } @Test public void testConnectionArgs() throws IOException { - StatCanDriver driver = new StatCanDriver(); + StatCanDialectDriver driver = new StatCanDialectDriver(); SdmxWebSource source = driver.getDefaultSources().iterator().next(); try (Connection connection = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { DataflowRef badDataflowRef = DataflowRef.parse("F_10100001"); @@ -61,11 +61,11 @@ public void testConnectionArgs() throws IOException { @Test public void testDataTableParseAll() throws IOException { - TextParser x = TextParser.onParsingReader(StatCanDriver.DataTable::parseAll); + TextParser x = TextParser.onParsingReader(StatCanDialectDriver.DataTable::parseAll); - Assertions.assertThat(x.parseResource(StatCanDriverTest.class, "statcan-datatables.json", StandardCharsets.UTF_8)) + Assertions.assertThat(x.parseResource(StatCanDialectDriverTest.class, "statcan-datatables.json", StandardCharsets.UTF_8)) .hasSize(2) - .contains(new StatCanDriver.DataTable( + .contains(new StatCanDialectDriver.DataTable( 10100001, "Federal public sector employment reconciliation of Treasury Board of Canada Secretariat, Public Service Commission of Canada and Statistics Canada statistical universes, as at December 31", "Emploi du secteur public fédéral rapprochement des univers statistiques du Secrétariat du Conseil du Trésor du Canada, de la Commission de la fonction publique du Canada et de Statistique Canada, au 31 décembre" @@ -138,7 +138,7 @@ public void testToDataStructureRef() { public void testToSdmxRepository(@TempDir File tmp) throws IOException { String fileName = "statcan-10100001.zip"; File x = new File(tmp, fileName); - Files.copy(StatCanDriverTest.class.getResourceAsStream(fileName), x.toPath()); + Files.copy(StatCanDialectDriverTest.class.getResourceAsStream(fileName), x.toPath()); Map labels = new HashMap<>(); labels.put(ANY, "Data Structure"); @@ -176,7 +176,7 @@ public void testToSdmxRepository(@TempDir File tmp) throws IOException { public void testRevisions(@TempDir File tmp) throws IOException { String fileName = "statcan-34100158.zip"; File x = new File(tmp, fileName); - try (InputStream stream = Resource.newInputStream(StatCanDriverTest.class, fileName)) { + try (InputStream stream = Resource.newInputStream(StatCanDialectDriverTest.class, fileName)) { Files.copy(stream, x.toPath()); } diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip b/sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-10100001.zip similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-10100001.zip rename to sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-10100001.zip diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip b/sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-34100158.zip similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-34100158.zip rename to sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-34100158.zip diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-datatables.json b/sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-datatables.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/statcan-datatables.json rename to sdmx-dl-provider-dialects/src/test/resources/sdmxdl/provider/dialects/drivers/statcan-datatables.json diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index c9e18a957..fcb997e93 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -3,7 +3,9 @@ import sdmxdl.provider.ri.caching.RiCaching; import sdmxdl.provider.ri.file.readers.XmlReader; import sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; -import sdmxdl.provider.ri.web.drivers.*; +import sdmxdl.provider.ri.web.drivers.FileDriver; +import sdmxdl.provider.ri.web.drivers.RngDriver; +import sdmxdl.provider.ri.web.drivers.Sdmx21Driver2; import sdmxdl.provider.ri.web.monitors.UpptimeMonitor; import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitor; import sdmxdl.provider.ri.web.networking.RiNetworking; @@ -26,20 +28,14 @@ requires nbbrd.io.curl; requires nbbrd.net.proxy; - exports sdmxdl.provider.ri.web to sdmxdl.provider.px; - exports internal.util.http to sdmxdl.provider.px; + exports sdmxdl.provider.ri.web to sdmxdl.provider.dialects, sdmxdl.provider.px; + exports internal.util.http to sdmxdl.provider.dialects, sdmxdl.provider.px; + exports internal.util.http.ext to sdmxdl.provider.dialects, sdmxdl.provider.px; provides Driver with - BbkDriver, - DotStatDriver2, - EurostatDriver2, FileDriver, - ImfDriver2, - InseeDriver2, - NbbDriver2, RngDriver, - Sdmx21Driver2, - StatCanDriver; + Sdmx21Driver2; provides Reader with XmlReader; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java deleted file mode 100644 index 51200bb93..000000000 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/EurostatDriver2Test.java +++ /dev/null @@ -1,12 +0,0 @@ -package sdmxdl.provider.ri.web.drivers; - -import org.junit.jupiter.api.Test; -import tests.sdmxdl.web.spi.DriverAssert; - -public class EurostatDriver2Test { - - @Test - public void testCompliance() { - DriverAssert.assertCompliance(new EurostatDriver2()); - } -} diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index 3cb0624ba..0d3e247c4 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -22,6 +22,11 @@ sdmx-dl-provider-ri ${project.version} + + ${project.groupId} + sdmx-dl-provider-dialects + ${project.version} + ${project.groupId} sdmx-dl-provider-px From 28379097a657206703573a91af55cc54d97e9348 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 29 Aug 2023 11:12:26 +0200 Subject: [PATCH 068/114] Code cleanup --- .../sdmxdl/cli/NetworkingOptions.java | 2 +- .../java/internal/sdmxdl/cli/WebOptions.java | 2 +- sdmx-dl-cli/src/test/java/_demo/Demo.java | 2 +- .../src/test/java/_test/FileSample.java | 5 ++-- .../sdmxdl/desktop/DesktopWebFactory.java | 3 ++- .../src/main/java/module-info.java | 1 + .../java/sdmxdl/format/kryo/KryoProvider.java | 4 ++- .../src/main/java/module-info.java | 1 + .../sdmxdl/format/protobuf/JsonProvider.java | 4 ++- .../format/protobuf/ProtobufProvider.java | 4 ++- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 2 +- sdmx-dl-provider-connectors/pom.xml | 5 ++++ .../src/main/java/module-info.java | 1 + .../connectors/{ => drivers}/Connectors.java | 2 +- .../{ => drivers}/ConnectorsConfigFix.java | 2 +- .../{ => drivers}/ConnectorsRestClient.java | 2 +- .../connectors/drivers/EurostatDriver.java | 7 ++--- .../{ => drivers}/HasDetailSupported.java | 2 +- .../connectors/drivers/ImfDriver.java | 7 ++--- .../connectors/drivers/InseeDriver.java | 6 ++--- .../connectors/drivers/NbbDriver.java | 5 ++-- .../connectors/drivers/OecdDriver.java | 7 ++--- .../PortableTimeSeriesCursor.java | 2 +- .../connectors/drivers/Sdmx20Driver.java | 7 ++--- .../connectors/drivers/Sdmx21Driver.java | 10 +++---- .../provider/connectors/drivers/SeDriver.java | 3 ++- .../connectors/drivers/UisDriver.java | 3 ++- .../samples/ConnectorsResource.java | 4 +-- .../{ => drivers}/ConnectorsTest.java | 4 +-- .../PortableTimeSeriesCursorTest.java | 6 ++--- .../dialects/drivers/BbkDialectDriver.java | 4 +-- .../drivers/DotStatDialectDriver.java | 4 +-- .../dialects/drivers/DotStatRestParsers.java | 2 +- .../dialects/drivers/DotStatRestQueries.java | 2 +- .../dialects/drivers/EstatDialectDriver.java | 6 ++--- .../dialects/drivers/ImfDialectDriver.java | 4 +-- .../dialects/drivers/InseeDialectDriver.java | 4 +-- .../dialects/drivers/NbbDialectDriver.java | 6 +++-- .../drivers/StatCanDialectDriver.java | 4 +-- .../drivers/NbbDialectDriverTest.java | 2 +- .../provider/px/drivers/PxWebDriver.java | 10 ++++--- .../src/main/java/module-info.java | 26 +++++++++---------- .../WinPasswordVaultAuthenticator.java | 4 ++- .../sdmxdl/provider/ri/caching/RiCaching.java | 2 ++ .../FileRiDriver.java} | 6 +++-- .../ri/{web => drivers}/RiHttpUtils.java | 2 +- .../ri/{web => drivers}/RiRestClient.java | 2 +- .../ri/{web => drivers}/RiRestErrors.java | 2 +- .../ri/{web => drivers}/RiRestParsers.java | 2 +- .../ri/{web => drivers}/RiRestQueries.java | 2 +- .../RngRiDriver.java} | 8 +++--- .../ri/{web => drivers}/Sdmx21RestErrors.java | 2 +- .../{web => drivers}/Sdmx21RestParsers.java | 4 +-- .../{web => drivers}/Sdmx21RestQueries.java | 2 +- .../Sdmx21RiDriver.java} | 13 +++++----- .../ri/{web => drivers}/SourceProperties.java | 2 +- .../ri/{web => }/monitors/UpptimeId.java | 2 +- .../ri/{web => }/monitors/UpptimeMonitor.java | 6 +++-- .../ri/{web => }/monitors/UpptimeSummary.java | 4 +-- .../ri/{web => }/monitors/UptimeRobotId.java | 2 +- .../monitors/UptimeRobotMonitor.java | 4 ++- .../ri/{web => }/networking/RiNetwork.java | 2 +- .../ri/{web => }/networking/RiNetworking.java | 4 ++- .../ri/{web => }/networking/RiSSLFactory.java | 2 +- .../ri/{file => readers}/Decoder.java | 2 +- .../ri/{file => readers}/XmlDecoder.java | 2 +- .../ri/{file => readers}/XmlFileClient.java | 2 +- .../ri/{file => }/readers/XmlReader.java | 8 +++--- .../FileRiDriverTest.java} | 10 +++---- .../ri/{web => drivers}/RiHttpUtilsTest.java | 3 ++- .../ri/{web => drivers}/RiRestClientTest.java | 10 +++---- .../{web => drivers}/RiRestParsersTest.java | 4 +-- .../RngRiDriverTest.java} | 8 +++--- .../Sdmx21RestParsersTest.java | 4 +-- .../Sdmx21RestQueriesTest.java | 4 +-- .../Sdmx21RiDriverTest.java} | 6 ++--- .../ri/{web => }/monitors/UpptimeIdTest.java | 3 ++- .../monitors/UpptimeMonitorTest.java | 3 ++- .../monitors/UpptimeSummaryTest.java | 2 +- .../ri/{web => }/monitors/UpptimeTest.java | 4 ++- .../{web => }/monitors/UptimeRobotIdTest.java | 3 ++- .../monitors/UptimeRobotMonitorTest.java | 3 ++- .../networking/RiNetworkingTest.java | 3 ++- .../networking/RiSSLFactoryTest.java | 3 ++- .../{file => readers}/XmlFileClientTest.java | 8 +++--- .../ri/{file => }/readers/XmlReaderTest.java | 3 ++- .../{web => }/drivers/doris-table-query.json | 0 .../ri/{web => }/monitors/summary.json | 0 .../main/java/sdmxdl/testing/OtherRules.java | 2 ++ .../main/java/sdmxdl/testing/RangeRules.java | 2 ++ 90 files changed, 211 insertions(+), 159 deletions(-) rename sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/{ => drivers}/Connectors.java (99%) rename sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/{ => drivers}/ConnectorsConfigFix.java (98%) rename sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/{ => drivers}/ConnectorsRestClient.java (99%) rename sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/{ => drivers}/HasDetailSupported.java (94%) rename sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/{ => drivers}/PortableTimeSeriesCursor.java (99%) rename sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/{ => drivers}/ConnectorsTest.java (97%) rename sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/{ => drivers}/PortableTimeSeriesCursorTest.java (95%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/authenticators/WinPasswordVaultAuthenticator.java (94%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web/drivers/FileDriver.java => drivers/FileRiDriver.java} (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/RiHttpUtils.java (99%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/RiRestClient.java (99%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/RiRestErrors.java (93%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/RiRestParsers.java (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/RiRestQueries.java (95%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web/drivers/RngDriver.java => drivers/RngRiDriver.java} (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/Sdmx21RestErrors.java (96%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/Sdmx21RestParsers.java (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/Sdmx21RestQueries.java (98%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web/drivers/Sdmx21Driver2.java => drivers/Sdmx21RiDriver.java} (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => drivers}/SourceProperties.java (96%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeId.java (98%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeMonitor.java (96%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeSummary.java (95%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/monitors/UptimeRobotId.java (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/monitors/UptimeRobotMonitor.java (98%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/networking/RiNetwork.java (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/networking/RiNetworking.java (96%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{web => }/networking/RiSSLFactory.java (97%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{file => readers}/Decoder.java (96%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{file => readers}/XmlDecoder.java (99%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{file => readers}/XmlFileClient.java (99%) rename sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/{file => }/readers/XmlReader.java (92%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web/drivers/FileDriverTest.java => drivers/FileRiDriverTest.java} (83%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => drivers}/RiHttpUtilsTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => drivers}/RiRestClientTest.java (95%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => drivers}/RiRestParsersTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web/drivers/RngDriverTest.java => drivers/RngRiDriverTest.java} (85%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => drivers}/Sdmx21RestParsersTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => drivers}/Sdmx21RestQueriesTest.java (98%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web/drivers/Sdmx21Driver2Test.java => drivers/Sdmx21RiDriverTest.java} (86%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeIdTest.java (96%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeMonitorTest.java (87%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeSummaryTest.java (95%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UpptimeTest.java (91%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UptimeRobotIdTest.java (81%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/monitors/UptimeRobotMonitorTest.java (87%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/networking/RiNetworkingTest.java (72%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{web => }/networking/RiSSLFactoryTest.java (92%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{file => readers}/XmlFileClientTest.java (95%) rename sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/{file => }/readers/XmlReaderTest.java (94%) rename sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/{web => }/drivers/doris-table-query.json (100%) rename sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/{web => }/monitors/summary.json (100%) diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java index 8163e8922..e9e856530 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/NetworkingOptions.java @@ -1,7 +1,7 @@ package internal.sdmxdl.cli; import picocli.CommandLine; -import sdmxdl.provider.ri.web.networking.RiNetworking; +import sdmxdl.provider.ri.networking.RiNetworking; import sdmxdl.web.spi.Networking; @lombok.Getter diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 56a257e5e..45ee03c6e 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -27,7 +27,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.Languages; -import sdmxdl.provider.ri.web.SourceProperties; +import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index f387c1438..d89665b5b 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -1,7 +1,7 @@ package _demo; import sdmxdl.*; -import sdmxdl.provider.ri.web.SourceProperties; +import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-cli/src/test/java/_test/FileSample.java b/sdmx-dl-cli/src/test/java/_test/FileSample.java index 0e81ae316..6425dd28e 100644 --- a/sdmx-dl-cli/src/test/java/_test/FileSample.java +++ b/sdmx-dl-cli/src/test/java/_test/FileSample.java @@ -1,13 +1,12 @@ package _test; -import sdmxdl.provider.ri.web.drivers.FileDriver; +import sdmxdl.provider.ri.drivers.FileRiDriver; import sdmxdl.web.SdmxWebSource; import sdmxdl.format.xml.XmlWebSource; import tests.sdmxdl.format.xml.SdmxXmlSources; import java.io.File; import java.io.IOException; -import java.net.MalformedURLException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; @@ -40,7 +39,7 @@ private static SdmxWebSource sourceOf(String name, File data, File struct) { .id(name) .driver("ri:file") .endpoint(data.toURI()) - .propertyOf(FileDriver.STRUCTURE_URI_PROPERTY, struct.toURI()) + .propertyOf(FileRiDriver.STRUCTURE_URI_PROPERTY, struct.toURI()) .build(); } } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index a663b9ef4..a2d4e2890 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -1,6 +1,6 @@ package internal.sdmxdl.desktop; -import sdmxdl.provider.ri.web.SourceProperties; +import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; @@ -12,6 +12,7 @@ public class DesktopWebFactory { static { System.setProperty("enableRngDriver", "true"); + System.setProperty("enableFileDriver", "true"); System.setProperty("enablePxWebDriver", "true"); } diff --git a/sdmx-dl-format-kryo/src/main/java/module-info.java b/sdmx-dl-format-kryo/src/main/java/module-info.java index d29f29d0c..8dd16c979 100644 --- a/sdmx-dl-format-kryo/src/main/java/module-info.java +++ b/sdmx-dl-format-kryo/src/main/java/module-info.java @@ -3,6 +3,7 @@ module sdmxdl.format.kryo { requires static lombok; + requires static nbbrd.design; requires static nbbrd.service; requires static org.checkerframework.checker.qual; diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java index b6818a879..e389ab191 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoProvider.java @@ -1,13 +1,15 @@ package sdmxdl.format.kryo; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.DataRepository; import sdmxdl.format.FileFormat; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; -@ServiceProvider(Persistence.class) +@DirectImpl +@ServiceProvider public final class KryoProvider implements Persistence { private static final String ID = "KRYO"; diff --git a/sdmx-dl-format-protobuf/src/main/java/module-info.java b/sdmx-dl-format-protobuf/src/main/java/module-info.java index cdac48050..9483d23b1 100644 --- a/sdmx-dl-format-protobuf/src/main/java/module-info.java +++ b/sdmx-dl-format-protobuf/src/main/java/module-info.java @@ -3,6 +3,7 @@ module sdmxdl.format.protobuf { requires static lombok; + requires static nbbrd.design; requires static nbbrd.service; requires static org.checkerframework.checker.qual; diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java index f215fa800..75993373a 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/JsonProvider.java @@ -1,6 +1,7 @@ package sdmxdl.format.protobuf; import com.google.protobuf.util.JsonFormat; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.format.spi.Persistence; import sdmxdl.format.spi.PersistenceSupport; @@ -12,7 +13,8 @@ import static nbbrd.io.text.TextFormatter.onFormattingWriter; import static nbbrd.io.text.TextParser.onParsingReader; -@ServiceProvider(Persistence.class) +@DirectImpl +@ServiceProvider public final class JsonProvider implements Persistence { private final JsonFormat.Parser parser = JsonFormat.parser(); diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java index 95220b0bf..d5c0f3284 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufProvider.java @@ -1,6 +1,7 @@ package sdmxdl.format.protobuf; import com.google.protobuf.MessageLite; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.format.protobuf.web.MonitorReports; import sdmxdl.format.spi.Persistence; @@ -12,7 +13,8 @@ import static nbbrd.io.FileFormatter.onFormattingStream; import static nbbrd.io.FileParser.onParsingStream; -@ServiceProvider(Persistence.class) +@DirectImpl +@ServiceProvider public final class ProtobufProvider implements Persistence { @lombok.experimental.Delegate diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index a93762315..8df76780e 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -1,6 +1,6 @@ package sdmxdl.grpc; -import sdmxdl.provider.ri.web.SourceProperties; +import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; import sdmxdl.web.SdmxWebSource; diff --git a/sdmx-dl-provider-connectors/pom.xml b/sdmx-dl-provider-connectors/pom.xml index 5279f3052..2c5d2aa48 100644 --- a/sdmx-dl-provider-connectors/pom.xml +++ b/sdmx-dl-provider-connectors/pom.xml @@ -28,6 +28,11 @@ lombok provided + + com.github.nbbrd.java-design-util + java-design-annotation + provided + com.github.nbbrd.java-service-util java-service-annotation diff --git a/sdmx-dl-provider-connectors/src/main/java/module-info.java b/sdmx-dl-provider-connectors/src/main/java/module-info.java index f3599778a..a85c27b29 100644 --- a/sdmx-dl-provider-connectors/src/main/java/module-info.java +++ b/sdmx-dl-provider-connectors/src/main/java/module-info.java @@ -4,6 +4,7 @@ module sdmxdl.provider.connectors { requires static lombok; + requires static nbbrd.design; requires static nbbrd.service; requires static org.checkerframework.checker.qual; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java index 2cb04ffe1..0f5e8558f 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/Connectors.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import it.bancaditalia.oss.sdmx.api.Codelist; import it.bancaditalia.oss.sdmx.api.Dataflow; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsConfigFix.java similarity index 98% rename from sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsConfigFix.java index a8b8a9bb4..e65bd2883 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsConfigFix.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsConfigFix.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import it.bancaditalia.oss.sdmx.util.Configuration; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java index fb79232f5..0364fa817 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import it.bancaditalia.oss.sdmx.client.RestSdmxClient; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java index 224e4300b..a2ee0c8e7 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.EUROSTAT; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,12 +24,13 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) +@DirectImpl +@ServiceProvider public final class EurostatDriver implements Driver { private static final String CONNECTORS_EUROSTAT = "connectors:eurostat"; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/HasDetailSupported.java similarity index 94% rename from sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/HasDetailSupported.java index 46633b96b..052e139e4 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/HasDetailSupported.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/HasDetailSupported.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; /** * diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java index 174967bf7..85cd88a2e 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.IMF2; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,12 +24,13 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) +@DirectImpl +@ServiceProvider public final class ImfDriver implements Driver { private static final String CONNECTORS_IMF = "connectors:imf"; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java index 0a734469d..62c2159f5 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -16,8 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; -import sdmxdl.provider.connectors.HasDetailSupported; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.api.Codelist; import it.bancaditalia.oss.sdmx.api.DataFlowStructure; import it.bancaditalia.oss.sdmx.api.Dimension; @@ -41,13 +40,14 @@ import java.util.function.Supplier; import java.util.logging.Level; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; import static sdmxdl.provider.SdmxFix.Category.CONTENT; /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider public final class InseeDriver implements Driver { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java index 53e400d83..43556b2a7 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.NBB; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,11 +24,12 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider public final class NbbDriver implements Driver { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java index 4c1c64220..f18f0cdab 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.OECD; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -24,12 +24,13 @@ import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) +@DirectImpl +@ServiceProvider public final class OecdDriver implements Driver { private static final String CONNECTORS_OECD = "connectors:oecd"; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java similarity index 99% rename from sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java rename to sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java index 209a685c3..876289ef8 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/PortableTimeSeriesCursor.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import lombok.NonNull; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java index 756a4a47a..753ece7e2 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx20Driver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.RestSdmx20Client; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -26,12 +26,13 @@ import java.net.URI; import java.util.Map; -import static sdmxdl.provider.connectors.Connectors.NEEDS_CREDENTIALS_PROPERTY; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.Connectors.NEEDS_CREDENTIALS_PROPERTY; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider public final class Sdmx20Driver implements Driver { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 046d66391..47630cf39 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -16,8 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; -import sdmxdl.provider.connectors.HasDetailSupported; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.RestSdmxClient; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.RestConnector; @@ -28,14 +27,15 @@ import java.net.URI; import java.util.Map; -import static sdmxdl.provider.connectors.Connectors.*; -import static sdmxdl.provider.connectors.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; +import static sdmxdl.provider.connectors.drivers.Connectors.*; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.provider.web.DriverProperties.DETAIL_SUPPORTED_PROPERTY; /** * @author Philippe Charles */ -@ServiceProvider(Driver.class) +@DirectImpl +@ServiceProvider public final class Sdmx21Driver implements Driver { private static final String CONNECTORS_SDMX_21 = "connectors:sdmx21"; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java index e3765b632..f0f49a999 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; @@ -30,6 +30,7 @@ /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider public final class SeDriver implements Driver { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java index cab0dc5d0..2c46741e9 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.connectors.drivers; -import sdmxdl.provider.connectors.ConnectorsRestClient; +import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.client.custom.DotStat; import nbbrd.service.ServiceProvider; import sdmxdl.provider.SdmxFix; @@ -33,6 +33,7 @@ /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider public final class UisDriver implements Driver { diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java index 49c592b58..68ff6438e 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java @@ -25,8 +25,8 @@ import lombok.NonNull; import sdmxdl.*; import sdmxdl.format.ObsParser; -import sdmxdl.provider.connectors.Connectors; -import sdmxdl.provider.connectors.PortableTimeSeriesCursor; +import sdmxdl.provider.connectors.drivers.Connectors; +import sdmxdl.provider.connectors.drivers.PortableTimeSeriesCursor; import tests.sdmxdl.api.ByteSource; import tests.sdmxdl.format.xml.SdmxXmlSources; diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java similarity index 97% rename from sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java index 41bd09574..04ea02199 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/ConnectorsTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -26,7 +26,7 @@ import java.net.HttpURLConnection; -import static sdmxdl.provider.connectors.Connectors.*; +import static sdmxdl.provider.connectors.drivers.Connectors.*; import static it.bancaditalia.oss.sdmx.exceptions.SdmxExceptionFactory.createRestException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursorTest.java similarity index 95% rename from sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java rename to sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursorTest.java index 20826f765..c447bf0e0 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/PortableTimeSeriesCursorTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursorTest.java @@ -14,11 +14,11 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.connectors; +package sdmxdl.provider.connectors.drivers; import _test.sdmxdl.connectors.samples.ConnectorsResource; -import sdmxdl.provider.connectors.Connectors; -import sdmxdl.provider.connectors.PortableTimeSeriesCursor; +import sdmxdl.provider.connectors.drivers.Connectors; +import sdmxdl.provider.connectors.drivers.PortableTimeSeriesCursor; import it.bancaditalia.oss.sdmx.api.DataFlowStructure; import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import org.junit.jupiter.api.BeforeAll; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java index b245b96b1..4f0526754 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java @@ -24,7 +24,7 @@ import sdmxdl.format.ObsParser; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.ri.web.*; +import sdmxdl.provider.ri.drivers.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -37,7 +37,7 @@ import java.util.Set; import static sdmxdl.provider.SdmxFix.Category.QUERY; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java index 427965c85..d2900bb28 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java @@ -17,7 +17,7 @@ package sdmxdl.provider.dialects.drivers; import nbbrd.design.DirectImpl; -import sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.drivers.RiRestClient; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; import sdmxdl.Languages; @@ -33,7 +33,7 @@ import java.util.EnumSet; import java.util.Set; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.ENDPOINT; import static sdmxdl.provider.SdmxFix.Category.QUERY; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java index a73eaf7ff..57b4cf4a6 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java @@ -10,7 +10,7 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.ri.web.RiRestParsers; +import sdmxdl.provider.ri.drivers.RiRestParsers; import java.util.List; import java.util.Optional; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java index e346dcc18..b4d4a47c5 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java @@ -6,7 +6,7 @@ import sdmxdl.DataStructureRef; import sdmxdl.DataflowRef; import sdmxdl.provider.DataRef; -import sdmxdl.provider.ri.web.RiRestQueries; +import sdmxdl.provider.ri.drivers.RiRestQueries; import java.net.URL; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java index 0ef66ae40..389bd4e57 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java @@ -37,7 +37,7 @@ import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.ri.web.*; +import sdmxdl.provider.ri.drivers.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; @@ -59,8 +59,8 @@ import static sdmxdl.Languages.ANY; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.provider.ri.web.Sdmx21RestParsers.withCharset; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.Sdmx21RestParsers.withCharset; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java index 93bd7d42a..453bd2f97 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java @@ -17,7 +17,7 @@ package sdmxdl.provider.dialects.drivers; import nbbrd.design.DirectImpl; -import sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.drivers.RiRestClient; import internal.util.http.URLQueryBuilder; import lombok.NonNull; import nbbrd.io.FileParser; @@ -43,7 +43,7 @@ import java.util.Set; import java.util.function.Supplier; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.SdmxFix.Category.QUERY; /** diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java index 8a447f641..14068d357 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java @@ -33,7 +33,7 @@ import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.HasMarker; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.ri.web.*; +import sdmxdl.provider.ri.drivers.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -47,7 +47,7 @@ import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; import static sdmxdl.provider.SdmxFix.Category.CONTENT; import static sdmxdl.provider.SdmxFix.Category.MEDIA_TYPE; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java index 16e40ff82..fba9ed1a3 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java @@ -34,7 +34,9 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.SdmxFix; -import sdmxdl.provider.ri.web.*; +import sdmxdl.provider.ri.drivers.RiHttpUtils; +import sdmxdl.provider.ri.drivers.RiRestClient; +import sdmxdl.provider.ri.drivers.Sdmx21RestErrors; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; import sdmxdl.web.SdmxWebSource; @@ -48,7 +50,7 @@ import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; import static sdmxdl.provider.SdmxFix.Category.PROTOCOL; import static sdmxdl.provider.SdmxFix.Category.QUERY; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; /** * @author Philippe Charles diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java index c98fd1bad..f6e58ae9c 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java @@ -42,8 +42,8 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; -import static sdmxdl.provider.ri.web.RiHttpUtils.newClient; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.newClient; import static java.util.Arrays.asList; import static java.util.function.Function.identity; import static java.util.regex.Pattern.compile; diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java index edf331764..63ad95d26 100644 --- a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java @@ -17,7 +17,7 @@ package sdmxdl.provider.dialects.drivers; import _tests.RestClientResponseMock; -import sdmxdl.provider.ri.web.RiRestClient; +import sdmxdl.provider.ri.drivers.RiRestClient; import internal.util.http.HttpResponseException; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java index d4384b7dc..501acfbc8 100644 --- a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java @@ -6,6 +6,7 @@ import internal.util.http.HttpRequest; import internal.util.http.HttpResponse; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.MightBeGenerated; import nbbrd.design.VisibleForTesting; import nbbrd.io.FileParser; @@ -25,7 +26,7 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.TypedId; -import sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.drivers.RiHttpUtils; import sdmxdl.provider.web.DriverSupport; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.Driver; @@ -43,10 +44,11 @@ import static java.util.stream.Collectors.toList; import static sdmxdl.provider.web.DriverProperties.CACHE_TTL_PROPERTY; +@DirectImpl @ServiceProvider public final class PxWebDriver implements Driver { - private static final String RI_PXWEB = "ri:pxweb"; + private static final String PX_PXWEB = "px:pxweb"; private static final BooleanProperty ENABLE = BooleanProperty.of("enablePxWebDriver", false); @@ -54,7 +56,7 @@ public final class PxWebDriver implements Driver { @lombok.experimental.Delegate private final DriverSupport support = DriverSupport .builder() - .id(RI_PXWEB) + .id(PX_PXWEB) .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(PxWebDriver::newConnection) @@ -66,7 +68,7 @@ public final class PxWebDriver implements Driver { .name("en", "Statistics Finland") .name("sv", "Statistikcentralen") .name("fi", "Tilastokeskus") - .driver(RI_PXWEB) + .driver(PX_PXWEB) .endpointOf("https://statfin.stat.fi/PXWeb/api/v1/en/StatFin/") .websiteOf("https://statfin.stat.fi/PxWeb/pxweb/en/StatFin/") .build()) diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index fcb997e93..ae6e2716a 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -1,14 +1,14 @@ import sdmxdl.file.spi.FileCaching; import sdmxdl.file.spi.Reader; +import sdmxdl.provider.ri.authenticators.WinPasswordVaultAuthenticator; import sdmxdl.provider.ri.caching.RiCaching; -import sdmxdl.provider.ri.file.readers.XmlReader; -import sdmxdl.provider.ri.web.authenticators.WinPasswordVaultAuthenticator; -import sdmxdl.provider.ri.web.drivers.FileDriver; -import sdmxdl.provider.ri.web.drivers.RngDriver; -import sdmxdl.provider.ri.web.drivers.Sdmx21Driver2; -import sdmxdl.provider.ri.web.monitors.UpptimeMonitor; -import sdmxdl.provider.ri.web.monitors.UptimeRobotMonitor; -import sdmxdl.provider.ri.web.networking.RiNetworking; +import sdmxdl.provider.ri.drivers.FileRiDriver; +import sdmxdl.provider.ri.drivers.RngRiDriver; +import sdmxdl.provider.ri.drivers.Sdmx21RiDriver; +import sdmxdl.provider.ri.monitors.UpptimeMonitor; +import sdmxdl.provider.ri.monitors.UptimeRobotMonitor; +import sdmxdl.provider.ri.networking.RiNetworking; +import sdmxdl.provider.ri.readers.XmlReader; import sdmxdl.web.spi.*; module sdmxdl.provider.ri { @@ -28,14 +28,14 @@ requires nbbrd.io.curl; requires nbbrd.net.proxy; - exports sdmxdl.provider.ri.web to sdmxdl.provider.dialects, sdmxdl.provider.px; + exports sdmxdl.provider.ri.drivers to sdmxdl.provider.dialects, sdmxdl.provider.px; exports internal.util.http to sdmxdl.provider.dialects, sdmxdl.provider.px; exports internal.util.http.ext to sdmxdl.provider.dialects, sdmxdl.provider.px; provides Driver with - FileDriver, - RngDriver, - Sdmx21Driver2; + FileRiDriver, + RngRiDriver, + Sdmx21RiDriver; provides Reader with XmlReader; @@ -56,5 +56,5 @@ provides WebCaching with RiCaching; - opens sdmxdl.provider.ri.web.monitors to com.google.gson; + opens sdmxdl.provider.ri.monitors to com.google.gson; } \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java similarity index 94% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java index 87574bf6b..8d860b4db 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/authenticators/WinPasswordVaultAuthenticator.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java @@ -1,7 +1,8 @@ -package sdmxdl.provider.ri.web.authenticators; +package sdmxdl.provider.ri.authenticators; import internal.util.credentials.WinPasswordVault; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.io.sys.OS; import nbbrd.service.ServiceProvider; import sdmxdl.web.SdmxWebSource; @@ -10,6 +11,7 @@ import java.io.IOException; import java.net.PasswordAuthentication; +@DirectImpl @ServiceProvider public final class WinPasswordVaultAuthenticator implements Authenticator { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java index 71acad3ed..f3d409978 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java @@ -2,6 +2,7 @@ import lombok.AccessLevel; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.io.text.BooleanProperty; import nbbrd.io.text.Formatter; import nbbrd.io.text.Parser; @@ -33,6 +34,7 @@ import static nbbrd.io.text.BaseProperty.keysOf; +@DirectImpl @ServiceProvider(FileCaching.class) @ServiceProvider(WebCaching.class) public final class RiCaching implements FileCaching, WebCaching { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java index 23995044d..fc0cfc755 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/FileDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.io.text.BooleanProperty; import nbbrd.io.text.Formatter; @@ -25,8 +26,9 @@ import java.time.Clock; import java.util.Collection; +@DirectImpl @ServiceProvider -public final class FileDriver implements Driver { +public final class FileRiDriver implements Driver { public static final Property STRUCTURE_URI_PROPERTY = Property.of(DRIVER_PROPERTY_PREFIX + ".structureURI", null, Parser.onURI(), Formatter.onURI()); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java index 5d3e3dadf..203bfed40 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.*; import internal.util.http.ext.DumpingClient; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java index 63cc55d47..6a165646e 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.HttpClient; import internal.util.http.HttpRequest; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java similarity index 93% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java index 5b4157b65..03175d93c 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.HttpResponseException; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java index 458932821..377af942e 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import lombok.NonNull; import nbbrd.io.FileParser; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java similarity index 95% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java index 329272e5e..2d27a00fe 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/RiRestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.URLQueryBuilder; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java index 595db06ee..ea192fac5 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/RngDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; import nbbrd.io.text.BooleanProperty; @@ -33,8 +34,9 @@ import static java.util.Collections.singleton; +@DirectImpl @ServiceProvider -public final class RngDriver implements Driver { +public final class RngRiDriver implements Driver { private static final String RI_RNG = "ri:rng"; @@ -47,7 +49,7 @@ public final class RngDriver implements Driver { .id(RI_RNG) .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) - .connector(RngDriver::newConnection) + .connector(RngRiDriver::newConnection) .source(SdmxWebSource .builder() .id("RNG") diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java index d25ba3115..5389d8724 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.HttpResponseException; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java index 04d56a97b..f11397897 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import lombok.NonNull; import nbbrd.design.VisibleForTesting; @@ -19,7 +19,7 @@ import java.util.Optional; import java.util.function.Supplier; -import static sdmxdl.provider.ri.web.RiRestParsers.getResourceSelector; +import static sdmxdl.provider.ri.drivers.RiRestParsers.getResourceSelector; import static java.util.Collections.singletonList; import static nbbrd.io.xml.Xml.APPLICATION_XML_UTF_8; import static sdmxdl.format.xml.XmlMediaTypes.*; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java index 4f4e933d6..804343b09 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/Sdmx21RestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.URLQueryBuilder; import lombok.AccessLevel; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java index 1e2e030b7..15e0be326 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java @@ -14,11 +14,9 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; -import sdmxdl.provider.ri.web.RiRestClient; -import sdmxdl.provider.ri.web.Sdmx21RestParsers; -import sdmxdl.provider.ri.web.Sdmx21RestQueries; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.Feature; import sdmxdl.Languages; @@ -33,15 +31,16 @@ import java.util.EnumSet; import java.util.Set; -import static sdmxdl.provider.ri.web.RiHttpUtils.RI_CONNECTION_PROPERTIES; +import static sdmxdl.provider.ri.drivers.RiHttpUtils.RI_CONNECTION_PROPERTIES; import static sdmxdl.provider.web.DriverProperties.DETAIL_SUPPORTED_PROPERTY; import static sdmxdl.provider.web.DriverProperties.TRAILING_SLASH_PROPERTY; /** * @author Philippe Charles */ +@DirectImpl @ServiceProvider -public final class Sdmx21Driver2 implements Driver { +public final class Sdmx21RiDriver implements Driver { private static final String RI_SDMX_21 = "ri:sdmx21"; @@ -50,7 +49,7 @@ public final class Sdmx21Driver2 implements Driver { .builder() .id(RI_SDMX_21) .rank(NATIVE_DRIVER_RANK) - .connector(RestConnector.of(Sdmx21Driver2::newClient)) + .connector(RestConnector.of(Sdmx21RiDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) .propertyOf(DETAIL_SUPPORTED_PROPERTY) .propertyOf(TRAILING_SLASH_PROPERTY) diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java index 75fab848c..bcd875b16 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/SourceProperties.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import nbbrd.design.ReturnNew; import nbbrd.io.text.Formatter; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java index 5fabe7886..5f3701327 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeId.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import internal.util.http.URLQueryBuilder; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java index 09b61cfce..1d3fdfbd3 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitor.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java @@ -1,12 +1,13 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import internal.util.http.HttpClient; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import sdmxdl.ext.Cache; -import sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.drivers.RiHttpUtils; import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; @@ -21,6 +22,7 @@ import java.time.Duration; import java.util.Locale; +@DirectImpl @ServiceProvider public final class UpptimeMonitor implements Monitor { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java similarity index 95% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java index a71185096..abf7be807 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UpptimeSummary.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java @@ -1,7 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import com.google.gson.*; -import sdmxdl.provider.ri.web.RiHttpUtils; +import sdmxdl.provider.ri.drivers.RiHttpUtils; import internal.util.http.HttpClient; import internal.util.http.HttpResponse; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotId.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotId.java index 85fa85ddb..7ae9ae0ac 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotId.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotId.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import lombok.NonNull; import nbbrd.design.RepresentableAs; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java similarity index 98% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java index 88277eef2..86d0a801d 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitor.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.design.MightBePromoted; import nbbrd.io.function.IOFunction; import nbbrd.io.text.Parser; @@ -27,6 +28,7 @@ import java.net.*; import java.nio.charset.StandardCharsets; +@DirectImpl @ServiceProvider public final class UptimeRobotMonitor implements Monitor { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetwork.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetwork.java index 0fae44512..8e6c82995 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetwork.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetwork.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.networking; +package sdmxdl.provider.ri.networking; import lombok.NonNull; import nbbrd.io.curl.CurlHttpURLConnection; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java index b88fe3276..20e270208 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiNetworking.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.networking; +package sdmxdl.provider.ri.networking; import lombok.NonNull; +import nbbrd.design.DirectImpl; import nbbrd.io.text.BooleanProperty; import nbbrd.service.ServiceProvider; import org.checkerframework.checker.nullness.qual.Nullable; @@ -16,6 +17,7 @@ import static nbbrd.io.text.BaseProperty.keysOf; +@DirectImpl @ServiceProvider public final class RiNetworking implements Networking { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiSSLFactory.java similarity index 97% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiSSLFactory.java index 9dda4a8f9..bfb62a66f 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/web/networking/RiSSLFactory.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiSSLFactory.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.networking; +package sdmxdl.provider.ri.networking; import lombok.AccessLevel; import lombok.NonNull; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java similarity index 96% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java index 8262e14cf..057893afd 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/Decoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.readers; import lombok.NonNull; import sdmxdl.Languages; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java index 661e0df21..e9c1364fa 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.readers; import lombok.NonNull; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java similarity index 99% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java index 0a81733ae..3e7a77b7c 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.readers; import lombok.NonNull; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java similarity index 92% rename from sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java rename to sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java index 915a4abc7..aa6e77a81 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/file/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java @@ -1,7 +1,6 @@ -package sdmxdl.provider.ri.file.readers; +package sdmxdl.provider.ri.readers; -import sdmxdl.provider.ri.file.XmlDecoder; -import sdmxdl.provider.ri.file.XmlFileClient; +import nbbrd.design.DirectImpl; import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.Connection; @@ -20,8 +19,9 @@ import java.io.IOException; import java.util.Locale; +@DirectImpl @ServiceProvider -public class XmlReader implements Reader { +public final class XmlReader implements Reader { @Override public @NonNull String getReaderId() { diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/FileRiDriverTest.java similarity index 83% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/FileRiDriverTest.java index c27fcae9e..d16f325a6 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/FileDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/FileRiDriverTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.spi.DriverAssert; @@ -28,20 +28,20 @@ /** * @author Philippe Charles */ -public class FileDriverTest { +public class FileRiDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new FileDriver()); + DriverAssert.assertCompliance(new FileRiDriver()); } @Test public void testToFile() throws IOException { - assertThat(FileDriver.toFile(URI.create("file:/C:/temp/x.xml"))).isNotNull(); + assertThat(FileRiDriver.toFile(URI.create("file:/C:/temp/x.xml"))).isNotNull(); URI illegal = URI.create("file://C:/temp/x.xml"); assertThatIOException() - .isThrownBy(() -> FileDriver.toFile(illegal)) + .isThrownBy(() -> FileRiDriver.toFile(illegal)) .withMessageStartingWith("Invalid file name: ") .withMessageContaining(illegal.toString()) .withCauseExactlyInstanceOf(IllegalArgumentException.class); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java index aa7097b2b..71552904d 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java @@ -1,10 +1,11 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.HttpEventListener; import internal.util.http.HttpRequest; import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.drivers.RiHttpUtils; import sdmxdl.web.SdmxWebSource; import sdmxdl.web.spi.WebContext; import tests.sdmxdl.web.spi.DriverAssert; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java index 87465b00c..d59d561fd 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java @@ -1,14 +1,14 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import internal.util.http.HttpClient; import internal.util.http.HttpResponseException; import internal.util.http.ext.DumpingClientTest; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.RiRestClient; -import sdmxdl.provider.ri.web.Sdmx21RestErrors; -import sdmxdl.provider.ri.web.Sdmx21RestParsers; -import sdmxdl.provider.ri.web.Sdmx21RestQueries; +import sdmxdl.provider.ri.drivers.RiRestClient; +import sdmxdl.provider.ri.drivers.Sdmx21RestErrors; +import sdmxdl.provider.ri.drivers.Sdmx21RestParsers; +import sdmxdl.provider.ri.drivers.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.Marker; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java index 75a32128d..fdd27eede 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/RiRestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java @@ -1,8 +1,8 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.RiRestParsers; +import sdmxdl.provider.ri.drivers.RiRestParsers; import sdmxdl.Dataflow; import sdmxdl.DataflowRef; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java similarity index 85% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java index 6dd2521db..ffb73b271 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/RngDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; import org.junit.jupiter.api.Test; import sdmxdl.Connection; @@ -11,15 +11,15 @@ import static sdmxdl.Languages.ANY; -public class RngDriverTest { +public class RngRiDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new RngDriver()); + DriverAssert.assertCompliance(new RngRiDriver()); } public static void main(String[] args) throws IOException { - RngDriver x = new RngDriver(); + RngRiDriver x = new RngRiDriver(); for (SdmxWebSource source : x.getDefaultSources()) { System.out.println(source); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java index e9830d08d..cb28f066b 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import nbbrd.io.FileParser; import nbbrd.io.net.MediaType; @@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.InstanceOfAssertFactories.LIST; import static sdmxdl.Languages.ANY; -import static sdmxdl.provider.ri.web.Sdmx21RestParsers.*; +import static sdmxdl.provider.ri.drivers.Sdmx21RestParsers.*; public class Sdmx21RestParsersTest { diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java similarity index 98% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java index 142541df0..903631742 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/Sdmx21RestQueriesTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java @@ -14,12 +14,12 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web; +package sdmxdl.provider.ri.drivers; import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.web.Sdmx21RestQueries; +import sdmxdl.provider.ri.drivers.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.provider.DataRef; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriverTest.java similarity index 86% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriverTest.java index be2077991..2faed42d1 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/drivers/Sdmx21Driver2Test.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriverTest.java @@ -14,7 +14,7 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.web.drivers; +package sdmxdl.provider.ri.drivers; import org.junit.jupiter.api.Test; import tests.sdmxdl.web.spi.DriverAssert; @@ -22,10 +22,10 @@ /** * @author Philippe Charles */ -public class Sdmx21Driver2Test { +public class Sdmx21RiDriverTest { @Test public void testCompliance() { - DriverAssert.assertCompliance(new Sdmx21Driver2()); + DriverAssert.assertCompliance(new Sdmx21RiDriver()); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeIdTest.java similarity index 96% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeIdTest.java index 18ff55857..3b3266956 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeIdTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeIdTest.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.monitors.UpptimeId; import java.net.MalformedURLException; import java.net.URI; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java similarity index 87% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java index 50499d686..d7394f87e 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeMonitorTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.monitors.UpptimeMonitor; import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.web.spi.MonitorAssert; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeSummaryTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeSummaryTest.java index 9d676b340..fbe5f1f31 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeSummaryTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeSummaryTest.java @@ -1,4 +1,4 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import nbbrd.io.text.TextResource; import org.junit.jupiter.api.Test; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeTest.java similarity index 91% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeTest.java index 50f61885b..96bccd4d2 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UpptimeTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeTest.java @@ -1,6 +1,8 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.monitors.UpptimeMonitor; +import sdmxdl.provider.ri.monitors.UpptimeSummary; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorStatus; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotIdTest.java similarity index 81% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotIdTest.java index 0ea233a51..5e2981122 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotIdTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotIdTest.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.monitors.UptimeRobotId; import java.net.URI; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java similarity index 87% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java index ebe508194..5aec2edc0 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/monitors/UptimeRobotMonitorTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.monitors; +package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.monitors.UpptimeMonitor; import sdmxdl.web.SdmxWebSource; import tests.sdmxdl.web.spi.MonitorAssert; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiNetworkingTest.java similarity index 72% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiNetworkingTest.java index bdf3b4336..6be74ee27 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiNetworkingTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiNetworkingTest.java @@ -1,6 +1,7 @@ -package sdmxdl.provider.ri.web.networking; +package sdmxdl.provider.ri.networking; import org.junit.jupiter.api.Test; +import sdmxdl.provider.ri.networking.RiNetworking; import static tests.sdmxdl.web.spi.NetworkingAssert.assertCompliance; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiSSLFactoryTest.java similarity index 92% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiSSLFactoryTest.java index e28c839fb..a6cca1c1a 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/web/networking/RiSSLFactoryTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/networking/RiSSLFactoryTest.java @@ -1,8 +1,9 @@ -package sdmxdl.provider.ri.web.networking; +package sdmxdl.provider.ri.networking; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import sdmxdl.provider.ri.networking.RiSSLFactory; import java.util.stream.Stream; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java similarity index 95% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java index f22ff2bf2..47a151c05 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/XmlFileClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java @@ -14,13 +14,13 @@ * See the Licence for the specific language governing permissions and * limitations under the Licence. */ -package sdmxdl.provider.ri.file; +package sdmxdl.provider.ri.readers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import sdmxdl.provider.ri.file.Decoder; -import sdmxdl.provider.ri.file.XmlDecoder; -import sdmxdl.provider.ri.file.XmlFileClient; +import sdmxdl.provider.ri.readers.Decoder; +import sdmxdl.provider.ri.readers.XmlDecoder; +import sdmxdl.provider.ri.readers.XmlFileClient; import sdmxdl.*; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.XmlMediaTypes; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java similarity index 94% rename from sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java rename to sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java index 3549c2208..26cf94aca 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/file/readers/XmlReaderTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java @@ -1,9 +1,10 @@ -package sdmxdl.provider.ri.file.readers; +package sdmxdl.provider.ri.readers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import sdmxdl.file.SdmxFileSource; import sdmxdl.format.xml.XmlFileSource; +import sdmxdl.provider.ri.readers.XmlReader; import tests.sdmxdl.file.spi.ReaderAssert; import tests.sdmxdl.format.xml.SdmxXmlSources; diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/doris-table-query.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/drivers/doris-table-query.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/drivers/doris-table-query.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/drivers/doris-table-query.json diff --git a/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/monitors/summary.json b/sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/monitors/summary.json similarity index 100% rename from sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/web/monitors/summary.json rename to sdmx-dl-provider-ri/src/test/resources/sdmxdl/provider/ri/monitors/summary.json diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java index 3d1d4a957..4529eda83 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java @@ -1,5 +1,6 @@ package sdmxdl.testing; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.*; import sdmxdl.provider.Validator; @@ -173,6 +174,7 @@ private static String checkEntry(String checkName, Map.Entry ent : null; } + @DirectImpl @ServiceProvider public static final class OtherRulesProvider implements WebRuleBatch { diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java index fa7d354b7..64401213e 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java @@ -1,5 +1,6 @@ package sdmxdl.testing; +import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; import sdmxdl.DataStructure; import sdmxdl.Dataflow; @@ -72,6 +73,7 @@ private static Validator onRange(IntRange range) { return value -> !range.contains(value) ? String.format(Locale.ROOT, "Expecting range '%s' to contain value %s", range.toShortString(), value) : null; } + @DirectImpl @ServiceProvider public static final class RangeRulesProvider implements WebRuleBatch { From bbbb1e63430408b58ee7fa20a90ff73dbc382706 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 04:55:43 +0000 Subject: [PATCH 069/114] Bump io.github.hakky54:sslcontext-kickstart from 8.1.5 to 8.1.6 Bumps [io.github.hakky54:sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.1.5 to 8.1.6. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.1.5...v8.1.6) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-provider-ri/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index 54626e3b3..a16ca3ed3 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -72,7 +72,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.5 + 8.1.6 slf4j-api From 8a350286720c8e6564afef05892af35b7302970e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Aug 2023 04:39:03 +0000 Subject: [PATCH 070/114] Bump quarkus.platform.version from 3.3.0 to 3.3.1 Bumps `quarkus.platform.version` from 3.3.0 to 3.3.1. Updates `io.quarkus.platform:quarkus-bom` from 3.3.0 to 3.3.1 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.0...3.3.1) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.3.0 to 3.3.1 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.0...3.3.1) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 84c05a327..aeb9d7810 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.3.0 + 3.3.1 true true From 041cba5d45566dce6f18632f780e26a158e09bf6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 04:50:49 +0000 Subject: [PATCH 071/114] Bump org.jreleaser:jreleaser-maven-plugin from 1.7.0 to 1.8.0 Bumps [org.jreleaser:jreleaser-maven-plugin](https://github.com/jreleaser/jreleaser) from 1.7.0 to 1.8.0. - [Release notes](https://github.com/jreleaser/jreleaser/releases) - [Changelog](https://github.com/jreleaser/jreleaser/blob/main/jreleaser.yml) - [Commits](https://github.com/jreleaser/jreleaser/compare/v1.7.0...v1.8.0) --- updated-dependencies: - dependency-name: org.jreleaser:jreleaser-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-cli/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 5d4c72220..1222dbb86 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -345,7 +345,7 @@ org.jreleaser jreleaser-maven-plugin - 1.7.0 + 1.8.0 install From cafbf67b6a3ccd63d905267abb60de0d416ed6cf Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 4 Sep 2023 18:00:46 +0200 Subject: [PATCH 072/114] Exclude API from standalone to preserve module-info --- sdmx-dl-standalone/pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index 0d3e247c4..ba1442601 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -17,6 +17,11 @@ https://github.com/nbbrd/sdmx-dl + + ${project.groupId} + sdmx-dl-api + ${project.version} + ${project.groupId} sdmx-dl-provider-ri @@ -59,6 +64,11 @@ + + + ${project.groupId}:sdmx-dl-api + + *:* From 9f675606199acd09efa2109167b78bb4f2187a5c Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 6 Sep 2023 16:22:50 +0200 Subject: [PATCH 073/114] Fix missing javadoc and sources in standalone --- sdmx-dl-standalone/src/main/javadoc/EmptyJavaDoc.java | 6 ++++++ .../src/main/resources/sdmx-dl-standalone.txt | 0 2 files changed, 6 insertions(+) create mode 100644 sdmx-dl-standalone/src/main/javadoc/EmptyJavaDoc.java create mode 100644 sdmx-dl-standalone/src/main/resources/sdmx-dl-standalone.txt diff --git a/sdmx-dl-standalone/src/main/javadoc/EmptyJavaDoc.java b/sdmx-dl-standalone/src/main/javadoc/EmptyJavaDoc.java new file mode 100644 index 000000000..530579d47 --- /dev/null +++ b/sdmx-dl-standalone/src/main/javadoc/EmptyJavaDoc.java @@ -0,0 +1,6 @@ +/** + * Workaround for JavaDoc issues with Lombok. + */ +public class EmptyJavaDoc { + +} \ No newline at end of file diff --git a/sdmx-dl-standalone/src/main/resources/sdmx-dl-standalone.txt b/sdmx-dl-standalone/src/main/resources/sdmx-dl-standalone.txt new file mode 100644 index 000000000..e69de29bb From 79bacd61c2cabd241716281bd7ea084449855a7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 6 Sep 2023 14:31:02 +0000 Subject: [PATCH 074/114] Bump com.formdev:flatlaf from 3.2 to 3.2.1 Bumps [com.formdev:flatlaf](https://github.com/JFormDesigner/FlatLaf) from 3.2 to 3.2.1. - [Release notes](https://github.com/JFormDesigner/FlatLaf/releases) - [Changelog](https://github.com/JFormDesigner/FlatLaf/blob/main/CHANGELOG.md) - [Commits](https://github.com/JFormDesigner/FlatLaf/compare/3.2...3.2.1) --- updated-dependencies: - dependency-name: com.formdev:flatlaf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-desktop/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 02b1d4c0d..0729243bc 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -108,7 +108,7 @@ com.formdev flatlaf - 3.2 + 3.2.1 org.kordamp.ikonli From 091c88583ec8816fab98eb994555983bebb46605 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 7 Sep 2023 10:02:53 +0200 Subject: [PATCH 075/114] Fix relocation of JDK internals in sdmx-dl-standalone --- pom.xml | 5 + sdmx-dl-standalone/pom.xml | 65 +++++++++- .../test/java/_test/DependencyResolver.java | 61 +++++++++ .../standalone/RuntimeDependenciesTest.java | 119 ++++++++++++++++++ 4 files changed, 244 insertions(+), 6 deletions(-) create mode 100644 sdmx-dl-standalone/src/test/java/_test/DependencyResolver.java create mode 100644 sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java diff --git a/pom.xml b/pom.xml index d1b36315d..d1220ba3f 100644 --- a/pom.xml +++ b/pom.xml @@ -152,6 +152,11 @@ 3.1.2 + + org.apache.maven.plugins + maven-dependency-plugin + 3.6.0 + org.apache.maven.plugins maven-shade-plugin diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index ba1442601..a64f7edd2 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -17,6 +17,19 @@ https://github.com/nbbrd/sdmx-dl + + + org.checkerframework + checker-qual + provided + + + org.projectlombok + lombok + provided + + + ${project.groupId} sdmx-dl-api @@ -47,10 +60,42 @@ slf4j-jdk14 ${slf4j.version} + + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + + org.apache.maven.plugins + maven-dependency-plugin + + + list-runtime-dependencies + generate-test-resources + + resolve + + + runtime + ${project.build.testOutputDirectory}/runtime-dependencies.txt + false + + + + + org.apache.maven.plugins @@ -109,16 +154,24 @@ standalone_sdmxdl.nbbrd - com - standalone_sdmxdl.com + com.esotericsoftware + standalone_sdmxdl.com.esotericsoftware + + + com.github.tuupertunut + standalone_sdmxdl.com.github.tuupertunut + + + com.google.gson + standalone_sdmxdl.com.google.gson - nl - standalone_sdmxdl.nl + nl.altindag + standalone_sdmxdl.nl.altindag - org - standalone_sdmxdl.org + org.slf4j + standalone_sdmxdl.org.slf4j true diff --git a/sdmx-dl-standalone/src/test/java/_test/DependencyResolver.java b/sdmx-dl-standalone/src/test/java/_test/DependencyResolver.java new file mode 100644 index 000000000..191c94a82 --- /dev/null +++ b/sdmx-dl-standalone/src/test/java/_test/DependencyResolver.java @@ -0,0 +1,61 @@ +package _test; + +import lombok.NonNull; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@lombok.experimental.UtilityClass +public class DependencyResolver { + + public static @NonNull List parse(@NonNull Stream lines) { + return lines + .filter(DependencyResolver::isValidLine) + .map(DependencyResolver::removeAnsiControlChars) + .map(DependencyResolver::extract) + .map(GAV::parse) + .collect(Collectors.toList()); + } + + private static final String PREFIX = " "; + private static final String SUFFIX = " -- module"; + + private static boolean isValidLine(String line) { + return line.startsWith(PREFIX); + } + + private static String removeAnsiControlChars(String input) { + return input.replaceAll("\u001B\\[[;\\d]*m", ""); + } + + private static String extract(String input) { + int start = PREFIX.length(); + int end = input.indexOf(SUFFIX, start); + return input.substring(start, end == -1 ? input.length() : end); + } + + @lombok.Value + public static class GAV { + + public static @NonNull GAV parse(@NonNull CharSequence input) { + String[] items = input.toString().split(":", -1); + if (items.length < 4) { + throw new IllegalArgumentException("Invalid GAV: '" + input + "'"); + } + return new GAV(items[0], items[1], items[3]); + } + + @NonNull String groupId; + @NonNull String artifactId; + @NonNull String version; + + public static boolean haveSameVersion(@NonNull List list) { + return list + .stream() + .map(GAV::getVersion) + .distinct() + .count() == 1; + } + } +} diff --git a/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java b/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java new file mode 100644 index 000000000..f602fc8bf --- /dev/null +++ b/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java @@ -0,0 +1,119 @@ +package spreadsheet4j.standalone; + +import _test.DependencyResolver; +import nbbrd.io.text.TextParser; +import org.assertj.core.api.Condition; +import org.assertj.core.api.ListAssert; +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; + +public class RuntimeDependenciesTest { + + @Test + public void testRuntimeDependencies() throws IOException { + assertThat(getRuntimeDependencies()) + .describedAs("Check runtime dependencies") + .satisfies(RuntimeDependenciesTest::checkJavaIoUtil) + .satisfies(RuntimeDependenciesTest::checkSdmxdl) + .satisfies(RuntimeDependenciesTest::checkPicocsv) + .satisfies(RuntimeDependenciesTest::checkPowershell) + .satisfies(RuntimeDependenciesTest::checkGson) + .satisfies(RuntimeDependenciesTest::checkSllContextKickstart) + .satisfies(RuntimeDependenciesTest::checkJavaNetProxy) + .satisfies(RuntimeDependenciesTest::checkSlf4j) + .satisfies(RuntimeDependenciesTest::checkKryo5) + .hasSize(21); + } + + private static void checkJavaIoUtil(List coordinates) { + assertThatGroupId(coordinates, "com.github.nbbrd.java-io-util") + .has(sameVersion()) + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("java-io-picocsv", "java-io-xml", "java-io-base", "java-io-curl"); + } + + private static void checkSdmxdl(List coordinates) { + assertThatGroupId(coordinates, "com.github.nbbrd.sdmx-dl") + .has(sameVersion()) + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder( + "sdmx-dl-api", + "sdmx-dl-format-base", + "sdmx-dl-format-csv", + "sdmx-dl-format-kryo", + "sdmx-dl-format-xml", + "sdmx-dl-provider-base", + "sdmx-dl-provider-dialects", + "sdmx-dl-provider-px", + "sdmx-dl-provider-ri" + ); + } + + private static void checkPicocsv(List coordinates) { + assertThatGroupId(coordinates, "com.github.nbbrd.picocsv") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("picocsv"); + } + + private static void checkPowershell(List coordinates) { + assertThatGroupId(coordinates, "com.github.tuupertunut") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("powershell-lib-java"); + } + + private static void checkKryo5(List coordinates) { + assertThatGroupId(coordinates, "com.esotericsoftware.kryo") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("kryo5"); + } + + private static void checkGson(List coordinates) { + assertThatGroupId(coordinates, "com.google.code.gson") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("gson"); + } + + private static void checkSllContextKickstart(List coordinates) { + assertThatGroupId(coordinates, "io.github.hakky54") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("sslcontext-kickstart"); + } + + private static void checkJavaNetProxy(List coordinates) { + assertThatGroupId(coordinates, "com.github.nbbrd.java-net-proxy") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("java-net-proxy"); + } + + private static void checkSlf4j(List coordinates) { + assertThatGroupId(coordinates, "org.slf4j") + .extracting(DependencyResolver.GAV::getArtifactId) + .containsExactlyInAnyOrder("slf4j-api", "slf4j-jdk14"); + } + + private static ListAssert assertThatGroupId(List coordinates, String groupId) { + return assertThat(coordinates) + .describedAs("Check " + groupId) + .filteredOn(DependencyResolver.GAV::getGroupId, groupId); + } + + private static Condition> sameVersion() { + return new Condition<>(DependencyResolver.GAV::haveSameVersion, "same version"); + } + + private static List getRuntimeDependencies() throws IOException { + return TextParser.onParsingReader(reader -> DependencyResolver.parse(asBufferedReader(reader).lines())) + .parseResource(RuntimeDependenciesTest.class, "/runtime-dependencies.txt", UTF_8); + } + + private static BufferedReader asBufferedReader(Reader reader) { + return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader); + } +} From 7340ce2e3bee8ae3f2025c316ce4887f92d1e8a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 02:28:09 +0000 Subject: [PATCH 076/114] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/docs.yml | 4 ++-- .github/workflows/java-ea-maven.yml | 2 +- .github/workflows/java8-maven.yml | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index b0d773cec..7b4784de8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -35,7 +35,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5b8e79e50..311e52841 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 @@ -56,7 +56,7 @@ jobs: steps: - name: Checkout pages - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: 'gh-pages' diff --git a/.github/workflows/java-ea-maven.yml b/.github/workflows/java-ea-maven.yml index 6ec751acf..586b2c745 100644 --- a/.github/workflows/java-ea-maven.yml +++ b/.github/workflows/java-ea-maven.yml @@ -19,7 +19,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 diff --git a/.github/workflows/java8-maven.yml b/.github/workflows/java8-maven.yml index 5f2666414..40a33f18d 100644 --- a/.github/workflows/java8-maven.yml +++ b/.github/workflows/java8-maven.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 @@ -46,7 +46,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 @@ -96,7 +96,7 @@ jobs: steps: - name: Checkout source code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 From a7c9911ba9d628e37b1b768d086210d330b0d636 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 04:32:25 +0000 Subject: [PATCH 077/114] Bump slf4j.version from 2.0.7 to 2.0.9 Bumps `slf4j.version` from 2.0.7 to 2.0.9. Updates `org.slf4j:slf4j-api` from 2.0.7 to 2.0.9 Updates `org.slf4j:slf4j-nop` from 2.0.7 to 2.0.9 Updates `org.slf4j:slf4j-jdk14` from 2.0.7 to 2.0.9 --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-nop dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.slf4j:slf4j-jdk14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1220ba3f..ca837de7e 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ - 2.0.7 + 2.0.9 3.23.2 From 7d9f03353e3cf61120fcdd8822d2f335aec3a83e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Sep 2023 12:22:15 +0000 Subject: [PATCH 078/114] Bump com.github.tomakehurst:wiremock-jre8-standalone Bumps [com.github.tomakehurst:wiremock-jre8-standalone](https://github.com/wiremock/wiremock) from 2.35.0 to 2.35.1. - [Release notes](https://github.com/wiremock/wiremock/releases) - [Commits](https://github.com/wiremock/wiremock/compare/2.35.0...2.35.1) --- updated-dependencies: - dependency-name: com.github.tomakehurst:wiremock-jre8-standalone dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca837de7e..8d8212c31 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ com.github.tomakehurst wiremock-jre8-standalone - 2.35.0 + 2.35.1 From 2bd54ae58eb5c2f02caa54d4d01ac8af63bcfc8f Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 11 Sep 2023 14:58:52 +0200 Subject: [PATCH 079/114] Simplify naming and structure --- .../java/internal/sdmxdl/NoOpCaching.java | 10 +-- .../sdmxdl/web/spi/DefaultNetworking.java | 8 +- .../sdmxdl/web/spi/FailsafeConnection.java | 16 ++-- .../sdmxdl/web/spi/FailsafeDriver.java | 8 +- .../src/main/java/sdmxdl/Connection.java | 10 +-- .../src/main/java/sdmxdl/DataRepository.java | 10 +-- sdmx-dl-api/src/main/java/sdmxdl/DataSet.java | 18 ++--- .../sdmxdl/{DataDetail.java => Detail.java} | 2 +- .../src/main/java/sdmxdl/ErrorListener.java | 2 +- .../src/main/java/sdmxdl/EventListener.java | 2 +- .../java/sdmxdl/{Dataflow.java => Flow.java} | 6 +- .../sdmxdl/{DataflowRef.java => FlowRef.java} | 10 +-- sdmx-dl-api/src/main/java/sdmxdl/Key.java | 4 +- .../sdmxdl/{DataQuery.java => Query.java} | 6 +- .../src/main/java/sdmxdl/Resource.java | 4 +- .../src/main/java/sdmxdl/ResourceRef.java | 4 +- .../src/main/java/sdmxdl/SdmxManager.java | 2 +- .../src/main/java/sdmxdl/SdmxSource.java | 13 ---- sdmx-dl-api/src/main/java/sdmxdl/Source.java | 13 ++++ .../{DataStructure.java => Structure.java} | 4 +- ...ataStructureRef.java => StructureRef.java} | 10 +-- .../main/java/sdmxdl/ext/SdmxCubeUtil.java | 28 +++---- .../{SdmxFileSource.java => FileSource.java} | 12 +-- .../java/sdmxdl/file/SdmxFileManager.java | 10 +-- .../java/sdmxdl/file/spi/FileCaching.java | 8 +- .../java/sdmxdl/file/spi/FileContext.java | 8 +- .../src/main/java/sdmxdl/file/spi/Reader.java | 6 +- .../main/java/sdmxdl/web/SdmxWebManager.java | 36 ++++----- .../{SdmxWebSource.java => WebSource.java} | 6 +- .../java/sdmxdl/web/spi/Authenticator.java | 6 +- .../src/main/java/sdmxdl/web/spi/Driver.java | 6 +- .../src/main/java/sdmxdl/web/spi/Monitor.java | 4 +- .../main/java/sdmxdl/web/spi/Networking.java | 8 +- .../main/java/sdmxdl/web/spi/WebCaching.java | 14 ++-- .../main/java/sdmxdl/web/spi/WebContext.java | 12 +-- .../java/_test/sdmxdl/TestConnection.java | 30 ++++---- .../test/java/_test/sdmxdl/TestDriver.java | 16 ++-- .../web/spi/FailsafeConnectionTest.java | 18 ++--- .../test/java/sdmxdl/DataRepositoryTest.java | 14 ++-- .../src/test/java/sdmxdl/DataSetTest.java | 16 ++-- ...{DataflowRefTest.java => FlowRefTest.java} | 40 +++++----- sdmx-dl-api/src/test/java/sdmxdl/KeyTest.java | 10 +-- ...tureRefTest.java => StructureRefTest.java} | 40 +++++----- .../java/sdmxdl/ext/SdmxCubeUtilTest.java | 12 +-- .../java/sdmxdl/file/SdmxFileManagerTest.java | 2 +- .../java/sdmxdl/file/SdmxFileSourceTest.java | 6 +- .../java/sdmxdl/web/SdmxWebManagerTest.java | 34 ++++----- .../java/sdmxdl/web/SdmxWebSourceTest.java | 26 +++---- .../tests/sdmxdl/api/ConnectionAssert.java | 30 ++++---- .../java/tests/sdmxdl/api/RepoSamples.java | 12 +-- .../java/tests/sdmxdl/api/SdmxConditions.java | 2 +- .../tests/sdmxdl/api/SdmxManagerAssert.java | 10 +-- .../sdmxdl/file/spi/FileCachingAssert.java | 4 +- .../tests/sdmxdl/file/spi/ReaderAssert.java | 6 +- .../sdmxdl/web/spi/AuthenticatorAssert.java | 4 +- .../tests/sdmxdl/web/spi/DriverAssert.java | 8 +- .../tests/sdmxdl/web/spi/MockedDriver.java | 40 +++++----- .../tests/sdmxdl/web/spi/MonitorAssert.java | 4 +- .../sdmxdl/web/spi/NetworkingAssert.java | 4 +- .../sdmxdl/web/spi/WebCachingAssert.java | 4 +- .../sdmxdl/cli/ConsoleAuthenticator.java | 10 +-- .../sdmxdl/cli/ConstantAuthenticator.java | 6 +- .../sdmxdl/cli/DataflowRefConverter.java | 8 +- .../sdmxdl/cli/WebConceptOptions.java | 4 +- .../internal/sdmxdl/cli/WebFlowOptions.java | 8 +- .../internal/sdmxdl/cli/WebKeyOptions.java | 4 +- .../internal/sdmxdl/cli/WebNetOptions.java | 6 +- .../java/internal/sdmxdl/cli/WebOptions.java | 26 +++---- .../internal/sdmxdl/cli/WebSourceOptions.java | 6 +- .../java/sdmxdl/cli/CheckStatusCommand.java | 4 +- .../java/sdmxdl/cli/FetchDataCommand.java | 10 +-- .../java/sdmxdl/cli/FetchKeysCommand.java | 6 +- .../java/sdmxdl/cli/FetchMetaCommand.java | 6 +- .../sdmxdl/cli/ListAttributesCommand.java | 4 +- .../sdmxdl/cli/ListDimensionsCommand.java | 4 +- .../java/sdmxdl/cli/ListFlowsCommand.java | 14 ++-- .../java/sdmxdl/cli/ListSourcesCommand.java | 28 +++---- .../cli/experimental/CheckRulesCommand.java | 4 +- .../cli/experimental/DebugDataCommand.java | 4 +- .../cli/experimental/DebugListCommand.java | 12 +-- .../cli/experimental/FetchExtraCommand.java | 8 +- sdmx-dl-cli/src/test/java/_demo/Demo.java | 12 +-- .../src/test/java/_test/FileSample.java | 6 +- .../sdmxdl/cli/ConstantAuthenticatorTest.java | 4 +- .../internal/sdmxdl/cli/WebOptionsTest.java | 4 +- .../sdmxdl/desktop/DataSetRefFormats.java | 2 +- .../sdmxdl/desktop/DataSourceRefFormats.java | 4 +- .../sdmxdl/desktop/DesktopWebFactory.java | 4 +- .../internal/sdmxdl/desktop/ObsFormats.java | 6 +- .../sdmxdl/desktop/SdmxAutoCompletion.java | 40 +++++----- .../java/sdmxdl/desktop/DataNodeFactory.java | 2 +- .../java/sdmxdl/desktop/DataSourceRef.java | 4 +- .../main/java/sdmxdl/desktop/FlowStruct.java | 8 +- .../java/sdmxdl/desktop/MainComponent.java | 14 ++-- .../java/sdmxdl/desktop/SingleSeries.java | 6 +- .../sdmxdl/format/DiskCachingSupport.java | 10 +-- .../java/sdmxdl/format/MemCachingSupport.java | 10 +-- .../sdmxdl/format/MemCachingSupportTest.java | 8 +- .../tests/sdmxdl/format/DataCursorAssert.java | 6 +- .../sdmxdl/format/csv/SdmxCsvFieldWriter.java | 8 +- .../java/sdmxdl/format/csv/SdmxCsvFields.java | 12 +-- .../format/csv/SdmxPicocsvFormatter.java | 10 +-- .../sdmxdl/format/csv/SdmxPicocsvParser.java | 12 +-- .../format/csv/SdmxCsvFieldWriterTest.java | 14 ++-- .../sdmxdl/format/csv/SdmxCsvFieldsTest.java | 24 +++--- .../sdmxdl/format/kryo/KryoFileFormat.java | 64 ++++++++-------- .../format/protobuf/ProtobufRepositories.java | 37 +++++----- .../format/protobuf/ProtobufSources.java | 7 +- .../format/protobuf/ProtobufSourcesTest.java | 6 +- .../xml/CustomDataStructureBuilder.java | 10 +-- .../sdmxdl/format/xml/XMLStreamFlow20.java | 24 +++--- .../sdmxdl/format/xml/XMLStreamFlow21.java | 28 +++---- .../format/xml/XMLStreamStructure20.java | 22 +++--- .../format/xml/XMLStreamStructure21.java | 28 +++---- .../format/xml/DataStructureDecoder.java | 26 +++---- .../sdmxdl/format/xml/SdmxXmlStreams.java | 24 +++--- .../java/sdmxdl/format/xml/XmlFileSource.java | 20 ++--- .../java/sdmxdl/format/xml/XmlWebSource.java | 22 +++--- .../xml/XMLStreamCompactDataCursorTest.java | 6 +- .../format/xml/XMLStreamFlow20Test.java | 20 ++--- .../format/xml/XMLStreamFlow21Test.java | 40 +++++----- .../xml/XMLStreamGenericDataCursorTest.java | 8 +- .../format/xml/XMLStreamStructure20Test.java | 8 +- .../format/xml/XMLStreamStructure21Test.java | 4 +- ...derTest.java => StructureDecoderTest.java} | 22 +++--- .../sdmxdl/format/xml/XmlFileSourceTest.java | 10 +-- .../sdmxdl/format/xml/XmlWebSourceTest.java | 8 +- .../main/java/sdmxdl/grpc/GrpcWebFactory.java | 4 +- .../sdmxdl/grpc/SdmxWebManagerService.java | 23 +++--- .../sdmxdl/provider/CommonSdmxExceptions.java | 8 +- .../sdmxdl/provider/ConnectionSupport.java | 4 +- .../main/java/sdmxdl/provider/DataRef.java | 8 +- .../main/java/sdmxdl/provider/HasMarker.java | 8 +- .../sdmxdl/provider/PropertiesSupport.java | 8 +- .../provider/ext/SeriesMetaFactory.java | 16 ++-- .../provider/file/CachedFileClient.java | 10 +-- .../sdmxdl/provider/file/FileConnection.java | 20 ++--- .../java/sdmxdl/provider/file/FileInfo.java | 4 +- .../sdmxdl/provider/web/CachedRestClient.java | 52 ++++++------- .../sdmxdl/provider/web/DriverSupport.java | 10 +-- .../java/sdmxdl/provider/web/RestClient.java | 8 +- .../provider/web/RestClientSupplier.java | 4 +- .../sdmxdl/provider/web/RestConnection.java | 34 ++++----- .../sdmxdl/provider/web/RestConnector.java | 10 +-- .../provider/web/SingleNetworkingSupport.java | 8 +- .../sdmxdl/provider/web/WebConnector.java | 4 +- .../sdmxdl/provider/web/WebValidators.java | 20 ++--- .../sdmxdl/util/XCountingRestClient.java | 8 +- .../_test/sdmxdl/util/XFailingRestClient.java | 24 +++--- .../_test/sdmxdl/util/XRepoRestClient.java | 8 +- .../provider/CommonSdmxExceptionsTest.java | 8 +- .../provider/file/CachedFileClientTest.java | 10 +-- .../provider/web/CachedRestClientTest.java | 18 ++--- .../connectors/drivers/Connectors.java | 24 +++--- .../drivers/ConnectorsRestClient.java | 20 ++--- .../connectors/drivers/EurostatDriver.java | 4 +- .../connectors/drivers/ImfDriver.java | 4 +- .../connectors/drivers/InseeDriver.java | 4 +- .../connectors/drivers/NbbDriver.java | 4 +- .../connectors/drivers/OecdDriver.java | 4 +- .../drivers/PortableTimeSeriesCursor.java | 4 +- .../connectors/drivers/Sdmx21Driver.java | 36 ++++----- .../provider/connectors/drivers/SeDriver.java | 4 +- .../connectors/drivers/UisDriver.java | 4 +- .../samples/ConnectorsResource.java | 10 +-- .../connectors/samples/FacadeResource.java | 32 ++++---- .../connectors/samples/ParsersTest.java | 14 ++-- .../connectors/drivers/ConnectorsTest.java | 12 +-- .../connectors/drivers/Sdmx20DriverTest.java | 4 +- .../dialects/drivers/BbkDialectDriver.java | 12 +-- .../drivers/DotStatDialectDriver.java | 12 +-- .../dialects/drivers/DotStatRestParsers.java | 18 ++--- .../dialects/drivers/DotStatRestQueries.java | 16 ++-- .../dialects/drivers/EstatDialectDriver.java | 16 ++-- .../dialects/drivers/ImfDialectDriver.java | 14 ++-- .../dialects/drivers/InseeDialectDriver.java | 14 ++-- .../dialects/drivers/NbbDialectDriver.java | 10 +-- .../drivers/StatCanDialectDriver.java | 62 ++++++++-------- .../drivers/BbkDialectDriverTest.java | 18 ++--- .../drivers/NbbDialectDriverTest.java | 4 +- .../drivers/StatCanDialectDriverTest.java | 36 ++++----- .../provider/px/drivers/PxWebDriver.java | 74 +++++++++---------- .../provider/px/drivers/PxWebDriverTest.java | 4 +- .../WinPasswordVaultAuthenticator.java | 8 +- .../sdmxdl/provider/ri/caching/RiCaching.java | 22 +++--- .../provider/ri/drivers/FileRiDriver.java | 18 ++--- .../provider/ri/drivers/RiHttpUtils.java | 10 +-- .../provider/ri/drivers/RiRestClient.java | 26 +++---- .../provider/ri/drivers/RiRestParsers.java | 8 +- .../provider/ri/drivers/RiRestQueries.java | 12 +-- .../provider/ri/drivers/RngRiDriver.java | 28 +++---- .../ri/drivers/Sdmx21RestParsers.java | 8 +- .../ri/drivers/Sdmx21RestQueries.java | 14 ++-- .../provider/ri/drivers/Sdmx21RiDriver.java | 48 ++++++------ .../provider/ri/drivers/SourceProperties.java | 4 +- .../provider/ri/monitors/UpptimeMonitor.java | 4 +- .../ri/monitors/UptimeRobotMonitor.java | 6 +- .../provider/ri/networking/RiNetworking.java | 8 +- .../sdmxdl/provider/ri/readers/Decoder.java | 4 +- .../provider/ri/readers/XmlDecoder.java | 20 ++--- .../provider/ri/readers/XmlFileClient.java | 10 +-- .../sdmxdl/provider/ri/readers/XmlReader.java | 18 ++--- .../provider/ri/drivers/RiHttpUtilsTest.java | 9 +-- .../provider/ri/drivers/RiRestClientTest.java | 8 +- .../ri/drivers/RiRestParsersTest.java | 15 ++-- .../provider/ri/drivers/RngRiDriverTest.java | 16 ++-- .../ri/drivers/Sdmx21RestParsersTest.java | 6 +- .../ri/drivers/Sdmx21RestQueriesTest.java | 19 +++-- .../ri/monitors/UpptimeMonitorTest.java | 5 +- .../ri/monitors/UptimeRobotMonitorTest.java | 5 +- .../ri/readers/XmlFileClientTest.java | 17 ++--- .../provider/ri/readers/XmlReaderTest.java | 7 +- .../main/java/sdmxdl/testing/OtherRules.java | 8 +- .../main/java/sdmxdl/testing/RangeRules.java | 12 +-- .../main/java/sdmxdl/testing/WebRequest.java | 8 +- .../main/java/sdmxdl/testing/WebResponse.java | 14 ++-- .../sdmxdl/testing/xml/XmlSourceQuery.java | 12 +-- 217 files changed, 1415 insertions(+), 1429 deletions(-) rename sdmx-dl-api/src/main/java/sdmxdl/{DataDetail.java => Detail.java} (96%) rename sdmx-dl-api/src/main/java/sdmxdl/{Dataflow.java => Flow.java} (87%) rename sdmx-dl-api/src/main/java/sdmxdl/{DataflowRef.java => FlowRef.java} (81%) rename sdmx-dl-api/src/main/java/sdmxdl/{DataQuery.java => Query.java} (87%) delete mode 100644 sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java create mode 100644 sdmx-dl-api/src/main/java/sdmxdl/Source.java rename sdmx-dl-api/src/main/java/sdmxdl/{DataStructure.java => Structure.java} (95%) rename sdmx-dl-api/src/main/java/sdmxdl/{DataStructureRef.java => StructureRef.java} (75%) rename sdmx-dl-api/src/main/java/sdmxdl/file/{SdmxFileSource.java => FileSource.java} (75%) rename sdmx-dl-api/src/main/java/sdmxdl/web/{SdmxWebSource.java => WebSource.java} (94%) rename sdmx-dl-api/src/test/java/sdmxdl/{DataflowRefTest.java => FlowRefTest.java} (73%) rename sdmx-dl-api/src/test/java/sdmxdl/{DataStructureRefTest.java => StructureRefTest.java} (71%) rename sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/{DataStructureDecoderTest.java => StructureDecoderTest.java} (86%) diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java index eb6ca0b15..6068bccfe 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpCaching.java @@ -6,10 +6,10 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebCaching; import java.util.Collection; @@ -40,17 +40,17 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getReaderCache(@NonNull FileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return Cache.noOp(); } @Override - public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getDriverCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return Cache.noOp(); } @Override - public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getMonitorCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return Cache.noOp(); } diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java index b4a80f6dd..53c385288 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/DefaultNetworking.java @@ -4,7 +4,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.Networking; @@ -37,9 +37,9 @@ public boolean isNetworkingAvailable() { @Override public @NonNull Network getNetwork( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { return Network.getDefault(); } } diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeConnection.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeConnection.java index 22b66af60..ee6db32a1 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeConnection.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeConnection.java @@ -59,8 +59,8 @@ public void testConnection() throws IOException { } @Override - public @NonNull Collection getFlows() throws IOException { - Collection result; + public @NonNull Collection getFlows() throws IOException { + Collection result; try { result = delegate.getFlows(); @@ -76,8 +76,8 @@ public void testConnection() throws IOException { } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException { - Dataflow result; + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException { + Flow result; try { result = delegate.getFlow(flowRef); @@ -95,8 +95,8 @@ public void testConnection() throws IOException { } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException { - DataStructure result; + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException { + Structure result; try { result = delegate.getStructure(flowRef); @@ -114,7 +114,7 @@ public void testConnection() throws IOException { } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { DataSet result; try { @@ -133,7 +133,7 @@ public void testConnection() throws IOException { } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { Stream result; try { diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java index 575d06493..e5dec3793 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/web/spi/FailsafeDriver.java @@ -20,7 +20,7 @@ import lombok.NonNull; import sdmxdl.Connection; import sdmxdl.Languages; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -91,7 +91,7 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { Connection result; try { @@ -110,8 +110,8 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Collection getDefaultSources() { - Collection result; + public @NonNull Collection getDefaultSources() { + Collection result; try { result = delegate.getDefaultSources(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Connection.java b/sdmx-dl-api/src/main/java/sdmxdl/Connection.java index 0d200f153..b955c4d8c 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/Connection.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Connection.java @@ -33,15 +33,15 @@ public interface Connection extends Closeable { void testConnection() throws IOException; - @NonNull Collection getFlows() throws IOException; + @NonNull Collection getFlows() throws IOException; - @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException; + @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException; - @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException; + @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException; - @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException; + @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException; - @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException; + @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException; @NonNull Set getSupportedFeatures() throws IOException; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java b/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java index e80d8ac36..c49356a29 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/DataRepository.java @@ -36,11 +36,11 @@ public class DataRepository implements HasExpiration { @lombok.NonNull @lombok.Singular - List structures; + List structures; @lombok.NonNull @lombok.Singular - List flows; + List flows; @lombok.NonNull @lombok.Singular @@ -55,7 +55,7 @@ public class DataRepository implements HasExpiration { Instant expirationTime = Instant.MAX; @NonNull - public Optional getStructure(@NonNull DataStructureRef ref) { + public Optional getStructure(@NonNull StructureRef ref) { return structures .stream() .filter(ref::equalsRef) @@ -63,7 +63,7 @@ public Optional getStructure(@NonNull DataStructureRef ref) { } @NonNull - public Optional getFlow(@NonNull DataflowRef ref) { + public Optional getFlow(@NonNull FlowRef ref) { return flows .stream() .filter(ref::containsRef) @@ -71,7 +71,7 @@ public Optional getFlow(@NonNull DataflowRef ref) { } @NonNull - public Optional getDataSet(@NonNull DataflowRef ref) { + public Optional getDataSet(@NonNull FlowRef ref) { return dataSets .stream() .filter(ref::containsRef) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataSet.java b/sdmx-dl-api/src/main/java/sdmxdl/DataSet.java index 2ab7d1531..15ac55f43 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataSet.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/DataSet.java @@ -34,32 +34,32 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class DataSet extends Resource { +public class DataSet extends Resource { @lombok.NonNull - DataflowRef ref; + FlowRef ref; @lombok.NonNull @lombok.Builder.Default - DataQuery query = DataQuery.ALL; + Query query = Query.ALL; @lombok.NonNull @lombok.Singular("series") Collection data; - public @NonNull DataSet getData(@NonNull DataQuery query) { - return query.equals(DataQuery.ALL) ? this : query.execute(data.stream()).collect(toDataSet(ref, query)); + public @NonNull DataSet getData(@NonNull Query query) { + return query.equals(Query.ALL) ? this : query.execute(data.stream()).collect(toDataSet(ref, query)); } - public @NonNull Stream getDataStream(@NonNull DataQuery query) { - return query.equals(DataQuery.ALL) ? data.stream() : query.execute(data.stream()); + public @NonNull Stream getDataStream(@NonNull Query query) { + return query.equals(Query.ALL) ? data.stream() : query.execute(data.stream()); } - public static @NonNull Collector toDataSet(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public static @NonNull Collector toDataSet(@NonNull FlowRef flowRef, @NonNull Query query) { return collectingAndThen(toList(), newDataSet(flowRef, query)); } - private static Function, DataSet> newDataSet(DataflowRef flowRef, DataQuery query) { + private static Function, DataSet> newDataSet(FlowRef flowRef, Query query) { return list -> new DataSet(flowRef, query, unmodifiableList(list)); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataDetail.java b/sdmx-dl-api/src/main/java/sdmxdl/Detail.java similarity index 96% rename from sdmx-dl-api/src/main/java/sdmxdl/DataDetail.java rename to sdmx-dl-api/src/main/java/sdmxdl/Detail.java index f2580b362..df4ff752b 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataDetail.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Detail.java @@ -6,7 +6,7 @@ * Describe an amount of information */ @lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) -public enum DataDetail { +public enum Detail { /** * All data and documentation, including annotations diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java index 1c9180f1c..9e5472d38 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ErrorListener.java @@ -6,7 +6,7 @@ import java.util.function.BiConsumer; @FunctionalInterface -public interface ErrorListener { +public interface ErrorListener { void accept(@NonNull S source, @NonNull String marker, @NonNull CharSequence message, @NonNull IOException error); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java index 8d1f71cd5..ee1360ab0 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/EventListener.java @@ -5,7 +5,7 @@ import java.util.function.Consumer; @FunctionalInterface -public interface EventListener { +public interface EventListener { void accept(@NonNull S source, @NonNull String marker, @NonNull CharSequence message); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Dataflow.java b/sdmx-dl-api/src/main/java/sdmxdl/Flow.java similarity index 87% rename from sdmx-dl-api/src/main/java/sdmxdl/Dataflow.java rename to sdmx-dl-api/src/main/java/sdmxdl/Flow.java index fc82ed287..bad5a2b81 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/Dataflow.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Flow.java @@ -24,13 +24,13 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class Dataflow extends Resource implements HasName, HasDescription { +public class Flow extends Resource implements HasName, HasDescription { @lombok.NonNull - DataflowRef ref; + FlowRef ref; @lombok.NonNull - DataStructureRef structureRef; + StructureRef structureRef; @lombok.NonNull String name; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataflowRef.java b/sdmx-dl-api/src/main/java/sdmxdl/FlowRef.java similarity index 81% rename from sdmx-dl-api/src/main/java/sdmxdl/DataflowRef.java rename to sdmx-dl-api/src/main/java/sdmxdl/FlowRef.java index f2d58a870..d894fa0fe 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataflowRef.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/FlowRef.java @@ -40,7 +40,7 @@ @lombok.Value @lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) @lombok.EqualsAndHashCode(callSuper = false) -public class DataflowRef extends ResourceRef { +public class FlowRef extends ResourceRef { @lombok.NonNull String agency; @@ -57,12 +57,12 @@ public String toString() { } @StaticFactoryMethod - public static @NonNull DataflowRef parse(@NonNull CharSequence input) throws IllegalArgumentException { - return create(input, DataflowRef::new); + public static @NonNull FlowRef parse(@NonNull CharSequence input) throws IllegalArgumentException { + return create(input, FlowRef::new); } @StaticFactoryMethod - public static @NonNull DataflowRef of(@Nullable String agency, @NonNull String id, @Nullable String version) throws IllegalArgumentException { - return of(agency, id, version, DataflowRef::new); + public static @NonNull FlowRef of(@Nullable String agency, @NonNull String id, @Nullable String version) throws IllegalArgumentException { + return of(agency, id, version, FlowRef::new); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Key.java b/sdmx-dl-api/src/main/java/sdmxdl/Key.java index 3ad32e29b..18862027b 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/Key.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Key.java @@ -107,7 +107,7 @@ public boolean supersedes(@NonNull Key that) { } @Nullable - public String validateOn(@NonNull DataStructure dsd) { + public String validateOn(@NonNull Structure dsd) { if (this == ALL) { return null; } @@ -188,7 +188,7 @@ private boolean equals(Key that) { } @NonNull - public static Builder builder(@NonNull DataStructure dfs) { + public static Builder builder(@NonNull Structure dfs) { List dimensions = dfs.getDimensionList(); Map result = new HashMap<>(); for (int i = 0; i < dimensions.size(); i++) { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataQuery.java b/sdmx-dl-api/src/main/java/sdmxdl/Query.java similarity index 87% rename from sdmx-dl-api/src/main/java/sdmxdl/DataQuery.java rename to sdmx-dl-api/src/main/java/sdmxdl/Query.java index f9e218891..792f3c748 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataQuery.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Query.java @@ -6,9 +6,9 @@ @lombok.Value @lombok.Builder(toBuilder = true) -public class DataQuery { +public class Query { - public static final DataQuery ALL = DataQuery.builder().build(); + public static final Query ALL = Query.builder().build(); @lombok.NonNull @lombok.Builder.Default @@ -16,7 +16,7 @@ public class DataQuery { @lombok.NonNull @lombok.Builder.Default - DataDetail detail = DataDetail.FULL; + Detail detail = Detail.FULL; public @NonNull Stream execute(@NonNull Stream data) { return data diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Resource.java b/sdmx-dl-api/src/main/java/sdmxdl/Resource.java index 2a7c8b1cc..8eb82011d 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/Resource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Resource.java @@ -26,8 +26,8 @@ * @author Philippe Charles */ @SealedType({ - DataStructure.class, - Dataflow.class, + Structure.class, + Flow.class, Codelist.class, DataSet.class }) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ResourceRef.java b/sdmx-dl-api/src/main/java/sdmxdl/ResourceRef.java index 685bf4c0d..ce17c4aa1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ResourceRef.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ResourceRef.java @@ -27,8 +27,8 @@ * @author Philippe Charles */ @SealedType({ - DataStructureRef.class, - DataflowRef.class, + StructureRef.class, + FlowRef.class, CodelistRef.class }) public abstract class ResourceRef> { diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java index b5de66c09..e686dc5c9 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/SdmxManager.java @@ -33,7 +33,7 @@ SdmxWebManager.class }) @ThreadSafe -public abstract class SdmxManager { +public abstract class SdmxManager { public abstract @NonNull Connection getConnection(@NonNull SOURCE source, @NonNull Languages languages) throws IOException; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java b/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java deleted file mode 100644 index 8551e6b3a..000000000 --- a/sdmx-dl-api/src/main/java/sdmxdl/SdmxSource.java +++ /dev/null @@ -1,13 +0,0 @@ -package sdmxdl; - -import nbbrd.design.SealedType; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; - -@SealedType({ - SdmxFileSource.class, - SdmxWebSource.class -}) -public abstract class SdmxSource { - -} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Source.java b/sdmx-dl-api/src/main/java/sdmxdl/Source.java new file mode 100644 index 000000000..a3f6a02b4 --- /dev/null +++ b/sdmx-dl-api/src/main/java/sdmxdl/Source.java @@ -0,0 +1,13 @@ +package sdmxdl; + +import nbbrd.design.SealedType; +import sdmxdl.file.FileSource; +import sdmxdl.web.WebSource; + +@SealedType({ + FileSource.class, + WebSource.class +}) +public abstract class Source { + +} diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataStructure.java b/sdmx-dl-api/src/main/java/sdmxdl/Structure.java similarity index 95% rename from sdmx-dl-api/src/main/java/sdmxdl/DataStructure.java rename to sdmx-dl-api/src/main/java/sdmxdl/Structure.java index 5487b7e2a..0ff1e99c6 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataStructure.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Structure.java @@ -33,13 +33,13 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class DataStructure extends Resource implements HasName { +public class Structure extends Resource implements HasName { /** * Non-null unique reference to this data structure. */ @lombok.NonNull - DataStructureRef ref; + StructureRef ref; /** * Non-null list of statistical concepts used to identify a statistical diff --git a/sdmx-dl-api/src/main/java/sdmxdl/DataStructureRef.java b/sdmx-dl-api/src/main/java/sdmxdl/StructureRef.java similarity index 75% rename from sdmx-dl-api/src/main/java/sdmxdl/DataStructureRef.java rename to sdmx-dl-api/src/main/java/sdmxdl/StructureRef.java index 619897a0e..775bf9678 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/DataStructureRef.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/StructureRef.java @@ -31,7 +31,7 @@ @lombok.Value @lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) @lombok.EqualsAndHashCode(callSuper = false) -public class DataStructureRef extends ResourceRef { +public class StructureRef extends ResourceRef { @lombok.NonNull String agency; @@ -48,12 +48,12 @@ public String toString() { } @StaticFactoryMethod - public static @NonNull DataStructureRef parse(@NonNull CharSequence input) throws IllegalArgumentException { - return create(input, DataStructureRef::new); + public static @NonNull StructureRef parse(@NonNull CharSequence input) throws IllegalArgumentException { + return create(input, StructureRef::new); } @StaticFactoryMethod - public static @NonNull DataStructureRef of(@Nullable String agency, @NonNull String id, @Nullable String version) throws IllegalArgumentException { - return of(agency, id, version, DataStructureRef::new); + public static @NonNull StructureRef of(@Nullable String agency, @NonNull String id, @Nullable String version) throws IllegalArgumentException { + return of(agency, id, version, StructureRef::new); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxCubeUtil.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxCubeUtil.java index 118701f49..2593cf3d3 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxCubeUtil.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/SdmxCubeUtil.java @@ -27,7 +27,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static sdmxdl.DataDetail.*; +import static sdmxdl.Detail.*; /** * Utility class used by JDemetra+ plugin. @@ -37,7 +37,7 @@ @lombok.experimental.UtilityClass public class SdmxCubeUtil { - public @NonNull Stream getAllSeries(@NonNull Connection conn, @NonNull DataflowRef flow, @NonNull Key node) throws IOException, IllegalArgumentException { + public @NonNull Stream getAllSeries(@NonNull Connection conn, @NonNull FlowRef flow, @NonNull Key node) throws IOException, IllegalArgumentException { if (node.isSeries()) { throw new IllegalArgumentException("Expecting node"); } @@ -46,7 +46,7 @@ public class SdmxCubeUtil { : computeKeys(conn, flow, node); } - public @NonNull Stream getAllSeriesWithData(@NonNull Connection conn, @NonNull DataflowRef flow, @NonNull Key node) throws IOException, IllegalArgumentException { + public @NonNull Stream getAllSeriesWithData(@NonNull Connection conn, @NonNull FlowRef flow, @NonNull Key node) throws IOException, IllegalArgumentException { if (node.isSeries()) { throw new IllegalArgumentException("Expecting node"); } @@ -55,7 +55,7 @@ public class SdmxCubeUtil { : computeKeysAndRequestData(conn, flow, node); } - public @NonNull Optional getSeries(@NonNull Connection conn, @NonNull DataflowRef flow, @NonNull Key leaf) throws IOException, IllegalArgumentException { + public @NonNull Optional getSeries(@NonNull Connection conn, @NonNull FlowRef flow, @NonNull Key leaf) throws IOException, IllegalArgumentException { if (!leaf.isSeries()) { throw new IllegalArgumentException("Expecting leaf"); } @@ -64,7 +64,7 @@ public class SdmxCubeUtil { } } - public @NonNull Optional getSeriesWithData(@NonNull Connection conn, @NonNull DataflowRef flow, @NonNull Key leaf) throws IOException, IllegalArgumentException { + public @NonNull Optional getSeriesWithData(@NonNull Connection conn, @NonNull FlowRef flow, @NonNull Key leaf) throws IOException, IllegalArgumentException { if (!leaf.isSeries()) { throw new IllegalArgumentException("Expecting leaf"); } @@ -73,7 +73,7 @@ public class SdmxCubeUtil { } } - public @NonNull Stream getChildren(@NonNull Connection conn, @NonNull DataflowRef flow, @NonNull Key node, @NonNegative int dimensionIndex) throws IOException { + public @NonNull Stream getChildren(@NonNull Connection conn, @NonNull FlowRef flow, @NonNull Key node, @NonNegative int dimensionIndex) throws IOException { if (dimensionIndex < 0) { throw new IllegalArgumentException("Expecting dimensionIndex >= 0"); } @@ -88,11 +88,11 @@ public class SdmxCubeUtil { : computeAllPossibleChildren(conn.getStructure(flow).getDimensionList(), dimensionIndex); } - public @NonNull Optional getDimensionById(@NonNull DataStructure dsd, @NonNull String id) { + public @NonNull Optional getDimensionById(@NonNull Structure dsd, @NonNull String id) { return dsd.getDimensions().stream().filter(dimension -> dimension.getId().equals(id)).findFirst(); } - public @NonNull OptionalInt getDimensionIndexById(@NonNull DataStructure dsd, @NonNull String id) { + public @NonNull OptionalInt getDimensionIndexById(@NonNull Structure dsd, @NonNull String id) { List dimensionList = dsd.getDimensionList(); for (int i = 0; i < dimensionList.size(); i++) { if (dimensionList.get(i).getId().equals(id)) { @@ -102,28 +102,28 @@ public class SdmxCubeUtil { return OptionalInt.empty(); } - private Stream request(Connection conn, DataflowRef flow, Key key, DataDetail detail) throws IOException { - return conn.getDataStream(flow, DataQuery.builder().key(key).detail(detail).build()); + private Stream request(Connection conn, FlowRef flow, Key key, Detail detail) throws IOException { + return conn.getDataStream(flow, Query.builder().key(key).detail(detail).build()); } - private Stream computeKeys(Connection conn, DataflowRef flow, Key key) throws IOException { + private Stream computeKeys(Connection conn, FlowRef flow, Key key) throws IOException { return computeAllPossibleSeries(conn.getStructure(flow), key) .map(SdmxCubeUtil::emptySeriesOf); } - private Stream computeKeysAndRequestData(Connection conn, DataflowRef flow, Key key) throws IOException { + private Stream computeKeysAndRequestData(Connection conn, FlowRef flow, Key key) throws IOException { Map dataByKey = dataByKey(conn, flow, key); return computeAllPossibleSeries(conn.getStructure(flow), key) .map(seriesKey -> dataByKey.computeIfAbsent(seriesKey, SdmxCubeUtil::emptySeriesOf)); } - private Map dataByKey(Connection conn, DataflowRef flow, Key key) throws IOException { + private Map dataByKey(Connection conn, FlowRef flow, Key key) throws IOException { try (Stream cursor = request(conn, flow, key, FULL)) { return cursor.collect(Collectors.toMap(Series::getKey, Function.identity())); } } - private Stream computeAllPossibleSeries(DataStructure dsd, Key ref) { + private Stream computeAllPossibleSeries(Structure dsd, Key ref) { return computeAllPossibleSeries(dsd.getDimensionList(), ref); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java b/sdmx-dl-api/src/main/java/sdmxdl/file/FileSource.java similarity index 75% rename from sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java rename to sdmx-dl-api/src/main/java/sdmxdl/file/FileSource.java index 5517e8ecf..23f41ba29 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/FileSource.java @@ -18,8 +18,8 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataflowRef; -import sdmxdl.SdmxSource; +import sdmxdl.FlowRef; +import sdmxdl.Source; import java.io.File; @@ -29,17 +29,17 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class SdmxFileSource extends SdmxSource { +public class FileSource extends Source { @NonNull File data; @Nullable File structure; - public @NonNull DataflowRef asDataflowRef() { - return DataflowRef.parse("data" + (structure != null && !structure.toString().isEmpty() ? "&struct" : "")); + public @NonNull FlowRef asDataflowRef() { + return FlowRef.parse("data" + (structure != null && !structure.toString().isEmpty() ? "&struct" : "")); } - public static @NonNull String asFlowLabel(@NonNull SdmxFileSource source) { + public static @NonNull String asFlowLabel(@NonNull FileSource source) { return source.getData().getName().replace(".xml", ""); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java index 206d5d0c5..b7b0dd5b1 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/SdmxFileManager.java @@ -37,7 +37,7 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class SdmxFileManager extends SdmxManager { +public class SdmxFileManager extends SdmxManager { @StaticFactoryMethod public static @NonNull SdmxFileManager ofServiceLoader() { @@ -55,9 +55,9 @@ public class SdmxFileManager extends SdmxManager { @lombok.Builder.Default @NonNull FileCaching caching = FileCaching.noOp(); - @Nullable EventListener onEvent; + @Nullable EventListener onEvent; - @Nullable ErrorListener onError; + @Nullable ErrorListener onError; @lombok.Singular @NonNull List readers; @@ -66,7 +66,7 @@ public class SdmxFileManager extends SdmxManager { @NonNull FileContext context = initLazyContext(); @Override - public @NonNull Connection getConnection(@NonNull SdmxFileSource source, @NonNull Languages languages) throws IOException { + public @NonNull Connection getConnection(@NonNull FileSource source, @NonNull Languages languages) throws IOException { Reader reader = lookupReader(source) .orElseThrow(() -> new IOException("cannot find reader for source '" + source + "'")); @@ -82,7 +82,7 @@ private FileContext initLazyContext() { .build(); } - private Optional lookupReader(SdmxFileSource source) { + private Optional lookupReader(FileSource source) { return readers.stream() .filter(reader -> reader.canRead(source)) .findFirst(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java index 6d50574ad..598807051 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileCaching.java @@ -12,7 +12,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import java.util.Collection; @@ -30,9 +30,9 @@ public interface FileCaching { int getFileCachingRank(); @NonNull Cache getReaderCache( - @NonNull SdmxFileSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError); + @NonNull FileSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); @NonNull Collection getFileCachingProperties(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java index bac941d8a..b717f9a29 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/FileContext.java @@ -6,7 +6,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; @lombok.Value @lombok.Builder(toBuilder = true) @@ -15,11 +15,11 @@ public class FileContext { @lombok.Builder.Default @NonNull FileCaching caching = FileCaching.noOp(); - @Nullable EventListener onEvent; + @Nullable EventListener onEvent; - @Nullable ErrorListener onError; + @Nullable ErrorListener onError; - public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source) { + public @NonNull Cache getReaderCache(@NonNull FileSource source) { return caching.getReaderCache(source, onEvent, onError); } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java index 7300c40f0..e3aa9237e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/file/spi/Reader.java @@ -21,7 +21,7 @@ import nbbrd.service.*; import sdmxdl.Connection; import sdmxdl.Languages; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import java.io.IOException; @@ -44,10 +44,10 @@ public interface Reader { @ServiceFilter boolean isReaderAvailable(); - boolean canRead(@NonNull SdmxFileSource source); + boolean canRead(@NonNull FileSource source); @NonNull Connection read( - @NonNull SdmxFileSource source, + @NonNull FileSource source, @NonNull Languages languages, @NonNull FileContext context ) throws IOException, IllegalArgumentException; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java index 35db0f58b..a30593516 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebManager.java @@ -44,7 +44,7 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class SdmxWebManager extends SdmxManager { +public class SdmxWebManager extends SdmxManager { @StaticFactoryMethod public static @NonNull SdmxWebManager ofServiceLoader() { @@ -75,34 +75,34 @@ public class SdmxWebManager extends SdmxManager { @lombok.Builder.Default @NonNull WebCaching caching = WebCaching.noOp(); - @Nullable EventListener onEvent; + @Nullable EventListener onEvent; - @Nullable ErrorListener onError; + @Nullable ErrorListener onError; @lombok.Singular @NonNull List authenticators; @lombok.Singular - @NonNull List customSources; + @NonNull List customSources; @lombok.Getter(lazy = true) - @NonNull List defaultSources = initLazyDefaultSources(getDrivers()); + @NonNull List defaultSources = initLazyDefaultSources(getDrivers()); @lombok.Getter(lazy = true) - @NonNull SortedMap sources = initLazySourceMap(getCustomSources(), getDefaultSources()); + @NonNull SortedMap sources = initLazySourceMap(getCustomSources(), getDefaultSources()); @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) @NonNull WebContext context = initLazyContext(); public @NonNull Connection getConnection(@NonNull String name, @NonNull Languages languages) throws IOException { - SdmxWebSource source = lookupSource(name) + WebSource source = lookupSource(name) .orElseThrow(() -> newMissingSource(name)); return getConnection(source, languages); } @Override - public @NonNull Connection getConnection(@NonNull SdmxWebSource source, @NonNull Languages languages) throws IOException { + public @NonNull Connection getConnection(@NonNull WebSource source, @NonNull Languages languages) throws IOException { Driver driver = lookupDriverById(source.getDriver()) .orElseThrow(() -> new IOException("Failed to find a suitable driver for '" + source + "'")); @@ -112,13 +112,13 @@ public class SdmxWebManager extends SdmxManager { } public @NonNull MonitorReport getMonitorReport(@NonNull String name) throws IOException { - SdmxWebSource source = lookupSource(name) + WebSource source = lookupSource(name) .orElseThrow(() -> newMissingSource(name)); return getMonitorReport(source); } - public @NonNull MonitorReport getMonitorReport(@NonNull SdmxWebSource source) throws IOException { + public @NonNull MonitorReport getMonitorReport(@NonNull WebSource source) throws IOException { URI monitorURI = source.getMonitor(); if (monitorURI == null) { @@ -131,7 +131,7 @@ public class SdmxWebManager extends SdmxManager { return monitor.getReport(source, getContext()); } - private void checkSourceProperties(SdmxWebSource source, Driver driver) { + private void checkSourceProperties(WebSource source, Driver driver) { if (onEvent != null) { Collection expected = new ArrayList<>(); expected.addAll(driver.getDriverProperties()); @@ -145,7 +145,7 @@ private void checkSourceProperties(SdmxWebSource source, Driver driver) { } } - private Optional lookupSource(String name) { + private Optional lookupSource(String name) { return Optional.ofNullable(getSources().get(name)); } @@ -174,22 +174,22 @@ private WebContext initLazyContext() { .build(); } - private static List initLazyDefaultSources(List drivers) { + private static List initLazyDefaultSources(List drivers) { return drivers .stream() .flatMap(driver -> driver.getDefaultSources().stream()) - .filter(distinctByKey(SdmxWebSource::getId)) + .filter(distinctByKey(WebSource::getId)) .collect(toList()); } - private static SortedMap initLazySourceMap(List customSources, List defaultSources) { + private static SortedMap initLazySourceMap(List customSources, List defaultSources) { return Stream.concat(customSources.stream(), defaultSources.stream()) .flatMap(SdmxWebManager::expandAliases) - .collect(groupingBy(SdmxWebSource::getId, TreeMap::new, reducingByFirst())); + .collect(groupingBy(WebSource::getId, TreeMap::new, reducingByFirst())); } - private static Stream expandAliases(SdmxWebSource source) { - Stream first = Stream.of(source); + private static Stream expandAliases(WebSource source) { + Stream first = Stream.of(source); return !source.getAliases().isEmpty() ? Stream.concat(first, source.getAliases().stream().map(source::alias)) : first; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java b/sdmx-dl-api/src/main/java/sdmxdl/web/WebSource.java similarity index 94% rename from sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java rename to sdmx-dl-api/src/main/java/sdmxdl/web/WebSource.java index 7c6f080ff..0883e0bce 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/SdmxWebSource.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/WebSource.java @@ -19,7 +19,7 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.Languages; -import sdmxdl.SdmxSource; +import sdmxdl.Source; import java.net.MalformedURLException; import java.net.URI; @@ -33,7 +33,7 @@ @lombok.Value @lombok.Builder(toBuilder = true) @lombok.EqualsAndHashCode(callSuper = false) -public class SdmxWebSource extends SdmxSource { +public class WebSource extends Source { @NonNull String id; @@ -56,7 +56,7 @@ public class SdmxWebSource extends SdmxSource { @Nullable URL monitorWebsite; - public @NonNull SdmxWebSource alias(@NonNull String id) throws IllegalArgumentException { + public @NonNull WebSource alias(@NonNull String id) throws IllegalArgumentException { if (!aliases.contains(id)) { throw new IllegalArgumentException(id); } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java index dcb07915e..661a2ae4f 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Authenticator.java @@ -7,7 +7,7 @@ import nbbrd.service.ServiceFilter; import nbbrd.service.ServiceId; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.net.PasswordAuthentication; @@ -25,7 +25,7 @@ public interface Authenticator { @ServiceFilter boolean isAuthenticatorAvailable(); - @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException; + @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull WebSource source) throws IOException; - void invalidateAuthentication(@NonNull SdmxWebSource source) throws IOException; + void invalidateAuthentication(@NonNull WebSource source) throws IOException; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java index 2d30ce6ae..aa141bf4a 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Driver.java @@ -22,7 +22,7 @@ import nbbrd.service.*; import sdmxdl.Connection; import sdmxdl.Languages; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.Collection; @@ -48,12 +48,12 @@ public interface Driver { boolean isDriverAvailable(); @NonNull Connection connect( - @NonNull SdmxWebSource source, + @NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context ) throws IOException, IllegalArgumentException; - @NonNull Collection getDefaultSources(); + @NonNull Collection getDefaultSources(); @NonNull Collection getDriverProperties(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java index f54646931..025f77895 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Monitor.java @@ -6,7 +6,7 @@ import nbbrd.service.ServiceDefinition; import nbbrd.service.ServiceId; import sdmxdl.web.MonitorReport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; @@ -23,7 +23,7 @@ public interface Monitor { @NonNull String getMonitorUriScheme(); @NonNull MonitorReport getReport( - @NonNull SdmxWebSource source, + @NonNull WebSource source, @NonNull WebContext context ) throws IOException, IllegalArgumentException; } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java index 014cf1aca..0f0cff53e 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/Networking.java @@ -8,7 +8,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.ErrorListener; import sdmxdl.EventListener; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.Collection; @@ -32,9 +32,9 @@ public interface Networking { @NonNull Collection getNetworkingProperties(); @NonNull Network getNetwork( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError); + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); int UNKNOWN_NETWORKING_RANK = -1; diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java index 6d7f95b33..9b7d2ae58 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebCaching.java @@ -13,7 +13,7 @@ import sdmxdl.EventListener; import sdmxdl.ext.Cache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.Collection; @@ -31,14 +31,14 @@ public interface WebCaching { int getWebCachingRank(); @NonNull Cache getDriverCache( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError); + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); @NonNull Cache getMonitorCache( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError); + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError); @NonNull Collection getWebCachingProperties(); diff --git a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java index 081f452d1..5327caf60 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/web/spi/WebContext.java @@ -23,7 +23,7 @@ import sdmxdl.EventListener; import sdmxdl.ext.Cache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.List; @@ -37,9 +37,9 @@ public class WebContext { @lombok.Builder.Default @NonNull WebCaching caching = WebCaching.noOp(); - @Nullable EventListener onEvent; + @Nullable EventListener onEvent; - @Nullable ErrorListener onError; + @Nullable ErrorListener onError; @lombok.Singular @NonNull List authenticators; @@ -47,15 +47,15 @@ public class WebContext { @lombok.Builder.Default @NonNull Networking networking = Networking.getDefault(); - public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source) { + public @NonNull Cache getDriverCache(@NonNull WebSource source) { return caching.getDriverCache(source, onEvent, onError); } - public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source) { + public @NonNull Cache getMonitorCache(@NonNull WebSource source) { return caching.getMonitorCache(source, onEvent, onError); } - public @NonNull Network getNetwork(@NonNull SdmxWebSource source) { + public @NonNull Network getNetwork(@NonNull WebSource source) { return networking.getNetwork(source, onEvent, onError); } } diff --git a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestConnection.java b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestConnection.java index 6f6b35677..9ba99a31a 100644 --- a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestConnection.java +++ b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestConnection.java @@ -35,27 +35,27 @@ public void testConnection() { } @Override - public @NonNull Collection getFlows() { + public @NonNull Collection getFlows() { return RepoSamples.REPO.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) { return RepoSamples.FLOW; } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) { return RepoSamples.STRUCT; } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) { return RepoSamples.DATA_SET; } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) { return RepoSamples.DATA_SET.getData().stream(); } @@ -75,27 +75,27 @@ public void testConnection() { } @Override - public @NonNull Collection getFlows() { + public @NonNull Collection getFlows() { throw new CustomException(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) { throw new CustomException(); } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) { throw new CustomException(); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) { throw new CustomException(); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) { throw new CustomException(); } @@ -115,27 +115,27 @@ public void testConnection() { } @Override - public @NonNull Collection getFlows() { + public @NonNull Collection getFlows() { return null; } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) { return null; } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) { return null; } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) { return null; } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) { return null; } diff --git a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java index 87da4585d..cbcff738d 100644 --- a/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java +++ b/sdmx-dl-api/src/test/java/_test/sdmxdl/TestDriver.java @@ -19,7 +19,7 @@ import lombok.NonNull; import sdmxdl.Connection; import sdmxdl.Languages; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -47,12 +47,12 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { return TestConnection.TEST_VALID; } @Override - public @NonNull Collection getDefaultSources() { + public @NonNull Collection getDefaultSources() { return Collections.singletonList(SOURCE); } @@ -77,12 +77,12 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { throw new CustomException(); } @Override - public @NonNull Collection getDefaultSources() { + public @NonNull Collection getDefaultSources() { throw new CustomException(); } @@ -107,12 +107,12 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IllegalArgumentException { return null; } @Override - public @NonNull Collection getDefaultSources() { + public @NonNull Collection getDefaultSources() { return null; } @@ -122,5 +122,5 @@ public boolean isDriverAvailable() { } }; - public static final SdmxWebSource SOURCE = SdmxWebSource.builder().id("123").driver("456").endpointOf("http://localhost").build(); + public static final WebSource SOURCE = WebSource.builder().id("123").driver("456").endpointOf("http://localhost").build(); } diff --git a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java index 7bdcb6cee..1ae64312e 100644 --- a/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java +++ b/sdmx-dl-api/src/test/java/internal/sdmxdl/web/spi/FailsafeConnectionTest.java @@ -20,9 +20,9 @@ import _test.sdmxdl.FailsafeHandler; import _test.sdmxdl.TestConnection; import org.junit.jupiter.api.Test; -import sdmxdl.DataQuery; +import sdmxdl.Query; import sdmxdl.Feature; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.api.ConnectionAssert; import tests.sdmxdl.api.RepoSamples; import tests.sdmxdl.web.spi.MockedDriver; @@ -43,7 +43,7 @@ public class FailsafeConnectionTest { @Test public void testCompliance() { MockedDriver driver = MockedDriver.builder().repo(RepoSamples.REPO, EnumSet.allOf(Feature.class)).build(); - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); ConnectionAssert.assertCompliance( () -> FailsafeConnection.wrap(driver.connect(source, ANY, DriverAssert.noOpWebContext())), @@ -135,18 +135,18 @@ public void testGetStructure() { public void testGetData() { failsafe.reset(); assertThatNoException() - .isThrownBy(() -> valid.getData(RepoSamples.FLOW_REF, DataQuery.ALL)); + .isThrownBy(() -> valid.getData(RepoSamples.FLOW_REF, Query.ALL)); failsafe.assertEmpty(); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> failing.getData(RepoSamples.FLOW_REF, DataQuery.ALL)) + .isThrownBy(() -> failing.getData(RepoSamples.FLOW_REF, Query.ALL)) .withCauseInstanceOf(CustomException.class); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> nul.getData(RepoSamples.FLOW_REF, DataQuery.ALL)) + .isThrownBy(() -> nul.getData(RepoSamples.FLOW_REF, Query.ALL)) .withNoCause(); failsafe.assertUnexpectedNull("unexpected null"); } @@ -155,18 +155,18 @@ public void testGetData() { public void testGetDataStream() { failsafe.reset(); assertThatNoException() - .isThrownBy(() -> valid.getDataStream(RepoSamples.FLOW_REF, DataQuery.ALL)); + .isThrownBy(() -> valid.getDataStream(RepoSamples.FLOW_REF, Query.ALL)); failsafe.assertEmpty(); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> failing.getDataStream(RepoSamples.FLOW_REF, DataQuery.ALL)) + .isThrownBy(() -> failing.getDataStream(RepoSamples.FLOW_REF, Query.ALL)) .withCauseInstanceOf(CustomException.class); failsafe.assertUnexpectedError("unexpected CustomException", CustomException.class); failsafe.reset(); assertThatIOException() - .isThrownBy(() -> nul.getDataStream(RepoSamples.FLOW_REF, DataQuery.ALL)) + .isThrownBy(() -> nul.getDataStream(RepoSamples.FLOW_REF, Query.ALL)) .withNoCause(); failsafe.assertUnexpectedNull("unexpected null"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/DataRepositoryTest.java b/sdmx-dl-api/src/test/java/sdmxdl/DataRepositoryTest.java index b4b3c5f71..a6e22ebbb 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/DataRepositoryTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/DataRepositoryTest.java @@ -45,7 +45,7 @@ public void testGetFlow() { assertThatNullPointerException().isThrownBy(() -> repo.getFlow(null)); assertThat(repo.getFlow(goodFlowRef)).isNotEmpty(); assertThat(repo.getFlow(badFlowRef)).isEmpty(); - assertThat(repo.getFlow(DataflowRef.of(null, "XYZ", null))).isNotEmpty(); + assertThat(repo.getFlow(FlowRef.of(null, "XYZ", null))).isNotEmpty(); } @Test @@ -66,12 +66,12 @@ public void testGetStructure() { Assertions.assertThat(repo.getStructure(badStructRef)).isEmpty(); } - private final DataStructureRef goodStructRef = DataStructureRef.of("NBB", "goodStruct", "v1.0"); - private final DataStructureRef badStructRef = DataStructureRef.parse("badStruct"); - private final DataflowRef goodFlowRef = DataflowRef.of("NBB", "XYZ", "v2.0"); - private final DataflowRef badFlowRef = DataflowRef.parse("other"); - private final Dataflow flow = Dataflow.builder().ref(goodFlowRef).structureRef(goodStructRef).name("flow1").build(); - private final DataStructure struct = DataStructure.builder().ref(goodStructRef).primaryMeasureId("").name("struct1").build(); + private final StructureRef goodStructRef = StructureRef.of("NBB", "goodStruct", "v1.0"); + private final StructureRef badStructRef = StructureRef.parse("badStruct"); + private final FlowRef goodFlowRef = FlowRef.of("NBB", "XYZ", "v2.0"); + private final FlowRef badFlowRef = FlowRef.parse("other"); + private final Flow flow = Flow.builder().ref(goodFlowRef).structureRef(goodStructRef).name("flow1").build(); + private final Structure struct = Structure.builder().ref(goodStructRef).primaryMeasureId("").name("struct1").build(); private final Obs obs1 = Obs.builder().period(TimeInterval.of(LocalDateTime.of(2010, 1, 2, 3, 4), Duration.parse("P1M"))).value(Math.PI).build(); private final Series series = Series.builder().key(Key.of("BE")).obs(obs1).meta("hello", "world").build(); private final DataSet dataSet = DataSet.builder().ref(goodFlowRef).series(series).build(); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/DataSetTest.java b/sdmx-dl-api/src/test/java/sdmxdl/DataSetTest.java index bdcfe15e4..9204f8048 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/DataSetTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/DataSetTest.java @@ -32,10 +32,10 @@ public class DataSetTest { @Test public void testToDataSet() { assertThatNullPointerException() - .isThrownBy(() -> DataSet.toDataSet(null, DataQuery.ALL)); + .isThrownBy(() -> DataSet.toDataSet(null, Query.ALL)); assertThatNullPointerException() - .isThrownBy(() -> DataSet.toDataSet(DataflowRef.parse(""), null)); + .isThrownBy(() -> DataSet.toDataSet(FlowRef.parse(""), null)); } @Test @@ -47,12 +47,12 @@ public void testGetDataStream() { .containsExactly(series); } - private final DataStructureRef goodStructRef = DataStructureRef.of("NBB", "goodStruct", "v1.0"); - private final DataStructureRef badStructRef = DataStructureRef.parse("badStruct"); - private final DataflowRef goodFlowRef = DataflowRef.of("NBB", "XYZ", "v2.0"); - private final DataflowRef badFlowRef = DataflowRef.parse("other"); - private final Dataflow flow = Dataflow.builder().ref(goodFlowRef).structureRef(goodStructRef).name("flow1").build(); - private final DataStructure struct = DataStructure.builder().ref(goodStructRef).primaryMeasureId("").name("struct1").build(); + private final StructureRef goodStructRef = StructureRef.of("NBB", "goodStruct", "v1.0"); + private final StructureRef badStructRef = StructureRef.parse("badStruct"); + private final FlowRef goodFlowRef = FlowRef.of("NBB", "XYZ", "v2.0"); + private final FlowRef badFlowRef = FlowRef.parse("other"); + private final Flow flow = Flow.builder().ref(goodFlowRef).structureRef(goodStructRef).name("flow1").build(); + private final Structure struct = Structure.builder().ref(goodStructRef).primaryMeasureId("").name("struct1").build(); private final Obs obs1 = Obs.builder().period(TimeInterval.of(LocalDateTime.of(2010, 1, 2, 3, 4), Duration.parse("P1M"))).value(Math.PI).build(); private final Series series = Series.builder().key(Key.of("BE")).obs(obs1).meta("hello", "world").build(); private final DataSet dataSet = DataSet.builder().ref(goodFlowRef).series(series).build(); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/DataflowRefTest.java b/sdmx-dl-api/src/test/java/sdmxdl/FlowRefTest.java similarity index 73% rename from sdmx-dl-api/src/test/java/sdmxdl/DataflowRefTest.java rename to sdmx-dl-api/src/test/java/sdmxdl/FlowRefTest.java index e7fd3888e..17624f462 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/DataflowRefTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/FlowRefTest.java @@ -19,46 +19,46 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.DataflowRef.of; +import static sdmxdl.FlowRef.of; import static sdmxdl.ResourceRef.ALL_AGENCIES; import static sdmxdl.ResourceRef.LATEST_VERSION; /** * @author Philippe Charles */ -public class DataflowRefTest { +public class FlowRefTest { @Test @SuppressWarnings({"null", "ConstantConditions"}) public void testParse() { - assertThat(DataflowRef.parse("")).isEqualTo(of(null, "", null)); - assertThat(DataflowRef.parse("hello")).isEqualTo(of(null, "hello", null)); - assertThat(DataflowRef.parse("world,hello")).isEqualTo(of("world", "hello", null)); - assertThat(DataflowRef.parse("world,hello,123")).isEqualTo(of("world", "hello", "123")); - assertThat(DataflowRef.parse("world,hello,")).isEqualTo(of("world", "hello", LATEST_VERSION)); - assertThat(DataflowRef.parse(",hello,")).isEqualTo(of(ALL_AGENCIES, "hello", LATEST_VERSION)); - assertThat(DataflowRef.parse(",,")).isEqualTo(of(ALL_AGENCIES, "", LATEST_VERSION)); - assertThatIllegalArgumentException().isThrownBy(() -> DataflowRef.parse(",,,,")); - assertThatNullPointerException().isThrownBy(() -> DataflowRef.parse(null)); + assertThat(FlowRef.parse("")).isEqualTo(of(null, "", null)); + assertThat(FlowRef.parse("hello")).isEqualTo(of(null, "hello", null)); + assertThat(FlowRef.parse("world,hello")).isEqualTo(of("world", "hello", null)); + assertThat(FlowRef.parse("world,hello,123")).isEqualTo(of("world", "hello", "123")); + assertThat(FlowRef.parse("world,hello,")).isEqualTo(of("world", "hello", LATEST_VERSION)); + assertThat(FlowRef.parse(",hello,")).isEqualTo(of(ALL_AGENCIES, "hello", LATEST_VERSION)); + assertThat(FlowRef.parse(",,")).isEqualTo(of(ALL_AGENCIES, "", LATEST_VERSION)); + assertThatIllegalArgumentException().isThrownBy(() -> FlowRef.parse(",,,,")); + assertThatNullPointerException().isThrownBy(() -> FlowRef.parse(null)); } @Test @SuppressWarnings({"null", "ConstantConditions"}) public void testValueOf() { assertThat(of(null, "", null)) - .extracting(DataflowRef::getAgency, DataflowRef::getId, DataflowRef::getVersion, Object::toString) + .extracting(FlowRef::getAgency, FlowRef::getId, FlowRef::getVersion, Object::toString) .containsExactly(ALL_AGENCIES, "", LATEST_VERSION, "all,,latest"); assertThat(of("", "hello", null)) - .extracting(DataflowRef::getAgency, DataflowRef::getId, DataflowRef::getVersion, Object::toString) + .extracting(FlowRef::getAgency, FlowRef::getId, FlowRef::getVersion, Object::toString) .containsExactly(ALL_AGENCIES, "hello", LATEST_VERSION, "all,hello,latest"); assertThat(of("world", "hello", null)) - .extracting(DataflowRef::getAgency, DataflowRef::getId, DataflowRef::getVersion, Object::toString) + .extracting(FlowRef::getAgency, FlowRef::getId, FlowRef::getVersion, Object::toString) .containsExactly("world", "hello", LATEST_VERSION, "world,hello,latest"); assertThat(of("world", "hello", "123")) - .extracting(DataflowRef::getAgency, DataflowRef::getId, DataflowRef::getVersion, Object::toString) + .extracting(FlowRef::getAgency, FlowRef::getId, FlowRef::getVersion, Object::toString) .containsExactly("world", "hello", "123", "world,hello,123"); assertThatIllegalArgumentException().isThrownBy(() -> of(null, "world,hello", null)); @@ -83,7 +83,7 @@ public void testEquals() { @Test @SuppressWarnings({"null", "ConstantConditions"}) public void testContains() { - DataflowRef x = of("ECB", "EXR", "1"); + FlowRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.contains(null)); @@ -102,7 +102,7 @@ public void testContains() { @Test @SuppressWarnings({"null", "ConstantConditions"}) public void testContainsRef() { - DataflowRef x = of("ECB", "EXR", "1"); + FlowRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.containsRef(null)); @@ -121,7 +121,7 @@ public void testContainsRef() { @Test @SuppressWarnings({"null", "ConstantConditions"}) public void testEqualsRef() { - DataflowRef x = of("ECB", "EXR", "1"); + FlowRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.equalsRef(null)); @@ -137,7 +137,7 @@ public void testEqualsRef() { assertThat(x.equalsRef(flowOf(of(ALL_AGENCIES, "EXR", LATEST_VERSION)))).isFalse(); } - private Dataflow flowOf(DataflowRef ref) { - return Dataflow.builder().ref(ref).structureRef(DataStructureRef.parse("")).name("").build(); + private Flow flowOf(FlowRef ref) { + return Flow.builder().ref(ref).structureRef(StructureRef.parse("")).name("").build(); } } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/KeyTest.java b/sdmx-dl-api/src/test/java/sdmxdl/KeyTest.java index 1964c0ffd..3957d94ee 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/KeyTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/KeyTest.java @@ -435,7 +435,7 @@ public void testIsValidOn() { .isEqualTo("Expecting key 'IND.XX' to have a known code at position 2 for dimension 'REGION' instead of 'XX'"); } - private static Condition validOn(DataStructure dsd) { + private static Condition validOn(Structure dsd) { return new Condition<>(parent -> parent.validateOn(dsd) == null, "valid on dsd %s", dsd); } @@ -474,7 +474,7 @@ public void testBuilderOfDimensions() { @Test public void testBuilderOfDataStructure() { assertThatNullPointerException() - .isThrownBy(() -> Key.builder((DataStructure) null)); + .isThrownBy(() -> Key.builder((Structure) null)); Key.Builder b; @@ -503,9 +503,9 @@ public void testBuilderOfDataStructure() { assertThat(b.clear().put("SECTOR", "IND").put("REGION", "BE").isSeries()).isTrue(); } - private final DataStructure dsd0 = DataStructure + private final Structure dsd0 = Structure .builder() - .ref(DataStructureRef.parse("ref")) + .ref(StructureRef.parse("ref")) .primaryMeasureId("") .name("") .build(); @@ -516,7 +516,7 @@ public void testBuilderOfDataStructure() { private final Dimension sector = Dimension.builder().position(1).id("SECTOR").name("Sector").codelist(clSector).build(); private final Dimension region = Dimension.builder().position(3).id("REGION").name("Region").codelist(clRegion).build(); - private final DataStructure dsd2 = dsd0 + private final Structure dsd2 = dsd0 .toBuilder() .dimension(sector) .dimension(region) diff --git a/sdmx-dl-api/src/test/java/sdmxdl/DataStructureRefTest.java b/sdmx-dl-api/src/test/java/sdmxdl/StructureRefTest.java similarity index 71% rename from sdmx-dl-api/src/test/java/sdmxdl/DataStructureRefTest.java rename to sdmx-dl-api/src/test/java/sdmxdl/StructureRefTest.java index c7826306f..3d25082d5 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/DataStructureRefTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/StructureRefTest.java @@ -19,7 +19,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.DataStructureRef.of; +import static sdmxdl.StructureRef.of; import static sdmxdl.ResourceRef.ALL_AGENCIES; import static sdmxdl.ResourceRef.LATEST_VERSION; @@ -27,39 +27,39 @@ * @author Philippe Charles */ @SuppressWarnings("ALL") -public class DataStructureRefTest { +public class StructureRefTest { @Test @SuppressWarnings("null") public void testParse() { - assertThat(DataStructureRef.parse("")).isEqualTo(of(null, "", null)); - assertThat(DataStructureRef.parse("hello")).isEqualTo(of(null, "hello", null)); - assertThat(DataStructureRef.parse("world,hello")).isEqualTo(of("world", "hello", null)); - assertThat(DataStructureRef.parse("world,hello,123")).isEqualTo(of("world", "hello", "123")); - assertThat(DataStructureRef.parse("world,hello,")).isEqualTo(of("world", "hello", LATEST_VERSION)); - assertThat(DataStructureRef.parse(",hello,")).isEqualTo(of(ALL_AGENCIES, "hello", LATEST_VERSION)); - assertThat(DataStructureRef.parse(",,")).isEqualTo(of(ALL_AGENCIES, "", LATEST_VERSION)); - assertThatIllegalArgumentException().isThrownBy(() -> DataStructureRef.parse(",,,,")); - assertThatNullPointerException().isThrownBy(() -> DataStructureRef.parse(null)); + assertThat(StructureRef.parse("")).isEqualTo(of(null, "", null)); + assertThat(StructureRef.parse("hello")).isEqualTo(of(null, "hello", null)); + assertThat(StructureRef.parse("world,hello")).isEqualTo(of("world", "hello", null)); + assertThat(StructureRef.parse("world,hello,123")).isEqualTo(of("world", "hello", "123")); + assertThat(StructureRef.parse("world,hello,")).isEqualTo(of("world", "hello", LATEST_VERSION)); + assertThat(StructureRef.parse(",hello,")).isEqualTo(of(ALL_AGENCIES, "hello", LATEST_VERSION)); + assertThat(StructureRef.parse(",,")).isEqualTo(of(ALL_AGENCIES, "", LATEST_VERSION)); + assertThatIllegalArgumentException().isThrownBy(() -> StructureRef.parse(",,,,")); + assertThatNullPointerException().isThrownBy(() -> StructureRef.parse(null)); } @Test @SuppressWarnings("null") public void testValueOf() { assertThat(of(null, "", null)) - .extracting(DataStructureRef::getAgency, DataStructureRef::getId, DataStructureRef::getVersion, Object::toString) + .extracting(StructureRef::getAgency, StructureRef::getId, StructureRef::getVersion, Object::toString) .containsExactly(ALL_AGENCIES, "", LATEST_VERSION, "all,,latest"); assertThat(of("", "hello", null)) - .extracting(DataStructureRef::getAgency, DataStructureRef::getId, DataStructureRef::getVersion, Object::toString) + .extracting(StructureRef::getAgency, StructureRef::getId, StructureRef::getVersion, Object::toString) .containsExactly(ALL_AGENCIES, "hello", LATEST_VERSION, "all,hello,latest"); assertThat(of("world", "hello", null)) - .extracting(DataStructureRef::getAgency, DataStructureRef::getId, DataStructureRef::getVersion, Object::toString) + .extracting(StructureRef::getAgency, StructureRef::getId, StructureRef::getVersion, Object::toString) .containsExactly("world", "hello", LATEST_VERSION, "world,hello,latest"); assertThat(of("world", "hello", "123")) - .extracting(DataStructureRef::getAgency, DataStructureRef::getId, DataStructureRef::getVersion, Object::toString) + .extracting(StructureRef::getAgency, StructureRef::getId, StructureRef::getVersion, Object::toString) .containsExactly("world", "hello", "123", "world,hello,123"); assertThatIllegalArgumentException().isThrownBy(() -> of(null, "world,hello", null)); @@ -84,7 +84,7 @@ public void testEquals() { @Test @SuppressWarnings("null") public void testContains() { - DataStructureRef x = of("ECB", "EXR", "1"); + StructureRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.contains(null)); @@ -103,7 +103,7 @@ public void testContains() { @Test @SuppressWarnings("null") public void testContainsRef() { - DataStructureRef x = of("ECB", "EXR", "1"); + StructureRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.containsRef(null)); @@ -122,7 +122,7 @@ public void testContainsRef() { @Test @SuppressWarnings("null") public void testEqualsRef() { - DataStructureRef x = of("ECB", "EXR", "1"); + StructureRef x = of("ECB", "EXR", "1"); assertThatNullPointerException().isThrownBy(() -> x.equalsRef(null)); @@ -138,7 +138,7 @@ public void testEqualsRef() { assertThat(x.equalsRef(structOf(of(ALL_AGENCIES, "EXR", LATEST_VERSION)))).isFalse(); } - private DataStructure structOf(DataStructureRef ref) { - return DataStructure.builder().ref(ref).primaryMeasureId("").name("").build(); + private Structure structOf(StructureRef ref) { + return Structure.builder().ref(ref).primaryMeasureId("").name("").build(); } } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java index 87961aa18..43df640af 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/ext/SdmxCubeUtilTest.java @@ -6,7 +6,7 @@ import sdmxdl.Feature; import sdmxdl.Key; import sdmxdl.Series; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import tests.sdmxdl.web.spi.MockedDriver; import tests.sdmxdl.web.spi.DriverAssert; @@ -49,7 +49,7 @@ private List getDrivers() { @Test public void testGetAllSeries() throws IOException { for (Driver driver : getDrivers()) { - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeries(null, FLOW_REF, ALL)); @@ -75,7 +75,7 @@ public void testGetAllSeries() throws IOException { @Test public void testGetAllSeriesWithData() throws IOException { for (Driver driver : getDrivers()) { - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getAllSeriesWithData(null, FLOW_REF, ALL)); @@ -101,7 +101,7 @@ public void testGetAllSeriesWithData() throws IOException { @Test public void testGetSeries() throws IOException { for (Driver driver : getDrivers()) { - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeries(null, FLOW_REF, K1)); @@ -121,7 +121,7 @@ public void testGetSeries() throws IOException { @Test public void testGetSeriesWithData() throws IOException { for (Driver driver : getDrivers()) { - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getSeriesWithData(null, FLOW_REF, K1)); @@ -141,7 +141,7 @@ public void testGetSeriesWithData() throws IOException { @Test public void testGetChildren() throws IOException { for (Driver driver : getDrivers()) { - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection c = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { assertThatNullPointerException().isThrownBy(() -> SdmxCubeUtil.getChildren(null, FLOW_REF, ALL, 0)); diff --git a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java index ffd9add60..b1a51fd36 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileManagerTest.java @@ -45,5 +45,5 @@ public void test() { assertThatNullPointerException().isThrownBy(() -> m.getConnection(null, ANY)); } - private final SdmxFileSource source = SdmxFileSource.builder().data(new File("hello")).build(); + private final FileSource source = FileSource.builder().data(new File("hello")).build(); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileSourceTest.java b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileSourceTest.java index 9ebdda8d0..bc09e4e92 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileSourceTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/file/SdmxFileSourceTest.java @@ -29,13 +29,13 @@ public class SdmxFileSourceTest { @Test public void testAsDataflowRef() { - assertThat(SdmxFileSource.builder().data(data).structure(structure).build().asDataflowRef().toString()) + assertThat(FileSource.builder().data(data).structure(structure).build().asDataflowRef().toString()) .isEqualTo("all,data&struct,latest"); - assertThat(SdmxFileSource.builder().data(data).structure(new File("")).build().asDataflowRef().toString()) + assertThat(FileSource.builder().data(data).structure(new File("")).build().asDataflowRef().toString()) .isEqualTo("all,data,latest"); - assertThat(SdmxFileSource.builder().data(data).build().asDataflowRef().toString()) + assertThat(FileSource.builder().data(data).build().asDataflowRef().toString()) .isEqualTo("all,data,latest"); } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java index e5795f95f..efe3454f7 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebManagerTest.java @@ -47,7 +47,7 @@ public void testCompliance() { SdmxManagerAssert.assertCompliance( SdmxWebManager.builder().driver(sampleDriver).build(), SdmxManagerAssert.Sample - .builder() + .builder() .validSource(sampleSource) .invalidSource(sampleSource.toBuilder().driver("other").build()) .build() @@ -90,17 +90,17 @@ public void testFactories() { assertThat(o.getAuthenticators()).isEmpty(); assertThat(o.getCustomSources()).isEmpty(); assertThat(o.getDefaultSources()).containsAll(sampleDriver.getDefaultSources()); - assertThat(o.getSources()).containsValues(sampleDriver.getDefaultSources().toArray(new SdmxWebSource[0])); + assertThat(o.getSources()).containsValues(sampleDriver.getDefaultSources().toArray(new WebSource[0])); }); } @Test public void testGetSources() { - SdmxWebSource nbb = SdmxWebSource.builder().id("nbb").alias("bnb").driver("sdmx21").endpointOf("http://nbb").build(); - SdmxWebSource ecb = SdmxWebSource.builder().id("ecb").driver("sdmx21").endpointOf("http://ecb").build(); - SdmxWebSource abs = SdmxWebSource.builder().id("abs").driver("sdmx21").endpointOf("http://abs").build(); + WebSource nbb = WebSource.builder().id("nbb").alias("bnb").driver("sdmx21").endpointOf("http://nbb").build(); + WebSource ecb = WebSource.builder().id("ecb").driver("sdmx21").endpointOf("http://ecb").build(); + WebSource abs = WebSource.builder().id("abs").driver("sdmx21").endpointOf("http://abs").build(); - SdmxWebSource nbbAlias = nbb.alias("bnb"); + WebSource nbbAlias = nbb.alias("bnb"); Driver sdmx21 = MockedDriver .builder() @@ -168,12 +168,12 @@ public void testGetSources() { @Test public void testGetDefaultSources() { - SdmxWebSource source1a = SdmxWebSource.builder().id("s1").driver("dX").endpointOf("http://abc").build(); - SdmxWebSource source2 = SdmxWebSource.builder().id("s2").driver("dX").endpointOf("http://abc").build(); + WebSource source1a = WebSource.builder().id("s1").driver("dX").endpointOf("http://abc").build(); + WebSource source2 = WebSource.builder().id("s2").driver("dX").endpointOf("http://abc").build(); Driver driverX = MockedDriver.builder().id("dX").rank(WRAPPED_DRIVER_RANK).available(true).customSource(source1a).customSource(source2).build(); - SdmxWebSource source1b = SdmxWebSource.builder().id("s1").driver("dY").endpointOf("http://xyz").build(); - SdmxWebSource source3 = SdmxWebSource.builder().id("s3").driver("dY").endpointOf("http://xyz").build(); + WebSource source1b = WebSource.builder().id("s1").driver("dY").endpointOf("http://xyz").build(); + WebSource source3 = WebSource.builder().id("s3").driver("dY").endpointOf("http://xyz").build(); Driver driverY = MockedDriver.builder().id("dY").rank(NATIVE_DRIVER_RANK).available(true).customSource(source1b).customSource(source3).build(); assertThat(SdmxWebManager.builder().driver(driverX).driver(driverY).build().getDefaultSources()) @@ -202,7 +202,7 @@ public void testGetConnection() throws IOException { .rank(WRAPPED_DRIVER_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) - .customSource(SdmxWebSource.builder().id("source").driver("d1").endpointOf(sample.getName()).build()) + .customSource(WebSource.builder().id("source").driver("d1").endpointOf(sample.getName()).build()) .build(); Driver driver2 = MockedDriver @@ -211,7 +211,7 @@ public void testGetConnection() throws IOException { .rank(NATIVE_DRIVER_RANK) .available(true) .repo(sample, EnumSet.allOf(Feature.class)) - .customSource(SdmxWebSource.builder().id("source").driver("d2").endpointOf(sample.getName()).build()) + .customSource(WebSource.builder().id("source").driver("d2").endpointOf(sample.getName()).build()) .build(); try (Connection c = SdmxWebManager.builder().driver(driver2).driver(driver1).build().getConnection("source", ANY)) { @@ -225,7 +225,7 @@ public void testGetConnection() throws IOException { public void testGetConnectionOfSource() { SdmxWebManager manager = SdmxWebManager.builder().driver(sampleDriver).build(); - assertThatNullPointerException().isThrownBy(() -> manager.getConnection((SdmxWebSource) null, ANY)); + assertThatNullPointerException().isThrownBy(() -> manager.getConnection((WebSource) null, ANY)); assertThatIOException() .isThrownBy(() -> manager.getConnection(sampleSource.toBuilder().endpointOf("http://ko").build(), ANY)) @@ -250,17 +250,17 @@ public void testInvalidSourceProperties() throws IOException { .onEvent((source, marker, event) -> events.add(source.getId() + ":" + event)) .build(); - SdmxWebSource noProp = sampleSource.toBuilder().id("noProp").clearProperties().build(); + WebSource noProp = sampleSource.toBuilder().id("noProp").clearProperties().build(); try (Connection ignored = manager.getConnection(noProp, ANY)) { } assertThat(events).isEmpty(); - SdmxWebSource validProp = sampleSource.toBuilder().id("validProp").build(); + WebSource validProp = sampleSource.toBuilder().id("validProp").build(); try (Connection ignored = manager.getConnection(validProp, ANY)) { } assertThat(events).isEmpty(); - SdmxWebSource invalidProp = sampleSource.toBuilder().id("invalidProp").property("boom", "123").build(); + WebSource invalidProp = sampleSource.toBuilder().id("invalidProp").property("boom", "123").build(); try (Connection ignored = manager.getConnection(invalidProp, ANY)) { } assertThat(events).singleElement(as(STRING)) @@ -269,7 +269,7 @@ public void testInvalidSourceProperties() throws IOException { } private final DataRepository sample = DataRepository.builder().name("repo").build(); - private final SdmxWebSource sampleSource = SdmxWebSource + private final WebSource sampleSource = WebSource .builder() .id("repoSource") .driver("repoDriver") diff --git a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebSourceTest.java b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebSourceTest.java index 854d798b1..8e38fc6ba 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebSourceTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/web/SdmxWebSourceTest.java @@ -31,18 +31,18 @@ public class SdmxWebSourceTest { @Test public void testBuilderEndpointOf() { assertThatNullPointerException() - .isThrownBy(() -> SdmxWebSource.builder().endpointOf(null)); + .isThrownBy(() -> WebSource.builder().endpointOf(null)); assertThatIllegalArgumentException() - .isThrownBy(() -> SdmxWebSource.builder().endpointOf("h ttp://localhost")); + .isThrownBy(() -> WebSource.builder().endpointOf("h ttp://localhost")); - assertThat(SdmxWebSource.builder().endpointOf("http://localhost").id("").driver("").build().getEndpoint()) + assertThat(WebSource.builder().endpointOf("http://localhost").id("").driver("").build().getEndpoint()) .isEqualTo(URI.create("http://localhost")); } @Test public void testBuilderDescription() { - SdmxWebSource base = SdmxWebSource.builder().endpointOf("http://localhost").id("").driver("").build(); + WebSource base = WebSource.builder().endpointOf("http://localhost").id("").driver("").build(); assertThat( base @@ -68,18 +68,18 @@ public void testBuilderDescription() { @Test public void testBuilderPropertyOf() { assertThatNullPointerException() - .isThrownBy(() -> SdmxWebSource.builder().propertyOf(null, "")); + .isThrownBy(() -> WebSource.builder().propertyOf(null, "")); assertThatNullPointerException() - .isThrownBy(() -> SdmxWebSource.builder().propertyOf("", null)); + .isThrownBy(() -> WebSource.builder().propertyOf("", null)); - assertThat(SdmxWebSource.builder().propertyOf("hello", "world").endpointOf("http://localhost").id("").driver("").build().getProperties()) + assertThat(WebSource.builder().propertyOf("hello", "world").endpointOf("http://localhost").id("").driver("").build().getProperties()) .containsEntry("hello", "world"); } @Test public void testBuilderWebsiteOf() { - SdmxWebSource base = SdmxWebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); + WebSource base = WebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); assertThat(base.toBuilder().websiteOf(null).build().getWebsite()) .isNull(); @@ -93,7 +93,7 @@ public void testBuilderWebsiteOf() { @Test public void testBuilderMonitorOf() { - SdmxWebSource base = SdmxWebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); + WebSource base = WebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); assertThat(base.toBuilder().monitorOf(null).build().getMonitor()) .isNull(); @@ -107,7 +107,7 @@ public void testBuilderMonitorOf() { @Test public void testBuilderMonitorWebsiteOf() { - SdmxWebSource base = SdmxWebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); + WebSource base = WebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); assertThat(base.toBuilder().monitorWebsiteOf(null).build().getMonitorWebsite()) .isNull(); @@ -121,7 +121,7 @@ public void testBuilderMonitorWebsiteOf() { @Test public void testAlias() { - SdmxWebSource estat = SdmxWebSource.builder().id("ESTAT").alias("EUROSTAT").driver("").endpointOf("http://localhost").build(); + WebSource estat = WebSource.builder().id("ESTAT").alias("EUROSTAT").driver("").endpointOf("http://localhost").build(); assertThat(estat.alias("EUROSTAT")) .isEqualTo(estat.toBuilder().id("EUROSTAT").build()); @@ -135,7 +135,7 @@ public void testAlias() { @Test public void testIsAlias() { - SdmxWebSource base = SdmxWebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); + WebSource base = WebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); assertThat(base.isAlias()).isFalse(); assertThat(base.toBuilder().alias("EUROSTAT").build().isAlias()).isFalse(); assertThat(base.toBuilder().id("EUROSTAT").alias("EUROSTAT").build().isAlias()).isTrue(); @@ -143,7 +143,7 @@ public void testIsAlias() { @Test public void testWebsite() { - SdmxWebSource base = SdmxWebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); + WebSource base = WebSource.builder().id("ESTAT").driver("").endpointOf("http://localhost").build(); assertThat(base.getWebsite()).isNull(); assertThat(base.toBuilder().websiteOf("http://somewhere").build().getWebsite()) .asString() diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/ConnectionAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/ConnectionAssert.java index 66b4abeb3..00cbf326f 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/ConnectionAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/ConnectionAssert.java @@ -35,10 +35,10 @@ public class ConnectionAssert { public static class Sample { @lombok.NonNull - DataflowRef validFlow; + FlowRef validFlow; @lombok.NonNull - DataflowRef invalidFlow; + FlowRef invalidFlow; @lombok.NonNull Key validKey; @@ -71,8 +71,8 @@ public void assertCompliance(SoftAssertions s, ConnectionSupplier supplier, Samp checkRedundantClose(s, supplier); - assertState(s, supplier, o -> o.getData(sample.validFlow, DataQuery.ALL), "getData(DataflowRef, DataQuery)"); - assertState(s, supplier, o -> o.getDataStream(sample.validFlow, DataQuery.ALL), "getDataStream(DataflowRef, DataQuery)"); + assertState(s, supplier, o -> o.getData(sample.validFlow, Query.ALL), "getData(DataflowRef, DataQuery)"); + assertState(s, supplier, o -> o.getDataStream(sample.validFlow, Query.ALL), "getDataStream(DataflowRef, DataQuery)"); assertState(s, supplier, o -> o.getStructure(sample.validFlow), "getStructure(DataflowRef)"); assertState(s, supplier, o -> o.getFlow(sample.validFlow), "getFlow(DataflowRef)"); assertState(s, supplier, Connection::getFlows, "getFlows()"); @@ -89,7 +89,7 @@ private void checkRedundantClose(SoftAssertions s, ConnectionSupplier supplier) private void checkValidFlow(SoftAssertions s, Sample sample, Connection conn) throws IOException { assertNonnull(s, conn, sample.validFlow); - for (DataDetail filter : DataDetail.values()) { + for (Detail filter : Detail.values()) { checkValidKey(s, sample, conn, filter); checkInvalidKey(s, sample, conn, filter); } @@ -101,14 +101,14 @@ private void checkValidFlow(SoftAssertions s, Sample sample, Connection conn) th s.assertThat(conn.getFlow(sample.validFlow)) .is(validDataflow()); - DataStructure dsd = conn.getStructure(sample.validFlow); + Structure dsd = conn.getStructure(sample.validFlow); s.assertThat(dsd).has(validName()); s.assertThat(dsd.getAttributes()).are(validAttribute()); s.assertThat(dsd.getDimensions()).are(validDimension()); } - private void checkInvalidKey(SoftAssertions s, Sample sample, Connection conn, DataDetail filter) { - DataQuery invalidQuery = DataQuery.builder().key(sample.invalidKey).detail(filter).build(); + private void checkInvalidKey(SoftAssertions s, Sample sample, Connection conn, Detail filter) { + Query invalidQuery = Query.builder().key(sample.invalidKey).detail(filter).build(); s.assertThatThrownBy(() -> conn.getData(sample.validFlow, invalidQuery)) .isInstanceOf(IllegalArgumentException.class) @@ -119,16 +119,16 @@ private void checkInvalidKey(SoftAssertions s, Sample sample, Connection conn, D .hasMessageContainingAll("Expecting key", sample.invalidKey.toString()); } - private void checkValidKey(SoftAssertions s, Sample sample, Connection conn, DataDetail filter) throws IOException { - DataQuery validQuery = DataQuery.builder().key(sample.validKey).detail(filter).build(); + private void checkValidKey(SoftAssertions s, Sample sample, Connection conn, Detail filter) throws IOException { + Query validQuery = Query.builder().key(sample.validKey).detail(filter).build(); s.assertThat(conn.getDataStream(sample.validFlow, validQuery)) .containsExactlyElementsOf(conn.getData(sample.validFlow, validQuery).getData()); } private void checkInvalidFlow(SoftAssertions s, Sample sample, Connection conn) { - for (DataDetail filter : DataDetail.values()) { - DataQuery validQuery = DataQuery.builder().key(sample.validKey).detail(filter).build(); + for (Detail filter : Detail.values()) { + Query validQuery = Query.builder().key(sample.validKey).detail(filter).build(); s.assertThatThrownBy(() -> conn.getData(sample.invalidFlow, validQuery)) .isInstanceOf(IOException.class); @@ -145,8 +145,8 @@ private void checkInvalidFlow(SoftAssertions s, Sample sample, Connection conn) } @SuppressWarnings("ConstantConditions") - private void assertNonnull(SoftAssertions s, Connection conn, DataflowRef ref) { - s.assertThatThrownBy(() -> conn.getData(null, DataQuery.ALL)) + private void assertNonnull(SoftAssertions s, Connection conn, FlowRef ref) { + s.assertThatThrownBy(() -> conn.getData(null, Query.ALL)) .as(nullDescriptionOf("getData(DataflowRef, DataQuery)", "flowRef")) .isInstanceOf(NullPointerException.class); @@ -154,7 +154,7 @@ private void assertNonnull(SoftAssertions s, Connection conn, DataflowRef ref) { .as(nullDescriptionOf("getData(DataflowRef, DataQuery)", "query")) .isInstanceOf(NullPointerException.class); - s.assertThatThrownBy(() -> conn.getDataStream(null, DataQuery.ALL)) + s.assertThatThrownBy(() -> conn.getDataStream(null, Query.ALL)) .as(nullDescriptionOf("getDataStream(DataflowRef, DataQuery)", "flowRef")) .isInstanceOf(NullPointerException.class); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/RepoSamples.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/RepoSamples.java index 6ac060324..0f9750f59 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/RepoSamples.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/RepoSamples.java @@ -29,14 +29,14 @@ @lombok.experimental.UtilityClass public class RepoSamples { - public static final DataStructureRef BAD_STRUCT_REF = DataStructureRef.parse("badStruct"); - public static final DataflowRef BAD_FLOW_REF = DataflowRef.parse("other"); + public static final StructureRef BAD_STRUCT_REF = StructureRef.parse("badStruct"); + public static final FlowRef BAD_FLOW_REF = FlowRef.parse("other"); public static final CodelistRef BAD_CODELIST_REF = CodelistRef.parse("badCodelist"); - public static final DataStructureRef STRUCT_REF = DataStructureRef.of("NBB", "goodStruct", "v1.0"); - public static final DataflowRef FLOW_REF = DataflowRef.of("NBB", "XYZ", "v2.0"); + public static final StructureRef STRUCT_REF = StructureRef.of("NBB", "goodStruct", "v1.0"); + public static final FlowRef FLOW_REF = FlowRef.of("NBB", "XYZ", "v2.0"); - public static final Dataflow FLOW = Dataflow.builder().ref(FLOW_REF).structureRef(STRUCT_REF).name("flow1 name").description("flow1 description").build(); + public static final Flow FLOW = Flow.builder().ref(FLOW_REF).structureRef(STRUCT_REF).name("flow1 name").description("flow1 description").build(); public static final CodelistRef CL_REF1 = CodelistRef.parse("CL_FREQ"); public static final CodelistRef CL_REF2 = CodelistRef.parse("CL_REGION"); @@ -55,7 +55,7 @@ public class RepoSamples { public static final Attribute NOT_CODED_ATTRIBUTE = Attribute.builder().id("TITLE").name("Title").relationship(AttributeRelationship.SERIES).build(); public static final Attribute CODED_ATTRIBUTE = Attribute.builder().id("OBS_STATUS").codelist(CL4).name("Observation status").relationship(AttributeRelationship.OBSERVATION).build(); - public static final DataStructure STRUCT = DataStructure + public static final Structure STRUCT = Structure .builder() .ref(STRUCT_REF) .dimension(DIM1) diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxConditions.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxConditions.java index 4d9dc9bee..033985737 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxConditions.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxConditions.java @@ -25,7 +25,7 @@ public class SdmxConditions { ); } - public static @NonNull Condition validDataflow() { + public static @NonNull Condition validDataflow() { return Assertions.allOf( validResource(), validName() diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java index 71ce42f34..8d9f6a601 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/api/SdmxManagerAssert.java @@ -19,7 +19,7 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.Connection; import sdmxdl.SdmxManager; -import sdmxdl.SdmxSource; +import sdmxdl.Source; import java.io.IOException; @@ -35,20 +35,20 @@ public class SdmxManagerAssert { @lombok.Value @lombok.Builder(toBuilder = true) - public static class Sample { + public static class Sample { S validSource; S invalidSource; } - public void assertCompliance(SdmxManager manager, Sample sample) { + public void assertCompliance(SdmxManager manager, Sample sample) { TckUtil.run(s -> assertCompliance(s, manager, sample)); } - public void assertCompliance(SoftAssertions s, SdmxManager manager, Sample sample) { + public void assertCompliance(SoftAssertions s, SdmxManager manager, Sample sample) { checkGetConnection(s, manager, sample); } - private void checkGetConnection(SoftAssertions s, SdmxManager manager, Sample sample) { + private void checkGetConnection(SoftAssertions s, SdmxManager manager, Sample sample) { s.assertThatThrownBy(() -> manager.getConnection(null, ANY)) .as(nullDescriptionOf("getConnection(SOURCE,LANGUAGES)", "source")) .isInstanceOf(NullPointerException.class); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java index 8b9a67b7b..ecc5027fc 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/FileCachingAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.file.spi; import lombok.NonNull; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import tests.sdmxdl.ext.CacheAssert; @@ -29,7 +29,7 @@ public static void assertFileCompliance(@NonNull FileCaching caching) { assertThatNullPointerException() .isThrownBy(() -> caching.getReaderCache(null, null, null)); - SdmxFileSource validSource = SdmxFileSource + FileSource validSource = FileSource .builder() .data(new File("hello.xml")) .build(); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java index 1da3080f5..e4cad9522 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/file/spi/ReaderAssert.java @@ -2,7 +2,7 @@ import org.assertj.core.api.SoftAssertions; import sdmxdl.Connection; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.Reader; import tests.sdmxdl.api.TckUtil; @@ -21,8 +21,8 @@ public FileContext noOpFileContext() { public static class Sample { String validName; String invalidName; - SdmxFileSource validSource; - SdmxFileSource invalidSource; + FileSource validSource; + FileSource invalidSource; FileContext context; } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java index 4f7dbc21a..d9b72f867 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/AuthenticatorAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Authenticator; import static org.assertj.core.api.Assertions.*; @@ -14,7 +14,7 @@ public class AuthenticatorAssert { @lombok.Value @lombok.Builder(toBuilder = true) public static class Sample { - SdmxWebSource source; + WebSource source; } public void assertCompliance(@NonNull Authenticator authenticator, @NonNull Sample sample) { diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java index 5fff616ad..30ca54b5d 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/DriverAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -27,14 +27,14 @@ public void assertCompliance(@NonNull Driver driver) { .are(startingWith(DRIVER_PROPERTY_PREFIX)) .doesNotHaveDuplicates(); - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver(driver.getDriverId()) .endpointOf("http://localhost") .build(); - SdmxWebSource invalidSource = validSource.toBuilder().driver("").build(); + WebSource invalidSource = validSource.toBuilder().driver("").build(); WebContext context = DriverAssert.noOpWebContext(); @@ -51,7 +51,7 @@ public void assertCompliance(@NonNull Driver driver) { assertThat(driver.getClass()).isFinal(); } - private void checkSource(SdmxWebSource o, Driver d) { + private void checkSource(WebSource o, Driver d) { assertThat(o.getId()).isNotBlank(); assertThat(o.getProperties()).isNotNull(); assertThat(o.getDriver()).isEqualTo(d.getDriverId()); diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java index 060de892e..a8d35c193 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MockedDriver.java @@ -2,7 +2,7 @@ import lombok.NonNull; import sdmxdl.*; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -30,7 +30,7 @@ public final class MockedDriver implements Driver { private final Map> repos; @lombok.Singular - private final Collection customSources; + private final Collection customSources; @Override public @NonNull String getDriverId() { @@ -48,7 +48,7 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { checkSource(source); return repos @@ -57,11 +57,11 @@ public boolean isDriverAvailable() { .filter(entry -> entry.getKey().getName().equals(source.getEndpoint().toString())) .map(entry -> new MockedConnection(entry.getKey(), entry.getValue())) .findFirst() - .orElseThrow(() -> missingSource(source.toString(), SdmxWebSource.class)); + .orElseThrow(() -> missingSource(source.toString(), WebSource.class)); } @Override - public @NonNull Collection getDefaultSources() { + public @NonNull Collection getDefaultSources() { return Stream.concat(generateSources(), customSources.stream()).collect(Collectors.toList()); } @@ -70,21 +70,21 @@ public boolean isDriverAvailable() { return Collections.emptyList(); } - private void checkSource(SdmxWebSource source) throws IllegalArgumentException { + private void checkSource(WebSource source) throws IllegalArgumentException { if (!source.getDriver().equals(id)) { throw new IllegalArgumentException(source.getDriver()); } } - private Stream generateSources() { + private Stream generateSources() { return repos .keySet() .stream() .map(repo -> sourceOf(repo.getName(), getDriverId(), repo)); } - public static SdmxWebSource sourceOf(String name, String driverId, DataRepository repo) { - return SdmxWebSource + public static WebSource sourceOf(String name, String driverId, DataRepository repo) { + return WebSource .builder() .id(name) .driver(driverId) @@ -108,13 +108,13 @@ public void testConnection() throws IOException { } @Override - public @NonNull Collection getFlows() throws IOException { + public @NonNull Collection getFlows() throws IOException { checkState(); return repo.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException { checkState(); checkDataflowRef(flowRef); return repo @@ -123,17 +123,17 @@ public void testConnection() throws IOException { } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException { checkState(); checkDataflowRef(flowRef); - DataStructureRef structRef = getFlow(flowRef).getStructureRef(); + StructureRef structRef = getFlow(flowRef).getStructureRef(); return repo .getStructure(structRef) .orElseThrow(() -> missingStructure(repo.getName(), structRef)); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { checkState(); checkDataflowRef(flowRef); checkKey(query.getKey(), getStructure(flowRef)); @@ -144,7 +144,7 @@ public void testConnection() throws IOException { } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { checkState(); checkDataflowRef(flowRef); checkKey(query.getKey(), getStructure(flowRef)); @@ -170,13 +170,13 @@ private void checkState() throws IOException { } } - private void checkDataflowRef(DataflowRef ref) throws IllegalArgumentException { + private void checkDataflowRef(FlowRef ref) throws IllegalArgumentException { // if (!repo.getFlow(ref).isPresent()) { // throw new IllegalArgumentException(ref.toString()); // } } - private void checkKey(Key key, DataStructure dsd) throws IllegalArgumentException { + private void checkKey(Key key, Structure dsd) throws IllegalArgumentException { String error = key.validateOn(dsd); if (error != null) { throw new IllegalArgumentException(error); @@ -187,15 +187,15 @@ private void checkKey(Key key, DataStructure dsd) throws IllegalArgumentExceptio return new IOException("Connection closed"); } - public static @NonNull IOException missingFlow(@NonNull String source, @NonNull DataflowRef ref) { + public static @NonNull IOException missingFlow(@NonNull String source, @NonNull FlowRef ref) { return new IOException("Missing flow '" + ref + "'"); } - public static @NonNull IOException missingStructure(@NonNull String source, @NonNull DataStructureRef ref) { + public static @NonNull IOException missingStructure(@NonNull String source, @NonNull StructureRef ref) { return new IOException("Missing structure '" + ref + "'"); } - public static @NonNull IOException missingData(@NonNull String source, @NonNull DataflowRef ref) { + public static @NonNull IOException missingData(@NonNull String source, @NonNull FlowRef ref) { return new IOException("Missing data '" + ref + "'"); } } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java index ffa69b219..2e9ff500d 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/MonitorAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Monitor; import sdmxdl.web.spi.WebContext; @@ -16,7 +16,7 @@ public class MonitorAssert { @lombok.Value @lombok.Builder(toBuilder = true) public static class Sample { - SdmxWebSource validSource; + WebSource validSource; } public void assertCompliance(@NonNull Monitor monitor, @NonNull Sample sample) { diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java index 904cfe889..e5d34c08d 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/NetworkingAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Networking; import static org.assertj.core.api.Assertions.assertThat; @@ -26,7 +26,7 @@ public static void assertCompliance(@NonNull Networking networking) { assertThatNullPointerException() .isThrownBy(() -> networking.getNetwork(null, null, null)); - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver("SDMX21") diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java index f642a0525..a6409ad9f 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/web/spi/WebCachingAssert.java @@ -1,7 +1,7 @@ package tests.sdmxdl.web.spi; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebCaching; import tests.sdmxdl.ext.CacheAssert; @@ -30,7 +30,7 @@ public static void assertWebCompliance(@NonNull WebCaching caching) { assertThatNullPointerException() .isThrownBy(() -> caching.getDriverCache(null, null, null)); - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver("SDMX21") diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java index 01d728b1b..01dcf06a9 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConsoleAuthenticator.java @@ -1,7 +1,7 @@ package internal.sdmxdl.cli; import lombok.NonNull; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Authenticator; import java.io.Console; @@ -14,7 +14,7 @@ final class ConsoleAuthenticator implements Authenticator { private final Console console = System.console(); - private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); + private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); @Override public @NonNull String getAuthenticatorId() { @@ -27,7 +27,7 @@ public boolean isAuthenticatorAvailable() { } @Override - public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException { + public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull WebSource source) throws IOException { if (!isConsoleAvailable()) { throw new IOException("Console is not available"); } @@ -46,11 +46,11 @@ private boolean isConsoleAvailable() { } @Override - public void invalidateAuthentication(@NonNull SdmxWebSource source) { + public void invalidateAuthentication(@NonNull WebSource source) { cache.remove(source); } - private PasswordAuthentication readPasswordAuthentication(SdmxWebSource source) throws IOError { + private PasswordAuthentication readPasswordAuthentication(WebSource source) throws IOError { console.format("Enter your credentials for %s\n", source.getId()); String username = console.readLine("Enter username: "); char[] password = console.readPassword("Enter password: "); diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java index 37c526fa7..10291caec 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/ConstantAuthenticator.java @@ -2,7 +2,7 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Authenticator; import java.net.PasswordAuthentication; @@ -23,11 +23,11 @@ public boolean isAuthenticatorAvailable() { } @Override - public @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) { + public @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull WebSource source) { return user; } @Override - public void invalidateAuthentication(@NonNull SdmxWebSource source) { + public void invalidateAuthentication(@NonNull WebSource source) { } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/DataflowRefConverter.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/DataflowRefConverter.java index 2fc1c43dc..36b37f155 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/DataflowRefConverter.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/DataflowRefConverter.java @@ -18,18 +18,18 @@ import nbbrd.io.text.Parser; import picocli.CommandLine; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import sdmxdl.format.csv.SdmxCsvFields; /** * @author Philippe Charles */ -public final class DataflowRefConverter implements CommandLine.ITypeConverter { +public final class DataflowRefConverter implements CommandLine.ITypeConverter { - private final Parser parser = SdmxCsvFields.getDataflowRefParser().orElse(Parser.of(DataflowRef::parse)); + private final Parser parser = SdmxCsvFields.getDataflowRefParser().orElse(Parser.of(FlowRef::parse)); @Override - public DataflowRef convert(String string) { + public FlowRef convert(String string) { return parser.parse(string); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebConceptOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebConceptOptions.java index 13e581e5e..294d30385 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebConceptOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebConceptOptions.java @@ -2,7 +2,7 @@ import picocli.CommandLine; import sdmxdl.Component; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.web.SdmxWebManager; import java.io.IOException; @@ -20,7 +20,7 @@ public class WebConceptOptions extends WebFlowOptions { private String concept; public Component loadComponent(SdmxWebManager manager) throws IOException { - DataStructure dsd = loadStructure(manager); + Structure dsd = loadStructure(manager); return Stream.concat(dsd.getDimensions().stream(), dsd.getAttributes().stream()) .filter(component -> component.getId().equals(getConcept())) .findFirst() diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java index f93e46948..883cbfed8 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebFlowOptions.java @@ -36,17 +36,17 @@ public class WebFlowOptions extends WebSourceOptions { converter = DataflowRefConverter.class, descriptionKey = "cli.sdmx.flow" ) - private DataflowRef flow; + private FlowRef flow; - public DataStructure loadStructure(SdmxWebManager manager) throws IOException { + public Structure loadStructure(SdmxWebManager manager) throws IOException { try (Connection conn = open(manager, getLangs())) { return conn.getStructure(getFlow()); } } - public DataSet loadSeries(SdmxWebManager manager, Key key, DataDetail detail) throws IOException { + public DataSet loadSeries(SdmxWebManager manager, Key key, Detail detail) throws IOException { try (Connection conn = open(manager, getLangs())) { - return conn.getData(getFlow(), DataQuery.builder().key(key).detail(detail).build()); + return conn.getData(getFlow(), Query.builder().key(key).detail(detail).build()); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebKeyOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebKeyOptions.java index de616daf0..7168f28a2 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebKeyOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebKeyOptions.java @@ -17,7 +17,7 @@ package internal.sdmxdl.cli; import picocli.CommandLine; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.DataSet; import sdmxdl.Key; import sdmxdl.web.SdmxWebManager; @@ -39,7 +39,7 @@ public class WebKeyOptions extends WebFlowOptions { ) private Key key; - public DataSet loadSeries(SdmxWebManager manager, DataDetail detail) throws IOException { + public DataSet loadSeries(SdmxWebManager manager, Detail detail) throws IOException { return loadSeries(manager, getKey(), detail); } } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java index a427ac835..8f7ebb3f9 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebNetOptions.java @@ -18,7 +18,7 @@ import picocli.CommandLine; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.net.URI; @@ -56,13 +56,13 @@ public SdmxWebManager loadManager() throws IOException { .build(); } - private List getForcedSslSources(SdmxWebManager manager) { + private List getForcedSslSources(SdmxWebManager manager) { return isForceSsl() ? manager.getSources().values().stream().map(WebNetOptions::toHttps).collect(Collectors.toList()) : manager.getCustomSources(); } - private static SdmxWebSource toHttps(SdmxWebSource source) { + private static WebSource toHttps(WebSource source) { return source.toBuilder().endpoint(toHttps(source.getEndpoint())).build(); } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java index 45ee03c6e..3e9567976 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebOptions.java @@ -29,7 +29,7 @@ import sdmxdl.Languages; import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.File; import java.io.IOException; @@ -102,7 +102,7 @@ public SdmxWebManager loadManager() throws IOException { try (CloseableExecutorService executor = new CloseableExecutorService(newResourceExecutor())) { Future defaultWebManager = executor.submit(this::loadDefaultWebManager); - Future> customSources = executor.submit(this::loadCustomSources); + Future> customSources = executor.submit(this::loadCustomSources); return defaultWebManager.get() .toBuilder() @@ -116,13 +116,13 @@ public SdmxWebManager loadManager() throws IOException { } } - private EventListener getEventListener() { - EventListener original = isNoLog() ? null : new LoggingListener()::onSourceEvent; + private EventListener getEventListener() { + EventListener original = isNoLog() ? null : new LoggingListener()::onSourceEvent; return new VerboseEventListener(original, verboseOptions)::onSourceEvent; } - private ErrorListener getErrorListener() { - ErrorListener original = isNoLog() ? null : new LoggingListener()::onSourceError; + private ErrorListener getErrorListener() { + ErrorListener original = isNoLog() ? null : new LoggingListener()::onSourceError; return new VerboseErrorListener(original, verboseOptions)::onSourceError; } @@ -132,7 +132,7 @@ private SdmxWebManager loadDefaultWebManager() { } @ReturnNew - private List loadCustomSources() throws IOException { + private List loadCustomSources() throws IOException { if (isNoConfig()) return emptyList(); if (sourcesFile != null && sourcesFile.exists() && sourcesFile.isFile()) { System.setProperty(SourceProperties.SOURCES.getKey(), sourcesFile.toString()); @@ -148,13 +148,13 @@ private List loadCustomSources() throws IOException { @lombok.extern.java.Log private static class LoggingListener { - public void onSourceEvent(SdmxWebSource source, String marker, CharSequence message) { + public void onSourceEvent(WebSource source, String marker, CharSequence message) { if (log.isLoggable(Level.INFO)) { log.info(message.toString()); } } - public void onSourceError(SdmxWebSource source, String marker, CharSequence message, IOException error) { + public void onSourceError(WebSource source, String marker, CharSequence message, IOException error) { if (log.isLoggable(Level.INFO)) { log.log(Level.INFO, message.toString(), error); } @@ -164,12 +164,12 @@ public void onSourceError(SdmxWebSource source, String marker, CharSequence mess @lombok.AllArgsConstructor private static class VerboseEventListener { - private final @Nullable EventListener main; + private final @Nullable EventListener main; @lombok.NonNull private final VerboseOptions verboseOptions; - public void onSourceEvent(SdmxWebSource source, String marker, CharSequence message) { + public void onSourceEvent(WebSource source, String marker, CharSequence message) { if (main != null) { main.accept(source, marker, message); } @@ -182,12 +182,12 @@ public void onSourceEvent(SdmxWebSource source, String marker, CharSequence mess @lombok.AllArgsConstructor private static class VerboseErrorListener { - private final @Nullable ErrorListener main; + private final @Nullable ErrorListener main; @lombok.NonNull private final VerboseOptions verboseOptions; - public void onSourceError(SdmxWebSource source, String marker, CharSequence message, IOException error) { + public void onSourceError(WebSource source, String marker, CharSequence message, IOException error) { if (main != null) { main.accept(source, marker, message, error); } diff --git a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java index 7a39e2b9c..e879395a0 100644 --- a/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java +++ b/sdmx-dl-cli/src/main/java/internal/sdmxdl/cli/WebSourceOptions.java @@ -18,7 +18,7 @@ import picocli.CommandLine; import sdmxdl.Connection; -import sdmxdl.Dataflow; +import sdmxdl.Flow; import sdmxdl.Feature; import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; @@ -52,11 +52,11 @@ public Set loadFeatures(SdmxWebManager manager, Languages languages) th } } - public Collection loadFlows(SdmxWebManager manager, Languages languages) throws IOException { + public Collection loadFlows(SdmxWebManager manager, Languages languages) throws IOException { try (Connection conn = open(manager, languages)) { return conn.getFlows(); } } - public static final Comparator FLOWS_BY_REF = Comparator.comparing(dataflow -> dataflow.getRef().toString()); + public static final Comparator FLOWS_BY_REF = Comparator.comparing(dataflow -> dataflow.getRef().toString()); } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckStatusCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckStatusCommand.java index 0a4811958..c31b6c9b0 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckStatusCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/CheckStatusCommand.java @@ -27,7 +27,7 @@ import picocli.CommandLine; import sdmxdl.web.MonitorReport; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.Comparator; @@ -80,7 +80,7 @@ private Stream getRows() throws IOException { private static class Status { static @NonNull Status of(@NonNull SdmxWebManager manager, @NonNull String sourceName) { - SdmxWebSource source = manager.getSources().get(sourceName); + WebSource source = manager.getSources().get(sourceName); if (source == null) { return failure(sourceName, "Cannot find source"); } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java index 131a3d70f..855a11947 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchDataCommand.java @@ -71,12 +71,12 @@ private void writeHead(Csv.Writer w) throws IOException { private void writeBody(Csv.Writer w) throws IOException { try (Connection conn = web.loadManager().getConnection(web.getSource(), web.getLangs())) { - DataStructure dsd = conn.getStructure(web.getFlow()); + Structure dsd = conn.getStructure(web.getFlow()); getBodyFormatter(dsd, format).getFormatter(dsd).formatCsv(getSortedSeries(conn, web), w); } } - private static SdmxPicocsvFormatter getBodyFormatter(DataStructure dsd, ObsFormat format) { + private static SdmxPicocsvFormatter getBodyFormatter(Structure dsd, ObsFormat format) { return SdmxPicocsvFormatter .builder() .ignoreHeader(true) @@ -96,7 +96,7 @@ private static Formatter getPeriodFormat(ObsFormat format) { } private static DataSet getSortedSeries(Connection conn, WebKeyOptions web) throws IOException { - DataQuery query = DataQuery.builder().key(web.getKey()).detail(getDetail()).build(); + Query query = Query.builder().key(web.getKey()).detail(getDetail()).build(); try (Stream stream = conn.getDataStream(web.getFlow(), query)) { return stream .sorted(WebFlowOptions.SERIES_BY_KEY) @@ -104,7 +104,7 @@ private static DataSet getSortedSeries(Connection conn, WebKeyOptions web) throw } } - private static DataDetail getDetail() { - return DataDetail.FULL; + private static Detail getDetail() { + return Detail.FULL; } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchKeysCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchKeysCommand.java index c4b56f60a..0231c9502 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchKeysCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchKeysCommand.java @@ -23,7 +23,7 @@ import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import nbbrd.io.text.Formatter; import picocli.CommandLine; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.Series; import java.io.IOException; @@ -62,7 +62,7 @@ private Stream getRows() throws IOException { return sort.applySort(web.loadSeries(web.loadManager(), web.getKey(), getDetail()).getData(), WebFlowOptions.SERIES_BY_KEY); } - private DataDetail getDetail() { - return DataDetail.SERIES_KEYS_ONLY; + private Detail getDetail() { + return Detail.SERIES_KEYS_ONLY; } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchMetaCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchMetaCommand.java index ac5bae1ea..f3ea1e625 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchMetaCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/FetchMetaCommand.java @@ -22,7 +22,7 @@ import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import nbbrd.io.text.Formatter; import picocli.CommandLine; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.Key; import java.io.IOException; @@ -68,8 +68,8 @@ private Stream getRows() throws IOException { , BY_FLOW_KEY_CONCEPT); } - private DataDetail getDetail() { - return DataDetail.NO_DATA; + private Detail getDetail() { + return Detail.NO_DATA; } private Stream getMetaResultStream(sdmxdl.Series series) { diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAttributesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAttributesCommand.java index 257e719cd..815bf3d0b 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAttributesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListAttributesCommand.java @@ -23,7 +23,7 @@ import nbbrd.io.text.Formatter; import picocli.CommandLine; import sdmxdl.Attribute; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import java.io.IOException; import java.util.Comparator; @@ -65,7 +65,7 @@ private Stream getRows() throws IOException { return getAttributes(web.loadStructure(web.loadManager())); } - private Stream getAttributes(DataStructure dsd) { + private Stream getAttributes(Structure dsd) { return sort.applySort(dsd.getAttributes(), BY_RELATIONSHIP_AND_ID); } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDimensionsCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDimensionsCommand.java index 10b87de1b..4caf8bb77 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDimensionsCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListDimensionsCommand.java @@ -23,7 +23,7 @@ import nbbrd.io.text.Formatter; import org.checkerframework.checker.nullness.qual.Nullable; import picocli.CommandLine; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.Dimension; import java.io.IOException; @@ -67,7 +67,7 @@ private Stream getRows() throws IOException { return getDimensions(web.loadStructure(web.loadManager())); } - private Stream getDimensions(DataStructure dsd) { + private Stream getDimensions(Structure dsd) { List dimensions = dsd.getDimensionList(); return IntStream .range(0, dimensions.size()) diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java index 09a1a2d0e..39669bc66 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListFlowsCommand.java @@ -21,7 +21,7 @@ import internal.sdmxdl.cli.ext.CsvTable; import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import picocli.CommandLine; -import sdmxdl.Dataflow; +import sdmxdl.Flow; import sdmxdl.format.csv.SdmxCsvFields; import java.io.IOException; @@ -49,16 +49,16 @@ public Void call() throws Exception { return null; } - private CsvTable getTable() { + private CsvTable getTable() { return CsvTable - .builderOf(Dataflow.class) - .columnOf("Ref", Dataflow::getRef, SdmxCsvFields.getDataflowRefFormatter()) - .columnOf("Name", Dataflow::getName) - .columnOf("Description", Dataflow::getDescription) + .builderOf(Flow.class) + .columnOf("Ref", Flow::getRef, SdmxCsvFields.getDataflowRefFormatter()) + .columnOf("Name", Flow::getName) + .columnOf("Description", Flow::getDescription) .build(); } - private Stream getRows() throws IOException { + private Stream getRows() throws IOException { return sort.applySort(web.loadFlows(web.loadManager(), web.getLangs()), WebSourceOptions.FLOWS_BY_REF); } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java index aed90078d..872ca304a 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListSourcesCommand.java @@ -22,7 +22,7 @@ import internal.sdmxdl.cli.ext.RFC4180OutputOptions; import nbbrd.io.text.Formatter; import picocli.CommandLine; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.concurrent.Callable; @@ -48,31 +48,31 @@ public Void call() throws Exception { return null; } - private CsvTable getTable() { + private CsvTable getTable() { return CsvTable - .builderOf(SdmxWebSource.class) - .columnOf("Name", SdmxWebSource::getId) + .builderOf(WebSource.class) + .columnOf("Name", WebSource::getId) .columnOf("Description", this::getDescription) - .columnOf("Aliases", SdmxWebSource::getAliases, CsvUtil.DEFAULT_LIST_FORMATTER) - .columnOf("Driver", SdmxWebSource::getDriver) - .columnOf("Endpoint", SdmxWebSource::getEndpoint, Formatter.onURI()) - .columnOf("Properties", SdmxWebSource::getProperties, DEFAULT_MAP_FORMATTER) - .columnOf("Website", SdmxWebSource::getWebsite, Formatter.onURL()) - .columnOf("Monitor", SdmxWebSource::getMonitor, Formatter.onURI()) - .columnOf("MonitorWebsite", SdmxWebSource::getMonitorWebsite, Formatter.onURL()) + .columnOf("Aliases", WebSource::getAliases, CsvUtil.DEFAULT_LIST_FORMATTER) + .columnOf("Driver", WebSource::getDriver) + .columnOf("Endpoint", WebSource::getEndpoint, Formatter.onURI()) + .columnOf("Properties", WebSource::getProperties, DEFAULT_MAP_FORMATTER) + .columnOf("Website", WebSource::getWebsite, Formatter.onURL()) + .columnOf("Monitor", WebSource::getMonitor, Formatter.onURI()) + .columnOf("MonitorWebsite", WebSource::getMonitorWebsite, Formatter.onURL()) .columnOf("Languages", this::getLanguages, CsvUtil.DEFAULT_LIST_FORMATTER) .build(); } - private String getDescription(SdmxWebSource source) { + private String getDescription(WebSource source) { return source.getName(web.getLangs()); } - private Iterable getLanguages(SdmxWebSource source) { + private Iterable getLanguages(WebSource source) { return source.getNames().keySet(); } - private Stream getRows() throws IOException { + private Stream getRows() throws IOException { return web.loadManager() .getSources() .values() diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java index 68a3717fb..c977fb640 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/CheckRulesCommand.java @@ -25,7 +25,7 @@ import sdmxdl.testing.WebRuleLoader; import sdmxdl.testing.xml.XmlSourceQuery; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.File; import java.io.IOException; @@ -107,7 +107,7 @@ private static RulesTarget targetOf(WebRequest request) { .build(); } - private static RulesConfig configOf(SdmxWebSource source) { + private static RulesConfig configOf(WebSource source) { try { RulesConfig.Builder result = RulesConfig.newBuilder(); result.setDriver(source.getDriver()); diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugDataCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugDataCommand.java index a3a7437d8..72b062150 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugDataCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugDataCommand.java @@ -19,7 +19,7 @@ import internal.sdmxdl.cli.DebugOutputOptions; import internal.sdmxdl.cli.WebKeyOptions; import picocli.CommandLine; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.format.protobuf.ProtobufRepositories; import java.util.concurrent.Callable; @@ -39,7 +39,7 @@ public final class DebugDataCommand implements Callable { @Override public Void call() throws Exception { - output.dumpAll(ProtobufRepositories.fromDataSet(web.loadSeries(web.loadManager(), DataDetail.FULL))); + output.dumpAll(ProtobufRepositories.fromDataSet(web.loadSeries(web.loadManager(), Detail.FULL))); return null; } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java index 57b3fa21c..6bc449b30 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/DebugListCommand.java @@ -25,8 +25,8 @@ import picocli.CommandLine.Command; import picocli.CommandLine.Mixin; import picocli.CommandLine.Spec; -import sdmxdl.DataDetail; -import sdmxdl.Dataflow; +import sdmxdl.Detail; +import sdmxdl.Flow; import sdmxdl.Feature; import sdmxdl.Key; import sdmxdl.cli.protobuf.Features; @@ -34,7 +34,7 @@ import sdmxdl.cli.protobuf.Sources; import sdmxdl.format.protobuf.ProtobufRepositories; import sdmxdl.format.protobuf.ProtobufSources; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.Collection; import java.util.concurrent.Callable; @@ -60,7 +60,7 @@ public void sources(@Mixin WebOptions web, @ArgGroup(validate = false, headingKe nonNull(out).dumpAll(fromWebSources(web.loadManager().getSources().values())); } - private static Sources fromWebSources(Collection value) { + private static Sources fromWebSources(Collection value) { return Sources .newBuilder() .addAllSources(value.stream().map(ProtobufSources::fromWebSource).collect(Collectors.toList())) @@ -72,7 +72,7 @@ public void flows(@Mixin WebSourceOptions web, @ArgGroup(validate = false, headi nonNull(out).dumpAll(fromDataflows(web.loadFlows(web.loadManager(), web.getLangs()))); } - private static Flows fromDataflows(Collection value) { + private static Flows fromDataflows(Collection value) { return Flows .newBuilder() .addAllFlows(value.stream().map(ProtobufRepositories::fromDataflow).collect(Collectors.toList())) @@ -81,7 +81,7 @@ private static Flows fromDataflows(Collection value) { @Command public void keys(@Mixin WebFlowOptions web, @ArgGroup(validate = false, headingKey = "debug") DebugOutputOptions out) throws Exception { - nonNull(out).dumpAll(ProtobufRepositories.fromDataSet(web.loadSeries(web.loadManager(), Key.ALL, DataDetail.SERIES_KEYS_ONLY))); + nonNull(out).dumpAll(ProtobufRepositories.fromDataSet(web.loadSeries(web.loadManager(), Key.ALL, Detail.SERIES_KEYS_ONLY))); } @Command diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java index 0677ed8bb..fce2f0c6a 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/experimental/FetchExtraCommand.java @@ -72,11 +72,11 @@ private Stream getRows() throws IOException { SdmxWebManager manager = web.loadManager(); try (Connection conn = web.open(manager, web.getLangs())) { - DataStructure dsd = conn.getStructure(web.getFlow()); + Structure dsd = conn.getStructure(web.getFlow()); SeriesMetaFactory factory = SeriesMetaFactory.getDefault(dsd); - return sort.applySort(conn.getData(web.getFlow(), DataQuery.builder().key(web.getKey()).detail(getDetail()).build()).getData(), SERIES_BY_KEY) + return sort.applySort(conn.getData(web.getFlow(), Query.builder().key(web.getKey()).detail(getDetail()).build()).getData(), SERIES_BY_KEY) .map(series -> { SeriesMeta x = factory.get(series); return new Extra( @@ -91,8 +91,8 @@ private Stream getRows() throws IOException { } } - private DataDetail getDetail() { - return DataDetail.FULL; + private Detail getDetail() { + return Detail.FULL; } @lombok.Value diff --git a/sdmx-dl-cli/src/test/java/_demo/Demo.java b/sdmx-dl-cli/src/test/java/_demo/Demo.java index d89665b5b..aeadd218a 100644 --- a/sdmx-dl-cli/src/test/java/_demo/Demo.java +++ b/sdmx-dl-cli/src/test/java/_demo/Demo.java @@ -3,12 +3,12 @@ import sdmxdl.*; import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.stream.Stream; -import static sdmxdl.DataDetail.DATA_ONLY; +import static sdmxdl.Detail.DATA_ONLY; import static sdmxdl.Languages.ANY; public class Demo { @@ -23,18 +23,18 @@ public static void main(String[] args) throws IOException { .build(); try (Connection ecb = manager.getConnection("ECB", ANY)) { - DataflowRef exr = DataflowRef.parse("EXR"); + FlowRef exr = FlowRef.parse("EXR"); printFlow(ecb.getFlow(exr)); Key chf = Key.parse("M.CHF.EUR.SP00.A"); - DataQuery chfData = DataQuery.builder().key(chf).detail(DATA_ONLY).build(); + Query chfData = Query.builder().key(chf).detail(DATA_ONLY).build(); try (Stream dataStream = ecb.getDataStream(exr, chfData)) { dataStream.forEach(Demo::printSeries); } } } - private static void printFlow(Dataflow flow) { + private static void printFlow(Flow flow) { System.out.println(flow.getName()); } @@ -42,7 +42,7 @@ private static void printSeries(Series series) { System.out.println(series.getKey() + ": " + series.getObs().size() + " observations"); } - private static void printEvent(SdmxWebSource source, String marker, CharSequence message) { + private static void printEvent(WebSource source, String marker, CharSequence message) { System.err.println("[" + source.getId() + "] (" + marker + ") " + message); } } diff --git a/sdmx-dl-cli/src/test/java/_test/FileSample.java b/sdmx-dl-cli/src/test/java/_test/FileSample.java index 6425dd28e..2373b15bc 100644 --- a/sdmx-dl-cli/src/test/java/_test/FileSample.java +++ b/sdmx-dl-cli/src/test/java/_test/FileSample.java @@ -1,7 +1,7 @@ package _test; import sdmxdl.provider.ri.drivers.FileRiDriver; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.format.xml.XmlWebSource; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -33,8 +33,8 @@ public static File create(Path temp) throws IOException { return source; } - private static SdmxWebSource sourceOf(String name, File data, File struct) { - return SdmxWebSource + private static WebSource sourceOf(String name, File data, File struct) { + return WebSource .builder() .id(name) .driver("ri:file") diff --git a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java index 543ee236c..06f6c127b 100644 --- a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java +++ b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/ConstantAuthenticatorTest.java @@ -1,7 +1,7 @@ package internal.sdmxdl.cli; import org.junit.jupiter.api.Test; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.AuthenticatorAssert; import java.net.PasswordAuthentication; @@ -12,7 +12,7 @@ public class ConstantAuthenticatorTest { @Test public void testCompliance() { - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver("driver") diff --git a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/WebOptionsTest.java b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/WebOptionsTest.java index 787e5ed2b..eb7ffadb4 100644 --- a/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/WebOptionsTest.java +++ b/sdmx-dl-cli/src/test/java/internal/sdmxdl/cli/WebOptionsTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import picocli.CommandLine; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.format.xml.XmlWebSource; import java.io.File; @@ -58,7 +58,7 @@ private File newInvalidFile(Path temp) throws IOException { private File newValidFile(Path temp) throws IOException { File result = Files.createFile(temp.resolve("validFile")).toFile(); - SdmxWebSource source = SdmxWebSource.builder().id("xyz").driver("dummy").endpointOf("http://localhost").build(); + WebSource source = WebSource.builder().id("xyz").driver("dummy").endpointOf("http://localhost").build(); XmlWebSource.getFormatter().formatFile(singletonList(source), result); return result; } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSetRefFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSetRefFormats.java index 87f7983c1..e8406448e 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSetRefFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSetRefFormats.java @@ -26,7 +26,7 @@ public static String toTooltipText(DataSetRef ref, FlowStruct fs) { } private static Dimension getDimension(DataSetRef ref, FlowStruct fs) { - return fs.getDataStructure().getDimensionList().get(ref.getDimensionIndex()); + return fs.getStructure().getDimensionList().get(ref.getDimensionIndex()); } private static String getKeyText(DataSetRef ref) { diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSourceRefFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSourceRefFormats.java index 7129ff128..a3e51ba17 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSourceRefFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DataSourceRefFormats.java @@ -10,7 +10,7 @@ public class DataSourceRefFormats { public static String toText(DataSourceRef ref, FlowStruct fs) { - return fs != null ? fs.getDataflow().getName() : ref.getFlow().toString(); + return fs != null ? fs.getFlow().getName() : ref.getFlow().toString(); } public static String toTooltipText(DataSourceRef ref, FlowStruct fs) { @@ -29,7 +29,7 @@ private static Text htmlSource(DataSourceRef ref) { private static DomContent htmlFlow(DataSourceRef ref, FlowStruct fs) { return fs != null - ? each(text(fs.getDataflow().getRef().toString()), br(), text(fs.getDataflow().getName())) + ? each(text(fs.getFlow().getRef().toString()), br(), text(fs.getFlow().getName())) : text(ref.getFlow().toString()); } diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java index a2d4e2890..f2b81c879 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/DesktopWebFactory.java @@ -2,7 +2,7 @@ import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.Collections; @@ -24,7 +24,7 @@ public static SdmxWebManager loadManager() { .build(); } - private static List getCustomSources() { + private static List getCustomSources() { try { return SourceProperties.loadCustomSources(); } catch (IOException e) { diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java index 9782dacae..eefda9d9f 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java @@ -4,7 +4,7 @@ import nbbrd.io.text.Formatter; import sdmxdl.Attribute; import sdmxdl.AttributeRelationship; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.Obs; import java.util.Map; @@ -15,7 +15,7 @@ public final class ObsFormats { - public static Formatter getChartTooltipFormatter(DataStructure dsd) { + public static Formatter getChartTooltipFormatter(Structure dsd) { Map attributes = dsd.getAttributes().stream() .filter(attribute -> attribute.getRelationship().equals(AttributeRelationship.OBSERVATION)) .collect(Collectors.toMap(Attribute::getId, Function.identity())); @@ -26,7 +26,7 @@ private static String getChartToolTipText(Obs obs, Map attrib return obs.getPeriod() + ": " + obs.getValue(); } - public static Formatter getHtmlTooltipFormatter(DataStructure dsd) { + public static Formatter getHtmlTooltipFormatter(Structure dsd) { Map attributes = dsd.getAttributes().stream() .filter(attribute -> attribute.getRelationship().equals(AttributeRelationship.OBSERVATION)) .collect(Collectors.toMap(Attribute::getId, Function.identity())); diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java index 775049407..6ca89643b 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SdmxAutoCompletion.java @@ -28,7 +28,7 @@ import sdmxdl.*; import sdmxdl.desktop.MainComponent; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.SSLFactory; @@ -67,15 +67,15 @@ public static SdmxAutoCompletion onWebSource(SdmxWebManager manager, Languages l return new WebSourceCompletion(manager, languages); } - public static SdmxAutoCompletion onDataflow(SdmxManager manager, Languages languages, Supplier source, ConcurrentMap cache) { + public static SdmxAutoCompletion onDataflow(SdmxManager manager, Languages languages, Supplier source, ConcurrentMap cache) { return new DataflowCompletion<>(manager, languages, source, cache); } - public static SdmxAutoCompletion onDimension(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + public static SdmxAutoCompletion onDimension(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { return new DimensionCompletion<>(manager, languages, source, flowRef, cache); } - public static SdmxAutoCompletion onAttribute(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { + public static SdmxAutoCompletion onAttribute(SdmxManager manager, Languages languages, Supplier source, Supplier flowRef, ConcurrentMap cache) { return new AttributeCompletion<>(manager, languages, source, flowRef, cache); } @@ -94,26 +94,26 @@ public AutoCompletionSource getSource() { .builder(this::load) .behavior(SYNC) .postProcessor(this::filterAndSort) - .valueToString(SdmxWebSource::getId) + .valueToString(WebSource::getId) .build(); } @Override public ListCellRenderer getRenderer() { - return new CustomListCellRenderer() { + return new CustomListCellRenderer() { @Override - protected String getValueAsString(SdmxWebSource value) { + protected String getValueAsString(WebSource value) { return value.getId() + ": " + languages.select(value.getNames()); } @Override - protected Icon toIcon(String term, JList list, SdmxWebSource value, int index, boolean isSelected, boolean cellHasFocus) { + protected Icon toIcon(String term, JList list, WebSource value, int index, boolean isSelected, boolean cellHasFocus) { return getFavicon(value.getWebsite(), list::repaint); } }; } - private List load(String term) { + private List load(String term) { return manager .getSources() .values() @@ -122,11 +122,11 @@ private List load(String term) { .collect(toList()); } - private List filterAndSort(List list, String term) { + private List filterAndSort(List list, String term) { return list.stream().filter(getFilter(term)).collect(toList()); } - private Predicate getFilter(String term) { + private Predicate getFilter(String term) { Predicate filter = ExtAutoCompletionSource.basicFilter(term); return value -> filter.test(languages.select(value.getNames())) || filter.test(value.getId()) @@ -135,7 +135,7 @@ private Predicate getFilter(String term) { } @lombok.AllArgsConstructor - private static final class DataflowCompletion extends SdmxAutoCompletion { + private static final class DataflowCompletion extends SdmxAutoCompletion { @lombok.NonNull private final SdmxManager manager; @@ -162,10 +162,10 @@ public AutoCompletionSource getSource() { @Override public ListCellRenderer getRenderer() { - return CustomListCellRenderer.of(flow -> flow.getRef() + "
" + flow.getName(), flow -> flow.getRef().toString()); + return CustomListCellRenderer.of(flow -> flow.getRef() + "
" + flow.getName(), flow -> flow.getRef().toString()); } - private List load(String term) throws Exception { + private List load(String term) throws Exception { try (Connection c = manager.getConnection(source.get(), languages)) { return new ArrayList<>(c.getFlows()); } @@ -175,11 +175,11 @@ private AutoCompletionSource.Behavior getBehavior(String term) { return source.get() != null ? ASYNC : NONE; } - private List filterAndSort(List values, String term) { + private List filterAndSort(List values, String term) { Predicate filter = ExtAutoCompletionSource.basicFilter(term); return values.stream() .filter(o -> filter.test(o.getName()) || filter.test(o.getRef().getId()) || filter.test(o.getDescription())) - .sorted(Comparator.comparing(Dataflow::getName)) + .sorted(Comparator.comparing(Flow::getName)) .collect(toList()); } @@ -189,7 +189,7 @@ private String getCacheKey(String term) { } @lombok.AllArgsConstructor - private static final class DimensionCompletion extends SdmxAutoCompletion { + private static final class DimensionCompletion extends SdmxAutoCompletion { @lombok.NonNull private final SdmxManager manager; @@ -201,7 +201,7 @@ private static final class DimensionCompletion extends Sdm private final Supplier source; @lombok.NonNull - private final Supplier flowRef; + private final Supplier flowRef; @lombok.NonNull private final ConcurrentMap cache; @@ -246,7 +246,7 @@ private String getCacheKey(String term) { } @lombok.AllArgsConstructor - private static final class AttributeCompletion extends SdmxAutoCompletion { + private static final class AttributeCompletion extends SdmxAutoCompletion { @lombok.NonNull private final SdmxManager manager; @@ -258,7 +258,7 @@ private static final class AttributeCompletion extends Sdm private final Supplier source; @lombok.NonNull - private final Supplier flowRef; + private final Supplier flowRef; @lombok.NonNull private final ConcurrentMap cache; diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java index cba86b4ef..7c6b9dc26 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataNodeFactory.java @@ -37,7 +37,7 @@ public List getChildren(Object userObject) throws Exception { private static List getChildren(SdmxWebManager manager, Languages languages, DataSourceRef dataSourceRef, Key key) throws IOException { try (Connection conn = manager.getConnection(dataSourceRef.getSource(), languages)) { - DataStructure dsd = conn.getStructure(dataSourceRef.getFlow()); + Structure dsd = conn.getStructure(dataSourceRef.getFlow()); List dimensionList = dsd.getDimensionList(); Key.Builder builder = Key.builder(dsd); for (int i = 0; i < key.size(); i++) { diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataSourceRef.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataSourceRef.java index 2d3ee4ef0..6b6cde9c6 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataSourceRef.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/DataSourceRef.java @@ -1,7 +1,7 @@ package sdmxdl.desktop; import lombok.NonNull; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import java.util.List; @@ -10,7 +10,7 @@ public class DataSourceRef { @NonNull String source; - @NonNull DataflowRef flow; + @NonNull FlowRef flow; @NonNull List dimensions; } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java index ee328f795..de2bfc281 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/FlowStruct.java @@ -2,8 +2,8 @@ import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.DataStructure; -import sdmxdl.Dataflow; +import sdmxdl.Flow; +import sdmxdl.Structure; import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; @@ -12,9 +12,9 @@ @lombok.Value public class FlowStruct { - @NonNull Dataflow dataflow; + @NonNull Flow flow; - @NonNull DataStructure dataStructure; + @NonNull Structure structure; public static FlowStruct load(SdmxWebManager manager, Languages languages, DataSourceRef ref) throws IOException { try (Connection conn = manager.getConnection(ref.getSource(), languages)) { diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java index 1ff7d521d..fa05cf425 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/MainComponent.java @@ -15,10 +15,10 @@ import org.kordamp.ikonli.Ikon; import org.kordamp.ikonli.materialdesign.MaterialDesign; import org.kordamp.ikonli.swing.FontIcon; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import sdmxdl.Languages; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.Network; @@ -80,7 +80,7 @@ public void setDataSources(@NonNull DefaultListModel dataSources) private final JTree datasetsTree = new JTree(); - private final JList sourcesList = new JList<>(); + private final JList sourcesList = new JList<>(); private final JList driversList = new JList<>(); @@ -99,7 +99,7 @@ public void setDataSources(@NonNull DefaultListModel dataSources) private URLConnection openConnection(URL url) throws IOException { try { - SdmxWebSource source = SdmxWebSource.builder().id("").driver("").endpoint(url.toURI()).build(); + WebSource source = WebSource.builder().id("").driver("").endpoint(url.toURI()).build(); Network network = getSdmxManager().getNetworking().getNetwork(source, null, null); return network.getURLConnectionFactory().openConnection(url, Proxy.NO_PROXY); } catch (URISyntaxException ex) { @@ -115,7 +115,7 @@ private Image loadImage() { } } - private final Map flowStructs = new HashMap<>(); + private final Map flowStructs = new HashMap<>(); public MainComponent() { initComponent(); @@ -327,7 +327,7 @@ protected Void doInBackground() throws Exception { @Override protected void process(List chunks) { - chunks.forEach(chunk -> flowStructs.put(chunk.getDataflow().getRef(), chunk)); + chunks.forEach(chunk -> flowStructs.put(chunk.getFlow().getRef(), chunk)); datasetsTree.repaint(); } }.execute(); @@ -371,7 +371,7 @@ public void execute(@NonNull MainComponent c) { JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE, null, new Object[]{"Add", "Cancel"}, "Add") == 0) { - c.getDataSources().addElement(new DataSourceRef(sourceField.getText(), DataflowRef.parse(flowField.getText()), emptyList())); + c.getDataSources().addElement(new DataSourceRef(sourceField.getText(), FlowRef.parse(flowField.getText()), emptyList())); } } diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java index 0b0c9589a..24e7efb3c 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/SingleSeries.java @@ -11,7 +11,7 @@ @lombok.Value class SingleSeries { - @NonNull DataStructure dsd; + @NonNull Structure dsd; @NonNull Series series; @@ -19,8 +19,8 @@ class SingleSeries { public static SingleSeries load(SdmxWebManager manager, Languages languages, DataSetRef ref) throws IOException { try (Connection conn = manager.getConnection(ref.getDataSourceRef().getSource(), languages)) { - DataStructure dsd = conn.getStructure(ref.getDataSourceRef().getFlow()); - Series series = conn.getDataStream(ref.getDataSourceRef().getFlow(), DataQuery.builder().key(ref.getKey()).detail(DataDetail.FULL).build()).findFirst().orElseThrow(RuntimeException::new); + Structure dsd = conn.getStructure(ref.getDataSourceRef().getFlow()); + Series series = conn.getDataStream(ref.getDataSourceRef().getFlow(), Query.builder().key(ref.getKey()).detail(Detail.FULL).build()).findFirst().orElseThrow(RuntimeException::new); return new SingleSeries( dsd, series, diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java index c02b094e0..f67a4eb45 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/DiskCachingSupport.java @@ -7,11 +7,11 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.format.spi.Persistence; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebCaching; import java.nio.file.Path; @@ -66,7 +66,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getReaderCache(@NonNull FileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return new LockingCache<>(DiskCache .builder() .root(root) @@ -79,7 +79,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getDriverCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return new LockingCache<>(DiskCache .builder() .root(root) @@ -92,7 +92,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getMonitorCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return new LockingCache<>(DiskCache .builder() .root(root) diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java index 09c129ee5..703491829 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/MemCachingSupport.java @@ -6,10 +6,10 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebCaching; import java.time.Clock; @@ -64,7 +64,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getReaderCache(@NonNull SdmxFileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getReaderCache(@NonNull FileSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return MemCache .builder() .map(repositories.get()) @@ -73,7 +73,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getDriverCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getDriverCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return MemCache .builder() .map(repositories.get()) @@ -82,7 +82,7 @@ public int getWebCachingRank() { } @Override - public @NonNull Cache getMonitorCache(@NonNull SdmxWebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { + public @NonNull Cache getMonitorCache(@NonNull WebSource source, @Nullable EventListener onEvent, @Nullable ErrorListener onError) { return MemCache .builder() .map(webMonitors.get()) diff --git a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java index 86424609e..37f6f6edd 100644 --- a/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java +++ b/sdmx-dl-format-base/src/test/java/sdmxdl/format/MemCachingSupportTest.java @@ -4,8 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.file.FileSource; +import sdmxdl.web.WebSource; import java.io.File; import java.util.HashMap; @@ -62,7 +62,7 @@ MemCache f(MemCachingSupport z) { abstract MemCache f(MemCachingSupport z); } - private final static SdmxFileSource FILE_SOURCE = SdmxFileSource.builder().data(new File("")).build(); + private final static FileSource FILE_SOURCE = FileSource.builder().data(new File("")).build(); - private final static SdmxWebSource WEB_SOURCE = SdmxWebSource.builder().id("").driver("").endpoint(Parser.onURI().parseValue("http://localhost").orElseThrow(RuntimeException::new)).build(); + private final static WebSource WEB_SOURCE = WebSource.builder().id("").driver("").endpoint(Parser.onURI().parseValue("http://localhost").orElseThrow(RuntimeException::new)).build(); } diff --git a/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/DataCursorAssert.java b/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/DataCursorAssert.java index cea0ceb0a..df5e713bd 100644 --- a/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/DataCursorAssert.java +++ b/sdmx-dl-format-base/src/test/java/tests/sdmxdl/format/DataCursorAssert.java @@ -19,7 +19,7 @@ import nbbrd.io.function.IOConsumer; import nbbrd.io.function.IOSupplier; import org.assertj.core.api.SoftAssertions; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.Key; import sdmxdl.format.DataCursor; import tests.sdmxdl.api.TckUtil; @@ -30,11 +30,11 @@ @lombok.experimental.UtilityClass public class DataCursorAssert { - public void assertCompliance(IOSupplier supplier, Key key, DataDetail detail) { + public void assertCompliance(IOSupplier supplier, Key key, Detail detail) { TckUtil.run(s -> assertCompliance(s, supplier, key, detail)); } - public void assertCompliance(SoftAssertions s, IOSupplier supplier, Key key, DataDetail detail) throws Exception { + public void assertCompliance(SoftAssertions s, IOSupplier supplier, Key key, Detail detail) throws Exception { try (DataCursor c = supplier.getWithIO()) { while (c.nextSeries()) { assertNonnull(s, c); diff --git a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFieldWriter.java b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFieldWriter.java index 26f184bcd..1e39365e0 100644 --- a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFieldWriter.java +++ b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFieldWriter.java @@ -63,12 +63,12 @@ public void writeBody(Series series, Obs obs, IOConsumer output) t }; } - static @NonNull SdmxCsvFieldWriter onDataflow(@NonNull String label, @NonNull DataflowRef ref) { + static @NonNull SdmxCsvFieldWriter onDataflow(@NonNull String label, @NonNull FlowRef ref) { String dataflow = SdmxCsvFields.getDataflowRefFormatter().formatAsString(ref); return single(label, (series, obs) -> dataflow); } - static @NonNull SdmxCsvFieldWriter onKeyDimensions(@NonNull DataStructure dsd) { + static @NonNull SdmxCsvFieldWriter onKeyDimensions(@NonNull Structure dsd) { return onKeyDimensions(dsd.getDimensions() .stream() .map(Dimension::getId) @@ -79,7 +79,7 @@ public void writeBody(Series series, Obs obs, IOConsumer output) t return multi(labels, (series, obs, i) -> series.getKey().get(i)); } - static @NonNull SdmxCsvFieldWriter onTimeDimension(@NonNull DataStructure dsd, @NonNull Formatter formatter) { + static @NonNull SdmxCsvFieldWriter onTimeDimension(@NonNull Structure dsd, @NonNull Formatter formatter) { // FIXME: dsd#getTimeDimensionId() might be null ! return onTimeDimension(dsd.getTimeDimensionId(), formatter); } @@ -92,7 +92,7 @@ public void writeBody(Series series, Obs obs, IOConsumer output) t return single(label, (series, obs) -> formatter.format(obs.getValue())); } - static @NonNull SdmxCsvFieldWriter onAttributes(@NonNull DataStructure dsd) { + static @NonNull SdmxCsvFieldWriter onAttributes(@NonNull Structure dsd) { return onAttributes(dsd.getAttributes() .stream() .sorted(Comparator.comparing(Attribute::getId)) diff --git a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFields.java b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFields.java index adf1622ca..75d9194e4 100644 --- a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFields.java +++ b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxCsvFields.java @@ -3,7 +3,7 @@ import lombok.NonNull; import nbbrd.io.text.Formatter; import nbbrd.io.text.Parser; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import sdmxdl.Series; import java.text.DecimalFormat; @@ -27,11 +27,11 @@ public class SdmxCsvFields { public static final String ATTRIBUTES = "ATTRIBUTES"; public static final String SERIESKEY = "SERIESKEY"; - public @NonNull Formatter getDataflowRefFormatter() { + public @NonNull Formatter getDataflowRefFormatter() { return SdmxCsvFields::formatDataflowField; } - public @NonNull Parser getDataflowRefParser() { + public @NonNull Parser getDataflowRefParser() { return SdmxCsvFields::parseDataflowField; } @@ -53,11 +53,11 @@ private static DateTimeFormatter getDateTimeFormatter() { return DateTimeFormatter.ISO_DATE_TIME; } - private static String formatDataflowField(DataflowRef ref) { + private static String formatDataflowField(FlowRef ref) { return ref != null ? (ref.getAgency() + ":" + ref.getId() + "(" + ref.getVersion() + ")") : null; } - private static DataflowRef parseDataflowField(CharSequence ref) { + private static FlowRef parseDataflowField(CharSequence ref) { if (ref == null) return null; String text = ref.toString(); @@ -72,7 +72,7 @@ private static DataflowRef parseDataflowField(CharSequence ref) { if (idx3 != text.length() - 1) return null; - return DataflowRef.of( + return FlowRef.of( text.substring(0, idx1), text.substring(idx1 + 1, idx2), text.substring(idx2 + 1, idx3) diff --git a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvFormatter.java b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvFormatter.java index 8d79bfb30..57000a0ba 100644 --- a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvFormatter.java +++ b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvFormatter.java @@ -4,7 +4,7 @@ import nbbrd.io.picocsv.Picocsv; import nbbrd.picocsv.Csv; import sdmxdl.DataSet; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.Obs; import sdmxdl.Series; @@ -33,11 +33,11 @@ public final class SdmxPicocsvFormatter { @lombok.Builder.Default private final boolean ignoreHeader = false; - public Picocsv.@NonNull Formatter getFormatter(DataStructure dsd) { + public Picocsv.@NonNull Formatter getFormatter(Structure dsd) { return Picocsv.Formatter.builder((value, writer) -> formatCsv(dsd, value, writer)).build(); } - private void formatCsv(DataStructure dsd, DataSet data, Csv.Writer w) throws IOException { + private void formatCsv(Structure dsd, DataSet data, Csv.Writer w) throws IOException { SdmxCsvFieldWriter[] writers = fields.stream() .map(field -> getFieldWriter(dsd, data, field)) .toArray(SdmxCsvFieldWriter[]::new); @@ -59,7 +59,7 @@ private void formatCsv(DataStructure dsd, DataSet data, Csv.Writer w) throws IOE } } - private SdmxCsvFieldWriter getFieldWriter(DataStructure dsd, DataSet dataSet, String field) { + private SdmxCsvFieldWriter getFieldWriter(Structure dsd, DataSet dataSet, String field) { Function factory = customFactories.get(field); if (factory == null) { factory = getDefaultFactory(dsd, field); @@ -67,7 +67,7 @@ private SdmxCsvFieldWriter getFieldWriter(DataStructure dsd, DataSet dataSet, St return factory.apply(dataSet); } - private Function getDefaultFactory(DataStructure dsd, String field) { + private Function getDefaultFactory(Structure dsd, String field) { switch (field) { case DATAFLOW: return dataSet -> SdmxCsvFieldWriter.onDataflow(DATAFLOW, dataSet.getRef()); diff --git a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvParser.java b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvParser.java index d2114368c..412afbf4d 100644 --- a/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvParser.java +++ b/sdmx-dl-format-csv/src/main/java/sdmxdl/format/csv/SdmxPicocsvParser.java @@ -27,11 +27,11 @@ public final class SdmxPicocsvParser { @lombok.Builder.Default private final Locale locale = Locale.ROOT; - public Picocsv.@NonNull Parser getParser(DataStructure dsd) { + public Picocsv.@NonNull Parser getParser(Structure dsd) { return Picocsv.Parser.builder(reader -> parseCsv(dsd, reader)).build(); } - private DataSet parseCsv(DataStructure dsd, Csv.Reader reader) throws IOException { + private DataSet parseCsv(Structure dsd, Csv.Reader reader) throws IOException { List header = readHeader(reader); int minHeaderSize = 3 + dsd.getDimensions().size(); @@ -63,9 +63,9 @@ private DataSet parseCsv(DataStructure dsd, Csv.Reader reader) throws IOExceptio } ObsParser obsParser = factory.get(); - Parser refParser = SdmxCsvFields.getDataflowRefParser(); + Parser refParser = SdmxCsvFields.getDataflowRefParser(); - DataflowRef dataflowRef = DataflowRef.of(null, "", null); + FlowRef flowRef = FlowRef.of(null, "", null); Map data = new HashMap<>(); Key.Builder keyBuilder = Key.builder(dsd); @@ -74,7 +74,7 @@ private DataSet parseCsv(DataStructure dsd, Csv.Reader reader) throws IOExceptio if (!reader.readField()) { throw new IOException("Missing dataflow field"); } - dataflowRef = refParser.parse(reader); + flowRef = refParser.parse(reader); keyBuilder.clear(); for (int i = 0; i < keyBuilder.size(); i++) { @@ -117,7 +117,7 @@ private DataSet parseCsv(DataStructure dsd, Csv.Reader reader) throws IOExceptio return data.values() .stream() .map(Series.Builder::build) - .collect(toDataSet(dataflowRef, DataQuery.ALL)); + .collect(toDataSet(flowRef, Query.ALL)); } private List readHeader(Csv.Reader reader) throws IOException { diff --git a/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldWriterTest.java b/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldWriterTest.java index 35bc3a4ff..26599007e 100644 --- a/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldWriterTest.java +++ b/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldWriterTest.java @@ -3,8 +3,8 @@ import nbbrd.io.text.Formatter; import nbbrd.picocsv.Csv; import org.junit.jupiter.api.Test; -import sdmxdl.DataStructure; -import sdmxdl.DataflowRef; +import sdmxdl.Structure; +import sdmxdl.FlowRef; import sdmxdl.Obs; import sdmxdl.Series; @@ -47,10 +47,10 @@ private String body(SdmxCsvFieldWriter x, Series series, Obs obs) { @Test public void testOnDataflow() { - assertThatNullPointerException().isThrownBy(() -> onDataflow(null, DataflowRef.parse("abc"))); + assertThatNullPointerException().isThrownBy(() -> onDataflow(null, FlowRef.parse("abc"))); assertThatNullPointerException().isThrownBy(() -> onDataflow("xyz", null)); - assertThat(onDataflow("xyz", DataflowRef.parse("abc"))) + assertThat(onDataflow("xyz", FlowRef.parse("abc"))) .satisfies(x -> { assertThat(head(x)).isEqualTo("xyz"); assertThat(body(x, S1, OBS1)).isEqualTo("all:abc(latest)"); @@ -59,7 +59,7 @@ public void testOnDataflow() { @Test public void testOnKeyDimensions() { - assertThatNullPointerException().isThrownBy(() -> onKeyDimensions((DataStructure) null)); + assertThatNullPointerException().isThrownBy(() -> onKeyDimensions((Structure) null)); assertThat(onKeyDimensions(STRUCT)) .satisfies(x -> { @@ -80,7 +80,7 @@ public void testOnKeyDimensions() { public void testOnTimeDimension() { Formatter formatter = Formatter.onDateTimeFormatter(DateTimeFormatter.ISO_LOCAL_DATE_TIME); - assertThatNullPointerException().isThrownBy(() -> onTimeDimension((DataStructure) null, formatter)); + assertThatNullPointerException().isThrownBy(() -> onTimeDimension((Structure) null, formatter)); assertThatNullPointerException().isThrownBy(() -> onTimeDimension(STRUCT, null)); assertThat(onTimeDimension(STRUCT, formatter)) @@ -115,7 +115,7 @@ public void testOnObsValue() { @Test public void testOnAttributes() { - assertThatNullPointerException().isThrownBy(() -> onAttributes((DataStructure) null)); + assertThatNullPointerException().isThrownBy(() -> onAttributes((Structure) null)); assertThat(onAttributes(STRUCT)) .satisfies(x -> { diff --git a/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldsTest.java b/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldsTest.java index 7286edc3a..8d4c74b9c 100644 --- a/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldsTest.java +++ b/sdmx-dl-format-csv/src/test/java/sdmxdl/format/csv/SdmxCsvFieldsTest.java @@ -3,7 +3,7 @@ import nbbrd.io.text.Formatter; import nbbrd.io.text.Parser; import org.junit.jupiter.api.Test; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import static org.assertj.core.api.Assertions.assertThat; @@ -11,16 +11,16 @@ public class SdmxCsvFieldsTest { @Test public void testParser() { - Parser parser = SdmxCsvFields.getDataflowRefParser(); + Parser parser = SdmxCsvFields.getDataflowRefParser(); assertThat(parser.parse("ECB:EXR(1.0)")) - .isEqualTo(DataflowRef.of("ECB", "EXR", "1.0")); + .isEqualTo(FlowRef.of("ECB", "EXR", "1.0")); assertThat(parser.parse("all:EXR(latest)")) - .isEqualTo(DataflowRef.of(null, "EXR", null)); + .isEqualTo(FlowRef.of(null, "EXR", null)); assertThat(parser.parse(":()")) - .isEqualTo(DataflowRef.of(null, "", null)); + .isEqualTo(FlowRef.of(null, "", null)); assertThat(parser.parse(null)).isNull(); assertThat(parser.parse("all:EXR(latest")).isNull(); @@ -33,26 +33,26 @@ public void testParser() { @Test public void testCombinedParser() { - Parser parser = SdmxCsvFields.getDataflowRefParser().orElse(Parser.of(DataflowRef::parse)); + Parser parser = SdmxCsvFields.getDataflowRefParser().orElse(Parser.of(FlowRef::parse)); assertThat(parser.parse("ECB:EXR(1.0)")) - .isEqualTo(DataflowRef.of("ECB", "EXR", "1.0")); + .isEqualTo(FlowRef.of("ECB", "EXR", "1.0")); assertThat(parser.parse("ECB,EXR,1.0")) - .isEqualTo(DataflowRef.of("ECB", "EXR", "1.0")); + .isEqualTo(FlowRef.of("ECB", "EXR", "1.0")); assertThat(parser.parse("EXR")) - .isEqualTo(DataflowRef.of("all", "EXR", "latest")); + .isEqualTo(FlowRef.of("all", "EXR", "latest")); } @Test public void testFormatter() { - Formatter formatter = SdmxCsvFields.getDataflowRefFormatter(); + Formatter formatter = SdmxCsvFields.getDataflowRefFormatter(); - assertThat(formatter.format(DataflowRef.of("ECB", "EXR", "1.0"))) + assertThat(formatter.format(FlowRef.of("ECB", "EXR", "1.0"))) .isEqualTo("ECB:EXR(1.0)"); - assertThat(formatter.format(DataflowRef.of(null, "EXR", null))) + assertThat(formatter.format(FlowRef.of(null, "EXR", null))) .isEqualTo("all:EXR(latest)"); assertThat(formatter.format(null)).isNull(); diff --git a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoFileFormat.java b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoFileFormat.java index cdf529cee..54304fe0a 100644 --- a/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoFileFormat.java +++ b/sdmx-dl-format-kryo/src/main/java/sdmxdl/format/kryo/KryoFileFormat.java @@ -120,15 +120,15 @@ private static Kryo newKryo() { result.register(Feature.class, new DefaultSerializers.EnumSerializer(Feature.class)); result.register(DataRepository.class, new SdmxRepositorySerializer()); - result.register(DataStructure.class, new DataStructureSerializer()); - result.register(DataStructureRef.class, new DataStructureRefSerializer()); - result.register(Dataflow.class, new DataflowSerializer()); - result.register(DataflowRef.class, new DataflowRefSerializer()); + result.register(Structure.class, new DataStructureSerializer()); + result.register(StructureRef.class, new DataStructureRefSerializer()); + result.register(Flow.class, new DataflowSerializer()); + result.register(FlowRef.class, new DataflowRefSerializer()); result.register(Codelist.class, new CodelistSerializer()); result.register(CodelistRef.class, new CodelistRefSerializer()); result.register(Key.class, new KeySerializer()); - result.register(DataQuery.class, new DataQuerySerializer()); - result.register(DataDetail.class, new DefaultSerializers.EnumSerializer(DataDetail.class)); + result.register(Query.class, new DataQuerySerializer()); + result.register(Detail.class, new DefaultSerializers.EnumSerializer(Detail.class)); result.register(DataSet.class, new DataSetSerializer()); result.register(Series.class, new SeriesSerializer()); result.register(Obs.class, new ObsSerializer()); @@ -189,8 +189,8 @@ public T read(Kryo kryo, Input input, Class type) { private static final class SdmxRepositorySerializer extends ImmutableSerializer { - private final Serializer> structures = new CustomCollectionSerializer<>(DataStructure.class); - private final Serializer> flows = new CustomCollectionSerializer<>(Dataflow.class); + private final Serializer> structures = new CustomCollectionSerializer<>(Structure.class); + private final Serializer> flows = new CustomCollectionSerializer<>(Flow.class); private final Serializer> dataSets = new CustomCollectionSerializer<>(DataSet.class); private final Serializer> features = new CustomCollectionSerializer<>(Feature.class); @@ -219,13 +219,13 @@ public DataRepository read(Kryo kryo, Input input, Class { + private static final class DataStructureSerializer extends ImmutableSerializer { private final Serializer> dimensions = new CustomCollectionSerializer<>(Dimension.class); private final Serializer> attributes = new CustomCollectionSerializer<>(Attribute.class); @Override - public void write(Kryo kryo, Output output, DataStructure t) { + public void write(Kryo kryo, Output output, Structure t) { kryo.writeObject(output, t.getRef()); kryo.writeObject(output, t.getDimensions(), dimensions); kryo.writeObject(output, t.getAttributes(), attributes); @@ -236,10 +236,10 @@ public void write(Kryo kryo, Output output, DataStructure t) { @SuppressWarnings("unchecked") @Override - public DataStructure read(Kryo kryo, Input input, Class type) { - return DataStructure + public Structure read(Kryo kryo, Input input, Class type) { + return Structure .builder() - .ref(kryo.readObject(input, DataStructureRef.class)) + .ref(kryo.readObject(input, StructureRef.class)) .dimensions(kryo.readObject(input, ArrayList.class, dimensions)) .attributes(kryo.readObject(input, ArrayList.class, attributes)) .timeDimensionId(input.readString()) @@ -249,18 +249,18 @@ public DataStructure read(Kryo kryo, Input input, Class } } - private static final class DataStructureRefSerializer extends ResourceRefSerializer { + private static final class DataStructureRefSerializer extends ResourceRefSerializer { @Override - protected DataStructureRef read(String input) { - return DataStructureRef.parse(input); + protected StructureRef read(String input) { + return StructureRef.parse(input); } } - private static final class DataflowSerializer extends ImmutableSerializer { + private static final class DataflowSerializer extends ImmutableSerializer { @Override - public void write(Kryo kryo, Output output, Dataflow t) { + public void write(Kryo kryo, Output output, Flow t) { kryo.writeObject(output, t.getRef()); kryo.writeObject(output, t.getStructureRef()); output.writeString(t.getName()); @@ -268,22 +268,22 @@ public void write(Kryo kryo, Output output, Dataflow t) { } @Override - public Dataflow read(Kryo kryo, Input input, Class type) { - return Dataflow + public Flow read(Kryo kryo, Input input, Class type) { + return Flow .builder() - .ref(kryo.readObject(input, DataflowRef.class)) - .structureRef(kryo.readObject(input, DataStructureRef.class)) + .ref(kryo.readObject(input, FlowRef.class)) + .structureRef(kryo.readObject(input, StructureRef.class)) .name(input.readString()) .description(input.readString()) .build(); } } - private static final class DataflowRefSerializer extends ResourceRefSerializer { + private static final class DataflowRefSerializer extends ResourceRefSerializer { @Override - protected DataflowRef read(String input) { - return DataflowRef.parse(input); + protected FlowRef read(String input) { + return FlowRef.parse(input); } } @@ -331,8 +331,8 @@ public void write(Kryo kryo, Output output, DataSet t) { public DataSet read(Kryo kryo, Input input, Class type) { return DataSet .builder() - .ref(kryo.readObject(input, DataflowRef.class)) - .query(kryo.readObject(input, DataQuery.class)) + .ref(kryo.readObject(input, FlowRef.class)) + .query(kryo.readObject(input, Query.class)) .data(kryo.readObject(input, ArrayList.class, data)) .build(); } @@ -351,20 +351,20 @@ public Key read(Kryo kryo, Input input, Class type) { } } - private static final class DataQuerySerializer extends ImmutableSerializer { + private static final class DataQuerySerializer extends ImmutableSerializer { @Override - public void write(Kryo kryo, Output output, DataQuery t) { + public void write(Kryo kryo, Output output, Query t) { kryo.writeObject(output, t.getKey()); kryo.writeObject(output, t.getDetail()); } @Override - public DataQuery read(Kryo kryo, Input input, Class type) { - return DataQuery + public Query read(Kryo kryo, Input input, Class type) { + return Query .builder() .key(kryo.readObject(input, Key.class)) - .detail(kryo.readObject(input, DataDetail.class)) + .detail(kryo.readObject(input, Detail.class)) .build(); } } diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufRepositories.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufRepositories.java index c5f1d1345..4cc99d2df 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufRepositories.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufRepositories.java @@ -1,9 +1,6 @@ package sdmxdl.format.protobuf; -import sdmxdl.CodelistRef; -import sdmxdl.DataflowRef; -import sdmxdl.Key; -import sdmxdl.TimeInterval; +import sdmxdl.*; import static sdmxdl.format.protobuf.WellKnownTypes.*; @@ -34,7 +31,7 @@ public static sdmxdl.DataRepository toDataRepository(DataRepository value) { .build(); } - public static DataStructure fromDataStructure(sdmxdl.DataStructure value) { + public static DataStructure fromDataStructure(Structure value) { DataStructure.Builder result = DataStructure .newBuilder() .setRef(value.getRef().toString()) @@ -49,10 +46,10 @@ public static DataStructure fromDataStructure(sdmxdl.DataStructure value) { .build(); } - public static sdmxdl.DataStructure toDataStructure(DataStructure value) { - return sdmxdl.DataStructure + public static Structure toDataStructure(DataStructure value) { + return Structure .builder() - .ref(sdmxdl.DataStructureRef.parse(value.getRef())) + .ref(StructureRef.parse(value.getRef())) .dimensions(toCollection(value.getDimensionsList(), ProtobufRepositories::toDimension)) .attributes(toCollection(value.getAttributesList(), ProtobufRepositories::toAttribute)) .timeDimensionId(value.hasTimeDimensionId() ? value.getTimeDimensionId() : null) @@ -127,7 +124,7 @@ public static sdmxdl.AttributeRelationship toAttributeRelationship(AttributeRela return sdmxdl.AttributeRelationship.valueOf(value.name()); } - public static Dataflow fromDataflow(sdmxdl.Dataflow value) { + public static Dataflow fromDataflow(Flow value) { Dataflow.Builder result = Dataflow .newBuilder() .setRef(value.getRef().toString()) @@ -139,11 +136,11 @@ public static Dataflow fromDataflow(sdmxdl.Dataflow value) { return result.build(); } - public static sdmxdl.Dataflow toDataflow(Dataflow value) { - return sdmxdl.Dataflow + public static Flow toDataflow(Dataflow value) { + return Flow .builder() - .ref(sdmxdl.DataflowRef.parse(value.getRef())) - .structureRef(sdmxdl.DataStructureRef.parse(value.getStructureRef())) + .ref(FlowRef.parse(value.getRef())) + .structureRef(StructureRef.parse(value.getStructureRef())) .name(value.getName()) .description(value.hasDescription() ? value.getDescription() : null) .build(); @@ -161,13 +158,13 @@ public static DataSet fromDataSet(sdmxdl.DataSet value) { public static sdmxdl.DataSet toDataSet(DataSet value) { return sdmxdl.DataSet .builder() - .ref(DataflowRef.parse(value.getRef())) + .ref(FlowRef.parse(value.getRef())) .query(toDataQuery(value.getQuery())) .data(toCollection(value.getDataList(), ProtobufRepositories::toSeries)) .build(); } - public static DataQuery fromDataQuery(sdmxdl.DataQuery value) { + public static DataQuery fromDataQuery(Query value) { return DataQuery .newBuilder() .setKey(value.getKey().toString()) @@ -175,20 +172,20 @@ public static DataQuery fromDataQuery(sdmxdl.DataQuery value) { .build(); } - public static sdmxdl.DataQuery toDataQuery(DataQuery value) { - return sdmxdl.DataQuery + public static Query toDataQuery(DataQuery value) { + return Query .builder() .key(Key.parse(value.getKey())) .detail(toDataDetail(value.getDetail())) .build(); } - public static DataDetail fromDataDetail(sdmxdl.DataDetail value) { + public static DataDetail fromDataDetail(Detail value) { return DataDetail.valueOf(value.name()); } - public static sdmxdl.DataDetail toDataDetail(DataDetail value) { - return sdmxdl.DataDetail.valueOf(value.name()); + public static Detail toDataDetail(DataDetail value) { + return Detail.valueOf(value.name()); } public static Series fromSeries(sdmxdl.Series value) { diff --git a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java index 6fd026ed4..0eaac5f7f 100644 --- a/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java +++ b/sdmx-dl-format-protobuf/src/main/java/sdmxdl/format/protobuf/ProtobufSources.java @@ -2,11 +2,12 @@ import sdmxdl.format.protobuf.web.SdmxWebSource; +import sdmxdl.web.WebSource; @lombok.experimental.UtilityClass public class ProtobufSources { - public static SdmxWebSource fromWebSource(sdmxdl.web.SdmxWebSource value) { + public static SdmxWebSource fromWebSource(WebSource value) { SdmxWebSource.Builder result = SdmxWebSource.newBuilder(); result.setId(value.getId()); result.putAllNames(value.getNames()); @@ -20,8 +21,8 @@ public static SdmxWebSource fromWebSource(sdmxdl.web.SdmxWebSource value) { return result.build(); } - public static sdmxdl.web.SdmxWebSource toWebSource(SdmxWebSource value) { - return sdmxdl.web.SdmxWebSource + public static WebSource toWebSource(SdmxWebSource value) { + return WebSource .builder() .id(value.getId()) .names(value.getNamesMap()) diff --git a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java index 374698bcc..e6df5fc9f 100644 --- a/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java +++ b/sdmx-dl-format-protobuf/src/test/java/sdmxdl/format/protobuf/ProtobufSourcesTest.java @@ -1,7 +1,7 @@ package sdmxdl.format.protobuf; import org.junit.jupiter.api.Test; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import static org.assertj.core.api.Assertions.assertThat; @@ -9,7 +9,7 @@ public class ProtobufSourcesTest { @Test public void testSources() { - SdmxWebSource min = SdmxWebSource + WebSource min = WebSource .builder() .id("ESTAT") .driver("abc") @@ -19,7 +19,7 @@ public void testSources() { .extracting(ProtobufSources::toWebSource) .isEqualTo(min); - SdmxWebSource max = min + WebSource max = min .toBuilder() .name("en", "hello") .property("key", "value") diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/CustomDataStructureBuilder.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/CustomDataStructureBuilder.java index 6f43f5250..24aab9209 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/CustomDataStructureBuilder.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/CustomDataStructureBuilder.java @@ -34,7 +34,7 @@ public final class CustomDataStructureBuilder { private final LinkedHashMap> dimensions = new LinkedHashMap<>(); private final LinkedHashMap> attributes = new LinkedHashMap<>(); private MediaType fileType = null; - private DataStructureRef ref = null; + private StructureRef ref = null; private String timeDimensionId = null; private String primaryMeasureId = null; @@ -58,11 +58,11 @@ public CustomDataStructureBuilder fileType(@NonNull MediaType fileType) { @NonNull public CustomDataStructureBuilder refId(@NonNull String refId) { - return ref(DataStructureRef.of(null, refId, null)); + return ref(StructureRef.of(null, refId, null)); } @NonNull - public CustomDataStructureBuilder ref(@NonNull DataStructureRef ref) { + public CustomDataStructureBuilder ref(@NonNull StructureRef ref) { this.ref = ref; return this; } @@ -80,8 +80,8 @@ public CustomDataStructureBuilder primaryMeasureId(@Nullable String primaryMeasu } @NonNull - public DataStructure build() { - return DataStructure.builder() + public Structure build() { + return Structure.builder() .ref(ref) .dimensions(guessDimensions()) .name(ref.getId()) diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java index d270e900e..54943a3c2 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow20.java @@ -17,9 +17,9 @@ package internal.sdmxdl.format.xml; import lombok.NonNull; -import sdmxdl.DataStructureRef; -import sdmxdl.Dataflow; -import sdmxdl.DataflowRef; +import sdmxdl.Flow; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.Languages; import javax.xml.stream.XMLStreamException; @@ -59,12 +59,12 @@ public XMLStreamFlow20(Languages languages) { } @NonNull - public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { + public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { if (isNotNamespaceAware(reader)) { throw new XMLStreamException("Cannot parse flows"); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); while (nextTags(reader, "")) { switch (reader.getLocalName()) { case HEADER_TAG: @@ -83,7 +83,7 @@ private void parseHeader(XMLStreamReader reader) throws XMLStreamException { check(Sdmxml.MESSAGE_V20.is(ns), reader, "Invalid namespace '%s'", ns); } - private void parseDataflows(XMLStreamReader reader, List flows) throws XMLStreamException { + private void parseDataflows(XMLStreamReader reader, List flows) throws XMLStreamException { while (nextTags(reader, DATAFLOWS_TAG)) { switch (reader.getLocalName()) { case DATAFLOW_TAG: @@ -94,12 +94,12 @@ private void parseDataflows(XMLStreamReader reader, List flows) throws } @SuppressWarnings("null") - private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException { + private Flow parseDataflow(XMLStreamReader reader) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); check(id != null, reader, "Missing Dataflow id"); - DataflowRef flowRef = DataflowRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); - DataStructureRef structRef = null; + FlowRef flowRef = FlowRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); + StructureRef structRef = null; flowName.clear(); flowDescription.clear(); while (nextTags(reader, DATAFLOW_TAG)) { @@ -118,7 +118,7 @@ private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException check(structRef != null, reader, "Missing DataStructureRef"); - return Dataflow + return Flow .builder() .ref(flowRef) .structureRef(structRef) @@ -127,7 +127,7 @@ private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException .build(); } - private DataStructureRef parseKeyFamilyRef(XMLStreamReader reader) throws XMLStreamException { + private StructureRef parseKeyFamilyRef(XMLStreamReader reader) throws XMLStreamException { String agency = null; String id = null; String version = null; @@ -142,7 +142,7 @@ private DataStructureRef parseKeyFamilyRef(XMLStreamReader reader) throws XMLStr } } check(id != null, reader, "Missing DataStructureRef id"); - return DataStructureRef.of(agency, id, version); + return StructureRef.of(agency, id, version); } private void parseTextWithLangAttr(XMLStreamReader reader, TextBuilder langStack) throws XMLStreamException { diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java index c4b380699..1c8e3725d 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamFlow21.java @@ -17,9 +17,9 @@ package internal.sdmxdl.format.xml; import lombok.NonNull; -import sdmxdl.DataStructureRef; -import sdmxdl.Dataflow; -import sdmxdl.DataflowRef; +import sdmxdl.StructureRef; +import sdmxdl.Flow; +import sdmxdl.FlowRef; import sdmxdl.Languages; import javax.xml.stream.XMLStreamException; @@ -60,12 +60,12 @@ public XMLStreamFlow21(Languages languages) { } @NonNull - public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { + public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { if (isNotNamespaceAware(reader)) { throw new XMLStreamException("Cannot parse flows"); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); while (nextTags(reader, "")) { switch (reader.getLocalName()) { case HEADER_TAG: @@ -84,13 +84,13 @@ private void parseHeader(XMLStreamReader reader) throws XMLStreamException { check(Sdmxml.MESSAGE_V21.is(ns), reader, "Invalid namespace '%s'", ns); } - private void parseStructures(XMLStreamReader reader, List flows) throws XMLStreamException { + private void parseStructures(XMLStreamReader reader, List flows) throws XMLStreamException { if (nextTag(reader, STRUCTURES_TAG, DATAFLOWS_TAG)) { parseDataflows(reader, flows); } } - private void parseDataflows(XMLStreamReader reader, List flows) throws XMLStreamException { + private void parseDataflows(XMLStreamReader reader, List flows) throws XMLStreamException { while (nextTags(reader, DATAFLOWS_TAG)) { switch (reader.getLocalName()) { case DATAFLOW_TAG: @@ -108,12 +108,12 @@ private boolean isExternalReference(XMLStreamReader reader) { } @SuppressWarnings("null") - private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException { + private Flow parseDataflow(XMLStreamReader reader) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); check(id != null, reader, "Missing Dataflow id"); - DataflowRef flowRef = DataflowRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); - DataStructureRef structRef = null; + FlowRef flowRef = FlowRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); + StructureRef structRef = null; flowName.clear(); flowDescription.clear(); while (nextTags(reader, DATAFLOW_TAG)) { @@ -132,7 +132,7 @@ private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException check(structRef != null, reader, "Missing DataStructureRef"); - return Dataflow + return Flow .builder() .ref(flowRef) .structureRef(structRef) @@ -141,18 +141,18 @@ private Dataflow parseDataflow(XMLStreamReader reader) throws XMLStreamException .build(); } - private DataStructureRef parseStructure(XMLStreamReader reader) throws XMLStreamException { + private StructureRef parseStructure(XMLStreamReader reader) throws XMLStreamException { if (nextTag(reader, STRUCTURE_TAG, REF_TAG)) { return parseRef(reader); } throw new XMLStreamException("Missing DataStructureRef"); } - private DataStructureRef parseRef(XMLStreamReader reader) throws XMLStreamException { + private StructureRef parseRef(XMLStreamReader reader) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); check(id != null, reader, "Missing DataStructureRef id"); - return DataStructureRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); + return StructureRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR)); } private void parseTextWithLangAttr(XMLStreamReader reader, TextBuilder langStack) throws XMLStreamException { diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java index 0d68baef2..fd15f9e47 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure20.java @@ -65,12 +65,12 @@ public XMLStreamStructure20(Languages languages) { } @NonNull - public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { + public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { if (XMLStreamUtil.isNotNamespaceAware(reader)) { throw new XMLStreamException("Cannot parse structure"); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); DsdContext context = new DsdContext(); while (XMLStreamUtil.nextTags(reader, "")) { switch (reader.getLocalName()) { @@ -146,22 +146,22 @@ private void parseConcept(XMLStreamReader reader, Map concepts) concepts.put(id, label.build(id)); } - private void parseDataStructures(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { + private void parseDataStructures(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { while (XMLStreamUtil.nextTag(reader, KEY_FAMILIES_TAG, KEY_FAMILY_TAG)) { parseDataStructure(reader, result, context); } } - private void parseDataStructure(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { + private void parseDataStructure(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing DataStrucure id"); String optionalAgency = reader.getAttributeValue(null, AGENCY_ID_ATTR); String optionalVersion = reader.getAttributeValue(null, VERSION_ATTR); - DataStructure.Builder ds = DataStructure + Structure.Builder ds = Structure .builder() - .ref(DataStructureRef.of(optionalAgency, id, optionalVersion)) + .ref(StructureRef.of(optionalAgency, id, optionalVersion)) .primaryMeasureId(""); structureLabel.clear(); while (XMLStreamUtil.nextTags(reader, KEY_FAMILY_TAG)) { @@ -178,7 +178,7 @@ private void parseDataStructure(XMLStreamReader reader, List resu result.add(ds.build()); } - private void parseDataStructureComponents(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseDataStructureComponents(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { int position = 1; while (XMLStreamUtil.nextTags(reader, COMPONENTS_TAG)) { switch (reader.getLocalName()) { @@ -215,20 +215,20 @@ private void parseComponent(XMLStreamReader reader, Component.Builder compone component.codelist(context.getCodelist(ref)); } - private void parseDimension(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context, int position) throws XMLStreamException { + private void parseDimension(XMLStreamReader reader, Structure.Builder ds, DsdContext context, int position) throws XMLStreamException { Dimension.Builder result = Dimension.builder(); parseComponent(reader, result, context); ds.dimension(result.position(position).build()); } - private void parseTimeDimension(XMLStreamReader reader, DataStructure.Builder ds) throws XMLStreamException { + private void parseTimeDimension(XMLStreamReader reader, Structure.Builder ds) throws XMLStreamException { String id = reader.getAttributeValue(null, CONCEPT_REF_ATTR); XMLStreamUtil.check(id != null, reader, "Missing TimeDimension id"); ds.timeDimensionId(id); } - private void parsePrimaryMeasure(XMLStreamReader reader, DataStructure.Builder ds) throws XMLStreamException { + private void parsePrimaryMeasure(XMLStreamReader reader, Structure.Builder ds) throws XMLStreamException { String id = reader.getAttributeValue(null, CONCEPT_REF_ATTR); XMLStreamUtil.check(id != null, reader, "Missing PrimaryMeasure id"); @@ -242,7 +242,7 @@ private void parseNameTag(XMLStreamReader reader, TextBuilder langStack) throws } } - private void parseAttribute(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseAttribute(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { Attribute.Builder result = Attribute.builder(); parseComponent(reader, result, context); result.relationship(getAttributeRelationship(reader.getAttributeValue(null, ATTACHMENT_LEVEL_ATTR))); diff --git a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java index 7661e5210..ac47ae914 100644 --- a/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java +++ b/sdmx-dl-format-xml/src/main/java/internal/sdmxdl/format/xml/XMLStreamStructure21.java @@ -70,12 +70,12 @@ public XMLStreamStructure21(Languages languages) { } @NonNull - public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { + public List parse(@NonNull XMLStreamReader reader) throws XMLStreamException { if (XMLStreamUtil.isNotNamespaceAware(reader)) { throw new XMLStreamException("Cannot parse structure"); } - List result = new ArrayList<>(); + List result = new ArrayList<>(); while (XMLStreamUtil.nextTags(reader, "")) { switch (reader.getLocalName()) { case HEADER_TAG: @@ -94,7 +94,7 @@ private void parseHeader(XMLStreamReader reader) throws XMLStreamException { XMLStreamUtil.check(Sdmxml.MESSAGE_V21.is(ns), reader, "Invalid namespace '%s'", ns); } - private void parseStructures(XMLStreamReader reader, List structs) throws XMLStreamException { + private void parseStructures(XMLStreamReader reader, List structs) throws XMLStreamException { DsdContext context = new DsdContext(); while (XMLStreamUtil.nextTags(reader, STRUCTURES_TAG)) { switch (reader.getLocalName()) { @@ -161,18 +161,18 @@ private void parseConcept(XMLStreamReader reader, Map concepts) concepts.put(id, label.build(id)); } - private void parseDataStructures(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { + private void parseDataStructures(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { while (XMLStreamUtil.nextTag(reader, DATA_STUCTURES_TAG, DATA_STUCTURE_TAG)) { parseDataStructure(reader, result, context); } } - private void parseDataStructure(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { + private void parseDataStructure(XMLStreamReader reader, List result, DsdContext context) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing DataStrucure id"); - DataStructure.Builder ds = DataStructure.builder(); - ds.ref(DataStructureRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR))); + Structure.Builder ds = Structure.builder(); + ds.ref(StructureRef.of(reader.getAttributeValue(null, AGENCY_ID_ATTR), id, reader.getAttributeValue(null, VERSION_ATTR))); structureLabel.clear(); while (XMLStreamUtil.nextTags(reader, DATA_STUCTURE_TAG)) { switch (reader.getLocalName()) { @@ -188,7 +188,7 @@ private void parseDataStructure(XMLStreamReader reader, List resu result.add(ds.build()); } - private void parseDataStructureComponents(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseDataStructureComponents(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { while (XMLStreamUtil.nextTags(reader, DATA_STUCTURE_COMPONENTS_TAG)) { switch (reader.getLocalName()) { case DIMENSION_LIST_TAG: @@ -204,7 +204,7 @@ private void parseDataStructureComponents(XMLStreamReader reader, DataStructure. } } - private void parseDimensionList(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseDimensionList(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { while (XMLStreamUtil.nextTags(reader, DIMENSION_LIST_TAG)) { switch (reader.getLocalName()) { case DIMENSION_TAG: @@ -217,7 +217,7 @@ private void parseDimensionList(XMLStreamReader reader, DataStructure.Builder ds } } - private void parseDimension(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseDimension(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing Dimension id"); @@ -263,14 +263,14 @@ private void parseLocalRepresentation(XMLStreamReader reader, Component.Builder< } } - private void parseTimeDimension(XMLStreamReader reader, DataStructure.Builder ds) throws XMLStreamException { + private void parseTimeDimension(XMLStreamReader reader, Structure.Builder ds) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing TimeDimension id"); ds.timeDimensionId(id); } - private void parseMeasureList(XMLStreamReader reader, DataStructure.Builder ds) throws XMLStreamException { + private void parseMeasureList(XMLStreamReader reader, Structure.Builder ds) throws XMLStreamException { if (XMLStreamUtil.nextTag(reader, MEASURE_LIST_TAG, PRIMARY_MEASURE_TAG)) { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing PrimaryMeasure id"); @@ -286,7 +286,7 @@ private void parseNameTag(XMLStreamReader reader, TextBuilder langStack) throws } } - private void parseAttributeList(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseAttributeList(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { while (XMLStreamUtil.nextTags(reader, ATTRIBUTE_LIST_TAG)) { switch (reader.getLocalName()) { case ATTRIBUTE_TAG: @@ -296,7 +296,7 @@ private void parseAttributeList(XMLStreamReader reader, DataStructure.Builder ds } } - private void parseAttribute(XMLStreamReader reader, DataStructure.Builder ds, DsdContext context) throws XMLStreamException { + private void parseAttribute(XMLStreamReader reader, Structure.Builder ds, DsdContext context) throws XMLStreamException { String id = reader.getAttributeValue(null, ID_ATTR); XMLStreamUtil.check(id != null, reader, "Missing Attribute id"); diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/DataStructureDecoder.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/DataStructureDecoder.java index 9cbf71b97..5b09ce2e9 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/DataStructureDecoder.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/DataStructureDecoder.java @@ -20,7 +20,7 @@ import internal.sdmxdl.format.xml.ImmutableXMLInputFactory; import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.format.SeriesMetaUtil; import javax.xml.stream.XMLStreamException; @@ -35,29 +35,29 @@ @SuppressWarnings("SwitchStatementWithTooFewBranches") public final class DataStructureDecoder { - public static Xml.Parser generic20() { - return Stax.StreamParser.builder() + public static Xml.Parser generic20() { + return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler(Stax.FlowHandler.of(DataStructureDecoder::generic20)) .build(); } - public static Xml.Parser compact20() { - return Stax.StreamParser.builder() + public static Xml.Parser compact20() { + return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler(Stax.FlowHandler.of(DataStructureDecoder::compact20)) .build(); } - public static Xml.Parser generic21() { - return Stax.StreamParser.builder() + public static Xml.Parser generic21() { + return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler(Stax.FlowHandler.of(DataStructureDecoder::generic21)) .build(); } - public static Xml.Parser compact21() { - return Stax.StreamParser.builder() + public static Xml.Parser compact21() { + return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler(Stax.FlowHandler.of(DataStructureDecoder::compact21)) .build(); @@ -68,7 +68,7 @@ private static boolean isTagMatch(XMLStreamReader r, String tag) { } // - private static DataStructure generic20(XMLStreamReader reader) throws XMLStreamException { + private static Structure generic20(XMLStreamReader reader) throws XMLStreamException { CustomDataStructureBuilder builder = new CustomDataStructureBuilder().fileType(XmlMediaTypes.GENERIC_DATA_20); while (reader.hasNext()) { switch (reader.next()) { @@ -156,7 +156,7 @@ private static void generic20Attributes(XMLStreamReader reader, CustomDataStruct // // - private static DataStructure compact20(XMLStreamReader reader) throws XMLStreamException { + private static Structure compact20(XMLStreamReader reader) throws XMLStreamException { CustomDataStructureBuilder builder = new CustomDataStructureBuilder().fileType(XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_20); builder.refId("UNKNOWN"); // FIXME: find a way to parse/guess this information while (reader.hasNext()) { @@ -197,7 +197,7 @@ private static void compact20DataSet(XMLStreamReader reader, CustomDataStructure // // - private static DataStructure generic21(XMLStreamReader reader) throws XMLStreamException { + private static Structure generic21(XMLStreamReader reader) throws XMLStreamException { CustomDataStructureBuilder builder = new CustomDataStructureBuilder().fileType(XmlMediaTypes.GENERIC_DATA_21); while (reader.hasNext()) { switch (reader.next()) { @@ -284,7 +284,7 @@ private static void generic21Attributes(XMLStreamReader reader, CustomDataStruct // // - private static DataStructure compact21(XMLStreamReader reader) throws XMLStreamException { + private static Structure compact21(XMLStreamReader reader) throws XMLStreamException { CustomDataStructureBuilder builder = new CustomDataStructureBuilder().fileType(XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_21); while (reader.hasNext()) { switch (reader.next()) { diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java index 12840aae1..cd7001da9 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/SdmxXmlStreams.java @@ -35,57 +35,57 @@ @lombok.experimental.UtilityClass public class SdmxXmlStreams { - public Xml.@NonNull Parser compactData20(@NonNull DataStructure dsd, @NonNull Supplier df) { + public Xml.@NonNull Parser compactData20(@NonNull Structure dsd, @NonNull Supplier df) { return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler((o, onClose) -> new XMLStreamCompactDataCursor(o, onClose, Key.builder(dsd), df.get(), dsd.getTimeDimensionId(), dsd.getPrimaryMeasureId())) .build(); } - public Xml.@NonNull Parser compactData21(@NonNull DataStructure dsd, @NonNull Supplier df) { + public Xml.@NonNull Parser compactData21(@NonNull Structure dsd, @NonNull Supplier df) { return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler((o, onClose) -> new XMLStreamCompactDataCursor(o, onClose, Key.builder(dsd), df.get(), dsd.getTimeDimensionId(), dsd.getPrimaryMeasureId())) .build(); } - public Xml.@NonNull Parser genericData20(@NonNull DataStructure dsd, @NonNull Supplier df) { + public Xml.@NonNull Parser genericData20(@NonNull Structure dsd, @NonNull Supplier df) { return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler((o, onClose) -> XMLStreamGenericDataCursor.sdmx20(o, onClose, Key.builder(dsd), df.get())) .build(); } - public Xml.@NonNull Parser genericData21(@NonNull DataStructure dsd, @NonNull Supplier df) { + public Xml.@NonNull Parser genericData21(@NonNull Structure dsd, @NonNull Supplier df) { return Stax.StreamParser.builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .handler((o, onClose) -> XMLStreamGenericDataCursor.sdmx21(o, onClose, Key.builder(dsd), df.get())) .build(); } - public Xml.@NonNull Parser> struct20(@NonNull Languages langs) { - return Stax.StreamParser.>builder() + public Xml.@NonNull Parser> struct20(@NonNull Languages langs) { + return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamStructure20(langs)::parse)) .build(); } - public Xml.@NonNull Parser> struct21(@NonNull Languages langs) { - return Stax.StreamParser.>builder() + public Xml.@NonNull Parser> struct21(@NonNull Languages langs) { + return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamStructure21(langs)::parse)) .build(); } - public Xml.@NonNull Parser> flow20(@NonNull Languages langs) { - return Stax.StreamParser.>builder() + public Xml.@NonNull Parser> flow20(@NonNull Languages langs) { + return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamFlow20(langs)::parse)) .build(); } - public Xml.@NonNull Parser> flow21(@NonNull Languages langs) { - return Stax.StreamParser.>builder() + public Xml.@NonNull Parser> flow21(@NonNull Languages langs) { + return Stax.StreamParser.>builder() .factory(ImmutableXMLInputFactory::getDefaultInputFactory) .handler(Stax.FlowHandler.of(new XMLStreamFlow21(langs)::parse)) .build(); diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java index d0f178e4d..b77c1e1c7 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlFileSource.java @@ -3,7 +3,7 @@ import internal.sdmxdl.format.xml.ImmutableXMLInputFactory; import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; @@ -15,23 +15,23 @@ @lombok.experimental.UtilityClass public class XmlFileSource { - public Xml.Parser getParser() { + public Xml.Parser getParser() { return PARSER; } - public Xml.Formatter getFormatter() { + public Xml.Formatter getFormatter() { return FORMATTER; } private static final XMLOutputFactory OUTPUT = XMLOutputFactory.newInstance(); - private final Xml.Formatter FORMATTER = Stax.StreamFormatter - .builder() + private final Xml.Formatter FORMATTER = Stax.StreamFormatter + .builder() .factory(() -> OUTPUT) .handler2(XmlFileSource::formatXml) .build(); - private void formatXml(SdmxFileSource source, XMLStreamWriter xml, Charset encoding) throws XMLStreamException { + private void formatXml(FileSource source, XMLStreamWriter xml, Charset encoding) throws XMLStreamException { xml.writeStartDocument(encoding.name(), "1.0"); xml.writeEmptyElement(ROOT_TAG); @@ -45,13 +45,13 @@ private void formatXml(SdmxFileSource source, XMLStreamWriter xml, Charset encod xml.writeEndDocument(); } - private final Xml.Parser PARSER = Stax.StreamParser - .builder() + private final Xml.Parser PARSER = Stax.StreamParser + .builder() .factory(ImmutableXMLInputFactory::getInputFactoryWithoutNamespace) .value(XmlFileSource::parseXml) .build(); - private static SdmxFileSource parseXml(XMLStreamReader xml) throws XMLStreamException { + private static FileSource parseXml(XMLStreamReader xml) throws XMLStreamException { String data = null; String structure = null; @@ -66,7 +66,7 @@ private static SdmxFileSource parseXml(XMLStreamReader xml) throws XMLStreamExce throw new XMLStreamException("Missing data attribute"); } - return SdmxFileSource.builder() + return FileSource.builder() .data(new File(data)) .structure(!isNullOrEmpty(structure) ? new File(structure) : null) .build(); diff --git a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java index 94bd69923..cbc374db5 100644 --- a/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java +++ b/sdmx-dl-format-xml/src/main/java/sdmxdl/format/xml/XmlWebSource.java @@ -18,7 +18,7 @@ import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; @@ -36,16 +36,16 @@ @lombok.experimental.UtilityClass public final class XmlWebSource { - public static Xml.Parser> getParser() { + public static Xml.Parser> getParser() { return PARSER; } - public static Xml.Formatter> getFormatter() { + public static Xml.Formatter> getFormatter() { return FORMATTER; } - private static final Xml.Parser> PARSER = Stax.StreamParser.valueOf(XmlWebSource::parseXml); - private static final Xml.Formatter> FORMATTER = Stax.StreamFormatter.of(XmlWebSource::formatXml); + private static final Xml.Parser> PARSER = Stax.StreamParser.valueOf(XmlWebSource::parseXml); + private static final Xml.Formatter> FORMATTER = Stax.StreamFormatter.of(XmlWebSource::formatXml); private static final String SOURCES_TAG = "sources"; private static final String SOURCE_TAG = "source"; @@ -63,15 +63,15 @@ public static Xml.Formatter> getFormatter() { private static final String MONITOR_WEBSITE_TAG = "monitorWebsite"; private static final String ROOT_LANGUAGE = Locale.ROOT.getLanguage(); - private static List parseXml(XMLStreamReader reader) throws XMLStreamException { - List result = new ArrayList<>(); - SdmxWebSource.Builder item = SdmxWebSource.builder(); + private static List parseXml(XMLStreamReader reader) throws XMLStreamException { + List result = new ArrayList<>(); + WebSource.Builder item = WebSource.builder(); while (reader.hasNext()) { switch (reader.next()) { case XMLStreamReader.START_ELEMENT: switch (reader.getLocalName()) { case SOURCE_TAG: - item = SdmxWebSource.builder(); + item = WebSource.builder(); break; case NAME_TAG: item.id(reader.getElementText()); @@ -115,10 +115,10 @@ private static List parseXml(XMLStreamReader reader) throws XMLSt return result; } - private static void formatXml(List list, XMLStreamWriter writer, Charset encoding) throws XMLStreamException { + private static void formatXml(List list, XMLStreamWriter writer, Charset encoding) throws XMLStreamException { writer.writeStartDocument(encoding.name(), "1.0"); writer.writeStartElement(SOURCES_TAG); - for (SdmxWebSource source : list) { + for (WebSource source : list) { writer.writeStartElement(SOURCE_TAG); writeTextElement(writer, NAME_TAG, source.getId()); for (Map.Entry description : source.getNames().entrySet()) { diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java index df406ea52..408b57fd2 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamCompactDataCursorTest.java @@ -18,7 +18,7 @@ import nbbrd.io.Resource; import org.junit.jupiter.api.Test; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.Key; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; @@ -53,7 +53,7 @@ public void testCompactData20() throws Exception { } catch (XMLStreamException e) { throw new IOException(e); } - }, Key.ALL, DataDetail.FULL); + }, Key.ALL, Detail.FULL); ObsParser obsParser = ObsParser.newDefault(); try (InputStream stream = xml.openStream(); @@ -102,7 +102,7 @@ public void testCompactData21() throws Exception { } catch (XMLStreamException e) { throw new IOException(e); } - }, Key.ALL, DataDetail.FULL); + }, Key.ALL, Detail.FULL); ObsParser obsParser = ObsParser.newDefault(); try (InputStream stream = xml.openStream(); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java index c2b49965d..a5285ab5b 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow20Test.java @@ -19,9 +19,9 @@ import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.DataStructureRef; -import sdmxdl.Dataflow; -import sdmxdl.DataflowRef; +import sdmxdl.Flow; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.Languages; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -37,20 +37,20 @@ public class XMLStreamFlow20Test { @Test public void test() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow20(Languages.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow20(Languages.ANY)::parse); assertThat(p.parseReader(SdmxXmlSources.OTHER_FLOWS20::openReader)) .containsExactly( - Dataflow + Flow .builder() - .ref(DataflowRef.of("IMF", "DS-BOP_2017M06", "1.0")) - .structureRef(DataStructureRef.of("IMF", "BOP_2017M06", null)) + .ref(FlowRef.of("IMF", "DS-BOP_2017M06", "1.0")) + .structureRef(StructureRef.of("IMF", "BOP_2017M06", null)) .name("Balance of Payments (BOP), 2017 M06") .build(), - Dataflow + Flow .builder() - .ref(DataflowRef.of("IMF", "DS-BOP_2020M3", "1.0")) - .structureRef(DataStructureRef.of("IMF", "BOP_2020M3", null)) + .ref(FlowRef.of("IMF", "DS-BOP_2020M3", "1.0")) + .structureRef(StructureRef.of("IMF", "BOP_2020M3", null)) .name("Balance of Payments (BOP), 2020 M03") .build() ); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java index 72de6631d..a96291525 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamFlow21Test.java @@ -19,9 +19,9 @@ import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.DataStructureRef; -import sdmxdl.Dataflow; -import sdmxdl.DataflowRef; +import sdmxdl.Flow; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.Languages; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -37,26 +37,26 @@ public class XMLStreamFlow21Test { @Test public void test() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); assertThat(p.parseReader(SdmxXmlSources.ECB_DATAFLOWS::openReader)) .containsExactly( - Dataflow + Flow .builder() - .ref(DataflowRef.of("ECB", "AME", "1.0")) - .structureRef(DataStructureRef.of("ECB", "ECB_AME1", "1.0")) + .ref(FlowRef.of("ECB", "AME", "1.0")) + .structureRef(StructureRef.of("ECB", "ECB_AME1", "1.0")) .name("AMECO") .build(), - Dataflow + Flow .builder() - .ref(DataflowRef.of("ECB", "BKN", "1.0")) - .structureRef(DataStructureRef.of("ECB", "ECB_BKN1", "1.0")) + .ref(FlowRef.of("ECB", "BKN", "1.0")) + .structureRef(StructureRef.of("ECB", "ECB_BKN1", "1.0")) .name("Banknotes statistics") .build(), - Dataflow + Flow .builder() - .ref(DataflowRef.of("ECB", "BLS", "1.0")) - .structureRef(DataStructureRef.of("ECB", "ECB_BLS1", "1.0")) + .ref(FlowRef.of("ECB", "BLS", "1.0")) + .structureRef(StructureRef.of("ECB", "ECB_BLS1", "1.0")) .name("Bank Lending Survey Statistics") .build() ); @@ -64,21 +64,21 @@ public void test() throws IOException { @Test public void testDescription() throws IOException { - Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); + Xml.Parser> p = Stax.StreamParser.valueOf(new XMLStreamFlow21(Languages.ANY)::parse); assertThat(p.parseResource(XMLStreamMessageFooter21Test.class, "FlowWithDescription.xml")) .containsExactly( - Dataflow + Flow .builder() - .ref(DataflowRef.of("CD2030", "CD2030", "1.0")) - .structureRef(DataStructureRef.of("CD2030", "CD2030", "1.0")) + .ref(FlowRef.of("CD2030", "CD2030", "1.0")) + .structureRef(StructureRef.of("CD2030", "CD2030", "1.0")) .name("Coundown 2030") .description("This dataset is used to support the downolad of the CD2030 data") .build(), - Dataflow + Flow .builder() - .ref(DataflowRef.of("EAPRO", "DF_EAPRO_CROSS_SECTOR", "1.0")) - .structureRef(DataStructureRef.of("EAPRO", "DSD_EAPRO", "1.0")) + .ref(FlowRef.of("EAPRO", "DF_EAPRO_CROSS_SECTOR", "1.0")) + .structureRef(StructureRef.of("EAPRO", "DSD_EAPRO", "1.0")) .name("EAPRO Cross Sector Indicators") .description("A dataflow based on a subset of the global cross-sector indicators.") .build() diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamGenericDataCursorTest.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamGenericDataCursorTest.java index 1e289cb7e..bd24e38fd 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamGenericDataCursorTest.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamGenericDataCursorTest.java @@ -17,7 +17,7 @@ package internal.sdmxdl.format.xml; import org.junit.jupiter.api.Test; -import sdmxdl.DataDetail; +import sdmxdl.Detail; import sdmxdl.Key; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; @@ -52,7 +52,7 @@ public void testGenericData20() throws Exception { } catch (XMLStreamException e) { throw new IOException(e); } - }, Key.ALL, DataDetail.FULL); + }, Key.ALL, Detail.FULL); ObsParser obsParser = ObsParser.newDefault(); try (InputStream stream = xml.openStream(); @@ -105,7 +105,7 @@ public void testGenericData21() throws Exception { } catch (XMLStreamException e) { throw new IOException(e); } - }, Key.ALL, DataDetail.FULL); + }, Key.ALL, Detail.FULL); ObsParser obsParser = ObsParser.newDefault(); try (InputStream stream = xml.openStream(); @@ -150,7 +150,7 @@ public void testGenericData21Bis() throws Exception { } catch (XMLStreamException e) { throw new IOException(e); } - }, Key.ALL, DataDetail.FULL); + }, Key.ALL, Detail.FULL); ObsParser obsParser = ObsParser.newDefault(); try (InputStream stream = xml.openStream(); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java index 7f78e9575..acf1a6b91 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure20Test.java @@ -37,13 +37,13 @@ public class XMLStreamStructure20Test { @Test @SuppressWarnings("null") public void test() throws Exception { - Xml.Parser> p1 = SdmxXmlStreams.struct20(Languages.ANY); + Xml.Parser> p1 = SdmxXmlStreams.struct20(Languages.ANY); assertThat(p1.parseReader(SdmxXmlSources.NBB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("My first dataset"); assertThat(o.getPrimaryMeasureId()).isEqualTo("OBS_VALUE"); assertThat(o.getTimeDimensionId()).isEqualTo("TIME"); - assertThat(o.getRef()).isEqualTo(DataStructureRef.of("NBB", "TEST_DATASET", null)); + assertThat(o.getRef()).isEqualTo(StructureRef.of("NBB", "TEST_DATASET", null)); assertThat(o.getDimensions()).hasSize(3).element(0).satisfies(x -> { assertThat(x.getId()).isEqualTo("SUBJECT"); assertThat(x.getName()).isEqualTo("Subject"); @@ -66,13 +66,13 @@ public void test() throws Exception { }); }); - Xml.Parser> p2 = SdmxXmlStreams.struct20(Languages.parse("fr")); + Xml.Parser> p2 = SdmxXmlStreams.struct20(Languages.parse("fr")); assertThat(p2.parseReader(SdmxXmlSources.NBB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("Mon premier dataset"); assertThat(o.getPrimaryMeasureId()).isEqualTo("OBS_VALUE"); assertThat(o.getTimeDimensionId()).isEqualTo("TIME"); - assertThat(o.getRef()).isEqualTo(DataStructureRef.of("NBB", "TEST_DATASET", null)); + assertThat(o.getRef()).isEqualTo(StructureRef.of("NBB", "TEST_DATASET", null)); assertThat(o.getDimensions()).hasSize(3).element(0).satisfies(x -> { assertThat(x.getId()).isEqualTo("SUBJECT"); assertThat(x.getName()).isEqualTo("Sujet"); diff --git a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java index 455062266..9096961da 100644 --- a/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java +++ b/sdmx-dl-format-xml/src/test/java/internal/sdmxdl/format/xml/XMLStreamStructure21Test.java @@ -37,13 +37,13 @@ public class XMLStreamStructure21Test { @Test @SuppressWarnings("null") public void test() throws Exception { - Xml.Parser> parser = SdmxXmlStreams.struct21(Languages.ANY); + Xml.Parser> parser = SdmxXmlStreams.struct21(Languages.ANY); assertThat(parser.parseReader(SdmxXmlSources.ECB_DATA_STRUCTURE::openReader)).singleElement().satisfies(o -> { assertThat(o.getName()).isEqualTo("AMECO"); assertThat(o.getPrimaryMeasureId()).isEqualTo("OBS_VALUE"); assertThat(o.getTimeDimensionId()).isEqualTo("TIME_PERIOD"); - assertThat(o.getRef()).isEqualTo(DataStructureRef.of("ECB", "ECB_AME1", "1.0")); + assertThat(o.getRef()).isEqualTo(StructureRef.of("ECB", "ECB_AME1", "1.0")); assertThat(o.getDimensions()).hasSize(7).element(0).satisfies(x -> { assertThat(x.getId()).isEqualTo("FREQ"); assertThat(x.getName()).isEqualTo("Frequency"); diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/DataStructureDecoderTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/StructureDecoderTest.java similarity index 86% rename from sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/DataStructureDecoderTest.java rename to sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/StructureDecoderTest.java index c1cb5f5fb..b779c2669 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/DataStructureDecoderTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/StructureDecoderTest.java @@ -17,8 +17,8 @@ package sdmxdl.format.xml; import org.junit.jupiter.api.Test; -import sdmxdl.DataStructure; -import sdmxdl.DataStructureRef; +import sdmxdl.Structure; +import sdmxdl.StructureRef; import tests.sdmxdl.format.xml.SdmxXmlSources; import java.io.IOException; @@ -29,12 +29,12 @@ /** * @author Philippe Charles */ -public class DataStructureDecoderTest { +public class StructureDecoderTest { @Test public void testDecodeGeneric20() throws IOException { - DataStructure ds = DataStructure.builder() - .ref(DataStructureRef.of(null, "BIS_JOINT_DEBT", null)) + Structure ds = Structure.builder() + .ref(StructureRef.of(null, "BIS_JOINT_DEBT", null)) .dimension(dimension("FREQ", 1, "A", "M")) .dimension(dimension("JD_TYPE", 2, "P")) .dimension(dimension("JD_CATEGORY", 3, "A")) @@ -49,8 +49,8 @@ public void testDecodeGeneric20() throws IOException { @Test public void testDecodeCompact20() throws IOException { - DataStructure ds = DataStructure.builder() - .ref(DataStructureRef.of(null, "UNKNOWN", null)) + Structure ds = Structure.builder() + .ref(StructureRef.of(null, "UNKNOWN", null)) .dimension(dimension("FREQ", 1, "A", "M")) .dimension(dimension("COLLECTION", 2, "B")) .dimension(dimension("VIS_CTY", 3, "MX")) @@ -66,8 +66,8 @@ public void testDecodeCompact20() throws IOException { @Test public void testDecodeGeneric21() throws IOException { - DataStructure ds = DataStructure.builder() - .ref(DataStructureRef.of(null, "ECB_AME1", null)) + Structure ds = Structure.builder() + .ref(StructureRef.of(null, "ECB_AME1", null)) .dimension(dimension("FREQ", 1, "A")) .dimension(dimension("AME_REF_AREA", 2, "BEL")) .dimension(dimension("AME_TRANSFORMATION", 3, "1")) @@ -85,8 +85,8 @@ public void testDecodeGeneric21() throws IOException { @Test public void testDecodeCompact21() throws IOException { - DataStructure ds = DataStructure.builder() - .ref(DataStructureRef.of(null, "ECB_AME1", null)) + Structure ds = Structure.builder() + .ref(StructureRef.of(null, "ECB_AME1", null)) .dimension(dimension("FREQ", 1, "A")) .dimension(dimension("AME_REF_AREA", 2, "BEL")) .dimension(dimension("AME_TRANSFORMATION", 3, "1")) diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java index 750ea7396..0e964f04b 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlFileSourceTest.java @@ -18,7 +18,7 @@ import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import java.io.File; import java.io.IOException; @@ -32,19 +32,19 @@ public class XmlFileSourceTest { @Test public void testFormatter() throws IOException { - Xml.Formatter x = XmlFileSource.getFormatter(); + Xml.Formatter x = XmlFileSource.getFormatter(); - assertThat(x.formatToString(SdmxFileSource.builder().data(data).structure(structure).build())) + assertThat(x.formatToString(FileSource.builder().data(data).structure(structure).build())) .isEqualTo(""); - assertThat(x.formatToString(SdmxFileSource.builder().data(data).build())) + assertThat(x.formatToString(FileSource.builder().data(data).build())) .isEqualTo(""); } @Test @SuppressWarnings("null") public void testParser() throws IOException { - Xml.Parser x = XmlFileSource.getParser(); + Xml.Parser x = XmlFileSource.getParser(); assertThatNullPointerException().isThrownBy(() -> x.parseChars(null)); assertThatIOException().isThrownBy(() -> x.parseChars("")); diff --git a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java index 09b2db7f3..5df2ba4ab 100644 --- a/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java +++ b/sdmx-dl-format-xml/src/test/java/sdmxdl/format/xml/XmlWebSourceTest.java @@ -18,7 +18,7 @@ import org.assertj.core.util.xml.XmlStringPrettyFormatter; import org.junit.jupiter.api.Test; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.Arrays; @@ -31,8 +31,8 @@ */ public class XmlWebSourceTest { - private final List sample = Arrays.asList( - SdmxWebSource + private final List sample = Arrays.asList( + WebSource .builder() .id("ECB") .name("en", "European Central Bank") @@ -44,7 +44,7 @@ public class XmlWebSourceTest { .monitorOf("ABC:xyz") .monitorWebsiteOf("https://someaddress") .build(), - SdmxWebSource + WebSource .builder() .id("other") .name("en", "some description") diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java index 8df76780e..dd23dbfea 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/GrpcWebFactory.java @@ -2,7 +2,7 @@ import sdmxdl.provider.ri.drivers.SourceProperties; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.util.Collections; @@ -18,7 +18,7 @@ public static SdmxWebManager loadManager() { .build(); } - private static List getCustomSources() { + private static List getCustomSources() { try { return SourceProperties.loadCustomSources(); } catch (IOException e) { diff --git a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java index 3e5478525..513d609d3 100644 --- a/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java +++ b/sdmx-dl-grpc/src/main/java/sdmxdl/grpc/SdmxWebManagerService.java @@ -3,11 +3,12 @@ import io.quarkus.grpc.GrpcService; import io.smallrye.mutiny.Multi; import io.smallrye.mutiny.Uni; -import sdmxdl.Connection; -import sdmxdl.DataflowRef; -import sdmxdl.Key; -import sdmxdl.Languages; +import sdmxdl.*; import sdmxdl.format.protobuf.*; +import sdmxdl.format.protobuf.DataSet; +import sdmxdl.format.protobuf.DataStructure; +import sdmxdl.format.protobuf.Dataflow; +import sdmxdl.format.protobuf.Series; import sdmxdl.format.protobuf.web.MonitorReport; import sdmxdl.format.protobuf.web.SdmxWebSource; import sdmxdl.web.SdmxWebManager; @@ -35,7 +36,7 @@ public Uni getMonitorReport(SourceRequest request) { public Uni getFlow(FlowRequest request) { try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Uni.createFrom() - .item(connection.getFlow(DataflowRef.parse(request.getFlow()))) + .item(connection.getFlow(FlowRef.parse(request.getFlow()))) .map(ProtobufRepositories::fromDataflow); } catch (IOException ex) { return Uni.createFrom().failure(ex); @@ -46,7 +47,7 @@ public Uni getFlow(FlowRequest request) { public Uni getStructure(FlowRequest request) { try (Connection connection = manager.getConnection(request.getSource(), languages)) { return Uni.createFrom() - .item(connection.getStructure(DataflowRef.parse(request.getFlow()))) + .item(connection.getStructure(FlowRef.parse(request.getFlow()))) .map(ProtobufRepositories::fromDataStructure); } catch (IOException ex) { return Uni.createFrom().failure(ex); @@ -94,15 +95,15 @@ public Multi getDataStream(KeyRequest request) { } } - private DataflowRef getFlowRef(KeyRequest request) { - return DataflowRef.parse(request.getFlow()); + private FlowRef getFlowRef(KeyRequest request) { + return FlowRef.parse(request.getFlow()); } - private sdmxdl.DataQuery getDataQuery(KeyRequest request) { - return sdmxdl.DataQuery + private Query getDataQuery(KeyRequest request) { + return Query .builder() .key(Key.parse(request.getKey())) - .detail(sdmxdl.DataDetail.FULL) + .detail(Detail.FULL) .build(); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/CommonSdmxExceptions.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/CommonSdmxExceptions.java index 0fae95d30..b90026e1a 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/CommonSdmxExceptions.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/CommonSdmxExceptions.java @@ -18,8 +18,8 @@ import lombok.NonNull; import sdmxdl.CodelistRef; -import sdmxdl.DataStructureRef; -import sdmxdl.DataflowRef; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import java.io.IOException; import java.util.Locale; @@ -33,11 +33,11 @@ public final class CommonSdmxExceptions { return new IOException(String.format(Locale.ROOT, "Connection closed from '%s'", source.getMarker())); } - public static @NonNull IOException missingFlow(@NonNull HasMarker source, @NonNull DataflowRef ref) { + public static @NonNull IOException missingFlow(@NonNull HasMarker source, @NonNull FlowRef ref) { return new IOException(String.format(Locale.ROOT, "Missing flow '%s' from '%s'", ref, source.getMarker())); } - public static @NonNull IOException missingStructure(@NonNull HasMarker source, @NonNull DataStructureRef ref) { + public static @NonNull IOException missingStructure(@NonNull HasMarker source, @NonNull StructureRef ref) { return new IOException(String.format(Locale.ROOT, "Missing structure '%s' from '%s'", ref, source.getMarker())); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ConnectionSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ConnectionSupport.java index aea6ab9ef..9621da1f1 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ConnectionSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ConnectionSupport.java @@ -9,7 +9,7 @@ @lombok.experimental.UtilityClass public class ConnectionSupport { - public static @NonNull Dataflow getFlowFromFlows(@NonNull DataflowRef flowRef, @NonNull Connection connection, @NonNull HasMarker source) throws IOException, IllegalArgumentException { + public static @NonNull Flow getFlowFromFlows(@NonNull FlowRef flowRef, @NonNull Connection connection, @NonNull HasMarker source) throws IOException, IllegalArgumentException { return connection .getFlows() .stream() @@ -18,7 +18,7 @@ public class ConnectionSupport { .orElseThrow(() -> CommonSdmxExceptions.missingFlow(source, flowRef)); } - public static @NonNull DataSet getDataSetFromStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query, @NonNull Connection connection) throws IOException, IllegalArgumentException { + public static @NonNull DataSet getDataSetFromStream(@NonNull FlowRef flowRef, @NonNull Query query, @NonNull Connection connection) throws IOException, IllegalArgumentException { try (Stream stream = connection.getDataStream(flowRef, query)) { return stream.collect(DataSet.toDataSet(flowRef, query)); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/DataRef.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/DataRef.java index dd730ffe6..abf7650d9 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/DataRef.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/DataRef.java @@ -16,8 +16,8 @@ */ package sdmxdl.provider; -import sdmxdl.DataQuery; -import sdmxdl.DataflowRef; +import sdmxdl.Query; +import sdmxdl.FlowRef; /** * @author Philippe Charles @@ -26,8 +26,8 @@ public class DataRef { @lombok.NonNull - DataflowRef flowRef; + FlowRef flowRef; @lombok.NonNull - DataQuery query; + Query query; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java index 4e4ed709f..a486d4923 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/HasMarker.java @@ -2,18 +2,18 @@ import lombok.NonNull; import sdmxdl.DataRepository; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.file.FileSource; +import sdmxdl.web.WebSource; public interface HasMarker { @NonNull Marker getMarker(); - static @NonNull Marker of(@NonNull SdmxWebSource s) { + static @NonNull Marker of(@NonNull WebSource s) { return Marker.parse(s.getDriver() + ":" + s.getId()); } - static @NonNull Marker of(@NonNull SdmxFileSource s) { + static @NonNull Marker of(@NonNull FileSource s) { return Marker.parse(s.getData().getPath()); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java index 3f0c32dd2..1ea652cb0 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/PropertiesSupport.java @@ -2,8 +2,8 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.file.SdmxFileSource; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.file.FileSource; +import sdmxdl.web.WebSource; import java.util.Collections; import java.util.Locale; @@ -14,11 +14,11 @@ @lombok.experimental.UtilityClass public class PropertiesSupport { - public static @NonNull Function asFunction(@NonNull SdmxFileSource source) { + public static @NonNull Function asFunction(@NonNull FileSource source) { return key -> PropertiesSupport.getProperty(Collections.emptyMap(), key); } - public static @NonNull Function asFunction(@NonNull SdmxWebSource source) { + public static @NonNull Function asFunction(@NonNull WebSource source) { return key -> PropertiesSupport.getProperty(source.getProperties(), key); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java index d8c758bd0..61789946c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/ext/SeriesMetaFactory.java @@ -64,7 +64,7 @@ public final class SeriesMetaFactory { } @NonNull - public static SeriesMetaFactory getDefault(@NonNull DataStructure dsd) { + public static SeriesMetaFactory getDefault(@NonNull Structure dsd) { return builder() .byContent() .valueUnit(getValueUnit(dsd)) @@ -75,7 +75,7 @@ public static SeriesMetaFactory getDefault(@NonNull DataStructure dsd) { } @NonNull - public static SeriesMetaFactory sdmx20(@NonNull DataStructure dsd) { + public static SeriesMetaFactory sdmx20(@NonNull Structure dsd) { return builder() .byAttribute(SeriesMetaUtil.TIME_FORMAT_CONCEPT, TimeUnitParsers.onTimeFormatCodeList()) .valueUnit(getValueUnit(dsd)) @@ -86,7 +86,7 @@ public static SeriesMetaFactory sdmx20(@NonNull DataStructure dsd) { } @NonNull - public static SeriesMetaFactory sdmx21(@NonNull DataStructure dsd) { + public static SeriesMetaFactory sdmx21(@NonNull Structure dsd) { return builder() .byDimension(getFrequencyCodeIdIndex(dsd), TimeUnitParsers.onFreqCodeList()) .valueUnit(getValueUnit(dsd)) @@ -117,7 +117,7 @@ public Builder byDimension(int dimensionIndex, Parser timeUnitPa public static final int NO_FREQUENCY_CODE_ID_INDEX = -1; - public static int getFrequencyCodeIdIndex(@NonNull DataStructure dsd) { + public static int getFrequencyCodeIdIndex(@NonNull Structure dsd) { List dimensions = dsd.getDimensionList(); return IntStream.range(0, dimensions.size()) .filter(i -> isFrequencyCodeId(dimensions.get(i))) @@ -135,7 +135,7 @@ private static boolean isFrequencyCodeId(Dimension o) { } } - private static Function getValueUnit(DataStructure dsd) { + private static Function getValueUnit(Structure dsd) { Dimension dimension = first(dsd.getDimensions(), o -> o.getId().contains("UNIT") && !o.getId().contains("MULT"), BY_LENGTH_ID); if (dimension != null) { return onDimension(dsd.getDimensionList().indexOf(dimension)); @@ -147,17 +147,17 @@ private static Function getValueUnit(DataStructure dsd) { return NOT_FOUND; } - private static Function getDecimal(DataStructure dsd) { + private static Function getDecimal(Structure dsd) { Attribute attribute = first(dsd.getAttributes(), o -> o.getId().contains("DECIMALS"), BY_LENGTH_ID); return attribute != null ? onAttribute(attribute) : NOT_FOUND; } - private static Function getName(DataStructure dsd) { + private static Function getName(Structure dsd) { Attribute attribute = first(dsd.getAttributes(), o -> !o.isCoded() && o.getId().contains("TITLE"), BY_LENGTH_ID); return attribute != null ? onAttribute(attribute) : NOT_FOUND; } - private static Function getDescription(DataStructure dsd) { + private static Function getDescription(Structure dsd) { Attribute attribute = first(dsd.getAttributes(), o -> !o.isCoded() && o.getId().contains("TITLE"), BY_LENGTH_ID.reversed()); return attribute != null ? onAttribute(attribute) : NOT_FOUND; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java index 27b76d883..9f29af879 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/CachedFileClient.java @@ -20,7 +20,7 @@ import nbbrd.io.net.MediaType; import sdmxdl.*; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; import sdmxdl.provider.TypedId; @@ -40,11 +40,11 @@ public final class CachedFileClient implements FileClient { public static @NonNull CachedFileClient of( @NonNull FileClient client, @NonNull Cache cache, - @NonNull SdmxFileSource source, @NonNull Languages languages) { + @NonNull FileSource source, @NonNull Languages languages) { return new CachedFileClient(client, cache, getBase(source, languages)); } - private static URI getBase(SdmxFileSource source, Languages languages) { + private static URI getBase(FileSource source, Languages languages) { return TypedId.resolveURI(URI.create("cache:file"), source.getData().toString() + source.getStructure(), languages.toString()); } @@ -106,8 +106,8 @@ private Duration getTtl(Object o) { return DEFAULT_CACHE_TTL; } - private DataSet copyAllNoData(FileInfo entry, DataflowRef flowRef) throws IOException { - DataRef ref = DataRef.of(flowRef, DataQuery.builder().key(Key.ALL).detail(DataDetail.NO_DATA).build()); + private DataSet copyAllNoData(FileInfo entry, FlowRef flowRef) throws IOException { + DataRef ref = DataRef.of(flowRef, Query.builder().key(Key.ALL).detail(Detail.NO_DATA).build()); try (Stream stream = delegate.loadData(entry, ref)) { return stream.collect(toDataSet(ref.getFlowRef(), ref.getQuery())); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileConnection.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileConnection.java index 3c13c8308..f9322a3a5 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileConnection.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileConnection.java @@ -40,7 +40,7 @@ public final class FileConnection implements Connection { private final FileClient client; @lombok.NonNull - private final Dataflow dataflow; + private final Flow flow; private boolean closed = false; @@ -51,32 +51,32 @@ public void testConnection() throws IOException { } @Override - public @NonNull Collection getFlows() throws IOException { + public @NonNull Collection getFlows() throws IOException { checkState(); - return Collections.singleton(dataflow); + return Collections.singleton(flow); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException { checkState(); checkFlowRef(flowRef); - return dataflow; + return flow; } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException { checkState(); checkFlowRef(flowRef); return client.decode().getStructure(); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException { return ConnectionSupport.getDataSetFromStream(flowRef, query, this); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException { checkState(); checkFlowRef(flowRef); @@ -106,8 +106,8 @@ private void checkKey(Key key, FileInfo info) throws IllegalArgumentException { WebValidators.onDataStructure(info.getStructure()).checkValidity(key); } - private void checkFlowRef(DataflowRef flowRef) throws IOException { - if (!this.dataflow.getRef().contains(flowRef)) { + private void checkFlowRef(FlowRef flowRef) throws IOException { + if (!this.flow.getRef().contains(flowRef)) { throw CommonSdmxExceptions.missingFlow(client, flowRef); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileInfo.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileInfo.java index c63a0ad30..017424d62 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileInfo.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/file/FileInfo.java @@ -1,12 +1,12 @@ package sdmxdl.provider.file; import nbbrd.io.net.MediaType; -import sdmxdl.DataStructure; +import sdmxdl.Structure; @lombok.Value(staticConstructor = "of") public class FileInfo { MediaType dataType; - DataStructure structure; + Structure structure; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java index 7d8f447d8..32d52fd3c 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/CachedRestClient.java @@ -23,7 +23,7 @@ import sdmxdl.provider.DataRef; import sdmxdl.provider.Marker; import sdmxdl.provider.TypedId; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.IOException; import java.net.URI; @@ -42,12 +42,12 @@ final class CachedRestClient implements RestClient { static @NonNull RestClient of( @NonNull RestClient client, @NonNull Cache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull Languages languages) { + @NonNull WebSource source, @NonNull Languages languages) { return new CachedRestClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } @VisibleForTesting - static URI getBase(SdmxWebSource source, Languages languages) { + static URI getBase(WebSource source, Languages languages) { return TypedId.resolveURI(URI.create("cache:rest"), source.getId(), String.valueOf(source.hashCode()), languages.toString()); } @@ -64,13 +64,13 @@ static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfFlows = initIdOfFlows(base); + private final TypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) - private final TypedId idOfFlow = initIdOfFlow(base); + private final TypedId idOfFlow = initIdOfFlow(base); @lombok.Getter(lazy = true) - private final TypedId idOfStruct = initIdOfStruct(base); + private final TypedId idOfStruct = initIdOfStruct(base); @lombok.Getter(lazy = true) private final TypedId idOfSeriesKeysOnly = initIdOfSeriesKeysOnly(base); @@ -78,21 +78,21 @@ static URI getBase(SdmxWebSource source, Languages languages) { @lombok.Getter(lazy = true) private final TypedId idOfNoData = initIdOfNoData(base); - private static TypedId> initIdOfFlows(URI base) { + private static TypedId> initIdOfFlows(URI base) { return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("flows"); } - private static TypedId initIdOfFlow(URI base) { + private static TypedId initIdOfFlow(URI base) { return TypedId.of(base, repo -> repo.getFlows().stream().findFirst().orElse(null), flow -> DataRepository.builder().flow(flow).build() ).with("flow"); } - private static TypedId initIdOfStruct(URI base) { + private static TypedId initIdOfStruct(URI base) { return TypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() @@ -119,23 +119,23 @@ private static TypedId initIdOfNoData(URI base) { } @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { return loadDataflowsWithCache(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { - Dataflow result = peekDataflowFromCache(ref); + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { + Flow result = peekDataflowFromCache(ref); return result != null ? result : loadDataflowWithCache(ref); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { return loadDataStructureWithCache(ref); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { if (!ref.getQuery().getDetail().isIgnoreData()) { return delegate.getData(ref, dsd); } @@ -160,32 +160,32 @@ public void testClient() throws IOException { delegate.testClient(); } - private List loadDataflowsWithCache() throws IOException { + private List loadDataflowsWithCache() throws IOException { return getIdOfFlows().load(cache, delegate::getFlows, this::getTtl); } - private DataStructure loadDataStructureWithCache(DataStructureRef ref) throws IOException { - TypedId id = getIdOfStruct().with(ref); + private Structure loadDataStructureWithCache(StructureRef ref) throws IOException { + TypedId id = getIdOfStruct().with(ref); return id.load(cache, () -> delegate.getStructure(ref), this::getTtl); } - private DataSet loadSeriesKeysOnlyWithCache(DataRef ref, DataStructure dsd) throws IOException { + private DataSet loadSeriesKeysOnlyWithCache(DataRef ref, Structure dsd) throws IOException { TypedId id = getIdOfSeriesKeysOnly().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } - private DataSet loadNoDataWithCache(DataRef ref, DataStructure dsd) throws IOException { + private DataSet loadNoDataWithCache(DataRef ref, Structure dsd) throws IOException { TypedId id = getIdOfNoData().with(ref.getFlowRef()); return id.load(cache, () -> copyData(ref, dsd), this::getTtl, o -> isNarrowerRequest(ref.getQuery().getKey(), o.getQuery())); } - private Dataflow peekDataflowFromCache(DataflowRef ref) { + private Flow peekDataflowFromCache(FlowRef ref) { // check if dataflow has been already loaded by #loadDataflowsWithCache - List dataFlows = getIdOfFlows().peek(cache); + List dataFlows = getIdOfFlows().peek(cache); if (dataFlows == null) { return null; } - for (Dataflow o : dataFlows) { + for (Flow o : dataFlows) { // FIXME: use #contains instead of #id if (o.getRef().getId().equals(ref.getId())) { return o; @@ -194,16 +194,16 @@ private Dataflow peekDataflowFromCache(DataflowRef ref) { return null; } - private Dataflow loadDataflowWithCache(DataflowRef ref) throws IOException { - TypedId id = getIdOfFlow().with(ref); + private Flow loadDataflowWithCache(FlowRef ref) throws IOException { + TypedId id = getIdOfFlow().with(ref); return id.load(cache, () -> delegate.getFlow(ref), this::getTtl); } - private boolean isNarrowerRequest(Key key, DataQuery query) { + private boolean isNarrowerRequest(Key key, Query query) { return !key.supersedes(query.getKey()) && query.getKey().contains(key); } - private DataSet copyData(DataRef ref, DataStructure structure) throws IOException { + private DataSet copyData(DataRef ref, Structure structure) throws IOException { try (Stream stream = delegate.getData(ref, structure)) { return stream.collect(toDataSet(ref.getFlowRef(), ref.getQuery())); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java index 92b911430..101c18ee9 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/DriverSupport.java @@ -22,7 +22,7 @@ import sdmxdl.Languages; import sdmxdl.format.ServiceSupport; import sdmxdl.provider.Validator; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -48,7 +48,7 @@ public final class DriverSupport implements Driver { private final WebConnector connector; @lombok.Singular - private final Collection sources; + private final Collection sources; @lombok.Singular private final Collection properties; @@ -58,7 +58,7 @@ public final class DriverSupport implements Driver { private final Predicate availability = properties -> true; @lombok.Getter(value = AccessLevel.PRIVATE, lazy = true) - private final Validator lazySourceValidator = WebValidators.onDriverId(id); + private final Validator lazySourceValidator = WebValidators.onDriverId(id); @Override public @NonNull String getDriverId() { @@ -76,14 +76,14 @@ public boolean isDriverAvailable() { } @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { getLazySourceValidator().checkValidity(source); return connector.connect(source, languages, context); } @Override - public @NonNull Collection getDefaultSources() { + public @NonNull Collection getDefaultSources() { return sources; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java index 301e279cd..3587b690b 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClient.java @@ -31,13 +31,13 @@ */ public interface RestClient extends HasMarker { - @NonNull List getFlows() throws IOException; + @NonNull List getFlows() throws IOException; - @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException; + @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException; - @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException; + @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException; - @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException; + @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException; @NonNull Codelist getCodelist(@NonNull CodelistRef ref) throws IOException; diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java index 931b6df9e..b4cceb204 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestClientSupplier.java @@ -2,7 +2,7 @@ import lombok.NonNull; import sdmxdl.Languages; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -10,5 +10,5 @@ @FunctionalInterface public interface RestClientSupplier { - @NonNull RestClient get(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; + @NonNull RestClient get(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnection.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnection.java index 3ea0e001e..793e35a76 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnection.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnection.java @@ -38,59 +38,59 @@ final class RestConnection implements Connection { private final RestClient client; @lombok.NonNull - private final Validator dataflowRefValidator; + private final Validator dataflowRefValidator; private final boolean noBatchFlow; private boolean closed = false; @Override - public @NonNull Collection getFlows() throws IOException { + public @NonNull Collection getFlows() throws IOException { checkState(); return client.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException { checkState(); return lookupFlow(flowRef); } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException { checkState(); return client.getStructure(lookupFlow(flowRef).getStructureRef()); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { return ConnectionSupport.getDataSetFromStream(flowRef, query, this); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { checkState(); - Dataflow dataflow = lookupFlow(flowRef); - DataStructure dsd = client.getStructure(dataflow.getStructureRef()); + Flow flow = lookupFlow(flowRef); + Structure dsd = client.getStructure(flow.getStructureRef()); checkKey(query.getKey(), dsd); - DataQuery realQuery = deriveDataQuery(query, getSupportedFeatures(), dsd); + Query realQuery = deriveDataQuery(query, getSupportedFeatures(), dsd); - Stream result = client.getData(DataRef.of(dataflow.getRef(), realQuery), dsd); + Stream result = client.getData(DataRef.of(flow.getRef(), realQuery), dsd); return realQuery.equals(query) ? result : query.execute(result); } - private static DataQuery deriveDataQuery(DataQuery query, Set features, DataStructure dsd) { - return DataQuery + private static Query deriveDataQuery(Query query, Set features, Structure dsd) { + return Query .builder() .key(features.contains(Feature.DATA_QUERY_ALL_KEYWORD) || !Key.ALL.equals(query.getKey()) ? query.getKey() : alternateAllOf(dsd)) - .detail(features.contains(Feature.DATA_QUERY_DETAIL) ? query.getDetail() : DataDetail.FULL) + .detail(features.contains(Feature.DATA_QUERY_DETAIL) ? query.getDetail() : Detail.FULL) .build(); } - private static Key alternateAllOf(DataStructure dsd) { + private static Key alternateAllOf(Structure dsd) { return Key.of(new String[dsd.getDimensions().size()]); } @@ -116,7 +116,7 @@ private void checkState() throws IOException { } } - private Dataflow lookupFlow(DataflowRef flowRef) throws IOException, IllegalArgumentException { + private Flow lookupFlow(FlowRef flowRef) throws IOException, IllegalArgumentException { if (noBatchFlow) { checkDataflowRef(flowRef); return client.getFlow(flowRef); @@ -125,11 +125,11 @@ private Dataflow lookupFlow(DataflowRef flowRef) throws IOException, IllegalArgu return ConnectionSupport.getFlowFromFlows(flowRef, this, client); } - private void checkDataflowRef(DataflowRef ref) throws IllegalArgumentException { + private void checkDataflowRef(FlowRef ref) throws IllegalArgumentException { dataflowRefValidator.checkValidity(ref); } - private void checkKey(Key key, DataStructure dsd) throws IllegalArgumentException { + private void checkKey(Key key, Structure dsd) throws IllegalArgumentException { WebValidators.onDataStructure(dsd).checkValidity(key); } } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java index fad4e6ee1..816353efa 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/RestConnector.java @@ -2,10 +2,10 @@ import lombok.NonNull; import sdmxdl.Connection; -import sdmxdl.DataflowRef; +import sdmxdl.FlowRef; import sdmxdl.Languages; import sdmxdl.provider.Validator; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -24,14 +24,14 @@ public final class RestConnector implements WebConnector { @lombok.NonNull @lombok.Builder.Default - private final Validator dataflowRefValidator = WebValidators.DEFAULT_DATAFLOW_REF_VALIDATOR; + private final Validator dataflowRefValidator = WebValidators.DEFAULT_DATAFLOW_REF_VALIDATOR; @Override - public @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { + public @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { return RestConnection.of(getClient(source, languages, context), dataflowRefValidator, false); } - private RestClient getClient(SdmxWebSource source, Languages languages, WebContext context) throws IOException { + private RestClient getClient(WebSource source, Languages languages, WebContext context) throws IOException { return CachedRestClient.of( client.get(source, languages, context), context.getDriverCache(source), diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java index f59c39154..47ae0fe66 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/SingleNetworkingSupport.java @@ -6,7 +6,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.format.ServiceSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.Networking; import sdmxdl.web.spi.SSLFactory; @@ -65,9 +65,9 @@ public boolean isNetworkingAvailable() { @Override public @NonNull Network getNetwork( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { return getSingleNetwork(); } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java index 64a732545..e4f8df4d3 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebConnector.java @@ -3,7 +3,7 @@ import lombok.NonNull; import sdmxdl.Connection; import sdmxdl.Languages; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -11,5 +11,5 @@ @FunctionalInterface public interface WebConnector { - @NonNull Connection connect(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; + @NonNull Connection connect(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException; } diff --git a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebValidators.java b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebValidators.java index 1ae894ade..12e99deed 100644 --- a/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebValidators.java +++ b/sdmx-dl-provider-base/src/main/java/sdmxdl/provider/web/WebValidators.java @@ -1,12 +1,12 @@ package sdmxdl.provider.web; import lombok.NonNull; -import sdmxdl.DataStructure; -import sdmxdl.DataflowRef; +import sdmxdl.Structure; +import sdmxdl.FlowRef; import sdmxdl.Key; import sdmxdl.provider.SdmxPatterns; import sdmxdl.provider.Validator; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.Locale; import java.util.regex.Pattern; @@ -16,27 +16,27 @@ @lombok.experimental.UtilityClass public class WebValidators { - public static final Validator DEFAULT_DATAFLOW_REF_VALIDATOR = dataflowRefOf( + public static final Validator DEFAULT_DATAFLOW_REF_VALIDATOR = dataflowRefOf( SdmxPatterns.AGENCY_ID_PATTERN, SdmxPatterns.RESOURCE_ID_PATTERN, SdmxPatterns.VERSION_PATTERN ); - public static @NonNull Validator dataflowRefOf(@NonNull Pattern agency, @NonNull Pattern id, @NonNull Pattern version) { + public static @NonNull Validator dataflowRefOf(@NonNull Pattern agency, @NonNull Pattern id, @NonNull Pattern version) { return Validator.onAll(asList( - Validator.onRegex("DataflowRef agency", agency).compose(DataflowRef::getAgency), - Validator.onRegex("DataflowRef id", id).compose(DataflowRef::getId), - Validator.onRegex("DataflowRef version", version).compose(DataflowRef::getVersion) + Validator.onRegex("DataflowRef agency", agency).compose(FlowRef::getAgency), + Validator.onRegex("DataflowRef id", id).compose(FlowRef::getId), + Validator.onRegex("DataflowRef version", version).compose(FlowRef::getVersion) )); } - public static @NonNull Validator onDriverId(@NonNull String driverId) { + public static @NonNull Validator onDriverId(@NonNull String driverId) { return source -> source != null && !source.getDriver().equals(driverId) ? String.format(Locale.ROOT, "Expecting driver name '%s' to be '%s'", source.getDriver(), driverId) : null; } - public static @NonNull Validator onDataStructure(@NonNull DataStructure dsd) { + public static @NonNull Validator onDataStructure(@NonNull Structure dsd) { return key -> key != null ? key.validateOn(dsd) : "Missing key"; } } diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingRestClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingRestClient.java index 165a1abb4..05d5afe49 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingRestClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XCountingRestClient.java @@ -46,25 +46,25 @@ public final class XCountingRestClient implements RestClient { } @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { count.incrementAndGet(); return delegate.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { count.incrementAndGet(); return delegate.getFlow(ref); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { count.incrementAndGet(); return delegate.getStructure(ref); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { count.incrementAndGet(); return delegate.getData(ref, dsd); } diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java index 096316384..7074fc582 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XFailingRestClient.java @@ -40,22 +40,22 @@ public enum XFailingRestClient implements RestClient { } @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { throw new CustomIOException(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { throw new CustomIOException(); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { throw new CustomIOException(); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { throw new CustomIOException(); } @@ -81,22 +81,22 @@ public void testClient() throws IOException { } @Override - public @NonNull List getFlows() { + public @NonNull List getFlows() { throw new CustomRuntimeException(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) { + public @NonNull Flow getFlow(@NonNull FlowRef ref) { throw new CustomRuntimeException(); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) { + public @NonNull Structure getStructure(@NonNull StructureRef ref) { throw new CustomRuntimeException(); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) { throw new CustomRuntimeException(); } @@ -122,22 +122,22 @@ public void testClient() { } @Override - public @NonNull List getFlows() { + public @NonNull List getFlows() { return null; } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) { + public @NonNull Flow getFlow(@NonNull FlowRef ref) { return null; } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) { + public @NonNull Structure getStructure(@NonNull StructureRef ref) { return null; } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) { return null; } diff --git a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java index 14a0f4558..f0b5b55ad 100644 --- a/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java +++ b/sdmx-dl-provider-base/src/test/java/_test/sdmxdl/util/XRepoRestClient.java @@ -45,24 +45,24 @@ public final class XRepoRestClient implements RestClient { } @Override - public @NonNull List getFlows() { + public @NonNull List getFlows() { return repository.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { return repository.getFlow(ref) .orElseThrow(() -> CommonSdmxExceptions.missingFlow(this, ref)); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { return repository.getStructure(ref) .orElseThrow(() -> CommonSdmxExceptions.missingStructure(this, ref)); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { return repository .getDataSet(ref.getFlowRef()) .map(dataSet -> dataSet.getDataStream(ref.getQuery())) diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java index 6b0dfbce3..9edc31e84 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/CommonSdmxExceptionsTest.java @@ -2,8 +2,8 @@ import org.junit.jupiter.api.Test; import sdmxdl.CodelistRef; -import sdmxdl.DataStructureRef; -import sdmxdl.DataflowRef; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNullPointerException; @@ -13,8 +13,8 @@ public class CommonSdmxExceptionsTest { private static final Marker SOURCE = Marker.parse("abc"); - private static final DataflowRef DATAFLOW_REF = DataflowRef.parse("df"); - private static final DataStructureRef DATA_STRUCTURE_REF = DataStructureRef.parse("ds"); + private static final FlowRef DATAFLOW_REF = FlowRef.parse("df"); + private static final StructureRef DATA_STRUCTURE_REF = StructureRef.parse("ds"); private static final CodelistRef CODELIST_REF = CodelistRef.parse("cl"); @Test diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/file/CachedFileClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/file/CachedFileClientTest.java index 585b8eece..585b017cd 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/file/CachedFileClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/file/CachedFileClientTest.java @@ -7,8 +7,8 @@ import nbbrd.io.function.IOFunction; import org.assertj.core.api.HamcrestCondition; import org.junit.jupiter.api.Test; -import sdmxdl.DataDetail; -import sdmxdl.DataQuery; +import sdmxdl.Detail; +import sdmxdl.Query; import sdmxdl.Key; import sdmxdl.Series; import sdmxdl.provider.DataRef; @@ -54,8 +54,8 @@ public void testLoadData() throws IOException { String loadDataKey = base + "/loadData"; for (Key key : keys("all", "M.BE.INDUSTRY", ".BE.INDUSTRY", "A.BE.INDUSTRY")) { - for (DataDetail detail : DataDetail.values()) { - DataRef ref = DataRef.of(FLOW_REF, DataQuery.builder().key(key).detail(detail).build()); + for (Detail detail : Detail.values()) { + DataRef ref = DataRef.of(FLOW_REF, Query.builder().key(key).detail(detail).build()); Method> x = client -> { try (Stream stream = client.loadData(client.decode(), ref)) { @@ -80,7 +80,7 @@ public void testCopyAllNoData() throws IOException { CachedFileClient client = getClient(ctx); FileInfo info = client.decode(); - IOConsumer x = key -> client.loadData(info, DataRef.of(FLOW_REF, DataQuery.builder().key(key).detail(DataDetail.SERIES_KEYS_ONLY).build())).close(); + IOConsumer x = key -> client.loadData(info, DataRef.of(FLOW_REF, Query.builder().key(key).detail(Detail.SERIES_KEYS_ONLY).build())).close(); ctx.reset(); x.acceptWithIO(Key.ALL); diff --git a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java index a226dba95..cdb28bae4 100644 --- a/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java +++ b/sdmx-dl-provider-base/src/test/java/sdmxdl/provider/web/CachedRestClientTest.java @@ -26,7 +26,7 @@ import sdmxdl.*; import sdmxdl.provider.DataRef; import sdmxdl.provider.TypedId; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.api.RepoSamples; import java.io.IOException; @@ -72,14 +72,14 @@ private interface Method extends IOFunction { @Test public void testGetFlows() throws IOException { - Method> x = CachedRestClient::getFlows; + Method> x = CachedRestClient::getFlows; checkCacheHit(this::getClient, x, new HamcrestCondition<>(hasItem(FLOW)), flowsId, ttl); } @Test public void testGetFlow() throws IOException { - Method x = client -> client.getFlow(FLOW_REF); + Method x = client -> client.getFlow(FLOW_REF); checkCacheHit(this::getClient, x, new HamcrestCondition<>(equalTo(FLOW)), flowId, ttl); } @@ -98,7 +98,7 @@ public void testPeekDataflowFromCache() throws IOException { @Test public void testGetStructure() throws IOException { - Method x = client -> client.getStructure(STRUCT_REF); + Method x = client -> client.getStructure(STRUCT_REF); checkCacheHit(this::getClient, x, new HamcrestCondition<>(equalTo(STRUCT)), structId, ttl); } @@ -106,8 +106,8 @@ public void testGetStructure() throws IOException { @Test public void testGetData() throws IOException { for (Key key : keys("all", "M.BE.INDUSTRY", ".BE.INDUSTRY", "A.BE.INDUSTRY")) { - for (DataDetail filter : DataDetail.values()) { - DataRef ref = DataRef.of(FLOW_REF, DataQuery.builder().key(key).detail(filter).build()); + for (Detail filter : Detail.values()) { + DataRef ref = DataRef.of(FLOW_REF, Query.builder().key(key).detail(filter).build()); Method> x = client -> { try (Stream cursor = client.getData(ref, STRUCT)) { @@ -136,8 +136,8 @@ public void testNarrowerRequest() throws IOException { Context ctx = new Context(); CachedRestClient client = getClient(ctx); - for (DataDetail filter : new DataDetail[]{DataDetail.SERIES_KEYS_ONLY, DataDetail.NO_DATA}) { - IOConsumer method = key -> client.getData(DataRef.of(FLOW_REF, DataQuery.builder().key(key).detail(filter).build()), STRUCT).close(); + for (Detail filter : new Detail[]{Detail.SERIES_KEYS_ONLY, Detail.NO_DATA}) { + IOConsumer method = key -> client.getData(DataRef.of(FLOW_REF, Query.builder().key(key).detail(filter).build()), STRUCT).close(); ctx.reset(); method.acceptWithIO(Key.ALL); @@ -183,7 +183,7 @@ public void testNarrowerRequest() throws IOException { @Test public void testGetBase() { - SdmxWebSource s1 = SdmxWebSource + WebSource s1 = WebSource .builder() .id("id1") .driver("driver1") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java index 0f5e8558f..1a704bffb 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Connectors.java @@ -38,17 +38,17 @@ @lombok.experimental.UtilityClass public class Connectors { - public sdmxdl.Dataflow toFlow(Dataflow o) { - return sdmxdl.Dataflow + public Flow toFlow(Dataflow o) { + return Flow .builder() - .ref(DataflowRef.parse(o.getFullIdentifier())) + .ref(FlowRef.parse(o.getFullIdentifier())) .structureRef(toStructureRef(o.getDsdIdentifier())) .name(o.getDescription()) .build(); } - public DataStructureRef toStructureRef(SDMXReference o) { - return DataStructureRef.of( + public StructureRef toStructureRef(SDMXReference o) { + return StructureRef.of( o.getAgency(), o.getId(), o.getVersion() @@ -82,9 +82,9 @@ private String toLabel(SdmxMetaElement o) { return name != null ? name : o.getId(); } - public DataStructure toStructure(DataFlowStructure dsd) { - return DataStructure.builder() - .ref(DataStructureRef.of(dsd.getAgency(), dsd.getId(), dsd.getVersion())) + public Structure toStructure(DataFlowStructure dsd) { + return Structure.builder() + .ref(StructureRef.of(dsd.getAgency(), dsd.getId(), dsd.getVersion())) .name(dsd.getName()) .timeDimensionId(dsd.getTimeDimension()) .primaryMeasureId(dsd.getMeasure()) @@ -93,7 +93,7 @@ public DataStructure toStructure(DataFlowStructure dsd) { .build(); } - public Dataflow fromFlowQuery(DataflowRef flowRef, DataStructureRef structRef) { + public Dataflow fromFlowQuery(FlowRef flowRef, StructureRef structRef) { Dataflow result = new Dataflow( flowRef.getId(), flowRef.getAgency(), @@ -103,7 +103,7 @@ public Dataflow fromFlowQuery(DataflowRef flowRef, DataStructureRef structRef) { return result; } - public Dataflow fromFlow(sdmxdl.Dataflow flow) { + public Dataflow fromFlow(Flow flow) { Dataflow result = new Dataflow( flow.getRef().getId(), flow.getRef().getAgency(), @@ -113,7 +113,7 @@ public Dataflow fromFlow(sdmxdl.Dataflow flow) { return result; } - public SDMXReference fromStructureRef(DataStructureRef ref) { + public SDMXReference fromStructureRef(StructureRef ref) { return new SDMXReference(ref.getId(), ref.getAgency(), ref.getVersion()); } @@ -149,7 +149,7 @@ private Codelist fromCodelist(sdmxdl.Codelist o) { return result; } - public DataFlowStructure fromStructure(DataStructure dsd) { + public DataFlowStructure fromStructure(Structure dsd) { DataFlowStructure result = new DataFlowStructure( dsd.getRef().getId(), dsd.getRef().getAgency(), diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java index 0364fa817..0cd544acc 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ConnectorsRestClient.java @@ -36,7 +36,7 @@ import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestClientSupplier; import sdmxdl.provider.web.WebEvents; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.SSLFactory; import sdmxdl.web.spi.WebContext; @@ -115,7 +115,7 @@ public interface GenericSupplier { } @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { try { return connector .getDataflows() @@ -129,7 +129,7 @@ public interface GenericSupplier { } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { try { return Connectors.toFlow(connector.getDataflow(ref.getId(), ref.getAgency(), ref.getVersion())); } catch (SdmxException ex) { @@ -138,7 +138,7 @@ public interface GenericSupplier { } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { try { return Connectors.toStructure(connector.getDataFlowStructure(Connectors.fromStructureRef(ref), true)); } catch (SdmxException ex) { @@ -147,7 +147,7 @@ public interface GenericSupplier { } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { try { List> data = getData(connector, ref, dsd); return PortableTimeSeriesCursor.of(data, dataFactory, dsd).asStream(); @@ -195,12 +195,12 @@ public void testClient() throws IOException { MAX_REDIRECTS_PROPERTY ); - private static List> getData(RestSdmxClient connector, DataRef ref, DataStructure dsd) throws SdmxException { + private static List> getData(RestSdmxClient connector, DataRef ref, Structure dsd) throws SdmxException { return connector.getTimeSeries( Connectors.fromFlowQuery(ref.getFlowRef(), dsd.getRef()), Connectors.fromStructure(dsd), ref.getQuery().getKey().toString(), null, null, - ref.getQuery().getDetail().equals(DataDetail.SERIES_KEYS_ONLY), + ref.getQuery().getDetail().equals(Detail.SERIES_KEYS_ONLY), null, false); } @@ -208,7 +208,7 @@ private static IOException wrap(SdmxException ex, String format, Object... args) return new IOException(String.format(Locale.ROOT, format, args), ex); } - private static void configure(RestSdmxClient client, SdmxWebSource source, WebContext context) { + private static void configure(RestSdmxClient client, WebSource source, WebContext context) { // client.setLanguages(Connectors.fromLanguages(context.getLanguages())); client.setConnectTimeout(CONNECT_TIMEOUT_PROPERTY.get(source.getProperties())); client.setReadTimeout(READ_TIMEOUT_PROPERTY.get(source.getProperties())); @@ -227,9 +227,9 @@ private static void configure(RestSdmxClient client, SdmxWebSource source, WebCo private static final class DefaultRestSdmxEventListener implements RestSdmxEventListener { @NonNull - private final SdmxWebSource source; + private final WebSource source; - private final @Nullable EventListener listener; + private final @Nullable EventListener listener; @NonNull private final String marker; diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java index a2ee0c8e7..c5af74575 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/EurostatDriver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; @@ -42,7 +42,7 @@ public final class EurostatDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(EUROSTAT::new))) .properties(CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("ESTAT") .alias("EUROSTAT") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java index 85cd88a2e..325487386 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/ImfDriver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; @@ -42,7 +42,7 @@ public final class ImfDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(IMF2::new))) .properties(CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("IMF") .name("en", "International Monetary Fund") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java index 62c2159f5..0154dcf55 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -32,7 +32,7 @@ import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import java.net.URI; @@ -60,7 +60,7 @@ public final class InseeDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(InseeClient::new, OBS_FACTORY))) .properties(CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("INSEE") .name("fr", "Institut national de la statistique et des études économiques") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java index 43556b2a7..5f7b3bdb6 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/NbbDriver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; @@ -42,7 +42,7 @@ public final class NbbDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(NBB::new))) .properties(CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("NBB") .name("en", "National Bank of Belgium") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java index f18f0cdab..24715cacf 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/OecdDriver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; @@ -42,7 +42,7 @@ public final class OecdDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(OECD::new))) .properties(CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("OECD") .name("en", "The Organisation for Economic Co-operation and Development") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java index 876289ef8..bf39f4205 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/PortableTimeSeriesCursor.java @@ -19,7 +19,7 @@ import it.bancaditalia.oss.sdmx.api.PortableTimeSeries; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.Key; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; @@ -37,7 +37,7 @@ @lombok.RequiredArgsConstructor public final class PortableTimeSeriesCursor implements DataCursor { - public static PortableTimeSeriesCursor of(List> data, Supplier df, DataStructure dsd) { + public static PortableTimeSeriesCursor of(List> data, Supplier df, Structure dsd) { return new PortableTimeSeriesCursor(data.iterator(), Key.builder(dsd), df.get()); } diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java index 47630cf39..9c1e76617 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/Sdmx21Driver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import java.net.URI; @@ -51,7 +51,7 @@ public final class Sdmx21Driver implements Driver { .propertyOf(NEEDS_URL_ENCODING_PROPERTY) .propertyOf(SUPPORTS_COMPRESSION_PROPERTY) .propertyOf(DETAIL_SUPPORTED_PROPERTY) - .source(SdmxWebSource + .source(WebSource .builder() .id("ABS") .name("en", "Australian Bureau of Statistics") @@ -62,7 +62,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ABS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/abs") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("BIS") .name("en", "Bank for International Settlements") @@ -73,7 +73,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/BIS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/bis") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("CAMSTAT") .name("en", "National Institute of Statistics of Cambodia") @@ -84,7 +84,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/CAMSTAT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/camstat") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ECB") .name("en", "European Central Bank") @@ -96,7 +96,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ECB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ecb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ESCAP") .name("en", "Economic and Social Commission for Asia and the Pacific") @@ -106,7 +106,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ESCAP") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/escap") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ILO") .name("en", "International Labour Organization") @@ -117,7 +117,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ILO") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ilo") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("IMF_SDMX_CENTRAL") .name("en", "International Monetary Fund (SDMX Central)") @@ -129,7 +129,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("INEGI") .name("en", "Instituto Nacional de Estadistica y Geografia") @@ -139,7 +139,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/INEGI") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/inegi") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ISTAT") .name("en", "Istituto Nazionale di Statistica") @@ -151,7 +151,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ISTAT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/istat") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("NB") .name("en", "Norges Bank") @@ -164,7 +164,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/NB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/nb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SGR") .name("en", "SDMX Global Registry") @@ -175,7 +175,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SGR") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/sgr") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SIMEL") .name("en", "El Salvador Labour Market Information System") @@ -186,7 +186,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SIMEL") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/simel") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SPC") .name("en", "Pacific Data Hub") @@ -198,7 +198,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SPC") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/spc") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("STATEC") .name("en", "National Institute of statistics and economic studies of the Grand Duchy of Luxembourg") @@ -210,7 +210,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/STATEC") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/statec") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("UNDATA") .name("en", "Data access system to UN databases") @@ -221,7 +221,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/UNDATA") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/undata") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("WB") .name("en", "World Bank") @@ -232,7 +232,7 @@ public final class Sdmx21Driver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/WB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/wb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("WITS") .name("en", "World Integrated Trade Solutions") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java index f0f49a999..bca1c3a21 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/SeDriver.java @@ -21,7 +21,7 @@ import nbbrd.service.ServiceProvider; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import java.net.URI; @@ -43,7 +43,7 @@ public final class SeDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofSpecific(SeClient::new))) .properties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("SE") .name("en", "Statistics Estonia") diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java index 2c46741e9..2271bcea3 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/UisDriver.java @@ -22,7 +22,7 @@ import sdmxdl.provider.SdmxFix; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import java.net.URI; @@ -46,7 +46,7 @@ public final class UisDriver implements Driver { .rank(WRAPPED_DRIVER_RANK) .connector(RestConnector.of(ConnectorsRestClient.ofGeneric(UIS2::new))) .properties(ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("UIS") .name("en", "Unesco Institute for Statistics") diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java index 68ff6438e..7372de143 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ConnectorsResource.java @@ -55,7 +55,7 @@ public DataRepository nbb() throws IOException { List flows = flow20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); List> data = data20(SdmxXmlSources.NBB_DATA, structs.get(0), l); - DataflowRef ref = firstOf(flows); + FlowRef ref = firstOf(flows); return DataRepository .builder() @@ -65,7 +65,7 @@ public DataRepository nbb() throws IOException { PortableTimeSeriesCursor .of(data, ObsParser::newDefault, Connectors.toStructure(structs.get(0))) .asStream() - .collect(toDataSet(ref, DataQuery.ALL))) + .collect(toDataSet(ref, Query.ALL))) .name("NBB") .build(); } @@ -78,7 +78,7 @@ public DataRepository ecb() throws IOException { List flows = flow21(SdmxXmlSources.ECB_DATAFLOWS, l); List> data = data21(SdmxXmlSources.ECB_DATA, structs.get(0), l); - DataflowRef ref = firstOf(flows); + FlowRef ref = firstOf(flows); return DataRepository .builder() @@ -88,12 +88,12 @@ public DataRepository ecb() throws IOException { PortableTimeSeriesCursor .of(data, ObsParser::newDefault, Connectors.toStructure(structs.get(0))) .asStream() - .collect(toDataSet(ref, DataQuery.ALL))) + .collect(toDataSet(ref, Query.ALL))) .name("ECB") .build(); } - private DataflowRef firstOf(List flows) { + private FlowRef firstOf(List flows) { return flows.stream().map(o -> Connectors.toFlow(o).getRef()).findFirst().orElseThrow(RuntimeException::new); } diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java index 492975ca6..dd30969a4 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/FacadeResource.java @@ -34,18 +34,18 @@ @lombok.experimental.UtilityClass public class FacadeResource { - public static final DataflowRef ECB_FLOW_REF = DataflowRef.of("ECB", "AME", "1.0"); - public static final DataStructureRef ECB_STRUCT_REF = DataStructureRef.of("ECB", "ECB_AME1", "1.0"); + public static final FlowRef ECB_FLOW_REF = FlowRef.of("ECB", "AME", "1.0"); + public static final StructureRef ECB_STRUCT_REF = StructureRef.of("ECB", "ECB_AME1", "1.0"); - public static final DataflowRef NBB_FLOW_REF = DataflowRef.of("NBB", "TEST_DATASET", null); + public static final FlowRef NBB_FLOW_REF = FlowRef.of("NBB", "TEST_DATASET", null); public DataRepository nbb() throws IOException { DataRepository result = NBB.get(); if (result == null) { Languages l = Languages.parse("fr"); - List structs = struct20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); - List flows = flow20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); + List structs = struct20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); + List flows = flow20(SdmxXmlSources.NBB_DATA_STRUCTURE, l); List data = data20(SdmxXmlSources.NBB_DATA, structs.get(0)); result = DataRepository.builder() @@ -65,8 +65,8 @@ public DataRepository ecb() throws IOException { if (result == null) { Languages l = Languages.parse("fr"); - List structs = struct21(SdmxXmlSources.ECB_DATA_STRUCTURE, l); - List flows = flow21(SdmxXmlSources.ECB_DATAFLOWS, l); + List structs = struct21(SdmxXmlSources.ECB_DATA_STRUCTURE, l); + List flows = flow21(SdmxXmlSources.ECB_DATAFLOWS, l); List data = data21(SdmxXmlSources.ECB_DATA, structs.get(0)); result = DataRepository.builder() @@ -84,39 +84,39 @@ public DataRepository ecb() throws IOException { private static final AtomicReference NBB = new AtomicReference<>(); private static final AtomicReference ECB = new AtomicReference<>(); - private List struct20(ByteSource xml, Languages l) throws IOException { + private List struct20(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.struct20(l).parseReader(xml::openReader); } - private List flow20(ByteSource xml, Languages l) throws IOException { + private List flow20(ByteSource xml, Languages l) throws IOException { // FIXME: find sample of dataflow20 ? return struct20(xml, l).stream() .map(FacadeResource::asDataflow) .collect(Collectors.toList()); } - List data20(ByteSource xml, DataStructure dsd) throws IOException { + List data20(ByteSource xml, Structure dsd) throws IOException { try (DataCursor c = SdmxXmlStreams.genericData20(dsd, ObsParser::newDefault).parseReader(xml::openReader)) { return c.asStream().collect(Collectors.toList()); } } - private List struct21(ByteSource xml, Languages l) throws IOException { + private List struct21(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.struct21(l).parseReader(xml::openReader); } - private List flow21(ByteSource xml, Languages l) throws IOException { + private List flow21(ByteSource xml, Languages l) throws IOException { return SdmxXmlStreams.flow21(l).parseReader(xml::openReader); } - List data21(ByteSource xml, DataStructure dsd) throws IOException { + List data21(ByteSource xml, Structure dsd) throws IOException { try (DataCursor c = SdmxXmlStreams.genericData21(dsd, ObsParser::newDefault).parseReader(xml::openReader)) { return c.asStream().collect(Collectors.toList()); } } - private Dataflow asDataflow(DataStructure o) { - DataflowRef ref = DataflowRef.of(o.getRef().getAgency(), o.getRef().getId(), o.getRef().getVersion()); - return Dataflow.builder().ref(ref).structureRef(o.getRef()).name(o.getName()).build(); + private Flow asDataflow(Structure o) { + FlowRef ref = FlowRef.of(o.getRef().getAgency(), o.getRef().getId(), o.getRef().getVersion()); + return Flow.builder().ref(ref).structureRef(o.getRef()).name(o.getName()).build(); } } diff --git a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ParsersTest.java b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ParsersTest.java index dcc16d268..8b1d82bba 100644 --- a/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ParsersTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/_test/sdmxdl/connectors/samples/ParsersTest.java @@ -46,7 +46,7 @@ private DataRepository removeAttributeRelationship(DataRepository repo) { .build(); } - private DataStructure removeAttributeRelationship(DataStructure dsd) { + private Structure removeAttributeRelationship(Structure dsd) { return dsd .toBuilder() .clearAttributes() @@ -68,7 +68,7 @@ public void testEcbContent() throws IOException { .singleElement() .satisfies(dsd -> { assertThat(dsd.getRef()) - .isEqualTo(DataStructureRef.of("ECB", "ECB_AME1", "1.0")); + .isEqualTo(StructureRef.of("ECB", "ECB_AME1", "1.0")); assertThat(dsd.getDimensions()) .hasSize(7) .element(0) @@ -114,8 +114,8 @@ public void testEcbContent() throws IOException { assertThat(repository.getFlows()) .hasSize(3) .element(0) - .extracting(Dataflow::getRef) - .isEqualTo(DataflowRef.of("ECB", "AME", "1.0")); + .extracting(Flow::getRef) + .isEqualTo(FlowRef.of("ECB", "AME", "1.0")); assertThat(repository.getDataSets()) .hasSize(1); @@ -132,7 +132,7 @@ public void testNbbContent() throws IOException { .singleElement() .satisfies(dsd -> { assertThat(dsd.getRef()) - .isEqualTo(DataStructureRef.of("NBB", "TEST_DATASET", "latest")); + .isEqualTo(StructureRef.of("NBB", "TEST_DATASET", "latest")); assertThat(dsd.getDimensions()) .hasSize(3) .element(0) @@ -177,8 +177,8 @@ public void testNbbContent() throws IOException { assertThat(repository.getFlows()) .singleElement() - .extracting(Dataflow::getRef) - .isEqualTo(DataflowRef.of("NBB", "TEST_DATASET", "latest")); + .extracting(Flow::getRef) + .isEqualTo(FlowRef.of("NBB", "TEST_DATASET", "latest")); assertThat(repository.getDataSets()) .hasSize(1); diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java index 04ea02199..b0ef93162 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/ConnectorsTest.java @@ -20,8 +20,8 @@ import org.junit.jupiter.api.Test; import sdmxdl.Attribute; import sdmxdl.AttributeRelationship; -import sdmxdl.DataStructure; -import sdmxdl.Dataflow; +import sdmxdl.Structure; +import sdmxdl.Flow; import tests.sdmxdl.api.RepoSamples; import java.net.HttpURLConnection; @@ -46,9 +46,9 @@ public void testIsNoResultMatchingQuery() { @Test public void testFlow() { // description field not supported in Connectors - Dataflow dataflowWithoutDescription = FLOW.toBuilder().description(null).build(); - assertThat(toFlow(fromFlow(dataflowWithoutDescription))) - .isEqualTo(dataflowWithoutDescription); + Flow flowWithoutDescription = FLOW.toBuilder().description(null).build(); + assertThat(toFlow(fromFlow(flowWithoutDescription))) + .isEqualTo(flowWithoutDescription); } @Test @@ -79,7 +79,7 @@ public void testStructure() { .describedAs("Non-contiguous positions fail in connectors") .isThrownBy(() -> toStructure(fromStructure(RepoSamples.STRUCT))); - DataStructure contiguousPositions = RepoSamples.STRUCT + Structure contiguousPositions = RepoSamples.STRUCT .toBuilder() .clearDimensions() .dimension(DIM1) diff --git a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java index 935a39d90..f39992ceb 100644 --- a/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java +++ b/sdmx-dl-provider-connectors/src/test/java/sdmxdl/provider/connectors/drivers/Sdmx20DriverTest.java @@ -17,7 +17,7 @@ package sdmxdl.provider.connectors.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.DriverAssert; import static org.assertj.core.api.Assertions.assertThatCode; @@ -35,7 +35,7 @@ public void testCompliance() { @Test public void testConnect() { - SdmxWebSource x = SdmxWebSource.builder().id("localhost").driver("connectors:sdmx20").endpointOf("http://localhost").build(); + WebSource x = WebSource.builder().id("localhost").driver("connectors:sdmx20").endpointOf("http://localhost").build(); assertThatCode(() -> new Sdmx20Driver().connect(x, ANY, DriverAssert.noOpWebContext()).close()) .doesNotThrowAnyException(); diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java index 4f0526754..55200431a 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java @@ -27,7 +27,7 @@ import sdmxdl.provider.ri.drivers.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -55,7 +55,7 @@ public final class BbkDialectDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(BbkDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("BBK") .name("en", "Deutsche Bundesbank") @@ -68,7 +68,7 @@ public final class BbkDialectDriver implements Driver { .build()) .build(); - private static RiRestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RiRestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( HasMarker.of(s), s.getEndpoint().toURL(), @@ -116,7 +116,7 @@ protected URLQueryBuilder onMeta(URL endpoint, String resourcePath, ResourceRef< @SdmxFix(id = 4, category = QUERY, cause = "Data does not support providerRef") @Override - protected URLQueryBuilder onData(URL endpoint, String resourcePath, DataflowRef flowRef, Key key, String providerRef) { + protected URLQueryBuilder onData(URL endpoint, String resourcePath, FlowRef flowRef, Key key, String providerRef) { return URLQueryBuilder .of(endpoint) .path(resourcePath) @@ -126,8 +126,8 @@ protected URLQueryBuilder onData(URL endpoint, String resourcePath, DataflowRef @SdmxFix(id = 5, category = QUERY, cause = "Data detail parameter for series-keys-only has a typo") @Override - protected void applyFilter(DataDetail detail, URLQueryBuilder result) { - if (detail.equals(DataDetail.SERIES_KEYS_ONLY)) { + protected void applyFilter(Detail detail, URLQueryBuilder result) { + if (detail.equals(Detail.SERIES_KEYS_ONLY)) { result.param(DETAIL_PARAM, "serieskeyonly"); } else { super.applyFilter(detail, result); diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java index d2900bb28..e34b7dd56 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatDialectDriver.java @@ -25,7 +25,7 @@ import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -53,7 +53,7 @@ public final class DotStatDialectDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(DotStatDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("OECD") .name("en", "The Organisation for Economic Co-operation and Development") @@ -66,7 +66,7 @@ public final class DotStatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/OECD") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/oecd") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SE") .name("en", "Statistics Estonia") @@ -77,7 +77,7 @@ public final class DotStatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SE") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/se") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("UIS") .name("en", "Unesco Institute for Statistics") @@ -88,7 +88,7 @@ public final class DotStatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/UIS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/uis") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("UKDS") .name("en", "UK Data Service") @@ -100,7 +100,7 @@ public final class DotStatDialectDriver implements Driver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, new DotStatRestQueries(), new DotStatRestParsers(), DOTSTAT_FEATURES); } diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java index 57b4cf4a6..0947bad6f 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestParsers.java @@ -30,7 +30,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().map(DotStatRestParsers::getFlowFromStructure).collect(Collectors.toList())); } @@ -41,7 +41,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref) { + public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull FlowRef ref) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().map(DotStatRestParsers::getFlowFromStructure).findFirst()); } @@ -52,7 +52,7 @@ public class DotStatRestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref) { + public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull StructureRef ref) { return SdmxXmlStreams.struct20(langs) .andThen(structs -> structs.stream().findFirst()); } @@ -64,8 +64,8 @@ public class DotStatRestParsers implements RiRestParsers { @SdmxFix(id = 1, category = CONTENT, cause = "Time dimension is always TIME in data") @Override - public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull DataStructure dsd, @NonNull Supplier dataFactory) { - DataStructure modifiedDsd = dsd.toBuilder().timeDimensionId("TIME").build(); + public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull Structure dsd, @NonNull Supplier dataFactory) { + Structure modifiedDsd = dsd.toBuilder().timeDimensionId("TIME").build(); return SdmxXmlStreams.compactData20(modifiedDsd, dataFactory); } @@ -79,11 +79,11 @@ public class DotStatRestParsers implements RiRestParsers { throw new UnsupportedOperationException("codelist"); } - public static @NonNull Dataflow getFlowFromStructure(@NonNull DataStructure o) { - return Dataflow.builder().ref(getFlowRefFromStructureRef(o.getRef())).structureRef(o.getRef()).name(o.getName()).build(); + public static @NonNull Flow getFlowFromStructure(@NonNull Structure o) { + return Flow.builder().ref(getFlowRefFromStructureRef(o.getRef())).structureRef(o.getRef()).name(o.getName()).build(); } - public static @NonNull DataflowRef getFlowRefFromStructureRef(@NonNull DataStructureRef o) { - return DataflowRef.of(o.getAgency(), o.getId(), o.getVersion()); + public static @NonNull FlowRef getFlowRefFromStructureRef(@NonNull StructureRef o) { + return FlowRef.of(o.getAgency(), o.getId(), o.getVersion()); } } diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java index b4d4a47c5..0417d38ce 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java @@ -3,8 +3,8 @@ import internal.util.http.URLQueryBuilder; import lombok.NonNull; import sdmxdl.CodelistRef; -import sdmxdl.DataStructureRef; -import sdmxdl.DataflowRef; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.provider.DataRef; import sdmxdl.provider.ri.drivers.RiRestQueries; @@ -21,7 +21,7 @@ public URLQueryBuilder getFlowsQuery(URL endpoint) { } @Override - public URLQueryBuilder getFlowQuery(URL endpoint, DataflowRef ref) { + public URLQueryBuilder getFlowQuery(URL endpoint, FlowRef ref) { return URLQueryBuilder .of(endpoint) .path(DATASTRUCTURE_RESOURCE) @@ -29,7 +29,7 @@ public URLQueryBuilder getFlowQuery(URL endpoint, DataflowRef ref) { } @Override - public URLQueryBuilder getStructureQuery(URL endpoint, DataStructureRef ref) { + public URLQueryBuilder getStructureQuery(URL endpoint, StructureRef ref) { return URLQueryBuilder .of(endpoint) .path(DATASTRUCTURE_RESOURCE) @@ -37,7 +37,7 @@ public URLQueryBuilder getStructureQuery(URL endpoint, DataStructureRef ref) { } @Override - public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStructureRef dsdRef) { + public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull StructureRef dsdRef) { return URLQueryBuilder .of(endpoint) .path(DATA_RESOURCE) @@ -52,13 +52,13 @@ public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStru } @Override - public DataStructureRef peekStructureRef(DataflowRef ref) { + public StructureRef peekStructureRef(FlowRef ref) { return getStructureRefFromFlowRef(ref); } @NonNull - public static DataStructureRef getStructureRefFromFlowRef(@NonNull DataflowRef o) { - return DataStructureRef.of(o.getAgency(), o.getId(), o.getVersion()); + public static StructureRef getStructureRefFromFlowRef(@NonNull FlowRef o) { + return StructureRef.of(o.getAgency(), o.getId(), o.getVersion()); } public static final String DATASTRUCTURE_RESOURCE = "GetDataStructure"; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java index 389bd4e57..6b0dc8d91 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java @@ -41,7 +41,7 @@ import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -86,7 +86,7 @@ public final class EstatDialectDriver implements Driver { .properties(RI_CONNECTION_PROPERTIES) .propertyOf(ASYNC_MAX_RETRIES_PROPERTY) .propertyOf(ASYNC_SLEEP_TIME_PROPERTY) - .source(SdmxWebSource + .source(WebSource .builder() .id("ESTAT") .alias("EUROSTAT") @@ -99,7 +99,7 @@ public final class EstatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ESTAT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/estat") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ESTAT_COMEXT") .name("en", "Eurostat - International trade in goods statistics (ITGS)") @@ -109,7 +109,7 @@ public final class EstatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ESTAT_COMEXT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/estat_comext") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("EC_DG_COMP") .name("en", "European Commission - Directorate General for Competition") @@ -119,7 +119,7 @@ public final class EstatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/EC_DG_COMP") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ec_dg_comp") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("EC_DG_EMPL") .name("en", "European Commission - Directorate General for Employment, Social Affairs and inclusion") @@ -129,7 +129,7 @@ public final class EstatDialectDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/EC_DG_EMPL") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ec_dg_empl") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("EC_DG_GROW") .name("en", "European Commission - Directorate General for Internal Market, Industry, Entrepreneurship and SMEs") @@ -141,7 +141,7 @@ public final class EstatDialectDriver implements Driver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return new RiRestClient( HasMarker.of(s), s.getEndpoint().toURL(), @@ -158,7 +158,7 @@ private static RestClient newClient(SdmxWebSource s, Languages languages, WebCon @SdmxFix(id = 4, category = QUERY, cause = "Data key parameter does not support 'all' keyword") private static final Set ESTAT_FEATURES = EnumSet.of(Feature.DATA_QUERY_DETAIL); - private static HttpClient getHttpClient(SdmxWebSource s, WebContext c) { + private static HttpClient getHttpClient(WebSource s, WebContext c) { int asyncMaxRetries = ASYNC_MAX_RETRIES_PROPERTY.get(s.getProperties()); long asyncSleepTime = ASYNC_SLEEP_TIME_PROPERTY.get(s.getProperties()); return new InterceptingClient( diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java index 453bd2f97..7c5aac4f8 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java @@ -32,7 +32,7 @@ import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -62,7 +62,7 @@ public final class ImfDialectDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(ImfDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("IMF") .name("en", "International Monetary Fund") @@ -74,7 +74,7 @@ public final class ImfDialectDriver implements Driver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, new ImfQueries(), new ImfParsers(), IMF_FEATURES); } @@ -91,7 +91,7 @@ public URLQueryBuilder getFlowsQuery(URL endpoint) { } @Override - public URLQueryBuilder getStructureQuery(URL endpoint, DataStructureRef ref) { + public URLQueryBuilder getStructureQuery(URL endpoint, StructureRef ref) { return URLQueryBuilder .of(endpoint) .path("DataStructure") @@ -99,7 +99,7 @@ public URLQueryBuilder getStructureQuery(URL endpoint, DataStructureRef ref) { } @Override - public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStructureRef dsdRef) { + public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull StructureRef dsdRef) { return URLQueryBuilder .of(endpoint) .path("CompactData") @@ -111,12 +111,12 @@ public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStru private static final class ImfParsers extends DotStatRestParsers { @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { return SdmxXmlStreams.flow20(langs); } @Override - public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull DataStructure dsd, @NonNull Supplier dataFactory) { + public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull Structure dsd, @NonNull Supplier dataFactory) { return SdmxXmlStreams.compactData20(dsd, dataFactory); } } diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java index 14068d357..0c7ab5a2c 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java @@ -36,7 +36,7 @@ import sdmxdl.provider.ri.drivers.*; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -65,7 +65,7 @@ public final class InseeDialectDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(InseeRestClient::new)) .properties(RI_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("INSEE") .name("en", "National Institute of Statistics and Economic Studies") @@ -99,7 +99,7 @@ private static Dimension fixDimensionCodes(Dimension dimension, IOFunction getDataParser(@NonNull MediaType mediaType, @NonNull DataStructure dsd, @NonNull Supplier dataFactory) { + public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull Structure dsd, @NonNull Supplier dataFactory) { return super.getDataParser(DATA_TYPE, dsd, dataFactory); } } diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java index fba9ed1a3..6cb955641 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java @@ -26,7 +26,7 @@ import nbbrd.design.VisibleForTesting; import nbbrd.io.net.MediaType; import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructureRef; +import sdmxdl.StructureRef; import sdmxdl.Feature; import sdmxdl.Languages; import sdmxdl.format.ObsParser; @@ -39,7 +39,7 @@ import sdmxdl.provider.ri.drivers.Sdmx21RestErrors; import sdmxdl.provider.web.DriverSupport; import sdmxdl.provider.web.RestConnector; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -68,7 +68,7 @@ public final class NbbDialectDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .connector(RestConnector.of(NbbDialectDriver::newClient)) .properties(RI_CONNECTION_PROPERTIES) - .source(SdmxWebSource + .source(WebSource .builder() .id("NBB") .name("en", "National Bank of Belgium") @@ -83,7 +83,7 @@ public final class NbbDialectDriver implements Driver { .build()) .build(); - private static RiRestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RiRestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return newClient( HasMarker.of(s), s.getEndpoint().toURL(), @@ -118,7 +118,7 @@ static final class NbbQueries extends DotStatRestQueries { @SdmxFix(id = 1, category = QUERY, cause = "'/all' must be encoded to '%2Fall'") @Override - public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStructureRef dsdRef) { + public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull StructureRef dsdRef) { return URLQueryBuilder .of(endpoint) .path(DotStatRestQueries.DATA_RESOURCE) diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java index f6e58ae9c..5ed4ab5bb 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java @@ -21,7 +21,7 @@ import sdmxdl.format.xml.SdmxXmlStreams; import sdmxdl.provider.*; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -66,7 +66,7 @@ public final class StatCanDialectDriver implements Driver { .connector(StatCanDialectDriver::newConnection) .properties(RI_CONNECTION_PROPERTIES) .propertyOf(CACHE_TTL_PROPERTY) - .source(SdmxWebSource + .source(WebSource .builder() .id("STATCAN") .name("en", "Statistics Canada") @@ -80,7 +80,7 @@ public final class StatCanDialectDriver implements Driver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { + private static @NonNull Connection newConnection(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { StatCanClient client = new DefaultStatCanClient( HasMarker.of(source), source.getEndpoint().toURL(), @@ -104,44 +104,44 @@ private static final class StatCanConnection implements Connection { private final StatCanClient client; @Override - public @NonNull Collection getFlows() throws IOException { + public @NonNull Collection getFlows() throws IOException { return client.getFlows(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException { Converter.DATAFLOW_REF_VALIDATOR.checkValidity(flowRef); return ConnectionSupport.getFlowFromFlows(flowRef, this, client); } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException { int productId = Converter.fromDataflowRef(flowRef); - DataStructureRef dsdRef = Converter.toDataStructureRef(productId); + StructureRef dsdRef = Converter.toDataStructureRef(productId); return client.getStructAndData(productId) .getStructure(dsdRef) .orElseThrow(() -> CommonSdmxExceptions.missingStructure(client, dsdRef)); } - private Optional getDataSet(DataflowRef ref) throws IOException { + private Optional getDataSet(FlowRef ref) throws IOException { int productId = Converter.fromDataflowRef(ref); return client.getStructAndData(productId).getDataSet(ref); } @MightBePromoted - private static DataSet emptyDataSet(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + private static DataSet emptyDataSet(@NonNull FlowRef flowRef, @NonNull Query query) { return DataSet.builder().ref(flowRef).query(query).build(); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { return getDataSet(flowRef) .map(dataSet -> dataSet.getData(query)) .orElseGet(() -> emptyDataSet(flowRef, query)); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { return getDataSet(flowRef) .map(dataSet -> dataSet.getDataStream(query)) .orElseGet(Stream::empty); @@ -165,7 +165,7 @@ public void close() { @VisibleForTesting interface StatCanClient extends HasMarker { - @NonNull List getFlows() throws IOException; + @NonNull List getFlows() throws IOException; @NonNull DataRepository getStructAndData(int productId) throws IOException; @@ -183,7 +183,7 @@ static class DefaultStatCanClient implements StatCanClient { private final HttpClient client; @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { return Stream.of(getAllCubesListLite()) .map(dataTable -> Converter.toDataFlow(dataTable, langs)) .collect(Collectors.toList()); @@ -266,11 +266,11 @@ static class CachedStatCanClient implements StatCanClient { static @NonNull CachedStatCanClient of( @NonNull StatCanClient client, @NonNull Cache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull Languages languages) { + @NonNull WebSource source, @NonNull Languages languages) { return new CachedStatCanClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } - private static URI getBase(SdmxWebSource source, Languages languages) { + private static URI getBase(WebSource source, Languages languages) { return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @@ -287,12 +287,12 @@ private static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfFlows = initIdOfFlows(base); + private final TypedId> idOfFlows = initIdOfFlows(base); @lombok.Getter(lazy = true) private final TypedId idOfRepo = initIdOfRepo(base); - private static TypedId> initIdOfFlows(URI base) { + private static TypedId> initIdOfFlows(URI base) { return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() @@ -310,7 +310,7 @@ private static TypedId initIdOfRepo(URI base) { } @Override - public List getFlows() throws IOException { + public List getFlows() throws IOException { return getIdOfFlows().load(cache, delegate::getFlows, o -> ttl); } @@ -399,28 +399,28 @@ private int checkProductId(int productId) throws IllegalArgumentException { static final String STRUCT_PREFIX = "Data_Structure_"; static final String VERSION = "1.0"; - static final Validator DATAFLOW_REF_VALIDATOR = dataflowRefOf( + static final Validator DATAFLOW_REF_VALIDATOR = dataflowRefOf( compile("StatCan|all"), compile("DF_\\d+"), compile("1\\.0|latest") ); - static DataflowRef toDataflowRef(int productId) throws IllegalArgumentException { - return DataflowRef.of(AGENCY, FLOW_PREFIX + checkProductId(productId), VERSION); + static FlowRef toDataflowRef(int productId) throws IllegalArgumentException { + return FlowRef.of(AGENCY, FLOW_PREFIX + checkProductId(productId), VERSION); } - static int fromDataflowRef(DataflowRef ref) throws IllegalArgumentException { + static int fromDataflowRef(FlowRef ref) throws IllegalArgumentException { DATAFLOW_REF_VALIDATOR.checkValidity(ref); return checkProductId(Integer.parseInt(ref.getId().substring(FLOW_PREFIX.length()))); } - static DataStructureRef toDataStructureRef(int productId) throws IllegalArgumentException { - return DataStructureRef.of(AGENCY, STRUCT_PREFIX + checkProductId(productId), VERSION); + static StructureRef toDataStructureRef(int productId) throws IllegalArgumentException { + return StructureRef.of(AGENCY, STRUCT_PREFIX + checkProductId(productId), VERSION); } - static Dataflow toDataFlow(DataTable dataTable, Languages langs) { - return Dataflow + static Flow toDataFlow(DataTable dataTable, Languages langs) { + return Flow .builder() .ref(toDataflowRef(dataTable.getProductId())) .structureRef(toDataStructureRef(dataTable.getProductId())) @@ -431,18 +431,18 @@ static Dataflow toDataFlow(DataTable dataTable, Languages langs) { static DataRepository toSdmxRepository(File fullTable, int productId, Languages langs) throws IOException { try (ZipFile zipFile = new ZipFile(fullTable)) { - DataStructure dsd = parseStruct(zipFile, langs); + Structure dsd = parseStruct(zipFile, langs); return DataRepository .builder() .structure(dsd) - .dataSet(parseData(zipFile, dsd).collect(toDataSet(toDataflowRef(productId), DataQuery.ALL))) + .dataSet(parseData(zipFile, dsd).collect(toDataSet(toDataflowRef(productId), Query.ALL))) .build(); } } - private static DataStructure parseStruct(ZipFile file, Languages langs) throws IOException { - FileParser> parser = SdmxXmlStreams.struct21(langs); + private static Structure parseStruct(ZipFile file, Languages langs) throws IOException { + FileParser> parser = SdmxXmlStreams.struct21(langs); try { return file.stream() @@ -457,7 +457,7 @@ private static DataStructure parseStruct(ZipFile file, Languages langs) throws I } } - private static Stream parseData(ZipFile file, DataStructure dsd) throws IOException { + private static Stream parseData(ZipFile file, Structure dsd) throws IOException { FileParser> parser = SdmxXmlStreams.compactData21(dsd, ObsParser::newDefault) .andThen(DataCursor::asCloseableStream); diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java index 906cdd550..0836ab558 100644 --- a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/BbkDialectDriverTest.java @@ -17,9 +17,9 @@ package sdmxdl.provider.dialects.drivers; import org.junit.jupiter.api.Test; -import sdmxdl.DataQuery; -import sdmxdl.DataStructureRef; -import sdmxdl.DataflowRef; +import sdmxdl.Query; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.Key; import sdmxdl.provider.DataRef; import tests.sdmxdl.web.spi.DriverAssert; @@ -28,8 +28,8 @@ import java.net.URL; import static org.assertj.core.api.Assertions.assertThat; -import static sdmxdl.DataDetail.FULL; -import static sdmxdl.DataDetail.SERIES_KEYS_ONLY; +import static sdmxdl.Detail.FULL; +import static sdmxdl.Detail.SERIES_KEYS_ONLY; /** * @author Philippe Charles @@ -51,19 +51,19 @@ public void testQueries() throws MalformedURLException { .describedAs("SdmxFix#1 + SdmxFix#2 + SdmxFix#3") .hasToString("https://api.statistiken.bundesbank.de/rest/metadata/dataflow/BBK"); - assertThat(queries.getFlowQuery(endpoint, DataflowRef.parse("BBEX3")).build()) + assertThat(queries.getFlowQuery(endpoint, FlowRef.parse("BBEX3")).build()) .describedAs("SdmxFix#1 + SdmxFix#2") .hasToString("https://api.statistiken.bundesbank.de/rest/metadata/dataflow/BBK/BBEX3"); - assertThat(queries.getStructureQuery(endpoint, DataStructureRef.parse("BBK_ERX")).build()) + assertThat(queries.getStructureQuery(endpoint, StructureRef.parse("BBK_ERX")).build()) .describedAs("SdmxFix#1 + SdmxFix#2") .hasToString("https://api.statistiken.bundesbank.de/rest/metadata/datastructure/BBK/BBK_ERX?references=children"); - assertThat(queries.getDataQuery(endpoint, DataRef.of(DataflowRef.parse("BBEX3"), DataQuery.builder().key(Key.parse("M.ISK.EUR+USD.CA.AC.A01")).detail(FULL).build()), DataStructureRef.parse("abc")).build()) + assertThat(queries.getDataQuery(endpoint, DataRef.of(FlowRef.parse("BBEX3"), Query.builder().key(Key.parse("M.ISK.EUR+USD.CA.AC.A01")).detail(FULL).build()), StructureRef.parse("abc")).build()) .describedAs("SdmxFix#4") .hasToString("https://api.statistiken.bundesbank.de/rest/data/BBEX3/M.ISK.EUR%2BUSD.CA.AC.A01"); - assertThat(queries.getDataQuery(endpoint, DataRef.of(DataflowRef.parse("BBEX3"), DataQuery.builder().key(Key.parse("M.ISK.EUR+USD.CA.AC.A01")).detail(SERIES_KEYS_ONLY).build()), DataStructureRef.parse("abc")).build()) + assertThat(queries.getDataQuery(endpoint, DataRef.of(FlowRef.parse("BBEX3"), Query.builder().key(Key.parse("M.ISK.EUR+USD.CA.AC.A01")).detail(SERIES_KEYS_ONLY).build()), StructureRef.parse("abc")).build()) .describedAs("SdmxFix#5") .hasToString("https://api.statistiken.bundesbank.de/rest/data/BBEX3/M.ISK.EUR%2BUSD.CA.AC.A01?detail=serieskeyonly"); } diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java index 63ad95d26..3eb8ab851 100644 --- a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java @@ -34,7 +34,7 @@ import static sdmxdl.provider.dialects.drivers.NbbDialectDriver.checkInternalErrorRedirect; import static org.assertj.core.api.Assertions.*; -import static sdmxdl.DataDetail.FULL; +import static sdmxdl.Detail.FULL; /** * @author Philippe Charles @@ -52,7 +52,7 @@ public void testQueries() throws MalformedURLException { NbbDialectDriver.NbbQueries queries = new NbbDialectDriver.NbbQueries(); - assertThat(queries.getDataQuery(endpoint, DataRef.of(DataflowRef.parse("EXR"), DataQuery.builder().key(Key.parse("AUD.M")).detail(FULL).build()), DataStructureRef.parse("abc"))) + assertThat(queries.getDataQuery(endpoint, DataRef.of(FlowRef.parse("EXR"), Query.builder().key(Key.parse("AUD.M")).detail(FULL).build()), StructureRef.parse("abc"))) .describedAs("SdmxFix#1") .hasToString("https://stat.nbb.be/restsdmx/sdmx.ashx/GetData/EXR/AUD.M%2Fall?format=compact_v2"); } diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java index 1efcf21df..4bafbc510 100644 --- a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriverTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import sdmxdl.*; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.DriverAssert; import java.io.File; @@ -36,25 +36,25 @@ public void testCompliance() { @Test public void testConnectionArgs() throws IOException { StatCanDialectDriver driver = new StatCanDialectDriver(); - SdmxWebSource source = driver.getDefaultSources().iterator().next(); + WebSource source = driver.getDefaultSources().iterator().next(); try (Connection connection = driver.connect(source, ANY, DriverAssert.noOpWebContext())) { - DataflowRef badDataflowRef = DataflowRef.parse("F_10100001"); + FlowRef badFlowRef = FlowRef.parse("F_10100001"); String msg = "Expecting DataflowRef id 'F_10100001' to match pattern 'DF_\\d+'"; assertThatIllegalArgumentException() - .isThrownBy(() -> connection.getFlow(badDataflowRef)) + .isThrownBy(() -> connection.getFlow(badFlowRef)) .withMessageContaining(msg); assertThatIllegalArgumentException() - .isThrownBy(() -> connection.getStructure(badDataflowRef)) + .isThrownBy(() -> connection.getStructure(badFlowRef)) .withMessageContaining(msg); assertThatIllegalArgumentException() - .isThrownBy(() -> connection.getData(badDataflowRef, DataQuery.ALL)) + .isThrownBy(() -> connection.getData(badFlowRef, Query.ALL)) .withMessageContaining(msg); assertThatIllegalArgumentException() - .isThrownBy(() -> connection.getDataStream(badDataflowRef, DataQuery.ALL)) + .isThrownBy(() -> connection.getDataStream(badFlowRef, Query.ALL)) .withMessageContaining(msg); } } @@ -78,7 +78,7 @@ class ConverterTest { @Test public void testToDataflowRef() { assertThat(toDataflowRef(1234)) - .isEqualTo(DataflowRef.of("StatCan", "DF_1234", "1.0")); + .isEqualTo(FlowRef.of("StatCan", "DF_1234", "1.0")); assertThatIllegalArgumentException() .isThrownBy(() -> toDataflowRef(-1)) @@ -87,47 +87,47 @@ public void testToDataflowRef() { @Test public void testFromDataflowRef() { - assertThat(fromDataflowRef(DataflowRef.of("StatCan", "DF_1234", "1.0"))) + assertThat(fromDataflowRef(FlowRef.of("StatCan", "DF_1234", "1.0"))) .isEqualTo(1234); - assertThat(fromDataflowRef(DataflowRef.of("all", "DF_1234", "1.0"))) + assertThat(fromDataflowRef(FlowRef.of("all", "DF_1234", "1.0"))) .isEqualTo(1234); - assertThat(fromDataflowRef(DataflowRef.of("StatCan", "DF_1234", "latest"))) + assertThat(fromDataflowRef(FlowRef.of("StatCan", "DF_1234", "latest"))) .isEqualTo(1234); assertThatNullPointerException() .isThrownBy(() -> fromDataflowRef(null)); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("StatCan", "F_1234", "1.0"))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("StatCan", "F_1234", "1.0"))) .withMessage("Expecting DataflowRef id 'F_1234' to match pattern 'DF_\\d+'"); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("tatCan", "DF_1234", "1.0"))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("tatCan", "DF_1234", "1.0"))) .withMessage("Expecting DataflowRef agency 'tatCan' to match pattern 'StatCan|all'"); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("StatCan", "DF_1234", "1."))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("StatCan", "DF_1234", "1."))) .withMessage("Expecting DataflowRef version '1.' to match pattern '1\\.0|latest'"); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("StatCan", "DF_", "1.0"))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("StatCan", "DF_", "1.0"))) .withMessage("Expecting DataflowRef id 'DF_' to match pattern 'DF_\\d+'"); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("StatCan", "DF_1234X", "1.0"))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("StatCan", "DF_1234X", "1.0"))) .withMessage("Expecting DataflowRef id 'DF_1234X' to match pattern 'DF_\\d+'"); assertThatIllegalArgumentException() - .isThrownBy(() -> fromDataflowRef(DataflowRef.of("StatCan", "DF_-1234", "1.0"))) + .isThrownBy(() -> fromDataflowRef(FlowRef.of("StatCan", "DF_-1234", "1.0"))) .withMessage("Expecting DataflowRef id 'DF_-1234' to match pattern 'DF_\\d+'"); } @Test public void testToDataStructureRef() { assertThat(toDataStructureRef(1234)) - .isEqualTo(DataStructureRef.of("StatCan", "Data_Structure_1234", "1.0")); + .isEqualTo(StructureRef.of("StatCan", "Data_Structure_1234", "1.0")); assertThatIllegalArgumentException() .isThrownBy(() -> toDataStructureRef(-1)) diff --git a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java index 501acfbc8..cba587143 100644 --- a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java @@ -28,7 +28,7 @@ import sdmxdl.provider.TypedId; import sdmxdl.provider.ri.drivers.RiHttpUtils; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -62,7 +62,7 @@ public final class PxWebDriver implements Driver { .connector(PxWebDriver::newConnection) .properties(RiHttpUtils.RI_CONNECTION_PROPERTIES) .propertyOf(CACHE_TTL_PROPERTY) - .source(SdmxWebSource + .source(WebSource .builder() .id("STATFIN") .name("en", "Statistics Finland") @@ -74,7 +74,7 @@ public final class PxWebDriver implements Driver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { + private static @NonNull Connection newConnection(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException { PxWebClient client = new DefaultPxWebClient( HasMarker.of(source), source.getId().toLowerCase(Locale.ROOT), @@ -105,28 +105,28 @@ public void testConnection() throws IOException { } @Override - public @NonNull Collection getFlows() throws IOException { + public @NonNull Collection getFlows() throws IOException { return client.getTables(); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException { return ConnectionSupport.getFlowFromFlows(flowRef, this, client); } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException, IllegalArgumentException { + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException, IllegalArgumentException { return client.getMeta(flowRef.getId()); } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException { return ConnectionSupport.getDataSetFromStream(flowRef, query, this); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException, IllegalArgumentException { - DataStructure dsd = client.getMeta(flowRef.getId()); + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException, IllegalArgumentException { + Structure dsd = client.getMeta(flowRef.getId()); DataCursor dataCursor = client.getData(flowRef.getId(), dsd, query.getKey()); return query.execute(dataCursor.asCloseableStream()); } @@ -145,11 +145,11 @@ private interface PxWebClient extends HasMarker { @NonNull Config getConfig() throws IOException; - @NonNull List getTables() throws IOException; + @NonNull List getTables() throws IOException; - @NonNull DataStructure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException; + @NonNull Structure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException; - @NonNull DataCursor getData(@NonNull String tableId, @NonNull DataStructure dsd, @NonNull Key key) throws IOException, IllegalArgumentException; + @NonNull DataCursor getData(@NonNull String tableId, @NonNull Structure dsd, @NonNull Key key) throws IOException, IllegalArgumentException; } @lombok.AllArgsConstructor @@ -186,7 +186,7 @@ private TextParser getConfigParser(MediaType ignore) { } @Override - public @NonNull List getTables() throws IOException { + public @NonNull List getTables() throws IOException { HttpRequest request = HttpRequest .builder() .query(new URL(baseURL, "?query=*&filter=*")) @@ -198,13 +198,13 @@ private TextParser getConfigParser(MediaType ignore) { } } - private TextParser> getTablesParser(MediaType ignore) { + private TextParser> getTablesParser(MediaType ignore) { return Table.JSON_PARSER .andThen(tables -> Stream.of(tables).map(table -> table.toDataflow(dbId)).collect(toList())); } @Override - public @NonNull DataStructure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException { + public @NonNull Structure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException { HttpRequest request = HttpRequest .builder() .query(new URL(baseURL, tableId)) @@ -216,13 +216,13 @@ private TextParser> getTablesParser(MediaType ignore) { } } - private TextParser getMetaParser(String tableId, MediaType ignore) { + private TextParser getMetaParser(String tableId, MediaType ignore) { return TableMeta.JSON_PARSER - .andThen(tableMeta -> tableMeta.toDataStructure(DataStructureRef.of(dbId, tableId, null))); + .andThen(tableMeta -> tableMeta.toDataStructure(StructureRef.of(dbId, tableId, null))); } @Override - public @NonNull DataCursor getData(@NonNull String tableId, @NonNull DataStructure dsd, @NonNull Key key) throws IOException, IllegalArgumentException { + public @NonNull DataCursor getData(@NonNull String tableId, @NonNull Structure dsd, @NonNull Key key) throws IOException, IllegalArgumentException { HttpRequest request = HttpRequest .builder() .query(new URL(baseURL, tableId)) @@ -235,7 +235,7 @@ private TextParser getMetaParser(String tableId, MediaType ignore .parseStream(response::asDisconnectingInputStream); } - private FileParser getDataParser(DataStructure dsd, MediaType ignore) { + private FileParser getDataParser(Structure dsd, MediaType ignore) { return PxWebSdmxDataCursor.parserOf(dsd); } } @@ -245,11 +245,11 @@ private static final class CachedPxWebClient implements PxWebClient { static @NonNull CachedPxWebClient of( @NonNull PxWebClient client, @NonNull Cache cache, long ttlInMillis, - @NonNull SdmxWebSource source, @NonNull Languages languages) { + @NonNull WebSource source, @NonNull Languages languages) { return new CachedPxWebClient(client, cache, getBase(source, languages), Duration.ofMillis(ttlInMillis)); } - private static URI getBase(SdmxWebSource source, Languages languages) { + private static URI getBase(WebSource source, Languages languages) { return TypedId.resolveURI(URI.create("cache:rest"), source.getEndpoint().getHost(), languages.toString()); } @@ -266,19 +266,19 @@ private static URI getBase(SdmxWebSource source, Languages languages) { private final Duration ttl; @lombok.Getter(lazy = true) - private final TypedId> idOfTables = initIdOfTables(base); + private final TypedId> idOfTables = initIdOfTables(base); @lombok.Getter(lazy = true) - private final TypedId idOfMeta = initIdOfMeta(base); + private final TypedId idOfMeta = initIdOfMeta(base); - private static TypedId> initIdOfTables(URI base) { + private static TypedId> initIdOfTables(URI base) { return TypedId.of(base, DataRepository::getFlows, flows -> DataRepository.builder().flows(flows).build() ).with("tables"); } - private static TypedId initIdOfMeta(URI base) { + private static TypedId initIdOfMeta(URI base) { return TypedId.of(base, repo -> repo.getStructures().stream().findFirst().orElse(null), struct -> DataRepository.builder().structure(struct).build() @@ -296,17 +296,17 @@ private static TypedId initIdOfMeta(URI base) { } @Override - public @NonNull List getTables() throws IOException { + public @NonNull List getTables() throws IOException { return getIdOfTables().load(cache, delegate::getTables, o -> ttl); } @Override - public @NonNull DataStructure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException { + public @NonNull Structure getMeta(@NonNull String tableId) throws IOException, IllegalArgumentException { return getIdOfMeta().with(tableId).load(cache, () -> delegate.getMeta(tableId), o -> ttl); } @Override - public @NonNull DataCursor getData(@NonNull String tableId, @NonNull DataStructure dsd, @NonNull Key key) throws IOException, IllegalArgumentException { + public @NonNull DataCursor getData(@NonNull String tableId, @NonNull Structure dsd, @NonNull Key key) throws IOException, IllegalArgumentException { return delegate.getData(tableId, dsd, key); } } @@ -315,7 +315,7 @@ private static TypedId initIdOfMeta(URI base) { @lombok.AllArgsConstructor static final class PxWebSdmxDataCursor implements DataCursor { - public static @NonNull FileParser parserOf(@NonNull DataStructure dsd) { + public static @NonNull FileParser parserOf(@NonNull Structure dsd) { return SdmxXmlStreams .genericData20(fixStructureDimensions(dsd), ObsParser::newDefault) .andThen(PxWebSdmxDataCursor::new); @@ -377,7 +377,7 @@ public void close() throws IOException { delegate.close(); } - private static DataStructure fixStructureDimensions(DataStructure dsd) { + private static Structure fixStructureDimensions(Structure dsd) { return dsd .toBuilder() .clearDimensions() @@ -443,11 +443,11 @@ static class Table { String path; String title; - Dataflow toDataflow(String dbId) { - return Dataflow + Flow toDataflow(String dbId) { + return Flow .builder() - .ref(DataflowRef.of(dbId, id, null)) - .structureRef(DataStructureRef.of(dbId, id, null)) + .ref(FlowRef.of(dbId, id, null)) + .structureRef(StructureRef.of(dbId, id, null)) .name(title) .build(); } @@ -478,8 +478,8 @@ static class TableMeta { List variables; - DataStructure toDataStructure(DataStructureRef ref) { - return DataStructure + Structure toDataStructure(StructureRef ref) { + return Structure .builder() .ref(ref) .timeDimensionId(toTimeDimensionId()) @@ -568,7 +568,7 @@ static class TableQuery { @lombok.Singular Map> itemFilters; - static TableQuery fromDataStructureAndKey(DataStructure dsd, Key key) { + static TableQuery fromDataStructureAndKey(Structure dsd, Key key) { return new TableQuery(CollectionUtil.indexedStreamOf(dsd.getDimensionList()) .collect(Collectors.toMap( dimension -> dimension.getElement().getId(), diff --git a/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java b/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java index 3c783925e..5c89475c0 100644 --- a/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java +++ b/sdmx-dl-provider-px/src/test/java/sdmxdl/provider/px/drivers/PxWebDriverTest.java @@ -2,7 +2,7 @@ import org.assertj.core.data.Index; import org.junit.jupiter.api.Test; -import sdmxdl.DataStructureRef; +import sdmxdl.StructureRef; import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; @@ -56,7 +56,7 @@ public void testTableMeta() throws IOException { assertThat(o.isTime()).isTrue(); }, Index.atIndex(2)); - assertThat(meta.toDataStructure(DataStructureRef.parse("hello"))) + assertThat(meta.toDataStructure(StructureRef.parse("hello"))) .satisfies(o -> { assertThat(o.getDimensions()).hasSize(3); }); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java index 8d860b4db..d8a4d59eb 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/authenticators/WinPasswordVaultAuthenticator.java @@ -5,7 +5,7 @@ import nbbrd.design.DirectImpl; import nbbrd.io.sys.OS; import nbbrd.service.ServiceProvider; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Authenticator; import java.io.IOException; @@ -26,7 +26,7 @@ public boolean isAuthenticatorAvailable() { } @Override - public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSource source) throws IOException { + public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull WebSource source) throws IOException { try (WinPasswordVault vault = WinPasswordVault.open()) { String message = "Enter your credentials for " + source.getId(); return toPasswordAuthentication(vault.getOrPrompt(getResource(source), message, false)); @@ -34,13 +34,13 @@ public PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull SdmxWebSo } @Override - public void invalidateAuthentication(@NonNull SdmxWebSource source) throws IOException { + public void invalidateAuthentication(@NonNull WebSource source) throws IOException { try (WinPasswordVault vault = WinPasswordVault.open()) { vault.invalidate(getResource(source)); } } - private String getResource(SdmxWebSource source) { + private String getResource(WebSource source) { return "sdmx-dl:" + source.getEndpoint().getHost(); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java index f3d409978..ad042d7b4 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/caching/RiCaching.java @@ -14,7 +14,7 @@ import sdmxdl.EventListener; import sdmxdl.HasExpiration; import sdmxdl.ext.Cache; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.format.DiskCache; import sdmxdl.format.DiskCachingSupport; @@ -25,7 +25,7 @@ import sdmxdl.provider.Slow; import sdmxdl.provider.ext.DualCache; import sdmxdl.web.MonitorReports; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebCaching; import java.io.File; @@ -88,9 +88,9 @@ public int getWebCachingRank() { @Override public @NonNull Cache getDriverCache( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { Function function = PropertiesSupport.asFunction(source); @@ -108,9 +108,9 @@ public int getWebCachingRank() { @Override public @NonNull Cache getMonitorCache( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { Function function = PropertiesSupport.asFunction(source); @@ -143,9 +143,9 @@ public int getFileCachingRank() { @Override public @NonNull Cache getReaderCache( - @NonNull SdmxFileSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull FileSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { Function function = PropertiesSupport.asFunction(source); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java index fc0cfc755..b0b8b6ef1 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/FileRiDriver.java @@ -12,10 +12,10 @@ import sdmxdl.*; import sdmxdl.ext.Cache; import sdmxdl.file.SdmxFileManager; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileCaching; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebCaching; import sdmxdl.web.spi.WebContext; @@ -50,7 +50,7 @@ public final class FileRiDriver implements Driver { private final SdmxFileManager fileManager = SdmxFileManager.ofServiceLoader(); - private @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { + private @NonNull Connection newConnection(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) throws IOException, IllegalArgumentException { return fileManager .toBuilder() .onEvent(context.getOnEvent() != null ? (fileSource, marker, message) -> context.getOnEvent().accept(source, marker, message) : null) @@ -64,11 +64,11 @@ private static final class FileCachingAdapter implements FileCaching { private final @NonNull WebCaching delegate; - private final @NonNull SdmxWebSource webSource; + private final @NonNull WebSource webSource; - private final @Nullable EventListener onWebEvent; + private final @Nullable EventListener onWebEvent; - private final @Nullable ErrorListener onWebError; + private final @Nullable ErrorListener onWebError; @Override public @NonNull String getFileCachingId() { @@ -81,7 +81,7 @@ public int getFileCachingRank() { } @Override - public @NonNull Cache getReaderCache(@NonNull SdmxFileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { + public @NonNull Cache getReaderCache(@NonNull FileSource ignoreSource, @Nullable EventListener ignoreEvent, @Nullable ErrorListener ignoreError) { return new FileCacheAdapter(delegate.getDriverCache(webSource, onWebEvent, onWebError)); } @@ -112,8 +112,8 @@ public void put(@NonNull String key, @NonNull DataRepository value) { } } - private static SdmxFileSource toFileSource(SdmxWebSource source) throws IOException { - return SdmxFileSource + private static FileSource toFileSource(WebSource source) throws IOException { + return FileSource .builder() .data(toFile(source.getEndpoint())) .structure(toFile(STRUCTURE_URI_PROPERTY.get(source.getProperties()))) diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java index 203bfed40..fd645f8e0 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java @@ -30,7 +30,7 @@ import sdmxdl.EventListener; import sdmxdl.Languages; import sdmxdl.provider.web.WebEvents; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Authenticator; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.WebContext; @@ -79,7 +79,7 @@ public class RiHttpUtils { .build(); } - public static @NonNull HttpClient newClient(@NonNull SdmxWebSource source, @NonNull WebContext context) { + public static @NonNull HttpClient newClient(@NonNull WebSource source, @NonNull WebContext context) { return newClient(newContext(source, context)); } @@ -93,7 +93,7 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl return new DumpingClient(dumpFolder.toPath(), client, file -> context.getListener().onEvent("Dumping '" + file + "'")); } - public static @NonNull HttpContext newContext(@NonNull SdmxWebSource source, @NonNull WebContext context) { + public static @NonNull HttpContext newContext(@NonNull WebSource source, @NonNull WebContext context) { Network network = context.getNetwork(source); return HttpContext .builder() @@ -150,12 +150,12 @@ public void onEvent(@NonNull String message) { private static final class RiHttpAuthenticator implements HttpAuthenticator { @lombok.NonNull - private final SdmxWebSource source; + private final WebSource source; @lombok.NonNull private final List authenticators; - private final @Nullable EventListener listener; + private final @Nullable EventListener listener; @Override public @Nullable PasswordAuthentication getPasswordAuthentication(URL url) { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java index 6a165646e..4c40660ae 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java @@ -27,7 +27,7 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.web.RestClient; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebContext; import java.io.IOException; @@ -47,7 +47,7 @@ @lombok.RequiredArgsConstructor public class RiRestClient implements RestClient { - public static @NonNull RiRestClient of(@NonNull SdmxWebSource s, @NonNull Languages languages, @NonNull WebContext c, + public static @NonNull RiRestClient of(@NonNull WebSource s, @NonNull Languages languages, @NonNull WebContext c, @NonNull RiRestQueries queries, @NonNull RiRestParsers parsers, @NonNull Set supportedFeatures) throws IOException { return new RiRestClient( HasMarker.of(s), @@ -73,22 +73,22 @@ public class RiRestClient implements RestClient { protected final Set supportedFeatures; @Override - public @NonNull List getFlows() throws IOException { + public @NonNull List getFlows() throws IOException { return getFlows(getFlowsQuery()); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef ref) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef ref) throws IOException { return getFlow(getFlowQuery(ref), ref); } @Override - public @NonNull DataStructure getStructure(@NonNull DataStructureRef ref) throws IOException { + public @NonNull Structure getStructure(@NonNull StructureRef ref) throws IOException { return getStructure(getStructureQuery(ref), ref); } @Override - public @NonNull Stream getData(@NonNull DataRef ref, @NonNull DataStructure dsd) throws IOException { + public @NonNull Stream getData(@NonNull DataRef ref, @NonNull Structure dsd) throws IOException { return getData(getDataQuery(ref, dsd.getRef()), dsd); } @@ -113,7 +113,7 @@ protected URL getFlowsQuery() throws IOException { } @NonNull - protected List getFlows(@NonNull URL url) throws IOException { + protected List getFlows(@NonNull URL url) throws IOException { HttpRequest request = RiHttpUtils.newRequest(url, parsers.getFlowsTypes(), langs); try (HttpResponse response = httpClient.send(request)) { return parsers @@ -128,12 +128,12 @@ protected List getFlows(@NonNull URL url) throws IOException { } @NonNull - protected URL getFlowQuery(@NonNull DataflowRef ref) throws IOException { + protected URL getFlowQuery(@NonNull FlowRef ref) throws IOException { return queries.getFlowQuery(endpoint, ref).build(); } @NonNull - protected Dataflow getFlow(@NonNull URL url, @NonNull DataflowRef ref) throws IOException { + protected Flow getFlow(@NonNull URL url, @NonNull FlowRef ref) throws IOException { HttpRequest request = RiHttpUtils.newRequest(url, parsers.getFlowTypes(), langs); try (HttpResponse response = httpClient.send(request)) { return parsers @@ -149,12 +149,12 @@ protected Dataflow getFlow(@NonNull URL url, @NonNull DataflowRef ref) throws IO } @NonNull - protected URL getStructureQuery(@NonNull DataStructureRef ref) throws IOException { + protected URL getStructureQuery(@NonNull StructureRef ref) throws IOException { return queries.getStructureQuery(endpoint, ref).build(); } @NonNull - protected DataStructure getStructure(@NonNull URL url, @NonNull DataStructureRef ref) throws IOException { + protected Structure getStructure(@NonNull URL url, @NonNull StructureRef ref) throws IOException { HttpRequest request = RiHttpUtils.newRequest(url, parsers.getStructureTypes(), langs); try (HttpResponse response = httpClient.send(request)) { return parsers @@ -170,12 +170,12 @@ protected DataStructure getStructure(@NonNull URL url, @NonNull DataStructureRef } @NonNull - protected URL getDataQuery(@NonNull DataRef ref, @NonNull DataStructureRef dsdRef) throws IOException { + protected URL getDataQuery(@NonNull DataRef ref, @NonNull StructureRef dsdRef) throws IOException { return queries.getDataQuery(endpoint, ref, dsdRef).build(); } @NonNull - protected Stream getData(@NonNull URL url, @NonNull DataStructure dsd) throws IOException { + protected Stream getData(@NonNull URL url, @NonNull Structure dsd) throws IOException { HttpRequest request = RiHttpUtils.newRequest(url, parsers.getDataTypes(), langs); try { HttpResponse response = httpClient.send(request); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java index 377af942e..4c670c8f5 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestParsers.java @@ -17,19 +17,19 @@ public interface RiRestParsers { @NonNull List getFlowsTypes(); - @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs); + @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs); @NonNull List getFlowTypes(); - @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref); + @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull FlowRef ref); @NonNull List getStructureTypes(); - @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref); + @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull StructureRef ref); @NonNull List getDataTypes(); - @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull DataStructure dsd, @NonNull Supplier dataFactory); + @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull Structure dsd, @NonNull Supplier dataFactory); @NonNull List getCodelistTypes(); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java index 2d27a00fe..552006764 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java @@ -4,8 +4,8 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.CodelistRef; -import sdmxdl.DataStructureRef; -import sdmxdl.DataflowRef; +import sdmxdl.StructureRef; +import sdmxdl.FlowRef; import sdmxdl.provider.DataRef; import java.net.URL; @@ -14,13 +14,13 @@ public interface RiRestQueries { @NonNull URLQueryBuilder getFlowsQuery(@NonNull URL endpoint); - @NonNull URLQueryBuilder getFlowQuery(@NonNull URL endpoint, @NonNull DataflowRef ref); + @NonNull URLQueryBuilder getFlowQuery(@NonNull URL endpoint, @NonNull FlowRef ref); - @NonNull URLQueryBuilder getStructureQuery(@NonNull URL endpoint, @NonNull DataStructureRef ref); + @NonNull URLQueryBuilder getStructureQuery(@NonNull URL endpoint, @NonNull StructureRef ref); - @NonNull URLQueryBuilder getDataQuery(@NonNull URL endpoint, @NonNull DataRef ref, @NonNull DataStructureRef dsdRef); + @NonNull URLQueryBuilder getDataQuery(@NonNull URL endpoint, @NonNull DataRef ref, @NonNull StructureRef dsdRef); @NonNull URLQueryBuilder getCodelistQuery(@NonNull URL endpoint, @NonNull CodelistRef ref); - @Nullable DataStructureRef peekStructureRef(@NonNull DataflowRef ref); + @Nullable StructureRef peekStructureRef(@NonNull FlowRef ref); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java index ea192fac5..ea3247848 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RngRiDriver.java @@ -12,7 +12,7 @@ import sdmxdl.provider.HasMarker; import sdmxdl.provider.Marker; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -50,7 +50,7 @@ public final class RngRiDriver implements Driver { .rank(NATIVE_DRIVER_RANK) .availability(ENABLE::get) .connector(RngRiDriver::newConnection) - .source(SdmxWebSource + .source(WebSource .builder() .id("RNG") .name("en", "Random number generator") @@ -59,7 +59,7 @@ public final class RngRiDriver implements Driver { .build()) .build(); - private static @NonNull Connection newConnection(@NonNull SdmxWebSource source, @NonNull Languages languages, @NonNull WebContext context) { + private static @NonNull Connection newConnection(@NonNull WebSource source, @NonNull Languages languages, @NonNull WebContext context) { RngDriverId config = RngDriverId.parse(source.getEndpoint()); return new RngConnection(HasMarker.of(source), config); @@ -114,21 +114,21 @@ public void testConnection() { } @Override - public @NonNull Collection getFlows() { - return singleton(Dataflow.builder().ref(DataflowRef.parse("RNG")).structureRef(DataStructureRef.parse("STRUCT_RNG")).name("RNG").build()); + public @NonNull Collection getFlows() { + return singleton(Flow.builder().ref(FlowRef.parse("RNG")).structureRef(StructureRef.parse("STRUCT_RNG")).name("RNG").build()); } @Override - public @NonNull Dataflow getFlow(@NonNull DataflowRef flowRef) throws IOException { + public @NonNull Flow getFlow(@NonNull FlowRef flowRef) throws IOException { return ConnectionSupport.getFlowFromFlows(flowRef, this, this); } @Override - public @NonNull DataStructure getStructure(@NonNull DataflowRef flowRef) throws IOException { - Dataflow dataflow = getFlow(flowRef); - return DataStructure + public @NonNull Structure getStructure(@NonNull FlowRef flowRef) throws IOException { + Flow flow = getFlow(flowRef); + return Structure .builder() - .ref(dataflow.getStructureRef()) + .ref(flow.getStructureRef()) .dimension(Dimension .builder() .id(FREQ) @@ -161,16 +161,16 @@ public void testConnection() { } @Override - public @NonNull DataSet getData(@NonNull DataflowRef flowRef, @NonNull DataQuery query) throws IOException { + public @NonNull DataSet getData(@NonNull FlowRef flowRef, @NonNull Query query) throws IOException { return ConnectionSupport.getDataSetFromStream(flowRef, query, this); } @Override - public @NonNull Stream getDataStream(@NonNull DataflowRef flowRef, @NonNull DataQuery query) { + public @NonNull Stream getDataStream(@NonNull FlowRef flowRef, @NonNull Query query) { return Freq.stream().flatMap(freq -> newSeriesStream(freq, query)); } - private Stream newSeriesStream(Freq freq, DataQuery query) { + private Stream newSeriesStream(Freq freq, Query query) { return IntStream .range(0, config.getSeriesCount()) .mapToObj(series -> Key.of(freq.name(), String.valueOf(series))) @@ -178,7 +178,7 @@ private Stream newSeriesStream(Freq freq, DataQuery query) { .map(key -> newSeries(key, freq, query.getDetail())); } - private Series newSeries(Key key, Freq freq, DataDetail detail) { + private Series newSeries(Key key, Freq freq, Detail detail) { Series.Builder result = Series.builder().key(key); if (!detail.isIgnoreData()) { int series = Integer.parseInt(key.get(1)); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java index f11397897..2e3bf5081 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsers.java @@ -32,7 +32,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { + public @NonNull FileParser> getFlowsParser(@NonNull MediaType mediaType, @NonNull Languages langs) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.flow21(langs), mediaType.getCharset()); @@ -47,7 +47,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataflowRef ref) { + public @NonNull FileParser> getFlowParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull FlowRef ref) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.flow21(langs).andThen(getResourceSelector(ref)), mediaType.getCharset()); @@ -62,7 +62,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull DataStructureRef ref) { + public @NonNull FileParser> getStructureParser(@NonNull MediaType mediaType, @NonNull Languages langs, @NonNull StructureRef ref) { if (mediaType.isCompatibleWithoutParameters(STRUCTURE_21) || mediaType.isCompatibleWithoutParameters(APPLICATION_XML_UTF_8)) { return withCharset(SdmxXmlStreams.struct21(langs).andThen(getResourceSelector(ref)), mediaType.getCharset()); @@ -77,7 +77,7 @@ public class Sdmx21RestParsers implements RiRestParsers { } @Override - public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull DataStructure dsd, @NonNull Supplier dataFactory) { + public @NonNull FileParser getDataParser(@NonNull MediaType mediaType, @NonNull Structure dsd, @NonNull Supplier dataFactory) { if (mediaType.isCompatibleWithoutParameters(GENERIC_DATA_21)) { return withCharset(SdmxXmlStreams.genericData21(dsd, dataFactory), mediaType.getCharset()); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java index 804343b09..968235b1a 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java @@ -21,20 +21,20 @@ public URLQueryBuilder getFlowsQuery(URL endpoint) { } @Override - public URLQueryBuilder getFlowQuery(URL endpoint, DataflowRef ref) { + public URLQueryBuilder getFlowQuery(URL endpoint, FlowRef ref) { return onMeta(endpoint, DEFAULT_DATAFLOW_PATH, ref) .trailingSlash(trailingSlashRequired); } @Override - public URLQueryBuilder getStructureQuery(URL endpoint, DataStructureRef ref) { + public URLQueryBuilder getStructureQuery(URL endpoint, StructureRef ref) { return onMeta(endpoint, DEFAULT_DATASTRUCTURE_PATH, ref) .param(REFERENCES_PARAM, "children") .trailingSlash(trailingSlashRequired); } @Override - public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStructureRef dsdRef) { + public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull StructureRef dsdRef) { URLQueryBuilder result = onData(endpoint, DEFAULT_DATA_PATH, ref.getFlowRef(), ref.getQuery().getKey(), DEFAULT_PROVIDER_REF); applyFilter(ref.getQuery().getDetail(), result); return result.trailingSlash(trailingSlashRequired); @@ -47,11 +47,11 @@ public URLQueryBuilder getDataQuery(URL endpoint, DataRef ref, @NonNull DataStru } @Override - public DataStructureRef peekStructureRef(DataflowRef ref) { + public StructureRef peekStructureRef(FlowRef ref) { return null; } - protected void applyFilter(DataDetail detail, URLQueryBuilder result) { + protected void applyFilter(Detail detail, URLQueryBuilder result) { switch (detail) { case SERIES_KEYS_ONLY: result.param(DETAIL_PARAM, "serieskeysonly"); @@ -74,7 +74,7 @@ protected URLQueryBuilder onMeta(URL endpoint, String resourcePath, ResourceRef< .path(ref.getVersion()); } - protected URLQueryBuilder onData(URL endpoint, String resourcePath, DataflowRef flowRef, Key key, String providerRef) { + protected URLQueryBuilder onData(URL endpoint, String resourcePath, FlowRef flowRef, Key key, String providerRef) { return URLQueryBuilder .of(endpoint) .path(resourcePath) @@ -93,5 +93,5 @@ protected URLQueryBuilder onData(URL endpoint, String resourcePath, DataflowRef protected static final String REFERENCES_PARAM = "references"; protected static final String DETAIL_PARAM = "detail"; - protected static final DataflowRef FLOWS = DataflowRef.of("all", "all", "latest"); + protected static final FlowRef FLOWS = FlowRef.of("all", "all", "latest"); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java index 15e0be326..4a091b71c 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RiDriver.java @@ -23,7 +23,7 @@ import sdmxdl.provider.web.RestClient; import sdmxdl.provider.web.RestConnector; import sdmxdl.provider.web.DriverSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Driver; import sdmxdl.web.spi.WebContext; @@ -53,7 +53,7 @@ public final class Sdmx21RiDriver implements Driver { .properties(RI_CONNECTION_PROPERTIES) .propertyOf(DETAIL_SUPPORTED_PROPERTY) .propertyOf(TRAILING_SLASH_PROPERTY) - .source(SdmxWebSource + .source(WebSource .builder() .id("ABS") .name("en", "Australian Bureau of Statistics") @@ -64,7 +64,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ABS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/abs") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("BIS") .name("en", "Bank for International Settlements") @@ -75,7 +75,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/BIS") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/bis") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("CAMSTAT") .name("en", "National Institute of Statistics of Cambodia") @@ -86,7 +86,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/CAMSTAT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/camstat") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ECB") .name("en", "European Central Bank") @@ -97,7 +97,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ECB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ecb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ESCAP") .name("en", "Economic and Social Commission for Asia and the Pacific") @@ -108,7 +108,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ESCAP") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/escap") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ILO") .name("en", "International Labour Organization") @@ -121,7 +121,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ILO") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/ilo") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("IMF_SDMX_CENTRAL") .name("en", "International Monetary Fund (SDMX Central)") @@ -133,7 +133,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/IMF_SDMX_CENTRAL") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/imf-sdmx-central") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("INEGI") .name("en", "National Institute of Statistics, Geography and Informatics") @@ -146,7 +146,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/INEGI") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/inegi") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("ISTAT") .name("en", "Italian National Institute of Statistics") @@ -158,7 +158,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/ISTAT") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/istat") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("NB") .name("en", "Norges Bank") @@ -170,7 +170,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/NB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/nb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SGR") .name("en", "SDMX Global Registry") @@ -181,7 +181,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SGR") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/sgr") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SIMEL") .name("en", "El Salvador Labor Market Information System") @@ -193,7 +193,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SIMEL") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/simel") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("SPC") .name("en", "Pacific Data Hub") @@ -205,7 +205,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/SPC") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/spc") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("STATEC") .name("en", "National Institute of statistics and economic studies of the Grand Duchy of Luxembourg") @@ -217,7 +217,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/STATEC") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/statec") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("TNSO") .name("en", "National Statistical Office of Thailand") @@ -229,7 +229,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/TNSO") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/tnso") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("UNDATA") .name("en", "Data access system to UN databases") @@ -240,7 +240,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/UNDATA") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/undata") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("UNICEF") .name("en", "UN International Children's Emergency Fund") @@ -251,7 +251,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/UNICEF") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/unicef") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("WB") .name("en", "World Bank") @@ -265,7 +265,7 @@ public final class Sdmx21RiDriver implements Driver { .monitorOf("upptime:/nbbrd/sdmx-upptime/WB") .monitorWebsiteOf("https://nbbrd.github.io/sdmx-upptime/history/wb") .build()) - .source(SdmxWebSource + .source(WebSource .builder() .id("WITS") .name("en", "World Integrated Trade Solution") @@ -279,22 +279,22 @@ public final class Sdmx21RiDriver implements Driver { .build()) .build(); - private static RestClient newClient(SdmxWebSource s, Languages languages, WebContext c) throws IOException { + private static RestClient newClient(WebSource s, Languages languages, WebContext c) throws IOException { return RiRestClient.of(s, languages, c, getQueries(s), getParsers(s), getSupportedFeatures(s)); } - private static Sdmx21RestQueries getQueries(SdmxWebSource s) { + private static Sdmx21RestQueries getQueries(WebSource s) { return Sdmx21RestQueries .builder() .trailingSlashRequired(TRAILING_SLASH_PROPERTY.get(s.getProperties())) .build(); } - private static Sdmx21RestParsers getParsers(SdmxWebSource s) { + private static Sdmx21RestParsers getParsers(WebSource s) { return new Sdmx21RestParsers(); } - private static Set getSupportedFeatures(SdmxWebSource s) { + private static Set getSupportedFeatures(WebSource s) { return DETAIL_SUPPORTED_PROPERTY.get(s.getProperties()) ? EnumSet.of(Feature.DATA_QUERY_ALL_KEYWORD, Feature.DATA_QUERY_DETAIL) : EnumSet.of(Feature.DATA_QUERY_ALL_KEYWORD); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java index bcd875b16..eb00027c4 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/SourceProperties.java @@ -6,7 +6,7 @@ import nbbrd.io.text.Property; import sdmxdl.format.xml.XmlWebSource; import sdmxdl.provider.PropertiesSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.io.File; import java.io.IOException; @@ -22,7 +22,7 @@ public class SourceProperties { Property.of("sdmxdl.sources", null, Parser.onFile(), Formatter.onFile()); @ReturnNew - public static List loadCustomSources() throws IOException { + public static List loadCustomSources() throws IOException { File sourcesFile = SourceProperties.SOURCES.get(key -> PropertiesSupport.getProperty(emptyMap(), key)); return sourcesFile != null ? XmlWebSource.getParser().parseFile(sourcesFile) : emptyList(); } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java index 1d3fdfbd3..1234833d1 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java @@ -12,7 +12,7 @@ import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorReports; import sdmxdl.web.MonitorStatus; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Monitor; import sdmxdl.web.spi.WebContext; @@ -37,7 +37,7 @@ public final class UpptimeMonitor implements Monitor { } @Override - public @NonNull MonitorReport getReport(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { + public @NonNull MonitorReport getReport(@NonNull WebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { WebMonitors.checkMonitor(source.getMonitor(), getMonitorUriScheme()); UpptimeId id = UpptimeId.parse(source.getMonitor()); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java index 86d0a801d..f9cd4a944 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitor.java @@ -12,7 +12,7 @@ import sdmxdl.provider.web.WebMonitors; import sdmxdl.web.MonitorReport; import sdmxdl.web.MonitorStatus; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Monitor; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.SSLFactory; @@ -45,7 +45,7 @@ public final class UptimeRobotMonitor implements Monitor { } @Override - public @NonNull MonitorReport getReport(@NonNull SdmxWebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { + public @NonNull MonitorReport getReport(@NonNull WebSource source, @NonNull WebContext context) throws IOException, IllegalArgumentException { WebMonitors.checkMonitor(source.getMonitor(), getMonitorUriScheme()); UptimeRobotId id = UptimeRobotId.parse(source.getMonitor()); @@ -99,7 +99,7 @@ private static URI toURI(URL url) throws IOException { } @MightBePromoted - private static T post(URL url, String query, IOFunction factory, WebContext context, SdmxWebSource source, String monitorId) throws IOException { + private static T post(URL url, String query, IOFunction factory, WebContext context, WebSource source, String monitorId) throws IOException { byte[] data = query.getBytes(StandardCharsets.UTF_8); Network network = context.getNetwork(source); diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java index 20e270208..63d670eeb 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/networking/RiNetworking.java @@ -8,7 +8,7 @@ import sdmxdl.ErrorListener; import sdmxdl.EventListener; import sdmxdl.provider.PropertiesSupport; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.Network; import sdmxdl.web.spi.Networking; @@ -60,9 +60,9 @@ public boolean isNetworkingAvailable() { @Override public @NonNull Network getNetwork( - @NonNull SdmxWebSource source, - @Nullable EventListener onEvent, - @Nullable ErrorListener onError) { + @NonNull WebSource source, + @Nullable EventListener onEvent, + @Nullable ErrorListener onError) { RiNetwork result = getNetwork(PropertiesSupport.asFunction(source)); if (onEvent != null) onEvent.accept(source, getNetworkingId(), "Using " + result); return result; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java index 057893afd..6806d2e26 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/Decoder.java @@ -18,7 +18,7 @@ import lombok.NonNull; import sdmxdl.Languages; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.provider.file.FileInfo; import java.io.IOException; @@ -28,5 +28,5 @@ */ public interface Decoder { - @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull Languages languages) throws IOException; + @NonNull FileInfo decode(@NonNull FileSource source, @NonNull Languages languages) throws IOException; } diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java index e9c1364fa..c52517e79 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlDecoder.java @@ -20,10 +20,10 @@ import nbbrd.io.net.MediaType; import nbbrd.io.xml.Xml; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.EventListener; import sdmxdl.Languages; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.format.xml.*; import sdmxdl.provider.file.FileInfo; @@ -36,15 +36,15 @@ @lombok.AllArgsConstructor public final class XmlDecoder implements Decoder { - private final @Nullable EventListener listener; + private final @Nullable EventListener listener; @Override - public @NonNull FileInfo decode(@NonNull SdmxFileSource source, @NonNull Languages langs) throws IOException { + public @NonNull FileInfo decode(@NonNull FileSource source, @NonNull Languages langs) throws IOException { MediaType type = probeDataType(source); return FileInfo.of(type, loadStructure(source, langs, type)); } - private MediaType probeDataType(SdmxFileSource source) throws IOException { + private MediaType probeDataType(FileSource source) throws IOException { if (listener != null) { listener.accept(source, MARKER, "Probing data type from '" + source.getData() + "'"); } @@ -53,13 +53,13 @@ private MediaType probeDataType(SdmxFileSource source) throws IOException { .orElseThrow(() -> new IOException("Cannot probe data type")); } - private DataStructure loadStructure(SdmxFileSource source, Languages langs, MediaType type) throws IOException { + private Structure loadStructure(FileSource source, Languages langs, MediaType type) throws IOException { return XmlFileSource.isValidFile(source.getStructure()) ? parseStruct(type, langs, source) : decodeStruct(type, source); } - private DataStructure parseStruct(MediaType dataType, Languages langs, SdmxFileSource source) throws IOException { + private Structure parseStruct(MediaType dataType, Languages langs, FileSource source) throws IOException { if (listener != null) { listener.accept(source, MARKER, "Parsing structure from '" + source.getStructure() + "' with data type '" + dataType + "'"); } @@ -70,7 +70,7 @@ private DataStructure parseStruct(MediaType dataType, Languages langs, SdmxFileS .orElseThrow(IOException::new); } - private Xml.Parser> getStructParser(MediaType dataType, Languages langs) throws IOException { + private Xml.Parser> getStructParser(MediaType dataType, Languages langs) throws IOException { if (XmlMediaTypes.GENERIC_DATA_20.equals(dataType) || XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_20.equals(dataType)) { return SdmxXmlStreams.struct20(langs); } else if (XmlMediaTypes.GENERIC_DATA_21.equals(dataType) || XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_21.equals(dataType)) { @@ -79,7 +79,7 @@ private Xml.Parser> getStructParser(MediaType dataType, Lang throw new IOException("Don't know how to handle '" + dataType + "'"); } - private DataStructure decodeStruct(MediaType dataType, SdmxFileSource source) throws IOException { + private Structure decodeStruct(MediaType dataType, FileSource source) throws IOException { if (listener != null) { listener.accept(source, MARKER, "Decoding structure from '" + source.getData() + "' with data type '" + dataType + "'"); } @@ -87,7 +87,7 @@ private DataStructure decodeStruct(MediaType dataType, SdmxFileSource source) th .parseFile(source.getData()); } - private static Xml.Parser getStructDecoder(MediaType o) throws IOException { + private static Xml.Parser getStructDecoder(MediaType o) throws IOException { if (XmlMediaTypes.GENERIC_DATA_20.equals(o)) { return DataStructureDecoder.generic20(); } else if (XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_20.equals(o)) { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java index 3e7a77b7c..5f956b889 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlFileClient.java @@ -20,11 +20,11 @@ import nbbrd.io.net.MediaType; import nbbrd.io.xml.Xml; import org.checkerframework.checker.nullness.qual.Nullable; -import sdmxdl.DataStructure; +import sdmxdl.Structure; import sdmxdl.EventListener; import sdmxdl.Languages; import sdmxdl.Series; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.format.DataCursor; import sdmxdl.format.ObsParser; import sdmxdl.format.xml.SdmxXmlStreams; @@ -47,7 +47,7 @@ public class XmlFileClient implements FileClient { @lombok.NonNull - private final SdmxFileSource source; + private final FileSource source; @lombok.NonNull private final Languages languages; @@ -58,7 +58,7 @@ public class XmlFileClient implements FileClient { @Nullable private final Supplier obsFactory; - private final @Nullable EventListener listener; + private final @Nullable EventListener listener; @Override public @NonNull Marker getMarker() { @@ -92,7 +92,7 @@ public void testClient() throws IOException { ); } - private Xml.Parser getDataSupplier(MediaType dataType, DataStructure dsd) throws IOException { + private Xml.Parser getDataSupplier(MediaType dataType, Structure dsd) throws IOException { if (XmlMediaTypes.GENERIC_DATA_20.equals(dataType)) { return SdmxXmlStreams.genericData20(dsd, obsFactory != null ? obsFactory : ObsParser::newDefault); } else if (XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_20.equals(dataType)) { diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java index aa6e77a81..613987894 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/readers/XmlReader.java @@ -4,10 +4,10 @@ import lombok.NonNull; import nbbrd.service.ServiceProvider; import sdmxdl.Connection; -import sdmxdl.DataStructureRef; -import sdmxdl.Dataflow; +import sdmxdl.StructureRef; +import sdmxdl.Flow; import sdmxdl.Languages; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.file.spi.FileContext; import sdmxdl.file.spi.Reader; import sdmxdl.format.ObsParser; @@ -39,12 +39,12 @@ public boolean isReaderAvailable() { } @Override - public boolean canRead(@NonNull SdmxFileSource source) { + public boolean canRead(@NonNull FileSource source) { return isXmlFileName(source.getData()); } @Override - public @NonNull Connection read(@NonNull SdmxFileSource source, @NonNull Languages languages, @NonNull FileContext context) throws IOException, IllegalArgumentException { + public @NonNull Connection read(@NonNull FileSource source, @NonNull Languages languages, @NonNull FileContext context) throws IOException, IllegalArgumentException { if (!canRead(source)) { throw new IllegalArgumentException(source.toString()); } @@ -55,7 +55,7 @@ private boolean isXmlFileName(File file) { return file.toString().toLowerCase(Locale.ROOT).endsWith(".xml"); } - private FileClient getClient(SdmxFileSource source, Languages languages, FileContext context) throws IOException { + private FileClient getClient(FileSource source, Languages languages, FileContext context) throws IOException { FileClient client = new XmlFileClient( source, languages, @@ -66,9 +66,9 @@ private FileClient getClient(SdmxFileSource source, Languages languages, FileCon return CachedFileClient.of(client, context.getReaderCache(source), source, languages); } - private static final DataStructureRef EMPTY = DataStructureRef.of("", "", ""); + private static final StructureRef EMPTY = StructureRef.of("", "", ""); - private Dataflow getDataflow(SdmxFileSource source) { - return Dataflow.builder().ref(source.asDataflowRef()).structureRef(EMPTY).name(SdmxFileSource.asFlowLabel(source)).build(); + private Flow getDataflow(FileSource source) { + return Flow.builder().ref(source.asDataflowRef()).structureRef(EMPTY).name(FileSource.asFlowLabel(source)).build(); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java index 71552904d..d5744fa25 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java @@ -5,8 +5,7 @@ import lombok.NonNull; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.drivers.RiHttpUtils; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import sdmxdl.web.spi.WebContext; import tests.sdmxdl.web.spi.DriverAssert; @@ -28,7 +27,7 @@ public void testFactory() { .isThrownBy(() -> RiHttpUtils.newClient(null)); } - SdmxWebSource source = SdmxWebSource + WebSource source = WebSource .builder() .id("abc") .driver("xyz") @@ -109,7 +108,7 @@ public void testListener() throws MalformedURLException { private static class Event { @lombok.NonNull - SdmxWebSource source; + WebSource source; @lombok.NonNull String message; @@ -125,7 +124,7 @@ public List pop() { return result; } - public void onSourceEvent(@NonNull SdmxWebSource source, @NonNull String marker, @NonNull CharSequence message) { + public void onSourceEvent(@NonNull WebSource source, @NonNull String marker, @NonNull CharSequence message) { events.add(new Event(source, message.toString())); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java index d59d561fd..fcd899b27 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java @@ -5,10 +5,6 @@ import internal.util.http.ext.DumpingClientTest; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.drivers.RiRestClient; -import sdmxdl.provider.ri.drivers.Sdmx21RestErrors; -import sdmxdl.provider.ri.drivers.Sdmx21RestParsers; -import sdmxdl.provider.ri.drivers.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.format.ObsParser; import sdmxdl.provider.Marker; @@ -38,7 +34,7 @@ public void testGetFlow() throws IOException { .isThrownBy(() -> of(onResponseError(HTTP_FORBIDDEN)).getFlow(BAD_FLOW_REF)) .withMessageContaining(String.valueOf(HTTP_FORBIDDEN)); - DataflowRef ref = DataflowRef.of("ECB", "AME", "1.0"); + FlowRef ref = FlowRef.of("ECB", "AME", "1.0"); assertThat(of(onResponseStream(SdmxXmlSources.ECB_DATAFLOWS)).getFlow(ref)).satisfies(dsd -> { assertThat(dsd.getRef()).isEqualTo(ref); } @@ -55,7 +51,7 @@ public void testGetStructure() throws IOException { .isThrownBy(() -> of(onResponseError(HTTP_FORBIDDEN)).getStructure(BAD_STRUCT_REF)) .withMessageContaining(String.valueOf(HTTP_FORBIDDEN)); - DataStructureRef ref = DataStructureRef.of("ECB", "ECB_AME1", "1.0"); + StructureRef ref = StructureRef.of("ECB", "ECB_AME1", "1.0"); assertThat(of(onResponseStream(SdmxXmlSources.ECB_DATA_STRUCTURE)).getStructure(ref)).satisfies(dsd -> { assertThat(dsd.getRef()).isEqualTo(ref); assertThat(dsd.getDimensions()).hasSize(7); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java index fdd27eede..80b669828 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestParsersTest.java @@ -2,9 +2,8 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.drivers.RiRestParsers; -import sdmxdl.Dataflow; -import sdmxdl.DataflowRef; +import sdmxdl.Flow; +import sdmxdl.FlowRef; import java.io.IOException; @@ -22,11 +21,11 @@ public void testGetResourceSelector() throws IOException { assertThatNullPointerException() .isThrownBy(() -> RiRestParsers.getResourceSelector(null)); - DataflowRef fullRef1 = DataflowRef.of("NBB", "XYZ", "v1.0"); - Dataflow resource1 = Dataflow.builder().ref(fullRef1).structureRef(STRUCT_REF).name("flow1").build(); + FlowRef fullRef1 = FlowRef.of("NBB", "XYZ", "v1.0"); + Flow resource1 = Flow.builder().ref(fullRef1).structureRef(STRUCT_REF).name("flow1").build(); - DataflowRef fullRef2 = DataflowRef.of("NBB", "XYZ", "v2.0"); - Dataflow resource2 = Dataflow.builder().ref(fullRef2).structureRef(STRUCT_REF).name("flow2").build(); + FlowRef fullRef2 = FlowRef.of("NBB", "XYZ", "v2.0"); + Flow resource2 = Flow.builder().ref(fullRef2).structureRef(STRUCT_REF).name("flow2").build(); Assertions.assertThat(RiRestParsers.getResourceSelector(fullRef1).applyWithIO(emptyList())) .isEmpty(); @@ -40,7 +39,7 @@ public void testGetResourceSelector() throws IOException { Assertions.assertThat(RiRestParsers.getResourceSelector(fullRef1).applyWithIO(asList(resource2, resource1))) .contains(resource1); - DataflowRef partialRef = DataflowRef.of(null, "XYZ", null); + FlowRef partialRef = FlowRef.of(null, "XYZ", null); Assertions.assertThat(RiRestParsers.getResourceSelector(partialRef).applyWithIO(emptyList())) .isEmpty(); diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java index ffb73b271..2bb3a9850 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RngRiDriverTest.java @@ -2,9 +2,9 @@ import org.junit.jupiter.api.Test; import sdmxdl.Connection; -import sdmxdl.DataQuery; -import sdmxdl.Dataflow; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.Query; +import sdmxdl.Flow; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.DriverAssert; import java.io.IOException; @@ -21,13 +21,13 @@ public void testCompliance() { public static void main(String[] args) throws IOException { RngRiDriver x = new RngRiDriver(); - for (SdmxWebSource source : x.getDefaultSources()) { + for (WebSource source : x.getDefaultSources()) { System.out.println(source); try (Connection conn = x.connect(source, ANY, DriverAssert.noOpWebContext())) { - for (Dataflow dataflow : conn.getFlows()) { - System.out.println(dataflow); - System.out.println(conn.getStructure(dataflow.getRef())); - conn.getDataStream(dataflow.getRef(), DataQuery.ALL) + for (Flow flow : conn.getFlows()) { + System.out.println(flow); + System.out.println(conn.getStructure(flow.getRef())); + conn.getDataStream(flow.getRef(), Query.ALL) .forEach(series -> System.out.println(series.getKey() + " " + series.getObs().size())); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java index cb28f066b..4266b1961 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestParsersTest.java @@ -72,15 +72,15 @@ public void testGetDataTypes() { @Test public void testGetDataParser() throws IOException { - DataStructure dataStructure = SdmxXmlStreams.struct21(ANY).andThen(list -> list.get(0)).parseStream(SdmxXmlSources.ECB_DATA_STRUCTURE::openStream); - BiFunction> extractor = (x, y) -> x.getDataParser(y, dataStructure, ObsParser::newDefault).andThen(Sdmx21RestParsersTest::toDataSet); + Structure structure = SdmxXmlStreams.struct21(ANY).andThen(list -> list.get(0)).parseStream(SdmxXmlSources.ECB_DATA_STRUCTURE::openStream); + BiFunction> extractor = (x, y) -> x.getDataParser(y, structure, ObsParser::newDefault).andThen(Sdmx21RestParsersTest::toDataSet); testParser(DEFAULT_DATA_TYPES, extractor); testContent(extractor, XmlMediaTypes.GENERIC_DATA_21, SdmxXmlSources.ECB_DATA); } private static DataSet toDataSet(DataCursor cursor) throws IOException { try (Stream stream = cursor.asCloseableStream()) { - return stream.collect(DataSet.toDataSet(DataflowRef.parse("abc"), DataQuery.ALL)); + return stream.collect(DataSet.toDataSet(FlowRef.parse("abc"), Query.ALL)); } catch (UncheckedIOException ex) { throw ex.getCause(); } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java index 903631742..6004b9f61 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueriesTest.java @@ -19,7 +19,6 @@ import nbbrd.io.text.Parser; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.drivers.Sdmx21RestQueries; import sdmxdl.*; import sdmxdl.provider.DataRef; @@ -27,8 +26,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNullPointerException; -import static sdmxdl.DataDetail.FULL; -import static sdmxdl.DataDetail.SERIES_KEYS_ONLY; +import static sdmxdl.Detail.FULL; +import static sdmxdl.Detail.SERIES_KEYS_ONLY; /** * @author Philippe Charles @@ -116,14 +115,14 @@ public void testGetDataQuery() { } private final URL base = Parser.onURL().parse("http://base"); - private final DataflowRef specificFlow = DataflowRef.of("ECB", "EXR", "1.0"); - private final DataflowRef genericFlow = DataflowRef.of(null, "EXR", null); - private final DataStructureRef specificStruct = DataStructureRef.of("ECB", "EXR", "1.0"); - private final DataStructureRef genericStruct = DataStructureRef.of(null, "EXR", null); + private final FlowRef specificFlow = FlowRef.of("ECB", "EXR", "1.0"); + private final FlowRef genericFlow = FlowRef.of(null, "EXR", null); + private final StructureRef specificStruct = StructureRef.of("ECB", "EXR", "1.0"); + private final StructureRef genericStruct = StructureRef.of(null, "EXR", null); private final Key key = Key.parse("D.NOK.EUR.SP00.A"); - private final DataStructureRef ignoreDsdRef = DataStructureRef.parse("abc"); + private final StructureRef ignoreDsdRef = StructureRef.parse("abc"); - private static DataQuery newDataQuery(Key key, DataDetail detail) { - return DataQuery.builder().key(key).detail(detail).build(); + private static Query newDataQuery(Key key, Detail detail) { + return Query.builder().key(key).detail(detail).build(); } } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java index d7394f87e..75fe3d256 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UpptimeMonitorTest.java @@ -1,8 +1,7 @@ package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.monitors.UpptimeMonitor; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.MonitorAssert; import static tests.sdmxdl.web.spi.MonitorAssert.assertCompliance; @@ -11,7 +10,7 @@ public class UpptimeMonitorTest { @Test public void testCompliance() { - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver("driver") diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java index 5aec2edc0..05d508e61 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/monitors/UptimeRobotMonitorTest.java @@ -1,8 +1,7 @@ package sdmxdl.provider.ri.monitors; import org.junit.jupiter.api.Test; -import sdmxdl.provider.ri.monitors.UpptimeMonitor; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import tests.sdmxdl.web.spi.MonitorAssert; import static tests.sdmxdl.web.spi.MonitorAssert.assertCompliance; @@ -11,7 +10,7 @@ public class UptimeRobotMonitorTest { @Test public void testCompliance() { - SdmxWebSource validSource = SdmxWebSource + WebSource validSource = WebSource .builder() .id("valid") .driver("driver") diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java index 47a151c05..fc2099a39 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlFileClientTest.java @@ -18,11 +18,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import sdmxdl.provider.ri.readers.Decoder; -import sdmxdl.provider.ri.readers.XmlDecoder; -import sdmxdl.provider.ri.readers.XmlFileClient; import sdmxdl.*; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.format.xml.XmlMediaTypes; import sdmxdl.provider.DataRef; import sdmxdl.provider.file.FileConnection; @@ -50,7 +47,7 @@ public void testCompactData21(@TempDir Path temp) throws IOException { File compact21 = temp.resolve("compact21").toFile(); SdmxXmlSources.OTHER_COMPACT21.copyTo(compact21); - SdmxFileSource source = sourceOf(compact21); + FileSource source = sourceOf(compact21); FileClient x = new XmlFileClient(source, ANY, DECODER, null, null); FileInfo info = x.decode(); @@ -60,7 +57,7 @@ public void testCompactData21(@TempDir Path temp) throws IOException { Key key = Key.of("A", "BEL", "1", "0", "0", "0", "OVGD"); - try (Stream o = x.loadData(info, DataRef.of(source.asDataflowRef(), DataQuery.ALL))) { + try (Stream o = x.loadData(info, DataRef.of(source.asDataflowRef(), Query.ALL))) { assertThat(o) .singleElement() .satisfies(series -> { @@ -83,7 +80,7 @@ public void testCompactData21(@TempDir Path temp) throws IOException { } ConnectionAssert.assertCompliance( - () -> new FileConnection(x, DATAFLOW), + () -> new FileConnection(x, FLOW), ConnectionAssert.Sample .builder() .validFlow(source.asDataflowRef()) @@ -94,10 +91,10 @@ public void testCompactData21(@TempDir Path temp) throws IOException { ); } - public static SdmxFileSource sourceOf(File compact21) { - return SdmxFileSource.builder().data(compact21).build(); + public static FileSource sourceOf(File compact21) { + return FileSource.builder().data(compact21).build(); } public static final Decoder DECODER = new XmlDecoder(null); - public static final Dataflow DATAFLOW = Dataflow.builder().ref(DataflowRef.parse("data")).structureRef(DataStructureRef.parse("xyz")).name("label").build(); + public static final Flow FLOW = Flow.builder().ref(FlowRef.parse("data")).structureRef(StructureRef.parse("xyz")).name("label").build(); } diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java index 26cf94aca..dac5572c1 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/readers/XmlReaderTest.java @@ -2,9 +2,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import sdmxdl.file.SdmxFileSource; +import sdmxdl.file.FileSource; import sdmxdl.format.xml.XmlFileSource; -import sdmxdl.provider.ri.readers.XmlReader; import tests.sdmxdl.file.spi.ReaderAssert; import tests.sdmxdl.format.xml.SdmxXmlSources; @@ -19,9 +18,9 @@ public void testCompliance(@TempDir Path temp) throws IOException { File compact21 = temp.resolve("valid.xml").toFile(); SdmxXmlSources.OTHER_COMPACT21.copyTo(compact21); - SdmxFileSource validSource = SdmxFileSource.builder().data(compact21).build(); + FileSource validSource = FileSource.builder().data(compact21).build(); String validName = XmlFileSource.getFormatter().formatToString(validSource); - SdmxFileSource invalidSource = SdmxFileSource.builder().data(temp.resolve("invalid.csv").toFile()).build(); + FileSource invalidSource = FileSource.builder().data(temp.resolve("invalid.csv").toFile()).build(); String invalidName = "invalid.csv"; ReaderAssert.assertCompliance( diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java index 4529eda83..29dcb7cb5 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/OtherRules.java @@ -65,8 +65,8 @@ boolean isInvalid(WebResponse r) { STRUCT_INVALID_REF { @Override boolean isInvalid(WebResponse r) { - DataStructure dsd = r.getStructure(); - Dataflow flow = r.getFlow(); + Structure dsd = r.getStructure(); + Flow flow = r.getFlow(); return dsd != null && flow != null && !flow.getStructureRef().contains(dsd.getRef()); } }, @@ -101,11 +101,11 @@ boolean isInvalid(WebResponse r) { .orElse(false); } - private boolean hasTimeFormatAttribute(DataStructure dsd) { + private boolean hasTimeFormatAttribute(Structure dsd) { return dsd.getAttributes().stream().map(Attribute::getId).anyMatch("TIME_FORMAT"::equals); } - private boolean hasFreqDimension(DataStructure dsd) { + private boolean hasFreqDimension(Structure dsd) { return dsd.getDimensions().stream().map(Dimension::getId).anyMatch("FREQ"::equals); } }, diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java index 64401213e..e550eadd1 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/RangeRules.java @@ -2,8 +2,8 @@ import nbbrd.design.DirectImpl; import nbbrd.service.ServiceProvider; -import sdmxdl.DataStructure; -import sdmxdl.Dataflow; +import sdmxdl.Structure; +import sdmxdl.Flow; import sdmxdl.Series; import sdmxdl.provider.Validator; @@ -20,10 +20,10 @@ String validateRange(WebResponse r) { return getValidator(r.getRequest()).validate(r.getFlows()); } - private Validator> getValidator(WebRequest request) { + private Validator> getValidator(WebRequest request) { return RangeRules .onRange(request.getFlowCount()) - .compose((Collection o) -> o.size()) + .compose((Collection o) -> o.size()) .onlyIf(Objects::nonNull); } }, @@ -33,10 +33,10 @@ String validateRange(WebResponse r) { return getValidator(r.getRequest()).validate(r.getStructure()); } - private Validator getValidator(WebRequest request) { + private Validator getValidator(WebRequest request) { return RangeRules .onRange(request.getDimensionCount()) - .compose((DataStructure o) -> o.getDimensions().size()) + .compose((Structure o) -> o.getDimensions().size()) .onlyIf(Objects::nonNull); } }, diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java index aad34aea4..5c7f4a661 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebRequest.java @@ -16,8 +16,8 @@ */ package sdmxdl.testing; -import sdmxdl.DataQuery; -import sdmxdl.DataflowRef; +import sdmxdl.Query; +import sdmxdl.FlowRef; import sdmxdl.Languages; /** @@ -36,10 +36,10 @@ public class WebRequest { Languages languages; @lombok.NonNull - DataflowRef flowRef; + FlowRef flowRef; @lombok.NonNull - DataQuery query; + Query query; @lombok.NonNull IntRange flowCount; diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java index 775e518c7..c221f0fdd 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/WebResponse.java @@ -19,11 +19,11 @@ import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.Connection; -import sdmxdl.DataStructure; -import sdmxdl.Dataflow; +import sdmxdl.Flow; +import sdmxdl.Structure; import sdmxdl.Series; import sdmxdl.web.SdmxWebManager; -import sdmxdl.web.SdmxWebSource; +import sdmxdl.web.WebSource; import java.util.Collection; import java.util.logging.Level; @@ -40,19 +40,19 @@ public class WebResponse { WebRequest request; @lombok.NonNull - SdmxWebSource source; + WebSource source; @Nullable String error; @Nullable - Collection flows; + Collection flows; @Nullable - Dataflow flow; + Flow flow; @Nullable - DataStructure structure; + Structure structure; @Nullable Collection data; diff --git a/sdmx-dl-testing/src/main/java/sdmxdl/testing/xml/XmlSourceQuery.java b/sdmx-dl-testing/src/main/java/sdmxdl/testing/xml/XmlSourceQuery.java index 4f909f06d..3e76851f4 100644 --- a/sdmx-dl-testing/src/main/java/sdmxdl/testing/xml/XmlSourceQuery.java +++ b/sdmx-dl-testing/src/main/java/sdmxdl/testing/xml/XmlSourceQuery.java @@ -18,9 +18,9 @@ import nbbrd.io.xml.Stax; import nbbrd.io.xml.Xml; -import sdmxdl.DataDetail; -import sdmxdl.DataQuery; -import sdmxdl.DataflowRef; +import sdmxdl.Detail; +import sdmxdl.Query; +import sdmxdl.FlowRef; import sdmxdl.Key; import sdmxdl.testing.IntRange; import sdmxdl.testing.WebRequest; @@ -63,7 +63,7 @@ private static List toRequests(List list) { .digest(data.getDigest()) .source(source.getName()) .flowRef(flow.getRef()) - .query(DataQuery.builder().key(data.getKey()).detail(DataDetail.FULL).build()) + .query(Query.builder().key(data.getKey()).detail(Detail.FULL).build()) .flowCount(source.getMinFlowCount()) .dimensionCount(flow.getDimensionCount()) .seriesCount(data.getMinSeriesCount()) @@ -118,7 +118,7 @@ private static SourceNode parseEndpoint(XMLStreamReader reader) throws XMLStream private static FlowNode parseFlow(XMLStreamReader reader) throws XMLStreamException { FlowNode.Builder result = FlowNode.builder() - .ref(DataflowRef.parse(reader.getAttributeValue(null, "ref"))) + .ref(FlowRef.parse(reader.getAttributeValue(null, "ref"))) .dimensionCount(parseRange(reader.getAttributeValue(null, "dimCount"))); while (reader.hasNext()) { switch (reader.next()) { @@ -172,7 +172,7 @@ private static class SourceNode { private static class FlowNode { @lombok.NonNull - DataflowRef ref; + FlowRef ref; @lombok.NonNull IntRange dimensionCount; From 1f34c6f00b47b8fba0b3d25bf496f332a5d7680c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 04:32:11 +0000 Subject: [PATCH 080/114] Bump org.checkerframework:checker-qual from 3.37.0 to 3.38.0 Bumps [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) from 3.37.0 to 3.38.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.37.0...checker-framework-3.38.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker-qual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d8212c31..fc6580a0d 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.checkerframework checker-qual - 3.37.0 + 3.38.0 From 68b668d9386f098f0f9d489c23cd1a1db4c7f8b1 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Tue, 12 Sep 2023 12:47:49 +0200 Subject: [PATCH 081/114] Add documentation for standalone module --- docs/content/api/_index.md | 56 +++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/docs/content/api/_index.md b/docs/content/api/_index.md index 44b2cbae5..c5574047a 100644 --- a/docs/content/api/_index.md +++ b/docs/content/api/_index.md @@ -3,9 +3,11 @@ title: "Java library" weight: 1 --- -_work-in-progress_ +![_work-in-progress_](https://img.shields.io/badge/-work_in_progress-E2BC4A) -## Dependency graph +**sdmx-dl library** is designed as a facade for the SDMX model and APIs. + +## Structure overview ```mermaid flowchart BT @@ -24,11 +26,57 @@ flowchart BT dialects px end + subgraph applications + cli + desktop + grpc + end testing - cli formats --> api providers --> formats testing ---> api - cli --> providers & testing + applications --> providers & testing +``` + +## Dependencies setup + +sdmx-dl is **distributed in two flavours**: a **standard JAR hierarchy**, and a **standalone uber JAR** containing all the implementations and their dependencies. +Most of the standalone JAR’s dependencies are shaded i.e. they are hidden in alternative packages. +This allows sdmx-dl to be used in projects with conflicting versions of its dependencies. + +Standard JAR hierarchy: + +```xml + + + com.github.nbbrd.sdmx-dl + sdmx-dl-api + + + com.github.nbbrd.sdmx-dl + sdmx-dl-ri + runtime + + + com.github.nbbrd.sdmx-dl + sdmx-dl-dialects + runtime + + +``` + +Standalone uber JAR: + +```xml + + + com.github.nbbrd.sdmx-dl + sdmx-dl-api + + com.github.nbbrd.sdmx-dl + sdmx-dl-standalone + runtime + + ``` From 9dc2449bba2a709a6a46a0acdc2e8ee9ebf2c0e5 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 13 Sep 2023 13:39:46 +0200 Subject: [PATCH 082/114] Fix heylogs checking scope --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index fc6580a0d..6129a340c 100644 --- a/pom.xml +++ b/pom.xml @@ -189,6 +189,7 @@ check + false true From 427f51345c7f6cecaffa29137d5af97a120f08cb Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 13 Sep 2023 14:39:03 +0200 Subject: [PATCH 083/114] Increase dependabot schedule interval --- .github/dependabot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 821ccec62..1ab93696a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,8 +4,8 @@ updates: target-branch: "develop" directory: "/" schedule: - interval: daily - time: "04:00" + interval: "weekly" + day: "saturday" open-pull-requests-limit: 10 - package-ecosystem: "github-actions" target-branch: "develop" From 5a9e5f6b2fc0942ba0a5a71169db3c17b05992c2 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 13 Sep 2023 17:16:14 +0200 Subject: [PATCH 084/114] Replace Java EA with latest stable version --- .github/workflows/java-ea-maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/java-ea-maven.yml b/.github/workflows/java-ea-maven.yml index 586b2c745..7906c032e 100644 --- a/.github/workflows/java-ea-maven.yml +++ b/.github/workflows/java-ea-maven.yml @@ -11,7 +11,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ '-ea' ] + java: [ 20 ] os: [ ubuntu-latest ] name: JDK${{ matrix.java }} on ${{ matrix.os }} From 75e1c634a9308c90fd2320435c2fe2acc19fa41f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 04:34:17 +0000 Subject: [PATCH 085/114] Bump org.apache.maven.plugins:maven-enforcer-plugin from 3.4.0 to 3.4.1 Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.4.0...enforcer-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6129a340c..f11ecf0c4 100644 --- a/pom.xml +++ b/pom.xml @@ -461,7 +461,7 @@ org.apache.maven.plugins maven-enforcer-plugin - 3.4.0 + 3.4.1 org.kordamp.maven From 8f68b3a00c540eca65a4b0fdc0efbecdd8620f9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Sep 2023 02:30:49 +0000 Subject: [PATCH 086/114] Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.5.0 to 3.6.0 Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.5.0...maven-javadoc-plugin-3.6.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f11ecf0c4..bc733a62b 100644 --- a/pom.xml +++ b/pom.xml @@ -636,7 +636,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.5.0 + 3.6.0 attach-empty-javadocs From 7f8dab02e4982b424b0af2c659f1244c8c13ab9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Sep 2023 02:30:57 +0000 Subject: [PATCH 087/114] Bump quarkus.platform.version from 3.3.1 to 3.3.3 Bumps `quarkus.platform.version` from 3.3.1 to 3.3.3. Updates `io.quarkus.platform:quarkus-bom` from 3.3.1 to 3.3.3 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.1...3.3.3) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.3.1 to 3.3.3 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.1...3.3.3) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index aeb9d7810..ac9ad3314 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.3.1 + 3.3.3 true true From c9301c3c88b4d66df56fbd290874d93ae484dfdf Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 20 Sep 2023 14:58:28 +0200 Subject: [PATCH 088/114] Move http client code to java-io-util project --- pom.xml | 2 +- .../src/main/java/module-info.java | 1 + .../dialects/drivers/BbkDialectDriver.java | 2 +- .../dialects/drivers/DotStatRestQueries.java | 2 +- .../dialects/drivers/EstatDialectDriver.java | 10 +- .../dialects/drivers/ImfDialectDriver.java | 2 +- .../dialects/drivers/NbbDialectDriver.java | 10 +- .../drivers/StatCanDialectDriver.java | 8 +- .../java/_tests/RestClientResponseMock.java | 2 +- .../drivers/NbbDialectDriverTest.java | 2 +- .../src/main/java/module-info.java | 1 + .../provider/px/drivers/PxWebDriver.java | 8 +- sdmx-dl-provider-ri/pom.xml | 22 +- .../internal/util/http/DefaultHttpClient.java | 325 ---------- .../util/http/DisconnectingInputStream.java | 26 - .../internal/util/http/HttpAuthScheme.java | 6 - .../internal/util/http/HttpAuthenticator.java | 18 - .../java/internal/util/http/HttpClient.java | 10 - .../internal/util/http/HttpConstants.java | 65 -- .../java/internal/util/http/HttpContext.java | 73 --- .../internal/util/http/HttpEventListener.java | 24 - .../util/http/HttpHeadersBuilder.java | 73 --- .../java/internal/util/http/HttpImpl.java | 100 --- .../java/internal/util/http/HttpMethod.java | 6 - .../java/internal/util/http/HttpRequest.java | 38 -- .../java/internal/util/http/HttpResponse.java | 22 - .../util/http/HttpResponseException.java | 28 - .../internal/util/http/StreamDecoder.java | 25 - .../internal/util/http/URLQueryBuilder.java | 146 ----- .../internal/util/http/ext/DumpingClient.java | 96 --- .../util/http/ext/InterceptingClient.java | 40 -- .../util/http/ext/TeeInputStream.java | 93 --- .../src/main/java/module-info.java | 3 +- .../provider/ri/drivers/RiHttpUtils.java | 6 +- .../provider/ri/drivers/RiRestClient.java | 8 +- .../provider/ri/drivers/RiRestErrors.java | 2 +- .../provider/ri/drivers/RiRestQueries.java | 2 +- .../provider/ri/drivers/Sdmx21RestErrors.java | 2 +- .../ri/drivers/Sdmx21RestQueries.java | 2 +- .../provider/ri/monitors/UpptimeId.java | 2 +- .../provider/ri/monitors/UpptimeMonitor.java | 2 +- .../provider/ri/monitors/UpptimeSummary.java | 4 +- .../internal/util/http/CurlClientTest.java | 68 -- .../util/http/DefaultHttpClientTest.java | 115 ---- .../internal/util/http/HttpClientTest.java | 593 ------------------ .../internal/util/http/HttpConstantsTest.java | 18 - .../util/http/HttpHeadersBuilderTest.java | 61 -- .../util/http/HttpResponseExceptionTest.java | 44 -- .../internal/util/http/JdkClientTest.java | 45 -- .../util/http/URLQueryBuilderTest.java | 77 --- .../util/http/ext/DumpingClientTest.java | 192 ------ .../util/http/ext/TeeInputStreamTest.java | 28 - .../provider/ri/drivers/RiHttpUtilsTest.java | 8 +- .../provider/ri/drivers/RiRestClientTest.java | 53 +- .../standalone/RuntimeDependenciesTest.java | 10 +- 55 files changed, 107 insertions(+), 2524 deletions(-) delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/DisconnectingInputStream.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthScheme.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthenticator.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpClient.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpConstants.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpEventListener.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpHeadersBuilder.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpImpl.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpMethod.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpRequest.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponse.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponseException.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/StreamDecoder.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/URLQueryBuilder.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/DumpingClient.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/InterceptingClient.java delete mode 100644 sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/TeeInputStream.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpConstantsTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpHeadersBuilderTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpResponseExceptionTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/URLQueryBuilderTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/DumpingClientTest.java delete mode 100644 sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/TeeInputStreamTest.java diff --git a/pom.xml b/pom.xml index bc733a62b..1c75b5e45 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.25 + 0.0.26-SNAPSHOT pom import diff --git a/sdmx-dl-provider-dialects/src/main/java/module-info.java b/sdmx-dl-provider-dialects/src/main/java/module-info.java index 0bf4a0169..5741d1e2d 100644 --- a/sdmx-dl-provider-dialects/src/main/java/module-info.java +++ b/sdmx-dl-provider-dialects/src/main/java/module-info.java @@ -13,6 +13,7 @@ requires sdmxdl.provider.ri; requires sdmxdl.provider.base; requires com.google.gson; + requires nbbrd.io.http; provides Driver with BbkDialectDriver, diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java index 55200431a..cdcd4d9d7 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/BbkDialectDriver.java @@ -16,7 +16,7 @@ */ package sdmxdl.provider.dialects.drivers; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; import nbbrd.service.ServiceProvider; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java index 0417d38ce..76d888d27 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/DotStatRestQueries.java @@ -1,6 +1,6 @@ package sdmxdl.provider.dialects.drivers; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import lombok.NonNull; import sdmxdl.CodelistRef; import sdmxdl.StructureRef; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java index 6b0dc8d91..c9b564629 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/EstatDialectDriver.java @@ -16,11 +16,11 @@ */ package sdmxdl.provider.dialects.drivers; -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import internal.util.http.HttpResponseException; -import internal.util.http.ext.InterceptingClient; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpRequest; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.http.HttpResponseException; +import nbbrd.io.http.ext.InterceptingClient; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.io.Resource; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java index 7c5aac4f8..fd7b4f353 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/ImfDialectDriver.java @@ -18,7 +18,7 @@ import nbbrd.design.DirectImpl; import sdmxdl.provider.ri.drivers.RiRestClient; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import lombok.NonNull; import nbbrd.io.FileParser; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java index 6cb955641..f91f82db3 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/NbbDialectDriver.java @@ -16,11 +16,11 @@ */ package sdmxdl.provider.dialects.drivers; -import internal.util.http.HttpClient; -import internal.util.http.HttpResponse; -import internal.util.http.HttpResponseException; -import internal.util.http.URLQueryBuilder; -import internal.util.http.ext.InterceptingClient; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.http.HttpResponseException; +import nbbrd.io.http.URLQueryBuilder; +import nbbrd.io.http.ext.InterceptingClient; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java index 5ed4ab5bb..896d19d20 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/StatCanDialectDriver.java @@ -1,10 +1,10 @@ package sdmxdl.provider.dialects.drivers; import com.google.gson.*; -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpRequest; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.http.URLQueryBuilder; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.design.MightBePromoted; diff --git a/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java b/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java index 7454cc347..df56605e8 100644 --- a/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java +++ b/sdmx-dl-provider-dialects/src/test/java/_tests/RestClientResponseMock.java @@ -1,6 +1,6 @@ package _tests; -import internal.util.http.HttpResponse; +import nbbrd.io.http.HttpResponse; import lombok.NonNull; import nbbrd.io.function.IORunnable; import nbbrd.io.function.IOSupplier; diff --git a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java index 3eb8ab851..c59f80de7 100644 --- a/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java +++ b/sdmx-dl-provider-dialects/src/test/java/sdmxdl/provider/dialects/drivers/NbbDialectDriverTest.java @@ -18,7 +18,7 @@ import _tests.RestClientResponseMock; import sdmxdl.provider.ri.drivers.RiRestClient; -import internal.util.http.HttpResponseException; +import nbbrd.io.http.HttpResponseException; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; import sdmxdl.*; diff --git a/sdmx-dl-provider-px/src/main/java/module-info.java b/sdmx-dl-provider-px/src/main/java/module-info.java index daa09816b..e04681c8f 100644 --- a/sdmx-dl-provider-px/src/main/java/module-info.java +++ b/sdmx-dl-provider-px/src/main/java/module-info.java @@ -13,6 +13,7 @@ requires sdmxdl.provider.ri; requires sdmxdl.provider.base; requires com.google.gson; + requires nbbrd.io.http; provides Driver with PxWebDriver; diff --git a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java index cba587143..5e402f170 100644 --- a/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java +++ b/sdmx-dl-provider-px/src/main/java/sdmxdl/provider/px/drivers/PxWebDriver.java @@ -1,10 +1,10 @@ package sdmxdl.provider.px.drivers; import com.google.gson.*; -import internal.util.http.HttpClient; -import internal.util.http.HttpMethod; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpMethod; +import nbbrd.io.http.HttpRequest; +import nbbrd.io.http.HttpResponse; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.design.MightBeGenerated; diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index a16ca3ed3..c4879b13e 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -69,6 +69,10 @@ com.github.nbbrd.java-io-util java-io-curl
+ + com.github.nbbrd.java-io-util + java-io-http + io.github.hakky54 sslcontext-kickstart @@ -123,23 +127,5 @@ hamcrest test - - com.github.tomakehurst - wiremock-jre8-standalone - test - - - - org.slf4j - slf4j-nop - ${slf4j.version} - test - - - org.slf4j - slf4j-api - - - \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java deleted file mode 100644 index 4b060a354..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DefaultHttpClient.java +++ /dev/null @@ -1,325 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import lombok.AccessLevel; -import lombok.NonNull; -import nbbrd.design.VisibleForTesting; -import nbbrd.io.net.MediaType; -import sdmxdl.web.spi.URLConnectionFactory; - -import javax.net.ssl.HttpsURLConnection; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.UncheckedIOException; -import java.net.*; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static internal.util.http.HttpConstants.*; -import static java.util.Collections.emptyMap; - -/** - * @author Philippe Charles - */ -@lombok.RequiredArgsConstructor -public final class DefaultHttpClient implements HttpClient { - - @lombok.Getter(value = AccessLevel.PRIVATE) - @lombok.NonNull - private final HttpContext context; - - @lombok.Getter(lazy = true, value = AccessLevel.PRIVATE) - private final URLConnectionFactory lazyFactory = initURLConnectionFactory(); - - private URLConnectionFactory initURLConnectionFactory() { - return getContext().getUrlConnectionFactory().get(); - } - - @Override - public @NonNull HttpResponse send(@NonNull HttpRequest request) throws IOException { - return open(request, 0, getPreemptiveAuthScheme()); - } - - private HttpResponse open(HttpRequest request, int redirects, AuthSchemeHelper requestScheme) throws IOException { - if (!isHttpProtocol(request.getQuery()) && !isHttpsProtocol(request.getQuery())) { - throw new IOException("Unsupported protocol '" + request.getQuery().getProtocol() + "'"); - } - - if (!requestScheme.isSecureRequest(request.getQuery())) { - throw new IOException("Insecure protocol for " + requestScheme + " auth on '" + request.getQuery() + "'"); - } - - Proxy proxy = getProxy(request.getQuery()); - - HttpURLConnection connection = openConnection(request, requestScheme, proxy); - - switch (ResponseType.ofResponseCode(connection.getResponseCode())) { - case REDIRECTION: - return redirect(connection, request, redirects); - case SUCCESSFUL: - return getResponse(connection); - case CLIENT_ERROR: - return recoverClientError(connection, request, redirects, requestScheme); - default: - throw getError(connection); - } - } - - private HttpURLConnection openConnection(HttpRequest request, AuthSchemeHelper requestScheme, Proxy proxy) throws IOException { - HttpURLConnection result = (HttpURLConnection) getLazyFactory().openConnection(request.getQuery(), proxy); - result.setReadTimeout(context.getReadTimeout()); - result.setConnectTimeout(context.getConnectTimeout()); - - if (result instanceof HttpsURLConnection) { - ((HttpsURLConnection) result).setSSLSocketFactory(context.getSslSocketFactory().get()); - ((HttpsURLConnection) result).setHostnameVerifier(context.getHostnameVerifier().get()); - } - - Map> headers = new HttpHeadersBuilder() - .put(HTTP_ACCEPT_HEADER, toAcceptHeader(request.getMediaTypes())) - .put(HTTP_ACCEPT_LANGUAGE_HEADER, request.getLangs()) - .put(HTTP_ACCEPT_ENCODING_HEADER, getEncodingHeader()) - .put(HTTP_USER_AGENT_HEADER, context.getUserAgent()) - .put(requestScheme.getRequestHeaders(request.getQuery(), context.getAuthenticator())) - .build(); - - result.setRequestMethod(request.getMethod().name()); - result.setInstanceFollowRedirects(false); - HttpHeadersBuilder.keyValues(headers) - .forEach(header -> result.setRequestProperty(header.getKey(), header.getValue())); - - if (request.getBody() != null) { - result.setDoOutput(true); - try (OutputStream stream = result.getOutputStream()) { - stream.write(request.getBody()); - } - } - - context.getListener().onOpen(request, proxy, requestScheme.authScheme); - - result.connect(); - - return result; - } - - private String getEncodingHeader() { - return context.getDecoders() - .stream() - .map(StreamDecoder::getName) - .collect(Collectors.joining(", ")); - } - - private AuthSchemeHelper getPreemptiveAuthScheme() { - return context.isPreemptiveAuthentication() ? AuthSchemeHelper.BASIC : AuthSchemeHelper.NONE; - } - - private Proxy getProxy(URL url) throws IOException { - List proxies = context.getProxySelector().get().select(toURI(url)); - return proxies.isEmpty() ? Proxy.NO_PROXY : proxies.get(0); - } - - private HttpResponse redirect(HttpURLConnection connection, HttpRequest request, int redirects) throws IOException { - final URL oldUrl = request.getQuery(); - URL newUrl; - try { - if (redirects == context.getMaxRedirects()) { - throw new IOException("Max redirection reached"); - } - - String location = connection.getHeaderField(HTTP_LOCATION_HEADER); - if (location == null || location.isEmpty()) { - throw new IOException("Missing redirection url"); - } - - newUrl = new URL(oldUrl, URLDecoder.decode(location, StandardCharsets.UTF_8.name())); - } finally { - doClose(connection); - } - - if (isDowngradingProtocolOnRedirect(oldUrl, newUrl)) { - throw new IOException("Downgrading protocol on redirect from '" + oldUrl + "' to '" + newUrl + "'"); - } - - context.getListener().onRedirection(oldUrl, newUrl); - return open(request.toBuilder().query(newUrl).build(), redirects + 1, getPreemptiveAuthScheme()); - } - - private HttpResponse recoverClientError(HttpURLConnection connection, HttpRequest request, int redirects, AuthSchemeHelper requestScheme) throws IOException { - if (connection.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) { - AuthSchemeHelper responseScheme = AuthSchemeHelper.get(connection).orElse(AuthSchemeHelper.BASIC); - if (!requestScheme.equals(responseScheme)) { - context.getListener().onUnauthorized(connection.getURL(), requestScheme.authScheme, responseScheme.authScheme); - return open(request, redirects + 1, responseScheme); - } - context.getAuthenticator().invalidate(connection.getURL()); - } - - throw getError(connection); - } - - private HttpResponse getResponse(HttpURLConnection connection) { - DefaultResponse result = new DefaultResponse(connection, context.getDecoders()); - context.getListener().onSuccess(result::httpContentTypeOrNull); - return result; - } - - private IOException getError(HttpURLConnection connection) throws IOException { - try { - return new HttpResponseException(connection.getResponseCode(), connection.getResponseMessage(), connection.getHeaderFields()); - } finally { - doClose(connection); - } - } - - private static void doClose(HttpURLConnection connection) throws IOException { - try { - connection.disconnect(); - } catch (UncheckedIOException ex) { - throw ex.getCause(); - } - } - - @lombok.AllArgsConstructor - private enum AuthSchemeHelper { - BASIC(HttpAuthScheme.BASIC) { - @Override - boolean isSecureRequest(URL url) { - return isHttpsProtocol(url); - } - - @Override - Map> getRequestHeaders(URL url, HttpAuthenticator authenticator) { - PasswordAuthentication auth = authenticator.getPasswordAuthentication(url); - return auth != null ? new HttpHeadersBuilder().put(HTTP_AUTHORIZATION_HEADER, getBasicAuthHeader(auth)).build() : emptyMap(); - } - - @Override - boolean hasResponseHeader(HttpURLConnection http) { - String value = http.getHeaderField(HTTP_AUTHENTICATE_HEADER); - return value != null && value.startsWith("Basic"); - } - }, - NONE(HttpAuthScheme.NONE) { - @Override - boolean isSecureRequest(URL query) { - return true; - } - - @Override - Map> getRequestHeaders(URL query, HttpAuthenticator authenticator) { - return emptyMap(); - } - - @Override - boolean hasResponseHeader(HttpURLConnection http) { - return false; - } - }; - - private final HttpAuthScheme authScheme; - - abstract boolean isSecureRequest(URL query); - - abstract Map> getRequestHeaders(URL query, HttpAuthenticator authenticator); - - abstract boolean hasResponseHeader(HttpURLConnection http) throws IOException; - - static Optional get(HttpURLConnection http) { - return Stream.of(AuthSchemeHelper.values()) - .filter(authScheme -> { - try { - return authScheme.hasResponseHeader(http); - } catch (IOException exception) { - throw new UncheckedIOException(exception); - } - }) - .findFirst(); - } - - private static String getBasicAuthHeader(PasswordAuthentication auth) { - String basicAuth = auth.getUserName() + ':' + String.valueOf(auth.getPassword()); - return "Basic " + toBase64(basicAuth); - } - - private static String toBase64(String input) { - return Base64.getEncoder().encodeToString(input.getBytes(StandardCharsets.UTF_8)); - } - } - - @lombok.RequiredArgsConstructor - private static final class DefaultResponse implements HttpResponse { - - @lombok.NonNull - private final HttpURLConnection conn; - - @lombok.NonNull - private final List decoders; - - String httpContentTypeOrNull() { - return conn.getHeaderField(HTTP_CONTENT_TYPE_HEADER); - } - - @Override - public @NonNull MediaType getContentType() throws IOException { - String contentTypeOrNull = httpContentTypeOrNull(); - if (contentTypeOrNull == null) { - throw new IOException("Missing content-type in HTTP response header"); - } - try { - return MediaType.parse(contentTypeOrNull); - } catch (IllegalArgumentException ex) { - throw new IOException("Invalid content-type in HTTP response header: '" + contentTypeOrNull + "'", ex); - } - } - - @Override - public @NonNull InputStream getBody() throws IOException { - String encodingOrNull = conn.getHeaderField(HTTP_CONTENT_ENCODING_HEADER); - return decoders - .stream() - .filter(decoder -> decoder.getName().equals(encodingOrNull)) - .findFirst() - .orElse(StreamDecoder.noOp()) - .decode(conn.getInputStream()); - } - - @Override - public void close() throws IOException { - doClose(conn); - } - } - - @VisibleForTesting - static @NonNull String toAcceptHeader(@NonNull List mediaTypes) { - return mediaTypes.stream().map(MediaType::toString).collect(Collectors.joining(", ")); - } - - private static URI toURI(URL url) throws IOException { - try { - return url.toURI(); - } catch (URISyntaxException ex) { - throw new IOException(ex); - } - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DisconnectingInputStream.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/DisconnectingInputStream.java deleted file mode 100644 index b1599ce62..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/DisconnectingInputStream.java +++ /dev/null @@ -1,26 +0,0 @@ -package internal.util.http; - -import lombok.AccessLevel; -import nbbrd.io.Resource; - -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; - -@lombok.RequiredArgsConstructor(access = AccessLevel.PRIVATE) -final class DisconnectingInputStream extends InputStream { - - public static DisconnectingInputStream of(HttpResponse response) throws IOException { - return new DisconnectingInputStream(response.getBody(), response); - } - - @lombok.experimental.Delegate(excludes = Closeable.class) - private final InputStream delegate; - - private final Closeable onClose; - - @Override - public void close() throws IOException { - Resource.closeBoth(delegate, onClose); - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthScheme.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthScheme.java deleted file mode 100644 index c2ec3600c..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthScheme.java +++ /dev/null @@ -1,6 +0,0 @@ -package internal.util.http; - -public enum HttpAuthScheme { - - BASIC, NONE -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthenticator.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthenticator.java deleted file mode 100644 index 005b0fc42..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpAuthenticator.java +++ /dev/null @@ -1,18 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.net.PasswordAuthentication; -import java.net.URL; - -public interface HttpAuthenticator { - - @Nullable PasswordAuthentication getPasswordAuthentication(@NonNull URL url); - - void invalidate(@NonNull URL url); - - static @NonNull HttpAuthenticator noOp() { - return HttpImpl.Authenticators.NONE; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpClient.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpClient.java deleted file mode 100644 index b1f156bac..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpClient.java +++ /dev/null @@ -1,10 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; - -import java.io.IOException; - -public interface HttpClient { - - @NonNull HttpResponse send(@NonNull HttpRequest request) throws IOException; -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpConstants.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpConstants.java deleted file mode 100644 index 8ac512f13..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpConstants.java +++ /dev/null @@ -1,65 +0,0 @@ -package internal.util.http; - -import nbbrd.design.StaticFactoryMethod; - -import java.net.Proxy; -import java.net.URL; - -@lombok.experimental.UtilityClass -public class HttpConstants { - - public static final String HTTP_ACCEPT_HEADER = "Accept"; - - public static final String HTTP_ACCEPT_LANGUAGE_HEADER = "Accept-Language"; - - public static final String HTTP_ACCEPT_ENCODING_HEADER = "Accept-Encoding"; - - public static final String HTTP_LOCATION_HEADER = "Location"; - - public static final String HTTP_AUTHORIZATION_HEADER = "Authorization"; - - public static final String HTTP_AUTHENTICATE_HEADER = "WWW-Authenticate"; - - public static final String HTTP_USER_AGENT_HEADER = "User-Agent"; - - public static final String HTTP_CONTENT_TYPE_HEADER = "Content-Type"; - - public static final String HTTP_CONTENT_ENCODING_HEADER = "Content-Encoding"; - - // https://en.wikipedia.org/wiki/Downgrade_attack - public static boolean isDowngradingProtocolOnRedirect(URL oldUrl, URL newUrl) { - return isHttpsProtocol(oldUrl) && !isHttpsProtocol(newUrl); - } - - public static boolean isHttpsProtocol(URL oldUrl) { - return "https".equalsIgnoreCase(oldUrl.getProtocol()); - } - - public static boolean isHttpProtocol(URL oldUrl) { - return "http".equalsIgnoreCase(oldUrl.getProtocol()); - } - - // https://developer.mozilla.org/en-US/docs/Web/HTTP/Status - public enum ResponseType { - - INFORMATIONAL, SUCCESSFUL, REDIRECTION, CLIENT_ERROR, SERVER_ERROR, UNKNOWN; - - @StaticFactoryMethod - public static ResponseType ofResponseCode(int code) { - switch (code / 100) { - case 1: - return INFORMATIONAL; - case 2: - return SUCCESSFUL; - case 3: - return REDIRECTION; - case 4: - return CLIENT_ERROR; - case 5: - return SERVER_ERROR; - default: - return UNKNOWN; - } - } - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java deleted file mode 100644 index 78d8a2b97..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpContext.java +++ /dev/null @@ -1,73 +0,0 @@ -package internal.util.http; - -import org.checkerframework.checker.index.qual.NonNegative; -import sdmxdl.web.spi.URLConnectionFactory; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLSocketFactory; -import java.net.ProxySelector; -import java.util.List; -import java.util.function.Supplier; - -@lombok.Value -@lombok.Builder(toBuilder = true) -public class HttpContext { - - private static final int NO_TIMEOUT = 0; - - @NonNegative - @lombok.Builder.Default - int readTimeout = NO_TIMEOUT; - - @NonNegative - @lombok.Builder.Default - int connectTimeout = NO_TIMEOUT; - - @NonNegative - @lombok.Builder.Default - int maxRedirects = 20; - - @lombok.NonNull - @lombok.Builder.Default - Supplier proxySelector = ProxySelector::getDefault; - - @lombok.NonNull - @lombok.Builder.Default - Supplier sslSocketFactory = HttpsURLConnection::getDefaultSSLSocketFactory; - - @lombok.NonNull - @lombok.Builder.Default - Supplier hostnameVerifier = HttpsURLConnection::getDefaultHostnameVerifier; - - @lombok.NonNull - @lombok.Builder.Default - Supplier urlConnectionFactory = URLConnectionFactory::getDefault; - - @lombok.NonNull - @lombok.Builder.Default - HttpEventListener listener = HttpEventListener.noOp(); - - @lombok.Singular - List decoders; - - @lombok.NonNull - @lombok.Builder.Default - HttpAuthenticator authenticator = HttpAuthenticator.noOp(); - - @lombok.Builder.Default - boolean preemptiveAuthentication = false; - - @lombok.Builder.Default - String userAgent = null; - - public static Builder builder() { - return new Builder() - .decoder(StreamDecoder.gzip()) - .decoder(StreamDecoder.deflate()); - } - - public static final class Builder { - // Fix javadoc compilation - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpEventListener.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpEventListener.java deleted file mode 100644 index ea641cb2b..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpEventListener.java +++ /dev/null @@ -1,24 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; - -import java.net.Proxy; -import java.net.URL; -import java.util.function.Supplier; - -public interface HttpEventListener { - - void onOpen(@NonNull HttpRequest request, @NonNull Proxy proxy, @NonNull HttpAuthScheme scheme); - - void onSuccess(@NonNull Supplier contentType); - - void onRedirection(@NonNull URL oldUrl, @NonNull URL newUrl); - - void onUnauthorized(@NonNull URL url, @NonNull HttpAuthScheme oldScheme, @NonNull HttpAuthScheme newScheme); - - void onEvent(@NonNull String message); - - static @NonNull HttpEventListener noOp() { - return HttpImpl.EventListeners.NONE; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpHeadersBuilder.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpHeadersBuilder.java deleted file mode 100644 index 05af36862..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpHeadersBuilder.java +++ /dev/null @@ -1,73 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; -import nbbrd.design.BuilderPattern; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.*; -import java.util.function.BiPredicate; -import java.util.function.Function; -import java.util.stream.Collector; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@BuilderPattern(Map.class) -public final class HttpHeadersBuilder { - - private final List> data = new ArrayList<>(); - private BiPredicate filter = HttpHeadersBuilder::valueNotNullNorEmpty; - - private static boolean valueNotNullNorEmpty(String k, String v) { - return v != null && !v.isEmpty(); - } - - public @NonNull HttpHeadersBuilder put(@NonNull Map> headers) { - keyValues(headers).forEach(data::add); - return this; - } - - public @NonNull HttpHeadersBuilder put(@NonNull String key, @Nullable String value) { - data.add(headerOf(key, value)); - return this; - } - - public @NonNull HttpHeadersBuilder filter(@NonNull BiPredicate filter) { - this.filter = filter; - return this; - } - - public @NonNull Map> build() { - return data.stream() - .filter(header -> filter.test(header.getKey(), header.getValue())) - .collect(COLLECTOR); - } - - private static final Collector, ?, Map>> COLLECTOR = - Collectors.collectingAndThen( - Collectors.groupingBy( - Map.Entry::getKey, - () -> new TreeMap<>(String.CASE_INSENSITIVE_ORDER), - toUnmodifiableList(Map.Entry::getValue) - ), - Collections::unmodifiableMap - ); - - private static Collector> toUnmodifiableList(Function mapper) { - return Collectors.mapping(mapper, toUnmodifiableList()); - } - - private static Collector> toUnmodifiableList() { - return Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList); - } - - private static Map.@NonNull Entry headerOf(@NonNull String key, @Nullable String value) { - return new AbstractMap.SimpleImmutableEntry<>(key, value); - } - - public static @NonNull Stream> keyValues(@NonNull Map> headers) { - return headers - .entrySet() - .stream() - .flatMap(entry -> entry.getValue().stream().map(value -> headerOf(entry.getKey(), value))); - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpImpl.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpImpl.java deleted file mode 100644 index 7971fa997..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpImpl.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.io.IOException; -import java.io.InputStream; -import java.net.PasswordAuthentication; -import java.net.Proxy; -import java.net.URL; -import java.util.Locale; -import java.util.function.Supplier; -import java.util.zip.GZIPInputStream; -import java.util.zip.InflaterInputStream; - -/** - * @author Philippe Charles - */ -@lombok.experimental.UtilityClass -class HttpImpl { - - enum Authenticators implements HttpAuthenticator { - NONE { - @Override - public @Nullable PasswordAuthentication getPasswordAuthentication(@NonNull URL url) { - return null; - } - - @Override - public void invalidate(@NonNull URL url) { - } - } - } - - enum EventListeners implements HttpEventListener { - NONE { - @Override - public void onOpen(@NonNull HttpRequest request, @NonNull Proxy proxy, @NonNull HttpAuthScheme scheme) { - } - - @Override - public void onSuccess(@NonNull Supplier contentType) { - } - - @Override - public void onRedirection(@NonNull URL oldUrl, @NonNull URL newUrl) { - } - - @Override - public void onUnauthorized(@NonNull URL url, @NonNull HttpAuthScheme oldScheme, @NonNull HttpAuthScheme newScheme) { - } - - @Override - public void onEvent(@NonNull String message) { - } - } - } - - enum StreamDecoders implements StreamDecoder { - NONE { - @Override - public @NonNull InputStream decode(@NonNull InputStream stream) { - return stream; - } - }, - GZIP { - @Override - public @NonNull InputStream decode(@NonNull InputStream stream) throws IOException { - return new GZIPInputStream(stream); - } - }, - DEFLATE { - @Override - public @NonNull InputStream decode(@NonNull InputStream stream) { - return new InflaterInputStream(stream); - } - }; - - @Override - public @NonNull String getName() { - return name().toLowerCase(Locale.ROOT); - } - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpMethod.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpMethod.java deleted file mode 100644 index 270e7e862..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpMethod.java +++ /dev/null @@ -1,6 +0,0 @@ -package internal.util.http; - -public enum HttpMethod { - - GET, POST; -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpRequest.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpRequest.java deleted file mode 100644 index 5f725d713..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpRequest.java +++ /dev/null @@ -1,38 +0,0 @@ -package internal.util.http; - -import lombok.AccessLevel; -import nbbrd.io.net.MediaType; - -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.List; - -@lombok.Value -@lombok.Builder(toBuilder = true) -@lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) -public class HttpRequest { - - @lombok.NonNull - @lombok.Builder.Default - HttpMethod method = HttpMethod.GET; - - @lombok.NonNull - URL query; - - @lombok.Singular - List mediaTypes; - - @lombok.NonNull - @lombok.Builder.Default - String langs = ""; - - @lombok.Builder.Default - byte[] body = null; - - public static final class Builder { - - public Builder bodyOf(String content) { - return body(content.getBytes(StandardCharsets.UTF_8)); - } - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponse.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponse.java deleted file mode 100644 index 489076506..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; -import nbbrd.io.net.MediaType; - -import java.io.*; -import java.nio.charset.StandardCharsets; - -public interface HttpResponse extends Closeable { - - @NonNull MediaType getContentType() throws IOException; - - @NonNull InputStream getBody() throws IOException; - - default @NonNull Reader getBodyAsReader() throws IOException { - return new InputStreamReader(getBody(), getContentType().getCharset().orElse(StandardCharsets.UTF_8)); - } - - default @NonNull InputStream asDisconnectingInputStream() throws IOException { - return DisconnectingInputStream.of(this); - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponseException.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponseException.java deleted file mode 100644 index 08019bb81..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/HttpResponseException.java +++ /dev/null @@ -1,28 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -@lombok.Getter -public final class HttpResponseException extends IOException { - - private final int responseCode; - private final String responseMessage; - private final Map> headerFields; - - public HttpResponseException(int responseCode, @Nullable String responseMessage) { - this(responseCode, responseMessage, Collections.emptyMap()); - } - - public HttpResponseException(int responseCode, @Nullable String responseMessage, @NonNull Map> headerFields) { - super(responseCode + ": " + responseMessage); - this.responseCode = responseCode; - this.responseMessage = responseMessage; - this.headerFields = headerFields; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/StreamDecoder.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/StreamDecoder.java deleted file mode 100644 index 90d9d7ce7..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/StreamDecoder.java +++ /dev/null @@ -1,25 +0,0 @@ -package internal.util.http; - -import lombok.NonNull; - -import java.io.IOException; -import java.io.InputStream; - -public interface StreamDecoder { - - @NonNull String getName(); - - @NonNull InputStream decode(@NonNull InputStream stream) throws IOException; - - static @NonNull StreamDecoder noOp() { - return HttpImpl.StreamDecoders.NONE; - } - - static @NonNull StreamDecoder gzip() { - return HttpImpl.StreamDecoders.GZIP; - } - - static @NonNull StreamDecoder deflate() { - return HttpImpl.StreamDecoders.DEFLATE; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/URLQueryBuilder.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/URLQueryBuilder.java deleted file mode 100644 index f5e27ca9c..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/URLQueryBuilder.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright 2017 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import lombok.NonNull; - -import java.io.UncheckedIOException; -import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Philippe Charles - */ -@lombok.RequiredArgsConstructor(staticName = "of") -public final class URLQueryBuilder { - - @lombok.NonNull - private final URL endPoint; - - private boolean trailingSlash = false; - - private final Charset encoding = StandardCharsets.UTF_8; - private final List paths = new ArrayList<>(); - private final Map params = new LinkedHashMap<>(); - - /** - * Appends a trailing slash to the final URL. - * - * @param trailingSlash specify if a trailing slash is required - * @return this builder - * @see https://en.wikipedia.org/wiki/URI_normalization - */ - @NonNull - public URLQueryBuilder trailingSlash(boolean trailingSlash) { - this.trailingSlash = trailingSlash; - return this; - } - - /** - * Appends the specified path to the current URL. - * - * @param path a non-null path - * @return this builder - * @throws NullPointerException if path is null - */ - @NonNull - public URLQueryBuilder path(@NonNull String path) { - paths.add(path); - return this; - } - - /** - * Appends the specified path to the current URL. - * - * @param path a non-null path - * @return this builder - * @throws NullPointerException if path is null - */ - @NonNull - public URLQueryBuilder path(@NonNull List path) { - paths.addAll(path); - return this; - } - - /** - * Appends the specified parameter to the current URL. - * - * @param key a non-null key - * @param value a non-null value - * @return this builder - * @throws NullPointerException if key or value is null - */ - @NonNull - public URLQueryBuilder param(@NonNull String key, @NonNull String value) { - params.put(key, value); - return this; - } - - @Override - public String toString() { - StringBuilder result = new StringBuilder(); - result.append(endPoint); - - for (String path : paths) { - result.append('/').append(encode(path, encoding)); - } - - if (trailingSlash) { - result.append('/'); - } - - boolean first = true; - for (Map.Entry o : params.entrySet()) { - result.append(first ? '?' : '&'); - result - .append(encode(o.getKey(), encoding)) - .append('=') - .append(encode(o.getValue(), encoding)); - first = false; - } - - return result.toString(); - } - - /** - * Creates a new URL using the specified path and parameters. - * - * @return a new URL - * @throws java.net.MalformedURLException if no protocol is specified, or an unknown protocol is found, or spec is null, - * or the parsed URL fails to comply with the specific syntax of the associated protocol. - */ - @NonNull - public URL build() throws MalformedURLException { - return new URL(toString()); - } - - private static String encode(String s, Charset charset) { - try { - return URLEncoder.encode(s, charset.name()); - } catch (UnsupportedEncodingException ex) { - throw new UncheckedIOException(ex); - } - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/DumpingClient.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/DumpingClient.java deleted file mode 100644 index 839481b50..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/DumpingClient.java +++ /dev/null @@ -1,96 +0,0 @@ -package internal.util.http.ext; - -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import lombok.NonNull; -import nbbrd.io.Resource; -import nbbrd.io.net.MediaType; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.function.Consumer; - -@lombok.AllArgsConstructor -public final class DumpingClient implements HttpClient { - - @lombok.NonNull - private final Path folder; - - @lombok.NonNull - private final HttpClient delegate; - - @lombok.NonNull - private final Consumer onDump; - - @Override - public @NonNull HttpResponse send(@NonNull HttpRequest request) throws IOException { - String prefix = "http_" + getUniqueTimeStamp(); - try { - return new DumpingResponse(folder, delegate.send(request), onDump, prefix); - } finally { - dumpRequestBody(request, prefix); - } - } - - private void dumpRequestBody(HttpRequest request, String prefix) throws IOException { - if (request.getBody() != null) { - Files.createDirectories(folder); - Path requestDump = folder.resolve(prefix + "_request.tmp"); - onDump.accept(requestDump); - Files.write(requestDump, request.getBody()); - } - } - - @lombok.AllArgsConstructor - private static final class DumpingResponse implements HttpResponse { - - @lombok.NonNull - private final Path folder; - - @lombok.NonNull - private final HttpResponse delegate; - - @lombok.NonNull - private final Consumer onDump; - - @lombok.NonNull - private final String prefix; - - @Override - public @NonNull MediaType getContentType() throws IOException { - return delegate.getContentType(); - } - - @Override - public @NonNull InputStream getBody() throws IOException { - InputStream inputStream = delegate.getBody(); - try { - OutputStream outputStream = getDumpStream(); - return new TeeInputStream(inputStream, outputStream); - } catch (IOException ex) { - Resource.ensureClosed(ex, inputStream); - throw ex; - } - } - - private OutputStream getDumpStream() throws IOException { - Files.createDirectories(folder); - Path responseDump = folder.resolve(prefix + "_response.tmp"); - onDump.accept(responseDump); - return Files.newOutputStream(responseDump); - } - - @Override - public void close() throws IOException { - delegate.close(); - } - } - - private static synchronized String getUniqueTimeStamp() { - return String.valueOf(System.nanoTime()); - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/InterceptingClient.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/InterceptingClient.java deleted file mode 100644 index 782fa1872..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/InterceptingClient.java +++ /dev/null @@ -1,40 +0,0 @@ -package internal.util.http.ext; - -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import lombok.NonNull; -import nbbrd.io.Resource; - -import java.io.IOException; - -@lombok.AllArgsConstructor -public final class InterceptingClient implements HttpClient { - - @lombok.NonNull - private final HttpClient delegate; - - @lombok.NonNull - private final InterceptingClient.Interceptor interceptor; - - @Override - public @NonNull HttpResponse send(@NonNull HttpRequest request) throws IOException { - HttpResponse result = delegate.send(request); - try { - return interceptor.handle(delegate, request, result); - } catch (Throwable ex) { - Resource.ensureClosed(ex, result); - throw ex; - } - } - - @FunctionalInterface - public interface Interceptor { - - @NonNull HttpResponse handle( - @NonNull HttpClient client, - @NonNull HttpRequest request, - @NonNull HttpResponse response) - throws IOException; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/TeeInputStream.java b/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/TeeInputStream.java deleted file mode 100644 index b954e1df4..000000000 --- a/sdmx-dl-provider-ri/src/main/java/internal/util/http/ext/TeeInputStream.java +++ /dev/null @@ -1,93 +0,0 @@ -package internal.util.http.ext; - -import nbbrd.io.Resource; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -@lombok.AllArgsConstructor -final class TeeInputStream extends InputStream { - - @lombok.NonNull - private final InputStream input; - - @lombok.NonNull - private final OutputStream output; - - @Override - public int read() throws IOException { - int result = input.read(); - if (isNotEndOfStream(result)) { - output.write(result); - } - return result; - } - - @Override - public int read(byte[] b) throws IOException { - int result = input.read(b); - if (isNotEndOfStream(result)) { - output.write(b, 0, result); - } - return result; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - int result = input.read(b, off, len); - if (isNotEndOfStream(result)) { - output.write(b, off, result); - } - return result; - } - - @Override - public long skip(long n) throws IOException { - return super.skip(n); - } - - @Override - public int available() throws IOException { - return input.available(); - } - - @Override - public void close() throws IOException { - try { - copyRemaining(input, output); - } finally { - Resource.closeBoth(input, output); - } - } - - @Override - public synchronized void mark(int readlimit) { - } - - @Override - public synchronized void reset() throws IOException { - throw new IOException("mark/reset not supported"); - } - - @Override - public boolean markSupported() { - return false; - } - - private static void copyRemaining(InputStream source, OutputStream target) { - byte[] buf = new byte[8192]; - int length; - try { - while ((length = source.read(buf)) > 0) { - target.write(buf, 0, length); - } - } catch (IOException ex) { - // do nothing - } - } - - private static boolean isNotEndOfStream(int result) { - return result != -1; - } -} diff --git a/sdmx-dl-provider-ri/src/main/java/module-info.java b/sdmx-dl-provider-ri/src/main/java/module-info.java index ae6e2716a..ac26d1bd9 100644 --- a/sdmx-dl-provider-ri/src/main/java/module-info.java +++ b/sdmx-dl-provider-ri/src/main/java/module-info.java @@ -26,11 +26,10 @@ requires java.logging; requires nl.altindag.ssl; requires nbbrd.io.curl; + requires nbbrd.io.http; requires nbbrd.net.proxy; exports sdmxdl.provider.ri.drivers to sdmxdl.provider.dialects, sdmxdl.provider.px; - exports internal.util.http to sdmxdl.provider.dialects, sdmxdl.provider.px; - exports internal.util.http.ext to sdmxdl.provider.dialects, sdmxdl.provider.px; provides Driver with FileRiDriver, diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java index fd645f8e0..dc6b38760 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiHttpUtils.java @@ -16,10 +16,10 @@ */ package sdmxdl.provider.ri.drivers; -import internal.util.http.*; -import internal.util.http.ext.DumpingClient; import lombok.NonNull; import nbbrd.design.VisibleForTesting; +import nbbrd.io.http.*; +import nbbrd.io.http.ext.DumpingClient; import nbbrd.io.net.MediaType; import nbbrd.io.text.BaseProperty; import nbbrd.io.text.Formatter; @@ -104,7 +104,7 @@ private static DumpingClient newDumpingClient(HttpContext context, HttpClient cl .proxySelector(network::getProxySelector) .sslSocketFactory(() -> network.getSSLFactory().getSSLSocketFactory()) .hostnameVerifier(() -> network.getSSLFactory().getHostnameVerifier()) - .urlConnectionFactory(network::getURLConnectionFactory) + .urlConnectionFactory(() -> network.getURLConnectionFactory()::openConnection) .listener(context.getOnEvent() != null ? new RiHttpEventListener(context.getOnEvent().asConsumer(source, "RI_HTTP")) : HttpEventListener.noOp()) .authenticator(new RiHttpAuthenticator(source, context.getAuthenticators(), context.getOnEvent())) .userAgent(HTTP_AGENT.get(System.getProperties())) diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java index 4c40660ae..389159c9c 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestClient.java @@ -16,10 +16,10 @@ */ package sdmxdl.provider.ri.drivers; -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import internal.util.http.HttpResponseException; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpRequest; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.http.HttpResponseException; import lombok.NonNull; import sdmxdl.*; import sdmxdl.format.ObsParser; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java index 03175d93c..7e68060e1 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestErrors.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.HttpResponseException; +import nbbrd.io.http.HttpResponseException; import lombok.NonNull; import sdmxdl.provider.web.RestErrorMapping; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java index 552006764..e5c5f72f2 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/RiRestQueries.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import lombok.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import sdmxdl.CodelistRef; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java index 5389d8724..514b19fa1 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestErrors.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.HttpResponseException; +import nbbrd.io.http.HttpResponseException; import lombok.NonNull; import sdmxdl.provider.web.RestErrorMapping; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java index 968235b1a..70f2a7936 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/drivers/Sdmx21RestQueries.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import lombok.AccessLevel; import lombok.NonNull; import sdmxdl.*; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java index 5f3701327..3412a1191 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeId.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.monitors; -import internal.util.http.URLQueryBuilder; +import nbbrd.io.http.URLQueryBuilder; import lombok.NonNull; import nbbrd.design.RepresentableAs; import nbbrd.design.StaticFactoryMethod; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java index 1234833d1..aafe41f63 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeMonitor.java @@ -1,6 +1,6 @@ package sdmxdl.provider.ri.monitors; -import internal.util.http.HttpClient; +import nbbrd.io.http.HttpClient; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; diff --git a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java index abf7be807..6b99a0109 100644 --- a/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java +++ b/sdmx-dl-provider-ri/src/main/java/sdmxdl/provider/ri/monitors/UpptimeSummary.java @@ -2,8 +2,8 @@ import com.google.gson.*; import sdmxdl.provider.ri.drivers.RiHttpUtils; -import internal.util.http.HttpClient; -import internal.util.http.HttpResponse; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpResponse; import lombok.NonNull; import nbbrd.io.net.MediaType; diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java deleted file mode 100644 index a481bfbe9..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/CurlClientTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2018 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import nbbrd.io.curl.CurlHttpURLConnection; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import sdmxdl.web.spi.URLConnectionFactory; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Philippe Charles - */ -public class CurlClientTest extends DefaultHttpClientTest { - - @Override - protected URLConnectionFactory getURLConnectionFactory() { - return CurlHttpURLConnection::insecureForTestOnly; - } - - @Override - protected boolean isHttpsURLConnectionSupported() { - return false; - } - - @Override - protected WireMockConfiguration getWireMockConfiguration() { - return WireMockConfiguration - .options() - .dynamicPort() - .dynamicHttpsPort() - .gzipDisabled(false); - } - - @Disabled - @Test - @Override - public void testInvalidSSL() { - super.testInvalidSSL(); - } - - @Override - protected List getHttpRedirectionCodes() { - List result = super.getHttpRedirectionCodes(); - // ignore redirection 308 on macOS because curl 7.79.0 returns CURL_UNSUPPORTED_PROTOCOL error - if (isOSX()) { - return result.stream().filter(code -> code != 308).collect(Collectors.toList()); - } - return result; - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java deleted file mode 100644 index 75490c872..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/DefaultHttpClientTest.java +++ /dev/null @@ -1,115 +0,0 @@ -package internal.util.http; - -import nbbrd.io.net.MediaType; -import org.junit.jupiter.api.Test; -import sdmxdl.format.xml.XmlMediaTypes; -import sdmxdl.web.spi.URLConnectionFactory; - -import java.io.IOException; -import java.net.ProxySelector; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Supplier; - -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static java.util.Arrays.asList; -import static java.util.Collections.emptyList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIOException; - -public abstract class DefaultHttpClientTest extends HttpClientTest { - - abstract protected URLConnectionFactory getURLConnectionFactory(); - - abstract protected boolean isHttpsURLConnectionSupported(); - - @Override - protected HttpClient getClient(HttpContext context) { - return new DefaultHttpClient( - context - .toBuilder() - .urlConnectionFactory(this::getURLConnectionFactory) - .build() - ); - } - - @Test - public void testToAcceptHeader() { - assertThat(DefaultHttpClient.toAcceptHeader(emptyList())) - .isEqualTo(""); - - assertThat(DefaultHttpClient.toAcceptHeader(asList(MediaType.parse("text/html"), MediaType.parse("application/xhtml+xml")))) - .isEqualTo("text/html, application/xhtml+xml"); - } - - @Test - public void testLazyNetwork() throws IOException { - AtomicInteger proxySelectorCount = new AtomicInteger(); - AtomicInteger sslSocketFactoryCount = new AtomicInteger(); - AtomicInteger hostnameVerifierCount = new AtomicInteger(); - - HttpContext context = HttpContext - .builder() - .proxySelector(counting(ProxySelector::getDefault, proxySelectorCount)) - .sslSocketFactory(counting(this::wireSSLSocketFactory, sslSocketFactoryCount)) - .hostnameVerifier(counting(this::wireHostnameVerifier, hostnameVerifierCount)) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); - - assertThat(proxySelectorCount).hasValue(0); - assertThat(sslSocketFactoryCount).hasValue(0); - assertThat(hostnameVerifierCount).hasValue(0); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(XmlMediaTypes.GENERIC_DATA_21).build())) { - assertSameSampleContent(response); - } - - assertThat(proxySelectorCount).hasValue(1); - assertThat(sslSocketFactoryCount).hasValue(isHttpsURLConnectionSupported() ? 1 : 0); - assertThat(hostnameVerifierCount).hasValue(isHttpsURLConnectionSupported() ? 1 : 0); - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - - @Test - public void testDefaultResponse() throws IOException { - HttpContext context = HttpContext - .builder() - .proxySelector(ProxySelector::getDefault) - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(ok())); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(XmlMediaTypes.GENERIC_DATA_21).build())) { - assertThatIOException() - .isThrownBy(response::getContentType) - .withMessageContaining("Missing content-type in HTTP response header"); - } - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL))); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okForContentType("/ / /", "body"))); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(XmlMediaTypes.GENERIC_DATA_21).build())) { - assertThatIOException() - .isThrownBy(response::getContentType) - .withMessageContaining("Invalid content-type in HTTP response header"); - } - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - - private static Supplier counting(Supplier delegate, AtomicInteger counter) { - return () -> { - counter.incrementAndGet(); - return delegate.get(); - }; - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java deleted file mode 100644 index ce7f4fc89..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpClientTest.java +++ /dev/null @@ -1,593 +0,0 @@ -/* - * Copyright 2018 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import com.github.tomakehurst.wiremock.junit5.WireMockExtension; -import com.github.tomakehurst.wiremock.matching.AbsentPattern; -import com.github.tomakehurst.wiremock.matching.AnythingPattern; -import com.github.tomakehurst.wiremock.matching.EqualToPattern; -import lombok.NonNull; -import nbbrd.io.net.MediaType; -import nbbrd.io.xml.Xml; -import org.assertj.core.api.Assumptions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.RegisterExtension; -import sdmxdl.Languages; - -import javax.net.ssl.*; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.PasswordAuthentication; -import java.net.URL; -import java.net.UnknownHostException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; - -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static internal.util.http.HttpConstants.*; -import static internal.util.http.HttpMethod.POST; -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.*; -import static sdmxdl.format.xml.XmlMediaTypes.GENERIC_DATA_21; -import static sdmxdl.format.xml.XmlMediaTypes.STRUCTURE_SPECIFIC_DATA_21; - -/** - * @author Philippe Charles - */ -public abstract class HttpClientTest { - - abstract protected HttpClient getClient(HttpContext context); - - abstract protected WireMockConfiguration getWireMockConfiguration(); - - @RegisterExtension - protected WireMockExtension wire = WireMockExtension.newInstance() - .options(getWireMockConfiguration()) - .build(); - - @Test - public void testNPE() { - HttpContext context = HttpContext - .builder() - .build(); - HttpClient x = getClient(context); - - assertThatNullPointerException() - .isThrownBy(() -> x.send(null)); - } - - @Test - public void testHttpOK_GET() throws IOException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .userAgent("hello world") - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); - - HttpRequest request = HttpRequest - .builder() - .query(wireURL(SAMPLE_URL)) - .mediaType(GENERIC_DATA_21) - .langs(ANY_LANG) - .build(); - - try (HttpResponse response = x.send(request)) { - assertSameSampleContent(response); - } - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL)) - .withHeader(HTTP_ACCEPT_HEADER, equalTo(GENERIC_DATA_21.toString())) - .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(Languages.ANY.toString())) - .withHeader(HTTP_ACCEPT_ENCODING_HEADER, equalTo("gzip, deflate")) - .withHeader(HTTP_LOCATION_HEADER, absent()) - .withHeader(HTTP_USER_AGENT_HEADER, equalTo("hello world")) - .withHeader("Host", new AnythingPattern()) - .withRequestBody(AbsentPattern.ABSENT) -// .withHeader("Connection", new AnythingPattern()) - ); - } - - @Test - public void testHttpOK_POST() throws IOException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .userAgent("hello world") - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(post(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); - - HttpRequest request = HttpRequest - .builder() - .query(wireURL(SAMPLE_URL)) - .mediaType(GENERIC_DATA_21) - .langs(ANY_LANG) - .method(POST) - .body("some body content".getBytes(UTF_8)) - .build(); - - try (HttpResponse response = x.send(request)) { - assertSameSampleContent(response); - } - - wire.verify(1, postRequestedFor(urlEqualTo(SAMPLE_URL)) - .withHeader(HTTP_ACCEPT_HEADER, equalTo(GENERIC_DATA_21.toString())) - .withHeader(HTTP_ACCEPT_LANGUAGE_HEADER, equalTo(Languages.ANY.toString())) - .withHeader(HTTP_ACCEPT_ENCODING_HEADER, equalTo("gzip, deflate")) - .withHeader(HTTP_LOCATION_HEADER, absent()) - .withHeader(HTTP_USER_AGENT_HEADER, equalTo("hello world")) - .withHeader("Host", new AnythingPattern()) - .withRequestBody(new EqualToPattern("some body content")) -// .withHeader("Connection", new AnythingPattern()) - ); - } - - @Test - public void testMultiMediaTypes() throws IOException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); - - List mediaTypes = asList(GENERIC_DATA_21, STRUCTURE_SPECIFIC_DATA_21); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaTypes(mediaTypes).build())) { - assertSameSampleContent(response); - } - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL)) - .withHeader(HTTP_ACCEPT_HEADER, equalTo(DefaultHttpClient.toAcceptHeader(mediaTypes))) - ); - } - - @Test - public void testHttpError() { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - String customErrorMessage = "Custom error message"; - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL) - .willReturn(aResponse() - .withStatus(HttpsURLConnection.HTTP_INTERNAL_ERROR) - .withStatusMessage(customErrorMessage) - .withHeader("key", "value") - )); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(Xml.APPLICATION_XML_UTF_8).build())) - .withMessage("500: " + customErrorMessage) - .isInstanceOfSatisfying(HttpResponseException.class, ex -> { - assertThat(ex.getResponseCode()).isEqualTo(HttpsURLConnection.HTTP_INTERNAL_ERROR); - assertThat(ex.getResponseMessage()).isEqualTo(customErrorMessage); - assertThat(ex.getHeaderFields()).containsEntry("key", singletonList("value")); - }); - - wire.verify(1, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - - @Test - public void testInvalidProtocol() { - HttpContext context = HttpContext - .builder() - .build(); - HttpClient x = getClient(context); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(new URL("ftp://localhost")).mediaType(Xml.APPLICATION_XML_UTF_8).build())) - .withMessage("Unsupported protocol 'ftp'"); - } - - @Test - public void testInvalidHost() { - HttpContext context = HttpContext - .builder() - .build(); - HttpClient x = getClient(context); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(new URL("http://localhoooooost")).mediaType(Xml.APPLICATION_XML_UTF_8).build())) - .isInstanceOf(UnknownHostException.class) - .withMessage("localhoooooost"); - } - - @Test - public void testRedirect() throws IOException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - String absoluteSecondURL = wireURL(SECOND_URL).toString(); - - for (int redirection : getHttpRedirectionCodes()) { - for (String location : asList(absoluteSecondURL, SECOND_URL)) { - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(aResponse().withStatus(redirection).withHeader(HTTP_LOCATION_HEADER, location))); - wire.stubFor(get(SECOND_URL).willReturn(okXml(SAMPLE_XML))); - - assertThatCode(() -> { - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) { - assertSameSampleContent(response); - } - }) - .describedAs("Redirect: code %s from '%s' to '%s'", redirection, wireURL(SAMPLE_URL), location) - .doesNotThrowAnyException(); - } - } - } - - @Test - public void testMaxRedirect() throws MalformedURLException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .maxRedirects(0) - .build(); - HttpClient x = getClient(context); - - String absoluteSecondURL = wireURL(SECOND_URL).toString(); - - for (int redirection : getHttpRedirectionCodes()) { - for (String location : asList(absoluteSecondURL, SECOND_URL)) { - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(aResponse().withStatus(redirection).withHeader(HTTP_LOCATION_HEADER, location))); - wire.stubFor(get(SECOND_URL).willReturn(okXml(SAMPLE_XML))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .describedAs("Max redirect: code %s from '%s' to '%s'", redirection, wireURL(SAMPLE_URL), location) - .withMessage("Max redirection reached"); - } - } - } - - @Test - public void testInvalidRedirect() throws MalformedURLException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - for (int redirection : getHttpRedirectionCodes()) { - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(aResponse().withStatus(redirection))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .describedAs("Invalid redirect: code %s from '%s'", redirection, wireURL(SAMPLE_URL)) - .withMessage("Missing redirection url"); - } - } - - @Test - public void testDowngradingRedirect() throws MalformedURLException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - String location = wireHttpUrl(SECOND_URL); - - for (int redirection : getHttpRedirectionCodes()) { - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(aResponse().withStatus(redirection).withHeader(HTTP_LOCATION_HEADER, location))); - wire.stubFor(get(SECOND_URL).willReturn(okXml(SAMPLE_XML))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .describedAs("Downgrading protocol on redirect: code %s from '%s' to '%s'", redirection, wireURL(SAMPLE_URL), location) - .withMessageContaining("Downgrading protocol on redirect"); - } - } - - @Test - public void testInvalidSSL() { - HttpContext context = HttpContext - .builder() - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .isInstanceOf(SSLException.class); - } - - @Test - public void testReadTimeout() { - // ignore on macOS because timeout seems to be unreliable - Assumptions.assumeThat(isOSX()).isFalse(); - - int readTimeout = 1000; - - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .readTimeout(readTimeout) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(okXml(SAMPLE_XML).withFixedDelay(readTimeout * 2))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .withMessageContaining("Read timed out"); - } - - @Test - public void testValidAuth() throws IOException { - for (boolean preemptive : new boolean[]{false, true}) { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .authenticator(authenticatorOf("user", "password")) - .preemptiveAuthentication(preemptive) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "password").willReturn(okXml(SAMPLE_XML))); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) { - assertSameSampleContent(response); - } - - wire.verify(preemptive ? 1 : 2, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - } - - @Test - public void testNoAuth() { - for (boolean preemptive : new boolean[]{false, true}) { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .authenticator(HttpAuthenticator.noOp()) - .preemptiveAuthentication(preemptive) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "password").willReturn(okXml(SAMPLE_XML))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .withMessage("401: Unauthorized") - .isInstanceOfSatisfying(HttpResponseException.class, ex -> { - assertThat(ex.getResponseCode()).isEqualTo(HttpsURLConnection.HTTP_UNAUTHORIZED); - assertThat(ex.getResponseMessage()).isEqualTo("Unauthorized"); - }); - - wire.verify(preemptive ? 1 : 2, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - } - - @Test - public void testInvalidAuth() { - for (boolean preemptive : new boolean[]{false, true}) { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .authenticator(authenticatorOf("user", "xyz")) - .preemptiveAuthentication(preemptive) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "password").willReturn(okXml(SAMPLE_XML))); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "xyz").willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) - .withMessage("401: Unauthorized") - .isInstanceOfSatisfying(HttpResponseException.class, ex -> { - assertThat(ex.getResponseCode()).isEqualTo(HttpsURLConnection.HTTP_UNAUTHORIZED); - assertThat(ex.getResponseMessage()).isEqualTo("Unauthorized"); - }); - - wire.verify(preemptive ? 1 : 2, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - } - - @Test - public void testInsecureAuth() throws MalformedURLException { - for (boolean preemptive : new boolean[]{false, true}) { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .authenticator(authenticatorOf("user", "password")) - .preemptiveAuthentication(preemptive) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized().withHeader(HTTP_AUTHENTICATE_HEADER, BASIC_AUTH_RESPONSE))); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "password").willReturn(okXml(SAMPLE_XML))); - - String location = wireHttpUrl(SAMPLE_URL); - - assertThatIOException() - .isThrownBy(() -> x.send(HttpRequest.builder().query(new URL(location)).mediaType(GENERIC_DATA_21).build())) - .withMessageContaining("Insecure protocol"); - - wire.verify(preemptive ? 0 : 1, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - } - - @Test - public void testMissingAuth() throws IOException { - for (boolean preemptive : new boolean[]{false, true}) { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .authenticator(authenticatorOf("user", "password")) - .preemptiveAuthentication(preemptive) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get(SAMPLE_URL).willReturn(unauthorized())); - wire.stubFor(get(SAMPLE_URL).withBasicAuth("user", "password").willReturn(okXml(SAMPLE_XML))); - - try (HttpResponse response = x.send(HttpRequest.builder().query(wireURL(SAMPLE_URL)).mediaType(GENERIC_DATA_21).build())) { - assertSameSampleContent(response); - } - - wire.verify(preemptive ? 1 : 2, getRequestedFor(urlEqualTo(SAMPLE_URL))); - } - } - - @Test - public void testDoubleDotInURL() throws IOException { - HttpContext context = HttpContext - .builder() - .sslSocketFactory(this::wireSSLSocketFactory) - .hostnameVerifier(this::wireHostnameVerifier) - .build(); - HttpClient x = getClient(context); - - wire.resetAll(); - wire.stubFor(get("/abc/../first.xml").willReturn(okXml(SAMPLE_XML))); - - HttpRequest request = HttpRequest - .builder() - .query(wireURL("/abc/../first.xml")) - .mediaType(GENERIC_DATA_21) - .langs(ANY_LANG) - .build(); - - try (HttpResponse response = x.send(request)) { - assertSameSampleContent(response); - } - - wire.verify(1, getRequestedFor(urlEqualTo("/abc/../first.xml"))); - } - - protected SSLSocketFactory wireSSLSocketFactory() { - try { - SSLContext result = SSLContext.getInstance("TLS"); - result.init(null, wireTrustManagers(), null); - return result.getSocketFactory(); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - private TrustManager[] wireTrustManagers() throws NoSuchAlgorithmException, KeyStoreException { - TrustManagerFactory result = TrustManagerFactory.getInstance("X509"); - result.init(wire.getOptions().httpsSettings().keyStore().loadStore()); - return result.getTrustManagers(); - } - - protected HostnameVerifier wireHostnameVerifier() { - return (hostname, session) -> hostname.equals("localhost"); - } - - protected URL wireURL(String path) throws MalformedURLException { - if (!path.startsWith("/")) { - path = "/" + path; - } - return new URL(String.format(Locale.ROOT, "%s%s", wire.baseUrl(), path)); - } - - private String wireHttpUrl(String url) throws MalformedURLException { - return wireURL(url) - .toString() - .replace("https", "http") - .replace(Integer.toString(wire.getRuntimeInfo().getHttpsPort()), Integer.toString(wire.getRuntimeInfo().getHttpPort())); - } - - protected void assertSameSampleContent(HttpResponse response) throws IOException { - assertThat(response.getContentType()).isEqualTo(Xml.APPLICATION_XML_UTF_8.withoutParameters()); - try (InputStream stream = response.getBody()) { - assertThat(stream).hasContent(SAMPLE_XML); - } - } - - private HttpAuthenticator authenticatorOf(String username, String password) { - return new HttpAuthenticator() { - @Override - public @NonNull PasswordAuthentication getPasswordAuthentication(@NonNull URL url) { - return new PasswordAuthentication(username, password.toCharArray()); - } - - @Override - public void invalidate(@NonNull URL url) { - } - }; - } - - protected List getHttpRedirectionCodes() { - return Arrays.asList(301, 302, 303, 307, 308); - } - - protected static final String ANY_LANG = Languages.ANY.toString(); - protected static final String SAMPLE_URL = "/first.xml"; - protected static final String SECOND_URL = "/second.xml"; - protected static final String SAMPLE_XML = "JohnDoe"; - public static final String BASIC_AUTH_RESPONSE = "Basic realm=\"staging\", charset=\"UTF-8\""; - - protected static boolean isOSX() { - String osName = System.getProperty("os.name"); - return osName != null && osName.toLowerCase(Locale.ROOT).startsWith("mac os x"); - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpConstantsTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpConstantsTest.java deleted file mode 100644 index 8faef0219..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpConstantsTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package internal.util.http; - -import org.junit.jupiter.api.Test; - -import java.net.MalformedURLException; -import java.net.URL; - -import static org.assertj.core.api.Assertions.assertThat; - -public class HttpConstantsTest { - - @Test - public void testIsDowngradingProtocolOnRedirect() throws MalformedURLException { - assertThat(HttpConstants.isDowngradingProtocolOnRedirect(new URL("http://x"), new URL("http://y"))).isFalse(); - assertThat(HttpConstants.isDowngradingProtocolOnRedirect(new URL("https://x"), new URL("http://y"))).isTrue(); - assertThat(HttpConstants.isDowngradingProtocolOnRedirect(new URL("http://x"), new URL("https://y"))).isFalse(); - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpHeadersBuilderTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpHeadersBuilderTest.java deleted file mode 100644 index fb66991cb..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpHeadersBuilderTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package internal.util.http; - -import org.junit.jupiter.api.Test; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.assertj.core.api.Assertions.*; - -@SuppressWarnings("ALL") -public class HttpHeadersBuilderTest { - - @Test - public void test() { - assertThat(new HttpHeadersBuilder().build()) - .isEmpty(); - - assertThatNullPointerException() - .isThrownBy(() -> new HttpHeadersBuilder().put(null, "v1")); - - assertThatCode(() -> new HttpHeadersBuilder().put("k1", null)) - .doesNotThrowAnyException(); - - assertThat(new HttpHeadersBuilder().put("k1", "v1").put("k2", "v2").build()) - .containsEntry("k1", singletonList("v1")) - .containsEntry("k2", singletonList("v2")) - .hasSize(2); - - assertThat(new HttpHeadersBuilder().put("k1", "v1").put("k1", "v2").build()) - .containsEntry("k1", asList("v1", "v2")) - .hasSize(1); - - assertThat(new HttpHeadersBuilder().put("k1", "v2").put("k1", "v1").build()) - .containsEntry("k1", asList("v2", "v1")) - .containsKeys("K1", "k1") - .hasSize(1); - - assertThat(new HttpHeadersBuilder().put("k1", "v2").put("K1", "v1").build()) - .containsEntry("k1", asList("v2", "v1")) - .containsKeys("K1", "k1") - .hasSize(1); - - assertThat(new HttpHeadersBuilder().put("K1", "v2").put("k1", "v1").build()) - .containsEntry("K1", asList("v2", "v1")) - .containsKeys("K1", "k1") - .hasSize(1); - - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> new HttpHeadersBuilder().put("K1", "v2").build().put("k2", singletonList("v2"))); - - assertThatExceptionOfType(RuntimeException.class) - .isThrownBy(() -> new HttpHeadersBuilder().put("K1", "v2").build().get("k1").add("v2")); - - assertThat(new HttpHeadersBuilder().put("k1", "v1").put("k2", null).build()) - .containsEntry("k1", singletonList("v1")) - .hasSize(1); - - assertThat(new HttpHeadersBuilder().put("k1", "v1").put("k2", "").build()) - .containsEntry("k1", singletonList("v1")) - .hasSize(1); - } -} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpResponseExceptionTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpResponseExceptionTest.java deleted file mode 100644 index 5b7a8f331..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/HttpResponseExceptionTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package internal.util.http; - -import org.junit.jupiter.api.Test; - -import static java.util.Collections.singletonList; -import static java.util.Collections.singletonMap; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatNullPointerException; - -public class HttpResponseExceptionTest { - - @Test - public void test() { - assertThat(new HttpResponseException(100, null)) - .hasMessageContaining("100") - .hasMessageContaining("null") - .satisfies(o -> { - assertThat(o.getResponseCode()).isEqualTo(100); - assertThat(o.getResponseMessage()).isNull(); - assertThat(o.getHeaderFields()).isEmpty(); - }); - - assertThat(new HttpResponseException(100, "hello world")) - .hasMessageContaining("100") - .hasMessageContaining("hello world") - .satisfies(o -> { - assertThat(o.getResponseCode()).isEqualTo(100); - assertThat(o.getResponseMessage()).isEqualTo("hello world"); - assertThat(o.getHeaderFields()).isEmpty(); - }); - - assertThatNullPointerException() - .isThrownBy(() -> new HttpResponseException(100, "", null)); - - assertThat(new HttpResponseException(100, "hello world", singletonMap("key", singletonList("value")))) - .hasMessageContaining("100") - .hasMessageContaining("hello world") - .satisfies(o -> { - assertThat(o.getResponseCode()).isEqualTo(100); - assertThat(o.getResponseMessage()).isEqualTo("hello world"); - assertThat(o.getHeaderFields()).containsEntry("key", singletonList("value")).hasSize(1); - }); - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java deleted file mode 100644 index 0de52e9b0..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/JdkClientTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2018 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import com.github.tomakehurst.wiremock.core.WireMockConfiguration; -import sdmxdl.web.spi.URLConnectionFactory; - -/** - * @author Philippe Charles - */ -public class JdkClientTest extends DefaultHttpClientTest { - - @Override - protected URLConnectionFactory getURLConnectionFactory() { - return URLConnectionFactory.getDefault(); - } - - @Override - protected boolean isHttpsURLConnectionSupported() { - return true; - } - - @Override - protected WireMockConfiguration getWireMockConfiguration() { - return WireMockConfiguration - .options() - .dynamicPort() - .dynamicHttpsPort() - .gzipDisabled(false); - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/URLQueryBuilderTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/URLQueryBuilderTest.java deleted file mode 100644 index b68868315..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/URLQueryBuilderTest.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2018 National Bank of Belgium - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved - * by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * - * http://ec.europa.eu/idabc/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package internal.util.http; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.net.URL; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatNullPointerException; - -/** - * @author Philippe Charles - */ -public class URLQueryBuilderTest { - - @Test - @SuppressWarnings("null") - public void test() throws IOException { - assertThatNullPointerException() - .isThrownBy(() -> URLQueryBuilder.of(null)); - - URL endpoint = new URL("http://localhost"); - - assertThatNullPointerException() - .isThrownBy(() -> URLQueryBuilder.of(endpoint).path((String) null)); - - assertThatNullPointerException() - .isThrownBy(() -> URLQueryBuilder.of(endpoint).path((List) null)); - - assertThatNullPointerException() - .isThrownBy(() -> URLQueryBuilder.of(endpoint).param(null, "")); - - assertThatNullPointerException() - .isThrownBy(() -> URLQueryBuilder.of(endpoint).param("", null)); - - assertThat(URLQueryBuilder.of(endpoint).build()) - .hasToString("http://localhost"); - - assertThat(URLQueryBuilder.of(endpoint).param("p1", "v1").param("p&=2", "v&=2").build()) - .hasToString("http://localhost?p1=v1&p%26%3D2=v%26%3D2"); - - assertThat(URLQueryBuilder.of(endpoint).path("hello").path("worl/d").build()) - .hasToString("http://localhost/hello/worl%2Fd"); - - assertThat(URLQueryBuilder.of(endpoint).path("hello").path("worl/d").param("p1", "v1").param("p&=2", "v&=2").build()) - .hasToString("http://localhost/hello/worl%2Fd?p1=v1&p%26%3D2=v%26%3D2"); - - assertThat(URLQueryBuilder.of(endpoint).trailingSlash(true).build()) - .hasToString("http://localhost/"); - - assertThat(URLQueryBuilder.of(endpoint).trailingSlash(true).param("p1", "v1").param("p&=2", "v&=2").build()) - .hasToString("http://localhost/?p1=v1&p%26%3D2=v%26%3D2"); - - assertThat(URLQueryBuilder.of(endpoint).trailingSlash(true).path("hello").path("worl/d").build()) - .hasToString("http://localhost/hello/worl%2Fd/"); - - assertThat(URLQueryBuilder.of(endpoint).trailingSlash(true).path("hello").path("worl/d").param("p1", "v1").param("p&=2", "v&=2").build()) - .hasToString("http://localhost/hello/worl%2Fd/?p1=v1&p%26%3D2=v%26%3D2"); - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/DumpingClientTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/DumpingClientTest.java deleted file mode 100644 index 5bcf9c67e..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/DumpingClientTest.java +++ /dev/null @@ -1,192 +0,0 @@ -package internal.util.http.ext; - -import internal.util.http.HttpClient; -import internal.util.http.HttpRequest; -import internal.util.http.HttpResponse; -import lombok.NonNull; -import nbbrd.io.function.IORunnable; -import nbbrd.io.function.IOSupplier; -import nbbrd.io.net.MediaType; -import nbbrd.io.text.Parser; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; -import wiremock.com.google.common.io.ByteStreams; -import wiremock.org.apache.commons.io.input.ReaderInputStream; -import wiremock.org.apache.hc.core5.http.io.entity.EmptyInputStream; - -import java.io.IOException; -import java.io.InputStream; -import java.io.StringReader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.util.Deque; -import java.util.LinkedList; - -import static org.assertj.core.api.Assertions.*; - -public class DumpingClientTest { - - @SuppressWarnings("ConstantConditions") - @Test - public void testFactories(@TempDir Path temp) { - IOSupplier empty = () -> EmptyInputStream.INSTANCE; - - Deque stack = new LinkedList<>(); - DumpingClient x = new DumpingClient(temp, MockedClient.ofBody(empty), stack::add); - - assertThatNullPointerException() - .isThrownBy(() -> x.send(null)); - - assertThat(stack).isEmpty(); - } - - @Test - public void testEmptyClient(@TempDir Path temp) throws IOException { - IOSupplier empty = () -> EmptyInputStream.INSTANCE; - - Deque stack = new LinkedList<>(); - DumpingClient x = new DumpingClient(temp, MockedClient.ofBody(empty), stack::add); - - try (HttpResponse r = x.send(request)) { - assertThat(r.getContentType()) - .isEqualTo(MediaType.ANY_TYPE); - - try (InputStream stream = r.getBody()) { - assertThat(stream).isEmpty(); - } - - assertThat(stack) - .singleElement(as(PATH)) - .exists() - .isEmptyFile(); - } - } - - @Test - public void testNonEmptyClient(@TempDir Path temp) throws IOException { - IOSupplier nonEmpty = () -> new ReaderInputStream(new StringReader("hello"), StandardCharsets.UTF_8); - - Deque stack = new LinkedList<>(); - DumpingClient x = new DumpingClient(temp, MockedClient.ofBody(nonEmpty), stack::add); - - try (HttpResponse r = x.send(request)) { - assertThat(r.getContentType()) - .isEqualTo(MediaType.ANY_TYPE); - - try (InputStream stream = r.getBody()) { - assertThat(stream).hasContent("hello"); - } - - assertThat(stack) - .singleElement(as(PATH)) - .exists() - .hasContent("hello"); - } - } - - @Test - public void testFailingOnGetBody(@TempDir Path temp) throws IOException { - IOSupplier failingOnGetBody = () -> { - throw new IOException("boom"); - }; - - Deque stack = new LinkedList<>(); - DumpingClient x = new DumpingClient(temp, MockedClient.ofBody(failingOnGetBody), stack::add); - - try (HttpResponse r = x.send(request)) { - assertThat(r.getContentType()) - .isEqualTo(MediaType.ANY_TYPE); - - assertThatIOException().isThrownBy(() -> { - try (InputStream stream = r.getBody()) { - ByteStreams.toByteArray(stream); - } - }); - - assertThat(stack) - .isEmpty(); - } - } - - @Test - public void testFailingOnRead(@TempDir Path temp) throws IOException { - IOSupplier failingOnRead = () -> new InputStream() { - @Override - public int read() throws IOException { - throw new IOException("boom"); - } - }; - - Deque stack = new LinkedList<>(); - DumpingClient x = new DumpingClient(temp, MockedClient.ofBody(failingOnRead), stack::add); - - try (HttpResponse r = x.send(request)) { - assertThat(r.getContentType()) - .isEqualTo(MediaType.ANY_TYPE); - - assertThatIOException().isThrownBy(() -> { - try (InputStream stream = r.getBody()) { - ByteStreams.toByteArray(stream); - } - }); - - assertThat(stack) - .singleElement(as(PATH)) - .exists() - .isEmptyFile(); - } - } - - private final HttpRequest request = HttpRequest - .builder() - .query(Parser.onURL().parseValue("http://localhost").orElseThrow(RuntimeException::new)) - .build(); - - @lombok.AllArgsConstructor(staticName = "of") - private static final class MockedClient implements HttpClient { - - public static MockedClient ofBody(IOSupplier body) { - return of(() -> MockedResponse.ofBody(body)); - } - - @lombok.NonNull - private final IOSupplier response; - - @Override - public @NonNull HttpResponse send(@NonNull HttpRequest httpRequest) throws IOException { - return response.getWithIO(); - } - } - - @lombok.Builder - public static final class MockedResponse implements HttpResponse { - - public static MockedResponse ofBody(IOSupplier body) { - return builder().body(body).build(); - } - - @lombok.Builder.Default - private final IOSupplier mediaType = IOSupplier.of(MediaType.ANY_TYPE); - - @lombok.Builder.Default - private final IOSupplier body = IOSupplier.of(EmptyInputStream.INSTANCE); - - @lombok.Builder.Default - private final IORunnable onClose = IORunnable.noOp(); - - @Override - public @NonNull MediaType getContentType() throws IOException { - return mediaType.getWithIO(); - } - - @Override - public @NonNull InputStream getBody() throws IOException { - return body.getWithIO(); - } - - @Override - public void close() throws IOException { - onClose.runWithIO(); - } - } -} diff --git a/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/TeeInputStreamTest.java b/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/TeeInputStreamTest.java deleted file mode 100644 index 9b7602e1c..000000000 --- a/sdmx-dl-provider-ri/src/test/java/internal/util/http/ext/TeeInputStreamTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package internal.util.http.ext; - -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TeeInputStreamTest { - - @Test - public void test() throws IOException { - byte[] bytes = "hello".getBytes(StandardCharsets.UTF_8); - ByteArrayInputStream input = new ByteArrayInputStream(bytes); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - - try (TeeInputStream x = new TeeInputStream(input, output)) { - assertThat(x.available()).isEqualTo(bytes.length); - assertThat(x.markSupported()).isFalse(); - assertThat(x.skip(2)).isEqualTo(2); - assertThat(x.read()).isEqualTo('l'); - } - assertThat(output.toByteArray()).isEqualTo(bytes); - } -} \ No newline at end of file diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java index d5744fa25..aade5e68d 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiHttpUtilsTest.java @@ -1,8 +1,8 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.HttpEventListener; -import internal.util.http.HttpRequest; import lombok.NonNull; +import nbbrd.io.http.HttpEventListener; +import nbbrd.io.http.HttpRequest; import nbbrd.io.net.MediaType; import org.junit.jupiter.api.Test; import sdmxdl.web.WebSource; @@ -13,9 +13,9 @@ import java.util.ArrayList; import java.util.List; -import static internal.util.http.HttpAuthScheme.BASIC; -import static internal.util.http.HttpAuthScheme.NONE; import static java.net.Proxy.NO_PROXY; +import static nbbrd.io.http.HttpAuthScheme.BASIC; +import static nbbrd.io.http.HttpAuthScheme.NONE; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNullPointerException; diff --git a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java index fcd899b27..7b6e068ab 100644 --- a/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java +++ b/sdmx-dl-provider-ri/src/test/java/sdmxdl/provider/ri/drivers/RiRestClientTest.java @@ -1,8 +1,13 @@ package sdmxdl.provider.ri.drivers; -import internal.util.http.HttpClient; -import internal.util.http.HttpResponseException; -import internal.util.http.ext.DumpingClientTest; +import lombok.NonNull; +import nbbrd.design.MightBePromoted; +import nbbrd.io.function.IORunnable; +import nbbrd.io.function.IOSupplier; +import nbbrd.io.http.HttpClient; +import nbbrd.io.http.HttpResponse; +import nbbrd.io.http.HttpResponseException; +import nbbrd.io.net.MediaType; import nbbrd.io.xml.Xml; import org.junit.jupiter.api.Test; import sdmxdl.*; @@ -11,7 +16,9 @@ import tests.sdmxdl.api.ByteSource; import tests.sdmxdl.format.xml.SdmxXmlSources; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.EnumSet; @@ -104,10 +111,48 @@ private static HttpClient onResponseError(int responseCode) { } private static HttpClient onResponseStream(ByteSource byteSource) { - return (httpRequest) -> DumpingClientTest.MockedResponse + return (httpRequest) -> MockedResponse .builder() .body(byteSource::openStream) .mediaType(() -> Xml.APPLICATION_XML_UTF_8) .build(); } + + @MightBePromoted + @lombok.Builder + private static final class MockedResponse implements HttpResponse { + + public static MockedResponse ofBody(IOSupplier body) { + return builder().body(body).build(); + } + + @lombok.Builder.Default + private final IOSupplier mediaType = IOSupplier.of(MediaType.ANY_TYPE); + + @lombok.Builder.Default + private final IOSupplier body = MockedResponse::emptyInputStream; + + @lombok.Builder.Default + private final IORunnable onClose = IORunnable.noOp(); + + @Override + public @NonNull MediaType getContentType() throws IOException { + return mediaType.getWithIO(); + } + + @Override + public @NonNull InputStream getBody() throws IOException { + return body.getWithIO(); + } + + @Override + public void close() throws IOException { + onClose.runWithIO(); + } + + @MightBePromoted + private static InputStream emptyInputStream() { + return new ByteArrayInputStream(new byte[0]); + } + } } diff --git a/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java b/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java index f602fc8bf..925de2662 100644 --- a/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java +++ b/sdmx-dl-standalone/src/test/java/spreadsheet4j/standalone/RuntimeDependenciesTest.java @@ -29,14 +29,20 @@ public void testRuntimeDependencies() throws IOException { .satisfies(RuntimeDependenciesTest::checkJavaNetProxy) .satisfies(RuntimeDependenciesTest::checkSlf4j) .satisfies(RuntimeDependenciesTest::checkKryo5) - .hasSize(21); + .hasSize(22); } private static void checkJavaIoUtil(List coordinates) { assertThatGroupId(coordinates, "com.github.nbbrd.java-io-util") .has(sameVersion()) .extracting(DependencyResolver.GAV::getArtifactId) - .containsExactlyInAnyOrder("java-io-picocsv", "java-io-xml", "java-io-base", "java-io-curl"); + .containsExactlyInAnyOrder( + "java-io-picocsv", + "java-io-xml", + "java-io-base", + "java-io-curl", + "java-io-http" + ); } private static void checkSdmxdl(List coordinates) { From a92567629e77bfc43c78c3745a526bf150d38943 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Wed, 20 Sep 2023 17:46:52 +0200 Subject: [PATCH 089/114] Fix java-io-util version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1c75b5e45..271f18b88 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,7 @@ com.github.nbbrd.java-io-util java-io-bom - 0.0.26-SNAPSHOT + 0.0.26 pom import From 251bd8652ada7f8ad8c215ab5c2c863a8088f7f7 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 21 Sep 2023 10:52:25 +0200 Subject: [PATCH 090/114] Pre-download dependencies with Maven --- .github/workflows/java8-maven.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/java8-maven.yml b/.github/workflows/java8-maven.yml index 40a33f18d..d4c924efc 100644 --- a/.github/workflows/java8-maven.yml +++ b/.github/workflows/java8-maven.yml @@ -28,6 +28,9 @@ jobs: java-version: ${{ matrix.java }} cache: 'maven' + - name: Pre-download dependencies with Maven + run: mvn -U -B -ntp dependency:go-offline + - name: Build and (headless) test with Maven uses: smithki/xvfb-action@v1.1.2 with: From c02d2245b87365db6a108821cc2a639a91162e50 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 25 Sep 2023 08:22:28 +0200 Subject: [PATCH 091/114] Add auto-merge on dependabot PR --- .github/workflows/java8-maven.yml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/java8-maven.yml b/.github/workflows/java8-maven.yml index d4c924efc..485bb564a 100644 --- a/.github/workflows/java8-maven.yml +++ b/.github/workflows/java8-maven.yml @@ -4,7 +4,7 @@ on: [ push, pull_request ] jobs: build-and-test-job: - if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.event.pull_request.base.repo.full_name + if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/heads/develop') || startsWith(github.ref, 'refs/tags/v') strategy: fail-fast: false matrix: @@ -36,6 +36,23 @@ jobs: with: run: mvn -U -B -ntp package + auto-merge-job: + needs: build-and-test-job + if: startsWith(github.repository, 'nbbrd/') && github.event_name == 'pull_request' && github.actor == 'dependabot[bot]' + permissions: + contents: write + pull-requests: write + + name: Auto-merge on dependabot PR + runs-on: ubuntu-latest + + steps: + - name: Merge PR + run: gh pr merge --auto --rebase "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + snapshot-job: needs: build-and-test-job if: startsWith(github.repository, 'nbbrd/') && startsWith(github.ref, 'refs/heads/develop') From a771605a38f8c3f26d4d6cc147b45da317bee314 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:11:22 +0000 Subject: [PATCH 092/114] Bump org.gaul:modernizer-maven-plugin from 2.6.0 to 2.7.0 Bumps [org.gaul:modernizer-maven-plugin](https://github.com/gaul/modernizer-maven-plugin) from 2.6.0 to 2.7.0. - [Release notes](https://github.com/gaul/modernizer-maven-plugin/releases) - [Commits](https://github.com/gaul/modernizer-maven-plugin/compare/modernizer-maven-plugin-2.6.0...modernizer-maven-plugin-2.7.0) --- updated-dependencies: - dependency-name: org.gaul:modernizer-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 271f18b88..78a6faf1c 100644 --- a/pom.xml +++ b/pom.xml @@ -539,7 +539,7 @@ org.gaul modernizer-maven-plugin - 2.6.0 + 2.7.0 1.8 From e3d749fb77bebbf64676b4033fad03eea455051a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:11:30 +0000 Subject: [PATCH 093/114] Bump org.projectlombok:lombok from 1.18.28 to 1.18.30 Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.28 to 1.18.30. - [Release notes](https://github.com/projectlombok/lombok/releases) - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.28...v1.18.30) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 78a6faf1c..4fa4d4507 100644 --- a/pom.xml +++ b/pom.xml @@ -289,7 +289,7 @@ - 1.18.28 + 1.18.30 1.7.0 1.4.0 4.7.5 From be558bfd8f88f4000c0811ec5a16d90552a18d64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 08:14:03 +0000 Subject: [PATCH 094/114] Bump quarkus.platform.version from 3.3.3 to 3.4.1 Bumps `quarkus.platform.version` from 3.3.3 to 3.4.1. Updates `io.quarkus.platform:quarkus-bom` from 3.3.3 to 3.4.1 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.3...3.4.1) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.3.3 to 3.4.1 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.3.3...3.4.1) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index ac9ad3314..448d8d0f9 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.3.3 + 3.4.1 true true From c4bd11a23d21087c86c9dc38f2b373e55bd154f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Sep 2023 12:28:23 +0000 Subject: [PATCH 095/114] Bump protobuf.version from 3.23.2 to 3.24.3 Bumps `protobuf.version` from 3.23.2 to 3.24.3. Updates `com.google.protobuf:protobuf-java` from 3.23.2 to 3.24.3 - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/protobuf_release.bzl) - [Commits](https://github.com/protocolbuffers/protobuf/compare/v3.23.2...v3.24.3) Updates `com.google.protobuf:protobuf-java-util` from 3.23.2 to 3.24.3 --- updated-dependencies: - dependency-name: com.google.protobuf:protobuf-java dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.google.protobuf:protobuf-java-util dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4fa4d4507..594ee5ec9 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 2.0.9 - 3.23.2 + 3.24.3 From 71abe210624a4008ee963cd185cd4787b06fb28d Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Thu, 28 Sep 2023 10:18:31 +0200 Subject: [PATCH 096/114] Add hugo-geekdoc auto update --- .github/workflows/hugo-geekdoc.yml | 59 ++++++++++++++++++++++++++++++ sdmx-dl-cli/pom.xml | 5 +-- 2 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/hugo-geekdoc.yml diff --git a/.github/workflows/hugo-geekdoc.yml b/.github/workflows/hugo-geekdoc.yml new file mode 100644 index 000000000..6bb75be19 --- /dev/null +++ b/.github/workflows/hugo-geekdoc.yml @@ -0,0 +1,59 @@ +name: Update hugo-geekdoc + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * SAT' + +jobs: + update-mvn-property: + runs-on: ubuntu-latest + name: Update Maven property using the latest release version (tag) of a GitHub repository + + env: + DEP_PROP: hugo-geekdoc.version + DEP_REPO: thegeeklab/hugo-geekdoc + + steps: + - name: Checkout source code + uses: actions/checkout@v4 + with: + submodules: true + fetch-depth: 0 + + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: 17 + cache: 'maven' + + - name: Get latest release version + id: lr + uses: pozetroninc/github-action-get-latest-release@master + with: + repository: ${{ env.DEP_REPO }} + + - name: Apply latest release version on Maven property + run: > + mvn -B -ntp versions:set-property + -Dproperty=${{ env.DEP_PROP }} + -DnewVersion=${{ steps.lr.outputs.release }} + -DgenerateBackupPoms=false + + - name: Create Pull Request + id: cpr + uses: peter-evans/create-pull-request@v5 + with: + commit-message: Bump ${{ env.DEP_PROP }} to ${{ steps.lr.outputs.release }} + title: Bump ${{ env.DEP_PROP }} to ${{ steps.lr.outputs.release }} + body: ${{ steps.lr.outputs.description }} + delete-branch: true + branch: PR/maven/${{ github.ref_name }}/${{ env.DEP_PROP }}-${{ steps.lr.outputs.release }} + labels: dependencies,java + + - name: Create summary + if: ${{ steps.cpr.outputs.pull-request-number }} + run: | + echo "Pull Request Number - ${{ steps.cpr.outputs.pull-request-number }}" >> $GITHUB_STEP_SUMMARY + echo "Pull Request URL - ${{ steps.cpr.outputs.pull-request-url }}" >> $GITHUB_STEP_SUMMARY diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 1222dbb86..0f4c58f5f 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -19,6 +19,7 @@ sdmxdl.cli.MainCommand + v0.37.1 @@ -309,12 +310,10 @@ - https://github.com/thegeeklab/hugo-geekdoc/releases/download/v0.37.1/hugo-geekdoc.tar.gz + https://github.com/thegeeklab/hugo-geekdoc/releases/download/${hugo-geekdoc.version}/hugo-geekdoc.tar.gz true ${project.parent.basedir}/docs/themes/hugo-geekdoc - c73105401b063c38cfed359f5ee0b4230c3686d4797a67d7b8e80dfb7b2492f1 - true From 956810f43ae16a1fa4f498a92daf0b304736965a Mon Sep 17 00:00:00 2001 From: charphi Date: Thu, 28 Sep 2023 08:24:51 +0000 Subject: [PATCH 097/114] Bump hugo-geekdoc.version to v0.41.1 --- sdmx-dl-cli/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 0f4c58f5f..c5483477c 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -19,7 +19,7 @@ sdmxdl.cli.MainCommand - v0.37.1 + v0.41.1 From f468f0f88e2d3f62e67c74b7bdf1da335bede418 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 29 Sep 2023 13:22:19 +0200 Subject: [PATCH 098/114] Fix project description in distributions --- sdmx-dl-cli/pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index c5483477c..1e225b706 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -355,6 +355,9 @@ + + Easily download official statistics + true From aeb9618c2cdf689c23774f8f665d746dca9a5c10 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 29 Sep 2023 14:43:09 +0200 Subject: [PATCH 099/114] Add open-web-site action --- .../main/java/sdmxdl/desktop/JDataSet.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java index dc698d8fa..99c50e736 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java @@ -8,6 +8,7 @@ import ec.util.grid.swing.AbstractGridModel; import ec.util.grid.swing.GridModel; import ec.util.grid.swing.JGrid; +import ec.util.various.swing.JCommand; import internal.sdmxdl.desktop.*; import lombok.NonNull; import nbbrd.io.text.Formatter; @@ -18,6 +19,7 @@ import sdmxdl.Languages; import sdmxdl.Obs; import sdmxdl.web.SdmxWebManager; +import sdmxdl.web.WebSource; import javax.swing.*; import javax.swing.table.DefaultTableModel; @@ -25,6 +27,7 @@ import javax.swing.table.TableModel; import java.awt.*; import java.beans.PropertyChangeEvent; +import java.net.URL; import java.sql.Timestamp; import java.text.NumberFormat; import java.time.format.DateTimeFormatter; @@ -32,6 +35,7 @@ import java.util.Map; import java.util.concurrent.ExecutionException; +import static java.util.Objects.requireNonNull; import static java.util.function.Function.identity; import static java.util.stream.Collectors.toMap; import static org.kordamp.ikonli.materialdesign.MaterialDesign.*; @@ -106,9 +110,11 @@ private void initComponents() { contentToolBar.add(Box.createHorizontalGlue()); contentToolBar.add(new ButtonBuilder() - .action(NoOpCommand.INSTANCE.toAction(this)) + .action(OpenWebsiteCommand.INSTANCE + .toAction(this) + .withWeakPropertyChangeListener(this, MODEL_PROPERTY)) .ikon(MDI_WEB) - .toolTipText("Open in web browser") + .toolTipText("Open web site") .buildButton()); contentToolBar.add(new ButtonBuilder() @@ -278,6 +284,31 @@ private static ObsFunction asObsFunction(SingleSeries item) { }; } + private static final class OpenWebsiteCommand extends JCommand { + + public static final OpenWebsiteCommand INSTANCE = new OpenWebsiteCommand(); + + @Override + public boolean isEnabled(@NonNull JDataSet component) { + return Desktop.isDesktopSupported() + && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE) + && getWebsite(component) != null; + } + + @Override + public void execute(@NonNull JDataSet component) throws Exception { + URL website = getWebsite(component); + Desktop.getDesktop().browse(requireNonNull(website).toURI()); + } + + private URL getWebsite(JDataSet c) { + DataSetRef model = c.getModel(); + if (model == null) return null; + WebSource source = c.getSdmxManager().getSources().get(model.getDataSourceRef().getSource()); + return source != null ? source.getWebsite() : null; + } + } + // private static final class CustomTooltip extends JLabel { // // private Popup popup; From 6d9a204e844b1aacaa0d7c9e22bd8965551bf399 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Fri, 29 Sep 2023 14:55:36 +0200 Subject: [PATCH 100/114] Add support of partial ISO date/time in TimeInterval --- CHANGELOG.md | 1 + .../src/main/java/sdmxdl/TimeInterval.java | 79 +++++++++++++++- .../test/java/sdmxdl/TimeIntervalTest.java | 91 +++++++++++++++++++ .../internal/sdmxdl/desktop/ObsFormats.java | 6 +- .../sdmxdl/desktop/SeriesMetaFormats.java | 16 ---- .../main/java/sdmxdl/desktop/JDataSet.java | 4 +- 6 files changed, 172 insertions(+), 25 deletions(-) create mode 100644 sdmx-dl-api/src/test/java/sdmxdl/TimeIntervalTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5614dcbe7..e0aec4a19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added +- ![API] Add support of partial ISO date/time in TimeInterval - ![PROVIDER] Allow caching & networking configuration by environment variables [#516](https://github.com/nbbrd/sdmx-dl/issues/516) - ![PROVIDER] Allow caching & networking configuration per source [#493](https://github.com/nbbrd/sdmx-dl/issues/493) diff --git a/sdmx-dl-api/src/main/java/sdmxdl/TimeInterval.java b/sdmx-dl-api/src/main/java/sdmxdl/TimeInterval.java index 7107814ff..d74d02f52 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/TimeInterval.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/TimeInterval.java @@ -5,7 +5,12 @@ import nbbrd.design.StaticFactoryMethod; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoField; +import java.time.temporal.ChronoUnit; +import java.util.Locale; /** * Simplified implementation of ISO-8601 time intervals that uses the start/duration expression. @@ -17,12 +22,12 @@ public class TimeInterval { @StaticFactoryMethod public static @NonNull TimeInterval parse(@NonNull CharSequence text) throws DateTimeParseException { String textAsString = text.toString(); - int index = textAsString.indexOf('/'); + int index = textAsString.indexOf(SEPARATOR); if (index == -1) { throw new DateTimeParseException("Cannot parse time interval", text, 0); } return new TimeInterval( - LocalDateTime.parse(textAsString.substring(0, index)), + LocalDateTime.parse(textAsString.substring(0, index), AT_LEAST_YEAR), Duration.parse(textAsString.substring(index + 1)) ); } @@ -33,6 +38,74 @@ public class TimeInterval { @Override public String toString() { - return start + "/" + duration; + return start.toString() + SEPARATOR + duration; } + + public @NonNull String toShortString() { + return getStartAsShortString() + SEPARATOR + duration; + } + + public @NonNull String getStartAsShortString() { + ChronoUnit minChronoUnit = getMinChronoUnit(duration); + int index = Math.max(getMinIndex(minChronoUnit), getDefaultingIndex(start)); + return start.toString().substring(0, index); + } + + private static int getMinIndex(ChronoUnit unit) { + switch (unit) { + case SECONDS: + return 19; + case MINUTES: + return 16; + case HOURS: + return 13; + case DAYS: + return 10; + case MONTHS: + return 7; + case YEARS: + return 4; + default: + return 23; + } + } + + private static int getDefaultingIndex(LocalDateTime start) { + if (start.getNano() != 0) + return 23; + if (start.getSecond() != 0) + return 19; + if (start.getMinute() != 0) + return 16; + if (start.getHour() != 0) + return 13; + if (start.getDayOfMonth() != 1) + return 10; + if (start.getMonthValue() != 1) + return 7; + return 4; + } + + private static ChronoUnit getMinChronoUnit(Duration duration) { + return duration.getUnits().stream() + .filter(o -> duration.get(o) != 0) + .filter(ChronoUnit.class::isInstance) + .map(ChronoUnit.class::cast) + .sorted() + .findFirst() + .orElse(ChronoUnit.FOREVER); + } + + private static final DateTimeFormatter AT_LEAST_YEAR = new DateTimeFormatterBuilder() + .appendValue(ChronoField.YEAR, 4) + .appendPattern("['-'MM['-'dd['T'HH[':'mm[':'ss['.'SSS]]]]]]") + .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) + .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) + .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) + .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) + .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) + .parseDefaulting(ChronoField.NANO_OF_SECOND, 0) + .toFormatter(Locale.ROOT); + + private static final char SEPARATOR = '/'; } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/TimeIntervalTest.java b/sdmx-dl-api/src/test/java/sdmxdl/TimeIntervalTest.java new file mode 100644 index 000000000..35eb80ca7 --- /dev/null +++ b/sdmx-dl-api/src/test/java/sdmxdl/TimeIntervalTest.java @@ -0,0 +1,91 @@ +package sdmxdl; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.format.DateTimeParseException; + +import static org.assertj.core.api.Assertions.*; +import static sdmxdl.TimeInterval.parse; + +public class TimeIntervalTest { + + @SuppressWarnings("DataFlowIssue") + @Test + public void testParse() { + assertThatNullPointerException() + .isThrownBy(() -> parse(null)); + + assertThatExceptionOfType(DateTimeParseException.class) + .isThrownBy(() -> parse("2010-02-15T00:00\\P2D")); + + assertThatExceptionOfType(DateTimeParseException.class) + .isThrownBy(() -> parse("2010-02-15T00:00")); + + assertThatExceptionOfType(DateTimeParseException.class) + .isThrownBy(() -> parse("P2D")); + + assertThatExceptionOfType(DateTimeParseException.class) + .isThrownBy(() -> parse("")); + + assertThat(parse("2010-02-15T11:22/P2M")) + .returns(LocalDateTime.parse("2010-02-15T11:22"), TimeInterval::getStart) + .returns(P2M, TimeInterval::getDuration); + + assertThat(parse("2010-02-15T11/P2M")) + .returns(LocalDateTime.parse("2010-02-15T11:00"), TimeInterval::getStart) + .returns(P2M, TimeInterval::getDuration); + + assertThat(parse("2010-02-15/P2M")) + .returns(LocalDateTime.parse("2010-02-15T00:00"), TimeInterval::getStart) + .returns(P2M, TimeInterval::getDuration); + + assertThat(parse("2010-02/P2M")) + .returns(LocalDateTime.parse("2010-02-01T00:00"), TimeInterval::getStart) + .returns(P2M, TimeInterval::getDuration); + + assertThat(parse("2010/P2M")) + .returns(LocalDateTime.parse("2010-01-01T00:00"), TimeInterval::getStart) + .returns(P2M, TimeInterval::getDuration); + } + + @Test + public void testToShortString() { + assertThat(parse("2010-02-15T11:22/P1Y").toShortString()) + .isEqualTo("2010-02-15T11:22/P1Y"); + assertThat(parse("2010-02-15T11/P1Y").toShortString()) + .isEqualTo("2010-02-15T11/P1Y"); + assertThat(parse("2010-02-15/P1Y").toShortString()) + .isEqualTo("2010-02-15/P1Y"); + assertThat(parse("2010-02/P1Y").toShortString()) + .isEqualTo("2010-02/P1Y"); + assertThat(parse("2010/P1Y").toShortString()) + .isEqualTo("2010/P1Y"); + + assertThat(parse("2010-02-15T11:22/P2M").toShortString()) + .isEqualTo("2010-02-15T11:22/P2M"); + assertThat(parse("2010-02-15T11/P2M").toShortString()) + .isEqualTo("2010-02-15T11/P2M"); + assertThat(parse("2010-02-15/P2M").toShortString()) + .isEqualTo("2010-02-15/P2M"); + assertThat(parse("2010-02/P2M").toShortString()) + .isEqualTo("2010-02/P2M"); + assertThat(parse("2010/P2M").toShortString()) + .isEqualTo("2010-01/P2M"); + + assertThat(parse("2010-02-15T11:22/P3D").toShortString()) + .isEqualTo("2010-02-15T11:22/P3D"); + assertThat(parse("2010-02-15T11/P3D").toShortString()) + .isEqualTo("2010-02-15T11/P3D"); + assertThat(parse("2010-02-15/P3D").toShortString()) + .isEqualTo("2010-02-15/P3D"); + assertThat(parse("2010-02/P3D").toShortString()) + .isEqualTo("2010-02-01/P3D"); + assertThat(parse("2010/P3D").toShortString()) + .isEqualTo("2010-01-01/P3D"); + } + + private static final Duration P1Y = Duration.parse("P1Y"); + private static final Duration P2M = Duration.parse("P2M"); + private static final Duration P3D = Duration.parse("P3D"); +} diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java index eefda9d9f..99fdcd49d 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/ObsFormats.java @@ -4,8 +4,8 @@ import nbbrd.io.text.Formatter; import sdmxdl.Attribute; import sdmxdl.AttributeRelationship; -import sdmxdl.Structure; import sdmxdl.Obs; +import sdmxdl.Structure; import java.util.Map; import java.util.function.Function; @@ -23,7 +23,7 @@ public static Formatter getChartTooltipFormatter(Structure dsd) { } private static String getChartToolTipText(Obs obs, Map attributes) { - return obs.getPeriod() + ": " + obs.getValue(); + return obs.getPeriod().toShortString() + ": " + obs.getValue(); } public static Formatter getHtmlTooltipFormatter(Structure dsd) { @@ -36,7 +36,7 @@ public static Formatter getHtmlTooltipFormatter(Structure dsd) { private static String getToolTipText(Obs obs, Map attributes) { return html( table( - tr(th("Period:").withStyle("text-align:right"), td(text(obs.getPeriod().toString()))), + tr(th("Period:").withStyle("text-align:right"), td(text(obs.getPeriod().toShortString()))), tr(th("Value:").withStyle("text-align:right"), td(text(String.valueOf(obs.getValue())))), tr(th("Meta:").withStyle("text-align:right"), td(metaToHtml(obs.getMeta(), attributes))) ) diff --git a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java index 1ac18d5f4..c2d3f959d 100644 --- a/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java +++ b/sdmx-dl-desktop/src/main/java/internal/sdmxdl/desktop/SeriesMetaFormats.java @@ -4,7 +4,6 @@ import sdmxdl.provider.ext.SeriesMeta; import java.text.*; -import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAmount; import java.util.Locale; import java.util.stream.Collectors; @@ -12,21 +11,6 @@ public final class SeriesMetaFormats { - public static DateTimeFormatter getDateTimeFormatter(SeriesMeta meta) { - TemporalAmount timeUnit = meta.getTimeUnit(); - if (timeUnit != null) { - switch (timeUnit.toString()) { - case "P1D": - return DateTimeFormatter.ISO_LOCAL_DATE; - case "P1M": - return DateTimeFormatter.ofPattern("uuuu-MM", Locale.getDefault(Locale.Category.DISPLAY)); - case "P1Y": - return DateTimeFormatter.ofPattern("uuuu", Locale.getDefault(Locale.Category.DISPLAY)); - } - } - return DateTimeFormatter.ISO_LOCAL_DATE_TIME; - } - public static DateFormat getDateFormat(SeriesMeta meta) { TemporalAmount timeUnit = meta.getTimeUnit(); if (timeUnit != null) { diff --git a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java index 99c50e736..c604cd23f 100644 --- a/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java +++ b/sdmx-dl-desktop/src/main/java/sdmxdl/desktop/JDataSet.java @@ -30,7 +30,6 @@ import java.net.URL; import java.sql.Timestamp; import java.text.NumberFormat; -import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; @@ -183,7 +182,6 @@ private void reportError(Exception ex) { private GridModel asGridModel(SingleSeries item) { List data = item.getSeries().getObsList(); - DateTimeFormatter dateTimeFormatter = SeriesMetaFormats.getDateTimeFormatter(item.getMeta()); return new AbstractGridModel() { @Override public int getRowCount() { @@ -207,7 +205,7 @@ public String getColumnName(int column) { @Override public String getRowName(int rowIndex) { - return dateTimeFormatter.format(data.get(rowIndex).getPeriod().getStart()); + return data.get(rowIndex).getPeriod().getStartAsShortString(); } }; } From 3fe27aed68bcc34097306cbbe621c53ba03deec4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 30 Sep 2023 02:51:56 +0000 Subject: [PATCH 101/114] Bump org.apache.maven.plugins:maven-shade-plugin from 3.5.0 to 3.5.1 Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.0 to 3.5.1. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.0...maven-shade-plugin-3.5.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 594ee5ec9..276878ea3 100644 --- a/pom.xml +++ b/pom.xml @@ -160,7 +160,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.5.0 + 3.5.1 org.xolstice.maven.plugins From 3d52ae8210c4ac14865398f59c64ab0ee926f7d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:53:36 +0000 Subject: [PATCH 102/114] Bump org.checkerframework:checker-qual from 3.38.0 to 3.39.0 Bumps [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) from 3.38.0 to 3.39.0. - [Release notes](https://github.com/typetools/checker-framework/releases) - [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md) - [Commits](https://github.com/typetools/checker-framework/compare/checker-framework-3.38.0...checker-framework-3.39.0) --- updated-dependencies: - dependency-name: org.checkerframework:checker-qual dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 276878ea3..a63caac1a 100644 --- a/pom.xml +++ b/pom.xml @@ -46,7 +46,7 @@ org.checkerframework checker-qual - 3.38.0 + 3.39.0 From d6cfd952f2890a7ff429654dbba3b4c6246e784d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:53:31 +0000 Subject: [PATCH 103/114] Bump protobuf.version from 3.24.3 to 3.24.4 Bumps `protobuf.version` from 3.24.3 to 3.24.4. Updates `com.google.protobuf:protobuf-java` from 3.24.3 to 3.24.4 - [Release notes](https://github.com/protocolbuffers/protobuf/releases) - [Changelog](https://github.com/protocolbuffers/protobuf/blob/main/protobuf_release.bzl) - [Commits](https://github.com/protocolbuffers/protobuf/compare/v3.24.3...v3.24.4) Updates `com.google.protobuf:protobuf-java-util` from 3.24.3 to 3.24.4 --- updated-dependencies: - dependency-name: com.google.protobuf:protobuf-java dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.google.protobuf:protobuf-java-util dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a63caac1a..3ce36bc66 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 2.0.9 - 3.24.3 + 3.24.4 From f181396f1028e20075490a1d06cf6ed26da5d422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:54:05 +0000 Subject: [PATCH 104/114] Bump de.thetaphi:forbiddenapis from 3.5.1 to 3.6 Bumps [de.thetaphi:forbiddenapis](https://github.com/policeman-tools/forbidden-apis) from 3.5.1 to 3.6. - [Commits](https://github.com/policeman-tools/forbidden-apis/compare/3.5.1...3.6) --- updated-dependencies: - dependency-name: de.thetaphi:forbiddenapis dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3ce36bc66..39f0165a0 100644 --- a/pom.xml +++ b/pom.xml @@ -175,7 +175,7 @@ de.thetaphi forbiddenapis - 3.5.1 + 3.6 From a471f91f4a5f2e6359a3fb3feb95c78404452112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 7 Oct 2023 02:53:56 +0000 Subject: [PATCH 105/114] Bump quarkus.platform.version from 3.4.1 to 3.4.2 Bumps `quarkus.platform.version` from 3.4.1 to 3.4.2. Updates `io.quarkus.platform:quarkus-bom` from 3.4.1 to 3.4.2 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.4.1...3.4.2) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.4.1 to 3.4.2 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.4.1...3.4.2) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 448d8d0f9..4aaf510a6 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.4.1 + 3.4.2 true true From 2121df4c97185f334e34bcb21d4f9b84bb153e68 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 2 Oct 2023 15:11:26 +0200 Subject: [PATCH 106/114] Improve support of ISO-8601 duration --- CHANGELOG.md | 1 + .../src/main/java/sdmxdl/Duration.java | 194 ++++++--- .../src/test/java/sdmxdl/DurationTest.java | 400 ++++++++++-------- .../format/time/GregorianTimePeriod.java | 12 +- .../format/time/StandardReportingFormat.java | 22 +- .../connectors/drivers/InseeDriver.java | 7 +- .../dialects/drivers/InseeDialectDriver.java | 2 +- 7 files changed, 360 insertions(+), 278 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0aec4a19..b0a152cb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ![API] Handle languages per connection instead of per manager [#507](https://github.com/nbbrd/sdmx-dl/issues/507) - ![API] Simplify naming and structure [#508](https://github.com/nbbrd/sdmx-dl/issues/508) - ![API] Change pattern of drivers properties +- ![API] Improve support of ISO-8601 duration - ![SOURCE] Update ECB endpoint [#495](https://github.com/nbbrd/sdmx-dl/issues/495) - ![FORMAT] Refactor file format API [#502](https://github.com/nbbrd/sdmx-dl/issues/502) - ![PROVIDER] Move curl backend to an external project diff --git a/sdmx-dl-api/src/main/java/sdmxdl/Duration.java b/sdmx-dl-api/src/main/java/sdmxdl/Duration.java index 1dc36d26a..2b5fb0719 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/Duration.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/Duration.java @@ -6,9 +6,6 @@ import nbbrd.design.StaticFactoryMethod; import java.time.DateTimeException; -import java.time.chrono.ChronoPeriod; -import java.time.chrono.Chronology; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeParseException; import java.time.temporal.*; import java.util.List; @@ -22,30 +19,87 @@ /** * An amount of time in the ISO-8601 calendar system, such as '2 years, 3 months and 4 days'. + * This implementation does not support decimal fractions. + *

+ * See wikipedia */ @RepresentableAsString @lombok.Value @lombok.AllArgsConstructor(access = AccessLevel.PRIVATE) -public class Duration implements ChronoPeriod { +public class Duration implements TemporalAmount { /** * A constant for a duration of zero. */ public static final Duration ZERO = new Duration(0, 0, 0, 0, 0, 0, 0); - private static final Pattern PATTERN = Pattern.compile("^P(?=\\d+[YMWD])(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(?=\\d+[HMS])(\\d+H)?(\\d+M)?(\\d+S)?)?$"); + /** + * Reporting year + */ + public static final Duration P1Y = new Duration(1, 0, 0, 0, 0, 0, 0); + + /** + * Reporting month + */ + public static final Duration P1M = new Duration(0, 1, 0, 0, 0, 0, 0); + + /** + * Reporting quarter + */ + public static final Duration P3M = new Duration(0, 3, 0, 0, 0, 0, 0); + + /** + * Reporting trimester + */ + public static final Duration P4M = new Duration(0, 4, 0, 0, 0, 0, 0); + + /** + * Reporting semester + */ + public static final Duration P6M = new Duration(0, 6, 0, 0, 0, 0, 0); + + /** + * Reporting day + */ + public static final Duration P1D = new Duration(0, 0, 1, 0, 0, 0, 0); + + /** + * Reporting week + */ + public static final Duration P7D = new Duration(0, 0, 7, 0, 0, 0, 0); + + private static final Pattern PATTERN = Pattern.compile("^P(?!$)(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(T(?=\\d+[HMS])(\\d+H)?(\\d+M)?(\\d+S)?)?$"); private static final List SUPPORTED_UNITS = unmodifiableList(asList(YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, WEEKS)); @StaticFactoryMethod public static @NonNull Duration parse(@NonNull CharSequence text) throws DateTimeParseException { + if (text.length() == 3) { + if (text.charAt(0) != 'P') + throw new DateTimeParseException("Cannot parse using duration pattern", text, 0); + if (!Character.isDigit(text.charAt(1))) + throw new DateTimeParseException("Cannot parse using duration pattern", text, 0); + int count = text.charAt(1) - '0'; + switch (text.charAt(2)) { + case 'Y': + return ofYears(count); + case 'M': + return ofMonths(count); + case 'D': + return ofDays(count); + case 'W': + return ofWeeks(count); + default: + throw new DateTimeParseException("Cannot parse using duration pattern", text, 0); + } + } Matcher m = PATTERN.matcher(text); if (!m.matches()) { throw new DateTimeParseException("Cannot parse using duration pattern", text, 0); } return m.group(3) == null ? create(toInt(m, 1), toInt(m, 2), toInt(m, 4), toInt(m, 6), toInt(m, 7), toInt(m, 8)) - : create(toInt(m, 3)); + : ofWeeks(toInt(m, 3)); } @StaticFactoryMethod @@ -53,9 +107,6 @@ public class Duration implements ChronoPeriod { if (amount instanceof Duration) { return (Duration) amount; } - if (!hasIsoChronology(amount)) { - throw new DateTimeException("Period requires ISO chronology: " + amount); - } int years = 0; int months = 0; int days = 0; @@ -64,25 +115,78 @@ public class Duration implements ChronoPeriod { int seconds = 0; for (TemporalUnit unit : amount.getUnits()) { long unitAmount = amount.get(unit); - if (unit == YEARS) years = toIntExact(unitAmount); - else if (unit == MONTHS) months = toIntExact(unitAmount); - else if (unit == DAYS) days = toIntExact(unitAmount); - else if (unit == HOURS) hours = toIntExact(unitAmount); - else if (unit == MINUTES) minutes = toIntExact(unitAmount); - else if (unit == SECONDS) seconds = toIntExact(unitAmount); - else throw new DateTimeException("Unit must be Years, Months or Days, but was " + unit); + if (unitAmount < 0) + throw new DateTimeException("Negative unit amounts are not supported: " + unitAmount + " " + unit); + if (unitAmount > 0) { + if (unit == YEARS) years = toIntExact(unitAmount); + else if (unit == MONTHS) months = toIntExact(unitAmount); + else if (unit == DAYS) days = toIntExact(unitAmount); + else if (unit == HOURS) hours = toIntExact(unitAmount); + else if (unit == MINUTES) minutes = toIntExact(unitAmount); + else if (unit == SECONDS) seconds = toIntExact(unitAmount); + else + throw new DateTimeException("Unit must be Years, Months, Days, Hours, Minutes or Seconds but was " + unit); + } } return create(years, months, days, hours, minutes, seconds); } private static Duration create(int years, int months, int days, int hours, int minutes, int seconds) { - return (years | months | days | hours | minutes | seconds) == 0 - ? ZERO - : new Duration(years, months, days, hours, minutes, seconds, 0); + int count = min(1, years) + min(1, months) + min(1, days) + min(1, hours) + min(1, minutes) + min(1, seconds); + if (count == 0) return ZERO; + if (count == 1) { + if (years != 0) return ofYears(years); + if (months != 0) return ofMonths(months); + if (days != 0) return ofDays(days); + } + return new Duration(years, months, days, hours, minutes, seconds, 0); + } + + private static Duration ofYears(int years) { + switch (years) { + case 0: + return ZERO; + case 1: + return P1Y; + default: + return new Duration(years, 0, 0, 0, 0, 0, 0); + } + } + + private static Duration ofMonths(int months) { + switch (months) { + case 0: + return ZERO; + case 1: + return P1M; + case 3: + return P3M; + case 4: + return P4M; + case 6: + return P6M; + default: + return new Duration(0, months, 0, 0, 0, 0, 0); + } + } + + private static Duration ofDays(int days) { + switch (days) { + case 0: + return ZERO; + case 1: + return P1D; + case 7: + return P7D; + default: + return new Duration(0, 0, days, 0, 0, 0, 0); + } } - private static Duration create(int weeks) { - return weeks == 0 ? ZERO : new Duration(0, 0, 0, 0, 0, 0, weeks); + private static Duration ofWeeks(int weeks) { + return weeks == 0 + ? ZERO + : new Duration(0, 0, 0, 0, 0, 0, weeks); } /** @@ -198,44 +302,11 @@ public Temporal subtractFrom(Temporal temporal) { return result; } - @Override - public Chronology getChronology() { - return IsoChronology.INSTANCE; - } - - @Override - public Duration plus(@NonNull TemporalAmount amountToAdd) { - Duration isoAmount = Duration.from(amountToAdd); - return weeks == 0 - ? create( - addExact(years, isoAmount.years), - addExact(months, isoAmount.months), - addExact(days, isoAmount.days), - addExact(hours, isoAmount.hours), - addExact(minutes, isoAmount.minutes), - addExact(seconds, isoAmount.seconds)) - : create(addExact(weeks, isoAmount.weeks)); - } - - @Override - public Duration minus(@NonNull TemporalAmount amountToSubtract) { - Duration isoAmount = Duration.from(amountToSubtract); - return weeks == 0 - ? create( - subtractExact(years, isoAmount.years), - subtractExact(months, isoAmount.months), - subtractExact(days, isoAmount.days), - subtractExact(hours, isoAmount.hours), - subtractExact(minutes, isoAmount.minutes), - subtractExact(seconds, isoAmount.seconds)) - : create(subtractExact(weeks, isoAmount.weeks)); - } - public @NonNull Duration multipliedBy(int scalar) { if (this == ZERO || scalar == 1) { return this; } - return weeks == 0 + return isNotWeeks() ? create( multiplyExact(years, scalar), multiplyExact(months, scalar), @@ -243,22 +314,15 @@ public Duration minus(@NonNull TemporalAmount amountToSubtract) { multiplyExact(hours, scalar), multiplyExact(minutes, scalar), multiplyExact(seconds, scalar)) - : create(multiplyExact(weeks, scalar)); + : ofWeeks(multiplyExact(weeks, scalar)); } - @Override - public Duration normalized() { - return weeks == 0 - ? create(years + (months / 12), months % 12, days, hours, minutes, seconds) - : this; + private boolean isNotWeeks() { + return weeks == 0; } private static int toInt(Matcher matcher, int group) { String result = matcher.group(group); return result != null ? Integer.parseInt(result.substring(0, result.length() - 1)) : 0; } - - private static boolean hasIsoChronology(TemporalAmount amount) { - return amount instanceof ChronoPeriod && IsoChronology.INSTANCE.equals(((ChronoPeriod) amount).getChronology()); - } } diff --git a/sdmx-dl-api/src/test/java/sdmxdl/DurationTest.java b/sdmx-dl-api/src/test/java/sdmxdl/DurationTest.java index ba3ede8d9..2559ad8b3 100644 --- a/sdmx-dl-api/src/test/java/sdmxdl/DurationTest.java +++ b/sdmx-dl-api/src/test/java/sdmxdl/DurationTest.java @@ -1,14 +1,17 @@ package sdmxdl; +import org.assertj.core.api.ThrowableTypeAssert; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; import java.time.DateTimeException; import java.time.LocalDateTime; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeParseException; import java.time.temporal.UnsupportedTemporalTypeException; +import java.util.Arrays; +import java.util.List; import java.util.function.Function; import java.util.stream.Stream; @@ -21,12 +24,18 @@ public class DurationTest { @Test - public void testZERO() { - assertThat(ZERO) - .hasToString(P0D) - .isEqualTo(ZERO) - .extracting("years", "months", "days", "hours", "minutes", "seconds", "weeks") - .containsExactly(0, 0, 0, 0, 0, 0, 0); + public void testConstants() { + assertThat(ZERO).isSameAs(parse("P0D")); + assertThat(P1Y).isSameAs(parse("P1Y")); + assertThat(P6M).isSameAs(parse("P6M")); + assertThat(P4M).isSameAs(parse("P4M")); + assertThat(P3M).isSameAs(parse("P3M")); + assertThat(P1M).isSameAs(parse("P1M")); + assertThat(P7D).isSameAs(parse("P7D")); + assertThat(P1D).isSameAs(parse("P1D")); + + assertThat(_P1W_).isNotSameAs(parse("P1W")); + assertThat(_P3Y6M4DT12H30M5S_).isNotSameAs(parse("P3Y6M4DT12H30M5S")); } @Test @@ -34,168 +43,223 @@ public void testParse() { assertThatNullPointerException() .isThrownBy(() -> parse(null)); - assertThatExceptionOfType(DateTimeParseException.class) - .isThrownBy(() -> parse("")); + assertThatDateTimeParseException() + .isThrownBy(() -> parse("")) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse("P")) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse("P1X")) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse("P M")) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse(" ")) + .withMessageContaining("Cannot parse using duration pattern"); - assertThatExceptionOfType(DateTimeParseException.class) - .isThrownBy(() -> parse("P")); + assertThatDateTimeParseException() + .isThrownBy(() -> parse("P1MX")) + .withMessageContaining("Cannot parse using duration pattern"); - assertThatExceptionOfType(DateTimeParseException.class) - .isThrownBy(() -> parse("P1X")); + assertThatDateTimeParseException() + .isThrownBy(() -> parse(DECIMAL_FRACTION_JAVA_DURATION.toString())) + .withMessageContaining("Cannot parse using duration pattern"); - assertThatExceptionOfType(DateTimeParseException.class) - .isThrownBy(() -> parse("P1MX")); + assertThatDateTimeParseException() + .isThrownBy(() -> parse(INFIX_NEGATIVE_JAVA_DURATION.toString())) + .withMessageContaining("Cannot parse using duration pattern"); - assertThatExceptionOfType(DateTimeParseException.class) + assertThatDateTimeParseException() + .isThrownBy(() -> parse(PREFIX_NEGATIVE_JAVA_DURATION.toString())) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse(INFIX_NEGATIVE_JAVA_PERIOD.toString())) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() + .isThrownBy(() -> parse(PREFIX_NEGATIVE_JAVA_PERIOD.toString())) + .withMessageContaining("Cannot parse using duration pattern"); + + assertThatDateTimeParseException() .isThrownBy(() -> parse("PT")); String[] fields = {"years", "months", "days", "hours", "minutes", "seconds", "weeks"}; - assertThat(parse(P0D)) + assertThat(parse("P0D")) .extracting(fields) .containsExactly(0, 0, 0, 0, 0, 0, 0); - assertThat(parse(P1W)) - .extracting(fields) - .containsExactly(0, 0, 0, 0, 0, 0, 1); - - assertThat(parse(P1Y)) + assertThat(parse("P1Y")) .extracting(fields) .containsExactly(1, 0, 0, 0, 0, 0, 0); - assertThat(parse(P6M)) + assertThat(parse("P6M")) .extracting(fields) .containsExactly(0, 6, 0, 0, 0, 0, 0); - assertThat(parse(P4M)) + assertThat(parse("P4M")) .extracting(fields) .containsExactly(0, 4, 0, 0, 0, 0, 0); - assertThat(parse(P3M)) + assertThat(parse("P3M")) .extracting(fields) .containsExactly(0, 3, 0, 0, 0, 0, 0); - assertThat(parse(P1M)) + assertThat(parse("P1M")) .extracting(fields) .containsExactly(0, 1, 0, 0, 0, 0, 0); - assertThat(parse(P7D)) + assertThat(parse("P7D")) .extracting(fields) .containsExactly(0, 0, 7, 0, 0, 0, 0); - assertThat(parse(P1D)) + assertThat(parse("P1D")) .extracting(fields) .containsExactly(0, 0, 1, 0, 0, 0, 0); - assertThat(parse(P3Y6M4DT12H30M5S)) + assertThat(parse("P1W")) .extracting(fields) - .containsExactly(3, 6, 4, 12, 30, 5, 0); - } + .containsExactly(0, 0, 0, 0, 0, 0, 1); - @Test - public void testFrom() { - assertThatNullPointerException() - .isThrownBy(() -> from(null)); + assertThat(parse("P3Y6M4DT12H30M5S")) + .extracting(fields) + .containsExactly(3, 6, 4, 12, 30, 5, 0); - assertThat(from(parse(P1D))) - .isEqualTo(parse(P1D)); + assertThat(parse("P12W")) + .extracting(fields) + .containsExactly(0, 0, 0, 0, 0, 0, 12); + + assertThat(parse("P0Y")).isSameAs(ZERO); + assertThat(parse("P0M")).isSameAs(ZERO); + assertThat(parse("P0D")).isSameAs(ZERO); + assertThat(parse("P0W")).isSameAs(ZERO); + assertThat(parse("PT0H")).isSameAs(ZERO); + assertThat(parse("PT0M")).isSameAs(ZERO); + assertThat(parse("PT0S")).isSameAs(ZERO); + } - assertThatExceptionOfType(DateTimeException.class) - .isThrownBy(() -> from(java.time.Duration.ZERO)); + @ParameterizedTest + @MethodSource("getConstants") + public void testFromConstant(Duration duration) { + assertThat(from(duration)).isSameAs(duration); + } - assertThat(from(java.time.Period.parse("P1D"))) - .isEqualTo(parse(P1D)); + @Test + public void testFromNonConstant() { + assertThatNullPointerException().isThrownBy(() -> from(null)); + assertThat(from(_P1W_)).isSameAs(_P1W_); + assertThat(from(_P3Y6M4DT12H30M5S_)).isSameAs(_P3Y6M4DT12H30M5S_); } @Test - public void testToString() { - assertThat(parse(P0D)) - .hasToString(P0D); + public void testFromJavaPeriod() { + assertThat(from(java.time.Period.ZERO)).isSameAs(ZERO); + assertThat(from(java.time.Period.parse(P1Y.toString()))).isSameAs(P1Y); + assertThat(from(java.time.Period.parse(P1M.toString()))).isSameAs(P1M); + assertThat(from(java.time.Period.parse(P1D.toString()))).isSameAs(P1D); - assertThat(parse(P1W)) - .hasToString(P1W); + assertThat(from(java.time.Period.parse(_P1W_.toString()))).isEqualTo(P7D); - assertThat(parse(P1Y)) - .hasToString(P1Y); + assertThatDateTimeException() + .isThrownBy(() -> from(INFIX_NEGATIVE_JAVA_PERIOD)) + .withMessageContaining("Negative unit amounts are not supported: -1 Years"); - assertThat(parse(P6M)) - .hasToString(P6M); + assertThatDateTimeException() + .isThrownBy(() -> from(PREFIX_NEGATIVE_JAVA_PERIOD)) + .withMessageContaining("Negative unit amounts are not supported: -1 Years"); + } - assertThat(parse(P4M)) - .hasToString(P4M); + @Test + public void testFromJavaDuration() { + assertThat(from(java.time.Duration.ZERO)).isSameAs(ZERO); - assertThat(parse(P3M)) - .hasToString(P3M); + assertThat(from(java.time.Duration.parse("PT15M"))).isEqualTo(parse("PT900S")); + assertThat(from(java.time.Duration.parse("PT10H"))).isEqualTo(parse("PT36000S")); + assertThat(from(java.time.Duration.parse("P2D"))).isEqualTo(parse("PT172800S")); + assertThat(from(java.time.Duration.parse("P2DT3H4M"))).isEqualTo(parse("PT183840S")); + assertThat(from(java.time.Duration.parse("-PT-6H+3M"))).isEqualTo(parse("PT21420S")); - assertThat(parse(P1M)) - .hasToString(P1M); + assertThatDateTimeException() + .isThrownBy(() -> from(INFIX_NEGATIVE_JAVA_DURATION)); - assertThat(parse(P7D)) - .hasToString(P7D); + assertThatDateTimeException() + .isThrownBy(() -> from(PREFIX_NEGATIVE_JAVA_DURATION)); - assertThat(parse(P1D)) - .hasToString(P1D); + assertThatDateTimeException() + .isThrownBy(() -> from(DECIMAL_FRACTION_JAVA_DURATION)) + .withMessageContaining("Unit must be Years, Months, Days, Hours, Minutes or Seconds but was Nanos"); + } - assertThat(parse(P3Y6M4DT12H30M5S)) - .hasToString("P3Y6M4DT12H30M5S"); + @ParameterizedTest + @ValueSource(strings = {"P1D", "P0D", "P1W", "P1Y", "P6M", "P4M", "P3M", "P1M", "P7D", "P3Y6M4DT12H30M5S"}) + public void testToString(String text) { + assertThat(parse(text)) + .hasToString(text); } @SuppressWarnings({"unchecked", "rawtypes"}) @Test public void testGet() { assertThatNullPointerException() - .isThrownBy(() -> parse(P1D).get(null)); + .isThrownBy(() -> P1D.get(null)); assertThatExceptionOfType(UnsupportedTemporalTypeException.class) - .isThrownBy(() -> parse(P1D).get(DECADES)); + .isThrownBy(() -> P1D.get(DECADES)); Function[] extractors = Stream.of(YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, WEEKS) .map(unit -> (Function) duration -> (int) duration.get(unit)) .toArray(Function[]::new); - assertThat(parse(P0D)) + assertThat(ZERO) .extracting(extractors) .containsExactly(0, 0, 0, 0, 0, 0, 0); - assertThat(parse(P1W)) + assertThat(_P1W_) .extracting(extractors) .containsExactly(0, 0, 0, 0, 0, 0, 1); - assertThat(parse(P1Y)) + assertThat(P1Y) .extracting(extractors) .containsExactly(1, 0, 0, 0, 0, 0, 0); - assertThat(parse(P6M)) + assertThat(P6M) .extracting(extractors) .containsExactly(0, 6, 0, 0, 0, 0, 0); - assertThat(parse(P4M)) + assertThat(P4M) .extracting(extractors) .containsExactly(0, 4, 0, 0, 0, 0, 0); - assertThat(parse(P3M)) + assertThat(P3M) .extracting(extractors) .containsExactly(0, 3, 0, 0, 0, 0, 0); - assertThat(parse(P1M)) + assertThat(P1M) .extracting(extractors) .containsExactly(0, 1, 0, 0, 0, 0, 0); - assertThat(parse(P7D)) + assertThat(P7D) .extracting(extractors) .containsExactly(0, 0, 7, 0, 0, 0, 0); - assertThat(parse(P1D)) + assertThat(P1D) .extracting(extractors) .containsExactly(0, 0, 1, 0, 0, 0, 0); - assertThat(parse(P3Y6M4DT12H30M5S)) + assertThat(_P3Y6M4DT12H30M5S_) .extracting(extractors) .containsExactly(3, 6, 4, 12, 30, 5, 0); } @ParameterizedTest - @ValueSource(strings = {P1D, P0D, P1W, P1Y, P6M, P4M, P3M, P1M, P7D, P3Y6M4DT12H30M5S}) + @ValueSource(strings = {"P1D", "P0D", "P1W", "P1Y", "P6M", "P4M", "P3M", "P1M", "P7D", "P3Y6M4DT12H30M5S"}) public void testGetUnits(String text) { assertThat(parse(text).getUnits()) .containsExactly(YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS, WEEKS); @@ -203,161 +267,125 @@ public void testGetUnits(String text) { @Test public void testAddTo() { - assertThat(parse(P0D).addTo(dateTime)) + assertThat(ZERO.addTo(dateTime)) .isEqualTo(dateTime); - assertThat(parse(P1W).addTo(dateTime)) - .isEqualTo(dateTime.plus(1, WEEKS)); + assertThat(_P1W_.addTo(dateTime)) + .isEqualTo(dateTime.plusWeeks(1)); - assertThat(parse(P1Y).addTo(dateTime)) - .isEqualTo(dateTime.plus(1, YEARS)); + assertThat(P1Y.addTo(dateTime)) + .isEqualTo(dateTime.plusYears(1)); - assertThat(parse(P6M).addTo(dateTime)) - .isEqualTo(dateTime.plus(6, MONTHS)); + assertThat(P6M.addTo(dateTime)) + .isEqualTo(dateTime.plusMonths(6)); - assertThat(parse(P4M).addTo(dateTime)) - .isEqualTo(dateTime.plus(4, MONTHS)); + assertThat(P4M.addTo(dateTime)) + .isEqualTo(dateTime.plusMonths(4)); - assertThat(parse(P3M).addTo(dateTime)) - .isEqualTo(dateTime.plus(3, MONTHS)); + assertThat(P3M.addTo(dateTime)) + .isEqualTo(dateTime.plusMonths(3)); - assertThat(parse(P1M).addTo(dateTime)) - .isEqualTo(dateTime.plus(1, MONTHS)); + assertThat(P1M.addTo(dateTime)) + .isEqualTo(dateTime.plusMonths(1)); - assertThat(parse(P7D).addTo(dateTime)) - .isEqualTo(dateTime.plus(7, DAYS)); + assertThat(P7D.addTo(dateTime)) + .isEqualTo(dateTime.plusDays(7)); - assertThat(parse(P1D).addTo(dateTime)) - .isEqualTo(dateTime.plus(1, DAYS)); + assertThat(P1D.addTo(dateTime)) + .isEqualTo(dateTime.plusDays(1)); - assertThat(parse(P3Y6M4DT12H30M5S).addTo(dateTime)) + assertThat(_P3Y6M4DT12H30M5S_.addTo(dateTime)) .isEqualTo(dateTime - .plus(3, YEARS) - .plus(6, MONTHS) - .plus(4, DAYS) - .plus(12, HOURS) - .plus(30, MINUTES) - .plus(5, SECONDS) + .plusYears(3) + .plusMonths(6) + .plusDays(4) + .plusHours(12) + .plusMinutes(30) + .plusSeconds(5) ); } @Test public void testSubtractFrom() { - assertThat(parse(P0D).subtractFrom(dateTime)) + assertThat(ZERO.subtractFrom(dateTime)) .isEqualTo(dateTime); - assertThat(parse(P1W).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(1, WEEKS)); + assertThat(_P1W_.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusWeeks(1)); - assertThat(parse(P1Y).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(1, YEARS)); + assertThat(P1Y.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusYears(1)); - assertThat(parse(P6M).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(6, MONTHS)); + assertThat(P6M.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusMonths(6)); - assertThat(parse(P4M).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(4, MONTHS)); + assertThat(P4M.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusMonths(4)); - assertThat(parse(P3M).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(3, MONTHS)); + assertThat(P3M.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusMonths(3)); - assertThat(parse(P1M).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(1, MONTHS)); + assertThat(P1M.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusMonths(1)); - assertThat(parse(P7D).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(7, DAYS)); + assertThat(P7D.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusDays(7)); - assertThat(parse(P1D).subtractFrom(dateTime)) - .isEqualTo(dateTime.minus(1, DAYS)); + assertThat(P1D.subtractFrom(dateTime)) + .isEqualTo(dateTime.minusDays(1)); - assertThat(parse(P3Y6M4DT12H30M5S).subtractFrom(dateTime)) + assertThat(_P3Y6M4DT12H30M5S_.subtractFrom(dateTime)) .isEqualTo(dateTime - .minus(3, YEARS) - .minus(6, MONTHS) - .minus(4, DAYS) - .minus(12, HOURS) - .minus(30, MINUTES) - .minus(5, SECONDS) + .minusYears(3) + .minusMonths(6) + .minusDays(4) + .minusHours(12) + .minusMinutes(30) + .minusSeconds(5) ); } @ParameterizedTest - @ValueSource(strings = {P1D, P0D, P1W, P1Y, P6M, P4M, P3M, P1M, P7D, P3Y6M4DT12H30M5S}) - public void testGetChronology(String text) { - assertThat(parse(text).getChronology()) - .isEqualTo(IsoChronology.INSTANCE); + @MethodSource("getConstants") + public void testConstantMultipliedBy(Duration x) { + assertThat(x.multipliedBy(0)).isSameAs(ZERO); + assertThat(x.multipliedBy(1)).isSameAs(x); + if (x.equals(ZERO)) + assertThat(x.multipliedBy(2)).isSameAs(ZERO); + else + assertThat(x.multipliedBy(2)).isNotEqualTo(x); } @Test - public void testPlus() { - assertThatNullPointerException() - .isThrownBy(() -> ZERO.plus(null)); - - assertThat(ZERO.plus(ZERO)) - .isEqualTo(ZERO); - - assertThat(parse(P1W).plus(parse(P1W))) - .isEqualTo(parse("P2W")); - - assertThat(parse(P1M).plus(ZERO)) - .isEqualTo(parse(P1M)); - - assertThat(parse(P1M).plus(parse(P3M))) - .isEqualTo(parse(P4M)); + public void testMultipliedBy() { + assertThat(_P1W_.multipliedBy(3)).isEqualTo(parse("P3W")); + assertThat(_P3Y6M4DT12H30M5S_.multipliedBy(3)).isEqualTo(parse("P9Y18M12DT36H90M15S")); + assertThat(P4M.multipliedBy(3)).isEqualTo(_P12M_); } - @Test - public void testMinus() { - assertThatNullPointerException() - .isThrownBy(() -> ZERO.minus(null)); + private final LocalDateTime dateTime = LocalDateTime.of(2010, 1, 1, 0, 0); - assertThat(ZERO.minus(ZERO)) - .isEqualTo(ZERO); + private static final Duration _P1W_ = parse("P1W"); - assertThat(parse(P1W).minus(parse(P1W))) - .isEqualTo(ZERO); + private static final Duration _P3Y6M4DT12H30M5S_ = parse("P3Y6M4DT12H30M5S"); - assertThat(parse(P1M).minus(ZERO)) - .isEqualTo(parse(P1M)); + private static final Duration _P12M_ = parse("P12M"); - assertThat(parse(P4M).minus(parse(P3M))) - .isEqualTo(parse(P1M)); + private static ThrowableTypeAssert assertThatDateTimeParseException() { + return assertThatExceptionOfType(DateTimeParseException.class); } - @Test - public void testMultipliedBy() { - assertThat(parse(P1M).multipliedBy(0)) - .isEqualTo(ZERO); - - assertThat(parse(P1M).multipliedBy(1)) - .isEqualTo(parse(P1M)); - - assertThat(parse(P1M).multipliedBy(3)) - .isEqualTo(parse(P3M)); + private static ThrowableTypeAssert assertThatDateTimeException() { + return assertThatExceptionOfType(DateTimeException.class); } - @Test - public void testNormalized() { - assertThat(ZERO.normalized()) - .isEqualTo(ZERO); - - assertThat(parse(P3M).normalized()) - .isEqualTo(parse(P3M)); - - assertThat(parse(P1M).multipliedBy(12).normalized()) - .isEqualTo(parse(P1Y)); + private static List getConstants() { + return Arrays.asList(ZERO, P1Y, P6M, P4M, P3M, P1M, P7D, P1D); } - private final LocalDateTime dateTime = LocalDateTime.of(2010, 1, 1, 0, 0); - - private static final String P1D = "P1D"; - private static final String P0D = "P0D"; - private static final String P1W = "P1W"; - private static final String P1Y = "P1Y"; - private static final String P6M = "P6M"; - private static final String P4M = "P4M"; - private static final String P3M = "P3M"; - private static final String P1M = "P1M"; - private static final String P7D = "P7D"; - private static final String P3Y6M4DT12H30M5S = "P3Y6M4DT12H30M5S"; + private static final java.time.Period INFIX_NEGATIVE_JAVA_PERIOD = java.time.Period.parse("P-1Y2M"); + private static final java.time.Period PREFIX_NEGATIVE_JAVA_PERIOD = java.time.Period.parse("-P1Y2M"); + private static final java.time.Duration DECIMAL_FRACTION_JAVA_DURATION = java.time.Duration.parse("PT20.345S"); + private static final java.time.Duration INFIX_NEGATIVE_JAVA_DURATION = java.time.Duration.parse("PT-6H3M"); + private static final java.time.Duration PREFIX_NEGATIVE_JAVA_DURATION = java.time.Duration.parse("-PT6H3M"); } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/GregorianTimePeriod.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/GregorianTimePeriod.java index eb6f9a76a..9d8b028ac 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/GregorianTimePeriod.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/GregorianTimePeriod.java @@ -83,11 +83,9 @@ public String toString() { @Override public @NonNull Duration getDuration() { - return P1Y; + return Duration.P1Y; } - private static final Duration P1Y = Duration.parse("P1Y"); - // JDK > 8 changed parsing behavior of Year#parse(CharSequence) to accept min 1 digit instead of 4 private static final DateTimeFormatter STRICT_YEAR = DateTimeFormatter.ofPattern("uuuu", Locale.ROOT); } @@ -123,10 +121,8 @@ public String toString() { @Override public @NonNull Duration getDuration() { - return P1M; + return Duration.P1M; } - - private static final Duration P1M = Duration.parse("P1M"); } @RepresentableAsString @@ -160,9 +156,7 @@ public String toString() { @Override public @NonNull Duration getDuration() { - return P1D; + return Duration.P1D; } - - private static final Duration P1D = Duration.parse("P1D"); } } diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/StandardReportingFormat.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/StandardReportingFormat.java index 3c6874144..693963134 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/StandardReportingFormat.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/time/StandardReportingFormat.java @@ -19,46 +19,47 @@ public class StandardReportingFormat { public static final StandardReportingFormat REPORTING_YEAR = builder() .indicator('A') - .durationOf("P1Y") + .duration(Duration.P1Y) .limitPerYear(1) .build(); public static final StandardReportingFormat REPORTING_SEMESTER = builder() .indicator('S') - .durationOf("P6M") + .duration(Duration.P6M) .limitPerYear(2) .build(); public static final StandardReportingFormat REPORTING_TRIMESTER = builder() .indicator('T') - .durationOf("P4M") + .duration(Duration.P4M) .limitPerYear(3) .build(); public static final StandardReportingFormat REPORTING_QUARTER = builder() .indicator('Q') - .durationOf("P3M") + .duration(Duration.P3M) .limitPerYear(4) .build(); public static final StandardReportingFormat REPORTING_MONTH = builder() .indicator('M') - .durationOf("P1M") + .duration(Duration.P1M) .limitPerYear(12) .build(); public static final StandardReportingFormat REPORTING_WEEK = builder() .indicator('W') - .durationOf("P7D") + .duration(Duration.P7D) .limitPerYear(53) .yearBaseFunction(StandardReportingFormat::getReportingWeekYearBase) .build(); public static final StandardReportingFormat REPORTING_DAY = builder() .indicator('D') - .durationOf("P1D") + .duration(Duration.P1D) .limitPerYear(366) .build(); + public static final List VALUES = Collections.unmodifiableList(Arrays.asList( REPORTING_YEAR, REPORTING_SEMESTER, @@ -98,13 +99,6 @@ private List initAmounts() { .collect(Collectors.toList()); } - public static final class Builder { - - public Builder durationOf(CharSequence duration) { - return duration(Duration.parse(duration)); - } - } - private static final int[] DAY_OF_WEEK_LAGS = {0, -1, -2, -3, 3, 2, 1}; private static LocalDate getReportingWeekYearBase(LocalDate reportingYearStartDate) { diff --git a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java index 0154dcf55..5f044d933 100644 --- a/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java +++ b/sdmx-dl-provider-connectors/src/main/java/sdmxdl/provider/connectors/drivers/InseeDriver.java @@ -16,15 +16,16 @@ */ package sdmxdl.provider.connectors.drivers; -import nbbrd.design.DirectImpl; import it.bancaditalia.oss.sdmx.api.Codelist; import it.bancaditalia.oss.sdmx.api.DataFlowStructure; import it.bancaditalia.oss.sdmx.api.Dimension; import it.bancaditalia.oss.sdmx.api.SDMXReference; import it.bancaditalia.oss.sdmx.client.RestSdmxClient; import it.bancaditalia.oss.sdmx.exceptions.SdmxException; +import nbbrd.design.DirectImpl; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; +import sdmxdl.Duration; import sdmxdl.format.ObsParser; import sdmxdl.format.time.ObservationalTimePeriod; import sdmxdl.format.time.StandardReportingFormat; @@ -40,9 +41,9 @@ import java.util.function.Supplier; import java.util.logging.Level; -import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; import static sdmxdl.format.time.TimeFormats.IGNORE_ERROR; import static sdmxdl.provider.SdmxFix.Category.CONTENT; +import static sdmxdl.provider.connectors.drivers.ConnectorsRestClient.CONNECTORS_CONNECTION_PROPERTIES; /** * @author Philippe Charles @@ -129,7 +130,7 @@ private void loadMissingCodes(Codelist codelist) throws SdmxException { private static final StandardReportingFormat REPORTING_TWO_MONTH = StandardReportingFormat .builder() .indicator('B') - .durationOf("P2M") + .duration(Duration.parse("P2M")) .limitPerYear(6) .build(); diff --git a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java index 0c7ab5a2c..713ecc067 100644 --- a/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java +++ b/sdmx-dl-provider-dialects/src/main/java/sdmxdl/provider/dialects/drivers/InseeDialectDriver.java @@ -136,7 +136,7 @@ private static final class InseeRestParsers extends Sdmx21RestParsers { static final StandardReportingFormat REPORTING_TWO_MONTH = StandardReportingFormat .builder() .indicator('B') - .durationOf("P2M") + .duration(Duration.parse("P2M")) .limitPerYear(6) .build(); From 1a4007b092f6e52fa08043829c67359e28432fb0 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 9 Oct 2023 14:25:43 +0200 Subject: [PATCH 107/114] Disable individual checksum --- sdmx-dl-cli/pom.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 1e225b706..6c0b8ca56 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -368,9 +368,6 @@ - - true - ALWAYS From 0591695a4dccd75e96194375ffa2816afa9435ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 02:23:56 +0000 Subject: [PATCH 108/114] Bump java-design.version from 1.4.0 to 1.5.0 Bumps `java-design.version` from 1.4.0 to 1.5.0. Updates `com.github.nbbrd.java-design-util:java-design-annotation` from 1.4.0 to 1.5.0 - [Release notes](https://github.com/nbbrd/java-design-util/releases) - [Changelog](https://github.com/nbbrd/java-design-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-design-util/compare/v1.4.0...v1.5.0) Updates `com.github.nbbrd.java-design-util:java-design-processor` from 1.4.0 to 1.5.0 - [Release notes](https://github.com/nbbrd/java-design-util/releases) - [Changelog](https://github.com/nbbrd/java-design-util/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/java-design-util/compare/v1.4.0...v1.5.0) --- updated-dependencies: - dependency-name: com.github.nbbrd.java-design-util:java-design-annotation dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.github.nbbrd.java-design-util:java-design-processor dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 39f0165a0..f3b284210 100644 --- a/pom.xml +++ b/pom.xml @@ -291,7 +291,7 @@ 1.18.30 1.7.0 - 1.4.0 + 1.5.0 4.7.5 From 523db5b1352983f18f43222658f51818f82e97a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 02:24:13 +0000 Subject: [PATCH 109/114] Bump com.github.nbbrd.heylogs:heylogs-maven-plugin from 0.6.0 to 0.7.0 Bumps [com.github.nbbrd.heylogs:heylogs-maven-plugin](https://github.com/nbbrd/heylogs) from 0.6.0 to 0.7.0. - [Release notes](https://github.com/nbbrd/heylogs/releases) - [Changelog](https://github.com/nbbrd/heylogs/blob/develop/CHANGELOG.md) - [Commits](https://github.com/nbbrd/heylogs/compare/v0.6.0...v0.7.0) --- updated-dependencies: - dependency-name: com.github.nbbrd.heylogs:heylogs-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f3b284210..77a7fcf6c 100644 --- a/pom.xml +++ b/pom.xml @@ -170,7 +170,7 @@ com.github.nbbrd.heylogs heylogs-maven-plugin - 0.6.0 + 0.7.0 de.thetaphi From c27414244e4aa5a88be50ce2ae8999ee24dabda1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 02:24:06 +0000 Subject: [PATCH 110/114] Bump quarkus.platform.version from 3.4.2 to 3.4.3 Bumps `quarkus.platform.version` from 3.4.2 to 3.4.3. Updates `io.quarkus.platform:quarkus-bom` from 3.4.2 to 3.4.3 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.4.2...3.4.3) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.4.2 to 3.4.3 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.4.2...3.4.3) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-grpc/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 4aaf510a6..6fab8777f 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -23,7 +23,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.4.2 + 3.4.3 true true From b30e6933e78797a3789a6764e401b2f0944e1ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 14 Oct 2023 02:24:25 +0000 Subject: [PATCH 111/114] Bump io.github.hakky54:sslcontext-kickstart from 8.1.6 to 8.1.7 Bumps [io.github.hakky54:sslcontext-kickstart](https://github.com/Hakky54/sslcontext-kickstart) from 8.1.6 to 8.1.7. - [Changelog](https://github.com/Hakky54/sslcontext-kickstart/blob/master/CHANGELOG.md) - [Commits](https://github.com/Hakky54/sslcontext-kickstart/compare/v8.1.6...v8.1.7) --- updated-dependencies: - dependency-name: io.github.hakky54:sslcontext-kickstart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- sdmx-dl-provider-ri/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index c4879b13e..4329c73df 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -76,7 +76,7 @@ io.github.hakky54 sslcontext-kickstart - 8.1.6 + 8.1.7 slf4j-api From e08fbe62ae8fc288fc1e52403d2467f39f9f40e0 Mon Sep 17 00:00:00 2001 From: charphi Date: Sat, 14 Oct 2023 01:01:03 +0000 Subject: [PATCH 112/114] Bump hugo-geekdoc.version to v0.41.2 --- sdmx-dl-cli/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 6c0b8ca56..8f6904ef0 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -19,7 +19,7 @@ sdmxdl.cli.MainCommand - v0.41.1 + v0.41.2 From ae209669de5d8b1d6759b1df63e51dea500a14a3 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 16 Oct 2023 09:40:21 +0200 Subject: [PATCH 113/114] Update CHANGELOG.md for next release --- CHANGELOG.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0a152cb3..e82243d92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,24 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [3.0.0-beta.12] - 2023-10-16 + +This is the twelfth beta release of **sdmx-dl**. +sdmx-dl follows [semantic versioning](https://semver.org/). + +This release brings a more flexible configuration system: cache, network and language can be specified by source if +needed and environment variables are used as default values. +The API has been refactored to make it both simpler and more flexible. +The ECB endpoint has also been updated. + +> **Disclaimer**: sdmx-dl is still in development and is available for test only. **Do not use in +production!** + ### Added - ![API] Add support of partial ISO date/time in TimeInterval -- ![PROVIDER] Allow caching & networking configuration by environment variables [#516](https://github.com/nbbrd/sdmx-dl/issues/516) +- ![PROVIDER] Allow caching & networking configuration by environment + variables [#516](https://github.com/nbbrd/sdmx-dl/issues/516) - ![PROVIDER] Allow caching & networking configuration per source [#493](https://github.com/nbbrd/sdmx-dl/issues/493) ### Fixed @@ -405,7 +419,9 @@ production._ - Initial release -[Unreleased]: https://github.com/nbbrd/sdmx-dl/compare/v3.0.0-beta.11...HEAD +[Unreleased]: https://github.com/nbbrd/sdmx-dl/compare/v3.0.0-beta.12...HEAD + +[3.0.0-beta.12]: https://github.com/nbbrd/sdmx-dl/compare/v3.0.0-beta.11...v3.0.0-beta.12 [3.0.0-beta.11]: https://github.com/nbbrd/sdmx-dl/compare/v3.0.0-beta.10...v3.0.0-beta.11 From 2895c0f5f5652c79a6f8585026f86f1ac3f43e42 Mon Sep 17 00:00:00 2001 From: Philippe Charles Date: Mon, 16 Oct 2023 15:17:29 +0200 Subject: [PATCH 114/114] Update versions for release --- pom.xml | 2 +- sdmx-dl-api/pom.xml | 2 +- sdmx-dl-bom/pom.xml | 2 +- sdmx-dl-cli/pom.xml | 2 +- sdmx-dl-desktop/pom.xml | 2 +- sdmx-dl-format-base/pom.xml | 2 +- sdmx-dl-format-csv/pom.xml | 2 +- sdmx-dl-format-kryo/pom.xml | 2 +- sdmx-dl-format-protobuf/pom.xml | 2 +- sdmx-dl-format-xml/pom.xml | 2 +- sdmx-dl-grpc/pom.xml | 2 +- sdmx-dl-provider-base/pom.xml | 2 +- sdmx-dl-provider-connectors/pom.xml | 2 +- sdmx-dl-provider-dialects/pom.xml | 2 +- sdmx-dl-provider-px/pom.xml | 2 +- sdmx-dl-provider-ri/pom.xml | 2 +- sdmx-dl-standalone/pom.xml | 2 +- sdmx-dl-testing/pom.xml | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 77a7fcf6c..863f090db 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 pom sdmx-dl diff --git a/sdmx-dl-api/pom.xml b/sdmx-dl-api/pom.xml index 9fd33dd75..69cc29189 100644 --- a/sdmx-dl-api/pom.xml +++ b/sdmx-dl-api/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-api diff --git a/sdmx-dl-bom/pom.xml b/sdmx-dl-bom/pom.xml index ffc1c80ef..f6619216e 100644 --- a/sdmx-dl-bom/pom.xml +++ b/sdmx-dl-bom/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-bom diff --git a/sdmx-dl-cli/pom.xml b/sdmx-dl-cli/pom.xml index 8f6904ef0..f7b4160ee 100644 --- a/sdmx-dl-cli/pom.xml +++ b/sdmx-dl-cli/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-cli diff --git a/sdmx-dl-desktop/pom.xml b/sdmx-dl-desktop/pom.xml index 0729243bc..6b51e2f62 100644 --- a/sdmx-dl-desktop/pom.xml +++ b/sdmx-dl-desktop/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-desktop diff --git a/sdmx-dl-format-base/pom.xml b/sdmx-dl-format-base/pom.xml index a943b63f1..943246f8f 100644 --- a/sdmx-dl-format-base/pom.xml +++ b/sdmx-dl-format-base/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-format-base diff --git a/sdmx-dl-format-csv/pom.xml b/sdmx-dl-format-csv/pom.xml index 7096586e5..347bc2f1e 100644 --- a/sdmx-dl-format-csv/pom.xml +++ b/sdmx-dl-format-csv/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-format-csv diff --git a/sdmx-dl-format-kryo/pom.xml b/sdmx-dl-format-kryo/pom.xml index 5fc1f960c..8a72e25ca 100644 --- a/sdmx-dl-format-kryo/pom.xml +++ b/sdmx-dl-format-kryo/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-format-kryo diff --git a/sdmx-dl-format-protobuf/pom.xml b/sdmx-dl-format-protobuf/pom.xml index a3c7fdefb..aced56873 100644 --- a/sdmx-dl-format-protobuf/pom.xml +++ b/sdmx-dl-format-protobuf/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-format-protobuf diff --git a/sdmx-dl-format-xml/pom.xml b/sdmx-dl-format-xml/pom.xml index b62c65949..b669aa5d3 100644 --- a/sdmx-dl-format-xml/pom.xml +++ b/sdmx-dl-format-xml/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-format-xml diff --git a/sdmx-dl-grpc/pom.xml b/sdmx-dl-grpc/pom.xml index 6fab8777f..47431a6df 100644 --- a/sdmx-dl-grpc/pom.xml +++ b/sdmx-dl-grpc/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-grpc diff --git a/sdmx-dl-provider-base/pom.xml b/sdmx-dl-provider-base/pom.xml index cb07bc2e4..96d1a2714 100644 --- a/sdmx-dl-provider-base/pom.xml +++ b/sdmx-dl-provider-base/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-provider-base diff --git a/sdmx-dl-provider-connectors/pom.xml b/sdmx-dl-provider-connectors/pom.xml index 2c5d2aa48..123d897bd 100644 --- a/sdmx-dl-provider-connectors/pom.xml +++ b/sdmx-dl-provider-connectors/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-provider-connectors diff --git a/sdmx-dl-provider-dialects/pom.xml b/sdmx-dl-provider-dialects/pom.xml index dfe8a5533..5c96f1efd 100644 --- a/sdmx-dl-provider-dialects/pom.xml +++ b/sdmx-dl-provider-dialects/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-provider-dialects diff --git a/sdmx-dl-provider-px/pom.xml b/sdmx-dl-provider-px/pom.xml index 41590e7e4..fee8d6fc2 100644 --- a/sdmx-dl-provider-px/pom.xml +++ b/sdmx-dl-provider-px/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-provider-px diff --git a/sdmx-dl-provider-ri/pom.xml b/sdmx-dl-provider-ri/pom.xml index 4329c73df..79d7f8016 100644 --- a/sdmx-dl-provider-ri/pom.xml +++ b/sdmx-dl-provider-ri/pom.xml @@ -6,7 +6,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-provider-ri diff --git a/sdmx-dl-standalone/pom.xml b/sdmx-dl-standalone/pom.xml index a64f7edd2..546a97cd7 100644 --- a/sdmx-dl-standalone/pom.xml +++ b/sdmx-dl-standalone/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-standalone diff --git a/sdmx-dl-testing/pom.xml b/sdmx-dl-testing/pom.xml index 1d82a4e00..a57fc7725 100644 --- a/sdmx-dl-testing/pom.xml +++ b/sdmx-dl-testing/pom.xml @@ -7,7 +7,7 @@ com.github.nbbrd.sdmx-dl sdmx-dl-parent - 3.0.0-beta.12-SNAPSHOT + 3.0.0-beta.12 sdmx-dl-testing