fix exception in PingRoutingWithNwGroupsCommand, due to no json serialize for pair<long, long>

This commit is contained in:
edison 2010-12-28 10:49:07 -08:00
parent 2d316eabb7
commit 2d722e685b
4 changed files with 80 additions and 3 deletions

View File

@ -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<String, Pair<Long, Long>> newGroupStates;
public static class NwGroupsCommandTypeAdaptor implements JsonDeserializer<Pair<Long, Long>>, JsonSerializer<Pair<Long,Long>> {
static final GsonBuilder s_gBuilder;
static {
s_gBuilder = Request.initBuilder();
}
public NwGroupsCommandTypeAdaptor() {
}
@Override
public JsonElement serialize(Pair<Long, Long> 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<Long, Long> deserialize(JsonElement json,
java.lang.reflect.Type type, JsonDeserializationContext context)
throws JsonParseException {
Pair<Long, Long> pairs = new Pair<Long, Long>(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<String, State> states, HashMap<String, Pair<Long, Long>> nwGrpStates) {
public PingRoutingWithNwGroupsCommand(Host.Type type, long id, Map<String, State> states, HashMap<String, Pair<Long, Long>> nwGrpStates) {
super(type, id, states);
newGroupStates = nwGrpStates;
}
@ -45,5 +114,4 @@ public class PingRoutingWithNwGroupsCommand extends PingRoutingCommand {
public void setNewGroupStates(HashMap<String, Pair<Long, Long>> newGroupStates) {
this.newGroupStates = newGroupStates;
}
}

View File

@ -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<List<VolumeVO>>() {}.getType();
s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor());
s_gBuilder.registerTypeAdapter(new TypeToken<List<PortConfig>>() {}.getType(), new SecStorageFirewallCfgCommand.PortConfigListTypeAdaptor());
s_gBuilder.registerTypeAdapter(new TypeToken<Pair<Long, Long>>() {}.getType(), new PingRoutingWithNwGroupsCommand.NwGroupsCommandTypeAdaptor());
s_logger.info("Builder inited.");
}

View File

@ -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;

View File

@ -21,6 +21,10 @@ public class Pair<T, U> {
T t;
U u;
protected Pair() {
}
public Pair(T t, U u) {
this.t = t;
this.u = u;