You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2014/05/28 00:17:53 UTC
[2/3] git commit: temp checkin
temp checkin
Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/65b1ff41
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/65b1ff41
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/65b1ff41
Branch: refs/heads/curator-rpc
Commit: 65b1ff417c369e6494522b703f6d938ef4d5895d
Parents: 3b57798
Author: randgalt <ra...@apache.org>
Authored: Tue May 27 17:01:23 2014 -0500
Committer: randgalt <ra...@apache.org>
Committed: Tue May 27 17:01:23 2014 -0500
----------------------------------------------------------------------
curator-x-rpc/pom.xml | 5 +
.../org/apache/curator/x/rpc/Configuration.java | 13 ++
.../curator/x/rpc/CuratorProjectionServer.java | 153 ++++++++++++++++++-
3 files changed, 167 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/curator/blob/65b1ff41/curator-x-rpc/pom.xml
----------------------------------------------------------------------
diff --git a/curator-x-rpc/pom.xml b/curator-x-rpc/pom.xml
index cf2442c..ff6bc52 100644
--- a/curator-x-rpc/pom.xml
+++ b/curator-x-rpc/pom.xml
@@ -22,6 +22,11 @@
</dependency>
<dependency>
+ <groupId>org.codehaus.jackson</groupId>
+ <artifactId>jackson-mapper-asl</artifactId>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-test</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/curator/blob/65b1ff41/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/Configuration.java
----------------------------------------------------------------------
diff --git a/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/Configuration.java b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/Configuration.java
new file mode 100644
index 0000000..a89016c
--- /dev/null
+++ b/curator-x-rpc/src/main/java/org/apache/curator/x/rpc/Configuration.java
@@ -0,0 +1,13 @@
+package org.apache.curator.x.rpc;
+
+import com.facebook.swift.service.ThriftServerConfig;
+import io.airlift.configuration.Config;
+
+public class Configuration extends ThriftServerConfig
+{
+ @Config("hey")
+ public void setHey(int hey)
+ {
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/curator/blob/65b1ff41/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 75c304b..4606177 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
@@ -21,22 +21,167 @@ package org.apache.curator.x.rpc;
import com.facebook.swift.codec.ThriftCodecManager;
import com.facebook.swift.service.ThriftEventHandler;
import com.facebook.swift.service.ThriftServer;
-import com.facebook.swift.service.ThriftServerConfig;
import com.facebook.swift.service.ThriftServiceProcessor;
+import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import io.airlift.configuration.Config;
+import io.airlift.units.DataSize;
+import io.airlift.units.Duration;
import org.apache.curator.x.rpc.idl.event.EventService;
import org.apache.curator.x.rpc.idl.projection.CuratorProjectionService;
+import org.codehaus.jackson.map.AnnotationIntrospector;
+import org.codehaus.jackson.map.DeserializationConfig;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.introspect.AnnotatedMethod;
+import org.codehaus.jackson.map.introspect.NopAnnotationIntrospector;
+import org.codehaus.jackson.node.ObjectNode;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
public class CuratorProjectionServer
{
- public static void main(String[] args)
+ private final RpcManager rpcManager;
+ private final ThriftServer server;
+ private final AtomicReference<State> state = new AtomicReference<State>(State.LATENT);
+
+ private enum State
+ {
+ LATENT,
+ STARTED,
+ STOPPED
+ }
+
+ public static void main(String[] args) throws IOException
+ {
+ if ( (args.length == 0) || args[0].equalsIgnoreCase("?") || args[0].equalsIgnoreCase("-h") || args[0].equalsIgnoreCase("--help") )
+ {
+ printHelp();
+ return;
+ }
+
+ ObjectMapper objectMapper = new ObjectMapper();
+ String options;
+ File f = new File(args[0]);
+ if ( f.exists() )
+ {
+ options = 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(objectMapper, args);
+ }
+
+ AnnotationIntrospector introspector = new NopAnnotationIntrospector()
+ {
+ @Override
+ public String findSettablePropertyName(AnnotatedMethod am)
+ {
+ Config config = am.getAnnotated().getAnnotation(Config.class);
+ return (config != null) ? config.value() : super.findSettablePropertyName(am);
+ }
+ };
+ DeserializationConfig deserializationConfig = objectMapper.getDeserializationConfig().withAnnotationIntrospector(introspector);
+ objectMapper.setDeserializationConfig(deserializationConfig);
+ Configuration configuration = objectMapper.reader().withType(Configuration.class).readValue(options);
+
+ final CuratorProjectionServer server = new CuratorProjectionServer(configuration);
+ server.start();
+
+ Runnable shutdown = new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ server.stop();
+ }
+ };
+ Thread hook = new Thread(shutdown);
+ Runtime.getRuntime().addShutdownHook(hook);
+ }
+
+ public CuratorProjectionServer(Configuration thriftServerConfig)
{
- RpcManager rpcManager = new RpcManager(TimeUnit.SECONDS.toMillis(10)); // TODO
+ rpcManager = new RpcManager(TimeUnit.SECONDS.toMillis(10));
EventService eventService = new EventService(rpcManager, 5000); // TODO
CuratorProjectionService projectionService = new CuratorProjectionService(rpcManager);
ThriftServiceProcessor processor = new ThriftServiceProcessor(new ThriftCodecManager(), Lists.<ThriftEventHandler>newArrayList(), projectionService, eventService);
- ThriftServer server = new ThriftServer(processor, new ThriftServerConfig().setPort(8899)); // TODO
+ server = new ThriftServer(processor, thriftServerConfig);
+ }
+
+ public void start()
+ {
+ Preconditions.checkState(state.compareAndSet(State.LATENT, State.STARTED), "Already started");
+
server.start();
}
+
+ public void stop()
+ {
+ if ( state.compareAndSet(State.STARTED, State.STOPPED) )
+ {
+ rpcManager.close();
+ server.close();
+ }
+ }
+
+ private static void printHelp()
+ {
+ 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 JSON configuration file");
+ System.out.println("\t<field value> ... list of values that would be in the JSON configuration file");
+ System.out.println();
+ System.out.println("Values:");
+
+ for ( Method method : Configuration.class.getMethods() )
+ {
+ Config config = method.getAnnotation(Config.class);
+ if ( (config != null) && (method.getParameterTypes().length == 1) )
+ {
+ System.out.println("\t" + config.value() + ": " + getType(method));
+ }
+ }
+ }
+
+ private static String getType(Method method)
+ {
+ Class<?> type = method.getParameterTypes()[0];
+ String result = type.getSimpleName();
+ if ( type.equals(Duration.class) )
+ {
+ result += example(new Duration(10, TimeUnit.MINUTES));
+ }
+ else if ( type.equals(DataSize.class) )
+ {
+ result += example(new DataSize(1.5, DataSize.Unit.GIGABYTE));
+ }
+ return result;
+ }
+
+ private static String example(Object s)
+ {
+ return " (e.g. \"" + s + "\")";
+ }
+
+ private static String buildOptions(ObjectMapper objectMapper, String[] args) throws IOException
+ {
+ ObjectNode node = objectMapper.createObjectNode();
+ 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\"");
+ }
+ node.put(args[i], args[i + 1]);
+ }
+ return objectMapper.writeValueAsString(node);
+ }
}