Updated Branches:
  refs/heads/javelin 17f2af409 -> d62da2a7b

Make RPC naming convention clear for RPC users, add handler and event 
dispatchers


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/d62da2a7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/d62da2a7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/d62da2a7

Branch: refs/heads/javelin
Commit: d62da2a7b5945eda1048ec02887c7cdef511efbd
Parents: 17f2af4
Author: Kelven Yang <[email protected]>
Authored: Tue Nov 20 15:42:51 2012 -0800
Committer: Kelven Yang <[email protected]>
Committed: Tue Nov 20 15:42:51 2012 -0800

----------------------------------------------------------------------
 .../framework/messaging/ComponentContainer.java    |   20 ++++-
 .../framework/messaging/ComponentEndpoint.java     |   15 ++-
 .../framework/messaging/EventDispatcher.java       |   73 +++++++++++++++
 .../framework/messaging/EventHandler.java          |   34 ++++---
 .../framework/messaging/RpcCallbackDispatcher.java |   70 ++++++++++++++
 .../framework/messaging/RpcCallbackHandler.java    |   30 ++++++
 .../framework/messaging/RpcClientCall.java         |    5 +-
 .../framework/messaging/RpcClientCallHandler.java  |   12 ---
 .../framework/messaging/RpcEndpoint.java           |   23 -----
 .../framework/messaging/RpcProvider.java           |    4 +-
 .../framework/messaging/RpcServerCallHandler.java  |   30 ------
 .../framework/messaging/RpcServiceDispatcher.java  |   70 ++++++++++++++
 .../framework/messaging/RpcServiceEndpoint.java    |   30 ++++++
 .../framework/messaging/RpcServiceHandler.java     |   30 ++++++
 .../cloudstack/framework/messaging/Subscriber.java |   34 ++++---
 .../framework/messaging/TransportEndpoint.java     |    2 +-
 .../messaging/client/ClientTransportEndpoint.java  |    2 +-
 17 files changed, 375 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentContainer.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentContainer.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentContainer.java
