From 2c5c94d2e024b2fbdce5883fd20005ce06dc28e7 Mon Sep 17 00:00:00 2001 From: Deepak Michael Date: Tue, 13 Dec 2011 07:47:13 +0530 Subject: [PATCH] Handling resource methods with the same name in languages where overloading is not supported --- .../com/wordnik/swagger/common/ApiInvoker.as | 2 +- conf/as3/templates/ResourceObject.st | 21 ++++++++--- .../swagger/codegen/LibraryCodeGenerator.java | 2 +- .../codegen/config/LanguageConfiguration.java | 9 +++++ .../codegen/config/as3/As3LibCodeGen.java | 15 +++++--- .../swagger/codegen/resource/Endpoint.java | 37 ++++++++++++++++++- .../swagger/codegen/resource/Resource.java | 18 ++++++++- 7 files changed, 87 insertions(+), 17 deletions(-) diff --git a/conf/as3/structure/src/main/as3/com/wordnik/swagger/common/ApiInvoker.as b/conf/as3/structure/src/main/as3/com/wordnik/swagger/common/ApiInvoker.as index 2f3ed4bcfa5..e9fa4792c3e 100644 --- a/conf/as3/structure/src/main/as3/com/wordnik/swagger/common/ApiInvoker.as +++ b/conf/as3/structure/src/main/as3/com/wordnik/swagger/common/ApiInvoker.as @@ -53,7 +53,7 @@ package com.wordnik.swagger.common _apiEventNotifier = eventNotifier; } - public function invokeAPI(authToken: String , resourceURL: String, method: String, queryParams: Dictionary, postObject: Object): AsyncToken { + public function invokeAPI(resourceURL: String, method: String, queryParams: Dictionary, postObject: Object, headerParams: Dictionary): AsyncToken { //make the communication if(_useProxyServer) { resourceURL = resourceURL = _apiProxyServerUrl + resourceURL; diff --git a/conf/as3/templates/ResourceObject.st b/conf/as3/templates/ResourceObject.st index 94e3beb14ad..84c80e80ce2 100644 --- a/conf/as3/templates/ResourceObject.st +++ b/conf/as3/templates/ResourceObject.st @@ -54,7 +54,7 @@ $if(method.hasArguments)$ public function $method.name$($method.argumentDefinitions; separator=", "$): String { $if(method.authToken)$ - if(authToken == null || authToken.length == 0) { + if(_apiUsageCredentials == null || _apiUsageCredentials.authToken == null || _apiUsageCredentials.authToken.length == 0) { throw new ApiError(ApiErrorCodes.AUTH_TOKEN_NOT_VALID); }$endif$ var requestId: String = getUniqueId(); @@ -63,6 +63,7 @@ $if(method.authToken)$ resourcePath = resourcePath.replace("{format}","xml"); var method: String = "$method.methodType$"; var queryParams:Dictionary = new Dictionary(); + var headerParams:Dictionary = new Dictionary(); $if(!method.inputModel)$ $method.queryParameters:{ argument | if( $argument.name$ != null) { @@ -74,6 +75,11 @@ $method.pathParameters:{ argument | resourcePath = resourcePath.replace("{$argument.name$}", $argument.name$); } }$ +$method.headerParameters:{ argument | + if( $argument.name$ != null) { + headerParams["$argument.name$"] = toPathValue($argument.name$); + } +}$ $endif$ $if(method.inputModel)$ $method.queryParameters:{ argument | @@ -86,23 +92,28 @@ $method.pathParameters:{ argument | resourcePath = resourcePath.replace("{$argument.name$}", $argument.methodNameFromModelClass$); } }$ +$method.headerParameters:{ argument | + if( $argument.inputModelClassArgument$ != null && $argument.methodNameFromModelClass$ != null) { + headerParams["$argument.name$"] = $argument.methodNameFromModelClass$; + } +}$ $endif$ //make the API Call $if(method.postObject)$ $if(method.authToken)$ - var token:AsyncToken = getApiInvoker().invokeAPI(authToken, resourcePath, method, queryParams, postData); + var token:AsyncToken = getApiInvoker().invokeAPI(resourcePath, method, queryParams, postData, headerParams); $endif$ $if(!method.authToken)$ - var token:AsyncToken = getApiInvoker().invokeAPI(null, resourcePath, method, queryParams, postData); + var token:AsyncToken = getApiInvoker().invokeAPI(resourcePath, method, queryParams, postData, headerParams); $endif$ $endif$ $if(!method.postObject)$ $if(method.authToken)$ - var token:AsyncToken = getApiInvoker().invokeAPI(authToken, resourcePath, method, queryParams, null); + var token:AsyncToken = getApiInvoker().invokeAPI(resourcePath, method, queryParams, null, headerParams); $endif$ $if(!method.authToken)$ - var token:AsyncToken = getApiInvoker().invokeAPI(null, resourcePath, method, queryParams, null); + var token:AsyncToken = getApiInvoker().invokeAPI(resourcePath, method, queryParams, null, headerParams); $endif$ $endif$ diff --git a/src/main/java/com/wordnik/swagger/codegen/LibraryCodeGenerator.java b/src/main/java/com/wordnik/swagger/codegen/LibraryCodeGenerator.java index c2fe63f0acf..2f835883c5b 100644 --- a/src/main/java/com/wordnik/swagger/codegen/LibraryCodeGenerator.java +++ b/src/main/java/com/wordnik/swagger/codegen/LibraryCodeGenerator.java @@ -366,7 +366,7 @@ public class LibraryCodeGenerator { List methods = new ArrayList(); List imports = new ArrayList(); imports.addAll(this.config.getDefaultServiceImports()); - methods = resource.generateMethods(resource, dataTypeMappingProvider, nameGenerator); + methods = resource.generateMethods(resource, dataTypeMappingProvider, nameGenerator, languageConfig); StringTemplate template = templateGroup.getInstanceOf(API_OBJECT_TEMPLATE); String className = resource.generateClassName(nameGenerator); diff --git a/src/main/java/com/wordnik/swagger/codegen/config/LanguageConfiguration.java b/src/main/java/com/wordnik/swagger/codegen/config/LanguageConfiguration.java index 0583f562aa3..0a7b8a921d7 100644 --- a/src/main/java/com/wordnik/swagger/codegen/config/LanguageConfiguration.java +++ b/src/main/java/com/wordnik/swagger/codegen/config/LanguageConfiguration.java @@ -34,6 +34,7 @@ public class LanguageConfiguration { private String annotationPackageName; private boolean isModelEnumRequired = true; private boolean isOutputWrapperRequired = false; + private boolean isMethodOverloadingSupported = true; public String getClassFileExtension() { return classFileExtension; @@ -147,4 +148,12 @@ public class LanguageConfiguration { + ", isModelEnumRequired=" + isModelEnumRequired + ", isOutputWrapperRequired=" + isOutputWrapperRequired + "]"; } + + public boolean isMethodOverloadingSupported() { + return isMethodOverloadingSupported; + } + + public void setMethodOverloadingSupported(boolean methodOverloadingSupported) { + isMethodOverloadingSupported = methodOverloadingSupported; + } } diff --git a/src/main/java/com/wordnik/swagger/codegen/config/as3/As3LibCodeGen.java b/src/main/java/com/wordnik/swagger/codegen/config/as3/As3LibCodeGen.java index 8451d5b0edc..374ce14d633 100644 --- a/src/main/java/com/wordnik/swagger/codegen/config/as3/As3LibCodeGen.java +++ b/src/main/java/com/wordnik/swagger/codegen/config/as3/As3LibCodeGen.java @@ -88,6 +88,7 @@ public class As3LibCodeGen extends LibraryCodeGenerator{ as3Configuration.setModelEnumRequired(false); as3Configuration.setOutputWrapperRequired(true); + as3Configuration.setMethodOverloadingSupported(false); return as3Configuration; } @@ -108,12 +109,14 @@ public class As3LibCodeGen extends LibraryCodeGenerator{ for(Model model : resource.getModels()){ for(ModelField modelField : model.getFields()){ - final String collectionItemType = modelField.getFieldDefinition().getCollectionItemType(); - if(collectionItemType != null){ - refModelField = new ModelField(); - refModelField.setName(modelField.getName()); - refModelField.setParamType(collectionItemType); - refFields.add(refModelField); + if (modelField.getFieldDefinition() != null) { + final String collectionItemType = modelField.getFieldDefinition().getCollectionItemType(); + if(collectionItemType != null){ + refModelField = new ModelField(); + refModelField.setName(modelField.getName() + model.getName()); + refModelField.setParamType(collectionItemType); + refFields.add(refModelField); + } } } } diff --git a/src/main/java/com/wordnik/swagger/codegen/resource/Endpoint.java b/src/main/java/com/wordnik/swagger/codegen/resource/Endpoint.java index d9b4d78c9b2..0ba9cfa6fb8 100644 --- a/src/main/java/com/wordnik/swagger/codegen/resource/Endpoint.java +++ b/src/main/java/com/wordnik/swagger/codegen/resource/Endpoint.java @@ -18,6 +18,7 @@ package com.wordnik.swagger.codegen.resource; import com.wordnik.swagger.codegen.ResourceMethod; import com.wordnik.swagger.codegen.config.DataTypeMappingProvider; +import com.wordnik.swagger.codegen.config.LanguageConfiguration; import com.wordnik.swagger.codegen.config.NamingPolicyProvider; import java.util.ArrayList; @@ -72,14 +73,27 @@ public class Endpoint { this.operations = operations; } - public List generateMethods(Resource resource, DataTypeMappingProvider dataTypeMapper, NamingPolicyProvider nameGenerator) { + public List generateMethods(Resource resource, DataTypeMappingProvider dataTypeMapper, + NamingPolicyProvider nameGenerator, LanguageConfiguration languageConfig) { if(methods == null){ methods = new ArrayList(); + ResourceMethod newMethod; + List endPointMethodNames = new ArrayList(); if(getOperations() != null) { for(EndpointOperation operation: getOperations()) { //Note: Currently we are generating methods for depricated APIs also, We should provide this deprecation info on generated APIs also. if(areModelsAvailable(operation.getParameters(), resource, dataTypeMapper)) { - methods.add(operation.generateMethod(this, resource, dataTypeMapper, nameGenerator)); + newMethod = operation.generateMethod(this, resource, dataTypeMapper, nameGenerator); + if (!endPointMethodNames.contains(newMethod.getName())) { + methods.add(newMethod); + } + else{ + //handleOverloadingSupport + if(!languageConfig.isMethodOverloadingSupported()){ + handleOverloadedMethod(newMethod, endPointMethodNames); + } + } + endPointMethodNames.add(newMethod.getName()); } } } @@ -87,6 +101,25 @@ public class Endpoint { return methods; } + void handleOverloadedMethod(ResourceMethod method, List methods) { + //handleOverloadingSupport + int counter = 1; + String newMethodName; + boolean generatedNewName = false; + do{ + newMethodName = method.getName() + counter; + if (!methods.contains(newMethodName)){ + method.setName(newMethodName); + generatedNewName = true; + } + System.out.println("Handling overloaded method for " + method.getName()); + counter++; + + }while (!generatedNewName); + System.out.println("Handling overloaded method : New method name - " + method.getName()); + + } + private boolean areModelsAvailable(List modelFields, Resource resource, DataTypeMappingProvider dataTypeMapper) { Boolean isParamSetAvailable = true; if(modelFields == null) return true; diff --git a/src/main/java/com/wordnik/swagger/codegen/resource/Resource.java b/src/main/java/com/wordnik/swagger/codegen/resource/Resource.java index 397c69db060..13d41cf0bc8 100644 --- a/src/main/java/com/wordnik/swagger/codegen/resource/Resource.java +++ b/src/main/java/com/wordnik/swagger/codegen/resource/Resource.java @@ -18,6 +18,7 @@ package com.wordnik.swagger.codegen.resource; import com.wordnik.swagger.codegen.ResourceMethod; import com.wordnik.swagger.codegen.config.DataTypeMappingProvider; +import com.wordnik.swagger.codegen.config.LanguageConfiguration; import com.wordnik.swagger.codegen.config.NamingPolicyProvider; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; @@ -119,12 +120,25 @@ public class Resource { return generatedClassName; } - public List generateMethods(Resource resource, DataTypeMappingProvider dataTypeMapper, NamingPolicyProvider nameGenerator) { + public List generateMethods(Resource resource, DataTypeMappingProvider dataTypeMapper, + NamingPolicyProvider nameGenerator, LanguageConfiguration languageConfig) { if(methods == null){ methods = new ArrayList(); + List newMethods = new ArrayList(); + List endPointMethodNames = new ArrayList(); if(getEndPoints() != null) { for(Endpoint endpoint: getEndPoints()){ - methods.addAll(endpoint.generateMethods(resource, dataTypeMapper, nameGenerator)); + newMethods = endpoint.generateMethods(resource, dataTypeMapper, nameGenerator, languageConfig); + + if (!languageConfig.isMethodOverloadingSupported()) { + for(ResourceMethod newMethod: newMethods){ + if(endPointMethodNames.contains( newMethod.getName() )) { + endpoint.handleOverloadedMethod(newMethod, endPointMethodNames); + } + endPointMethodNames.add(newMethod.getName()); + } + } + methods.addAll(newMethods); } } }