Skip to content

Commit 05ab3bf

Browse files
committed
bug 7063: AsyncJobResult should now return the correct success and error tags upon the completion of a async job. It should now follow either the format ... jobresult.success or jobresult.errorcode and jobresult.errortext
- Fixed a lot of other Async related packaging issues. It's not all done but will continue to refactor this later.
1 parent df8222e commit 05ab3bf

16 files changed

Lines changed: 245 additions & 254 deletions

core/src/com/cloud/api/ResponseObjectTypeAdapter.java

Lines changed: 0 additions & 118 deletions
This file was deleted.

core/src/com/cloud/serializer/GsonHelper.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import com.cloud.agent.api.Command;
2626
import com.cloud.agent.transport.ArrayTypeAdaptor;
2727
import com.cloud.agent.transport.VolListTypeAdaptor;
28-
import com.cloud.api.ResponseObject;
29-
import com.cloud.api.ResponseObjectTypeAdapter;
3028
import com.cloud.storage.VolumeVO;
3129
import com.google.gson.GsonBuilder;
3230
import com.google.gson.reflect.TypeToken;
@@ -40,7 +38,6 @@ public class GsonHelper {
4038
s_gBuilder.registerTypeAdapter(Answer[].class, new ArrayTypeAdaptor<Answer>());
4139
Type listType = new TypeToken<List<VolumeVO>>() {}.getType();
4240
s_gBuilder.registerTypeAdapter(listType, new VolListTypeAdaptor());
43-
s_gBuilder.registerTypeAdapter(ResponseObject.class, new ResponseObjectTypeAdapter());
4441
}
4542

