diff --git a/CHANGELOG.md b/CHANGELOG.md index d6bcc2ff6..0085d5aae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Added - ![API] Add confidentiality property to WebSource [#518](https://github.com/nbbrd/sdmx-dl/issues/518) +- ![API] Add missing properties methods in extensions points [#781](https://github.com/nbbrd/sdmx-dl/issues/781) ### Changed diff --git a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpPersistence.java b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpPersistence.java index 54d190613..ca18020d8 100644 --- a/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpPersistence.java +++ b/sdmx-dl-api/src/main/java/internal/sdmxdl/NoOpPersistence.java @@ -5,6 +5,7 @@ import sdmxdl.ext.FileFormat; import sdmxdl.ext.Persistence; +import java.util.Collection; import java.util.Collections; import java.util.Set; @@ -31,4 +32,9 @@ public int getPersistenceRank() { public @NonNull FileFormat getFormat(@NonNull Class type) { return FileFormat.noOp(); } + + @Override + public @NonNull Collection getPersistenceProperties() { + return Collections.emptyList(); + } } diff --git a/sdmx-dl-api/src/main/java/sdmxdl/ext/Persistence.java b/sdmx-dl-api/src/main/java/sdmxdl/ext/Persistence.java index e64bf776f..b79e042df 100644 --- a/sdmx-dl-api/src/main/java/sdmxdl/ext/Persistence.java +++ b/sdmx-dl-api/src/main/java/sdmxdl/ext/Persistence.java @@ -10,6 +10,7 @@ import nbbrd.service.ServiceSorter; import sdmxdl.HasPersistence; +import java.util.Collection; import java.util.Set; @ServiceDefinition( @@ -29,8 +30,12 @@ public interface Persistence { @NonNull FileFormat getFormat(@NonNull Class type); + @NonNull Collection getPersistenceProperties(); + int UNKNOWN_PERSISTENCE_RANK = -1; + String PERSISTENCE_PROPERTY_PREFIX = "sdmxdl.persistence"; + @StaticFactoryMethod static @NonNull Persistence noOp() { return NoOpPersistence.INSTANCE; 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 a0c66ed39..1cb6bbb9f 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 @@ -11,6 +11,7 @@ import java.io.IOException; import java.net.PasswordAuthentication; +import java.util.Collection; @ServiceDefinition( quantifier = Quantifier.MULTIPLE, @@ -28,4 +29,8 @@ public interface Authenticator { @Nullable PasswordAuthentication getPasswordAuthenticationOrNull(@NonNull WebSource source) throws IOException; void invalidateAuthentication(@NonNull WebSource source) throws IOException; + + @NonNull Collection getAuthenticatorProperties(); + + String AUTHENTICATOR_PROPERTY_PREFIX = "sdmxdl.authenticator"; } 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 d395b8b59..a764d13c2 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 @@ -9,6 +9,7 @@ import sdmxdl.web.WebSource; import java.io.IOException; +import java.util.Collection; @ServiceDefinition( quantifier = Quantifier.MULTIPLE, @@ -26,4 +27,8 @@ public interface Monitor { @NonNull WebSource source, @NonNull WebContext context ) throws IOException, IllegalArgumentException; + + @NonNull Collection getMonitorProperties(); + + String MONITOR_PROPERTY_PREFIX = "sdmxdl.monitor"; } diff --git a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/PersistenceAssert.java b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/PersistenceAssert.java index 7f2df7d78..d100afe6e 100644 --- a/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/PersistenceAssert.java +++ b/sdmx-dl-api/src/test/java/tests/sdmxdl/ext/PersistenceAssert.java @@ -46,8 +46,8 @@ public class PersistenceAssert { .idPattern(PersistenceLoader.ID_PATTERN) .rank(Persistence::getPersistenceRank) .rankLowerBound(Persistence.UNKNOWN_PERSISTENCE_RANK) - .properties(ignore -> emptyList()) - .propertiesPrefix("") + .properties(Persistence::getPersistenceProperties) + .propertiesPrefix(Persistence.PERSISTENCE_PROPERTY_PREFIX) .build(); public void assertCompliance(Persistence persistence) { 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 10dbee689..5b5ea195c 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 @@ -29,8 +29,8 @@ public static class Sample { .idPattern(AuthenticatorLoader.ID_PATTERN) .rank(ignore -> -1) .rankLowerBound(-1) - .properties(ignore -> emptyList()) - .propertiesPrefix("") + .properties(Authenticator::getAuthenticatorProperties) + .propertiesPrefix(Authenticator.AUTHENTICATOR_PROPERTY_PREFIX) .build(); public void assertCompliance(@NonNull Authenticator authenticator, @NonNull Sample sample) { 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 9062c8476..a057cf434 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 @@ -30,8 +30,8 @@ public static class Sample { .idPattern(MonitorLoader.ID_PATTERN) .rank(ignore -> -1) .rankLowerBound(-1) - .properties(ignore -> emptyList()) - .propertiesPrefix("") + .properties(Monitor::getMonitorProperties) + .propertiesPrefix(Monitor.MONITOR_PROPERTY_PREFIX) .build(); public void assertCompliance(@NonNull Monitor monitor, @NonNull Sample sample) { 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 01dcf06a9..40873b7e3 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 @@ -8,6 +8,8 @@ import java.io.IOError; import java.io.IOException; import java.net.PasswordAuthentication; +import java.util.Collection; +import java.util.Collections; import java.util.concurrent.ConcurrentHashMap; final class ConsoleAuthenticator implements Authenticator { @@ -50,6 +52,11 @@ public void invalidateAuthentication(@NonNull WebSource source) { cache.remove(source); } + @Override + public @NonNull Collection getAuthenticatorProperties() { + return Collections.emptyList(); + } + private PasswordAuthentication readPasswordAuthentication(WebSource source) throws IOError { console.format("Enter your credentials for %s\n", source.getId()); String username = console.readLine("Enter username: "); 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 10291caec..4186aa871 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 @@ -6,6 +6,8 @@ import sdmxdl.web.spi.Authenticator; import java.net.PasswordAuthentication; +import java.util.Collection; +import java.util.Collections; @lombok.AllArgsConstructor final class ConstantAuthenticator implements Authenticator { @@ -30,4 +32,9 @@ public boolean isAuthenticatorAvailable() { @Override public void invalidateAuthentication(@NonNull WebSource source) { } + + @Override + public @NonNull Collection getAuthenticatorProperties() { + return Collections.emptyList(); + } } diff --git a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListPluginsCommand.java b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListPluginsCommand.java index 97b070cb5..d6b480733 100644 --- a/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListPluginsCommand.java +++ b/sdmx-dl-cli/src/main/java/sdmxdl/cli/ListPluginsCommand.java @@ -83,15 +83,15 @@ static Plugin of(Driver o) { } static Plugin of(Authenticator o) { - return new Plugin("Authenticator", o.getAuthenticatorId(), emptyList()); + return new Plugin("Authenticator", o.getAuthenticatorId(), o.getAuthenticatorProperties()); } static Plugin of(Monitor o) { - return new Plugin("Monitor", o.getMonitorId(), emptyList()); + return new Plugin("Monitor", o.getMonitorId(), o.getMonitorProperties()); } static Plugin of(Persistence o) { - return new Plugin("Persistence", o.getPersistenceId(), emptyList()); + return new Plugin("Persistence", o.getPersistenceId(), o.getPersistenceProperties()); } static Plugin of(Registry o) { diff --git a/sdmx-dl-format-base/src/main/java/sdmxdl/format/PersistenceSupport.java b/sdmx-dl-format-base/src/main/java/sdmxdl/format/PersistenceSupport.java index a95d92728..f304c13a4 100644 --- a/sdmx-dl-format-base/src/main/java/sdmxdl/format/PersistenceSupport.java +++ b/sdmx-dl-format-base/src/main/java/sdmxdl/format/PersistenceSupport.java @@ -6,6 +6,8 @@ import sdmxdl.ext.Persistence; import sdmxdl.format.design.ServiceSupport; +import java.util.Collection; +import java.util.List; import java.util.Set; @ServiceSupport @@ -25,6 +27,9 @@ public final class PersistenceSupport implements Persistence { @lombok.Builder.Default private final Factory factory = Persistence.noOp()::getFormat; + @lombok.Singular + private final Collection properties; + @Override public @NonNull String getPersistenceId() { return id; @@ -45,6 +50,11 @@ public int getPersistenceRank() { return factory.create(type); } + @Override + public @NonNull Collection getPersistenceProperties() { + return properties; + } + @FunctionalInterface public interface Factory { @NonNull FileFormat create(@NonNull Class type); 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 d8a4d59eb..fc91e290a 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 @@ -10,6 +10,8 @@ import java.io.IOException; import java.net.PasswordAuthentication; +import java.util.Collection; +import java.util.Collections; @DirectImpl @ServiceProvider @@ -40,6 +42,11 @@ public void invalidateAuthentication(@NonNull WebSource source) throws IOExcepti } } + @Override + public @NonNull Collection getAuthenticatorProperties() { + return Collections.emptyList(); + } + private String getResource(WebSource source) { return "sdmx-dl:" + source.getEndpoint().getHost(); } 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 aafe41f63..000638d12 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,9 +1,9 @@ package sdmxdl.provider.ri.monitors; -import nbbrd.io.http.HttpClient; import lombok.NonNull; import nbbrd.design.DirectImpl; import nbbrd.design.VisibleForTesting; +import nbbrd.io.http.HttpClient; import nbbrd.io.text.Parser; import nbbrd.service.ServiceProvider; import sdmxdl.ext.Cache; @@ -20,6 +20,8 @@ import java.text.NumberFormat; import java.time.Clock; import java.time.Duration; +import java.util.Collection; +import java.util.Collections; import java.util.Locale; @DirectImpl @@ -59,6 +61,11 @@ public final class UpptimeMonitor implements Monitor { .orElseThrow(IOException::new); } + @Override + public @NonNull Collection getMonitorProperties() { + return Collections.emptyList(); + } + private MonitorReports createReports(HttpClient client, UpptimeId base, Clock clock) throws IOException { MonitorReports.Builder result = MonitorReports.builder().uriScheme(getMonitorUriScheme()); for (UpptimeSummary summary : UpptimeSummary.request(client, base.toSummaryURL())) { 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 f9cd4a944..d509ef010 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 @@ -27,6 +27,8 @@ import java.io.Reader; import java.net.*; import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Collections; @DirectImpl @ServiceProvider @@ -54,6 +56,11 @@ public final class UptimeRobotMonitor implements Monitor { return post(url, id.toBody(), parser::parseReader, context, source, getMonitorId()); } + @Override + public @NonNull Collection getMonitorProperties() { + return Collections.emptyList(); + } + @lombok.AllArgsConstructor @lombok.Getter private enum Status {