Skip to content

Commit eeb14ae

Browse files
committed
Merge pull request #3018 from mateuszmackowiak/objc/binary_data
[Objc] Proper binary data handle
2 parents 286eae9 + 7a87746 commit eeb14ae

File tree

7 files changed

+61
-50
lines changed

7 files changed

+61
-50
lines changed

modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,7 +1960,7 @@ public CodegenResponse fromResponse(String responseCode, Response response) {
19601960
}
19611961
}
19621962
r.dataType = cm.datatype;
1963-
r.isBinary = cm.datatype.toLowerCase().startsWith("byte");
1963+
r.isBinary = isDataTypeBinary(cm.datatype);
19641964
if (cm.isContainer != null) {
19651965
r.simpleType = false;
19661966
r.containerType = cm.containerType;
@@ -2129,7 +2129,7 @@ public CodegenParameter fromParameter(Parameter param, Set<String> imports) {
21292129
p.baseType = cp.baseType;
21302130
p.dataType = cp.datatype;
21312131
p.isPrimitiveType = cp.isPrimitiveType;
2132-
p.isBinary = cp.datatype.toLowerCase().startsWith("byte");
2132+
p.isBinary = isDataTypeBinary(cp.datatype);
21332133
}
21342134

21352135
// set boolean flag (e.g. isString)
@@ -2226,7 +2226,7 @@ public CodegenParameter fromParameter(Parameter param, Set<String> imports) {
22262226
p.isCookieParam = true;
22272227
} else if (param instanceof BodyParameter) {
22282228
p.isBodyParam = true;
2229-
p.isBinary = p.dataType.toLowerCase().startsWith("byte");
2229+
p.isBinary = isDataTypeBinary(p.dataType);
22302230
} else if (param instanceof FormParameter) {
22312231
if ("file".equalsIgnoreCase(((FormParameter) param).getType())) {
22322232
p.isFile = true;
@@ -2242,6 +2242,10 @@ public CodegenParameter fromParameter(Parameter param, Set<String> imports) {
22422242
return p;
22432243
}
22442244

2245+
public boolean isDataTypeBinary(String dataType) {
2246+
return dataType.toLowerCase().startsWith("byte");
2247+
}
2248+
22452249
/**
22462250
* Convert map of Swagger SecuritySchemeDefinition objects to a list of Codegen Security objects
22472251
*

modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig {
2323
public static final String GIT_REPO_URL = "gitRepoURL";
2424
public static final String DEFAULT_LICENSE = "Apache License, Version 2.0";
2525
public static final String CORE_DATA = "coreData";
26-
public static final String BinaryDataType = "ObjcClientCodegenBinaryData";
2726

2827
protected Set<String> foundationClasses = new HashSet<String>();
2928
protected String podName = "SwaggerClient";
@@ -70,8 +69,7 @@ public ObjcClientCodegen() {
7069
defaultIncludes.add("NSMutableArray");
7170
defaultIncludes.add("NSMutableDictionary");
7271
defaultIncludes.add("NSManagedObject");
73-
74-
defaultIncludes.add(BinaryDataType);
72+
defaultIncludes.add("NSData");
7573

7674
advancedMapingTypes.add("NSDictionary");
7775
advancedMapingTypes.add("NSArray");
@@ -88,6 +86,7 @@ public ObjcClientCodegen() {
8886
languageSpecificPrimitives.add("NSString");
8987
languageSpecificPrimitives.add("NSObject");
9088
languageSpecificPrimitives.add("NSDate");
89+
languageSpecificPrimitives.add("NSData");
9190
languageSpecificPrimitives.add("NSURL");
9291
languageSpecificPrimitives.add("bool");
9392
languageSpecificPrimitives.add("BOOL");
@@ -109,8 +108,9 @@ public ObjcClientCodegen() {
109108
typeMapping.put("List", "NSArray");
110109
typeMapping.put("object", "NSObject");
111110
typeMapping.put("file", "NSURL");
112-
typeMapping.put("binary", BinaryDataType);
113-
typeMapping.put("ByteArray", BinaryDataType);
111+
typeMapping.put("binary", "NSData");
112+
typeMapping.put("ByteArray", "NSData");
113+
typeMapping.put("byte", "NSData");
114114

115115
// ref: http://www.tutorialspoint.com/objective_c/objective_c_basic_syntax.htm
116116
setReservedWordsLowerCase(
@@ -143,6 +143,7 @@ public ObjcClientCodegen() {
143143
"NSObject",
144144
"NSString",
145145
"NSDate",
146+
"NSData",
146147
"NSURL",
147148
"NSDictionary")
148149
);
@@ -317,16 +318,10 @@ public String getTypeDeclaration(Property p) {
317318
if (p instanceof ArrayProperty) {
318319
ArrayProperty ap = (ArrayProperty) p;
319320
Property inner = ap.getItems();
320-
String innerType = getSwaggerType(inner);
321-
322321
String innerTypeDeclaration = getTypeDeclaration(inner);
323322
if (innerTypeDeclaration.endsWith("*")) {
324323
innerTypeDeclaration = innerTypeDeclaration.substring(0, innerTypeDeclaration.length() - 1);
325324
}
326-
327-
if(innerTypeDeclaration.equalsIgnoreCase(BinaryDataType)) {
328-
return "NSData*";
329-
}
330325
// In this condition, type of property p is array of primitive,
331326
// return container type with pointer, e.g. `NSArray*<NSString*>*'
332327
if (languageSpecificPrimitives.contains(innerTypeDeclaration)) {
@@ -363,7 +358,6 @@ public String getTypeDeclaration(Property p) {
363358
}
364359
} else {
365360
String swaggerType = getSwaggerType(p);
366-
367361
// In this condition, type of p is objective-c primitive type, e.g. `NSSNumber',
368362
// return type of p with pointer, e.g. `NSNumber*'
369363
if (languageSpecificPrimitives.contains(swaggerType) &&
@@ -394,10 +388,6 @@ public String getTypeCoreDataDeclaration(Property p) {
394388
if (innerTypeDeclaration.endsWith("*")) {
395389
innerTypeDeclaration = innerTypeDeclaration.substring(0, innerTypeDeclaration.length() - 1);
396390
}
397-
398-
if(innerTypeDeclaration.equalsIgnoreCase(BinaryDataType)) {
399-
return "NSData*";
400-
}
401391
// In this codition, type of property p is array of primitive,
402392
// return container type with pointer, e.g. `NSArray*<NSString*>*'
403393
if (languageSpecificPrimitives.contains(innerTypeDeclaration)) {
@@ -454,6 +444,11 @@ else if (languageSpecificPrimitives.contains(swaggerType)) {
454444
}
455445
}
456446

447+
@Override
448+
public boolean isDataTypeBinary(String dataType) {
449+
return dataType.toLowerCase().startsWith("nsdata");
450+
}
451+
457452
@Override
458453
public String toModelName(String type) {
459454
// model name cannot use reserved keyword

modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ static NSString * {{classPrefix}}__fileNameForResponse(NSURLResponse *response)
265265
self.requestSerializer = [AFHTTPRequestSerializer serializer];
266266
}
267267
else {
268+
self.requestSerializer = [AFHTTPRequestSerializer serializer];
268269
NSAssert(NO, @"Unsupported request type %@", requestContentType);
269270
}
270271

@@ -280,7 +281,9 @@ static NSString * {{classPrefix}}__fileNameForResponse(NSURLResponse *response)
280281
queryParams = [self.sanitizer sanitizeForSerialization:queryParams];
281282
headerParams = [self.sanitizer sanitizeForSerialization:headerParams];
282283
formParams = [self.sanitizer sanitizeForSerialization:formParams];
283-
body = [self.sanitizer sanitizeForSerialization:body];
284+
if(![body isKindOfClass:[NSData class]]) {
285+
body = [self.sanitizer sanitizeForSerialization:body];
286+
}
284287

285288
// auth setting
286289
[self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings];

modules/swagger-codegen/src/main/resources/objc/JSONRequestSerializer-body.mustache

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@
1717
withParameters:(id)parameters
1818
error:(NSError *__autoreleasing *)error
1919
{
20+
if (!parameters) {
21+
return request;
22+
}
2023
// If the body data which will be serialized isn't NSArray or NSDictionary
2124
// then put the data in the http request body directly.
2225
if ([parameters isKindOfClass:[NSArray class]] || [parameters isKindOfClass:[NSDictionary class]]) {
2326
return [super requestBySerializingRequest:request withParameters:parameters error:error];
27+
}
28+
NSMutableURLRequest *mutableRequest = [request mutableCopy];
29+
if([parameters isKindOfClass:[NSData class]]) {
30+
[mutableRequest setHTTPBody:parameters];
2431
} else {
25-
NSMutableURLRequest *mutableRequest = [request mutableCopy];
26-
27-
if (parameters) {
28-
[mutableRequest setHTTPBody:[parameters dataUsingEncoding:self.stringEncoding]];
29-
}
30-
31-
return mutableRequest;
32+
[mutableRequest setHTTPBody:[parameters dataUsingEncoding:self.stringEncoding]];
3233
}
34+
return mutableRequest;
3335
}
3436

3537
@end

modules/swagger-codegen/src/test/java/io/swagger/codegen/objc/ObjcModelTest.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
11
package io.swagger.codegen.objc;
22

3-
import io.swagger.codegen.CodegenModel;
4-
import io.swagger.codegen.CodegenOperation;
5-
import io.swagger.codegen.CodegenProperty;
6-
import io.swagger.codegen.DefaultCodegen;
3+
import io.swagger.codegen.*;
74
import io.swagger.codegen.languages.ObjcClientCodegen;
8-
import io.swagger.models.ArrayModel;
9-
import io.swagger.models.Model;
10-
import io.swagger.models.ModelImpl;
11-
import io.swagger.models.Path;
12-
import io.swagger.models.Swagger;
13-
import io.swagger.models.properties.ArrayProperty;
14-
import io.swagger.models.properties.DateTimeProperty;
15-
import io.swagger.models.properties.LongProperty;
16-
import io.swagger.models.properties.MapProperty;
17-
import io.swagger.models.properties.RefProperty;
18-
import io.swagger.models.properties.StringProperty;
5+
import io.swagger.models.*;
6+
import io.swagger.models.properties.*;
197
import io.swagger.parser.SwaggerParser;
208

219
import com.google.common.collect.Sets;
@@ -279,6 +267,20 @@ public void mapModelTest() {
279267
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("SWGChildren")).size(), 1);
280268
}
281269

270+
@Test(description = "test binary data")
271+
public void binaryDataModelTest() {
272+
final Swagger model = new SwaggerParser().read("src/test/resources/2_0/binaryDataTest.json");
273+
final DefaultCodegen codegen = new ObjcClientCodegen();
274+
final String path = "/tests/binaryResponse";
275+
final Operation p = model.getPaths().get(path).getPost();
276+
final CodegenOperation op = codegen.fromOperation(path, "post", p, model.getDefinitions());
277+
278+
Assert.assertEquals(op.returnType, "NSData*");
279+
Assert.assertEquals(op.bodyParam.dataType, "NSData*");
280+
Assert.assertTrue(op.bodyParam.isBinary);
281+
Assert.assertTrue(op.responses.get(0).isBinary);
282+
}
283+
282284
@Test(description = "create proper imports per #316")
283285
public void issue316Test() {
284286
final Swagger model = new SwaggerParser().read("src/test/resources/2_0/postBodyTest.json");

samples/client/petstore/objc/SwaggerClient/Core/SWGApiClient.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ -(NSNumber*) requestWithPath: (NSString*) path
259259
self.requestSerializer = [AFHTTPRequestSerializer serializer];
260260
}
261261
else {
262+
self.requestSerializer = [AFHTTPRequestSerializer serializer];
262263
NSAssert(NO, @"Unsupported request type %@", requestContentType);
263264
}
264265

@@ -274,7 +275,9 @@ -(NSNumber*) requestWithPath: (NSString*) path
274275
queryParams = [self.sanitizer sanitizeForSerialization:queryParams];
275276
headerParams = [self.sanitizer sanitizeForSerialization:headerParams];
276277
formParams = [self.sanitizer sanitizeForSerialization:formParams];
277-
body = [self.sanitizer sanitizeForSerialization:body];
278+
if(![body isKindOfClass:[NSData class]]) {
279+
body = [self.sanitizer sanitizeForSerialization:body];
280+
}
278281

279282
// auth setting
280283
[self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings];

samples/client/petstore/objc/SwaggerClient/Core/SWGJSONRequestSerializer.m

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ - (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
1717
withParameters:(id)parameters
1818
error:(NSError *__autoreleasing *)error
1919
{
20+
if (!parameters) {
21+
return request;
22+
}
2023
// If the body data which will be serialized isn't NSArray or NSDictionary
2124
// then put the data in the http request body directly.
2225
if ([parameters isKindOfClass:[NSArray class]] || [parameters isKindOfClass:[NSDictionary class]]) {
2326
return [super requestBySerializingRequest:request withParameters:parameters error:error];
27+
}
28+
NSMutableURLRequest *mutableRequest = [request mutableCopy];
29+
if([parameters isKindOfClass:[NSData class]]) {
30+
[mutableRequest setHTTPBody:parameters];
2431
} else {
25-
NSMutableURLRequest *mutableRequest = [request mutableCopy];
26-
27-
if (parameters) {
28-
[mutableRequest setHTTPBody:[parameters dataUsingEncoding:self.stringEncoding]];
29-
}
30-
31-
return mutableRequest;
32+
[mutableRequest setHTTPBody:[parameters dataUsingEncoding:self.stringEncoding]];
3233
}
34+
return mutableRequest;
3335
}
3436

3537
@end

0 commit comments

Comments
 (0)