From cc45ff17cb8ec45ccbd658478d992f7c4e758859 Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 28 Jul 2015 10:51:20 +0800 Subject: [PATCH 1/2] Fix deserialize nested map error in objc client --- .../main/resources/objc/ApiClient-body.mustache | 2 +- .../petstore/objc/SwaggerClient/SWGApiClient.m | 2 +- .../Tests/DeserializationTest.m | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache index 569eade5db5..7ad0186daad 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -413,7 +413,7 @@ static void (^reachabilityChangeBlock)(int); } // map - NSString *dictPat = @"NSDictionary\\* /\\* (.+), (.+) \\*/"; + NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; regexp = [NSRegularExpression regularExpressionWithPattern:dictPat options:NSRegularExpressionCaseInsensitive error:nil]; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m index f51a012a811..6a2f7753db5 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m @@ -413,7 +413,7 @@ static void (^reachabilityChangeBlock)(int); } // map - NSString *dictPat = @"NSDictionary\\* /\\* (.+), (.+) \\*/"; + NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; regexp = [NSRegularExpression regularExpressionWithPattern:dictPat options:NSRegularExpressionCaseInsensitive error:nil]; diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m index 2650dde31d0..a86ff7d01e4 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m @@ -116,4 +116,19 @@ XCTAssertEqualObjects([result[@"pet"] _id], @119); } +- (void)testDeserializeNestedMap { + NSDictionary *data = + @{ + @"foo": @{ + @"bar": @1 + } + }; + + NSDictionary *result = [apiClient deserialize:data class:@"NSDictionary* /* NSString, NSDictionary* /* NSString, NSNumber */ */"]; + + XCTAssertTrue([result isKindOfClass:[NSDictionary class]]); + XCTAssertTrue([result[@"foo"] isKindOfClass:[NSDictionary class]]); + XCTAssertTrue([result[@"foo"][@"bar"] isKindOfClass:[NSNumber class]]); +} + @end From b2e0d83f2e3d01e7ebd30bca8ba163fd4898418b Mon Sep 17 00:00:00 2001 From: geekerzp Date: Tue, 28 Jul 2015 17:21:10 +0800 Subject: [PATCH 2/2] Update objc client. * Fix issue that list of primitive types deserialization. * Add test cases for list of primitive types deserialization and nested list deserialization. --- .../codegen/languages/ObjcClientCodegen.java | 19 ++++++++++--------- .../resources/objc/ApiClient-body.mustache | 13 ++++++++----- .../src/test/scala/Objc/ObjcModelTest.scala | 2 +- .../objc/SwaggerClient/SWGApiClient.m | 13 ++++++++----- .../petstore/objc/SwaggerClient/SWGPet.h | 2 +- .../petstore/objc/SwaggerClient/SWGPetApi.h | 4 ++-- .../petstore/objc/SwaggerClient/SWGPetApi.m | 4 ++-- .../Tests/DeserializationTest.m | 18 ++++++++++++++++++ 8 files changed, 50 insertions(+), 25 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java index 3e5edbc169f..df93a38aafa 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java @@ -213,21 +213,22 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { Property inner = ap.getItems(); String innerType = getSwaggerType(inner); - // In this codition, type of property p is array of primitive, - // return container type with pointer, e.g. `NSArray*' - if (languageSpecificPrimitives.contains(innerType)) { - return getSwaggerType(p) + "*"; - } - - // In this codition, type of property p is array of model, - // return container type combine inner type with pointer, e.g. `NSArray*' String innerTypeDeclaration = getTypeDeclaration(inner); if (innerTypeDeclaration.endsWith("*")) { innerTypeDeclaration = innerTypeDeclaration.substring(0, innerTypeDeclaration.length() - 1); } - return getSwaggerType(p) + "<" + innerTypeDeclaration + ">*"; + // In this codition, type of property p is array of primitive, + // return container type with pointer, e.g. `NSArray* /* NSString */' + if (languageSpecificPrimitives.contains(innerType)) { + return getSwaggerType(p) + "*" + " /* " + innerTypeDeclaration + " */"; + } + // In this codition, type of property p is array of model, + // return container type combine inner type with pointer, e.g. `NSArray*' + else { + return getSwaggerType(p) + "<" + innerTypeDeclaration + ">*"; + } } else if (p instanceof MapProperty) { MapProperty mp = (MapProperty) p; Property inner = mp.getAdditionalProperties(); diff --git a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache index 7ad0186daad..e37d26e755b 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -356,13 +356,14 @@ static void (^reachabilityChangeBlock)(int); NSTextCheckingResult *match = nil; NSMutableArray *resultArray = nil; NSMutableDictionary *resultDict = nil; + NSString *innerType = nil; // return nil if data is nil or class is nil if (!data || !class) { return nil; } - // remove "*" from class, if ends with "*" + // remove "*" from class, if ends with "*" if ([class hasSuffix:@"*"]) { class = [class substringToIndex:[class length] - 1]; } @@ -383,7 +384,7 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { - NSString *innerType = [class substringWithRange:[match rangeAtIndex:1]]; + innerType = [class substringWithRange:[match rangeAtIndex:1]]; resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -395,8 +396,8 @@ static void (^reachabilityChangeBlock)(int); } // list of primitives - NSString *arrayOfPrimitivesPet = @"NSArray"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPet + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat options:NSRegularExpressionCaseInsensitive error:nil]; match = [regexp firstMatchInString:class @@ -404,9 +405,11 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { + innerType = [class substringWithRange:[match rangeAtIndex:1]]; + resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [resultArray addObject:[self deserialize:obj class:NSStringFromClass([obj class])]]; + [resultArray addObject:[self deserialize:obj class:innerType]]; }]; return resultArray; diff --git a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala index 6747b94d4f8..3d509ca1a2d 100644 --- a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala +++ b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala @@ -90,7 +90,7 @@ class ObjcModelTest extends FlatSpec with Matchers { vars.get(0).isNotContainer should equal(true) vars.get(1).baseName should be("urls") - vars.get(1).datatype should be("NSArray*") + vars.get(1).datatype should be("NSArray* /* NSString */") vars.get(1).name should be("urls") // vars.get(1).defaultValue should be ("null") vars.get(1).baseType should be("NSArray") diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m index 6a2f7753db5..9ebc48af348 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m @@ -356,13 +356,14 @@ static void (^reachabilityChangeBlock)(int); NSTextCheckingResult *match = nil; NSMutableArray *resultArray = nil; NSMutableDictionary *resultDict = nil; + NSString *innerType = nil; // return nil if data is nil or class is nil if (!data || !class) { return nil; } - // remove "*" from class, if ends with "*" + // remove "*" from class, if ends with "*" if ([class hasSuffix:@"*"]) { class = [class substringToIndex:[class length] - 1]; } @@ -383,7 +384,7 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { - NSString *innerType = [class substringWithRange:[match rangeAtIndex:1]]; + innerType = [class substringWithRange:[match rangeAtIndex:1]]; resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { @@ -395,8 +396,8 @@ static void (^reachabilityChangeBlock)(int); } // list of primitives - NSString *arrayOfPrimitivesPet = @"NSArray"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPet + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat options:NSRegularExpressionCaseInsensitive error:nil]; match = [regexp firstMatchInString:class @@ -404,9 +405,11 @@ static void (^reachabilityChangeBlock)(int); range:NSMakeRange(0, [class length])]; if (match) { + innerType = [class substringWithRange:[match rangeAtIndex:1]]; + resultArray = [NSMutableArray arrayWithCapacity:[data count]]; [data enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [resultArray addObject:[self deserialize:obj class:NSStringFromClass([obj class])]]; + [resultArray addObject:[self deserialize:obj class:innerType]]; }]; return resultArray; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPet.h b/samples/client/petstore/objc/SwaggerClient/SWGPet.h index d78baade81a..e340e0e2b86 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPet.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGPet.h @@ -23,7 +23,7 @@ @property(nonatomic) NSString* name; -@property(nonatomic) NSArray* photoUrls; +@property(nonatomic) NSArray* /* NSString */ photoUrls; @property(nonatomic) NSArray* tags; /* pet status in the store [optional] diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h index 929b16eab1f..bcbf8c64f9b 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h @@ -59,7 +59,7 @@ /// /// /// @return NSArray* --(NSNumber*) findPetsByStatusWithCompletionBlock :(NSArray*) status +-(NSNumber*) findPetsByStatusWithCompletionBlock :(NSArray* /* NSString */) status completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock; @@ -74,7 +74,7 @@ /// /// /// @return NSArray* --(NSNumber*) findPetsByTagsWithCompletionBlock :(NSArray*) tags +-(NSNumber*) findPetsByTagsWithCompletionBlock :(NSArray* /* NSString */) tags completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m index 15f4af0564e..91386db77ef 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m @@ -260,7 +260,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; /// /// @returns NSArray* /// --(NSNumber*) findPetsByStatusWithCompletionBlock: (NSArray*) status +-(NSNumber*) findPetsByStatusWithCompletionBlock: (NSArray* /* NSString */) status completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock { @@ -341,7 +341,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; /// /// @returns NSArray* /// --(NSNumber*) findPetsByTagsWithCompletionBlock: (NSArray*) tags +-(NSNumber*) findPetsByTagsWithCompletionBlock: (NSArray* /* NSString */) tags completionHandler: (void (^)(NSArray* output, NSError* error))completionBlock { diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m index a86ff7d01e4..687eb5db7a3 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m @@ -55,6 +55,14 @@ XCTAssertTrue([result isEqualToString:data]); } +- (void)testDeserializeListOfString { + NSArray *data = @[@"test string"]; + NSArray *result = [apiClient deserialize:data class:@"NSArray* /* NSString */"]; + + XCTAssertTrue([result isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0] isKindOfClass:[NSString class]]); +} + - (void)testDeserializeListOfModels { NSArray *data = @[ @@ -131,4 +139,14 @@ XCTAssertTrue([result[@"foo"][@"bar"] isKindOfClass:[NSNumber class]]); } +- (void)testDeserializeNestedList { + NSArray *data = @[@[@"foo"]]; + + NSArray *result = [apiClient deserialize:data class:@"NSArray* /* NSArray* /* NSString */ */"]; + + XCTAssertTrue([result isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0] isKindOfClass:[NSArray class]]); + XCTAssertTrue([result[0][0] isKindOfClass:[NSString class]]); +} + @end