diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/JsonMessageSerializer.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/JsonMessageSerializer.java index 8d4246b4b22..3fed85703be 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/JsonMessageSerializer.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/JsonMessageSerializer.java @@ -19,16 +19,20 @@ package org.apache.cloudstack.framework.messaging; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; public class JsonMessageSerializer implements MessageSerializer { // this will be injected from external to allow installation of - // type adapters need by upper layer applications + // type adapters needed by upper layer applications private Gson _gson; private OnwireClassRegistry _clzRegistry; public JsonMessageSerializer() { + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.setVersion(1.5); + _gson = gsonBuilder.create(); } public Gson getGson() { diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/OnwireClassRegistry.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/OnwireClassRegistry.java index d26777e9af1..7ac64bb2317 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/OnwireClassRegistry.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/OnwireClassRegistry.java @@ -42,6 +42,7 @@ public class OnwireClassRegistry { private Map> registry = new HashMap>(); public OnwireClassRegistry() { + registry.put("Object", Object.class); } public OnwireClassRegistry(String packageName) { 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 b7c3fd6965e..27096a50998 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProvider.java @@ -28,6 +28,7 @@ public interface RpcProvider extends TransportMultiplexier { void registerRpcServiceEndpoint(RpcServiceEndpoint rpcEndpoint); void unregisteRpcServiceEndpoint(RpcServiceEndpoint rpcEndpoint); + RpcClientCall newCall(); RpcClientCall newCall(String targetAddress); RpcClientCall newCall(TransportAddressMapper targetAddress); diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java index 9be50e5f702..d8bf8868b1c 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/RpcProviderImpl.java @@ -30,7 +30,7 @@ public class RpcProviderImpl implements RpcProvider { private String _transportAddress; private RpcTransportEndpoint _transportEndpoint = new RpcTransportEndpoint(); // transport attachment at RPC layer - private MessageSerializer _messageSerializer = new JsonMessageSerializer(); // default message serializer + private MessageSerializer _messageSerializer; private List _serviceEndpoints = new ArrayList(); private Map _outstandingCalls = new HashMap(); @@ -102,6 +102,11 @@ public class RpcProviderImpl implements RpcProvider { } } + @Override + public RpcClientCall newCall() { + return newCall(TransportAddress.getLocalPredefinedTransportAddress("RpcProvider").toString()); + } + @Override public RpcClientCall newCall(String targetAddress) { @@ -111,22 +116,6 @@ public class RpcProviderImpl implements RpcProvider { call.setTargetAddress(targetAddress); call.setCallTag(callTag); - RpcCallRequestPdu pdu = new RpcCallRequestPdu(); - pdu.setCommand(call.getCommand()); - pdu.setRequestTag(callTag); - pdu.setRequestStartTick(System.currentTimeMillis()); - - String serializedCmdArg; - if(call.getCommandArg() != null) - serializedCmdArg = _messageSerializer.serializeTo(call.getCommandArg().getClass(), call.getCommandArg()); - else - serializedCmdArg = _messageSerializer.serializeTo(Object.class, null); - pdu.setSerializedCommandArg(serializedCmdArg); - - String serializedPdu = _messageSerializer.serializeTo(RpcCallRequestPdu.class, pdu); - _transportProvider.sendMessage(_transportAddress, targetAddress, RPC_MULTIPLEXIER, - serializedPdu); - return call; } diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportProvider.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportProvider.java index e25407fbe9a..71db3120434 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportProvider.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/TransportProvider.java @@ -19,6 +19,9 @@ package org.apache.cloudstack.framework.messaging; public interface TransportProvider { + void setMessageSerializer(MessageSerializer messageSerializer); + MessageSerializer getMessageSerializer(); + TransportEndpointSite attach(TransportEndpoint endpoint, String predefinedAddress); boolean detach(TransportEndpoint endpoint); diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportProvider.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportProvider.java index c2bbef71e1f..fb522c2e54f 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportProvider.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/client/ClientTransportProvider.java @@ -18,12 +18,15 @@ */ package org.apache.cloudstack.framework.messaging.client; +import org.apache.cloudstack.framework.messaging.MessageSerializer; import org.apache.cloudstack.framework.messaging.TransportEndpoint; import org.apache.cloudstack.framework.messaging.TransportEndpointSite; import org.apache.cloudstack.framework.messaging.TransportProvider; public class ClientTransportProvider implements TransportProvider { + private MessageSerializer _messageSerializer; + @Override public TransportEndpointSite attach(TransportEndpoint endpoint, String predefinedAddress) { // TODO Auto-generated method stub @@ -36,6 +39,17 @@ public class ClientTransportProvider implements TransportProvider { return false; } + + @Override + public void setMessageSerializer(MessageSerializer messageSerializer) { + assert(messageSerializer != null); + _messageSerializer = messageSerializer; + } + + @Override + public MessageSerializer getMessageSerializer() { + return _messageSerializer; + } @Override public void requestSiteOutput(TransportEndpointSite site) { diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messaging/server/ServerTransportProvider.java b/framework/ipc/src/org/apache/cloudstack/framework/messaging/server/ServerTransportProvider.java index 014c8fe6207..98177d62a5f 100644 --- a/framework/ipc/src/org/apache/cloudstack/framework/messaging/server/ServerTransportProvider.java +++ b/framework/ipc/src/org/apache/cloudstack/framework/messaging/server/ServerTransportProvider.java @@ -24,6 +24,7 @@ import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import org.apache.cloudstack.framework.messaging.MessageSerializer; import org.apache.cloudstack.framework.messaging.TransportAddress; import org.apache.cloudstack.framework.messaging.TransportDataPdu; import org.apache.cloudstack.framework.messaging.TransportEndpoint; @@ -46,6 +47,8 @@ public class ServerTransportProvider implements TransportProvider { private ExecutorService _executor; private int _nextEndpointId = new Random().nextInt(); + + private MessageSerializer _messageSerializer; public ServerTransportProvider() { } @@ -70,6 +73,17 @@ public class ServerTransportProvider implements TransportProvider { return this; } + @Override + public void setMessageSerializer(MessageSerializer messageSerializer) { + assert(messageSerializer != null); + _messageSerializer = messageSerializer; + } + + @Override + public MessageSerializer getMessageSerializer() { + return _messageSerializer; + } + public void initialize() { _executor = Executors.newFixedThreadPool(_poolSize, new NamedThreadFactory("Transport-Worker")); } diff --git a/framework/ipc/test/resources/SampleManagementServerAppContext.xml b/framework/ipc/test/resources/SampleManagementServerAppContext.xml index f53ced00b49..9709f2f85b7 100644 --- a/framework/ipc/test/resources/SampleManagementServerAppContext.xml +++ b/framework/ipc/test/resources/SampleManagementServerAppContext.xml @@ -16,15 +16,6 @@ - - - - - - - - - @@ -34,4 +25,21 @@ + + + + + + + + + + + + + + + + +