transitioned to Dropwizard config and logging

Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/49d02946
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/49d02946
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/49d02946

Branch: refs/heads/curator-rpc
Commit: 49d0294657d242f366db4a0e0654f429100c4b85
Parents: 078d7be
Author: randgalt <randg...@apache.org>
Authored: Wed May 28 12:14:59 2014 -0500
Committer: randgalt <randg...@apache.org>
Committed: Wed May 28 12:14:59 2014 -0500

----------------------------------------------------------------------
 .../curator/x/rpc/CuratorProjectionServer.java  | 94 ++++----------------
 .../AuthorizationConfiguration.java             | 27 ++++++
 ...dedExponentialBackoffRetryConfiguration.java | 51 +++++++++++
 .../x/rpc/configuration/Configuration.java      | 46 ++++++----
 .../rpc/configuration/ConfigurationBuilder.java | 20 +++--
 .../x/rpc/configuration/ConfigurationX.java     | 54 -----------
 .../configuration/ConnectionConfiguration.java  | 53 ++++++++---
 .../ExponentialBackoffRetryConfiguration.java   | 32 +++----
 .../configuration/RetryNTimesConfiguration.java | 40 +++++++++
 .../configuration/RetryPolicyConfiguration.java | 10 +++
 .../curator/x/rpc/configuration/RetryType.java  |  6 --
 .../src/main/resources/curator/help.txt         | 13 +++
 .../configuration/TestConfigurationBuilder.java | 25 +++++-
 .../resources/configuration/connections.json    | 27 ++++++
 14 files changed, 303 insertions(+), 195 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/CuratorProjectionServer.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/CuratorProjectionServer.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/CuratorProjectionServer.java
index 40e543f..2769e98 100644
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/CuratorProjectionServer.java
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/CuratorProjectionServer.java
@@ -24,21 +24,18 @@ import com.facebook.swift.service.ThriftServer;
 import com.facebook.swift.service.ThriftServiceProcessor;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import io.airlift.configuration.ConfigurationFactory;
-import io.airlift.configuration.ConfigurationLoader;
-import io.airlift.configuration.ConfigurationMetadata;
-import io.airlift.units.DataSize;
-import io.airlift.units.Duration;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
 import org.apache.curator.x.rpc.configuration.Configuration;
+import org.apache.curator.x.rpc.configuration.ConfigurationBuilder;
 import org.apache.curator.x.rpc.idl.event.EventService;
 import org.apache.curator.x.rpc.idl.projection.CuratorProjectionService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.io.IOException;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
+import java.net.URL;
+import java.nio.charset.Charset;
 import java.util.concurrent.atomic.AtomicReference;
 
 public class CuratorProjectionServer
@@ -56,29 +53,27 @@ public class CuratorProjectionServer
         STOPPED
     }
 
-    public static void main(String[] args) throws IOException
+    public static void main(String[] args) throws Exception
     {
-        if ( (args.length == 0) || args[0].equalsIgnoreCase("?") || 
args[0].equalsIgnoreCase("-h") || args[0].equalsIgnoreCase("--help") )
+        if ( (args.length != 1) || args[0].equalsIgnoreCase("?") || 
args[0].equalsIgnoreCase("-h") || args[0].equalsIgnoreCase("--help") )
         {
             printHelp();
             return;
         }
 
-        Map<String, String> options;
+        String configurationSource;
         File f = new File(args[0]);
         if ( f.exists() )
         {
-            options = new 
ConfigurationLoader().loadPropertiesFrom(f.getPath());
+            configurationSource = Files.toString(f, Charset.defaultCharset());
         }
         else
         {
-            System.out.println("First argument is not a file. Treating the 
command line as a list of field/values");
-            options = buildOptions(args);
+            System.out.println("First argument is not a file. Treating the 
command line as a json object");
+            configurationSource = args[0];
         }
 
-        ConfigurationFactory configurationFactory = new 
ConfigurationFactory(options);
-
-        Configuration configuration = 
configurationFactory.build(Configuration.class);
+        Configuration configuration = new 
ConfigurationBuilder(configurationSource).build();
 
         final CuratorProjectionServer server = new 
CuratorProjectionServer(configuration);
         server.start();
@@ -102,7 +97,7 @@ public class CuratorProjectionServer
         EventService eventService = new EventService(rpcManager, 
configuration.getPingTime().toMillis());
         CuratorProjectionService projectionService = new 
CuratorProjectionService(rpcManager);
         ThriftServiceProcessor processor = new ThriftServiceProcessor(new 
ThriftCodecManager(), Lists.<ThriftEventHandler>newArrayList(), 
projectionService, eventService);
-        server = new ThriftServer(processor, configuration);
+        server = new ThriftServer(processor, configuration.getThrift());
     }
 
     public void start()
@@ -111,7 +106,7 @@ public class CuratorProjectionServer
 
         server.start();
 
-        log.info("Server listening on port: " + configuration.getPort());
+        log.info("Server listening on port: " + 
configuration.getThrift().getPort());
     }
 
     public void stop()
@@ -127,64 +122,9 @@ public class CuratorProjectionServer
         }
     }
 