index 1d0f274..c5828ae 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentContainer.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentContainer.java
@@ -1,5 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.cloudstack.framework.messaging;
 
 public interface ComponentContainer {
-       ComponentEndpoint wireComponent(ComponentEndpoint endpoint, String 
predefinedAddress);
+       ComponentEndpoint wire(ComponentEndpoint endpoint, String 
predefinedAddress);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentEndpoint.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentEndpoint.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentEndpoint.java
index 92443e5..b218c19 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentEndpoint.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/ComponentEndpoint.java
@@ -18,7 +18,8 @@
  */
 package org.apache.cloudstack.framework.messaging;
 
-public class ComponentEndpoint implements RpcEndpoint, Subscriber {
+public class ComponentEndpoint implements RpcServiceEndpoint, Subscriber {
+       
        private TransportEndpoint transportEndpoint;
        private RpcProvider rpcProvider;
        
@@ -42,17 +43,19 @@ public class ComponentEndpoint implements RpcEndpoint, 
Subscriber {
        }
        
        public void initialize() {
-               rpcProvider.registerRpcEndpoint(this);
+               rpcProvider.registerRpcServiceEndpoint(this);
        }
 
        @Override
-       public void onCallReceive(RpcServerCall call) {
-               // TODO Auto-generated method stub
-               // implement annotation based call dispatching
+       public boolean onCallReceive(RpcServerCall call) {
+               return RpcServiceDispatcher.dispatch(this, call);
        }
        
        @Override
        public void onPublishEvent(String subject, String senderAddress, Object 
args) {
-               // TODO
+               try {
+                       EventDispatcher.dispatch(this, subject, senderAddress, 
args);
+               } catch(RuntimeException e) {
+               }
        }
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventDispatcher.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventDispatcher.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventDispatcher.java
new file mode 100644
index 0000000..ec2afb4
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventDispatcher.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class EventDispatcher {
+       private static Map<Class<?>, Method> s_handlerCache = new 
HashMap<Class<?>, Method>();
+       
+       public static boolean dispatch(Object target, String subject, String 
senderAddress, Object args) {
+               assert(subject != null);
+               assert(target != null);
+               
+               Method handler = resolveHandler(target.getClass(), subject);
+               if(handler == null)
+                       return false;
+               
+               try {
+                       handler.invoke(target, subject, senderAddress, args);
+               } catch (IllegalArgumentException e) {
+                       throw new RuntimeException("IllegalArgumentException 
when invoking event handler for subject: " + subject);
+               } catch (IllegalAccessException e) {
+                       throw new RuntimeException("IllegalAccessException when 
invoking event handler for subject: " + subject);
+               } catch (InvocationTargetException e) {
+                       throw new RuntimeException("InvocationTargetException 
when invoking event handler for subject: " + subject);
+               }
+               
+               return true;
+       }
+       
+       public static Method resolveHandler(Class<?> handlerClz, String 
subject) {
+               synchronized(s_handlerCache) {
+                       Method handler = s_handlerCache.get(handlerClz);
+                       if(handler != null)
+                               return handler;
+                       
+                       for(Method method : handlerClz.getMethods()) {
+                               EventHandler annotation = 
method.getAnnotation(EventHandler.class);
+                               if(annotation != null) {
+                                       if(match(annotation.topic(), subject)) {
+                                               s_handlerCache.put(handlerClz, 
method);
+                                               return method;
+                                       }
+                               }
+                       }
+               }
+               
+               return null;
+       }
+       
+       private static boolean match(String expression, String param) {
+               return param.matches(expression);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventHandler.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventHandler.java 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventHandler.java
index 6ee67c8..5ec03f1 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventHandler.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/EventHandler.java
@@ -1,19 +1,21 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// the License.  You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.cloudstack.framework.messaging;
 
 import java.lang.annotation.ElementType;

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
new file mode 100644
index 0000000..8fbe38f
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackDispatcher.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RpcCallbackDispatcher {
+
+       private static Map<Class<?>, Method> s_handlerCache = new 
HashMap<Class<?>, Method>();
+       
+       public static boolean dispatch(Object target, RpcClientCall clientCall) 
{
+               assert(clientCall != null);
+               assert(target != null);
+               
+               Method handler = resolveHandler(target.getClass(), 
clientCall.getCommand());
+               if(handler == null)
+                       return false;
+               
+               try {
+                       handler.invoke(target, clientCall);
+               } catch (IllegalArgumentException e) {
+                       throw new RpcException("IllegalArgumentException when 
invoking RPC callback for command: " + clientCall.getCommand());
+               } catch (IllegalAccessException e) {
+                       throw new RpcException("IllegalAccessException when 
invoking RPC callback for command: " + clientCall.getCommand());
+               } catch (InvocationTargetException e) {
+                       throw new RpcException("InvocationTargetException when 
invoking RPC callback for command: " + clientCall.getCommand());
+               }
+               
+               return true;
+       }
+       
+       public static Method resolveHandler(Class<?> handlerClz, String 
command) {
+               synchronized(s_handlerCache) {
+                       Method handler = s_handlerCache.get(handlerClz);
+                       if(handler != null)
+                               return handler;
+                       
+                       for(Method method : handlerClz.getMethods()) {
+                               RpcCallbackHandler annotation = 
method.getAnnotation(RpcCallbackHandler.class);
+                               if(annotation != null) {
+                                       
if(annotation.command().equals(command)) {
+                                               s_handlerCache.put(handlerClz, 
method);
+                                               return method;
+                                       }
+                               }
+                       }
+               }
+               
+               return null;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackHandler.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackHandler.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackHandler.java
new file mode 100644
index 0000000..61a2141
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcCallbackHandler.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface RpcCallbackHandler {
+    String command();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCall.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCall.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCall.java
index 5a1e9c4..a1a4bbf 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCall.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCall.java
@@ -19,8 +19,8 @@ package org.apache.cloudstack.framework.messaging;
 import java.util.concurrent.TimeUnit;
 
 public interface RpcClientCall {
+       String getCommand();
        RpcClientCall setCommand(String cmd);
-       RpcClientCall setPipeline(String pipeline);
        RpcClientCall setTimeout(TimeUnit timeout);
        
        RpcClientCall setCommandArg(Object arg);
@@ -34,5 +34,8 @@ public interface RpcClientCall {
        void apply();
        void cancel();
        
+       /**
+        * @return the result object, it may also throw RpcException to 
indicate RPC failures 
+        */
        <T> T get();
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCallHandler.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCallHandler.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCallHandler.java
deleted file mode 100644
index d695ff3..0000000
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcClientCallHandler.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.apache.cloudstack.framework.messaging;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface RpcClientCallHandler {
-    String command();
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcEndpoint.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcEndpoint.java 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcEndpoint.java
deleted file mode 100644
index 375c1d3..0000000
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcEndpoint.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.framework.messaging;
-
-public interface RpcEndpoint {
-       void onCallReceive(RpcServerCall call);
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java
index 547a81a..334e09d 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java
@@ -22,8 +22,8 @@ public interface RpcProvider extends TransportMultiplexier {
        void setMessageSerializer(MessageSerializer messageSerializer);
        MessageSerializer getMessageSerializer();
        
-       void registerRpcEndpoint(RpcEndpoint rpcEndpoint);
-       void unregisteRpcEndpoint(RpcEndpoint rpcEndpoint);
+       void registerRpcServiceEndpoint(RpcServiceEndpoint rpcEndpoint);
+       void unregisteRpcServiceEndpoint(RpcServiceEndpoint rpcEndpoint);
        
        RpcClientCall target(String target);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServerCallHandler.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServerCallHandler.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServerCallHandler.java
deleted file mode 100644
index 73502ab..0000000
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServerCallHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.cloudstack.framework.messaging;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.METHOD)
-public @interface RpcServerCallHandler {
-    String command();
-}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
new file mode 100644
index 0000000..1f1d1b9
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceDispatcher.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+public class RpcServiceDispatcher {
+
+       private static Map<Class<?>, Method> s_handlerCache = new 
HashMap<Class<?>, Method>();
+       
+       public static boolean dispatch(Object target, RpcServerCall 
serviceCall) {
+               assert(serviceCall != null);
+               assert(target != null);
+               
+               Method handler = resolveHandler(target.getClass(), 
serviceCall.getCommand());
+               if(handler == null)
+                       return false;
+               
+               try {
+                       handler.invoke(target, serviceCall);
+               } catch (IllegalArgumentException e) {
+                       throw new RpcException("IllegalArgumentException when 
invoking RPC service command: " + serviceCall.getCommand());
+               } catch (IllegalAccessException e) {
+                       throw new RpcException("IllegalAccessException when 
invoking RPC service command: " + serviceCall.getCommand());
+               } catch (InvocationTargetException e) {
+                       throw new RpcException("InvocationTargetException when 
invoking RPC service command: " + serviceCall.getCommand());
+               }
+               
+               return true;
+       }
+       
+       public static Method resolveHandler(Class<?> handlerClz, String 
command) {
+               synchronized(s_handlerCache) {
+                       Method handler = s_handlerCache.get(handlerClz);
+                       if(handler != null)
+                               return handler;
+                       
+                       for(Method method : handlerClz.getMethods()) {
+                               RpcServiceHandler annotation = 
method.getAnnotation(RpcServiceHandler.class);
+                               if(annotation != null) {
+                                       
if(annotation.command().equals(command)) {
+                                               s_handlerCache.put(handlerClz, 
method);
+                                               return method;
+                                       }
+                               }
+                       }
+               }
+               
+               return null;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceEndpoint.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceEndpoint.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceEndpoint.java
new file mode 100644
index 0000000..8820139
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceEndpoint.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+public interface RpcServiceEndpoint {
+       /*
+        * @return
+        *              true call has been handled
+        *              false can not find the call handler
+        * @throws
+        *      RpcException, exception when 
+        */
+       boolean onCallReceive(RpcServerCall call);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceHandler.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceHandler.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceHandler.java
new file mode 100644
index 0000000..435f841
--- /dev/null
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcServiceHandler.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cloudstack.framework.messaging;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface RpcServiceHandler {
+    String command();
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/Subscriber.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/Subscriber.java 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/Subscriber.java
index 9f8d460..d4fe69c 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/Subscriber.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/Subscriber.java
@@ -1,19 +1,21 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// the License.  You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 
 package org.apache.cloudstack.framework.messaging;
 

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportEndpoint.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportEndpoint.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportEndpoint.java
index 91ec86f..0996bfd 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportEndpoint.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportEndpoint.java
@@ -27,6 +27,6 @@ public interface TransportEndpoint {
        void registerMultiplexier(String name, TransportMultiplexier 
multiplexier);
        void unregisterMultiplexier(String name);
        
-       void sendMessage(TransportEndpoint sender, String 
targetEndpointAddress, 
+       void sendMessage(String soureEndpointAddress, String 
targetEndpointAddress, 
                String multiplexier, String message);
 }

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/d62da2a7/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportEndpoint.java
----------------------------------------------------------------------
diff --git 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportEndpoint.java
 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportEndpoint.java
index e12ddcf..a1c345e 100644
--- 
a/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportEndpoint.java
+++ 
b/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportEndpoint.java
@@ -50,7 +50,7 @@ public class ClientTransportEndpoint implements 
TransportEndpoint {
        }
 
        @Override
-       public void sendMessage(TransportEndpoint sender,
+       public void sendMessage(String sourceEndpointAddress,
                        String targetEndpointAddress, String multiplexier, 
String message) {
                // TODO Auto-generated method stub
        }

Reply via email to