diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in
index 1c98346e1db..80f380b4885 100644
--- a/client/tomcatconf/applicationContext.xml.in
+++ b/client/tomcatconf/applicationContext.xml.in
@@ -809,10 +809,10 @@
-
+
-
+
diff --git a/core/src/com/cloud/serializer/SerializerHelper.java b/core/src/com/cloud/serializer/SerializerHelper.java
deleted file mode 100644
index e3449f6e443..00000000000
--- a/core/src/com/cloud/serializer/SerializerHelper.java
+++ /dev/null
@@ -1,233 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements. See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership. The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License. You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied. See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.serializer;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.log4j.Logger;
-
-import com.cloud.utils.DateUtil;
-import com.cloud.utils.Pair;
-import com.google.gson.Gson;
-
-/**
- * Note: toPairList and appendPairList only support simple POJO objects currently
- */
-public class SerializerHelper {
- public static final Logger s_logger = Logger.getLogger(SerializerHelper.class.getName());
- public static String token = "/";
-
- public static String toSerializedString(Object result) {
- if(result != null) {
- Class> clz = result.getClass();
- Gson gson = GsonHelper.getGson();
- return clz.getName() + token + gson.toJson(result);
- }
- return null;
- }
-
- public static Object fromSerializedString(String result) {
- try {
- if(result != null && !result.isEmpty()) {
-
- String[] serializedParts = result.split(token);
-
- if (serializedParts.length < 2) {
- return null;
- }
- String clzName = serializedParts[0];
- String nameField = null;
- String content = null;
- if (serializedParts.length == 2) {
- content = serializedParts[1];
- } else {
- nameField = serializedParts[1];
- int index = result.indexOf(token + nameField + token);
- content = result.substring(index + nameField.length() + 2);
- }
-
- Class> clz;
- try {
- clz = Class.forName(clzName);
- } catch (ClassNotFoundException e) {
- return null;
- }
-
- Gson gson = GsonHelper.getGson();
- Object obj = gson.fromJson(content, clz);
- return obj;
- }
- return null;
- } catch(RuntimeException e) {
- s_logger.error("Caught runtime exception when doing GSON deserialization on: " + result);
- throw e;
- }
- }
-
- public static String toObjectSerializedString(Serializable object) {
- assert(object != null);
-
- ByteArrayOutputStream bs = new ByteArrayOutputStream();
- try {
- ObjectOutputStream os = new ObjectOutputStream(bs);
- os.writeObject(object);
- os.close();
- bs.close();
-
- return Base64.encodeBase64URLSafeString(bs.toByteArray());
- } catch(IOException e) {
- s_logger.error("Unexpected exception", e);
- }
- return null;
- }
-
- public static Object fromObjectSerializedString(String base64EncodedString) {
- if(base64EncodedString == null)
- return null;
-
- byte[] content = Base64.decodeBase64(base64EncodedString);
- ByteArrayInputStream bs = new ByteArrayInputStream(content);
- try {
- ObjectInputStream is = new ObjectInputStream(bs);
- Object obj = is.readObject();
- is.close();
- bs.close();
- return obj;
- } catch(IOException e) {
- s_logger.error("Unexpected exception", e);
- } catch(ClassNotFoundException e) {
- s_logger.error("Unexpected exception", e);
- }
-
- return null;
- }
-
- public static List> toPairList(Object o, String name) {
- List> l = new ArrayList>();
- return appendPairList(l, o, name);
- }
-
- public static List> appendPairList(List> l, Object o, String name) {
- if(o != null) {
- Class> clz = o.getClass();
-
- if(clz.isPrimitive() || clz.getSuperclass() == Number.class || clz == String.class || clz == Date.class) {
- l.add(new Pair(name, o.toString()));
- return l;
- }
-
- for(Field f : clz.getDeclaredFields()) {
- if((f.getModifiers() & Modifier.STATIC) != 0) {
- continue;
- }
-
- Param param = f.getAnnotation(Param.class);
- if(param == null) {
- continue;
- }
-
- String propName = f.getName();
- if(!param.propName().isEmpty()) {
- propName = param.propName();
- }
-
- String paramName = param.name();
- if(paramName.isEmpty()) {
- paramName = propName;
- }
-
- Method method = getGetMethod(o, propName);
- if(method != null) {
- try {
- Object fieldValue = method.invoke(o);
- if(fieldValue != null) {
- if (f.getType() == Date.class) {
- l.add(new Pair(paramName, DateUtil.getOutputString((Date)fieldValue)));
- } else {
- l.add(new Pair(paramName, fieldValue.toString()));
- }
- }
- //else
- // l.add(new Pair(paramName, ""));
- } catch (IllegalArgumentException e) {
- s_logger.error("Illegal argument exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
-
- } catch (IllegalAccessException e) {
- s_logger.error("Illegal access exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
- } catch (InvocationTargetException e) {
- s_logger.error("Invocation target exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
- }
- }
- }
- }
- return l;
- }
-
- private static Method getGetMethod(Object o, String propName) {
- Method method = null;
- String methodName = getGetMethodName("get", propName);
- try {
- method = o.getClass().getMethod(methodName);
- } catch (SecurityException e1) {
- s_logger.error("Security exception in getting POJO " + o.getClass().getName() + " get method for property: " + propName);
- } catch (NoSuchMethodException e1) {
- if(s_logger.isTraceEnabled()) {
- s_logger.trace("POJO " + o.getClass().getName() + " does not have " + methodName + "() method for property: " + propName + ", will check is-prefixed method to see if it is boolean property");
- }
- }
-
- if(method != null) {
- return method;
- }
-
- methodName = getGetMethodName("is", propName);
- try {
- method = o.getClass().getMethod(methodName);
- } catch (SecurityException e1) {
- s_logger.error("Security exception in getting POJO " + o.getClass().getName() + " get method for property: " + propName);
- } catch (NoSuchMethodException e1) {
- s_logger.warn("POJO " + o.getClass().getName() + " does not have " + methodName + "() method for property: " + propName);
- }
- return method;
- }
-
- private static String getGetMethodName(String prefix, String fieldName) {
- StringBuffer sb = new StringBuffer(prefix);
-
- if(fieldName.length() >= prefix.length() && fieldName.substring(0, prefix.length()).equals(prefix)) {
- return fieldName;
- } else {
- sb.append(fieldName.substring(0, 1).toUpperCase());
- sb.append(fieldName.substring(1));
- }
-
- return sb.toString();
- }
-}
diff --git a/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java b/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java
index bdf8301c7a7..f4dd3959b37 100644
--- a/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java
+++ b/engine/schema/src/org/apache/cloudstack/vm/jobs/VmWorkJobVO.java
@@ -24,7 +24,7 @@ import javax.persistence.Enumerated;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.Type;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
index 7a898e86d1f..92c89ee59fb 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
@@ -18,6 +18,7 @@ package org.apache.cloudstack.framework.jobs;
import java.util.Date;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItem;
import org.apache.cloudstack.jobs.Job;
public interface AsyncJob extends Job {
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
index 86e48ed43ae..66c56e21a6b 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobManager.java
@@ -19,6 +19,7 @@ package org.apache.cloudstack.framework.jobs;
import java.util.List;
import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import com.cloud.utils.Predicate;
import com.cloud.utils.component.Manager;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java
index 4c442c89780..cfcd173a780 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDao.java
@@ -19,7 +19,7 @@ package org.apache.cloudstack.framework.jobs.dao;
import java.util.Date;
import java.util.List;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
index 276323c3cc6..c30dbde0ff0 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
@@ -24,7 +24,7 @@ import java.util.List;
import org.apache.log4j.Logger;
import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Filter;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDao.java
index acf132403ee..a9e82a74715 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDao.java
@@ -18,7 +18,7 @@ package org.apache.cloudstack.framework.jobs.dao;
import java.util.List;
-import org.apache.cloudstack.framework.jobs.AsyncJobJoinMapVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJoinMapVO;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
index 0b4195334a8..4cc2218896a 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
@@ -27,7 +27,7 @@ import java.util.TimeZone;
import org.apache.log4j.Logger;
import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
-import org.apache.cloudstack.framework.jobs.AsyncJobJoinMapVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJoinMapVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDao.java
index e8d8287f112..fb6a2421ba4 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDao.java
@@ -18,7 +18,7 @@ package org.apache.cloudstack.framework.jobs.dao;
import java.util.List;
-import org.apache.cloudstack.framework.jobs.AsyncJobJournalVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJournalVO;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDaoImpl.java
index 9d023071108..d26e6ed63ed 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJournalDaoImpl.java
@@ -18,7 +18,7 @@ package org.apache.cloudstack.framework.jobs.dao;
import java.util.List;
-import org.apache.cloudstack.framework.jobs.AsyncJobJournalVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJournalVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDao.java
index f45245aa4ac..fa617adbf62 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDao.java
@@ -16,7 +16,7 @@
// under the License.
package org.apache.cloudstack.framework.jobs.dao;
-import org.apache.cloudstack.framework.jobs.SyncQueueVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueVO;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
index 05e2a732fcb..f7d9d72dc0b 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
@@ -24,7 +24,7 @@ import java.util.TimeZone;
import org.apache.log4j.Logger;
-import org.apache.cloudstack.framework.jobs.SyncQueueVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
index b78ccf7fe83..61670bf7043 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
@@ -18,7 +18,7 @@ package org.apache.cloudstack.framework.jobs.dao;
import java.util.List;
-import org.apache.cloudstack.framework.jobs.SyncQueueItemVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItemVO;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
index 08b777cc78e..ccb7f103742 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
@@ -27,7 +27,7 @@ import java.util.TimeZone;
import org.apache.log4j.Logger;
-import org.apache.cloudstack.framework.jobs.SyncQueueItemVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItemVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.DB;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJoinMapVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJoinMapVO.java
similarity index 98%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJoinMapVO.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJoinMapVO.java
index 56eddf9858b..0bcdc3bd43e 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJoinMapVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJoinMapVO.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.Date;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJournalVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJournalVO.java
similarity index 94%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJournalVO.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJournalVO.java
index 8cb5078ed47..b78a7e02254 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobJournalVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobJournalVO.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.Date;
@@ -27,6 +27,9 @@ import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.framework.jobs.AsyncJob.JournalType;
+
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDao;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMBeanImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMBeanImpl.java
similarity index 93%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMBeanImpl.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMBeanImpl.java
index e420a9032e3..95f01e51b3c 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMBeanImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMBeanImpl.java
@@ -14,13 +14,17 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.Date;
import java.util.TimeZone;
import javax.management.StandardMBean;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
+import org.apache.cloudstack.framework.jobs.AsyncJobMBean;
+
import com.cloud.utils.DateUtil;
public class AsyncJobMBeanImpl extends StandardMBean implements AsyncJobMBean {
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMonitor.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
similarity index 95%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMonitor.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
index ed2c9430f07..7a11195f467 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobMonitor.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobMonitor.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.HashMap;
import java.util.Map;
@@ -26,6 +26,9 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
+import org.apache.cloudstack.framework.jobs.AsyncJob.Topics;
import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
import org.apache.cloudstack.framework.messagebus.MessageHandler;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
similarity index 98%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobVO.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
index 9c9001ab552..f2ea4accf9a 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.Date;
import java.util.UUID;
@@ -33,6 +33,7 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.jobs.Job;
import com.cloud.utils.UuidUtils;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
new file mode 100644
index 00000000000..17dd1ccc276
--- /dev/null
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java
@@ -0,0 +1,127 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.framework.jobs.impl;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.log4j.Logger;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+/**
+ * Note: toPairList and appendPairList only support simple POJO objects currently
+ */
+public class JobSerializerHelper {
+ private static final Logger s_logger = Logger.getLogger(JobSerializerHelper.class);
+ public static String token = "/";
+
+ private static Gson s_gson;
+ static {
+ GsonBuilder gsonBuilder = new GsonBuilder();
+ gsonBuilder.setVersion(1.5);
+ s_logger.debug("Job GSON Builder initialized.");
+ s_gson = gsonBuilder.create();
+ }
+
+ public static String toSerializedString(Object result) {
+ if(result != null) {
+ Class> clz = result.getClass();
+ return clz.getName() + token + s_gson.toJson(result);
+ }
+ return null;
+ }
+
+ public static Object fromSerializedString(String result) {
+ try {
+ if(result != null && !result.isEmpty()) {
+
+ String[] serializedParts = result.split(token);
+
+ if (serializedParts.length < 2) {
+ return null;
+ }
+ String clzName = serializedParts[0];
+ String nameField = null;
+ String content = null;
+ if (serializedParts.length == 2) {
+ content = serializedParts[1];
+ } else {
+ nameField = serializedParts[1];
+ int index = result.indexOf(token + nameField + token);
+ content = result.substring(index + nameField.length() + 2);
+ }
+
+ Class> clz;
+ try {
+ clz = Class.forName(clzName);
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+
+ Object obj = s_gson.fromJson(content, clz);
+ return obj;
+ }
+ return null;
+ } catch(RuntimeException e) {
+ throw new CloudRuntimeException("Unable to deserialize: " + result, e);
+ }
+ }
+
+ public static String toObjectSerializedString(Serializable object) {
+ assert(object != null);
+
+ ByteArrayOutputStream bs = new ByteArrayOutputStream();
+ try {
+ ObjectOutputStream os = new ObjectOutputStream(bs);
+ os.writeObject(object);
+ os.close();
+ bs.close();
+
+ return Base64.encodeBase64URLSafeString(bs.toByteArray());
+ } catch(IOException e) {
+ throw new CloudRuntimeException("Unable to serialize: " + object, e);
+ }
+ }
+
+ public static Object fromObjectSerializedString(String base64EncodedString) {
+ if(base64EncodedString == null)
+ return null;
+
+ byte[] content = Base64.decodeBase64(base64EncodedString);
+ ByteArrayInputStream bs = new ByteArrayInputStream(content);
+ try {
+ ObjectInputStream is = new ObjectInputStream(bs);
+ Object obj = is.readObject();
+ is.close();
+ bs.close();
+ return obj;
+ } catch(IOException e) {
+ throw new CloudRuntimeException("Unable to serialize: " + base64EncodedString, e);
+ } catch (ClassNotFoundException e) {
+ throw new CloudRuntimeException("Unable to serialize: " + base64EncodedString, e);
+ }
+ }
+}
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItem.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItem.java
similarity index 96%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItem.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItem.java
index 43aa0f63e18..04519e70a5d 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItem.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItem.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
public interface SyncQueueItem {
public final String AsyncJobContentType = "AsyncJob";
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItemVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItemVO.java
similarity index 98%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItemVO.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItemVO.java
index 7a5d15fb47f..f8bba0262ff 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueItemVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueItemVO.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import org.apache.cloudstack.api.InternalIdentity;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManager.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManager.java
similarity index 96%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManager.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManager.java
index f0516c8b529..202a704ee36 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManager.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManager.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.List;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
similarity index 99%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManagerImpl.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index 7c57076cd8a..b9b5d6bdabd 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -14,7 +14,7 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import java.util.ArrayList;
import java.util.Date;
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueVO.java
similarity index 98%
rename from framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueVO.java
rename to framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueVO.java
index cad34628ab9..4fd4740c8aa 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/SyncQueueVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueVO.java
@@ -15,7 +15,7 @@
// specific language governing permissions and limitations
// under the License.
-package org.apache.cloudstack.framework.jobs;
+package org.apache.cloudstack.framework.jobs.impl;
import org.apache.cloudstack.api.InternalIdentity;
diff --git a/server/src/com/cloud/api/ApiGsonHelper.java b/server/src/com/cloud/api/ApiGsonHelper.java
index 6163860f0c8..c24808b833d 100644
--- a/server/src/com/cloud/api/ApiGsonHelper.java
+++ b/server/src/com/cloud/api/ApiGsonHelper.java
@@ -16,12 +16,27 @@
// under the License.
package com.cloud.api;
-import com.google.gson.GsonBuilder;
-import org.apache.cloudstack.api.ResponseObject;
-
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
import java.util.Map;
+import org.apache.log4j.Logger;
+
+import com.google.gson.GsonBuilder;
+
+import org.apache.cloudstack.api.ResponseObject;
+
+import com.cloud.serializer.Param;
+import com.cloud.utils.DateUtil;
+import com.cloud.utils.Pair;
+
public class ApiGsonHelper {
+ private static final Logger s_logger = Logger.getLogger(ApiGsonHelper.class);
private static final GsonBuilder s_gBuilder;
static {
s_gBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
@@ -33,4 +48,107 @@ public class ApiGsonHelper {
public static GsonBuilder getBuilder() {
return s_gBuilder;
}
+
+ public static List> toPairList(Object o, String name) {
+ List> l = new ArrayList>();
+ return appendPairList(l, o, name);
+ }
+
+ public static List> appendPairList(List> l, Object o, String name) {
+ if (o != null) {
+ Class> clz = o.getClass();
+
+ if (clz.isPrimitive() || clz.getSuperclass() == Number.class || clz == String.class || clz == Date.class) {
+ l.add(new Pair(name, o.toString()));
+ return l;
+ }
+
+ for (Field f : clz.getDeclaredFields()) {
+ if ((f.getModifiers() & Modifier.STATIC) != 0) {
+ continue;
+ }
+
+ Param param = f.getAnnotation(Param.class);
+ if (param == null) {
+ continue;
+ }
+
+ String propName = f.getName();
+ if (!param.propName().isEmpty()) {
+ propName = param.propName();
+ }
+
+ String paramName = param.name();
+ if (paramName.isEmpty()) {
+ paramName = propName;
+ }
+
+ Method method = getGetMethod(o, propName);
+ if (method != null) {
+ try {
+ Object fieldValue = method.invoke(o);
+ if (fieldValue != null) {
+ if (f.getType() == Date.class) {
+ l.add(new Pair(paramName, DateUtil.getOutputString((Date)fieldValue)));
+ } else {
+ l.add(new Pair(paramName, fieldValue.toString()));
+ }
+ }
+ //else
+ // l.add(new Pair(paramName, ""));
+ } catch (IllegalArgumentException e) {
+ s_logger.error("Illegal argument exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
+
+ } catch (IllegalAccessException e) {
+ s_logger.error("Illegal access exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
+ } catch (InvocationTargetException e) {
+ s_logger.error("Invocation target exception when calling POJO " + o.getClass().getName() + " get method for property: " + propName);
+ }
+ }
+ }
+ }
+ return l;
+ }
+
+ private static Method getGetMethod(Object o, String propName) {
+ Method method = null;
+ String methodName = getGetMethodName("get", propName);
+ try {
+ method = o.getClass().getMethod(methodName);
+ } catch (SecurityException e1) {
+ s_logger.error("Security exception in getting POJO " + o.getClass().getName() + " get method for property: " + propName);
+ } catch (NoSuchMethodException e1) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("POJO " + o.getClass().getName() + " does not have " + methodName + "() method for property: " + propName
+ + ", will check is-prefixed method to see if it is boolean property");
+ }
+ }
+
+ if (method != null) {
+ return method;
+ }
+
+ methodName = getGetMethodName("is", propName);
+ try {
+ method = o.getClass().getMethod(methodName);
+ } catch (SecurityException e1) {
+ s_logger.error("Security exception in getting POJO " + o.getClass().getName() + " get method for property: " + propName);
+ } catch (NoSuchMethodException e1) {
+ s_logger.warn("POJO " + o.getClass().getName() + " does not have " + methodName + "() method for property: " + propName);
+ }
+ return method;
+ }
+
+ private static String getGetMethodName(String prefix, String fieldName) {
+ StringBuffer sb = new StringBuffer(prefix);
+
+ if (fieldName.length() >= prefix.length() && fieldName.substring(0, prefix.length()).equals(prefix)) {
+ return fieldName;
+ } else {
+ sb.append(fieldName.substring(0, 1).toUpperCase());
+ sb.append(fieldName.substring(1));
+ }
+
+ return sb.toString();
+ }
}
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index 175c8b823c9..4db9bb8dbd0 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -116,7 +116,7 @@ import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import org.apache.cloudstack.region.RegionManager;
import com.cloud.api.response.ApiResponseSerializer;
diff --git a/server/src/com/cloud/async/AsyncJobExecutionContext.java b/server/src/com/cloud/async/AsyncJobExecutionContext.java
index e6efd030930..9ca38a9c4cd 100644
--- a/server/src/com/cloud/async/AsyncJobExecutionContext.java
+++ b/server/src/com/cloud/async/AsyncJobExecutionContext.java
@@ -20,15 +20,15 @@ import javax.inject.Inject;
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
-import org.apache.cloudstack.framework.jobs.AsyncJobJoinMapVO;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.SyncQueueItem;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobJoinMapDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJoinMapVO;
+import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItem;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.serializer.SerializerHelper;
import com.cloud.utils.component.ComponentContext;
public class AsyncJobExecutionContext {
@@ -109,7 +109,7 @@ public class AsyncJobExecutionContext {
AsyncJobJoinMapVO record = _joinMapDao.getJoinRecord(_job.getId(), joinedJobId);
if(record.getJoinStatus() == AsyncJobConstants.STATUS_FAILED && record.getJoinResult() != null) {
- Object exception = SerializerHelper.fromObjectSerializedString(record.getJoinResult());
+ Object exception = JobSerializerHelper.fromObjectSerializedString(record.getJoinResult());
if(exception != null && exception instanceof Exception) {
if(exception instanceof InsufficientCapacityException)
throw (InsufficientCapacityException)exception;
diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java
index 42cbae86853..f147bb089ab 100644
--- a/server/src/com/cloud/async/AsyncJobManagerImpl.java
+++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java
@@ -43,19 +43,19 @@ import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher;
-import org.apache.cloudstack.framework.jobs.AsyncJobJoinMapVO;
-import org.apache.cloudstack.framework.jobs.AsyncJobJournalVO;
-import org.apache.cloudstack.framework.jobs.AsyncJobMBeanImpl;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.AsyncJobMonitor;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
-import org.apache.cloudstack.framework.jobs.SyncQueueItem;
-import org.apache.cloudstack.framework.jobs.SyncQueueItemVO;
-import org.apache.cloudstack.framework.jobs.SyncQueueManager;
-import org.apache.cloudstack.framework.jobs.SyncQueueVO;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobDao;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobJoinMapDao;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobJournalDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJoinMapVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJournalVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobMBeanImpl;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobMonitor;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItem;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueItemVO;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueManager;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueVO;
import org.apache.cloudstack.framework.messagebus.MessageBus;
import org.apache.cloudstack.framework.messagebus.MessageDetector;
import org.apache.cloudstack.framework.messagebus.PublishScope;
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
index edc4216b024..32d1c19f98e 100644
--- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
@@ -35,8 +35,8 @@ import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.jobs.AsyncJobConstants;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import com.cloud.api.ApiDispatcher;
import com.cloud.api.ApiGsonHelper;
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index c811b5e0fa1..3317fa129b1 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -68,7 +68,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
import org.apache.cloudstack.framework.async.AsyncCallFuture;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.log4j.Logger;
diff --git a/server/src/com/cloud/vm/VmWorkJobWakeupDispatcher.java b/server/src/com/cloud/vm/VmWorkJobWakeupDispatcher.java
index a5eceec5e67..8109128d1b9 100644
--- a/server/src/com/cloud/vm/VmWorkJobWakeupDispatcher.java
+++ b/server/src/com/cloud/vm/VmWorkJobWakeupDispatcher.java
@@ -29,8 +29,8 @@ import org.apache.log4j.Logger;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher;
-import org.apache.cloudstack.framework.jobs.AsyncJobJoinMapVO;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobJoinMapDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobJoinMapVO;
import org.apache.cloudstack.vm.jobs.VmWorkJobDao;
import org.apache.cloudstack.vm.jobs.VmWorkJobVO;
diff --git a/server/test/com/cloud/vm/VmWorkTest.java b/server/test/com/cloud/vm/VmWorkTest.java
index 3cb78da0f6b..d236cc367de 100644
--- a/server/test/com/cloud/vm/VmWorkTest.java
+++ b/server/test/com/cloud/vm/VmWorkTest.java
@@ -41,7 +41,6 @@ import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientStorageCapacityException;
-import com.cloud.serializer.SerializerHelper;
import com.cloud.utils.LogUtils;
import com.cloud.utils.Predicate;
import com.cloud.utils.component.ComponentContext;
@@ -49,7 +48,8 @@ import com.cloud.utils.db.Transaction;
import com.google.gson.Gson;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper;
import org.apache.cloudstack.vm.jobs.VmWorkJobDao;
import org.apache.cloudstack.vm.jobs.VmWorkJobVO;
import org.apache.cloudstack.vm.jobs.VmWorkJobVO.Step;
@@ -167,10 +167,10 @@ public class VmWorkTest extends TestCase {
public void testExceptionSerialization() {
InsufficientCapacityException exception = new InsufficientStorageCapacityException("foo", VmWorkJobVO.class, 1L);
- String encodedString = SerializerHelper.toObjectSerializedString(exception);
+ String encodedString = JobSerializerHelper.toObjectSerializedString(exception);
System.out.println(encodedString);
- exception = (InsufficientCapacityException)SerializerHelper.fromObjectSerializedString(encodedString);
+ exception = (InsufficientCapacityException)JobSerializerHelper.fromObjectSerializedString(encodedString);
Assert.assertTrue(exception.getScope() == VmWorkJobVO.class);
Assert.assertTrue(exception.getMessage().equals("foo"));
}
diff --git a/server/test/com/cloud/vm/VmWorkTestConfiguration.java b/server/test/com/cloud/vm/VmWorkTestConfiguration.java
index b436b1607ee..cd0dc2ceac1 100644
--- a/server/test/com/cloud/vm/VmWorkTestConfiguration.java
+++ b/server/test/com/cloud/vm/VmWorkTestConfiguration.java
@@ -20,9 +20,6 @@ import org.mockito.Mockito;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.apache.cloudstack.framework.jobs.AsyncJobMonitor;
-import org.apache.cloudstack.framework.jobs.SyncQueueManager;
-import org.apache.cloudstack.framework.jobs.SyncQueueManagerImpl;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobDao;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobDaoImpl;
import org.apache.cloudstack.framework.jobs.dao.AsyncJobJoinMapDao;
@@ -33,6 +30,9 @@ import org.apache.cloudstack.framework.jobs.dao.SyncQueueDao;
import org.apache.cloudstack.framework.jobs.dao.SyncQueueDaoImpl;
import org.apache.cloudstack.framework.jobs.dao.SyncQueueItemDao;
import org.apache.cloudstack.framework.jobs.dao.SyncQueueItemDaoImpl;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobMonitor;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueManager;
+import org.apache.cloudstack.framework.jobs.impl.SyncQueueManagerImpl;
import org.apache.cloudstack.vm.jobs.VmWorkJobDao;
import org.apache.cloudstack.vm.jobs.VmWorkJobDaoImpl;
diff --git a/utils/pom.xml b/utils/pom.xml
index 0690c35c57b..878e91d0436 100644
--- a/utils/pom.xml
+++ b/utils/pom.xml
@@ -63,6 +63,11 @@
commons-codec
${cs.codec.version}
+
+ com.google.code.gson
+ gson
+ ${cs.gson.version}
+
commons-collections
commons-collections