When I ran a build from latest 4.1 branch, I found an issue and I'm wondering why it is not breaking 4.1.1 builds from others, here is some of details
public class ArrayTypeAdaptor<T> implements JsonDeserializer<T[]>, JsonSerializer<T[]> { protected Gson _gson = null; private static final String s_pkg = Command.class.getPackage().getName() + "."; public ArrayTypeAdaptor() { } public void initGson(Gson gson) { _gson = gson; } @Override public JsonElement serialize(T[] src, Type typeOfSrc, JsonSerializationContext context) { JsonArray array = new JsonArray(); for (T cmd : src) { JsonObject obj = new JsonObject(); obj.add(cmd.getClass().getName().substring(s_pkg.length()), _gson.toJsonTree(cmd)); array.add(obj); } return array; } @Override @SuppressWarnings("unchecked") public T[] deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonArray array = json.getAsJsonArray(); Iterator<JsonElement> it = array.iterator(); ArrayList<T> cmds = new ArrayList<T>(); while (it.hasNext()) { JsonObject element = (JsonObject)it.next(); Map.Entry<String, JsonElement> entry = element.entrySet().iterator().next(); String name = s_pkg + entry.getKey(); Class<?> clazz; try { clazz = Class.forName(name); } catch (ClassNotFoundException e) { throw new CloudRuntimeException("can't find " + name); } T cmd = (T)_gson.fromJson(entry.getValue(), clazz); cmds.add(cmd); } Class<?> type = ((Class<?>)typeOfT).getComponentType(); T[] ts = (T[])Array.newInstance(type, cmds.size()); return cmds.toArray(ts); } } Inside ArrayTypeAdapter, it retrieves the package info from where ArrayTypeAdaatper.class locates at run time. and it assumes that all array element object classes are also from the same java package (up to the package detail path above the class name). Apparently we have relocated many of classes, for example, ArrayTypeAdatper is currently at com.cloud.agent.transport and agent cmd classes are mostly put under com.cloud.agent.api now. I'm going to remove this hard-coded assumption about the package location of ArrayTypeAdatper class and related agent command classes. Anyone has a different idea? Kelven