Skip to content

Commit 6f5cdd5

Browse files
committed
[haskell-http-client] add support for auth methods
* add support for auth methods * use newtypes for required params * fix duplicate operationId issues
1 parent 2e5289c commit 6f5cdd5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+4908
-4088
lines changed

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

Lines changed: 121 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,14 @@
55
import io.swagger.models.ModelImpl;
66
import io.swagger.models.Operation;
77
import io.swagger.models.Swagger;
8-
import io.swagger.models.properties.ArrayProperty;
9-
import io.swagger.models.properties.MapProperty;
10-
import io.swagger.models.properties.Property;
8+
import io.swagger.models.properties.*;
119

1210
import java.util.*;
1311
import java.util.regex.Pattern;
1412

1513
import org.apache.commons.io.FileUtils;
1614

15+
import io.swagger.models.auth.SecuritySchemeDefinition;
1716
import io.swagger.codegen.CliOption;
1817
import io.swagger.codegen.CodegenConstants;
1918
import io.swagger.codegen.CodegenModel;
@@ -26,6 +25,7 @@
2625
import java.io.File;
2726

2827
import org.apache.commons.lang3.StringUtils;
28+
import org.apache.commons.lang3.StringEscapeUtils;
2929
import org.apache.commons.lang3.text.WordUtils;
3030

3131
import java.util.regex.Matcher;
@@ -65,8 +65,8 @@ public class HaskellHttpClientCodegen extends DefaultCodegen implements CodegenC
6565
static final String MEDIA_IS_JSON = "x-mediaIsJson";
6666

6767

