diff --git a/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java b/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java index 9b51f1de3de..8f8f186d03d 100644 --- a/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java +++ b/core/src/com/cloud/agent/api/PingRoutingWithNwGroupsCommand.java @@ -18,22 +18,91 @@ version. */ package com.cloud.agent.api; +import java.lang.reflect.Type; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; -import com.cloud.host.Host.Type; +import com.cloud.agent.api.SecStorageFirewallCfgCommand.PortConfig; +import com.cloud.agent.transport.Request; +import com.cloud.host.Host; import com.cloud.utils.Pair; import com.cloud.vm.State; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.reflect.TypeToken; public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand { HashMap> newGroupStates; + public static class NwGroupsCommandTypeAdaptor implements JsonDeserializer>, JsonSerializer> { + static final GsonBuilder s_gBuilder; + static { + s_gBuilder = Request.initBuilder(); + } + + public NwGroupsCommandTypeAdaptor() { + } + + @Override + public JsonElement serialize(Pair src, + java.lang.reflect.Type typeOfSrc, JsonSerializationContext context) { + JsonArray array = new JsonArray(); + Gson json = s_gBuilder.create(); + if(src.first() != null) { + array.add(json.toJsonTree(src.first())); + } else { + array.add(new JsonNull()); + } + + if (src.second() != null) { + array.add(json.toJsonTree(src.second())); + } else { + array.add(new JsonNull()); + } + + return array; + } + + @Override + public Pair deserialize(JsonElement json, + java.lang.reflect.Type type, JsonDeserializationContext context) + throws JsonParseException { + Pair pairs = new Pair(null, null); + JsonArray array = json.getAsJsonArray(); + if (array.size() != 2) { + return pairs; + } + JsonElement element = array.get(0); + if (!element.isJsonNull()) { + pairs.first(element.getAsLong()); + } + + element = array.get(1); + if (!element.isJsonNull()) { + pairs.second(element.getAsLong()); + } + + return pairs; + } + + } protected PingRoutingWithNwGroupsCommand() { super(); } - public PingRoutingWithNwGroupsCommand(Type type, long id, Map states, HashMap> nwGrpStates) { + public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map states, HashMap> nwGrpStates) { super(type, id, states); newGroupStates = nwGrpStates; } @@ -45,5 +114,4 @@ public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand { public void setNewGroupStates(HashMap> newGroupStates) { this.newGroupStates = newGroupStates; } - } diff --git a/core/src/com/cloud/agent/transport/Request.java b/core/src/com/cloud/agent/transport/Request.java index dea1322f6d7..c8a3e22ad73 100755 --- a/core/src/com/cloud/agent/transport/Request.java +++ b/core/src/com/cloud/agent/transport/Request.java @@ -25,11 +25,13 @@ import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; +import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; import com.cloud.agent.api.SecStorageFirewallCfgCommand; import com.cloud.agent.api.SecStorageFirewallCfgCommand.PortConfig; import com.cloud.exception.UnsupportedVersionException; import com.cloud.storage.VolumeVO; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -85,6 +87,7 @@ public class Request { final Type listType = new TypeToken>() {}.getType(); s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor()); s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new SecStorageFirewallCfgCommand.PortConfigListTypeAdaptor()); + s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new PingRoutingWithNwGroupsCommand.NwGroupsCommandTypeAdaptor()); s_logger.info("Builder inited."); } diff --git a/core/src/com/cloud/serializer/GsonHelper.java b/core/src/com/cloud/serializer/GsonHelper.java index 2b815795512..efde449c4c4 100644 --- a/core/src/com/cloud/serializer/GsonHelper.java +++ b/core/src/com/cloud/serializer/GsonHelper.java @@ -23,9 +23,11 @@ import java.util.List; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; +import com.cloud.agent.api.PingRoutingWithNwGroupsCommand; import com.cloud.agent.transport.ArrayTypeAdaptor; import com.cloud.agent.transport.VolListTypeAdaptor; import com.cloud.storage.VolumeVO; +import com.cloud.utils.Pair; import com.google.gson.GsonBuilder; import com.google.gson.reflect.TypeToken; diff --git a/utils/src/com/cloud/utils/Pair.java b/utils/src/com/cloud/utils/Pair.java index 0d06a2b30c8..994c175c495 100755 --- a/utils/src/com/cloud/utils/Pair.java +++ b/utils/src/com/cloud/utils/Pair.java @@ -21,6 +21,10 @@ public class Pair { T t; U u; + protected Pair() { + + } + public Pair(T t, U u) { this.t = t; this.u = u;