4643
public static GsonBuilder getBuilder() {

core/src/com/cloud/serializer/SerializerHelper.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,16 @@
1818

1919
package com.cloud.serializer;
2020

21-
import java.lang.reflect.Field;
22-
import java.lang.reflect.InvocationTargetException;
23-
import java.lang.reflect.Method;
24-
import java.lang.reflect.Modifier;
25-
import java.util.ArrayList;
26-
import java.util.Date;
27-
import java.util.List;
28-
29-
import org.apache.log4j.Logger;
30-
31-
import com.cloud.api.ResponseObject;
21+
import java.lang.reflect.Field;
22+
import java.lang.reflect.InvocationTargetException;
23+
import java.lang.reflect.Method;
24+
import java.lang.reflect.Modifier;
25+
import java.util.ArrayList;
26+
import java.util.Date;
27+
import java.util.List;
28+
29+
import org.apache.log4j.Logger;
30+
3231
import com.cloud.utils.DateUtil;
3332
import com.cloud.utils.Pair;
3433
import com.google.gson.Gson;
@@ -44,12 +43,7 @@ public static String toSerializedStringOld(Object result) {
4443
if(result != null) {
4544
Class<?> clz = result.getClass();
4645
Gson gson = GsonHelper.getBuilder().create();
47-
48-
if (result instanceof ResponseObject) {
49-
return clz.getName() + token + ((ResponseObject)result).getResponseName() + token + gson.toJson(result);
50-
} else {
51-
return clz.getName() + token + gson.toJson(result);
52-
}
46+
return clz.getName() + token + gson.toJson(result);
5347
}
5448
return null;
5549
}
@@ -83,9 +77,6 @@ public static Object fromSerializedString(String result) {
8377

8478
Gson gson = GsonHelper.getBuilder().create();
8579
Object obj = gson.fromJson(content, clz);
86-
if (nameField != null) {
87-
((ResponseObject)obj).setResponseName(nameField);
88-
}
8980
return obj;
9081
}
9182
return null;

core/test/com/cloud/async/TestAsync.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,12 @@
2525

2626
import junit.framework.Assert;
2727

28-
import com.cloud.async.AsyncJobResult;
2928
import com.cloud.async.AsyncJobVO;
30-
import com.cloud.async.dao.AsyncJobDao;
31-
import com.cloud.async.dao.AsyncJobDaoImpl;
3229
import com.cloud.maid.StackMaid;
3330
import com.cloud.maid.StackMaidVO;
3431
import com.cloud.maid.dao.StackMaidDao;
3532
import com.cloud.maid.dao.StackMaidDaoImpl;
3633
import com.cloud.serializer.Param;
37-
import com.cloud.serializer.SerializerHelper;
3834
import com.cloud.utils.ActionDelegate;
3935
import com.cloud.utils.Pair;
4036
import com.cloud.utils.db.Transaction;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.cloud.api;
2+
3+
import com.google.gson.GsonBuilder;
4+
5+
public class ApiGsonHelper {
6+
private static final GsonBuilder s_gBuilder;
7+
static {
8+
s_gBuilder = new GsonBuilder();
9+
s_gBuilder.setVersion(1.3);
10+
s_gBuilder.registerTypeAdapter(ResponseObject.class, new ResponseObjectTypeAdapter());
11+
}
12+
13+
public static GsonBuilder getBuilder() {
14+
return s_gBuilder;
15+
}
16+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.cloud.api;
2+
3+
import org.apache.log4j.Logger;
4+
5+
import com.cloud.serializer.GsonHelper;
6+
import com.google.gson.Gson;
7+
8+
public class ApiSerializerHelper {
9+
public static final Logger s_logger = Logger.getLogger(ApiSerializerHelper.class.getName());
10+
public static String token = "/";
11+
12+
public static String toSerializedStringOld(Object result) {
13+
if(result != null) {
14+
Class<?> clz = result.getClass();
15+
Gson gson = ApiGsonHelper.getBuilder().create();
16+
17+
if (result instanceof ResponseObject) {
18+
return clz.getName() + token + ((ResponseObject)result).getResponseName() + token + gson.toJson(result);
19+
} else {
20+
return clz.getName() + token + gson.toJson(result);
21+
}
22+
}
23+
return null;
24+
}
25+
26+
public static Object fromSerializedString(String result) {
27+
try {
28+
if(result != null && !result.isEmpty()) {
29+
30+
String[] serializedParts = result.split(token);
31+
32+
if (serializedParts.length < 2) {
33+
return null;
34+
}
35+
String clzName = serializedParts[0];
36+
String nameField = null;
37+
String content = null;
38+
if (serializedParts.length == 2) {
39+
content = serializedParts[1];
40+
} else {
41+
nameField = serializedParts[1];
42+
int index = result.indexOf(token + nameField + token);
43+
content = result.substring(index + nameField.length() + 2);
44+
}
45+
46+
Class<?> clz;
47+
try {
48+
clz = Class.forName(clzName);
49+
} catch (ClassNotFoundException e) {
50+
return null;
51+
}
52+
53+
Gson gson = ApiGsonHelper.getBuilder().create();
54+
Object obj = gson.fromJson(content, clz);
55+
if (nameField != null) {
56+
((ResponseObject)obj).setResponseName(nameField);
57+
}
58+
return obj;
59+
}
60+
return null;
61+
} catch(RuntimeException e) {
62+
s_logger.error("Caught runtime exception when doing GSON deserialization on: " + result);
63+
throw e;
64+
}
65+
}
66+
}

server/src/com/cloud/api/ApiServer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@
8888
import com.cloud.event.EventUtils;
8989
import com.cloud.exception.CloudAuthenticationException;
9090
import com.cloud.maid.StackMaid;
91-
import com.cloud.serializer.GsonHelper;
9291
import com.cloud.server.ManagementServer;
9392
import com.cloud.user.Account;
9493
import com.cloud.user.User;
@@ -390,7 +389,7 @@ private String queueCommand(BaseCmd cmdObj, Map<String, String> params) {
390389
job.setAccountId(1L);
391390
}
392391
job.setCmd(cmdObj.getClass().getName());
393-
job.setCmdInfo(GsonHelper.getBuilder().create().toJson(params));
392+
job.setCmdInfo(ApiGsonHelper.getBuilder().create().toJson(params));
394393

395394
long jobId = _asyncMgr.submitAsyncJob(job);
396395
if (objectId != null) {
File renamed without changes.

0 commit comments

Comments
 (0)