-    private static void printHelp()
+    private static void printHelp() throws IOException
     {
-        System.out.println("Curator RPC - an RPC server for using Apache 
Curator APIs and recipes from non JVM languages.");
-        System.out.println();
-        System.out.println("Arguments:");
-        System.out.println("\t<none>              show this help");
-        System.out.println("\t<path>              path to a properties 
configuration file");
-        System.out.println("\t<field value> ...   list of properties of the 
form: \"field1 value1 ... fieldN valueN\"");
-        System.out.println();
-
-        Map<String, String> valuesMap = Maps.newTreeMap();
-
-        buildMetaData(valuesMap, 
ConfigurationMetadata.getConfigurationMetadata(Configuration.class));
-
-        System.out.println("Values:");
-        for ( String s : valuesMap.values() )
-        {
-            System.out.println(s);
-        }
-
-        System.out.println("Special Types Examples:");
-        System.out.println("\t" + Duration.class.getSimpleName());
-        System.out.println("\t\t" + new Duration(10, TimeUnit.MINUTES));
-        System.out.println("\t\t" + new Duration(5, TimeUnit.MILLISECONDS));
-        System.out.println("\t\t" + new Duration(1.5, TimeUnit.HOURS));
-        System.out.println("\t" + DataSize.class.getSimpleName());
-        System.out.println("\t\t" + new DataSize(1.5, DataSize.Unit.GIGABYTE));
-        System.out.println("\t\t" + new DataSize(10, DataSize.Unit.BYTE));
-        System.out.println("\t\t" + new DataSize(.4, DataSize.Unit.MEGABYTE));
-        System.out.println();
-    }
-
-    private static void buildMetaData(Map<String, String> valuesMap, 
ConfigurationMetadata<?> metadata)
-    {
-        for ( ConfigurationMetadata.AttributeMetadata attributeMetadata : 
metadata.getAttributes().values() )
-        {
-            int index = 0;
-            ConfigurationMetadata.InjectionPointMetaData injectionPoint = 
attributeMetadata.getInjectionPoint();
-            valuesMap.put(injectionPoint.getProperty() + index++, "\t" + 
injectionPoint.getProperty() + ": " + 
attributeMetadata.getGetter().getReturnType().getSimpleName());
-            if ( attributeMetadata.getDescription() != null )
-            {
-                valuesMap.put(injectionPoint.getProperty() + index++, "\t\t" + 
attributeMetadata.getDescription());
-            }
-            valuesMap.put(injectionPoint.getProperty() + index, "");
-        }
-    }
-
-    private static Map<String, String> buildOptions(String[] args) throws 
IOException
-    {
-        Map<String, String> options = Maps.newHashMap();
-        for ( int i = 0; i < args.length; i += 2 )
-        {
-            if ( (i + 1) >= args.length )
-            {
-                throw new IOException("Bad command line. Must be list of 
fields and values of the form: \"field1 value1 ... fieldN valueN\"");
-            }
-            options.put(args[i], args[i + 1]);
-        }
-        return options;
+        URL helpUrl = Resources.getResource("curator/help.txt");
+        System.out.println(Resources.toString(helpUrl, 
Charset.defaultCharset()));
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/AuthorizationConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/AuthorizationConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/AuthorizationConfiguration.java
new file mode 100644
index 0000000..3bbc347
--- /dev/null
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/AuthorizationConfiguration.java
@@ -0,0 +1,27 @@
+package org.apache.curator.x.rpc.configuration;
+
+public class AuthorizationConfiguration
+{
+    private String scheme;
+    private String auth;
+
+    public String getScheme()
+    {
+        return scheme;
+    }
+
+    public void setScheme(String scheme)
+    {
+        this.scheme = scheme;
+    }
+
+    public String getAuth()
+    {
+        return auth;
+    }
+
+    public void setAuth(String auth)
+    {
+        this.auth = auth;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/BoundedExponentialBackoffRetryConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/BoundedExponentialBackoffRetryConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/BoundedExponentialBackoffRetryConfiguration.java
new file mode 100644
index 0000000..5c582ef
--- /dev/null
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/BoundedExponentialBackoffRetryConfiguration.java
@@ -0,0 +1,51 @@
+package org.apache.curator.x.rpc.configuration;
+
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import io.airlift.units.Duration;
+import org.apache.curator.RetryPolicy;
+import org.apache.curator.retry.BoundedExponentialBackoffRetry;
+import java.util.concurrent.TimeUnit;
+
+@JsonTypeName("bounded-exponential-backoff")
+public class BoundedExponentialBackoffRetryConfiguration extends 
RetryPolicyConfiguration
+{
+    private Duration baseSleepTime = new Duration(100, TimeUnit.MILLISECONDS);
+    private Duration maxSleepTime = new Duration(30, TimeUnit.SECONDS);
+    private int maxRetries = 3;
+
+    @Override
+    public RetryPolicy build()
+    {
+        return new 
BoundedExponentialBackoffRetry((int)baseSleepTime.toMillis(), 
(int)maxSleepTime.toMillis(), maxRetries);
+    }
+
+    public Duration getBaseSleepTime()
+    {
+        return baseSleepTime;
+    }
+
+    public void setBaseSleepTime(Duration baseSleepTime)
+    {
+        this.baseSleepTime = baseSleepTime;
+    }
+
+    public int getMaxRetries()
+    {
+        return maxRetries;
+    }
+
+    public void setMaxRetries(int maxRetries)
+    {
+        this.maxRetries = maxRetries;
+    }
+
+    public Duration getMaxSleepTime()
+    {
+        return maxSleepTime;
+    }
+
+    public void setMaxSleepTime(Duration maxSleepTime)
+    {
+        this.maxSleepTime = maxSleepTime;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/Configuration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/Configuration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/Configuration.java
index 799ab9b..e567cac 100644
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/Configuration.java
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/Configuration.java
@@ -1,28 +1,45 @@
 package org.apache.curator.x.rpc.configuration;
 
 import com.facebook.swift.service.ThriftServerConfig;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-import io.airlift.configuration.Config;
-import io.airlift.configuration.ConfigDescription;
+import com.google.common.collect.Lists;
 import io.airlift.units.Duration;
+import io.dropwizard.logging.LoggingFactory;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-public class Configuration extends ThriftServerConfig
+public class Configuration
 {
+    private ThriftServerConfig thrift = new ThriftServerConfig();
+    private LoggingFactory logging = new LoggingFactory();
     private Duration projectionExpiration = new Duration(3, TimeUnit.MINUTES);
     private Duration pingTime = new Duration(5, TimeUnit.SECONDS);
-    private List<String> connectionNames = ImmutableList.of();
+    private List<ConnectionConfiguration> connections = Lists.newArrayList();
+
+    public LoggingFactory getLogging()
+    {
+        return logging;
+    }
+
+    public void setLogging(LoggingFactory logging)
+    {
+        this.logging = logging;
+    }
+
+    public ThriftServerConfig getThrift()
+    {
+        return thrift;
+    }
+
+    public void setThrift(ThriftServerConfig thrift)
+    {
+        this.thrift = thrift;
+    }
 
     public Duration getProjectionExpiration()
     {
         return projectionExpiration;
     }
 
-    @Config("curator.projection-expiration")
-    @ConfigDescription("Curator projection instances will be expired after 
this amount of inactivity - default is 3 minutes")
     public void setProjectionExpiration(Duration projectionExpiration)
     {
         this.projectionExpiration = projectionExpiration;
@@ -33,21 +50,18 @@ public class Configuration extends ThriftServerConfig
         return pingTime;
     }
 
-    @Config("curator.ping-time")
-    @ConfigDescription("Calls to getNextEvent() will return PING after this 
duration - default is 5 seconds")
     public void setPingTime(Duration pingTime)
     {
         this.pingTime = pingTime;
     }
 
-    public List<String> getConnectionNames()
+    public List<ConnectionConfiguration> getConnections()
     {
-        return connectionNames;
+        return connections;
     }
 
-    @Config("curator.connection.names")
-    public void setConnectionNames(String connectionNames)
+    public void setConnections(List<ConnectionConfiguration> connections)
     {
-        this.connectionNames = 
Splitter.on(",").trimResults().splitToList(connectionNames);
+        this.connections = connections;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationBuilder.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationBuilder.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationBuilder.java
index f8f5760..4d9fd60 100644
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationBuilder.java
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationBuilder.java
@@ -3,7 +3,6 @@ package org.apache.curator.x.rpc.configuration;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.jsontype.SubtypeResolver;
 import com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver;
-import io.dropwizard.configuration.ConfigurationException;
 import io.dropwizard.configuration.ConfigurationFactory;
 import io.dropwizard.configuration.ConfigurationFactoryFactory;
 import io.dropwizard.configuration.ConfigurationSourceProvider;
@@ -21,7 +20,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 
-class ConfigurationBuilder
+public class ConfigurationBuilder
 {
     private final String configurationSource;
 
@@ -30,23 +29,30 @@ class ConfigurationBuilder
         LoggingFactory.bootstrap();
     }
 
-    ConfigurationBuilder(String configurationSource)
+    public ConfigurationBuilder(String configurationSource)
     {
         this.configurationSource = configurationSource;
     }
 
-    ConfigurationX build() throws IOException, ConfigurationException
+    public Configuration build() throws Exception
     {
         ObjectMapper mapper = new ObjectMapper();
         mapper.registerModule(new LogbackModule());
         mapper.setPropertyNamingStrategy(new 
AnnotationSensitivePropertyNamingStrategy());
         SubtypeResolver subtypeResolver = new StdSubtypeResolver();
-        subtypeResolver.registerSubtypes(ConsoleAppenderFactory.class, 
FileAppenderFactory.class, SyslogAppenderFactory.class);
+        subtypeResolver.registerSubtypes
+        (
+            ConsoleAppenderFactory.class,
+            FileAppenderFactory.class,
+            SyslogAppenderFactory.class,
+            ExponentialBackoffRetryConfiguration.class,
+            RetryNTimesConfiguration.class
+        );
         mapper.setSubtypeResolver(subtypeResolver);
 
         ValidatorFactory validatorFactory = 
Validation.buildDefaultValidatorFactory();
-        ConfigurationFactoryFactory<ConfigurationX> factoryFactory = new 
DefaultConfigurationFactoryFactory<ConfigurationX>();
-        ConfigurationFactory<ConfigurationX> configurationFactory = 
factoryFactory.create(ConfigurationX.class, validatorFactory.getValidator(), 
mapper, "curator");
+        ConfigurationFactoryFactory<Configuration> factoryFactory = new 
DefaultConfigurationFactoryFactory<Configuration>();
+        ConfigurationFactory<Configuration> configurationFactory = 
factoryFactory.create(Configuration.class, validatorFactory.getValidator(), 
mapper, "curator");
         ConfigurationSourceProvider provider = new 
ConfigurationSourceProvider()
         {
             @Override

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationX.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationX.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationX.java
deleted file mode 100644
index e9be8e1..0000000
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConfigurationX.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.apache.curator.x.rpc.configuration;
-
-import com.facebook.swift.service.ThriftServerConfig;
-import io.airlift.units.Duration;
-import io.dropwizard.logging.LoggingFactory;
-import java.util.concurrent.TimeUnit;
-
-public class ConfigurationX
-{
-    private ThriftServerConfig thrift = new ThriftServerConfig();
-    private LoggingFactory logging = new LoggingFactory();
-    private Duration projectionExpiration = new Duration(3, TimeUnit.MINUTES);
-    private Duration pingTime = new Duration(5, TimeUnit.SECONDS);
-
-    public LoggingFactory getLogging()
-    {
-        return logging;
-    }
-
-    public void setLogging(LoggingFactory logging)
-    {
-        this.logging = logging;
-    }
-
-    public ThriftServerConfig getThrift()
-    {
-        return thrift;
-    }
-
-    public void setThrift(ThriftServerConfig thrift)
-    {
-        this.thrift = thrift;
-    }
-
-    public Duration getProjectionExpiration()
-    {
-        return projectionExpiration;
-    }
-
-    public void setProjectionExpiration(Duration projectionExpiration)
-    {
-        this.projectionExpiration = projectionExpiration;
-    }
-
-    public Duration getPingTime()
-    {
-        return pingTime;
-    }
-
-    public void setPingTime(Duration pingTime)
-    {
-        this.pingTime = pingTime;
-    }
-}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConnectionConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConnectionConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConnectionConfiguration.java
index 8209c6a..3e2f9a2 100644
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConnectionConfiguration.java
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ConnectionConfiguration.java
@@ -1,24 +1,34 @@
 package org.apache.curator.x.rpc.configuration;
 
-import io.airlift.configuration.Config;
-import io.airlift.configuration.ConfigDescription;
 import io.airlift.units.Duration;
+import javax.validation.constraints.NotNull;
 import java.util.concurrent.TimeUnit;
 
 public class ConnectionConfiguration
 {
+    @NotNull private String name;
     private String connectionString = "localhost:2181";
     private Duration sessionLength = new Duration(1, TimeUnit.MINUTES);
     private Duration connectionTimeout = new Duration(15, TimeUnit.SECONDS);
-    private RetryType retryType;
+    private AuthorizationConfiguration authorization = null;
+    private String namespace = null;
+    private RetryPolicyConfiguration retry = new 
ExponentialBackoffRetryConfiguration();
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
 
     public String getConnectionString()
     {
         return connectionString;
     }
 
-    @Config("curator.connection.$CONNECTION-NAME$.connection-string")
-    @ConfigDescription("Default ZooKeeper connection string. E.g. 
\"foo.com:2181,bar.com:2181\"")
     public void setConnectionString(String connectionString)
     {
         this.connectionString = connectionString;
@@ -29,8 +39,6 @@ public class ConnectionConfiguration
         return sessionLength;
     }
 
-    @Config("curator.connection.$CONNECTION-NAME$.session-length")
-    @ConfigDescription("Session length. Default is 1 minute")
     public void setSessionLength(Duration sessionLength)
     {
         this.sessionLength = sessionLength;
@@ -41,21 +49,38 @@ public class ConnectionConfiguration
         return connectionTimeout;
     }
 
-    @Config("curator.connection.$CONNECTION-NAME$.connection-timeout")
-    @ConfigDescription("Connection timeout. Default is 15 seconds")
     public void setConnectionTimeout(Duration connectionTimeout)
     {
         this.connectionTimeout = connectionTimeout;
     }
 
-    public RetryType getRetryType()
+    public AuthorizationConfiguration getAuthorization()
+    {
+        return authorization;
+    }
+
+    public void setAuthorization(AuthorizationConfiguration authorization)
+    {
+        this.authorization = authorization;
+    }
+
+    public String getNamespace()
+    {
+        return namespace;
+    }
+
+    public void setNamespace(String namespace)
+    {
+        this.namespace = namespace;
+    }
+
+    public RetryPolicyConfiguration getRetry()
     {
-        return retryType;
+        return retry;
     }
 
-    @Config("curator.connection.$CONNECTION-NAME$.retry.type")
-    public void setRetryType(RetryType retryType)
+    public void setRetry(RetryPolicyConfiguration retry)
     {
-        this.retryType = retryType;
+        this.retry = retry;
     }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ExponentialBackoffRetryConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ExponentialBackoffRetryConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ExponentialBackoffRetryConfiguration.java
index 41b8db8..7e02592 100644
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ExponentialBackoffRetryConfiguration.java
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/ExponentialBackoffRetryConfiguration.java
@@ -1,20 +1,28 @@
 package org.apache.curator.x.rpc.configuration;
 
-import io.airlift.configuration.Config;
+import com.fasterxml.jackson.annotation.JsonTypeName;
 import io.airlift.units.Duration;
+import org.apache.curator.RetryPolicy;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import java.util.concurrent.TimeUnit;
 
-public class ExponentialBackoffRetryConfiguration
+@JsonTypeName("exponential-backoff")
+public class ExponentialBackoffRetryConfiguration extends 
RetryPolicyConfiguration
 {
-    private Duration baseSleepTime;
-    private int maxRetries;
-    private Duration maxSleep;
+    private Duration baseSleepTime = new Duration(100, TimeUnit.MILLISECONDS);
+    private int maxRetries = 3;
+
+    @Override
+    public RetryPolicy build()
+    {
+        return new ExponentialBackoffRetry((int)baseSleepTime.toMillis(), 
maxRetries);
+    }
 
     public Duration getBaseSleepTime()
     {
         return baseSleepTime;
     }
 
-    @Config("curator.retry.exponential.base-sleep-time")
     public void setBaseSleepTime(Duration baseSleepTime)
     {
         this.baseSleepTime = baseSleepTime;
@@ -25,20 +33,8 @@ public class ExponentialBackoffRetryConfiguration
         return maxRetries;
     }
 
-    @Config("curator.retry.exponential.max-retries")
     public void setMaxRetries(int maxRetries)
     {
         this.maxRetries = maxRetries;
     }
-
-    public Duration getMaxSleep()
-    {
-        return maxSleep;
-    }
-
-    @Config("curator.retry.exponential.max-sleep")
-    public void setMaxSleep(Duration maxSleep)
-    {
-        this.maxSleep = maxSleep;
-    }
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryNTimesConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryNTimesConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryNTimesConfiguration.java
new file mode 100644
index 0000000..97b25f2
--- /dev/null
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryNTimesConfiguration.java
@@ -0,0 +1,40 @@
+package org.apache.curator.x.rpc.configuration;
+
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import io.airlift.units.Duration;
+import org.apache.curator.RetryPolicy;
+import org.apache.curator.retry.RetryNTimes;
+import java.util.concurrent.TimeUnit;
+
+@JsonTypeName("ntimes")
+public class RetryNTimesConfiguration extends RetryPolicyConfiguration
+{
+    private Duration sleepBetweenRetries = new Duration(100, 
TimeUnit.MILLISECONDS);
+    private int n = 3;
+
+    @Override
+    public RetryPolicy build()
+    {
+        return new RetryNTimes(n, (int)sleepBetweenRetries.toMillis());
+    }
+
+    public Duration getSleepBetweenRetries()
+    {
+        return sleepBetweenRetries;
+    }
+
+    public void setSleepBetweenRetries(Duration sleepBetweenRetries)
+    {
+        this.sleepBetweenRetries = sleepBetweenRetries;
+    }
+
+    public int getN()
+    {
+        return n;
+    }
+
+    public void setN(int n)
+    {
+        this.n = n;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryPolicyConfiguration.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryPolicyConfiguration.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryPolicyConfiguration.java
new file mode 100644
index 0000000..463e148
--- /dev/null
+++ 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryPolicyConfiguration.java
@@ -0,0 +1,10 @@
+package org.apache.curator.x.rpc.configuration;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import org.apache.curator.RetryPolicy;
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
+public abstract class RetryPolicyConfiguration
+{
+    public abstract RetryPolicy build();
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryType.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryType.java
 
b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryType.java
deleted file mode 100644
index 7e4761a..0000000
--- 
a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/configuration/RetryType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.apache.curator.x.rpc.configuration;
-
-public enum RetryType
-{
-    ExponentialBackoffRetry,
-}

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/main/resources/curator/help.txt
----------------------------------------------------------------------
diff --git a/curator-x-rpc/src/main/resources/curator/help.txt 
b/curator-x-rpc/src/main/resources/curator/help.txt
new file mode 100644
index 0000000..086654e
--- /dev/null
+++ b/curator-x-rpc/src/main/resources/curator/help.txt
@@ -0,0 +1,13 @@
+Curator RPC - an RPC server for using Apache Curator APIs and recipes from non 
JVM languages.
+
+Arguments:
+    <none>    show this help
+    <path>    path to a JSON or YAML configuration file
+    <string>  JSON or YAML object for configuration
+
+Curator RPC uses Dropwizard for configuration. The format is JSON or YAML 
(your choice).
+
+Curator also uses Dropwizard's logging module. The configuration for it is 
described here:
+http://dropwizard.readthedocs.org/en/latest/manual/configuration.html#logging
+
+TODO - more details to follow

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/test/java/org/apache/curator/x/rpc/configuration/TestConfigurationBuilder.java
----------------------------------------------------------------------
diff --git 
a/curator-x-rpc/src/test/java/org/apache/curator/x/rpc/configuration/TestConfigurationBuilder.java
 
b/curator-x-rpc/src/test/java/org/apache/curator/x/rpc/configuration/TestConfigurationBuilder.java
index caf5af3..467af3c 100644
--- 
a/curator-x-rpc/src/test/java/org/apache/curator/x/rpc/configuration/TestConfigurationBuilder.java
+++ 
b/curator-x-rpc/src/test/java/org/apache/curator/x/rpc/configuration/TestConfigurationBuilder.java
@@ -5,6 +5,8 @@ import com.google.common.collect.Sets;
 import com.google.common.io.Resources;
 import io.airlift.units.Duration;
 import io.dropwizard.logging.AppenderFactory;
+import org.apache.curator.retry.ExponentialBackoffRetry;
+import org.apache.curator.retry.RetryNTimes;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 import java.net.URL;
@@ -17,7 +19,7 @@ public class TestConfigurationBuilder
     @Test
     public void testSimple() throws Exception
     {
-        ConfigurationX configuration = 
loadTestConfiguration("configuration/simple.json");
+        Configuration configuration = 
loadTestConfiguration("configuration/simple.json");
         Assert.assertEquals(configuration.getThrift().getPort(), 1234);
         Assert.assertEquals(configuration.getPingTime(), new Duration(10, 
TimeUnit.SECONDS));
     }
@@ -25,7 +27,7 @@ public class TestConfigurationBuilder
     @Test
     public void testLogging() throws Exception
     {
-        ConfigurationX configuration = 
loadTestConfiguration("configuration/logging.json");
+        Configuration configuration = 
loadTestConfiguration("configuration/logging.json");
         Assert.assertEquals(configuration.getLogging().getLevel(), Level.INFO);
         Assert.assertEquals(configuration.getLogging().getAppenders().size(), 
2);
 
@@ -37,7 +39,24 @@ public class TestConfigurationBuilder
         Assert.assertEquals(types, Sets.newHashSet("FileAppenderFactory", 
"ConsoleAppenderFactory"));
     }
 
-    private ConfigurationX loadTestConfiguration(String name) throws Exception
+    @Test
+    public void testConnections() throws Exception
+    {
+        Configuration configuration = 
loadTestConfiguration("configuration/connections.json");
+        Assert.assertEquals(configuration.getConnections().size(), 2);
+
+        Assert.assertEquals(configuration.getConnections().get(0).getName(), 
"test");
+        
Assert.assertEquals(configuration.getConnections().get(0).getConnectionString(),
 "one:1,two:2");
+        
Assert.assertEquals(configuration.getConnections().get(0).getConnectionTimeout(),
 new Duration(20, TimeUnit.SECONDS));
+        
Assert.assertEquals(configuration.getConnections().get(0).getRetry().build().getClass(),
 ExponentialBackoffRetry.class);
+
+        Assert.assertEquals(configuration.getConnections().get(1).getName(), 
"alt");
+        
Assert.assertEquals(configuration.getConnections().get(1).getConnectionString(),
 "three:3,four:4");
+        
Assert.assertEquals(configuration.getConnections().get(1).getConnectionTimeout(),
 new Duration(30, TimeUnit.SECONDS));
+        
Assert.assertEquals(configuration.getConnections().get(1).getRetry().build().getClass(),
 RetryNTimes.class);
+    }
+
+    private Configuration loadTestConfiguration(String name) throws Exception
     {
         URL resource = Resources.getResource(name);
         String source = Resources.toString(resource, Charset.defaultCharset());

http://git-wip-us.apache.org/repos/asf/curator/blob/49d02946/curator-x-rpc/src/test/resources/configuration/connections.json
----------------------------------------------------------------------
diff --git a/curator-x-rpc/src/test/resources/configuration/connections.json 
b/curator-x-rpc/src/test/resources/configuration/connections.json
new file mode 100644
index 0000000..fb5f84a
--- /dev/null
+++ b/curator-x-rpc/src/test/resources/configuration/connections.json
@@ -0,0 +1,27 @@
+{
+    "connections": [
+        {
+            "name": "test",
+            "connectionString": "one:1,two:2",
+            "sessionLength": "3m",
+            "connectionTimeout": "20s",
+            "retry": {
+                "type": "exponential-backoff",
+                "baseSleepTime": "1s",
+                "maxRetries": 10
+            }
+        },
+
+        {
+            "name": "alt",
+            "connectionString": "three:3,four:4",
+            "sessionLength": "4m",
+            "connectionTimeout": "30s",
+            "retry": {
+                "type": "ntimes",
+                "sleepBetweenRetries": "1m",
+                "n": 10
+            }
+        }
+    ]
+}
\ No newline at end of file

Reply via email to