diff --git a/client/pom.xml b/client/pom.xml index 9955cd7928f..e99698a29ba 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -7,16 +7,6 @@ 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. --> - 4.0.0 diff --git a/plugins/api/discovery/src/org/apache/cloudstack/api/response/ApiParameterResponse.java b/plugins/api/discovery/src/org/apache/cloudstack/api/response/ApiParameterResponse.java index fa6dc1752d2..473bb93cbff 100644 --- a/plugins/api/discovery/src/org/apache/cloudstack/api/response/ApiParameterResponse.java +++ b/plugins/api/discovery/src/org/apache/cloudstack/api/response/ApiParameterResponse.java @@ -50,6 +50,10 @@ public class ApiParameterResponse extends BaseResponse { this.name = name; } + public String getName() { + return this.name; + } + public void setDescription(String description) { this.description = description; } diff --git a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java index 47b9d581bf1..73118aa342b 100755 --- a/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java +++ b/plugins/api/discovery/src/org/apache/cloudstack/discovery/ApiDiscoveryServiceImpl.java @@ -16,19 +16,16 @@ // under the License. package org.apache.cloudstack.discovery; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ejb.Local; -import javax.inject.Inject; - +import com.cloud.serializer.Param; +import com.cloud.user.User; +import com.cloud.utils.ReflectUtil; +import com.cloud.utils.StringUtils; +import com.cloud.utils.component.ComponentLifecycleBase; +import com.cloud.utils.component.PluggableService; +import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.acl.APIChecker; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.BaseAsyncCreateCmd; import org.apache.cloudstack.api.BaseCmd; @@ -42,13 +39,15 @@ import org.apache.cloudstack.api.response.ListResponse; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.serializer.Param; -import com.cloud.user.User; -import com.cloud.utils.ReflectUtil; -import com.cloud.utils.StringUtils; -import com.cloud.utils.component.ComponentLifecycleBase; -import com.cloud.utils.component.PluggableService; -import com.google.gson.annotations.SerializedName; +import javax.ejb.Local; +import javax.inject.Inject; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; @Component @Local(value = ApiDiscoveryService.class) @@ -102,6 +101,7 @@ public class ApiDiscoveryServiceImpl extends ComponentLifecycleBase implements A } ApiDiscoveryResponse response = getCmdRequestMap(cmdClass, apiCmdAnnotation); String responseName = apiCmdAnnotation.responseObject().getName(); + response.setResponseName(responseName); if (!responseName.contains("SuccessResponse")) { if (!responseApiNameListMap.containsKey(responseName)) { responseApiNameListMap.put(responseName, new ArrayList()); @@ -110,9 +110,6 @@ public class ApiDiscoveryServiceImpl extends ComponentLifecycleBase implements A responseApiNameListMap.get(responseName).add(apiName); String entity = apiCmdAnnotation.responseObject().getSimpleName().replace("Response", ""); response.setEntity(entity); - } else { - String entity = deriveRelatedEntity(apiName, response).replace("Response", ""); - response.setEntity(entity); } Field[] responseFields = apiCmdAnnotation.responseObject().getDeclaredFields(); @@ -129,6 +126,14 @@ public class ApiDiscoveryServiceImpl extends ComponentLifecycleBase implements A ApiDiscoveryResponse response = s_apiNameDiscoveryResponseMap.get(apiName); Set processedParams = new HashSet(); for (ApiParameterResponse param: response.getParams()) { + //Derive entity for unmapped apis + if (response.getEntity() == null) { + String entity = deriveRelatedEntity(apiName, param); + if (entity != null && !entity.isEmpty()) { + response.setEntity(entity); + } + } + if (responseApiNameListMap.containsKey(param.getRelated())) { List relatedApis = responseApiNameListMap.get(param.getRelated()); param.setRelated(StringUtils.join(relatedApis, ",")); @@ -146,24 +151,29 @@ public class ApiDiscoveryServiceImpl extends ComponentLifecycleBase implements A } else { response.setRelated(null); } - s_apiNameDiscoveryResponseMap.put(apiName, response); } return responseApiNameListMap; } - private String deriveRelatedEntity(String currentApi, ApiDiscoveryResponse response) { + private String deriveRelatedEntity(String api, ApiParameterResponse param) { //Guess the entity from the related APIs + //For APIs that are deleteXxx, the right entityType is in the `id` field of the Cmd String entity = ""; - for (ApiParameterResponse param : response.getParams()) { - if (param.getRelated() != null) { + if (param.getName() != null && param.getName().equals(ApiConstants.ID)) { + if (api.startsWith("delete")) { + entity = param.getRelated(); + } + } else { + if (param.getRelated() != null && !param.getRelated().equals("Object")) { entity = param.getRelated(); } } if (entity.isEmpty()) { - s_logger.warn("Couldn't find entity for API: " + currentApi + " from related APIs"); + s_logger.warn("Couldn't find entity for API: " + api + " from related APIs"); + return null; } - return entity; + return entity.replace("Response", ""); } private ApiResponseResponse getFieldResponseMap(Field responseField) { diff --git a/tools/marvin/marvin/codegenerator.py b/tools/marvin/marvin/codegenerator.py index f88117ded42..9551b00847a 100644 --- a/tools/marvin/marvin/codegenerator.py +++ b/tools/marvin/marvin/codegenerator.py @@ -309,8 +309,6 @@ class codeGenerator(object): getText(param.getElementsByTagName('name')) assert paramProperty.name - - required = param.getElementsByTagName('required') if required: paramProperty.required = getText(required)