From 1ae34d98d49e232df276593b04f6563d1711b229 Mon Sep 17 00:00:00 2001 From: Rajani Karuturi Date: Tue, 13 Jan 2015 10:41:39 +0530 Subject: [PATCH] volume upload: fixed circular reference error while generating json --- ...eOrVolumePostUploadCommandTypeAdapter.java | 52 +++++++++++++++++++ .../cloud/storage/VolumeApiServiceImpl.java | 13 ++--- .../cloud/template/TemplateManagerImpl.java | 12 +---- 3 files changed, 57 insertions(+), 20 deletions(-) create mode 100644 core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommandTypeAdapter.java diff --git a/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommandTypeAdapter.java b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommandTypeAdapter.java new file mode 100644 index 00000000000..1739917734a --- /dev/null +++ b/core/src/org/apache/cloudstack/storage/command/TemplateOrVolumePostUploadCommandTypeAdapter.java @@ -0,0 +1,52 @@ +/* + * 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.storage.command; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; + +import java.lang.reflect.Type; + +public class TemplateOrVolumePostUploadCommandTypeAdapter implements JsonSerializer { + + @Override public JsonElement serialize(TemplateOrVolumePostUploadCommand src, Type typeOfSrc, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + + EndPoint endPoint = src.getEndPoint(); + JsonObject endpointJSON = new JsonObject(); + endpointJSON.addProperty("id", endPoint.getId()); + endpointJSON.addProperty("hostAddress", endPoint.getHostAddr()); + endpointJSON.addProperty("publicAddr", endPoint.getPublicAddr()); + obj.add(endPoint.getClass().getName(), endpointJSON); + + DataObject dataObject = src.getDataObject(); + JsonObject dataobjectJSON = new JsonObject(); + dataobjectJSON.addProperty("id", dataObject.getId()); + dataobjectJSON.addProperty("size", dataObject.getSize()); + dataobjectJSON.addProperty("uuid", dataObject.getUuid()); + dataobjectJSON.addProperty("type", String.valueOf(dataObject.getType())); + obj.add(dataObject.getClass().getName(), dataobjectJSON); + + return obj; + } +} diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index 5f90f81fa00..3c229460b51 100644 --- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java @@ -29,14 +29,13 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; import com.cloud.utils.EncryptionUtil; -import com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.cloudstack.api.command.user.volume.GetUploadParamsForVolumeCmd; import org.apache.cloudstack.api.response.GetUploadParamsResponse; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand; +import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommandTypeAdapter; import org.apache.log4j.Logger; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; @@ -319,14 +318,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic /* * encoded metadata using the post upload config ssh key */ - Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() { - @Override public boolean shouldSkipField(FieldAttributes f) { - return f.getDeclaredType().getClass().isInstance(Logger.class); - } - @Override public boolean shouldSkipClass(Class clazz) { - return false; - } - }).create(); + + Gson gson = new GsonBuilder().registerTypeAdapter(TemplateOrVolumePostUploadCommand.class, new TemplateOrVolumePostUploadCommandTypeAdapter()).create(); String jsonPayload = gson.toJson(command); response.setMetadata(EncryptionUtil.encodeData(jsonPayload, key)); diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 53fb00d8f77..aeb4b02fb29 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -34,13 +34,12 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import com.cloud.utils.EncryptionUtil; -import com.google.gson.ExclusionStrategy; -import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import org.apache.cloudstack.api.command.user.template.GetUploadParamsForTemplateCmd; import org.apache.cloudstack.api.response.GetUploadParamsResponse; import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommand; +import org.apache.cloudstack.storage.command.TemplateOrVolumePostUploadCommandTypeAdapter; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; @@ -366,14 +365,7 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, /* * encoded metadata using the post upload config ssh key */ - Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() { - @Override public boolean shouldSkipField(FieldAttributes f) { - return f.getDeclaredType().getClass().isInstance(Logger.class); - } - @Override public boolean shouldSkipClass(Class clazz) { - return false; - } - }).create(); + Gson gson = new GsonBuilder().registerTypeAdapter(TemplateOrVolumePostUploadCommand.class, new TemplateOrVolumePostUploadCommandTypeAdapter()).create(); String jsonPayload = gson.toJson(payload); response.setMetadata(EncryptionUtil.encodeData(jsonPayload, key));