68-
protected Map<String, CodegenParameter> uniqueOptionalParamsByName = new HashMap<String, CodegenParameter>();
69-
protected Map<String, CodegenModel> modelNames = new HashMap<String, CodegenModel>();
68+
protected Map<String, CodegenParameter> uniqueParamsByName = new HashMap<String, CodegenParameter>();
69+
protected Set<String> typeNames = new HashSet<String>();
7070
protected Map<String, Map<String,String>> allMimeTypes = new HashMap<String, Map<String,String>>();
7171
protected Map<String, String> knownMimeDataTypes = new HashMap<String, String>();
7272
protected Map<String, Set<String>> modelMimeTypes = new HashMap<String, Set<String>>();
@@ -466,42 +466,45 @@ public String toInstantiationType(Property p) {
466466
public CodegenOperation fromOperation(String resourcePath, String httpMethod, Operation operation, Map<String, Model> definitions, Swagger swagger) {
467467
CodegenOperation op = super.fromOperation(resourcePath, httpMethod, operation, definitions, swagger);
468468

469-
op.vendorExtensions.put("x-baseOperationId", op.operationId);
469+
String operationType = toTypeName("Op", op.operationId);
470+
op.vendorExtensions.put("x-operationType", operationType);
471+
typeNames.add(operationType);
472+
470473
op.vendorExtensions.put("x-haddockPath", String.format("%s %s", op.httpMethod, op.path.replace("/", "\\/")));
471-
op.operationId = toVarName(op.operationId);
472-
op.vendorExtensions.put("x-operationType", toTypeName("Op", op.operationId));
473474
op.vendorExtensions.put("x-hasBodyOrFormParam", op.getHasBodyParam() || op.getHasFormParams());
474475

475476
for (CodegenParameter param : op.allParams) {
476-
param.vendorExtensions.put("x-operationType", WordUtils.capitalize(op.operationId));
477+
param.vendorExtensions.put("x-operationType", operationType);
477478
param.vendorExtensions.put("x-isBodyOrFormParam", param.isBodyParam || param.isFormParam);
478479
if (!StringUtils.isBlank(param.collectionFormat)) {
479480
param.vendorExtensions.put("x-collectionFormat", mapCollectionFormat(param.collectionFormat));
480481
}
481-
if (!param.required) {
482+
if(!param.required) {
482483
op.vendorExtensions.put("x-hasOptionalParams", true);
483-
484+
}
485+
if (typeMapping.containsKey(param.dataType) || param.isPrimitiveType || param.isListContainer || param.isMapContainer || param.isFile) {
484486
String paramNameType = toTypeName("Param", param.paramName);
485487

486-
if (uniqueOptionalParamsByName.containsKey(paramNameType)) {
487-
CodegenParameter lastParam = this.uniqueOptionalParamsByName.get(paramNameType);
488+
if (uniqueParamsByName.containsKey(paramNameType)) {
489+
CodegenParameter lastParam = this.uniqueParamsByName.get(paramNameType);
488490
if (lastParam.dataType != null && lastParam.dataType.equals(param.dataType)) {
489491
param.vendorExtensions.put("x-duplicate", true);
490492
} else {
491493
paramNameType = paramNameType + param.dataType;
492-
while (modelNames.containsKey(paramNameType)) {
494+
while (typeNames.contains(paramNameType)) {
493495
paramNameType = generateNextName(paramNameType);
494496
}
497+
uniqueParamsByName.put(paramNameType, param);
495498
}
496499
} else {
497-
while (modelNames.containsKey(paramNameType)) {
500+
while (typeNames.contains(paramNameType)) {
498501
paramNameType = generateNextName(paramNameType);
499502
}
500-
uniqueOptionalParamsByName.put(paramNameType, param);
503+
uniqueParamsByName.put(paramNameType, param);
501504
}
502505

503506
param.vendorExtensions.put("x-paramNameType", paramNameType);
504-
op.vendorExtensions.put("x-hasBodyOrFormParam", op.getHasBodyParam() || op.getHasFormParams());
507+
typeNames.add(paramNameType);
505508
}
506509
}
507510
if (op.getHasPathParams()) {
@@ -572,7 +575,18 @@ public CodegenOperation fromOperation(String resourcePath, String httpMethod, Op
572575

573576
return op;
574577
}
575-
578+
579+
public List<CodegenSecurity> fromSecurity(Map<String, SecuritySchemeDefinition> schemes) {
580+
List<CodegenSecurity> secs = super.fromSecurity(schemes);
581+
for(CodegenSecurity sec : secs) {
582+
String prefix = "";
583+
if(sec.isBasic) prefix = "AuthBasic";
584+
if(sec.isApiKey) prefix = "AuthApiKey";
585+
if(sec.isOAuth) prefix = "AuthOAuth";
586+
sec.name = prefix + toTypeName("",sec.name);
587+
}
588+
return secs;
589+
}
576590

577591
@Override
578592
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
@@ -586,6 +600,7 @@ public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
586600

587601
additionalProperties.put("x-hasUnknownMimeTypes", !unknownMimeTypes.isEmpty());
588602
additionalProperties.put("x-unknownMimeTypes", unknownMimeTypes);
603+
additionalProperties.put("x-allUniqueParams", uniqueParamsByName.values());
589604

590605
return ret;
591606
}
@@ -619,12 +634,13 @@ public Map<String, Object> postProcessOperationsWithModels(Map<String, Object> o
619634
public CodegenModel fromModel(String name, Model mod, Map<String, Model> allDefinitions) {
620635
CodegenModel model = super.fromModel(name, mod, allDefinitions);
621636

622-
while (uniqueOptionalParamsByName.containsKey(model.classname)) {
637+
while (typeNames.contains(model.classname)) {
623638
model.classname = generateNextName(model.classname);
624639
}
640+
typeNames.add(model.classname);
625641

626642
// From the model name, compute the prefix for the fields.
627-
String prefix = WordUtils.uncapitalize(model.classname);
643+
String prefix = StringUtils.uncapitalize(model.classname);
628644
for (CodegenProperty prop : model.vars) {
629645
prop.name = toVarName(prefix, prop.name);
630646
}
@@ -635,7 +651,6 @@ public CodegenModel fromModel(String name, Model mod, Map<String, Model> allDefi
635651
return model;
636652
}
637653

638-
modelNames.put(model.classname, model);
639654
return model;
640655
}
641656

@@ -674,6 +689,7 @@ private void processMediaType(CodegenOperation op, Map<String, String> m) {
674689
if(StringUtils.isBlank(mediaType)) return;
675690

676691
String mimeType = getMimeDataType(mediaType);
692+
typeNames.add(mimeType);
677693
m.put(MEDIA_DATA_TYPE, mimeType);
678694
if (isJsonMimeType(mediaType)) {
679695
m.put(MEDIA_IS_JSON, "true");
@@ -761,6 +777,7 @@ private static boolean isMultipartOperation(List<Map<String, String>> consumes)
761777
}
762778
return false;
763779
}
780+
764781
@Override
765782
public String toVarName(String name) {
766783
return toVarName("", name);
@@ -794,8 +811,28 @@ public String toModelFilename(String name) {
794811
return toTypeName("Model", name);
795812
}
796813
public String toTypeName(String prefix, String name) {
797-
name = camelize(underscore(sanitizeName(name)));
798-
814+
name = escapeIdentifier(prefix, camelize(sanitizeName(name)));
815+
return name;
816+
}
817+
@Override
818+
public String toOperationId(String operationId) {
819+
if (StringUtils.isEmpty(operationId)) {
820+
throw new RuntimeException("Empty method/operation name (operationId) not allowed");
821+
}
822+
operationId = escapeIdentifier("op",camelize(sanitizeName(operationId), true));
823+
String uniqueName = operationId;
824+
String uniqueNameType = toTypeName("Op", operationId);
825+
while (typeNames.contains(uniqueNameType)) {
826+
uniqueName = generateNextName(uniqueName);
827+
uniqueNameType = toTypeName("Op", uniqueName);
828+
}
829+
typeNames.add(uniqueNameType);
830+
if(!operationId.equals(uniqueName)) {
831+
LOGGER.warn("generated unique operationId `" + uniqueName + "`");
832+
}
833+
return uniqueName;
834+
}
835+
public String escapeIdentifier(String prefix, String name) {
799836
if(StringUtils.isBlank(prefix)) return name;
800837

801838
if (isReservedWord(name)) {
@@ -815,4 +852,65 @@ public String toTypeName(String prefix, String name) {
815852
static boolean isJsonMimeType(String mime) {
816853
return mime != null && JSON_MIME_PATTERN.matcher(mime).matches();
817854
}
855+
856+
@Override
857+
public String toDefaultValue(Property p) {
858+
if (p instanceof StringProperty) {
859+
StringProperty dp = (StringProperty) p;
860+
if (dp.getDefault() != null) {
861+
return "\"" + escapeText(dp.getDefault()) + "\"";
862+
}
863+
} else if (p instanceof BooleanProperty) {
864+
BooleanProperty dp = (BooleanProperty) p;
865+
if (dp.getDefault() != null) {
866+
if (dp.getDefault().toString().equalsIgnoreCase("false"))
867+
return "False";
868+
else
869+
return "True";
870+
}
871+
} else if (p instanceof DoubleProperty) {
872+
DoubleProperty dp = (DoubleProperty) p;
873+
if (dp.getDefault() != null) {
874+
return dp.getDefault().toString();
875+
}
876+
} else if (p instanceof FloatProperty) {
877+
FloatProperty dp = (FloatProperty) p;
878+
if (dp.getDefault() != null) {
879+
return dp.getDefault().toString();
880+
}
881+
} else if (p instanceof IntegerProperty) {
882+
IntegerProperty dp = (IntegerProperty) p;
883+
if (dp.getDefault() != null) {
884+
return dp.getDefault().toString();
885+
}
886+
} else if (p instanceof LongProperty) {
887+
LongProperty dp = (LongProperty) p;
888+
if (dp.getDefault() != null) {
889+
return dp.getDefault().toString();
890+
}
891+
}
892+
893+
return null;
894+
}
895+
896+
// override with any special text escaping logic
897+
@SuppressWarnings("static-method")
898+
public String escapeText(String input) {
899+
if (input == null) {
900+
return input;
901+
}
902+
903+
// remove \t, \n, \r
904+
// replace \ with \\
905+
// replace " with \"
906+
// outter unescape to retain the original multi-byte characters
907+
// finally escalate characters avoiding code injection
908+
return escapeUnsafeCharacters(
909+
StringEscapeUtils.unescapeJava(
910+
StringEscapeUtils.escapeJava(input)
911+
.replace("\\/", "/"))
912+
.replaceAll("[\\t\\n\\r]"," ")
913+
.replace("\\", "\\\\")
914+
.replace("\"", "\\\""));
915+
}
818916
}

0 commit comments

Comments
 (0)