From 1e41a35b0db09d3fbad580268eb8a918c43d3a43 Mon Sep 17 00:00:00 2001 From: Emmanuel Bernard Date: Fri, 15 May 2015 16:38:46 +0200 Subject: [PATCH] OGM-662 Add support for multiple hosts in document store configuration --- .../org/hibernate/ogm/cfg/OgmProperties.java | 7 ++++++ .../cfg/spi/DocumentStoreConfiguration.java | 25 ++++++++----------- .../cfg/DocumentStoreConfigurationTest.java | 19 +++++++++----- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/core/src/main/java/org/hibernate/ogm/cfg/OgmProperties.java b/core/src/main/java/org/hibernate/ogm/cfg/OgmProperties.java index 9ca35bf3ca..365afe15af 100644 --- a/core/src/main/java/org/hibernate/ogm/cfg/OgmProperties.java +++ b/core/src/main/java/org/hibernate/ogm/cfg/OgmProperties.java @@ -50,12 +50,19 @@ public interface OgmProperties { /** * Property for setting the host name to connect to. Accepts {@code String}. + * Accepts a comma separated list of host / ports. + * Note that for IPv6, the host must be surrounded by square bracket if a port is defined: [2001:db8::ff00:42:8329]:123 + * + * For example + * www.example.com, www2.example.com:123, 192.0.2.1, 192.0.2.2:123, 2001:db8::ff00:42:8329, [2001:db8::ff00:42:8329]:123 */ String HOST = "hibernate.ogm.datastore.host"; /** * Property for setting the port number of the database to connect to. Accepts {@code int}. + * @deprecated ignored when multiple hosts are defined in {@link #HOST}, prefer the {@code host:port} approach */ + @Deprecated String PORT = "hibernate.ogm.datastore.port"; /** diff --git a/core/src/main/java/org/hibernate/ogm/cfg/spi/DocumentStoreConfiguration.java b/core/src/main/java/org/hibernate/ogm/cfg/spi/DocumentStoreConfiguration.java index e4ff507a30..eea0d8ab00 100644 --- a/core/src/main/java/org/hibernate/ogm/cfg/spi/DocumentStoreConfiguration.java +++ b/core/src/main/java/org/hibernate/ogm/cfg/spi/DocumentStoreConfiguration.java @@ -7,6 +7,7 @@ package org.hibernate.ogm.cfg.spi; import org.hibernate.ogm.cfg.OgmProperties; +import org.hibernate.ogm.cfg.impl.HostParser; import org.hibernate.ogm.util.configurationreader.impl.Validators; import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader; @@ -24,23 +25,24 @@ public abstract class DocumentStoreConfiguration { - private final String host; - private final int port; + private final Hosts hosts; private final String databaseName; private final String username; private final String password; private final boolean createDatabase; public DocumentStoreConfiguration(ConfigurationPropertyReader propertyReader, int defaultPort) { - this.host = propertyReader.property( OgmProperties.HOST, String.class ) + String host = propertyReader.property( OgmProperties.HOST, String.class ) .withDefault( DEFAULT_HOST ) .getValue(); - this.port = propertyReader.property( OgmProperties.PORT, int.class ) - .withDefault( defaultPort ) + Integer port = propertyReader.property( OgmProperties.PORT, Integer.class ) .withValidator( Validators.PORT ) + .withDefault( null ) .getValue(); + hosts = HostParser.parse( host, port, defaultPort ); + this.databaseName = propertyReader.property( OgmProperties.DATABASE, String.class ) .required() .getValue(); @@ -55,18 +57,11 @@ public DocumentStoreConfiguration(ConfigurationPropertyReader propertyReader, in /** * @see OgmProperties#HOST - * @return The host name of the data store instance - */ - public String getHost() { - return host; - } - - /** * @see OgmProperties#PORT - * @return The port of the data store instance to connect to + * @return The host name of the data store instance */ - public int getPort() { - return port; + public Hosts getHosts() { + return hosts; } /** diff --git a/core/src/test/java/org/hibernate/ogm/test/cfg/DocumentStoreConfigurationTest.java b/core/src/test/java/org/hibernate/ogm/test/cfg/DocumentStoreConfigurationTest.java index 17b3549669..d724b43dd1 100644 --- a/core/src/test/java/org/hibernate/ogm/test/cfg/DocumentStoreConfigurationTest.java +++ b/core/src/test/java/org/hibernate/ogm/test/cfg/DocumentStoreConfigurationTest.java @@ -14,6 +14,7 @@ import org.hibernate.HibernateException; import org.hibernate.ogm.cfg.OgmProperties; import org.hibernate.ogm.cfg.spi.DocumentStoreConfiguration; +import org.hibernate.ogm.cfg.spi.Hosts; import org.hibernate.ogm.util.configurationreader.spi.ConfigurationPropertyReader; import org.junit.Before; import org.junit.Rule; @@ -44,7 +45,8 @@ public void setUp() { public void shouldReturnTheDefaultValueIfThePortKeyIsNotPresentAsAConfigurationValue() { configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getPort() ).isEqualTo( 1234 ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getPort() ).isEqualTo( 1234 ); } @Test @@ -52,7 +54,8 @@ public void shouldReturnTheDefaultValueIfThePortConfigurationValueIsTheEmptyStri configurationValues.put( OgmProperties.PORT, "" ); configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getPort() ).isEqualTo( 1234 ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getPort() ).isEqualTo( 1234 ); } @Test @@ -61,14 +64,16 @@ public void shouldReturnThePortConfigured() { configurationValues.put( OgmProperties.PORT, String.valueOf( configuredPortValue ) ); configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getPort() ).isEqualTo( configuredPortValue ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getPort() ).isEqualTo( configuredPortValue ); } @Test public void shouldReturnLocalhostIfTheHostNotPresentAsAConfigurationValue() { configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getHost() ).isEqualTo( "localhost" ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getHost() ).isEqualTo( "localhost" ); } @Test @@ -76,7 +81,8 @@ public void shouldReturnLocalhostIfTheHostConfigurationValueIsTheEmptyString() { configurationValues.put( OgmProperties.HOST, " " ); configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getHost() ).isEqualTo( "localhost" ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getHost() ).isEqualTo( "localhost" ); } @Test @@ -85,7 +91,8 @@ public void shouldReturnTheHostConfiguredValue() { configurationValues.put( OgmProperties.HOST, configuredHostValue ); configuration = new TestDocumentStoreConfiguration( configurationValues ); - assertThat( configuration.getHost() ).isEqualTo( configuredHostValue ); + Hosts hosts = configuration.getHosts(); + assertThat( hosts.getFirst().getHost() ).isEqualTo( configuredHostValue ); } @Test