/******************************************************************************* * Copyright (c) 2013 GigaSpaces Technologies Ltd. All rights reserved * * Licensed 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.cloudifysource.rest.doclet; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.logging.Logger; import org.apache.commons.lang.ClassUtils; import org.cloudifysource.domain.ComputeTemplateHolder; import org.cloudifysource.domain.cloud.compute.ComputeTemplate; import org.cloudifysource.dsl.internal.CloudifyErrorMessages; import org.cloudifysource.dsl.internal.CloudifyMessageKeys; import org.cloudifysource.dsl.rest.response.AddTemplatesResponse; import org.cloudifysource.dsl.rest.response.AddTemplatesStatus; import org.cloudifysource.dsl.rest.response.ApplicationDescription; import org.cloudifysource.dsl.rest.response.DeleteApplicationAttributeResponse; import org.cloudifysource.dsl.rest.response.DeleteServiceAttributeResponse; import org.cloudifysource.dsl.rest.response.DeleteServiceInstanceAttributeResponse; import org.cloudifysource.dsl.rest.response.DeploymentEvents; import org.cloudifysource.dsl.rest.response.GetApplicationAttributesResponse; import org.cloudifysource.dsl.rest.response.GetServiceAttributesResponse; import org.cloudifysource.dsl.rest.response.GetServiceInstanceAttributesResponse; import org.cloudifysource.dsl.rest.response.GetTemplateResponse; import org.cloudifysource.dsl.rest.response.InstallApplicationResponse; import org.cloudifysource.dsl.rest.response.InstallServiceResponse; import org.cloudifysource.dsl.rest.response.ListTemplatesResponse; import org.cloudifysource.dsl.rest.response.Response; import org.cloudifysource.dsl.rest.response.ServiceDescription; import org.cloudifysource.dsl.rest.response.ServiceDetails; import org.cloudifysource.dsl.rest.response.ServiceInstanceDetails; import org.cloudifysource.dsl.rest.response.ServiceInstanceMetricsResponse; import org.cloudifysource.dsl.rest.response.ServiceMetricsResponse; import org.cloudifysource.dsl.rest.response.UninstallApplicationResponse; import org.cloudifysource.dsl.rest.response.UninstallServiceResponse; import org.cloudifysource.dsl.rest.response.UpdateApplicationAttributeResponse; import org.cloudifysource.dsl.rest.response.UploadResponse; import org.cloudifysource.restDoclet.exampleGenerators.IDocExampleGenerator; import org.cloudifysource.restDoclet.exampleGenerators.PrimitiveExampleValues; import org.codehaus.jackson.map.ObjectMapper; import com.sun.javadoc.ParameterizedType; import com.sun.javadoc.Type; /** * * @author yael * @since 2.6.0 * */ public class RESTResposneExampleGenerator implements IDocExampleGenerator { private static final Logger logger = Logger.getLogger(RESTResposneExampleGenerator.class.getName()); @Override public String generateExample(final Type type) throws Exception { Object responseWrapper = getGeneratedExample(type); return new ObjectMapper().writeValueAsString(responseWrapper); } private Object getGeneratedExample(final Type type) throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> clazz = ClassUtils.getClass(type.qualifiedTypeName()); if (AddTemplatesResponse.class.equals(clazz)) { RESTExampleRespone<Object> response = new RESTExampleRespone<Object>(); response.setResponse(null); response.setStatus(AddTemplatesStatus.PARTIAL_FAILURE.getName()); response.setMessageId(CloudifyErrorMessages.PARTLY_FAILED_TO_ADD_TEMPLATES.getName()); response.setMessage("partial failure - not all the expected templates were added to all REST instances."); response.setVerbose(RESTExamples.getAddTemplatesResponseExample()); return response; } Response<Object> response = new Response<Object>(); response.setResponse(getExample(type)); response.setStatus("Success"); response.setMessage("Operation completed successfully"); response.setMessageId(CloudifyMessageKeys.OPERATION_SUCCESSFULL.getName()); response.setVerbose(null); return response; } private Object getExample(final Type type) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Object example; Class<?> clazz = ClassUtils.getClass(type.qualifiedTypeName()); // create the example instance if (DeleteApplicationAttributeResponse.class.equals(clazz)) { example = new DeleteApplicationAttributeResponse(); ((DeleteApplicationAttributeResponse) example).setPreviousValue(RESTExamples.getAttribute()); } else if (DeleteServiceAttributeResponse.class.equals(clazz)) { example = new DeleteServiceAttributeResponse(); ((DeleteServiceAttributeResponse) example).setPreviousValue(RESTExamples.getAttribute()); } else if (DeleteServiceInstanceAttributeResponse.class.equals(clazz)) { example = new DeleteServiceInstanceAttributeResponse(); ((DeleteServiceInstanceAttributeResponse) example).setPreviousValue(RESTExamples.getAttribute()); } else if (GetApplicationAttributesResponse.class.equals(clazz)) { example = new GetApplicationAttributesResponse(); ((GetApplicationAttributesResponse) example).setAttributes(RESTExamples.getAttributes()); } else if (GetServiceAttributesResponse.class.equals(clazz)) { example = new GetServiceAttributesResponse(); ((GetServiceAttributesResponse) example).setAttributes(RESTExamples.getAttributes()); } else if (GetServiceInstanceAttributesResponse.class.equals(clazz)) { example = new GetServiceInstanceAttributesResponse(); ((GetServiceInstanceAttributesResponse) example).setAttributes(RESTExamples.getAttributes()); } else if (InstallApplicationResponse.class.equals(clazz)) { example = new InstallApplicationResponse(); ((InstallApplicationResponse) example).setDeploymentID(RESTExamples.getDeploymentID()); } else if (InstallServiceResponse.class.equals(clazz)) { example = new InstallServiceResponse(); ((InstallServiceResponse) example).setDeploymentID(RESTExamples.getDeploymentID()); } else if (ServiceInstanceMetricsResponse.class.equals(clazz)) { example = new ServiceInstanceMetricsResponse(); ((ServiceInstanceMetricsResponse) example).setAppName(RESTExamples.getAppName()); ((ServiceInstanceMetricsResponse) example).setServiceInstanceMetricsData( RESTExamples.getServiceInstanceMetricsData()); ((ServiceInstanceMetricsResponse) example).setServiceName(RESTExamples.getServiceName()); } else if (ServiceMetricsResponse.class.equals(clazz)) { ServiceMetricsResponse serviceMetricsResponse = new ServiceMetricsResponse(); serviceMetricsResponse.setAppName(RESTExamples.getAppName()); serviceMetricsResponse.setServiceInstaceMetricsData(RESTExamples.getServiceInstanceMetricsDataList()); serviceMetricsResponse.setServiceName(RESTExamples.getServiceName()); example = serviceMetricsResponse; } else if (UninstallApplicationResponse.class.equals(clazz)) { example = new UninstallApplicationResponse(); ((UninstallApplicationResponse) example).setDeploymentID(RESTExamples.getDeploymentID()); } else if (UninstallServiceResponse.class.equals(clazz)) { example = new UninstallServiceResponse(); ((UninstallServiceResponse) example).setDeploymentID(RESTExamples.getDeploymentID()); } else if (UpdateApplicationAttributeResponse.class.equals(clazz)) { example = new UpdateApplicationAttributeResponse(); ((UpdateApplicationAttributeResponse) example).setPreviousValue(RESTExamples.getAttribute()); } else if (UploadResponse.class.equals(clazz)) { example = new UploadResponse(); ((UploadResponse) example).setUploadKey(RESTExamples.getUploadKey()); } else if (ServiceDetails.class.equals(clazz)) { ServiceDetails serviceDetails = new ServiceDetails(); serviceDetails.setApplicationName(RESTExamples.getAppName()); serviceDetails.setInstanceNames(RESTExamples.getInstanceNames()); serviceDetails.setName(RESTExamples.getServiceName()); serviceDetails.setNumberOfInstances(RESTExamples.getNumberOfInstances()); example = serviceDetails; } else if (DeploymentEvents.class.equals(clazz)) { example = new DeploymentEvents(); ((DeploymentEvents) example).setEvents(RESTExamples.getEvents()); } else if (ApplicationDescription.class.equals(clazz)) { ApplicationDescription applicationDescription = new ApplicationDescription(); applicationDescription.setApplicationName(RESTExamples.getAppName()); applicationDescription.setApplicationState(RESTExamples.getApplicationState()); applicationDescription.setAuthGroups(RESTExamples.getAuthGroups()); applicationDescription.setServicesDescription(RESTExamples.getServicesDescription()); example = applicationDescription; } else if (ServiceInstanceDetails.class.equals(clazz)) { ServiceInstanceDetails serviceInstanceDetails = new ServiceInstanceDetails(); String appName = RESTExamples.getAppName(); String serviceName = RESTExamples.getServiceName(); int instanceId = RESTExamples.getInstanceId(); serviceInstanceDetails.setApplicationName(appName); serviceInstanceDetails.setHardwareId(RESTExamples.getHardwareId()); serviceInstanceDetails.setImageId(RESTExamples.getImageId()); serviceInstanceDetails.setInstanceId(instanceId); serviceInstanceDetails.setMachineId(RESTExamples.getMachineId()); serviceInstanceDetails.setPrivateIp(RESTExamples.getPrivateIp()); serviceInstanceDetails.setProcessDetails(RESTExamples.getProcessDetails(instanceId)); serviceInstanceDetails.setPublicIp(RESTExamples.getPublicIp()); serviceInstanceDetails.setServiceInstanceName(RESTExamples.getInstanceName(serviceName, appName)); serviceInstanceDetails.setServiceName(serviceName); serviceInstanceDetails.setTemplateName("SMALL_UBUNTU"); example = serviceInstanceDetails; } else if (ServiceDescription.class.equals(clazz)) { example = RESTExamples.getServicesDescription(); } else if (AddTemplatesResponse.class.equals(clazz)) { example = null; } else if (ListTemplatesResponse.class.equals(clazz)) { example = new ListTemplatesResponse(); Map<String, ComputeTemplate> templates = new HashMap<String, ComputeTemplate>(); ComputeTemplateHolder templateHolder = RESTExamples.getTemplate(); templates.put(templateHolder.getName(), templateHolder.getCloudTemplate()); ((ListTemplatesResponse) example).setTemplates(templates); } else if (GetTemplateResponse.class.equals(clazz)) { example = new GetTemplateResponse(); ((GetTemplateResponse) example).setTemplate(RESTExamples.getTemplate().getCloudTemplate()); } else if (clazz.isPrimitive()) { example = PrimitiveExampleValues.getValue(clazz); } else if (String.class.equals(clazz)) { example = "string"; } else if (ParameterizedType.class.isAssignableFrom(type.getClass())) { List<Object> list = new LinkedList<Object>(); if (List.class.isAssignableFrom(clazz)) { ParameterizedType parameterizedType = (ParameterizedType) type; Type paramType = parameterizedType.typeArguments()[0]; list.add(getExample(paramType)); list.add(getExample(paramType)); list.add(getExample(paramType)); } example = list; } else { String className = clazz.getName(); logger.warning("Missing custom instantiation of class " + className + " for generating response example, using newInstance instead."); try { return clazz.newInstance(); } catch (Exception e) { String errMsg = "failed to instantiate " + className; logger.warning(errMsg); throw new IllegalArgumentException(errMsg); } } return example; } }