From 4a73639d67250154daa704525bed15478c1c2a5a Mon Sep 17 00:00:00 2001 From: Kris McQueen Date: Fri, 17 Sep 2010 14:56:55 -0700 Subject: [PATCH] Fix up setting the response object correctly after dispatching the api method call. Begin working on the serialization of the responses which don't include the command name just yet, that's coming. --- core/src/com/cloud/async/AsyncJobResult.java | 2 +- core/src/com/cloud/serializer/SerializerHelper.java | 12 +++++++++++- server/src/com/cloud/api/ApiDispatcher.java | 11 ++++++++--- server/src/com/cloud/api/BaseAsyncCmd.java | 1 + server/src/com/cloud/async/AsyncJobManagerImpl.java | 7 +++++-- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/core/src/com/cloud/async/AsyncJobResult.java b/core/src/com/cloud/async/AsyncJobResult.java index 43035ab10ac..2056b7552ff 100644 --- a/core/src/com/cloud/async/AsyncJobResult.java +++ b/core/src/com/cloud/async/AsyncJobResult.java @@ -93,7 +93,7 @@ public class AsyncJobResult { } public void setResultObject(Object result) { - this.result = SerializerHelper.toSerializedString(result); + this.result = SerializerHelper.toSerializedStringOld(result); } public String toString() { diff --git a/core/src/com/cloud/serializer/SerializerHelper.java b/core/src/com/cloud/serializer/SerializerHelper.java index a66303b1894..f26dc2466e4 100644 --- a/core/src/com/cloud/serializer/SerializerHelper.java +++ b/core/src/com/cloud/serializer/SerializerHelper.java @@ -38,7 +38,7 @@ import com.google.gson.Gson; public class SerializerHelper { public static final Logger s_logger = Logger.getLogger(SerializerHelper.class.getName()); - public static String toSerializedString(Object result) { + public static String toSerializedStringOld(Object result) { if(result != null) { Class clz = result.getClass(); Gson gson = GsonHelper.getBuilder().create(); @@ -47,6 +47,16 @@ public class SerializerHelper { } return null; } + + // FIXME: what about XML response? + public static String toSerializedString(Object result) { + if (result != null) { + Gson gson = GsonHelper.getBuilder().create(); + + return gson.toJson(result); + } + return null; + } public static Object fromSerializedString(String result) { try { diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 45936301551..282cdad36ce 100644 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -102,8 +102,12 @@ public class ApiDispatcher { try { Method method = mgr.getClass().getMethod(methodName, cmd.getClass()); - method.invoke(mgr, cmd); - return cmd.getId(); + Object dbObject = method.invoke(mgr, cmd); + + Method getIdMethod = dbObject.getClass().getMethod("getId"); + Object id = getIdMethod.invoke(dbObject); + + return (Long)id; } catch (NoSuchMethodException nsme) { s_logger.warn("Exception executing method " + methodName + " for command " + cmd.getClass().getSimpleName(), nsme); throw new CloudRuntimeException("Unable to execute method " + methodName + " for command " + cmd.getClass().getSimpleName() + ", unable to find implementation."); @@ -148,7 +152,8 @@ public class ApiDispatcher { try { Method method = mgr.getClass().getMethod(methodName, cmd.getClass()); - method.invoke(mgr, cmd); + Object result = method.invoke(mgr, cmd); + cmd.setResponseObject(result); } catch (NoSuchMethodException nsme) { s_logger.warn("Exception executing method " + methodName + " for command " + cmd.getClass().getSimpleName(), nsme); throw new CloudRuntimeException("Unable to execute method " + methodName + " for command " + cmd.getClass().getSimpleName() + ", unable to find implementation."); diff --git a/server/src/com/cloud/api/BaseAsyncCmd.java b/server/src/com/cloud/api/BaseAsyncCmd.java index d65bd4d1eaa..2baaf898a6e 100644 --- a/server/src/com/cloud/api/BaseAsyncCmd.java +++ b/server/src/com/cloud/api/BaseAsyncCmd.java @@ -16,6 +16,7 @@ public abstract class BaseAsyncCmd extends BaseCmd { private Long startEventId; public String getResponse(long jobId) { + // FIXME: We need a generic response object here, see BaseAsyncCreateCmd return SerializerHelper.toSerializedString(Long.valueOf(jobId)); } diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index 22ce5de66cd..6d1f889c893 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -151,8 +151,11 @@ public class AsyncJobManagerImpl implements AsyncJobManager { job.setInstanceId(null); // FIXME: do we need to re-serialize here? - if(resultObject != null) - job.setResult(SerializerHelper.toSerializedString(resultObject)); + if (resultObject != null) { +// job.setResult(SerializerHelper.toSerializedString(resultObject)); + job.setResult((String)resultObject); + } + job.setLastUpdated(DateUtil.currentGMTTime()); _jobDao.update(jobId, job); txt.commit();