From dd11254087fbe2a46bb7a09467ab124f48204849 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Tue, 4 Jun 2013 13:54:33 -0700 Subject: [PATCH] further refactored jobs --- client/tomcatconf/applicationContext.xml.in | 4 +- .../cloud/serializer/SerializerHelper.java | 233 ------------------ .../cloudstack/vm/jobs/VmWorkJobVO.java | 2 +- .../cloudstack/framework/jobs/AsyncJob.java | 1 + .../framework/jobs/AsyncJobManager.java | 1 + .../framework/jobs/dao/AsyncJobDao.java | 2 +- .../framework/jobs/dao/AsyncJobDaoImpl.java | 2 +- .../jobs/dao/AsyncJobJoinMapDao.java | 2 +- .../jobs/dao/AsyncJobJoinMapDaoImpl.java | 2 +- .../jobs/dao/AsyncJobJournalDao.java | 2 +- .../jobs/dao/AsyncJobJournalDaoImpl.java | 2 +- .../framework/jobs/dao/SyncQueueDao.java | 2 +- .../framework/jobs/dao/SyncQueueDaoImpl.java | 2 +- .../framework/jobs/dao/SyncQueueItemDao.java | 2 +- .../jobs/dao/SyncQueueItemDaoImpl.java | 2 +- .../jobs/{ => impl}/AsyncJobJoinMapVO.java | 2 +- .../jobs/{ => impl}/AsyncJobJournalVO.java | 5 +- .../jobs/{ => impl}/AsyncJobMBeanImpl.java | 6 +- .../jobs/{ => impl}/AsyncJobMonitor.java | 5 +- .../framework/jobs/{ => impl}/AsyncJobVO.java | 3 +- .../jobs/impl/JobSerializerHelper.java | 127 ++++++++++ .../jobs/{ => impl}/SyncQueueItem.java | 2 +- .../jobs/{ => impl}/SyncQueueItemVO.java | 2 +- .../jobs/{ => impl}/SyncQueueManager.java | 2 +- .../jobs/{ => impl}/SyncQueueManagerImpl.java | 2 +- .../jobs/{ => impl}/SyncQueueVO.java | 2 +- server/src/com/cloud/api/ApiGsonHelper.java | 124 +++++++++- server/src/com/cloud/api/ApiServer.java | 2 +- .../cloud/async/AsyncJobExecutionContext.java | 8 +- .../com/cloud/async/AsyncJobManagerImpl.java | 18 +- .../snapshot/SnapshotSchedulerImpl.java | 2 +- .../cloud/template/TemplateManagerImpl.java | 2 +- .../cloud/vm/VmWorkJobWakeupDispatcher.java | 2 +- server/test/com/cloud/vm/VmWorkTest.java | 8 +- .../com/cloud/vm/VmWorkTestConfiguration.java | 6 +- utils/pom.xml | 5 + 36 files changed, 313 insertions(+), 283 deletions(-) delete mode 100644 core/src/com/cloud/serializer/SerializerHelper.java rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/AsyncJobJoinMapVO.java (98%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/AsyncJobJournalVO.java (94%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/AsyncJobMBeanImpl.java (93%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/AsyncJobMonitor.java (95%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/AsyncJobVO.java (98%) create mode 100644 framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/JobSerializerHelper.java rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/SyncQueueItem.java (96%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/SyncQueueItemVO.java (98%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/SyncQueueManager.java (96%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/SyncQueueManagerImpl.java (99%) rename framework/jobs/src/org/apache/cloudstack/framework/jobs/{ => impl}/SyncQueueVO.java (98%) 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