diff --git a/api/src/com/cloud/agent/api/Command.java b/api/src/com/cloud/agent/api/Command.java index 36944f4f01b..401b23d50f8 100755 --- a/api/src/com/cloud/agent/api/Command.java +++ b/api/src/com/cloud/agent/api/Command.java @@ -56,4 +56,9 @@ public abstract class Command { public String getContextParam(String name) { return contextMap.get(name); } + + public boolean doesCommandUseExposeAnnotation(){ + return false; + } + } diff --git a/api/src/com/cloud/agent/api/ModifySshKeysCommand.java b/api/src/com/cloud/agent/api/ModifySshKeysCommand.java index 3e10897af63..1e7dc672615 100644 --- a/api/src/com/cloud/agent/api/ModifySshKeysCommand.java +++ b/api/src/com/cloud/agent/api/ModifySshKeysCommand.java @@ -18,9 +18,11 @@ package com.cloud.agent.api; +import com.google.gson.annotations.Expose; + public class ModifySshKeysCommand extends Command { - private String _pubKey; - private String _prvKey; + @Expose(serialize = false, deserialize = false) private String _pubKey; + @Expose(serialize = false, deserialize = false) private String _prvKey; public ModifySshKeysCommand() { } @@ -39,5 +41,11 @@ public class ModifySshKeysCommand extends Command { // TODO Auto-generated method stub return false; } + + @Override + public boolean doesCommandUseExposeAnnotation(){ + return true; + } + } diff --git a/core/src/com/cloud/agent/transport/ArrayTypeAdaptor.java b/core/src/com/cloud/agent/transport/ArrayTypeAdaptor.java index 40c6bf8bb25..d382a888332 100755 --- a/core/src/com/cloud/agent/transport/ArrayTypeAdaptor.java +++ b/core/src/com/cloud/agent/transport/ArrayTypeAdaptor.java @@ -40,10 +40,10 @@ import com.google.gson.JsonSerializer; public class ArrayTypeAdaptor implements JsonDeserializer, JsonSerializer { static final GsonBuilder s_gBuilder; + static final GsonBuilder s_exposeAnnotationBuilder; static { s_gBuilder = Request.initBuilder(); -// final Type listType = new TypeToken>() {}.getType(); -// s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor()); + s_exposeAnnotationBuilder = Request.initBuilderWithExposeAnnotation(); } @@ -56,6 +56,12 @@ public class ArrayTypeAdaptor implements JsonDeserializer, JsonSerialize Gson gson = s_gBuilder.create(); JsonArray array = new JsonArray(); for (T cmd : src) { + if(typeOfSrc.getClass().isInstance(Command.class)){ + Command innercmd = (Command)cmd; + if(innercmd.doesCommandUseExposeAnnotation()){ + gson = s_exposeAnnotationBuilder.create(); + } + } JsonObject obj = new JsonObject(); obj.add(cmd.getClass().getName().substring(s_pkg.length()), gson.toJsonTree(cmd)); array.add(obj); diff --git a/core/src/com/cloud/agent/transport/Request.java b/core/src/com/cloud/agent/transport/Request.java index eb8cf304041..9f26dbedb4a 100755 --- a/core/src/com/cloud/agent/transport/Request.java +++ b/core/src/com/cloud/agent/transport/Request.java @@ -32,6 +32,8 @@ import com.cloud.exception.UnsupportedVersionException; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.exception.CloudRuntimeException; +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; @@ -88,20 +90,33 @@ public class Request { protected static final short FLAG_CONTROL = 0x40; protected static final GsonBuilder s_gBuilder; + protected static final GsonBuilder s_exposeAnnotationBuilder; + static { s_gBuilder = new GsonBuilder(); - s_gBuilder.registerTypeAdapter(Command[].class, new ArrayTypeAdaptor()); - s_gBuilder.registerTypeAdapter(Answer[].class, new ArrayTypeAdaptor()); -// final Type listType = new TypeToken>() {}.getType(); -// s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor()); - s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new PortConfigListTypeAdaptor()); - s_gBuilder.registerTypeAdapter(new TypeToken>() {}.getType(), new NwGroupsCommandTypeAdaptor()); - s_logger.info("Builder inited."); + setDefaultGsonConfig(s_gBuilder); + s_logger.info("Default Builder inited."); + + s_exposeAnnotationBuilder = new GsonBuilder(); + setDefaultGsonConfig(s_exposeAnnotationBuilder); + s_exposeAnnotationBuilder.excludeFieldsWithoutExposeAnnotation(); + s_logger.info("Expose annotation Builder inited."); + } + + public static void setDefaultGsonConfig(GsonBuilder builder){ + builder.registerTypeAdapter(Command[].class, new ArrayTypeAdaptor()); + builder.registerTypeAdapter(Answer[].class, new ArrayTypeAdaptor()); + builder.registerTypeAdapter(new TypeToken>() {}.getType(), new PortConfigListTypeAdaptor()); + builder.registerTypeAdapter(new TypeToken>() {}.getType(), new NwGroupsCommandTypeAdaptor()); } public static GsonBuilder initBuilder() { return s_gBuilder; } + + public static GsonBuilder initBuilderWithExposeAnnotation() { + return s_exposeAnnotationBuilder; + } protected Version _ver; protected long _seq; @@ -240,7 +255,7 @@ public class Request { public String toString() { String content = _content; if (content == null) { - final Gson gson = s_gBuilder.create(); + final Gson gson = s_gBuilder.create(); try { content = gson.toJson(_cmds); } catch(Throwable e) { @@ -330,7 +345,7 @@ public class Request { s_logger.trace(buf.toString()); } } - + /** * Factory method for Request and Response. It expects the bytes to be * correctly formed so it's possible that it throws underflow exceptions