From ec59cffde10960d5cd55d89cb338594655b08322 Mon Sep 17 00:00:00 2001 From: Gilles Robert Date: Mon, 9 Dec 2019 14:30:35 +0100 Subject: [PATCH 1/2] simplify factory provider --- .../PostgresqlConnectionConfiguration.java | 195 ++++++++++++++++++ .../PostgresqlConnectionFactoryProvider.java | 121 +---------- 2 files changed, 199 insertions(+), 117 deletions(-) diff --git a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java index 294c45ff..de311253 100644 --- a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java +++ b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java @@ -26,6 +26,8 @@ import io.r2dbc.postgresql.extension.CodecRegistrar; import io.r2dbc.postgresql.extension.Extension; import io.r2dbc.postgresql.util.Assert; +import io.r2dbc.spi.ConnectionFactoryOptions; +import io.r2dbc.spi.Option; import reactor.netty.tcp.SslProvider; import reactor.util.annotation.Nullable; @@ -39,6 +41,26 @@ import java.util.function.Function; import java.util.function.Supplier; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.APPLICATION_NAME; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.AUTODETECT_EXTENSIONS; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.FORCE_BINARY; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.OPTIONS; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SCHEMA; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SOCKET; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_CERT; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_CONTEXT_BUILDER_CUSTOMIZER; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_HOSTNAME_VERIFIER; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_KEY; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_MODE; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_PASSWORD; +import static io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider.SSL_ROOT_CERT; +import static io.r2dbc.spi.ConnectionFactoryOptions.CONNECT_TIMEOUT; +import static io.r2dbc.spi.ConnectionFactoryOptions.DATABASE; +import static io.r2dbc.spi.ConnectionFactoryOptions.HOST; +import static io.r2dbc.spi.ConnectionFactoryOptions.PASSWORD; +import static io.r2dbc.spi.ConnectionFactoryOptions.PORT; +import static io.r2dbc.spi.ConnectionFactoryOptions.SSL; +import static io.r2dbc.spi.ConnectionFactoryOptions.USER; import static reactor.netty.tcp.SslProvider.DefaultConfigurationType.TCP; /** @@ -287,6 +309,37 @@ public static final class Builder { private Builder() { } + /** + * Configure the builder with the given {@link ConnectionFactoryOptions}. + * + * @param connectionFactoryOptions {@link ConnectionFactoryOptions} + * @return this {@link Builder} + * @throws IllegalArgumentException if {@code connectionFactoryOptions} is {@code null} + */ + Builder fromOptions(ConnectionFactoryOptions connectionFactoryOptions) { + Assert.requireNonNull(connectionFactoryOptions, "connectionFactoryOptions must not be null"); + + setApplicationName(connectionFactoryOptions); + setAutoDetections(connectionFactoryOptions); + setConnectTimeout(connectionFactoryOptions); + setDatabase(connectionFactoryOptions); + password(connectionFactoryOptions.getValue(PASSWORD)); + schema(connectionFactoryOptions.getValue(SCHEMA)); + username(connectionFactoryOptions.getRequiredValue(USER)); + setPort(connectionFactoryOptions); + setForceBinary(connectionFactoryOptions); + setOptions(connectionFactoryOptions); + + if (isUsingTcp(connectionFactoryOptions)) { + host(connectionFactoryOptions.getRequiredValue(HOST)); + setupTcp(connectionFactoryOptions); + } else { + socket(connectionFactoryOptions.getRequiredValue(SOCKET)); + } + + return this; + } + /** * Configure the application name. Defaults to {@code postgresql-r2dbc}. * @@ -651,5 +704,147 @@ private Supplier createSslProvider() { .defaultConfiguration(TCP) .build(); } + + private void setupTcp(ConnectionFactoryOptions connectionFactoryOptions) { + enableSsl(connectionFactoryOptions); + + setSslMode(connectionFactoryOptions); + + setRootCert(connectionFactoryOptions); + + setCert(connectionFactoryOptions); + + setKey(connectionFactoryOptions); + + setPassword(connectionFactoryOptions); + + setHostnameVerifier(connectionFactoryOptions); + + setCustomizer(connectionFactoryOptions); + } + + private void setCustomizer(ConnectionFactoryOptions connectionFactoryOptions) { + if (connectionFactoryOptions.hasOption(SSL_CONTEXT_BUILDER_CUSTOMIZER)) { + sslContextBuilderCustomizer(connectionFactoryOptions.getRequiredValue(SSL_CONTEXT_BUILDER_CUSTOMIZER)); + } + } + + private void setHostnameVerifier(ConnectionFactoryOptions connectionFactoryOptions) { + Object sslHostnameVerifier = connectionFactoryOptions.getValue(SSL_HOSTNAME_VERIFIER); + if (sslHostnameVerifier != null) { + + if (sslHostnameVerifier instanceof String) { + + try { + Class verifierClass = Class.forName((String) sslHostnameVerifier); + Object verifier = verifierClass.getConstructor().newInstance(); + + sslHostnameVerifier((HostnameVerifier) verifier); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException("Cannot instantiate " + sslHostnameVerifier, e); + } + } else { + sslHostnameVerifier((HostnameVerifier) sslHostnameVerifier); + } + } + } + + private void setPassword(ConnectionFactoryOptions connectionFactoryOptions) { + String sslPassword = connectionFactoryOptions.getValue(SSL_PASSWORD); + if (sslPassword != null) { + sslPassword(sslPassword); + } + } + + private void setKey(ConnectionFactoryOptions connectionFactoryOptions) { + String sslKey = connectionFactoryOptions.getValue(SSL_KEY); + if (sslKey != null) { + sslKey(sslKey); + } + } + + private void setCert(ConnectionFactoryOptions connectionFactoryOptions) { + String sslCert = connectionFactoryOptions.getValue(SSL_CERT); + if (sslCert != null) { + sslCert(sslCert); + } + } + + private void setRootCert(ConnectionFactoryOptions connectionFactoryOptions) { + String sslRootCert = connectionFactoryOptions.getValue(SSL_ROOT_CERT); + if (sslRootCert != null) { + sslRootCert(sslRootCert); + } + } + + private void setSslMode(ConnectionFactoryOptions connectionFactoryOptions) { + Object sslMode = connectionFactoryOptions.getValue(SSL_MODE); + if (sslMode != null) { + if (sslMode instanceof String) { + sslMode(SSLMode.fromValue(sslMode.toString())); + } else { + sslMode((SSLMode) sslMode); + } + } + } + + private void enableSsl(ConnectionFactoryOptions connectionFactoryOptions) { + Boolean ssl = connectionFactoryOptions.getValue(SSL); + if (ssl != null && ssl) { + enableSsl(); + } + } + + private void setOptions(ConnectionFactoryOptions connectionFactoryOptions) { + Map options = connectionFactoryOptions.getValue(OPTIONS); + if (options != null) { + options(options); + } + } + + private void setForceBinary(ConnectionFactoryOptions connectionFactoryOptions) { + Object forceBinary = connectionFactoryOptions.getValue(FORCE_BINARY); + + if (forceBinary != null) { + forceBinary(convertToBoolean(forceBinary)); + } + } + + private void setPort(ConnectionFactoryOptions connectionFactoryOptions) { + Integer port = connectionFactoryOptions.getValue(PORT); + if (port != null) { + port(port); + } + } + + private void setDatabase(ConnectionFactoryOptions connectionFactoryOptions) { + database(connectionFactoryOptions.getValue(DATABASE)); + } + + private void setConnectTimeout(ConnectionFactoryOptions connectionFactoryOptions) { + connectTimeout(connectionFactoryOptions.getValue(CONNECT_TIMEOUT)); + } + + private void setApplicationName(ConnectionFactoryOptions connectionFactoryOptions) { + String applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME); + if (applicationName != null) { + this.applicationName(applicationName); + } + } + + private void setAutoDetections(ConnectionFactoryOptions connectionFactoryOptions) { + Object autodetectExtensions = connectionFactoryOptions.getValue(AUTODETECT_EXTENSIONS); + if (autodetectExtensions != null) { + this.autodetectExtensions(convertToBoolean(autodetectExtensions)); + } + } + + private boolean isUsingTcp(ConnectionFactoryOptions connectionFactoryOptions) { + return !connectionFactoryOptions.hasOption(SOCKET); + } + + private static boolean convertToBoolean(Object value) { + return value instanceof Boolean ? (boolean) value : Boolean.parseBoolean(value.toString()); + } } } diff --git a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java index 72abb765..d3495bc4 100644 --- a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java +++ b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java @@ -27,14 +27,7 @@ import java.util.Map; import java.util.function.Function; -import static io.r2dbc.spi.ConnectionFactoryOptions.CONNECT_TIMEOUT; -import static io.r2dbc.spi.ConnectionFactoryOptions.DATABASE; import static io.r2dbc.spi.ConnectionFactoryOptions.DRIVER; -import static io.r2dbc.spi.ConnectionFactoryOptions.HOST; -import static io.r2dbc.spi.ConnectionFactoryOptions.PASSWORD; -import static io.r2dbc.spi.ConnectionFactoryOptions.PORT; -import static io.r2dbc.spi.ConnectionFactoryOptions.SSL; -import static io.r2dbc.spi.ConnectionFactoryOptions.USER; /** * An implementation of {@link ConnectionFactoryProvider} for creating {@link PostgresqlConnectionFactory}s. @@ -118,114 +111,12 @@ public final class PostgresqlConnectionFactoryProvider implements ConnectionFact @Override public PostgresqlConnectionFactory create(ConnectionFactoryOptions connectionFactoryOptions) { - return new PostgresqlConnectionFactory(createConfiguration(connectionFactoryOptions)); - } - private static PostgresqlConnectionConfiguration createConfiguration(ConnectionFactoryOptions connectionFactoryOptions) { - Assert.requireNonNull(connectionFactoryOptions, "connectionFactoryOptions must not be null"); + PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder() + .fromOptions(connectionFactoryOptions) + .build(); - boolean tcp; - PostgresqlConnectionConfiguration.Builder builder = PostgresqlConnectionConfiguration.builder(); - - String applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME); - if (applicationName != null) { - builder.applicationName(applicationName); - } - - Object autodetectExtensions = connectionFactoryOptions.getValue(AUTODETECT_EXTENSIONS); - if (autodetectExtensions != null) { - builder.autodetectExtensions(convertToBoolean(autodetectExtensions)); - } - - builder.connectTimeout(connectionFactoryOptions.getValue(CONNECT_TIMEOUT)); - builder.database(connectionFactoryOptions.getValue(DATABASE)); - - if (connectionFactoryOptions.hasOption(SOCKET)) { - tcp = false; - builder.socket(connectionFactoryOptions.getRequiredValue(SOCKET)); - } else { - tcp = true; - builder.host(connectionFactoryOptions.getRequiredValue(HOST)); - } - builder.password(connectionFactoryOptions.getValue(PASSWORD)); - builder.schema(connectionFactoryOptions.getValue(SCHEMA)); - builder.username(connectionFactoryOptions.getRequiredValue(USER)); - - Integer port = connectionFactoryOptions.getValue(PORT); - if (port != null) { - builder.port(port); - } - - Object forceBinary = connectionFactoryOptions.getValue(FORCE_BINARY); - - if (forceBinary != null) { - builder.forceBinary(convertToBoolean(forceBinary)); - } - - Map options = connectionFactoryOptions.getValue(OPTIONS); - if (options != null) { - builder.options(options); - } - - if (tcp) { - Boolean ssl = connectionFactoryOptions.getValue(SSL); - if (ssl != null && ssl) { - builder.enableSsl(); - } - - Object sslMode = connectionFactoryOptions.getValue(SSL_MODE); - if (sslMode != null) { - if (sslMode instanceof String) { - builder.sslMode(SSLMode.fromValue(sslMode.toString())); - } else { - builder.sslMode((SSLMode) sslMode); - } - } - - String sslRootCert = connectionFactoryOptions.getValue(SSL_ROOT_CERT); - if (sslRootCert != null) { - builder.sslRootCert(sslRootCert); - } - - String sslCert = connectionFactoryOptions.getValue(SSL_CERT); - if (sslCert != null) { - builder.sslCert(sslCert); - } - - String sslKey = connectionFactoryOptions.getValue(SSL_KEY); - if (sslKey != null) { - builder.sslKey(sslKey); - } - - String sslPassword = connectionFactoryOptions.getValue(SSL_PASSWORD); - if (sslPassword != null) { - builder.sslPassword(sslPassword); - } - - Object sslHostnameVerifier = connectionFactoryOptions.getValue(SSL_HOSTNAME_VERIFIER); - if (sslHostnameVerifier != null) { - - if (sslHostnameVerifier instanceof String) { - - try { - Class verifierClass = Class.forName((String) sslHostnameVerifier); - Object verifier = verifierClass.getConstructor().newInstance(); - - builder.sslHostnameVerifier((HostnameVerifier) verifier); - } catch (ReflectiveOperationException e) { - throw new IllegalStateException("Cannot instantiate " + sslHostnameVerifier, e); - } - } else { - builder.sslHostnameVerifier((HostnameVerifier) sslHostnameVerifier); - } - } - - if (connectionFactoryOptions.hasOption(SSL_CONTEXT_BUILDER_CUSTOMIZER)) { - builder.sslContextBuilderCustomizer(connectionFactoryOptions.getRequiredValue(SSL_CONTEXT_BUILDER_CUSTOMIZER)); - } - } - - return builder.build(); + return new PostgresqlConnectionFactory(configuration); } @Override @@ -240,8 +131,4 @@ public boolean supports(ConnectionFactoryOptions connectionFactoryOptions) { String driver = connectionFactoryOptions.getValue(DRIVER); return driver != null && (driver.equals(POSTGRESQL_DRIVER) || driver.equals(LEGACY_POSTGRESQL_DRIVER)); } - - private static boolean convertToBoolean(Object value) { - return value instanceof Boolean ? (boolean) value : Boolean.parseBoolean(value.toString()); - } } From 10901163726aeb377ff989b903481325b88c55c8 Mon Sep 17 00:00:00 2001 From: Gilles Robert Date: Tue, 10 Dec 2019 16:00:23 +0100 Subject: [PATCH 2/2] implement remarks from @mp911de --- .../PostgresqlConnectionConfiguration.java | 317 ++++++++---------- .../PostgresqlConnectionFactoryProvider.java | 4 +- 2 files changed, 139 insertions(+), 182 deletions(-) diff --git a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java index de311253..cb9ec11d 100644 --- a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java +++ b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionConfiguration.java @@ -16,7 +16,6 @@ package io.r2dbc.postgresql; - import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import io.r2dbc.postgresql.client.DefaultHostnameVerifier; @@ -27,7 +26,6 @@ import io.r2dbc.postgresql.extension.Extension; import io.r2dbc.postgresql.util.Assert; import io.r2dbc.spi.ConnectionFactoryOptions; -import io.r2dbc.spi.Option; import reactor.netty.tcp.SslProvider; import reactor.util.annotation.Nullable; @@ -130,33 +128,31 @@ public static Builder builder() { return new Builder(); } - private static String repeat(int length, String character) { - - StringBuilder builder = new StringBuilder(); - - for (int i = 0; i < length; i++) { - builder.append(character); - } - - return builder.toString(); + /** + * Returns a new {@link Builder} configured with the given {@link ConnectionFactoryOptions}. + * + * @return a {@link Builder} + */ + public static Builder builder(ConnectionFactoryOptions connectionFactoryOptions) { + return Builder.fromConnectionFactoryOptions(connectionFactoryOptions); } @Override public String toString() { return "PostgresqlConnectionConfiguration{" + - "applicationName='" + this.applicationName + '\'' + - ", autodetectExtensions='" + this.autodetectExtensions + '\'' + - ", connectTimeout=" + this.connectTimeout + - ", database='" + this.database + '\'' + - ", extensions=" + this.extensions + - ", forceBinary='" + this.forceBinary + '\'' + - ", host='" + this.host + '\'' + - ", options='" + this.options + '\'' + - ", password='" + repeat(this.password != null ? this.password.length() : 0, "*") + '\'' + - ", port=" + this.port + - ", schema='" + this.schema + '\'' + - ", username='" + this.username + '\'' + - '}'; + "applicationName='" + this.applicationName + '\'' + + ", autodetectExtensions='" + this.autodetectExtensions + '\'' + + ", connectTimeout=" + this.connectTimeout + + ", database='" + this.database + '\'' + + ", extensions=" + this.extensions + + ", forceBinary='" + this.forceBinary + '\'' + + ", host='" + this.host + '\'' + + ", options='" + this.options + '\'' + + ", password='" + obfuscate(this.password != null ? this.password.length() : 0) + '\'' + + ", port=" + this.port + + ", schema='" + this.schema + '\'' + + ", username='" + this.username + '\'' + + '}'; } String getApplicationName() { @@ -248,6 +244,17 @@ SSLConfig getSslConfig() { return this.sslConfig; } + private static String obfuscate(int length) { + + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < length; i++) { + builder.append("*"); + } + + return builder.toString(); + } + /** * A builder for {@link PostgresqlConnectionConfiguration} instances. *

@@ -316,28 +323,51 @@ private Builder() { * @return this {@link Builder} * @throws IllegalArgumentException if {@code connectionFactoryOptions} is {@code null} */ - Builder fromOptions(ConnectionFactoryOptions connectionFactoryOptions) { + private static Builder fromConnectionFactoryOptions(ConnectionFactoryOptions connectionFactoryOptions) { + Assert.requireNonNull(connectionFactoryOptions, "connectionFactoryOptions must not be null"); - setApplicationName(connectionFactoryOptions); - setAutoDetections(connectionFactoryOptions); - setConnectTimeout(connectionFactoryOptions); - setDatabase(connectionFactoryOptions); - password(connectionFactoryOptions.getValue(PASSWORD)); - schema(connectionFactoryOptions.getValue(SCHEMA)); - username(connectionFactoryOptions.getRequiredValue(USER)); - setPort(connectionFactoryOptions); - setForceBinary(connectionFactoryOptions); - setOptions(connectionFactoryOptions); + Builder builder = new Builder(); + + builder.connectTimeout(connectionFactoryOptions.getValue(CONNECT_TIMEOUT)); + builder.database(connectionFactoryOptions.getValue(DATABASE)); + builder.password(connectionFactoryOptions.getValue(PASSWORD)); + builder.schema(connectionFactoryOptions.getValue(SCHEMA)); + builder.username(connectionFactoryOptions.getRequiredValue(USER)); + + String applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME); + if (applicationName != null) { + builder.applicationName(applicationName); + } + + Object autodetectExtensions = connectionFactoryOptions.getValue(AUTODETECT_EXTENSIONS); + if (autodetectExtensions != null) { + builder.autodetectExtensions(convertToBoolean(autodetectExtensions)); + } + + Integer port = connectionFactoryOptions.getValue(PORT); + if (port != null) { + builder.port(port); + } + + Object forceBinary = connectionFactoryOptions.getValue(FORCE_BINARY); + if (forceBinary != null) { + builder.forceBinary(convertToBoolean(forceBinary)); + } + + Map options = connectionFactoryOptions.getValue(OPTIONS); + if (options != null) { + builder.options(options); + } if (isUsingTcp(connectionFactoryOptions)) { - host(connectionFactoryOptions.getRequiredValue(HOST)); - setupTcp(connectionFactoryOptions); + builder.host(connectionFactoryOptions.getRequiredValue(HOST)); + setupSsl(builder, connectionFactoryOptions); } else { - socket(connectionFactoryOptions.getRequiredValue(SOCKET)); + builder.socket(connectionFactoryOptions.getRequiredValue(SOCKET)); } - return this; + return builder; } /** @@ -558,7 +588,7 @@ public Builder sslCert(String sslCert) { /** * Configure ssl HostnameVerifier. * - * @param sslHostnameVerifier {@link javax.net.ssl.HostnameVerifier} + * @param sslHostnameVerifier {@link HostnameVerifier} * @return this {@link Builder} */ public Builder sslHostnameVerifier(HostnameVerifier sslHostnameVerifier) { @@ -599,31 +629,6 @@ public Builder sslPassword(@Nullable CharSequence sslPassword) { return this; } - @Override - public String toString() { - return "Builder{" + - "applicationName='" + this.applicationName + '\'' + - ", autodetectExtensions='" + this.autodetectExtensions + '\'' + - ", connectTimeout='" + this.connectTimeout + '\'' + - ", database='" + this.database + '\'' + - ", extensions='" + this.extensions + '\'' + - ", forceBinary='" + this.forceBinary + '\'' + - ", host='" + this.host + '\'' + - ", parameters='" + this.options + '\'' + - ", password='" + repeat(this.password != null ? this.password.length() : 0, "*") + '\'' + - ", port=" + this.port + - ", schema='" + this.schema + '\'' + - ", username='" + this.username + '\'' + - ", socket='" + this.socket + '\'' + - ", sslContextBuilderCustomizer='" + this.sslContextBuilderCustomizer + '\'' + - ", sslMode='" + this.sslMode + '\'' + - ", sslRootCert='" + this.sslRootCert + '\'' + - ", sslCert='" + this.sslCert + '\'' + - ", sslKey='" + this.sslKey + '\'' + - ", sslHostnameVerifier='" + this.sslHostnameVerifier + '\'' + - '}'; - } - /** * Configure ssl root cert for server certificate validation. * @@ -647,6 +652,31 @@ public Builder username(String username) { return this; } + @Override + public String toString() { + return "Builder{" + + "applicationName='" + this.applicationName + '\'' + + ", autodetectExtensions='" + this.autodetectExtensions + '\'' + + ", connectTimeout='" + this.connectTimeout + '\'' + + ", database='" + this.database + '\'' + + ", extensions='" + this.extensions + '\'' + + ", forceBinary='" + this.forceBinary + '\'' + + ", host='" + this.host + '\'' + + ", parameters='" + this.options + '\'' + + ", password='" + obfuscate(this.password != null ? this.password.length() : 0) + '\'' + + ", port=" + this.port + + ", schema='" + this.schema + '\'' + + ", username='" + this.username + '\'' + + ", socket='" + this.socket + '\'' + + ", sslContextBuilderCustomizer='" + this.sslContextBuilderCustomizer + '\'' + + ", sslMode='" + this.sslMode + '\'' + + ", sslRootCert='" + this.sslRootCert + '\'' + + ", sslCert='" + this.sslCert + '\'' + + ", sslKey='" + this.sslKey + '\'' + + ", sslHostnameVerifier='" + this.sslHostnameVerifier + '\'' + + '}'; + } + private SSLConfig createSslConfig() { if (this.socket != null || this.sslMode == SSLMode.DISABLE) { return SSLConfig.disabled(); @@ -671,23 +701,23 @@ private Supplier createSslProvider() { // Emulate Libpq behavior // Determining the default file location - String pathsep = System.getProperty("file.separator"); - String defaultdir; + String pathSeparator = System.getProperty("file.separator"); + String defaultDir; if (System.getProperty("os.name").toLowerCase().contains("windows")) { // It is Windows - defaultdir = System.getenv("APPDATA") + pathsep + "postgresql" + pathsep; + defaultDir = System.getenv("APPDATA") + pathSeparator + "postgresql" + pathSeparator; } else { - defaultdir = System.getProperty("user.home") + pathsep + ".postgresql" + pathsep; + defaultDir = System.getProperty("user.home") + pathSeparator + ".postgresql" + pathSeparator; } if (sslCert == null) { - String pathname = defaultdir + "postgresql.crt"; + String pathname = defaultDir + "postgresql.crt"; if (new File(pathname).exists()) { sslCert = pathname; } } if (sslKey == null) { - String pathname = defaultdir + "postgresql.pk8"; + String pathname = defaultDir + "postgresql.pk8"; if (new File(pathname).exists()) { sslKey = pathname; } @@ -698,38 +728,55 @@ private Supplier createSslProvider() { sslContextBuilder.keyManager(new File(sslCert), new File(sslKey), sslPassword); } - return () -> SslProvider.builder() .sslContext(this.sslContextBuilderCustomizer.apply(sslContextBuilder)) .defaultConfiguration(TCP) .build(); } - private void setupTcp(ConnectionFactoryOptions connectionFactoryOptions) { - enableSsl(connectionFactoryOptions); - - setSslMode(connectionFactoryOptions); - - setRootCert(connectionFactoryOptions); + private static void setupSsl(Builder builder, ConnectionFactoryOptions connectionFactoryOptions) { + Boolean ssl = connectionFactoryOptions.getValue(SSL); + if (ssl != null && ssl) { + builder.enableSsl(); + } - setCert(connectionFactoryOptions); + Object sslMode = connectionFactoryOptions.getValue(SSL_MODE); + if (sslMode != null) { + if (sslMode instanceof String) { + builder.sslMode(SSLMode.fromValue(sslMode.toString())); + } else { + builder.sslMode((SSLMode) sslMode); + } + } - setKey(connectionFactoryOptions); + String sslRootCert = connectionFactoryOptions.getValue(SSL_ROOT_CERT); + if (sslRootCert != null) { + builder.sslRootCert(sslRootCert); + } - setPassword(connectionFactoryOptions); + String sslCert = connectionFactoryOptions.getValue(SSL_CERT); + if (sslCert != null) { + builder.sslCert(sslCert); + } - setHostnameVerifier(connectionFactoryOptions); + String sslKey = connectionFactoryOptions.getValue(SSL_KEY); + if (sslKey != null) { + builder.sslKey(sslKey); + } - setCustomizer(connectionFactoryOptions); - } + String sslPassword = connectionFactoryOptions.getValue(SSL_PASSWORD); + if (sslPassword != null) { + builder.sslPassword(sslPassword); + } - private void setCustomizer(ConnectionFactoryOptions connectionFactoryOptions) { if (connectionFactoryOptions.hasOption(SSL_CONTEXT_BUILDER_CUSTOMIZER)) { - sslContextBuilderCustomizer(connectionFactoryOptions.getRequiredValue(SSL_CONTEXT_BUILDER_CUSTOMIZER)); + builder.sslContextBuilderCustomizer(connectionFactoryOptions.getRequiredValue(SSL_CONTEXT_BUILDER_CUSTOMIZER)); } + + setSslHostnameVerifier(builder, connectionFactoryOptions); } - private void setHostnameVerifier(ConnectionFactoryOptions connectionFactoryOptions) { + private static void setSslHostnameVerifier(Builder builder, ConnectionFactoryOptions connectionFactoryOptions) { Object sslHostnameVerifier = connectionFactoryOptions.getValue(SSL_HOSTNAME_VERIFIER); if (sslHostnameVerifier != null) { @@ -739,107 +786,17 @@ private void setHostnameVerifier(ConnectionFactoryOptions connectionFactoryOptio Class verifierClass = Class.forName((String) sslHostnameVerifier); Object verifier = verifierClass.getConstructor().newInstance(); - sslHostnameVerifier((HostnameVerifier) verifier); + builder.sslHostnameVerifier((HostnameVerifier) verifier); } catch (ReflectiveOperationException e) { throw new IllegalStateException("Cannot instantiate " + sslHostnameVerifier, e); } } else { - sslHostnameVerifier((HostnameVerifier) sslHostnameVerifier); - } - } - } - - private void setPassword(ConnectionFactoryOptions connectionFactoryOptions) { - String sslPassword = connectionFactoryOptions.getValue(SSL_PASSWORD); - if (sslPassword != null) { - sslPassword(sslPassword); - } - } - - private void setKey(ConnectionFactoryOptions connectionFactoryOptions) { - String sslKey = connectionFactoryOptions.getValue(SSL_KEY); - if (sslKey != null) { - sslKey(sslKey); - } - } - - private void setCert(ConnectionFactoryOptions connectionFactoryOptions) { - String sslCert = connectionFactoryOptions.getValue(SSL_CERT); - if (sslCert != null) { - sslCert(sslCert); - } - } - - private void setRootCert(ConnectionFactoryOptions connectionFactoryOptions) { - String sslRootCert = connectionFactoryOptions.getValue(SSL_ROOT_CERT); - if (sslRootCert != null) { - sslRootCert(sslRootCert); - } - } - - private void setSslMode(ConnectionFactoryOptions connectionFactoryOptions) { - Object sslMode = connectionFactoryOptions.getValue(SSL_MODE); - if (sslMode != null) { - if (sslMode instanceof String) { - sslMode(SSLMode.fromValue(sslMode.toString())); - } else { - sslMode((SSLMode) sslMode); + builder.sslHostnameVerifier((HostnameVerifier) sslHostnameVerifier); } } } - private void enableSsl(ConnectionFactoryOptions connectionFactoryOptions) { - Boolean ssl = connectionFactoryOptions.getValue(SSL); - if (ssl != null && ssl) { - enableSsl(); - } - } - - private void setOptions(ConnectionFactoryOptions connectionFactoryOptions) { - Map options = connectionFactoryOptions.getValue(OPTIONS); - if (options != null) { - options(options); - } - } - - private void setForceBinary(ConnectionFactoryOptions connectionFactoryOptions) { - Object forceBinary = connectionFactoryOptions.getValue(FORCE_BINARY); - - if (forceBinary != null) { - forceBinary(convertToBoolean(forceBinary)); - } - } - - private void setPort(ConnectionFactoryOptions connectionFactoryOptions) { - Integer port = connectionFactoryOptions.getValue(PORT); - if (port != null) { - port(port); - } - } - - private void setDatabase(ConnectionFactoryOptions connectionFactoryOptions) { - database(connectionFactoryOptions.getValue(DATABASE)); - } - - private void setConnectTimeout(ConnectionFactoryOptions connectionFactoryOptions) { - connectTimeout(connectionFactoryOptions.getValue(CONNECT_TIMEOUT)); - } - - private void setApplicationName(ConnectionFactoryOptions connectionFactoryOptions) { - String applicationName = connectionFactoryOptions.getValue(APPLICATION_NAME); - if (applicationName != null) { - this.applicationName(applicationName); - } - } - - private void setAutoDetections(ConnectionFactoryOptions connectionFactoryOptions) { - Object autodetectExtensions = connectionFactoryOptions.getValue(AUTODETECT_EXTENSIONS); - if (autodetectExtensions != null) { - this.autodetectExtensions(convertToBoolean(autodetectExtensions)); - } - } - - private boolean isUsingTcp(ConnectionFactoryOptions connectionFactoryOptions) { + private static boolean isUsingTcp(ConnectionFactoryOptions connectionFactoryOptions) { return !connectionFactoryOptions.hasOption(SOCKET); } diff --git a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java index d3495bc4..0515e746 100644 --- a/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java +++ b/src/main/java/io/r2dbc/postgresql/PostgresqlConnectionFactoryProvider.java @@ -112,8 +112,8 @@ public final class PostgresqlConnectionFactoryProvider implements ConnectionFact @Override public PostgresqlConnectionFactory create(ConnectionFactoryOptions connectionFactoryOptions) { - PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder() - .fromOptions(connectionFactoryOptions) + PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration + .builder(connectionFactoryOptions) .build(); return new PostgresqlConnectionFactory(configuration);