diff --git a/README.md b/README.md index a7f7f4e45d9..b8fd40914b0 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,7 @@ AkkaScalaClientCodegen.java AndroidClientCodegen.java AsyncScalaClientCodegen.java CSharpClientCodegen.java +FlashClientCodegen.java JavaClientCodegen.java JaxRSServerCodegen.java NodeJSServerCodegen.java diff --git a/bin/flash-petstore.sh b/bin/flash-petstore.sh new file mode 100755 index 00000000000..20d75e8a8ac --- /dev/null +++ b/bin/flash-petstore.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/flash -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l flash -o samples/client/petstore/flash" + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java index 7872da2c707..2f186816d1e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java @@ -34,4 +34,108 @@ public class CodegenProperty { public boolean isEnum; public List _enum; public Map allowableValues; + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final CodegenProperty other = (CodegenProperty) obj; + if ((this.baseName == null) ? (other.baseName != null) : !this.baseName.equals(other.baseName)) { + return false; + } + if ((this.complexType == null) ? (other.complexType != null) : !this.complexType.equals(other.complexType)) { + return false; + } + if ((this.getter == null) ? (other.getter != null) : !this.getter.equals(other.getter)) { + return false; + } + if ((this.setter == null) ? (other.setter != null) : !this.setter.equals(other.setter)) { + return false; + } + if ((this.description == null) ? (other.description != null) : !this.description.equals(other.description)) { + return false; + } + if ((this.datatype == null) ? (other.datatype != null) : !this.datatype.equals(other.datatype)) { + return false; + } + if ((this.datatypeWithEnum == null) ? (other.datatypeWithEnum != null) : !this.datatypeWithEnum.equals(other.datatypeWithEnum)) { + return false; + } + if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) { + return false; + } + if ((this.min == null) ? (other.min != null) : !this.min.equals(other.min)) { + return false; + } + if ((this.max == null) ? (other.max != null) : !this.max.equals(other.max)) { + return false; + } + if ((this.defaultValue == null) ? (other.defaultValue != null) : !this.defaultValue.equals(other.defaultValue)) { + return false; + } + if ((this.baseType == null) ? (other.baseType != null) : !this.baseType.equals(other.baseType)) { + return false; + } + if ((this.containerType == null) ? (other.containerType != null) : !this.containerType.equals(other.containerType)) { + return false; + } + if (this.maxLength != other.maxLength && (this.maxLength == null || !this.maxLength.equals(other.maxLength))) { + return false; + } + if (this.minLength != other.minLength && (this.minLength == null || !this.minLength.equals(other.minLength))) { + return false; + } + if ((this.pattern == null) ? (other.pattern != null) : !this.pattern.equals(other.pattern)) { + return false; + } + if ((this.example == null) ? (other.example != null) : !this.example.equals(other.example)) { + return false; + } + if ((this.jsonSchema == null) ? (other.jsonSchema != null) : !this.jsonSchema.equals(other.jsonSchema)) { + return false; + } + if (this.minimum != other.minimum && (this.minimum == null || !this.minimum.equals(other.minimum))) { + return false; + } + if (this.maximum != other.maximum && (this.maximum == null || !this.maximum.equals(other.maximum))) { + return false; + } + if (this.exclusiveMinimum != other.exclusiveMinimum && (this.exclusiveMinimum == null || !this.exclusiveMinimum.equals(other.exclusiveMinimum))) { + return false; + } + if (this.exclusiveMaximum != other.exclusiveMaximum && (this.exclusiveMaximum == null || !this.exclusiveMaximum.equals(other.exclusiveMaximum))) { + return false; + } + if (this.required != other.required && (this.required == null || !this.required.equals(other.required))) { + return false; + } + if (this.secondaryParam != other.secondaryParam && (this.secondaryParam == null || !this.secondaryParam.equals(other.secondaryParam))) { + return false; + } + if (this.isPrimitiveType != other.isPrimitiveType && (this.isPrimitiveType == null || !this.isPrimitiveType.equals(other.isPrimitiveType))) { + return false; + } + if (this.isContainer != other.isContainer && (this.isContainer == null || !this.isContainer.equals(other.isContainer))) { + return false; + } + if (this.isNotContainer != other.isNotContainer && (this.isNotContainer == null || !this.isNotContainer.equals(other.isNotContainer))) { + return false; + } + if (this.isEnum != other.isEnum) { + return false; + } + if (this._enum != other._enum && (this._enum == null || !this._enum.equals(other._enum))) { + return false; + } + if (this.allowableValues != other.allowableValues && (this.allowableValues == null || !this.allowableValues.equals(other.allowableValues))) { + return false; + } + return true; + } + + } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 179387a0b37..954c106bdfe 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -64,7 +64,7 @@ import java.util.regex.Pattern; public class DefaultCodegen { - private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); + protected static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); protected String outputFolder = ""; protected Set defaultIncludes = new HashSet(); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index 37d65473487..3b484dc9fdf 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -13,6 +13,7 @@ import io.swagger.models.Path; import io.swagger.models.Swagger; import io.swagger.models.auth.OAuth2Definition; import io.swagger.models.auth.SecuritySchemeDefinition; +import io.swagger.models.parameters.Parameter; import io.swagger.util.Json; import org.apache.commons.io.IOUtils; @@ -387,12 +388,12 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { for (String resourcePath : paths.keySet()) { Path path = paths.get(resourcePath); - processOperation(resourcePath, "get", path.getGet(), ops); - processOperation(resourcePath, "put", path.getPut(), ops); - processOperation(resourcePath, "post", path.getPost(), ops); - processOperation(resourcePath, "delete", path.getDelete(), ops); - processOperation(resourcePath, "patch", path.getPatch(), ops); - processOperation(resourcePath, "options", path.getOptions(), ops); + processOperation(resourcePath, "get", path.getGet(), ops, path); + processOperation(resourcePath, "put", path.getPut(), ops, path); + processOperation(resourcePath, "post", path.getPost(), ops, path); + processOperation(resourcePath, "delete", path.getDelete(), ops, path); + processOperation(resourcePath, "patch", path.getPatch(), ops, path); + processOperation(resourcePath, "options", path.getOptions(), ops, path); } return ops; } @@ -405,14 +406,35 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return map.get(name); } - - public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations) { + public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { if (operation != null) { List tags = operation.getTags(); if (tags == null) { tags = new ArrayList(); tags.add("default"); } + + /* + build up a set of parameter "ids" defined at the operation level + per the swagger 2.0 spec "A unique parameter is defined by a combination of a name and location" + i'm assuming "location" == "in" + */ + Set operationParameters = new HashSet(); + if (operation.getParameters() != null) { + for (Parameter parameter : operation.getParameters()) { + operationParameters.add(generateParameterId(parameter)); + } + } + + //need to propagate path level down to the operation + if(path.getParameters() != null) { + for (Parameter parameter : path.getParameters()) { + //skip propagation if a parameter with the same name is already defined at the operation level + if (!operationParameters.contains(generateParameterId(parameter))) { + operation.addParameter(parameter); + } + } + } for (String tag : tags) { CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions()); @@ -458,6 +480,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } + private String generateParameterId(Parameter parameter) { + return parameter.getName() + ":" + parameter.getIn(); + } + protected String sanitizeTag(String tag) { // remove spaces and make strong case String[] parts = tag.split(" "); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java new file mode 100755 index 00000000000..ca0979fb694 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java @@ -0,0 +1,367 @@ +package io.swagger.codegen.languages; + +import io.swagger.codegen.CliOption; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenType; +import io.swagger.codegen.DefaultCodegen; +import io.swagger.codegen.SupportingFile; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.AbstractNumericProperty; +import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; +import io.swagger.models.properties.DateProperty; +import io.swagger.models.properties.DateTimeProperty; +import io.swagger.models.properties.DecimalProperty; +import io.swagger.models.properties.DoubleProperty; +import io.swagger.models.properties.FloatProperty; +import io.swagger.models.properties.IntegerProperty; +import io.swagger.models.properties.LongProperty; +import io.swagger.models.properties.MapProperty; +import io.swagger.models.properties.Property; +import io.swagger.models.properties.PropertyBuilder; +import io.swagger.models.properties.RefProperty; +import io.swagger.models.properties.StringProperty; + +import java.io.File; +import java.util.Arrays; +import java.util.HashSet; +import java.util.HashMap; + +import org.apache.commons.lang.StringUtils; + +public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String packageName = "io.swagger"; + protected String packageVersion = null; + + protected String invokerPackage = "io.swagger"; + protected String sourceFolder = "src/main/flex"; + + public FlashClientCodegen() { + super(); + + modelPackage = "io.swagger.client.model"; + apiPackage = "io.swagger.client.api"; + outputFolder = "generated-code" + File.separatorChar + "flash"; + modelTemplateFiles.put("model.mustache", ".as"); + modelTemplateFiles.put("modelList.mustache", "List.as"); + apiTemplateFiles.put("api.mustache", ".as"); + templateDir = "flash"; + + languageSpecificPrimitives.clear(); + languageSpecificPrimitives.add("Number"); + languageSpecificPrimitives.add("Boolean"); + languageSpecificPrimitives.add("String"); + languageSpecificPrimitives.add("Date"); + languageSpecificPrimitives.add("Array"); + languageSpecificPrimitives.add("Dictionary"); + + typeMapping.clear(); + typeMapping.put("integer", "Number"); + typeMapping.put("float", "Number"); + typeMapping.put("long", "Number"); + typeMapping.put("double", "Number"); + typeMapping.put("array", "Array"); + typeMapping.put("map", "Dictionary"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("string", "String"); + typeMapping.put("date", "Date"); + typeMapping.put("DateTime", "Date"); + typeMapping.put("object", "Object"); + typeMapping.put("file", "File"); + + importMapping = new HashMap(); + importMapping.put("File", "flash.filesystem.File"); + + // from + reservedWords = new HashSet( + Arrays.asList( +"add", "for", "lt", "tellTarget", "and", "function", "ne", "this", "break", "ge", "new", "typeof", "continue", "gt", "not", "var", "delete", "if", "on", "void", "do", "ifFrameLoaded", "onClipEvent", "while", "else", "in", "or", "with", "eq", "le", "return")); + + cliOptions.clear(); + cliOptions.add(new CliOption("packageName", "flash package name (convention: package.name), default: io.swagger")); + cliOptions.add(new CliOption("packageVersion", "flash package version, default: 1.0.0")); + cliOptions.add(new CliOption("invokerPackage", "root package for generated code")); + cliOptions.add(new CliOption("sourceFolder", "source folder for generated code. e.g. src/main/flex")); + + } + + @Override + public void processOpts() { + super.processOpts(); + + if (additionalProperties.containsKey("invokerPackage")) { + this.setInvokerPackage((String) additionalProperties.get("invokerPackage")); + } else { + //not set, use default to be passed to template + additionalProperties.put("invokerPackage", invokerPackage); + } + + if (additionalProperties.containsKey("sourceFolder")) { + this.setSourceFolder((String) additionalProperties.get("sourceFolder")); + } + + if (additionalProperties.containsKey("packageName")) { + setPackageName((String) additionalProperties.get("packageName")); + apiPackage = packageName + ".client.api"; + modelPackage = packageName + ".client.model"; + } + else { + setPackageName("io.swagger"); + } + + if (additionalProperties.containsKey("packageVersion")) { + setPackageVersion((String) additionalProperties.get("packageVersion")); + } + else { + setPackageVersion("1.0.0"); + } + + additionalProperties.put("packageName", packageName); + additionalProperties.put("packageVersion", packageVersion); + + //modelPackage = invokerPackage + File.separatorChar + "client" + File.separatorChar + "model"; + //apiPackage = invokerPackage + File.separatorChar + "client" + File.separatorChar + "api"; + + final String invokerFolder = (sourceFolder + File.separator + invokerPackage + File.separator + "swagger" + File.separator).replace(".", File.separator).replace('.', File.separatorChar); + + supportingFiles.add(new SupportingFile("ApiInvoker.as", invokerFolder + "common", "ApiInvoker.as")); + supportingFiles.add(new SupportingFile("ApiUrlHelper.as", invokerFolder + "common", "ApiUrlHelper.as")); + supportingFiles.add(new SupportingFile("ApiUserCredentials.as", invokerFolder + "common", "ApiUserCredentials.as")); + supportingFiles.add(new SupportingFile("ListWrapper.as", invokerFolder + "common", "ListWrapper.as")); + supportingFiles.add(new SupportingFile("SwaggerApi.as", invokerFolder + "common", "SwaggerApi.as")); + supportingFiles.add(new SupportingFile("XMLWriter.as", invokerFolder + "common", "XMLWriter.as")); + supportingFiles.add(new SupportingFile("ApiError.as", invokerFolder + "exception", "ApiErrors.as")); + supportingFiles.add(new SupportingFile("ApiErrorCodes.as", invokerFolder + "exception", "ApiErrorCodes.as")); + supportingFiles.add(new SupportingFile("ApiClientEvent.as", invokerFolder + "event", "ApiClientEvent.as")); + supportingFiles.add(new SupportingFile("Response.as", invokerFolder + "event", "Response.as")); + supportingFiles.add(new SupportingFile("build.properties", sourceFolder, "build.properties")); + supportingFiles.add(new SupportingFile("build.xml", sourceFolder, "build.xml")); + supportingFiles.add(new SupportingFile("AirExecutorApp-app.xml", sourceFolder + File.separatorChar + "bin", "AirExecutorApp-app.xml")); + supportingFiles.add(new SupportingFile("ASAXB-0.1.1.swc", sourceFolder + File.separatorChar + "lib", "ASAXB-0.1.1.swc")); + supportingFiles.add(new SupportingFile("as3corelib.swc", sourceFolder + File.separatorChar + "lib", "as3corelib.swc")); + supportingFiles.add(new SupportingFile("flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc", sourceFolder + File.separator + "lib" + File.separator + "ext", "flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc")); + supportingFiles.add(new SupportingFile("flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc", sourceFolder + File.separator + "lib" + File.separator + "ext", "flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc")); + supportingFiles.add(new SupportingFile("flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc", sourceFolder + File.separator + "lib" + File.separator + "ext", "flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc")); + supportingFiles.add(new SupportingFile("flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc", sourceFolder + File.separator + "lib" + File.separator + "ext", "flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc")); + } + + private static String dropDots(String str) { + return str.replaceAll("\\.", "_"); + } + + public CodegenType getTag() { + return CodegenType.CLIENT; + } + + public String getName() { + return "flash"; + } + + public String getHelp() { + return "Generates a Flash client library."; + } + + @Override + public String escapeReservedWord(String name) { + return name + "_"; + } + + @Override + public String apiFileFolder() { + return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + } + + public String modelFileFolder() { + return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); + } + + @Override + public String getTypeDeclaration(Property p) { + if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + Property inner = ap.getItems(); + return getSwaggerType(p); + } else if (p instanceof MapProperty) { + MapProperty mp = (MapProperty) p; + Property inner = mp.getAdditionalProperties(); + + return getSwaggerType(p); + } + return super.getTypeDeclaration(p); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if (typeMapping.containsKey(swaggerType)) { + type = typeMapping.get(swaggerType); + if (languageSpecificPrimitives.contains(type)) { + return type; + } + } else { + type = toModelName(swaggerType); + } + return type; + } + + public String toDefaultValue(Property p) { + if (p instanceof StringProperty) { + return "null"; + } else if (p instanceof BooleanProperty) { + return "false"; + } else if (p instanceof DateProperty) { + return "null"; + } else if (p instanceof DateTimeProperty) { + return "null"; + } else if (p instanceof DoubleProperty) { + DoubleProperty dp = (DoubleProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + return "0.0"; + } else if (p instanceof FloatProperty) { + FloatProperty dp = (FloatProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + return "0.0"; + } else if (p instanceof IntegerProperty) { + IntegerProperty dp = (IntegerProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + return "0"; + } else if (p instanceof LongProperty) { + LongProperty dp = (LongProperty) p; + if (dp.getDefault() != null) { + return dp.getDefault().toString(); + } + return "0"; + } else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new Dictionary()"; + } else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new Array()"; + } else { + return "null"; + } + } + + @Override + public String toVarName(String name) { + // replace - with _ e.g. created-at => created_at + name = name.replaceAll("-", "_"); + + // if it's all uppper case, convert to lower case + if (name.matches("^[A-Z_]*$")) { + name = name.toLowerCase(); + } + + // underscore the variable name + // petId => pet_id + name = camelize(dropDots(name), true); + + // for reserved word or word starting with number, append _ + if (reservedWords.contains(name) || name.matches("^\\d.*")) { + name = escapeReservedWord(name); + } + + return name; + } + + @Override + public String toParamName(String name) { + // should be the same as variable name + return toVarName(name); + } + + @Override + public String toModelName(String name) { + // model name cannot use reserved keyword, e.g. return + if (reservedWords.contains(name)) { + throw new RuntimeException(name + " (reserved word) cannot be used as a model name"); + } + + // camelize the model name + // phone_number => PhoneNumber + return camelize(name); + } + + @Override + public String toModelFilename(String name) { + // model name cannot use reserved keyword, e.g. return + if (reservedWords.contains(name)) { + throw new RuntimeException(name + " (reserved word) cannot be used as a model name"); + } + + // underscore the model file name + // PhoneNumber => phone_number + return camelize(dropDots(name)); + } + + @Override + public String toApiFilename(String name) { + // replace - with _ e.g. created-at => created_at + name = name.replaceAll("-", "_"); + + // e.g. PhoneNumberApi.rb => phone_number_api.rb + return camelize(name) + "Api"; + } + + @Override + public String toApiName(String name) { + if (name.length() == 0) { + return "DefaultApi"; + } + // e.g. phone_number_api => PhoneNumberApi + return camelize(name) + "Api"; + } + + @Override + public String toApiVarName(String name) { + if (name.length() == 0) { + return "DefaultApi"; + } + return camelize(name) + "Api"; + } + + @Override + public String toOperationId(String operationId) { + // throw exception if method name is empty + if (StringUtils.isEmpty(operationId)) { + throw new RuntimeException("Empty method name (operationId) not allowed"); + } + + // method name cannot use reserved keyword, e.g. return + if (reservedWords.contains(operationId)) { + throw new RuntimeException(operationId + " (reserved word) cannot be used as method name"); + } + + return underscore(operationId); + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public void setPackageVersion(String packageVersion) { + this.packageVersion = packageVersion; + } + + public void setInvokerPackage(String invokerPackage) { + this.invokerPackage = invokerPackage; + } + + public void setSourceFolder(String sourceFolder) { + this.sourceFolder = sourceFolder; + } + +} + + diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index e5437f2fcb8..171753fc51e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -1,17 +1,30 @@ package io.swagger.codegen.languages; +import com.google.common.base.Strings; import io.swagger.codegen.CliOption; import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.CodegenModel; +import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; +import io.swagger.models.ComposedModel; +import io.swagger.models.Model; +import io.swagger.models.ModelImpl; +import io.swagger.models.RefModel; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; +import io.swagger.models.properties.StringProperty; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.apache.commons.lang.StringUtils; @@ -21,7 +34,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { protected String artifactId = "swagger-java-client"; protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src/main/java"; - + protected String localVariablePrefix = ""; public JavaClientCodegen() { super(); outputFolder = "generated-code/java"; @@ -61,6 +74,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption("artifactId", "artifactId in generated pom.xml")); cliOptions.add(new CliOption("artifactVersion", "artifact version in generated pom.xml")); cliOptions.add(new CliOption("sourceFolder", "source folder for generated code")); + cliOptions.add(new CliOption("localVariablePrefix", "prefix for generated code members and local variables")); supportedLibraries.put("", "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.6"); @@ -115,6 +129,11 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.setSourceFolder((String) additionalProperties.get("sourceFolder")); } + + if (additionalProperties.containsKey("localVariablePrefix")) { + this.setLocalVariablePrefix((String) additionalProperties.get("localVariablePrefix")); + } + final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("ApiClient.mustache", invokerFolder, "ApiClient.java")); @@ -254,6 +273,57 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return camelize(operationId, true); } + @Override + public CodegenModel fromModel(String name, Model model, Map allDefinitions) { + CodegenModel codegenModel = super.fromModel(name, model, allDefinitions); + + if (allDefinitions != null && codegenModel != null && codegenModel.parent != null && codegenModel.hasEnums) { + final Model parentModel = allDefinitions.get(toModelName(codegenModel.parent)); + final CodegenModel parentCodegenModel = super.fromModel(codegenModel.parent, parentModel); + codegenModel = this.reconcileInlineEnums(codegenModel, parentCodegenModel); + } + + return codegenModel; + } + + private CodegenModel reconcileInlineEnums(CodegenModel codegenModel, CodegenModel parentCodegenModel) { + // This generator uses inline classes to define enums, which breaks when + // dealing with models that have subTypes. To clean this up, we will analyze + // the parent and child models, look for enums that match, and remove + // them from the child models and leave them in the parent. + // Because the child models extend the parents, the enums will be available via the parent. + + // Only bother with reconciliation if the parent model has enums. + if (parentCodegenModel.hasEnums) { + + // Get the properties for the parent and child models + final List parentModelCodegenProperties = parentCodegenModel.vars; + List codegenProperties = codegenModel.vars; + + // Iterate over all of the parent model properties + for (CodegenProperty parentModelCodegenPropery : parentModelCodegenProperties) { + // Look for enums + if (parentModelCodegenPropery.isEnum) { + // Now that we have found an enum in the parent class, + // and search the child class for the same enum. + Iterator iterator = codegenProperties.iterator(); + while (iterator.hasNext()) { + CodegenProperty codegenProperty = iterator.next(); + if (codegenProperty.isEnum && codegenProperty.equals(parentModelCodegenPropery)) { + // We found an enum in the child class that is + // a duplicate of the one in the parent, so remove it. + iterator.remove(); + } + } + } + } + + codegenModel.vars = codegenProperties; + } + + return codegenModel; + } + public void setInvokerPackage(String invokerPackage) { this.invokerPackage = invokerPackage; } @@ -273,4 +343,8 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { public void setSourceFolder(String sourceFolder) { this.sourceFolder = sourceFolder; } + + public void setLocalVariablePrefix(String localVariablePrefix) { + this.localVariablePrefix = localVariablePrefix; + } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 99121f8d297..df320797515 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -89,21 +89,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf } - @Override - public String getTypeDeclaration(Property p) { - if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - Property inner = ap.getItems(); - return getSwaggerType(p) + "<" + getTypeDeclaration(inner) + ">"; - } else if (p instanceof MapProperty) { - MapProperty mp = (MapProperty) p; - Property inner = mp.getAdditionalProperties(); - - return getTypeDeclaration(inner); - } - return super.getTypeDeclaration(p); - } - @Override public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { String basePath = resourcePath; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java index 28a0abfb6f7..5d0a7034537 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java @@ -9,11 +9,19 @@ import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import java.io.File; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig { protected String apiVersion = "1.0.0"; @@ -197,4 +205,50 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig } return objs; } + + @SuppressWarnings("unchecked") + private Map getOperations(Map objs) { + Map apiInfo = (Map) objs.get("apiInfo"); + List> apis = (List>) apiInfo.get("apis"); + Map api = apis.get(0); + return (Map) api.get("operations"); + } + + private List> sortOperationsByPath(List ops) { + Multimap opsByPath = ArrayListMultimap.create(); + + for (CodegenOperation op : ops) { + opsByPath.put(op.path, op); + } + + List> opsByPathList = new ArrayList>(); + for (Entry> entry : opsByPath.asMap().entrySet()) { + Map opsByPathEntry = new HashMap(); + opsByPathList.add(opsByPathEntry); + opsByPathEntry.put("path", entry.getKey()); + opsByPathEntry.put("operation", entry.getValue()); + List operationsForThisPath = Lists.newArrayList(entry.getValue()); + operationsForThisPath.get(operationsForThisPath.size() - 1).hasMore = null; + if (opsByPathList.size() < opsByPath.asMap().size()) { + opsByPathEntry.put("hasMore", "true"); + } + } + + return opsByPathList; + } + + @Override + public Map postProcessSupportingFileData(Map objs) { + Map operations = getOperations(objs); + + if (operations != null) { + @SuppressWarnings("unchecked") + List ops = (List) operations.get("operation"); + + List> opsByPathList = sortOperationsByPath(ops); + operations.put("operationsByPath", opsByPathList); + } + + return super.postProcessSupportingFileData(objs); + } } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 80f83bc2d10..d54c44a9bdd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -159,15 +159,17 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toVarName(String name) { + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + // parameter name starting with number won't compile // need to escape it by appending _ at the beginning - if (name.matches("^[0-9]")) { + if (name.matches("^\\d.*")) { name = "_" + name; } - // return the name in underscore style - // PhoneNumber => phone_number - return underscore(name); + return name; } @Override diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index 1b40cc0a30e..eaf758cf1c4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -79,12 +79,12 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("object", "object"); typeMapping.put("DateTime", "\\DateTime"); - cliOptions.add(new CliOption("invokerPackage", "The main namespace to use for all classes.")); - cliOptions.add(new CliOption("packagePath", "The main package name for classes.")); + cliOptions.add(new CliOption("invokerPackage", "The main namespace to use for all classes. e.g. Yay\\Pets")); + cliOptions.add(new CliOption("packagePath", "The main package name for classes. e.g. GeneratedPetstore")); cliOptions.add(new CliOption("srcBasePath", "The directory under packagePath to serve as source root.")); - cliOptions.add(new CliOption("composerVendorName", "The vendor name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name.")); - cliOptions.add(new CliOption("composerProjectName", "The project name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name.")); - cliOptions.add(new CliOption("artifactVersion", "The version to use in the composer package version field.")); + cliOptions.add(new CliOption("composerVendorName", "The vendor name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. yaypets")); + cliOptions.add(new CliOption("composerProjectName", "The project name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. petstore-client")); + cliOptions.add(new CliOption("artifactVersion", "The version to use in the composer package version field. e.g. 1.2.3")); } public String getPackagePath() { @@ -284,15 +284,17 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { @Override public String toVarName(String name) { + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + // parameter name starting with number won't compile // need to escape it by appending _ at the beginning - if (name.matches("^[0-9]")) { + if (name.matches("^\\d.*")) { name = "_" + name; } - // return the name in underscore style - // PhoneNumber => phone_number - return underscore(name); + return name; } @Override diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java index 6b0bf895b4a..8bd4d627d56 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java @@ -154,15 +154,17 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig @Override public String toVarName(String name) { + // return the name in underscore style + // PhoneNumber => phone_number + name = underscore(name); + // parameter name starting with number won't compile // need to escape it by appending _ at the beginning - if (name.matches("^[0-9]")) { + if (name.matches("^\\d.*")) { name = "_" + name; } - // return the name in underscore style - // PhoneNumber => phone_number - return underscore(name); + return name; } @Override diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache index 4168c3a173a..a774816ca19 100644 --- a/modules/swagger-codegen/src/main/resources/Java/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -19,22 +19,22 @@ import java.util.HashMap; {{#operations}} public class {{classname}} { - private ApiClient apiClient; + private ApiClient {{localVariablePrefix}}apiClient; public {{classname}}() { this(Configuration.getDefaultApiClient()); } public {{classname}}(ApiClient apiClient) { - this.apiClient = apiClient; + this.{{localVariablePrefix}}apiClient = apiClient; } public ApiClient getApiClient() { - return apiClient; + return {{localVariablePrefix}}apiClient; } public void setApiClient(ApiClient apiClient) { - this.apiClient = apiClient; + this.{{localVariablePrefix}}apiClient = apiClient; } {{#operation}} @@ -45,7 +45,7 @@ public class {{classname}} { {{/allParams}} * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + Object {{localVariablePrefix}}postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} // verify the required parameter '{{paramName}}' is set if ({{paramName}} == null) { @@ -54,42 +54,42 @@ public class {{classname}} { {{/required}}{{/allParams}} // create path and map variables - String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}} - .replaceAll("\\{" + "{{baseName}}" + "\\}", apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}; + String {{localVariablePrefix}}path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}} + .replaceAll("\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString())){{/pathParams}}; // query params - List queryParams = new ArrayList(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); + List {{localVariablePrefix}}queryParams = new ArrayList(); + Map {{localVariablePrefix}}headerParams = new HashMap(); + Map {{localVariablePrefix}}formParams = new HashMap(); {{#queryParams}} - queryParams.addAll(apiClient.parameterToPairs("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); + {{localVariablePrefix}}queryParams.addAll({{localVariablePrefix}}apiClient.parameterToPairs("{{#collectionFormat}}{{{collectionFormat}}}{{/collectionFormat}}", "{{baseName}}", {{paramName}})); {{/queryParams}} {{#headerParams}}if ({{paramName}} != null) - headerParams.put("{{baseName}}", apiClient.parameterToString({{paramName}})); + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); {{/headerParams}} {{#formParams}}if ({{paramName}} != null) - formParams.put("{{baseName}}", {{paramName}}); + {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); {{/formParams}} - final String[] accepts = { + final String[] {{localVariablePrefix}}accepts = { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }; - final String accept = apiClient.selectHeaderAccept(accepts); + final String {{localVariablePrefix}}accept = {{localVariablePrefix}}apiClient.selectHeaderAccept({{localVariablePrefix}}accepts); - final String[] contentTypes = { + final String[] {{localVariablePrefix}}contentTypes = { {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} }; - final String contentType = apiClient.selectHeaderContentType(contentTypes); + final String {{localVariablePrefix}}contentType = {{localVariablePrefix}}apiClient.selectHeaderContentType({{localVariablePrefix}}contentTypes); - String[] authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; + String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; {{#returnType}} - TypeRef returnType = new TypeRef<{{{returnType}}}>() {}; - return apiClient.invokeAPI(path, "{{httpMethod}}", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); + TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; + return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); {{/returnType}}{{^returnType}} - apiClient.invokeAPI(path, "{{httpMethod}}", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, null); + {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); {{/returnType}} } {{/operation}} diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig index 2e514436747..e98ac462230 100644 --- a/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/io.swagger.codegen.CodegenConfig @@ -1,6 +1,7 @@ io.swagger.codegen.languages.AndroidClientCodegen io.swagger.codegen.languages.AsyncScalaClientCodegen io.swagger.codegen.languages.CSharpClientCodegen +io.swagger.codegen.languages.FlashClientCodegen io.swagger.codegen.languages.JavaClientCodegen io.swagger.codegen.languages.JaxRSServerCodegen io.swagger.codegen.languages.JavaInflectorServerCodegen diff --git a/modules/swagger-codegen/src/main/resources/flash/api.mustache b/modules/swagger-codegen/src/main/resources/flash/api.mustache index b1f11e92438..7fa8cb03d0a 100644 --- a/modules/swagger-codegen/src/main/resources/flash/api.mustache +++ b/modules/swagger-codegen/src/main/resources/flash/api.mustache @@ -56,7 +56,7 @@ public class {{classname}} extends SwaggerApi { {{#headerParams}}headerParams["{{paramName}}"] = toPathValue({{paramName}}); {{/headerParams}} - var token:AsyncToken = getApiInvoker().invokeAPI(path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams); + var token:AsyncToken = getApiInvoker().invokeAPI(path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams); var requestId: String = getUniqueId(); @@ -70,4 +70,4 @@ public class {{classname}} extends SwaggerApi { {{/operation}} } {{/operations}} -} \ No newline at end of file +} diff --git a/modules/swagger-codegen/src/main/resources/flash/model.mustache b/modules/swagger-codegen/src/main/resources/flash/model.mustache index c3369514e80..a365a99f2cf 100644 --- a/modules/swagger-codegen/src/main/resources/flash/model.mustache +++ b/modules/swagger-codegen/src/main/resources/flash/model.mustache @@ -7,34 +7,30 @@ package {{package}} { {{#model}} [XmlRootNode(name="{{classname}}")] public class {{classname}} { - {{#vars}} - - {{#description}}/* {{description}} */ - {{/description}} - - {{#isList}} + {{#vars}} + {{#description}}/* {{description}} */ + {{/description}} + {{#isContainer}} // This declaration below of _{{name}}_obj_class is to force flash compiler to include this class private var _{{name}}_obj_class: {{baseType}} = null; - [XmlElementWrapper(name="{{name}}")] - [XmlElements(name="{{nameSingular}}", type="{{baseType}}")] - {{/isList}} - {{#isNotContainer}}[XmlElement(name="{{name}}")] - {{/isNotContainer}} + [XmlElementWrapper(name="{{baseName}}")] + [XmlElements(name="{{name}}", type="{{baseType}}")] + {{/isContainer}} + {{^isContainer}}[XmlElement(name="{{baseName}}")] + {{/isContainer}} public var {{name}}: {{{datatype}}} = {{{defaultValue}}}; - {{/vars}} - public function toString(): String { - var str: String = "{{classname}}: "; - {{#vars}} - str += " ({{name}}: " + {{name}} + ")"; - {{/vars}} - return str; - } - + public function toString(): String { + var str: String = "{{classname}}: "; + {{#vars}} + str += " ({{name}}: " + {{name}} + ")"; + {{/vars}} + return str; + } } {{/model}} - {{/models}} +{{/models}} } diff --git a/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache b/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache index e4254fd0aa4..59940f08b15 100644 --- a/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache +++ b/modules/swagger-codegen/src/main/resources/nodejs/swagger.mustache @@ -12,8 +12,9 @@ "paths": { {{#apis}} {{#operations}} - {{#operation}} + {{#operationsByPath}} "{{{path}}}": { + {{#operation}} "{{httpMethod}}": { "summary": "{{summary}}", "description":"{{notes}}", @@ -29,9 +30,10 @@ {{#hasMore}},{{/hasMore}} {{/responses}} } - } + } {{#hasMore}},{{/hasMore}} + {{/operation}} } {{#hasMore}},{{/hasMore}} - {{/operation}} + {{/operationsByPath}} {{#hasMore}},{{/hasMore}} {{/operations}} {{/apis}} 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 e37d26e755b..a7d290022f6 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-body.mustache @@ -1,7 +1,5 @@ #import "{{classPrefix}}ApiClient.h" -@implementation {{classPrefix}}ApiClient - NSString *const {{classPrefix}}ResponseObjectErrorKey = @"{{classPrefix}}ResponseObject"; static long requestId = 0; @@ -9,41 +7,75 @@ static bool offlineState = false; static NSMutableSet * queuedRequests = nil; static bool cacheEnabled = false; static AFNetworkReachabilityStatus reachabilityStatus = AFNetworkReachabilityStatusNotReachable; -static NSOperationQueue* sharedQueue; static void (^reachabilityChangeBlock)(int); +@implementation {{classPrefix}}ApiClient + +- (instancetype)init { + NSString *baseUrl = [[{{classPrefix}}Configuration sharedConfig] host]; + return [self initWithBaseURL:[NSURL URLWithString:baseUrl]]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + self = [super initWithBaseURL:url]; + if (self) { + self.requestSerializer = [AFJSONRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + // configure reachability + [self configureCacheReachibility]; + } + return self; +} + ++ (void)initialize { + if (self == [{{classPrefix}}ApiClient class]) { + queuedRequests = [[NSMutableSet alloc] init]; + // initialize URL cache + [self configureCacheWithMemoryAndDiskCapacity:4*1024*1024 diskSize:32*1024*1024]; + } +} + +#pragma mark - Setter Methods + ++ (void) setOfflineState:(BOOL) state { + offlineState = state; +} + ++ (void) setCacheEnabled:(BOOL)enabled { + cacheEnabled = enabled; +} + +- (void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey { + [self.requestSerializer setValue:value forHTTPHeaderField:forKey]; +} + #pragma mark - Log Methods - (void)logResponse:(AFHTTPRequestOperation *)operation forRequest:(NSURLRequest *)request error:(NSError*)error { {{classPrefix}}Configuration *config = [{{classPrefix}}Configuration sharedConfig]; - + NSString *message = [NSString stringWithFormat:@"\n[DEBUG] Request body \n~BEGIN~\n %@\n~END~\n"\ "[DEBUG] HTTP Response body \n~BEGIN~\n %@\n~END~\n", [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding], operation.responseString]; - + if (config.loggingFileHanlder) { [config.loggingFileHanlder seekToEndOfFile]; [config.loggingFileHanlder writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; } - + NSLog(@"%@", message); } #pragma mark - Cache Methods -+ (void) setCacheEnabled:(BOOL)enabled { - cacheEnabled = enabled; -} - +(void)clearCache { [[NSURLCache sharedURLCache] removeAllCachedResponses]; } -#pragma mark - - +(void)configureCacheWithMemoryAndDiskCapacity: (unsigned long) memorySize diskSize: (unsigned long) diskSize { NSAssert(memorySize > 0, @"invalid in-memory cache size"); @@ -58,43 +90,7 @@ static void (^reachabilityChangeBlock)(int); [NSURLCache setSharedURLCache:cache]; } -+(NSOperationQueue*) sharedQueue { - return sharedQueue; -} - -+({{classPrefix}}ApiClient *)sharedClientFromPool:(NSString *)baseUrl { - static NSMutableDictionary *_pool = nil; - if (queuedRequests == nil) { - queuedRequests = [[NSMutableSet alloc]init]; - } - if(_pool == nil) { - // setup static vars - // create queue - sharedQueue = [[NSOperationQueue alloc] init]; - - // create pool - _pool = [[NSMutableDictionary alloc] init]; - - // initialize URL cache - [{{classPrefix}}ApiClient configureCacheWithMemoryAndDiskCapacity:4*1024*1024 diskSize:32*1024*1024]; - - // configure reachability - [{{classPrefix}}ApiClient configureCacheReachibilityForHost:baseUrl]; - } - - @synchronized(self) { - {{classPrefix}}ApiClient * client = [_pool objectForKey:baseUrl]; - if (client == nil) { - client = [[{{classPrefix}}ApiClient alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]]; - [_pool setValue:client forKey:baseUrl ]; - if([[{{classPrefix}}Configuration sharedConfig] debug]) - NSLog(@"new client for path %@", baseUrl); - } - if([[{{classPrefix}}Configuration sharedConfig] debug]) - NSLog(@"returning client for path %@", baseUrl); - return client; - } -} +#pragma mark - Utility Methods /* * Detect `Accept` from accepts @@ -104,13 +100,13 @@ static void (^reachabilityChangeBlock)(int); if (accepts == nil || [accepts count] == 0) { return @""; } - + NSMutableArray *lowerAccepts = [[NSMutableArray alloc] initWithCapacity:[accepts count]]; [accepts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [lowerAccepts addObject:[obj lowercaseString]]; }]; - + if ([lowerAccepts containsObject:@"application/json"]) { return @"application/json"; } @@ -127,7 +123,7 @@ static void (^reachabilityChangeBlock)(int); if (contentTypes == nil || [contentTypes count] == 0) { return @"application/json"; } - + NSMutableArray *lowerContentTypes = [[NSMutableArray alloc] initWithCapacity:[contentTypes count]]; [contentTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [lowerContentTypes addObject:[obj lowercaseString]]; @@ -141,11 +137,23 @@ static void (^reachabilityChangeBlock)(int); } } --(void)setHeaderValue:(NSString*) value - forKey:(NSString*) forKey { - [self.requestSerializer setValue:value forHTTPHeaderField:forKey]; ++ (NSString*)escape:(id)unescaped { + if([unescaped isKindOfClass:[NSString class]]){ + return (NSString *)CFBridgingRelease + (CFURLCreateStringByAddingPercentEscapes( + NULL, + (__bridge CFStringRef) unescaped, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8)); + } + else { + return [NSString stringWithFormat:@"%@", unescaped]; + } } +#pragma mark - Request Methods + +(unsigned long)requestQueueSize { return [queuedRequests count]; } @@ -171,46 +179,28 @@ static void (^reachabilityChangeBlock)(int); [queuedRequests removeObject:requestId]; } -+(NSString*) escape:(id)unescaped { - if([unescaped isKindOfClass:[NSString class]]){ - return (NSString *)CFBridgingRelease - (CFURLCreateStringByAddingPercentEscapes( - NULL, - (__bridge CFStringRef) unescaped, - NULL, - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8)); - } - else { - return [NSString stringWithFormat:@"%@", unescaped]; - } -} - -(Boolean) executeRequestWithId:(NSNumber*) requestId { NSSet* matchingItems = [queuedRequests objectsPassingTest:^BOOL(id obj, BOOL *stop) { - if([obj intValue] == [requestId intValue]) - return TRUE; - else return FALSE; + if([obj intValue] == [requestId intValue]) { + return YES; + } + else { + return NO; + } }]; if(matchingItems.count == 1) { if([[{{classPrefix}}Configuration sharedConfig] debug]) NSLog(@"removing request id %@", requestId); [queuedRequests removeObject:requestId]; - return true; + return YES; + } + else { + return NO; } - else - return false; } --(id)initWithBaseURL:(NSURL *)url { - self = [super initWithBaseURL:url]; - self.requestSerializer = [AFJSONRequestSerializer serializer]; - self.responseSerializer = [AFJSONResponseSerializer serializer]; - if (!self) - return nil; - return self; -} +#pragma mark - Reachability Methods +(AFNetworkReachabilityStatus) getReachabilityStatus { return reachabilityStatus; @@ -220,12 +210,8 @@ static void (^reachabilityChangeBlock)(int); reachabilityChangeBlock = changeBlock; } -+(void) setOfflineState:(BOOL) state { - offlineState = state; -} - -+(void) configureCacheReachibilityForHost:(NSString*)host { - [[{{classPrefix}}ApiClient sharedClientFromPool:host].reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { +- (void) configureCacheReachibility { + [self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { reachabilityStatus = status; switch (status) { case AFNetworkReachabilityStatusUnknown: @@ -254,16 +240,352 @@ static void (^reachabilityChangeBlock)(int); default: break; } + // call the reachability block, if configured if(reachabilityChangeBlock != nil) { reachabilityChangeBlock(status); } }]; - [[{{classPrefix}}ApiClient sharedClientFromPool:host].reachabilityManager startMonitoring]; + + [self.reachabilityManager startMonitoring]; } --(NSString*) pathWithQueryParamsToString:(NSString*) path - queryParams:(NSDictionary*) queryParams { +#pragma mark - Deserialize methods + +- (id) deserialize:(id) data class:(NSString *) class { + NSRegularExpression *regexp = nil; + 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 "*" + if ([class hasSuffix:@"*"]) { + class = [class substringToIndex:[class length] - 1]; + } + + // pure object + if ([class isEqualToString:@"NSObject"]) { + return [[NSObject alloc] init]; + } + + // list of models + NSString *arrayOfModelsPat = @"NSArray<(.+)>"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfModelsPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + + match = [regexp firstMatchInString:class + options:0 + 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:innerType]]; + } + ]; + + return resultArray; + } + + // list of primitives + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + match = [regexp firstMatchInString:class + options:0 + 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:innerType]]; + }]; + + return resultArray; + } + + // map + NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:dictPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + match = [regexp firstMatchInString:class + options:0 + range:NSMakeRange(0, [class length])]; + + if (match) { + NSString *valueType = [class substringWithRange:[match rangeAtIndex:2]]; + + resultDict = [NSMutableDictionary dictionaryWithCapacity:[data count]]; + [data enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [resultDict setValue:[self deserialize:obj class:valueType] forKey:key]; + }]; + + return resultDict; + } + + // primitives + NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"NSNumber"]; + + if ([primitiveTypes containsObject:class]) { + if ([class isEqualToString:@"NSString"]) { + return [NSString stringWithString:data]; + } + else if ([class isEqualToString:@"NSDate"]) { + return [NSDate dateWithISO8601String:data]; + } + else if ([class isEqualToString:@"NSNumber"]) { + // NSNumber from NSNumber + if ([data isKindOfClass:[NSNumber class]]) { + return data; + } + else if ([data isKindOfClass:[NSString class]]) { + // NSNumber (NSCFBoolean) from NSString + if ([[data lowercaseString] isEqualToString:@"true"] || [[data lowercaseString] isEqualToString:@"false"]) { + return [NSNumber numberWithBool:[data boolValue]]; + // NSNumber from NSString + } else { + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.numberStyle = NSNumberFormatterDecimalStyle; + return [formatter numberFromString:data]; + } + } + } + } + + // model + Class ModelClass = NSClassFromString(class); + if ([ModelClass instancesRespondToSelector:@selector(initWithDictionary:error:)]) { + return [[ModelClass alloc] initWithDictionary:data error:nil]; + } + + return nil; +} + +#pragma mark - Operation Methods + +- (void) operationWithCompletionBlock: (NSURLRequest *)request + requestId: (NSNumber *) requestId + completionBlock: (void (^)(id, NSError *))completionBlock { + AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request + success:^(AFHTTPRequestOperation *operation, id response) { + if([self executeRequestWithId:requestId]) { + if([[{{classPrefix}}Configuration sharedConfig] debug]) { + [self logResponse:operation forRequest:request error:nil]; + } + completionBlock(response, nil); + } + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if([self executeRequestWithId:requestId]) { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if(operation.responseObject) { + // Add in the (parsed) response body. + userInfo[{{classPrefix}}ResponseObjectErrorKey] = operation.responseObject; + } + NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; + + if([[{{classPrefix}}Configuration sharedConfig] debug]) + [self logResponse:nil forRequest:request error:augmentedError]; + completionBlock(nil, augmentedError); + } + }]; + + [self.operationQueue addOperation:op]; +} + +- (void) downloadOperationWithCompletionBlock: (NSURLRequest *)request + requestId: (NSNumber *) requestId + completionBlock: (void (^)(id, NSError *))completionBlock { + AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request + success:^(AFHTTPRequestOperation *operation, id responseObject) { + {{classPrefix}}Configuration *config = [{{classPrefix}}Configuration sharedConfig]; + NSString *directory = nil; + if (config.tempFolderPath) { + directory = config.tempFolderPath; + } + else { + directory = NSTemporaryDirectory(); + } + + NSDictionary *headers = operation.response.allHeaderFields; + NSString *filename = nil; + if ([headers objectForKey:@"Content-Disposition"]) { + + NSString *pattern = @"filename=['\"]?([^'\"\\s]+)['\"]?"; + NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern + options:NSRegularExpressionCaseInsensitive + error:nil]; + NSString *contentDispositionHeader = [headers objectForKey:@"Content-Disposition"]; + NSTextCheckingResult *match = [regexp firstMatchInString:contentDispositionHeader + options:0 + range:NSMakeRange(0, [contentDispositionHeader length])]; + filename = [contentDispositionHeader substringWithRange:[match rangeAtIndex:1]]; + } + else { + filename = [NSString stringWithFormat:@"%@", [[NSProcessInfo processInfo] globallyUniqueString]]; + } + + NSString *filepath = [directory stringByAppendingPathComponent:filename]; + NSURL *file = [NSURL fileURLWithPath:filepath]; + + [operation.responseData writeToURL:file atomically:YES]; + completionBlock(file, nil); + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + + if ([self executeRequestWithId:requestId]) { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if (operation.responseObject) { + userInfo[{{classPrefix}}ResponseObjectErrorKey] = operation.responseObject; + } + + NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; + + if ([[{{classPrefix}}Configuration sharedConfig] debug]) { + [self logResponse:nil forRequest:request error:augmentedError]; + } + + completionBlock(nil, augmentedError); + } + }]; + + [self.operationQueue addOperation:op]; +} + +#pragma mark - Perform Request Methods + +-(NSNumber*) requestWithCompletionBlock: (NSString*) path + method: (NSString*) method + queryParams: (NSDictionary*) queryParams + formParams: (NSDictionary *) formParams + files: (NSDictionary *) files + body: (id) body + headerParams: (NSDictionary*) headerParams + authSettings: (NSArray *) authSettings + requestContentType: (NSString*) requestContentType + responseContentType: (NSString*) responseContentType + responseType: (NSString *) responseType + completionBlock: (void (^)(id, NSError *))completionBlock { + // setting request serializer + if ([requestContentType isEqualToString:@"application/json"]) { + self.requestSerializer = [{{classPrefix}}JSONRequestSerializer serializer]; + } + else if ([requestContentType isEqualToString:@"application/x-www-form-urlencoded"]) { + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + } + else if ([requestContentType isEqualToString:@"multipart/form-data"]) { + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + } + else { + NSAssert(false, @"unsupport request type %@", requestContentType); + } + + // setting response serializer + if ([responseContentType isEqualToString:@"application/json"]) { + self.responseSerializer = [{{classPrefix}}JSONResponseSerializer serializer]; + } + else { + self.responseSerializer = [AFHTTPResponseSerializer serializer]; + } + + // auth setting + [self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings]; + + NSMutableURLRequest * request = nil; + + NSString* pathWithQueryParams = [self pathWithQueryParamsToString:path queryParams:queryParams]; + if ([pathWithQueryParams hasPrefix:@"/"]) { + pathWithQueryParams = [pathWithQueryParams substringFromIndex:1]; + } + + NSString* urlString = [[NSURL URLWithString:pathWithQueryParams relativeToURL:self.baseURL] absoluteString]; + if (files.count > 0) { + request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" + URLString:urlString + parameters:nil + constructingBodyWithBlock:^(id formData) { + [formParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding]; + [formData appendPartWithFormData:data name:key]; + }]; + [files enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + NSURL *filePath = (NSURL *)obj; + [formData appendPartWithFileURL:filePath name:key error:nil]; + }]; + } error:nil]; + } + else { + if (formParams) { + request = [self.requestSerializer requestWithMethod:method + URLString:urlString + parameters:formParams + error:nil]; + } + if (body) { + request = [self.requestSerializer requestWithMethod:method + URLString:urlString + parameters:body + error:nil]; + } + } + + BOOL hasHeaderParams = false; + if(headerParams != nil && [headerParams count] > 0) { + hasHeaderParams = true; + } + if(offlineState) { + NSLog(@"%@ cache forced", path); + [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; + } + else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { + NSLog(@"%@ cache enabled", path); + [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; + } + else { + NSLog(@"%@ cache disabled", path); + [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + } + + if(hasHeaderParams){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [self.requestSerializer setValue:responseContentType forHTTPHeaderField:@"Accept"]; + + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + NSNumber* requestId = [{{classPrefix}}ApiClient queueRequest]; + if ([responseType isEqualToString:@"NSURL*"]) { + [self downloadOperationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { + completionBlock(data, error); + }]; + } + else { + [self operationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { + completionBlock([self deserialize:data class:responseType], error); + }]; + } + return requestId; +} + +#pragma mark - + +- (NSString*) pathWithQueryParamsToString:(NSString*) path + queryParams:(NSDictionary*) queryParams { NSString * separator = nil; int counter = 0; @@ -323,18 +645,18 @@ static void (^reachabilityChangeBlock)(int); - (void) updateHeaderParams:(NSDictionary *__autoreleasing *)headers queryParams:(NSDictionary *__autoreleasing *)querys WithAuthSettings:(NSArray *)authSettings { - + if (!authSettings || [authSettings count] == 0) { return; } - + NSMutableDictionary *headersWithAuth = [NSMutableDictionary dictionaryWithDictionary:*headers]; NSMutableDictionary *querysWithAuth = [NSMutableDictionary dictionaryWithDictionary:*querys]; - + {{classPrefix}}Configuration *config = [{{classPrefix}}Configuration sharedConfig]; for (NSString *auth in authSettings) { NSDictionary *authSetting = [[config authSettings] objectForKey:auth]; - + if (authSetting) { if ([authSetting[@"in"] isEqualToString:@"header"]) { [headersWithAuth setObject:authSetting[@"value"] forKey:authSetting[@"key"]]; @@ -344,341 +666,9 @@ static void (^reachabilityChangeBlock)(int); } } } - + *headers = [NSDictionary dictionaryWithDictionary:headersWithAuth]; *querys = [NSDictionary dictionaryWithDictionary:querysWithAuth]; } -#pragma mark - Deserialize methods - -- (id) deserialize:(id) data class:(NSString *) class { - NSRegularExpression *regexp = nil; - 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 "*" - if ([class hasSuffix:@"*"]) { - class = [class substringToIndex:[class length] - 1]; - } - - // pure object - if ([class isEqualToString:@"NSObject"]) { - return [[NSObject alloc] init]; - } - - // list of models - NSString *arrayOfModelsPat = @"NSArray<(.+)>"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfModelsPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - - match = [regexp firstMatchInString:class - options:0 - 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:innerType]]; - } - ]; - - return resultArray; - } - - // list of primitives - NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - match = [regexp firstMatchInString:class - options:0 - 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:innerType]]; - }]; - - return resultArray; - } - - // map - NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; - regexp = [NSRegularExpression regularExpressionWithPattern:dictPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - match = [regexp firstMatchInString:class - options:0 - range:NSMakeRange(0, [class length])]; - - if (match) { - NSString *valueType = [class substringWithRange:[match rangeAtIndex:2]]; - - resultDict = [NSMutableDictionary dictionaryWithCapacity:[data count]]; - [data enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - [resultDict setValue:[self deserialize:obj class:valueType] forKey:key]; - }]; - - return resultDict; - } - - // primitives - NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"BOOL", @"NSNumber"]; - - if ([primitiveTypes containsObject:class]) { - if ([class isEqualToString:@"NSString"]) { - return [NSString stringWithString:data]; - } - else if ([class isEqualToString:@"NSDate"]) { - return [NSDate dateWithISO8601String:data]; - } - else if ([class isEqualToString:@"BOOL"]) { - // Returns YES on encountering one of "Y", "y", "T", "t", or a - // digit 1-9—the method ignores any trailing characters - // NSString => BOOL => NSNumber - return [NSNumber numberWithBool:[data boolValue]]; - } - else if ([class isEqualToString:@"NSNumber"]) { - // NSNumber from NSNumber - if ([data isKindOfClass:[NSNumber class]]) { - return data; - } - // NSNumber from NSString - else { - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - formatter.numberStyle = NSNumberFormatterDecimalStyle; - return [formatter numberFromString:data]; - } - } - } - - // model - Class ModelClass = NSClassFromString(class); - if ([ModelClass instancesRespondToSelector:@selector(initWithDictionary:error:)]) { - return [[ModelClass alloc] initWithDictionary:data error:nil]; - } - - return nil; -} - -#pragma mark - Operation Methods - -- (void) operationWithCompletionBlock: (NSURLRequest *)request - requestId: (NSNumber *) requestId - completionBlock: (void (^)(id, NSError *))completionBlock { - AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request - success:^(AFHTTPRequestOperation *operation, id response) { - if([self executeRequestWithId:requestId]) { - if([[{{classPrefix}}Configuration sharedConfig] debug]) { - [self logResponse:operation forRequest:request error:nil]; - } - completionBlock(response, nil); - } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if([self executeRequestWithId:requestId]) { - NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if(operation.responseObject) { - // Add in the (parsed) response body. - userInfo[{{classPrefix}}ResponseObjectErrorKey] = operation.responseObject; - } - NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; - - if([[{{classPrefix}}Configuration sharedConfig] debug]) - [self logResponse:nil forRequest:request error:augmentedError]; - completionBlock(nil, augmentedError); - } - }]; - - [self.operationQueue addOperation:op]; -} - -- (void) downloadOperationWithCompletionBlock: (NSURLRequest *)request - requestId: (NSNumber *) requestId - completionBlock: (void (^)(id, NSError *))completionBlock { - AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request - success:^(AFHTTPRequestOperation *operation, id responseObject) { - {{classPrefix}}Configuration *config = [{{classPrefix}}Configuration sharedConfig]; - NSString *directory = nil; - if (config.tempFolderPath) { - directory = config.tempFolderPath; - } - else { - directory = NSTemporaryDirectory(); - } - - NSDictionary *headers = operation.response.allHeaderFields; - NSString *filename = nil; - if ([headers objectForKey:@"Content-Disposition"]) { - - NSString *pattern = @"filename=['\"]?([^'\"\\s]+)['\"]?"; - NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern - options:NSRegularExpressionCaseInsensitive - error:nil]; - NSString *contentDispositionHeader = [headers objectForKey:@"Content-Disposition"]; - NSTextCheckingResult *match = [regexp firstMatchInString:contentDispositionHeader - options:0 - range:NSMakeRange(0, [contentDispositionHeader length])]; - filename = [contentDispositionHeader substringWithRange:[match rangeAtIndex:1]]; - } - else { - filename = [NSString stringWithFormat:@"%@", [[NSProcessInfo processInfo] globallyUniqueString]]; - } - - NSString *filepath = [directory stringByAppendingPathComponent:filename]; - NSURL *file = [NSURL fileURLWithPath:filepath]; - - [operation.responseData writeToURL:file atomically:YES]; - completionBlock(file, nil); - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - - if ([self executeRequestWithId:requestId]) { - NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if (operation.responseObject) { - userInfo[{{classPrefix}}ResponseObjectErrorKey] = operation.responseObject; - } - - NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; - - if ([[{{classPrefix}}Configuration sharedConfig] debug]) { - [self logResponse:nil forRequest:request error:augmentedError]; - } - - completionBlock(nil, augmentedError); - } - }]; - - [self.operationQueue addOperation:op]; -} - -#pragma mark - Perform Request Methods - --(NSNumber*) requestWithCompletionBlock: (NSString*) path - method: (NSString*) method - queryParams: (NSDictionary*) queryParams - formParams: (NSDictionary *) formParams - files: (NSDictionary *) files - body: (id) body - headerParams: (NSDictionary*) headerParams - authSettings: (NSArray *) authSettings - requestContentType: (NSString*) requestContentType - responseContentType: (NSString*) responseContentType - responseType: (NSString *) responseType - completionBlock: (void (^)(id, NSError *))completionBlock { - // setting request serializer - if ([requestContentType isEqualToString:@"application/json"]) { - self.requestSerializer = [{{classPrefix}}JSONRequestSerializer serializer]; - } - else if ([requestContentType isEqualToString:@"application/x-www-form-urlencoded"]) { - self.requestSerializer = [AFHTTPRequestSerializer serializer]; - } - else if ([requestContentType isEqualToString:@"multipart/form-data"]) { - self.requestSerializer = [AFHTTPRequestSerializer serializer]; - } - else { - NSAssert(false, @"unsupport request type %@", requestContentType); - } - - // setting response serializer - if ([responseContentType isEqualToString:@"application/json"]) { - self.responseSerializer = [{{classPrefix}}JSONResponseSerializer serializer]; - } - else { - self.responseSerializer = [AFHTTPResponseSerializer serializer]; - } - - // auth setting - [self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings]; - - NSMutableURLRequest * request = nil; - NSString* pathWithQueryParams = [self pathWithQueryParamsToString:path queryParams:queryParams]; - NSString* urlString = [[NSURL URLWithString:pathWithQueryParams relativeToURL:self.baseURL] absoluteString]; - if (files.count > 0) { - request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" - URLString:urlString - parameters:nil - constructingBodyWithBlock:^(id formData) { - [formParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding]; - [formData appendPartWithFormData:data name:key]; - }]; - [files enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - NSURL *filePath = (NSURL *)obj; - [formData appendPartWithFileURL:filePath name:key error:nil]; - }]; - } error:nil]; - } - else { - if (formParams) { - request = [self.requestSerializer requestWithMethod:method - URLString:urlString - parameters:formParams - error:nil]; - } - if (body) { - request = [self.requestSerializer requestWithMethod:method - URLString:urlString - parameters:body - error:nil]; - } - } - - BOOL hasHeaderParams = false; - if(headerParams != nil && [headerParams count] > 0) { - hasHeaderParams = true; - } - if(offlineState) { - NSLog(@"%@ cache forced", path); - [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; - } - else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { - NSLog(@"%@ cache enabled", path); - [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; - } - else { - NSLog(@"%@ cache disabled", path); - [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; - } - - if(hasHeaderParams){ - for(NSString * key in [headerParams keyEnumerator]){ - [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; - } - } - [self.requestSerializer setValue:responseContentType forHTTPHeaderField:@"Accept"]; - - - // Always disable cookies! - [request setHTTPShouldHandleCookies:NO]; - - NSNumber* requestId = [{{classPrefix}}ApiClient queueRequest]; - if ([responseType isEqualToString:@"NSURL*"]) { - [self downloadOperationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { - completionBlock(data, error); - }]; - } - else { - [self operationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { - completionBlock([self deserialize:data class:responseType], error); - }]; - } - return requestId; -} - @end - - - - diff --git a/modules/swagger-codegen/src/main/resources/objc/ApiClient-header.mustache b/modules/swagger-codegen/src/main/resources/objc/ApiClient-header.mustache index a5871400352..46d424d735f 100644 --- a/modules/swagger-codegen/src/main/resources/objc/ApiClient-header.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/ApiClient-header.mustache @@ -15,6 +15,8 @@ {{#models}}{{#model}}#import "{{classname}}.h" {{/model}}{{/models}} +@class {{classPrefix}}Configuration; + /** * A key for `NSError` user info dictionaries. * @@ -29,22 +31,6 @@ extern NSString *const {{classPrefix}}ResponseObjectErrorKey; @property(nonatomic, assign) NSTimeInterval timeoutInterval; @property(nonatomic, readonly) NSOperationQueue* queue; -/** - * Gets the Api Client instance from pool - * - * @param baseUrl The base url of api client. - * - * @return The {{classPrefix}}ApiClient instance. - */ -+({{classPrefix}}ApiClient *)sharedClientFromPool:(NSString *)baseUrl; - -/** - * Gets the operations queue - * - * @return The `shardQueue` static variable. - */ -+(NSOperationQueue*) sharedQueue; - /** * Clears Cache */ @@ -116,11 +102,9 @@ extern NSString *const {{classPrefix}}ResponseObjectErrorKey; +(void) setReachabilityChangeBlock:(void(^)(int))changeBlock; /** - * Sets the client reachability strategy - * - * @param host The host of {{classPrefix}}ApiClient. + * Sets the api client reachability strategy */ -+(void) configureCacheReachibilityForHost:(NSString*)host; +- (void)configureCacheReachibility; /** * Detects Accept header from accepts NSArray diff --git a/modules/swagger-codegen/src/main/resources/objc/Configuration-body.mustache b/modules/swagger-codegen/src/main/resources/objc/Configuration-body.mustache index 838d7e49561..9c941b107a0 100644 --- a/modules/swagger-codegen/src/main/resources/objc/Configuration-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/Configuration-body.mustache @@ -25,6 +25,8 @@ - (instancetype) init { self = [super init]; if (self) { + self.apiClient = nil; + self.host = @"{{basePath}}"; self.username = @""; self.password = @""; self.tempFolderPath = nil; diff --git a/modules/swagger-codegen/src/main/resources/objc/Configuration-header.mustache b/modules/swagger-codegen/src/main/resources/objc/Configuration-header.mustache index 6b311e968b0..c9bac508bbb 100644 --- a/modules/swagger-codegen/src/main/resources/objc/Configuration-header.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/Configuration-header.mustache @@ -1,13 +1,26 @@ #import - +#import "{{classPrefix}}ApiClient.h" + /** The `{{classPrefix}}Configuration` class manages the configurations for the sdk. * * NOTE: This class is auto generated by the swagger code generator program. * https://github.com/swagger-api/swagger-codegen * Do not edit the class manually. */ + +@class {{classPrefix}}ApiClient; + @interface {{classPrefix}}Configuration : NSObject +/** + * Default api client + */ +@property (nonatomic) {{classPrefix}}ApiClient *apiClient; + +/** + * Default base url + */ +@property (nonatomic) NSString *host; /** * Api key values for Api Key type Authentication diff --git a/modules/swagger-codegen/src/main/resources/objc/README.mustache b/modules/swagger-codegen/src/main/resources/objc/README.mustache index db2b1e5b31e..30a8927c41a 100644 --- a/modules/swagger-codegen/src/main/resources/objc/README.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/README.mustache @@ -12,6 +12,10 @@ To install it, put the API client library in your project and then simply add th pod "{{podName}}", :path => "/path/to/lib" ``` +## Recommendation + +It's recommended to create an instance of ApiClient per thread in a multithreaded environment to avoid any potential issue. + ## Author {{#apiInfo}}{{#apis}}{{^hasMore}}{{infoEmail}} diff --git a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache index fa9fa3e29a9..198c5a89fdf 100644 --- a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache @@ -11,14 +11,16 @@ @implementation {{classname}} -static NSString * basePath = @"{{basePath}}"; - #pragma mark - Initialize methods - (id) init { self = [super init]; if (self) { - self.apiClient = [{{classPrefix}}ApiClient sharedClientFromPool:basePath]; + {{classPrefix}}Configuration *config = [{{classPrefix}}Configuration sharedConfig]; + if (config.apiClient == nil) { + config.apiClient = [[{{classPrefix}}ApiClient alloc] init]; + } + self.apiClient = config.apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -27,12 +29,7 @@ static NSString * basePath = @"{{basePath}}"; - (id) initWithApiClient:({{classPrefix}}ApiClient *)apiClient { self = [super init]; if (self) { - if (apiClient) { - self.apiClient = apiClient; - } - else { - self.apiClient = [{{classPrefix}}ApiClient sharedClientFromPool:basePath]; - } + self.apiClient = apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -50,14 +47,6 @@ static NSString * basePath = @"{{basePath}}"; return singletonAPI; } -+(void) setBasePath:(NSString*)path { - basePath = path; -} - -+(NSString*) getBasePath { - return basePath; -} - -(void) addHeader:(NSString*)value forKey:(NSString*)key { [self.defaultHeaders setValue:value forKey:key]; } @@ -93,13 +82,14 @@ static NSString * basePath = @"{{basePath}}"; } {{/required}}{{/allParams}} - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@{{path}}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"{{path}}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - {{#pathParams}}[requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"{{baseName}}", @"}"]] withString: [{{classPrefix}}ApiClient escape:{{paramName}}]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + {{#pathParams}}[resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"{{baseName}}", @"}"]] withString: [{{classPrefix}}ApiClient escape:{{paramName}}]]; {{/pathParams}} NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -175,7 +165,7 @@ static NSString * basePath = @"{{basePath}}"; } {{/requiredParams}} {{/requiredParamCount}} - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"{{httpMethod}}" queryParams: queryParams formParams: formParams diff --git a/modules/swagger-codegen/src/main/resources/objc/api-header.mustache b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache index 6b85f753e45..d9f691f7227 100644 --- a/modules/swagger-codegen/src/main/resources/objc/api-header.mustache +++ b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache @@ -20,8 +20,6 @@ -(void) addHeader:(NSString*)value forKey:(NSString*)key; -(unsigned long) requestQueueSize; +({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; -+(void) setBasePath:(NSString*)basePath; -+(NSString*) getBasePath; {{#operation}} /// /// diff --git a/modules/swagger-codegen/src/main/resources/php/configuration.mustache b/modules/swagger-codegen/src/main/resources/php/configuration.mustache index 73d4000d950..981085c6378 100644 --- a/modules/swagger-codegen/src/main/resources/php/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/php/configuration.mustache @@ -89,7 +89,7 @@ class Configuration * * @var string */ - protected $host = 'http://localhost'; + protected $host = '{{basePath}}'; /** * Timeout (second) of the HTTP request, by default set to 0, no timeout @@ -103,7 +103,7 @@ class Configuration * * @var string */ - protected $userAgent = "PHP-Swagger"; + protected $userAgent = "PHP-Swagger/{{artifactVersion}}"; /** * Debug switch (default set to false) diff --git a/modules/swagger-codegen/src/main/resources/python/api_client.mustache b/modules/swagger-codegen/src/main/resources/python/api_client.mustache index 24b1e52ff3e..ca9a3c05104 100644 --- a/modules/swagger-codegen/src/main/resources/python/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/python/api_client.mustache @@ -247,12 +247,12 @@ class ApiClient(object): return None if type(klass) == str: - if 'list[' in klass: + if klass.startswith('list['): sub_kls = re.match('list\[(.*)\]', klass).group(1) return [self.__deserialize(sub_data, sub_kls) for sub_data in data] - if 'dict(' in klass: + if klass.startswith('dict('): sub_kls = re.match('dict\(([^,]*), (.*)\)', klass).group(2) return {k: self.__deserialize(v, sub_kls) for k, v in iteritems(data)} diff --git a/modules/swagger-codegen/src/main/resources/python/configuration.mustache b/modules/swagger-codegen/src/main/resources/python/configuration.mustache index f2a52cb6e84..62633cdc4a1 100644 --- a/modules/swagger-codegen/src/main/resources/python/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/python/configuration.mustache @@ -19,7 +19,13 @@ Copyright 2015 SmartBear Software from __future__ import absolute_import import base64 import urllib3 -import httplib + +try: + import httplib +except ImportError: + # python3 + import http.client as httplib + import sys import logging diff --git a/modules/swagger-codegen/src/main/resources/python/rest.mustache b/modules/swagger-codegen/src/main/resources/python/rest.mustache index f6161a6d60c..8a8e55eb3d1 100644 --- a/modules/swagger-codegen/src/main/resources/python/rest.mustache +++ b/modules/swagger-codegen/src/main/resources/python/rest.mustache @@ -216,10 +216,10 @@ class ApiException(Exception): error_message = "({0})\n"\ "Reason: {1}\n".format(self.status, self.reason) if self.headers: - error_message += "HTTP response headers: {0}".format(self.headers) + error_message += "HTTP response headers: {0}\n".format(self.headers) if self.body: - error_message += "HTTP response body: {0}".format(self.body) + error_message += "HTTP response body: {0}\n".format(self.body) return error_message diff --git a/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala index e5191e1ae23..30a70ca6dfb 100644 --- a/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala +++ b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala @@ -31,4 +31,55 @@ class JavaModelEnumTest extends FlatSpec with Matchers { enumVar.baseType should be("String") enumVar.isEnum should equal(true) } + + it should "not override identical parent enums" in { + + val identicalEnumProperty = new StringProperty() + identicalEnumProperty.setEnum(List("VALUE1", "VALUE2", "VALUE3").asJava) + + val subEnumProperty = new StringProperty() + subEnumProperty.setEnum(List("SUB1", "SUB2", "SUB3").asJava) + + // Add one enum ptoperty to the parent + val parentProperties = new java.util.HashMap[String, Property]() + parentProperties.put("sharedThing", identicalEnumProperty) + + // Add TWO enums to the subType model; one of which is identical to the one in parent class + val subProperties = new java.util.HashMap[String, Property]() + subProperties.put("sharedThing", identicalEnumProperty) + subProperties.put("unsharedThing", identicalEnumProperty) + + val parentModel = new ModelImpl(); + parentModel.setProperties(parentProperties); + parentModel.name("parentModel"); + + val subModel = new ModelImpl(); + subModel.setProperties(subProperties); + subModel.name("subModel"); + + val model = new ComposedModel() + .parent(new RefModel(parentModel.getName())) + .child(subModel) + .interfaces(new java.util.ArrayList[RefModel]()) + + val codegen = new JavaClientCodegen() + val allModels = new java.util.HashMap[String, Model]() + allModels.put(codegen.toModelName(parentModel.getName()), parentModel) + allModels.put(codegen.toModelName(subModel.getName()), subModel) + + val cm = codegen.fromModel("sample", model, allModels) + + cm.name should be("sample") + cm.classname should be("Sample") + cm.parent should be("ParentModel") + cm.imports.asScala should be(Set("ParentModel")) + + // Assert that only the unshared/uninherited enum remains + cm.vars.size should be (1) + val enumVar = cm.vars.get(0) + enumVar.baseName should be("unsharedThing") + enumVar.datatype should be("String") + enumVar.datatypeWithEnum should be("UnsharedThingEnum") + enumVar.isEnum should equal(true) + } } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 506ac465074..1d79e4936fd 100644 --- a/pom.xml +++ b/pom.xml @@ -469,10 +469,10 @@ - 1.0.10-SNAPSHOT + 1.0.10 2.11.1 2.3.4 - 1.5.3-SNAPSHOT + 1.5.4-SNAPSHOT 2.1.4 2.3 1.2 diff --git a/samples/client/petstore/flash/FlashPetstoreCodegen.scala b/samples/client/petstore/flash/FlashPetstoreCodegen.scala deleted file mode 100644 index e318765c57e..00000000000 --- a/samples/client/petstore/flash/FlashPetstoreCodegen.scala +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright 2014 Wordnik, Inc. - * - * 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. - */ - -object FlashPetstoreCodegen extends BasicFlashCodegen { - def main(args: Array[String]) = generateClient(args) - - override def packageName = "io.swagger.client" - - // where to write generated code - override def destinationDir = destinationRoot + "/src/main/flex" - - override def destinationRoot = "samples/client/petstore/flash" - - // package for models - override def modelPackage = Some("com.wordnik.client.model") - - // package for api classes - override def apiPackage = Some("com.wordnik.client.api") - - // supporting classes - override def supportingFiles = baseSupportingFiles ++ List() -} diff --git a/samples/client/petstore/flash/bin/AirExecutorApp-app.xml b/samples/client/petstore/flash/bin/AirExecutorApp-app.xml deleted file mode 100644 index 1eb5e43c7d7..00000000000 --- a/samples/client/petstore/flash/bin/AirExecutorApp-app.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - AirExecutorApp - - - AirExecutorApp - - - AirExecutorApp - - - v1 - - - - - - - - - - - - - - - AirExecutorApp.swf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/samples/client/petstore/flash/src/main/flex/bin/AirExecutorApp-app.xml b/samples/client/petstore/flash/src/main/flex/bin/AirExecutorApp-app.xml new file mode 100644 index 00000000000..1dbaf98e644 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/bin/AirExecutorApp-app.xml @@ -0,0 +1,146 @@ + + + + + + + AirExecutorApp + + + AirExecutorApp + + + AirExecutorApp + + + v1 + + + + + + + + + + + + + + + AirExecutorApp.swf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/client/petstore/flash/build.properties b/samples/client/petstore/flash/src/main/flex/build.properties similarity index 100% rename from samples/client/petstore/flash/build.properties rename to samples/client/petstore/flash/src/main/flex/build.properties diff --git a/samples/client/petstore/flash/build.xml b/samples/client/petstore/flash/src/main/flex/build.xml similarity index 89% rename from samples/client/petstore/flash/build.xml rename to samples/client/petstore/flash/src/main/flex/build.xml index 6861dd464ec..4f021b0b8b2 100644 --- a/samples/client/petstore/flash/build.xml +++ b/samples/client/petstore/flash/src/main/flex/build.xml @@ -62,11 +62,11 @@ - - - - - + + + + + diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/PetApi.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/PetApi.as deleted file mode 100644 index 88f9b42eaa0..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/PetApi.as +++ /dev/null @@ -1,272 +0,0 @@ -package com.wordnik.client.api { - -import com.wordnik.swagger.common.ApiInvoker; -import com.wordnik.swagger.exception.ApiErrorCodes; -import com.wordnik.swagger.exception.ApiError; -import com.wordnik.swagger.common.ApiUserCredentials; -import com.wordnik.swagger.event.Response; -import com.wordnik.swagger.common.SwaggerApi; -import com.wordnik.client.model.Pet; -import com.wordnik.client.model.File; - -import mx.rpc.AsyncToken; -import mx.utils.UIDUtil; - -import flash.utils.Dictionary; -import flash.events.EventDispatcher; - -public class PetApi extends SwaggerApi { - public static const event_getPetById:String = "getPetById"; - public static const event_deletePet:String = "deletePet"; - public static const event_partialUpdate:String = "partialUpdate"; - public static const event_updatePetWithForm:String = "updatePetWithForm"; - public static const event_uploadFile:String = "uploadFile"; - public static const event_addPet:String = "addPet"; - public static const event_updatePet:String = "updatePet"; - public static const event_findPetsByStatus:String = "findPetsByStatus"; - public static const event_findPetsByTags:String = "findPetsByTags"; - - /** - * Constructor for the PetApi api client - * @param apiCredentials Wrapper object for tokens and hostName required towards authentication - * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response - */ - public function PetApi(apiCredentials:ApiUserCredentials, eventDispatcher:EventDispatcher = null) { - super(apiCredentials, eventDispatcher); - } - /* - * Returns Pet */ - - public function getPetById(petId:Number):String { - // create path and map variables - var path:String = "/pet/{petId}".replace(/{format}/g, "xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (petId == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "getPetById"; - - token.returnType = Pet; - return requestId; - - } - - /* - * Returns void */ - public function deletePet(petId:String):String { - // create path and map variables - var path:String = "/pet/{petId}".replace(/{format}/g, "xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (petId == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "deletePet"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns Array[Pet] */ - public function partialUpdate(petId:String, body:Pet):String { - // create path and map variables - var path:String = "/pet/{petId}".replace(/{format}/g, "xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (petId == null || body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "PATCH", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "partialUpdate"; - - token.returnType = Array[Pet]; - return requestId; - - } - - /* - * Returns void */ - public function updatePetWithForm(petId:String, name:String, status:String):String { - // create path and map variables - var path:String = "/pet/{petId}".replace(/{format}/g, "xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (petId == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "updatePetWithForm"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function uploadFile(additionalMetadata:String, body:File):String { - // create path and map variables - var path:String = "/pet/uploadImage".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "uploadFile"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function addPet(body:Pet):String { - // create path and map variables - var path:String = "/pet".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "addPet"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function updatePet(body:Pet):String { - // create path and map variables - var path:String = "/pet".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "PUT", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "updatePet"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns Array[Pet] */ - public function findPetsByStatus(status:String = "available"):String { - // create path and map variables - var path:String = "/pet/findByStatus".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (status == null) { - throw new ApiError(400, "missing required params"); - } - if ("null" != String(status)) - queryParams["status"] = toPathValue(status); - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "findPetsByStatus"; - - token.returnType = Array[Pet]; - return requestId; - - } - - /* - * Returns Array[Pet] */ - public function findPetsByTags(tags:String):String { - // create path and map variables - var path:String = "/pet/findByTags".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (tags == null) { - throw new ApiError(400, "missing required params"); - } - if ("null" != String(tags)) - queryParams["tags"] = toPathValue(tags); - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "findPetsByTags"; - - token.returnType = Array[Pet]; - return requestId; - - } -} -} diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/StoreApi.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/StoreApi.as deleted file mode 100644 index cc4bc2c4a13..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/StoreApi.as +++ /dev/null @@ -1,109 +0,0 @@ -package com.wordnik.client.api { - -import com.wordnik.swagger.common.ApiInvoker; -import com.wordnik.swagger.exception.ApiErrorCodes; -import com.wordnik.swagger.exception.ApiError; -import com.wordnik.swagger.common.ApiUserCredentials; -import com.wordnik.swagger.event.Response; -import com.wordnik.swagger.common.SwaggerApi; -import com.wordnik.client.model.Order; - -import mx.rpc.AsyncToken; -import mx.utils.UIDUtil; - -import flash.utils.Dictionary; -import flash.events.EventDispatcher; - -public class StoreApi extends SwaggerApi { - public static const event_getOrderById:String = "getOrderById"; - public static const event_deleteOrder:String = "deleteOrder"; - public static const event_placeOrder:String = "placeOrder"; - - /** - * Constructor for the StoreApi api client - * @param apiCredentials Wrapper object for tokens and hostName required towards authentication - * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response - */ - public function StoreApi(apiCredentials:ApiUserCredentials, eventDispatcher:EventDispatcher = null) { - super(apiCredentials, eventDispatcher); - } - /* - * Returns Order */ - - public function getOrderById(orderId:String):String { - // create path and map variables - var path:String = "/store/order/{orderId}".replace(/{format}/g, "xml").replace("{" + "orderId" + "}", getApiInvoker().escapeString(orderId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (orderId == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "getOrderById"; - - token.returnType = Order; - return requestId; - - } - - /* - * Returns void */ - public function deleteOrder(orderId:String):String { - // create path and map variables - var path:String = "/store/order/{orderId}".replace(/{format}/g, "xml").replace("{" + "orderId" + "}", getApiInvoker().escapeString(orderId)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (orderId == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "deleteOrder"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function placeOrder(body:Order):String { - // create path and map variables - var path:String = "/store/order".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "placeOrder"; - - token.returnType = null; - return requestId; - - } -} -} diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/UserApi.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/UserApi.as deleted file mode 100644 index 1714b4a0381..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/api/UserApi.as +++ /dev/null @@ -1,244 +0,0 @@ -package com.wordnik.client.api { - -import com.wordnik.swagger.common.ApiInvoker; -import com.wordnik.swagger.exception.ApiErrorCodes; -import com.wordnik.swagger.exception.ApiError; -import com.wordnik.swagger.common.ApiUserCredentials; -import com.wordnik.swagger.event.Response; -import com.wordnik.swagger.common.SwaggerApi; -import com.wordnik.client.model.User; - -import mx.rpc.AsyncToken; -import mx.utils.UIDUtil; - -import flash.utils.Dictionary; -import flash.events.EventDispatcher; - -public class UserApi extends SwaggerApi { - public static const event_updateUser:String = "updateUser"; - public static const event_deleteUser:String = "deleteUser"; - public static const event_getUserByName:String = "getUserByName"; - public static const event_loginUser:String = "loginUser"; - public static const event_logoutUser:String = "logoutUser"; - public static const event_createUser:String = "createUser"; - public static const event_createUsersWithArrayInput:String = "createUsersWithArrayInput"; - public static const event_createUsersWithListInput:String = "createUsersWithListInput"; - - /** - * Constructor for the UserApi api client - * @param apiCredentials Wrapper object for tokens and hostName required towards authentication - * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response - */ - public function UserApi(apiCredentials:ApiUserCredentials, eventDispatcher:EventDispatcher = null) { - super(apiCredentials, eventDispatcher); - } - /* - * Returns void */ - - public function updateUser(username:String, body:User):String { - // create path and map variables - var path:String = "/user/{username}".replace(/{format}/g, "xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (username == null || body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "PUT", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "updateUser"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function deleteUser(username:String):String { - // create path and map variables - var path:String = "/user/{username}".replace(/{format}/g, "xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (username == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "deleteUser"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns User */ - public function getUserByName(username:String):String { - // create path and map variables - var path:String = "/user/{username}".replace(/{format}/g, "xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (username == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "getUserByName"; - - token.returnType = User; - return requestId; - - } - - /* - * Returns string */ - public function loginUser(username:String, password:String):String { - // create path and map variables - var path:String = "/user/login".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (username == null || password == null) { - throw new ApiError(400, "missing required params"); - } - if ("null" != String(username)) - queryParams["username"] = toPathValue(username); - if ("null" != String(password)) - queryParams["password"] = toPathValue(password); - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "loginUser"; - - token.returnType = string; - return requestId; - - } - - /* - * Returns void */ - public function logoutUser():String { - // create path and map variables - var path:String = "/user/logout".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "logoutUser"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function createUser(body:User):String { - // create path and map variables - var path:String = "/user".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "createUser"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function createUsersWithArrayInput(body:Array):String { - // create path and map variables - var path:String = "/user/createWithArray".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "createUsersWithArrayInput"; - - token.returnType = null; - return requestId; - - } - - /* - * Returns void */ - public function createUsersWithListInput(body:Array):String { - // create path and map variables - var path:String = "/user/createWithList".replace(/{format}/g, "xml"); - - // query params - var queryParams:Dictionary = new Dictionary(); - var headerParams:Dictionary = new Dictionary(); - - // verify required params are set - if (body == null) { - throw new ApiError(400, "missing required params"); - } - var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); - - var requestId:String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "createUsersWithListInput"; - - token.returnType = null; - return requestId; - - } -} -} diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Category.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Category.as deleted file mode 100644 index e20d3701cf7..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Category.as +++ /dev/null @@ -1,21 +0,0 @@ -package com.wordnik.client.model { - -[XmlRootNode(name="Category")] -public class Category { - [XmlElement(name="id")] - public var id:Number = 0.0; - - [XmlElement(name="name")] - public var name:String = null; - - public function toString():String { - var str:String = "Category: "; - str += " (id: " + id + ")"; - str += " (name: " + name + ")"; - return str; - } - - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/CategoryList.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/CategoryList.as deleted file mode 100644 index 48b18dbe1f4..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/CategoryList.as +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.swagger.common.ListWrapper; - -public class CategoryList implements ListWrapper { - // This declaration below of _Category_obj_class is to force flash compiler to include this class - [XmlElements(name="category", type="com.wordnik.client.model.Category")] - public var category:Array = new Array(); - private var _category_obj_class:com.wordnik.client.model.Category = null; - - public function getList():Array { - return category; - } - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Order.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Order.as deleted file mode 100644 index 5147a428ba5..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Order.as +++ /dev/null @@ -1,34 +0,0 @@ -package com.wordnik.client.model { - -[XmlRootNode(name="Order")] -public class Order { - [XmlElement(name="id")] - public var id:Number = 0.0; - - [XmlElement(name="petId")] - public var petId:Number = 0.0; - - [XmlElement(name="quantity")] - public var quantity:Number = 0.0; - - /* Order Status */ - [XmlElement(name="status")] - public var status:String = null; - - [XmlElement(name="shipDate")] - public var shipDate:Date = null; - - public function toString():String { - var str:String = "Order: "; - str += " (id: " + id + ")"; - str += " (petId: " + petId + ")"; - str += " (quantity: " + quantity + ")"; - str += " (status: " + status + ")"; - str += " (shipDate: " + shipDate + ")"; - return str; - } - - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/OrderList.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/OrderList.as deleted file mode 100644 index 56825295dd8..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/OrderList.as +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.swagger.common.ListWrapper; - -public class OrderList implements ListWrapper { - // This declaration below of _Order_obj_class is to force flash compiler to include this class - [XmlElements(name="order", type="com.wordnik.client.model.Order")] - public var order:Array = new Array(); - private var _order_obj_class:com.wordnik.client.model.Order = null; - - public function getList():Array { - return order; - } - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Pet.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Pet.as deleted file mode 100644 index 4a19692e9f1..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Pet.as +++ /dev/null @@ -1,48 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.client.model.Category; -import com.wordnik.client.model.Tag; - -[XmlRootNode(name="Pet")] -public class Pet { - /* unique identifier for the pet */ - [XmlElement(name="id")] - public var id:Number = 0.0; - - [XmlElement(name="category")] - public var category:Category = null; - - [XmlElement(name="name")] - public var name:String = null; - - // This declaration below of _photoUrls_obj_class is to force flash compiler to include this class - [XmlElementWrapper(name="photoUrls")] - [XmlElements(name="photoUrl", type="com.wordnik.client.model.String")] - public var photoUrls:Array = new Array(); - [XmlElementWrapper(name="tags")] - [XmlElements(name="tag", type="com.wordnik.client.model.Tag")] - public var tags:Array = new Array(); - - // This declaration below of _tags_obj_class is to force flash compiler to include this class - [XmlElement(name="status")] - public var status:String = null; - private var _photoUrls_obj_class:com.wordnik.client.model.String = null; - - /* pet status in the store */ - private var _tags_obj_class:com.wordnik.client.model.Tag = null; - - public function toString():String { - var str:String = "Pet: "; - str += " (id: " + id + ")"; - str += " (category: " + category + ")"; - str += " (name: " + name + ")"; - str += " (photoUrls: " + photoUrls + ")"; - str += " (tags: " + tags + ")"; - str += " (status: " + status + ")"; - return str; - } - - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/PetList.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/PetList.as deleted file mode 100644 index 61b4070a543..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/PetList.as +++ /dev/null @@ -1,19 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.swagger.common.ListWrapper; -import com.wordnik.client.model.Category; -import com.wordnik.client.model.Tag; - -public class PetList implements ListWrapper { - // This declaration below of _Pet_obj_class is to force flash compiler to include this class - [XmlElements(name="pet", type="com.wordnik.client.model.Pet")] - public var pet:Array = new Array(); - private var _pet_obj_class:com.wordnik.client.model.Pet = null; - - public function getList():Array { - return pet; - } - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Tag.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Tag.as deleted file mode 100644 index 07f1f8dd9f3..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/Tag.as +++ /dev/null @@ -1,21 +0,0 @@ -package com.wordnik.client.model { - -[XmlRootNode(name="Tag")] -public class Tag { - [XmlElement(name="id")] - public var id:Number = 0.0; - - [XmlElement(name="name")] - public var name:String = null; - - public function toString():String { - var str:String = "Tag: "; - str += " (id: " + id + ")"; - str += " (name: " + name + ")"; - return str; - } - - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/TagList.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/TagList.as deleted file mode 100644 index 92a9f7d71b1..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/TagList.as +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.swagger.common.ListWrapper; - -public class TagList implements ListWrapper { - // This declaration below of _Tag_obj_class is to force flash compiler to include this class - [XmlElements(name="tag", type="com.wordnik.client.model.Tag")] - public var tag:Array = new Array(); - private var _tag_obj_class:com.wordnik.client.model.Tag = null; - - public function getList():Array { - return tag; - } - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/User.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/User.as deleted file mode 100644 index d5227f9d28e..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/User.as +++ /dev/null @@ -1,46 +0,0 @@ -package com.wordnik.client.model { - -[XmlRootNode(name="User")] -public class User { - [XmlElement(name="id")] - public var id:Number = 0.0; - - [XmlElement(name="firstName")] - public var firstName:String = null; - - [XmlElement(name="username")] - public var username:String = null; - - [XmlElement(name="lastName")] - public var lastName:String = null; - - [XmlElement(name="email")] - public var email:String = null; - - [XmlElement(name="password")] - public var password:String = null; - - [XmlElement(name="phone")] - public var phone:String = null; - - /* User Status */ - [XmlElement(name="userStatus")] - public var userStatus:Number = 0.0; - - public function toString():String { - var str:String = "User: "; - str += " (id: " + id + ")"; - str += " (firstName: " + firstName + ")"; - str += " (username: " + username + ")"; - str += " (lastName: " + lastName + ")"; - str += " (email: " + email + ")"; - str += " (password: " + password + ")"; - str += " (phone: " + phone + ")"; - str += " (userStatus: " + userStatus + ")"; - return str; - } - - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/UserList.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/UserList.as deleted file mode 100644 index fdaab68ac23..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/client/model/UserList.as +++ /dev/null @@ -1,17 +0,0 @@ -package com.wordnik.client.model { - -import com.wordnik.swagger.common.ListWrapper; - -public class UserList implements ListWrapper { - // This declaration below of _User_obj_class is to force flash compiler to include this class - [XmlElements(name="user", type="com.wordnik.client.model.User")] - public var user:Array = new Array(); - private var _user_obj_class:com.wordnik.client.model.User = null; - - public function getList():Array { - return user; - } - -} -} - diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ListWrapper.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ListWrapper.as deleted file mode 100644 index 1dc8ef029fa..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ListWrapper.as +++ /dev/null @@ -1,7 +0,0 @@ -package com.wordnik.swagger.common { -public interface ListWrapper { - - function getList():Array; - -} -} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/SwaggerApi.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/SwaggerApi.as deleted file mode 100644 index af58870d179..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/SwaggerApi.as +++ /dev/null @@ -1,70 +0,0 @@ -package com.wordnik.swagger.common { -import com.wordnik.swagger.common.ApiUserCredentials; - -import flash.events.EventDispatcher; -import flash.events.IEventDispatcher; - -import mx.utils.UIDUtil; - -public class SwaggerApi extends EventDispatcher { - - /** - * Method for returning the path value - * For a string value an empty value is returned if the value is null - * @param value - * @return - */ - protected static function toPathValue(value:Object):String { - if (value is Array) { - return arrayToPathValue(value as Array); - } - return value == null ? "" : value.toString(); - } - - /** - * Method for returning a path value - * For a list of objects a comma separated string is returned - * @param objects - * @return - */ - protected static function arrayToPathValue(objects:Array):String { - var out:String = ""; - - return objects.join(","); - } - - /** - * Constructor for the api client - * @param apiCredentials Wrapper object for tokens and hostName required towards authentication - * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response - */ - public function SwaggerApi(apiCredentials:ApiUserCredentials, eventDispatcher:EventDispatcher = null) { - super(); - _apiUsageCredentials = apiCredentials; - _apiEventNotifier = eventDispatcher; - } - protected var _apiUsageCredentials:ApiUserCredentials; - protected var _apiEventNotifier:EventDispatcher; - protected var _apiInvoker:ApiInvoker; - protected var _useProxyServer:Boolean = false; - - public function useProxyServer(value:Boolean, proxyServerUrl:String = null):void { - _useProxyServer = value; - } - - protected function getApiInvoker():ApiInvoker { - if (_apiInvoker == null) { - if (_apiEventNotifier == null) { - _apiEventNotifier = this; - } - _apiInvoker = new ApiInvoker(_apiUsageCredentials, _apiEventNotifier, _useProxyServer); - } - return _apiInvoker; - } - - protected function getUniqueId():String { - return UIDUtil.createUID(); - } - -} -} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/XMLWriter.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/XMLWriter.as deleted file mode 100644 index 9b575262a31..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/XMLWriter.as +++ /dev/null @@ -1,24 +0,0 @@ -package com.wordnik.swagger.common { -public class XMLWriter { - public function XMLWriter() { - xml = ; - } - public var xml:XML; - - public function reset():void { - xml = new XML(); - } - - public function addProperty(propertyName:String, propertyValue:String):XML { - var xmlProperty:XML = - xmlProperty.setName(propertyName); - xmlProperty.appendChild(propertyValue); - xml.appendChild(xmlProperty); - return xmlProperty; - } - - public function addAttribute(propertyName:String, attribute:String, attributeValue:String):void { - xml.elements(propertyName)[0].@[attribute] = attributeValue; - } -} -} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiError.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiError.as deleted file mode 100644 index 8f473a0cbf9..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiError.as +++ /dev/null @@ -1,7 +0,0 @@ -package com.wordnik.swagger.exception { -public class ApiError extends Error { - public function ApiError(id:* = 0, message:* = "") { - super(message, id); - } -} -} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiErrorCodes.as b/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiErrorCodes.as deleted file mode 100644 index 7abb7642f8e..00000000000 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/exception/ApiErrorCodes.as +++ /dev/null @@ -1,32 +0,0 @@ -package com.wordnik.swagger.exception { -public class ApiErrorCodes { - /** - * System exception. - */ - public static const SYSTEM_EXCEPTION:Number = 0; - - /** - * With Arguments as current key. - */ - public static const API_KEY_NOT_VALID:Number = 1000; - /** - * With arguments as current token value - */ - public static const AUTH_TOKEN_NOT_VALID:Number = 1001; - /** - * With arguments as input JSON and output class anme - */ - public static const ERROR_CONVERTING_JSON_TO_JAVA:Number = 1002; - /** - * With arguments as JAVA class name - */ - public static const ERROR_CONVERTING_JAVA_TO_JSON:Number = 1003; - - public static const ERROR_FROM_WEBSERVICE_CALL:Number = 1004; - /** - * With arguments as current API server name - */ - public static const API_SERVER_NOT_VALID:Number = 1005; - -} -} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/PetApi.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/PetApi.as new file mode 100644 index 00000000000..edd1298600f --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/PetApi.as @@ -0,0 +1,276 @@ +package io.swagger.client.api { + +import io.swagger.common.ApiInvoker; +import io.swagger.exception.ApiErrorCodes; +import io.swagger.exception.ApiError; +import io.swagger.common.ApiUserCredentials; +import io.swagger.event.Response; +import io.swagger.common.SwaggerApi; +import io.swagger.client.model.Pet; +import flash.filesystem.File; + +import mx.rpc.AsyncToken; +import mx.utils.UIDUtil; +import flash.utils.Dictionary; +import flash.events.EventDispatcher; + +public class PetApi extends SwaggerApi { + /** + * Constructor for the PetApi api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function PetApi(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(apiCredentials, eventDispatcher); + } + + public static const event_update_pet: String = "update_pet"; + public static const event_add_pet: String = "add_pet"; + public static const event_find_pets_by_status: String = "find_pets_by_status"; + public static const event_find_pets_by_tags: String = "find_pets_by_tags"; + public static const event_get_pet_by_id: String = "get_pet_by_id"; + public static const event_update_pet_with_form: String = "update_pet_with_form"; + public static const event_delete_pet: String = "delete_pet"; + public static const event_upload_file: String = "upload_file"; + + + /* + * Returns void + */ + public function update_pet (body: Pet): String { + // create path and map variables + var path: String = "/pet".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "PUT", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "update_pet"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function add_pet (body: Pet): String { + // create path and map variables + var path: String = "/pet".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "add_pet"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns Array + */ + public function find_pets_by_status (status: Array = available): String { + // create path and map variables + var path: String = "/pet/findByStatus".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + if("null" != String(status)) + queryParams["status"] = toPathValue(status); + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "find_pets_by_status"; + + token.returnType = Array; + return requestId; + + } + + /* + * Returns Array + */ + public function find_pets_by_tags (tags: Array): String { + // create path and map variables + var path: String = "/pet/findByTags".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + if("null" != String(tags)) + queryParams["tags"] = toPathValue(tags); + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "find_pets_by_tags"; + + token.returnType = Array; + return requestId; + + } + + /* + * Returns Pet + */ + public function get_pet_by_id (petId: Number): String { + // create path and map variables + var path: String = "/pet/{petId}".replace(/{format}/g,"xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "get_pet_by_id"; + + token.returnType = Pet; + return requestId; + + } + + /* + * Returns void + */ + public function update_pet_with_form (petId: String, name: String, status: String): String { + // create path and map variables + var path: String = "/pet/{petId}".replace(/{format}/g,"xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "update_pet_with_form"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function delete_pet (petId: Number, apiKey: String): String { + // create path and map variables + var path: String = "/pet/{petId}".replace(/{format}/g,"xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + headerParams["apiKey"] = toPathValue(apiKey); + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "delete_pet"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function upload_file (petId: Number, additionalMetadata: String, file: File): String { + // create path and map variables + var path: String = "/pet/{petId}/uploadImage".replace(/{format}/g,"xml").replace("{" + "petId" + "}", getApiInvoker().escapeString(petId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "upload_file"; + + token.returnType = null ; + return requestId; + + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/StoreApi.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/StoreApi.as new file mode 100644 index 00000000000..061878ad257 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/StoreApi.as @@ -0,0 +1,150 @@ +package io.swagger.client.api { + +import io.swagger.common.ApiInvoker; +import io.swagger.exception.ApiErrorCodes; +import io.swagger.exception.ApiError; +import io.swagger.common.ApiUserCredentials; +import io.swagger.event.Response; +import io.swagger.common.SwaggerApi; +import io.swagger.client.model.Order; + +import mx.rpc.AsyncToken; +import mx.utils.UIDUtil; +import flash.utils.Dictionary; +import flash.events.EventDispatcher; + +public class StoreApi extends SwaggerApi { + /** + * Constructor for the StoreApi api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function StoreApi(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(apiCredentials, eventDispatcher); + } + + public static const event_get_inventory: String = "get_inventory"; + public static const event_place_order: String = "place_order"; + public static const event_get_order_by_id: String = "get_order_by_id"; + public static const event_delete_order: String = "delete_order"; + + + /* + * Returns Dictionary + */ + public function get_inventory (): String { + // create path and map variables + var path: String = "/store/inventory".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "get_inventory"; + + token.returnType = Dictionary; + return requestId; + + } + + /* + * Returns Order + */ + public function place_order (body: Order): String { + // create path and map variables + var path: String = "/store/order".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "place_order"; + + token.returnType = Order; + return requestId; + + } + + /* + * Returns Order + */ + public function get_order_by_id (orderId: String): String { + // create path and map variables + var path: String = "/store/order/{orderId}".replace(/{format}/g,"xml").replace("{" + "orderId" + "}", getApiInvoker().escapeString(orderId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "get_order_by_id"; + + token.returnType = Order; + return requestId; + + } + + /* + * Returns void + */ + public function delete_order (orderId: String): String { + // create path and map variables + var path: String = "/store/order/{orderId}".replace(/{format}/g,"xml").replace("{" + "orderId" + "}", getApiInvoker().escapeString(orderId)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "delete_order"; + + token.returnType = null ; + return requestId; + + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/UserApi.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/UserApi.as new file mode 100644 index 00000000000..06b0d079799 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/api/UserApi.as @@ -0,0 +1,274 @@ +package io.swagger.client.api { + +import io.swagger.common.ApiInvoker; +import io.swagger.exception.ApiErrorCodes; +import io.swagger.exception.ApiError; +import io.swagger.common.ApiUserCredentials; +import io.swagger.event.Response; +import io.swagger.common.SwaggerApi; +import io.swagger.client.model.User; + +import mx.rpc.AsyncToken; +import mx.utils.UIDUtil; +import flash.utils.Dictionary; +import flash.events.EventDispatcher; + +public class UserApi extends SwaggerApi { + /** + * Constructor for the UserApi api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function UserApi(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(apiCredentials, eventDispatcher); + } + + public static const event_create_user: String = "create_user"; + public static const event_create_users_with_array_input: String = "create_users_with_array_input"; + public static const event_create_users_with_list_input: String = "create_users_with_list_input"; + public static const event_login_user: String = "login_user"; + public static const event_logout_user: String = "logout_user"; + public static const event_get_user_by_name: String = "get_user_by_name"; + public static const event_update_user: String = "update_user"; + public static const event_delete_user: String = "delete_user"; + + + /* + * Returns void + */ + public function create_user (body: User): String { + // create path and map variables + var path: String = "/user".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "create_user"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function create_users_with_array_input (body: Array): String { + // create path and map variables + var path: String = "/user/createWithArray".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "create_users_with_array_input"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function create_users_with_list_input (body: Array): String { + // create path and map variables + var path: String = "/user/createWithList".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "POST", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "create_users_with_list_input"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns String + */ + public function login_user (username: String, password: String): String { + // create path and map variables + var path: String = "/user/login".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + if("null" != String(username)) + queryParams["username"] = toPathValue(username); + if("null" != String(password)) + queryParams["password"] = toPathValue(password); + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "login_user"; + + token.returnType = String; + return requestId; + + } + + /* + * Returns void + */ + public function logout_user (): String { + // create path and map variables + var path: String = "/user/logout".replace(/{format}/g,"xml"); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "logout_user"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns User + */ + public function get_user_by_name (username: String): String { + // create path and map variables + var path: String = "/user/{username}".replace(/{format}/g,"xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "GET", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "get_user_by_name"; + + token.returnType = User; + return requestId; + + } + + /* + * Returns void + */ + public function update_user (username: String, body: User): String { + // create path and map variables + var path: String = "/user/{username}".replace(/{format}/g,"xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "PUT", queryParams, body, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "update_user"; + + token.returnType = null ; + return requestId; + + } + + /* + * Returns void + */ + public function delete_user (username: String): String { + // create path and map variables + var path: String = "/user/{username}".replace(/{format}/g,"xml").replace("{" + "username" + "}", getApiInvoker().escapeString(username)); + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + + + + + + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "DELETE", queryParams, null, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "delete_user"; + + token.returnType = null ; + return requestId; + + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Category.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Category.as new file mode 100644 index 00000000000..6aa73414387 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Category.as @@ -0,0 +1,32 @@ +package io.swagger.client.model { + + + [XmlRootNode(name="Category")] + public class Category { + + + + [XmlElement(name="id")] + + public var id: Number = 0; + + + + [XmlElement(name="name")] + + public var name: String = null; + + + public function toString(): String { + var str: String = "Category: "; + + str += " (id: " + id + ")"; + + str += " (name: " + name + ")"; + + return str; + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/CategoryList.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/CategoryList.as new file mode 100644 index 00000000000..342cd70c001 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/CategoryList.as @@ -0,0 +1,18 @@ +package io.swagger.client.model { + +import io.swagger.common.ListWrapper; + + public class CategoryList implements ListWrapper { + // This declaration below of _Category_obj_class is to force flash compiler to include this class + private var _category_obj_class: io.swagger.client.model.Category = null; + [XmlElements(name="category", type="io.swagger.client.model.Category")] + public var category: Array = new Array(); + + public function getList(): Array{ + return category; + } + +} + + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Order.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Order.as new file mode 100644 index 00000000000..d6e4e6dc4d7 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Order.as @@ -0,0 +1,65 @@ +package io.swagger.client.model { + + + [XmlRootNode(name="Order")] + public class Order { + + + + [XmlElement(name="id")] + + public var id: Number = 0; + + + + [XmlElement(name="petId")] + + public var petId: Number = 0; + + + + [XmlElement(name="quantity")] + + public var quantity: Number = 0; + + + + [XmlElement(name="shipDate")] + + public var shipDate: Date = null; + + /* Order Status */ + + + [XmlElement(name="status")] + + public var status: String = null; + + + + [XmlElement(name="complete")] + + public var complete: Boolean = false; + + + public function toString(): String { + var str: String = "Order: "; + + str += " (id: " + id + ")"; + + str += " (petId: " + petId + ")"; + + str += " (quantity: " + quantity + ")"; + + str += " (shipDate: " + shipDate + ")"; + + str += " (status: " + status + ")"; + + str += " (complete: " + complete + ")"; + + return str; + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/OrderList.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/OrderList.as new file mode 100644 index 00000000000..bba3d8a4724 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/OrderList.as @@ -0,0 +1,18 @@ +package io.swagger.client.model { + +import io.swagger.common.ListWrapper; + + public class OrderList implements ListWrapper { + // This declaration below of _Order_obj_class is to force flash compiler to include this class + private var _order_obj_class: io.swagger.client.model.Order = null; + [XmlElements(name="order", type="io.swagger.client.model.Order")] + public var order: Array = new Array(); + + public function getList(): Array{ + return order; + } + +} + + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Pet.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Pet.as new file mode 100644 index 00000000000..81b29d91e4c --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Pet.as @@ -0,0 +1,75 @@ +package io.swagger.client.model { + +import io.swagger.client.model.Category; +import io.swagger.client.model.Tag; + + [XmlRootNode(name="Pet")] + public class Pet { + + + + [XmlElement(name="id")] + + public var id: Number = 0; + + + + [XmlElement(name="category")] + + public var category: Category = null; + + + + [XmlElement(name="name")] + + public var name: String = null; + + + + // This declaration below of _photoUrls_obj_class is to force flash compiler to include this class + private var _photoUrls_obj_class: Array = null; + [XmlElementWrapper(name="photoUrls")] + [XmlElements(name="photoUrls", type="Array")] + + + public var photoUrls: Array = new Array(); + + + + // This declaration below of _tags_obj_class is to force flash compiler to include this class + private var _tags_obj_class: Array = null; + [XmlElementWrapper(name="tags")] + [XmlElements(name="tags", type="Array")] + + + public var tags: Array = new Array(); + + /* pet status in the store */ + + + [XmlElement(name="status")] + + public var status: String = null; + + + public function toString(): String { + var str: String = "Pet: "; + + str += " (id: " + id + ")"; + + str += " (category: " + category + ")"; + + str += " (name: " + name + ")"; + + str += " (photoUrls: " + photoUrls + ")"; + + str += " (tags: " + tags + ")"; + + str += " (status: " + status + ")"; + + return str; + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/PetList.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/PetList.as new file mode 100644 index 00000000000..ada0846c5ea --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/PetList.as @@ -0,0 +1,20 @@ +package io.swagger.client.model { + +import io.swagger.common.ListWrapper; +import io.swagger.client.model.Category; +import io.swagger.client.model.Tag; + + public class PetList implements ListWrapper { + // This declaration below of _Pet_obj_class is to force flash compiler to include this class + private var _pet_obj_class: io.swagger.client.model.Pet = null; + [XmlElements(name="pet", type="io.swagger.client.model.Pet")] + public var pet: Array = new Array(); + + public function getList(): Array{ + return pet; + } + +} + + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Tag.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Tag.as new file mode 100644 index 00000000000..7387e2e2745 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/Tag.as @@ -0,0 +1,32 @@ +package io.swagger.client.model { + + + [XmlRootNode(name="Tag")] + public class Tag { + + + + [XmlElement(name="id")] + + public var id: Number = 0; + + + + [XmlElement(name="name")] + + public var name: String = null; + + + public function toString(): String { + var str: String = "Tag: "; + + str += " (id: " + id + ")"; + + str += " (name: " + name + ")"; + + return str; + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/TagList.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/TagList.as new file mode 100644 index 00000000000..25ebadb27fb --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/TagList.as @@ -0,0 +1,18 @@ +package io.swagger.client.model { + +import io.swagger.common.ListWrapper; + + public class TagList implements ListWrapper { + // This declaration below of _Tag_obj_class is to force flash compiler to include this class + private var _tag_obj_class: io.swagger.client.model.Tag = null; + [XmlElements(name="tag", type="io.swagger.client.model.Tag")] + public var tag: Array = new Array(); + + public function getList(): Array{ + return tag; + } + +} + + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/User.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/User.as new file mode 100644 index 00000000000..2b6474de90c --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/User.as @@ -0,0 +1,81 @@ +package io.swagger.client.model { + + + [XmlRootNode(name="User")] + public class User { + + + + [XmlElement(name="id")] + + public var id: Number = 0; + + + + [XmlElement(name="username")] + + public var username: String = null; + + + + [XmlElement(name="firstName")] + + public var firstName: String = null; + + + + [XmlElement(name="lastName")] + + public var lastName: String = null; + + + + [XmlElement(name="email")] + + public var email: String = null; + + + + [XmlElement(name="password")] + + public var password: String = null; + + + + [XmlElement(name="phone")] + + public var phone: String = null; + + /* User Status */ + + + [XmlElement(name="userStatus")] + + public var userStatus: Number = 0; + + + public function toString(): String { + var str: String = "User: "; + + str += " (id: " + id + ")"; + + str += " (username: " + username + ")"; + + str += " (firstName: " + firstName + ")"; + + str += " (lastName: " + lastName + ")"; + + str += " (email: " + email + ")"; + + str += " (password: " + password + ")"; + + str += " (phone: " + phone + ")"; + + str += " (userStatus: " + userStatus + ")"; + + return str; + } + +} + +} diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/UserList.as b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/UserList.as new file mode 100644 index 00000000000..e8a1fdb27f6 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/client/model/UserList.as @@ -0,0 +1,18 @@ +package io.swagger.client.model { + +import io.swagger.common.ListWrapper; + + public class UserList implements ListWrapper { + // This declaration below of _User_obj_class is to force flash compiler to include this class + private var _user_obj_class: io.swagger.client.model.User = null; + [XmlElements(name="user", type="io.swagger.client.model.User")] + public var user: Array = new Array(); + + public function getList(): Array{ + return user; + } + +} + + +} diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiInvoker.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiInvoker.as similarity index 93% rename from samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiInvoker.as rename to samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiInvoker.as index 89fd394d2e9..98d94052ec4 100644 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiInvoker.as +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiInvoker.as @@ -1,27 +1,6 @@ -package com.wordnik.swagger.common { -import asaxb.xml.bind.ASAXBContext; -import asaxb.xml.bind.Unmarshaller; - -import com.wordnik.swagger.event.ApiClientEvent; -import com.wordnik.swagger.event.Response; -import com.wordnik.swagger.common.ApiUserCredentials; - -import flash.events.EventDispatcher; -import flash.utils.Dictionary; -import flash.utils.describeType; -import flash.xml.XMLDocument; -import flash.xml.XMLNode; - -import mx.messaging.ChannelSet; -import mx.messaging.channels.HTTPChannel; -import mx.messaging.messages.HTTPRequestMessage; -import mx.rpc.AsyncToken; -import mx.rpc.events.FaultEvent; -import mx.rpc.events.ResultEvent; -import mx.rpc.http.HTTPService; -import mx.rpc.xml.SimpleXMLEncoder; -import mx.utils.ObjectUtil; - +package io.swagger.common { +import io.swagger.event.ApiClientEvent; +import io.swagger.event.Response; public class ApiInvoker extends EventDispatcher { diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUrlHelper.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUrlHelper.as similarity index 74% rename from samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUrlHelper.as rename to samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUrlHelper.as index 0fc7e1821b1..4333c6c7e4c 100644 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUrlHelper.as +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUrlHelper.as @@ -1,5 +1,5 @@ -package com.wordnik.swagger.common { -import com.wordnik.swagger.common.ApiUserCredentials; +package io.swagger.common { +import io.swagger.common.ApiUserCredentials; /** * @private @@ -12,17 +12,17 @@ internal class ApiUrlHelper { private static const HTTP_URL_PREFIX:String = "http://"; - internal static function appendTokenInfo(restUrl:String, requestHeader:Object, credentials:ApiUserCredentials):String { + internal static function appendTokenInfo(restUrl:String, requestHeader: Object, credentials: ApiUserCredentials): String { //checks for the presence api credentials on client initialization and not repeated here - if (restUrl.indexOf("?") == -1) { + if(restUrl.indexOf("?") == -1){ restUrl += ( "?" + API_URL_KEY + "=" + credentials.apiToken ); } - else { + else{ restUrl += ( "&" + API_URL_KEY + "=" + credentials.apiToken ); } requestHeader.api_key = credentials.apiToken; - if (credentials.authToken != null && credentials.authToken != "") { + if(credentials.authToken != null && credentials.authToken != ""){ restUrl += ( "&" + AUTH_TOKEN_URL_KEY + "=" + credentials.authToken ); requestHeader.auth_token = credentials.authToken; } @@ -30,7 +30,7 @@ internal class ApiUrlHelper { return restUrl; } - internal static function getProxyUrl(hostName:String, proxyPath:String):String { + internal static function getProxyUrl(hostName: String, proxyPath: String): String{ if (hostName(hostName.length - 1) == "/") //remove trailing slash { hostName = hostName.substring(0, hostName.length - 1); diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUserCredentials.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUserCredentials.as similarity index 53% rename from samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUserCredentials.as rename to samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUserCredentials.as index 3b0e38e6ccc..118d917a247 100644 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/common/ApiUserCredentials.as +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ApiUserCredentials.as @@ -1,28 +1,10 @@ -package com.wordnik.swagger.common { +package io.swagger.common { /** * Api account credentials. * */ public class ApiUserCredentials { - /** - * Constructor of ApiUserCredentials - * @param apiToken An apitoken that is passed along with the requests - * @param authToken A valid auth_token which could necessary for certain operations - * @param hostName The host name for the Rest API eg. api.companyName.com - * @param userId The userId which is required for certain operations - currently, get user lists - */ - public function ApiUserCredentials(hostName:String, apiPath:String, apiToken:String, - authToken:String = null, userId:Number = -1, apiProxyServerUrl:String = "", - proxyPath:String = null) { - this.hostName = hostName; - this.apiToken = apiToken; - this.authToken = authToken; - this.userId = userId; - this.apiPath = apiPath; - this.apiProxyServerUrl = apiProxyServerUrl; - this.proxyPath = proxyPath; - } /** * An apitoken that is passed along with the requests */ @@ -39,21 +21,43 @@ public class ApiUserCredentials { * The host name for the Rest API eg. api.companyName.com */ public var hostName:String; + + /** + * The base path to the api resources - used along with the hostname + * eg. /v4 + */ + public var apiPath: String; + + /** + * The base path to the blazeds proxy + * eg. /v4/messagebroker/restproxy + */ + public var proxyPath: String; + + /** + * If a proxy server has been set up for the services specify the URL here. This value is used when the Api is invoked with + * the value useProxy as true + */ + public var apiProxyServerUrl: String; + /** - * The base path to the api resources - used along with the hostname - * eg. /v4 + * Constructor of ApiUserCredentials + * @param apiToken An apitoken that is passed along with the requests + * @param authToken A valid auth_token which could necessary for certain operations + * @param hostName The host name for the Rest API eg. api.companyName.com + * @param userId The userId which is required for certain operations - currently, get user lists */ - public var apiPath:String; - /** - * The base path to the blazeds proxy - * eg. /v4/messagebroker/restproxy - */ - public var proxyPath:String; - /** - * If a proxy server has been set up for the services specify the URL here. This value is used when the Api is invoked with - * the value useProxy as true - */ - public var apiProxyServerUrl:String; + public function ApiUserCredentials(hostName: String, apiPath: String, apiToken: String, + authToken: String = null, userId: Number = -1, apiProxyServerUrl: String="", + proxyPath: String = null) { + this.hostName = hostName; + this.apiToken = apiToken; + this.authToken = authToken; + this.userId = userId; + this.apiPath = apiPath; + this.apiProxyServerUrl = apiProxyServerUrl; + this.proxyPath = proxyPath; + } } } \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ListWrapper.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ListWrapper.as new file mode 100644 index 00000000000..b22890ad1d1 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/ListWrapper.as @@ -0,0 +1,9 @@ +package io.swagger.common +{ + public interface ListWrapper + { + + function getList(): Array; + + } +} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/SwaggerApi.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/SwaggerApi.as new file mode 100644 index 00000000000..059de642a74 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/SwaggerApi.as @@ -0,0 +1,75 @@ +package io.swagger.common +{ + import io.swagger.common.ApiUserCredentials; + + import flash.events.EventDispatcher; + import flash.events.IEventDispatcher; + + import mx.utils.UIDUtil; + + public class SwaggerApi extends EventDispatcher + { + + protected var _apiUsageCredentials:ApiUserCredentials; + protected var _apiEventNotifier:EventDispatcher; + protected var _apiInvoker: ApiInvoker; + + protected var _useProxyServer: Boolean = false; + + + /** + * Constructor for the api client + * @param apiCredentials Wrapper object for tokens and hostName required towards authentication + * @param eventDispatcher Optional event dispatcher that when provided is used by the SDK to dispatch any Response + */ + public function SwaggerApi(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(); + _apiUsageCredentials = apiCredentials; + _apiEventNotifier = eventDispatcher; + } + + public function useProxyServer(value:Boolean, proxyServerUrl: String = null):void { + _useProxyServer = value; + } + + protected function getApiInvoker():ApiInvoker { + if(_apiInvoker == null){ + if(_apiEventNotifier == null){ + _apiEventNotifier = this; + } + _apiInvoker = new ApiInvoker(_apiUsageCredentials, _apiEventNotifier, _useProxyServer); + } + return _apiInvoker; + } + + protected function getUniqueId():String { + return UIDUtil.createUID(); + } + + /** + * Method for returning the path value + * For a string value an empty value is returned if the value is null + * @param value + * @return + */ + protected static function toPathValue(value: Object): String { + if(value is Array){ + return arrayToPathValue(value as Array); + } + return value == null ? "" : value.toString(); + } + + /** + * Method for returning a path value + * For a list of objects a comma separated string is returned + * @param objects + * @return + */ + protected static function arrayToPathValue(objects: Array): String { + var out: String = ""; + + return objects.join(","); + } + + } +} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/XMLWriter.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/XMLWriter.as new file mode 100644 index 00000000000..0b08066775b --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/common/XMLWriter.as @@ -0,0 +1,28 @@ +package io.swagger.common +{ + public class XMLWriter + { + public var xml:XML; + + public function XMLWriter() + { + xml=; + } + + public function reset():void { + xml=new XML(); + } + + public function addProperty(propertyName:String, propertyValue:String):XML { + var xmlProperty:XML= + xmlProperty.setName(propertyName); + xmlProperty.appendChild(propertyValue); + xml.appendChild(xmlProperty); + return xmlProperty; + } + + public function addAttribute(propertyName:String, attribute:String, attributeValue:String):void { + xml.elements(propertyName)[0].@[attribute]=attributeValue; + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/ApiClientEvent.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/ApiClientEvent.as similarity index 75% rename from samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/ApiClientEvent.as rename to samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/ApiClientEvent.as index 923cf3454fa..d64cd304d49 100644 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/ApiClientEvent.as +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/ApiClientEvent.as @@ -1,5 +1,5 @@ -package com.wordnik.swagger.event { -import com.wordnik.swagger.event.Response; +package io.swagger.event { +import io.swagger.event.Response; import flash.events.Event; @@ -8,7 +8,7 @@ import flash.events.Event; * If a custom dispatcher has been assigned by the consumer on the generated client then the dispatcher dispatches * the ApiClientEvent to indicate success or failure of the invocation using the Response */ -public class ApiClientEvent extends Event { +public class ApiClientEvent extends Event{ /** * Event type to indicate a unsuccessful invocation @@ -19,17 +19,18 @@ public class ApiClientEvent extends Event { * Event type to indicate a successful invocation */ public static const SUCCESS_EVENT:String = "successfulInvocation"; - - public function ApiClientEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { - super(type, bubbles, cancelable); - } + /** * The Response object which contains response info */ - public var response:Response; + public var response: Response; /** * Any additional info */ public var message:String; + + public function ApiClientEvent(type:String,bubbles:Boolean = false,cancelable:Boolean = false) { + super(type, bubbles, cancelable); + } } } \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/Response.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/Response.as similarity index 63% rename from samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/Response.as rename to samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/Response.as index 2379096932a..a43b7980a38 100644 --- a/samples/client/petstore/flash/src/main/flex/com/wordnik/swagger/event/Response.as +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/event/Response.as @@ -1,4 +1,4 @@ -package com.wordnik.swagger.event { +package io.swagger.event { /** * Response contains info on the result of an API invocation. @@ -6,47 +6,50 @@ package com.wordnik.swagger.event { */ public class Response { + /** + * Indicates whether the invoked operation failed or succeeded + */ + public var isSuccess:Boolean; + + /** + * The payload of the succesful operation eg. a Word in a WordRequest + */ + public var payload:Object; + + /** + * Error message in case of failure + */ + public var errorMessage:String; + + /** + * A request Id that was passed in by the user as a param when invoking the operation + */ + public var requestId:String; private static const API_ERROR_MSG:String = "Api error response: "; - private static function getFriendlyMessage(errorMessage:String):String { - var result:String = errorMessage; - if (errorMessage == null) + public function Response(isSuccessful: Boolean, payload: Object = null, errorMessage: String = null, requestId: String = null) { + this.isSuccess = isSuccessful; + this.payload = payload; + this.errorMessage = getFriendlyMessage(errorMessage); + } + + private static function getFriendlyMessage(errorMessage: String): String{ + var result: String = errorMessage; + if(errorMessage == null) return null; - var errorCode:String; - var errorCodeArray:Array = errorMessage.match(/(?<=HTTP\/1.1 )[0-9][0-9][0-9]/); - if (errorCodeArray != null && errorCodeArray.length == 1) { + var errorCode: String; + var errorCodeArray: Array = errorMessage.match(/(?<=HTTP\/1.1 )[0-9][0-9][0-9]/); + if(errorCodeArray != null && errorCodeArray.length == 1){ errorCode = String(errorCodeArray[0]); } - var msgArray:Array = errorMessage.match(/(?<=HTTP\/1.1 [0-9][0-9][0-9] )[^]*/); - if (msgArray != null && msgArray.length == 1) { + var msgArray: Array = errorMessage.match(/(?<=HTTP\/1.1 [0-9][0-9][0-9] )[^]*/); + if(msgArray != null && msgArray.length == 1){ result = API_ERROR_MSG + String(msgArray[0]); } return result; } - public function Response(isSuccessful:Boolean, payload:Object = null, errorMessage:String = null, requestId:String = null) { - this.isSuccess = isSuccessful; - this.payload = payload; - this.errorMessage = getFriendlyMessage(errorMessage); - } - /** - * Indicates whether the invoked operation failed or succeeded - */ - public var isSuccess:Boolean; - /** - * The payload of the succesful operation eg. a Word in a WordRequest - */ - public var payload:Object; - /** - * Error message in case of failure - */ - public var errorMessage:String; - /** - * A request Id that was passed in by the user as a param when invoking the operation - */ - public var requestId:String; - - public function toString():String { + public function toString(): String { return "Response (requestId:" + requestId + "; isSuccess:" + isSuccess + "; errorMessage:" + errorMessage + "; payload:" + payload + ")"; } } diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrorCodes.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrorCodes.as new file mode 100644 index 00000000000..e5ea46480aa --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrorCodes.as @@ -0,0 +1,34 @@ +package io.swagger.exception +{ + public class ApiErrorCodes + { + /** + * System exception. + */ + public static const SYSTEM_EXCEPTION: Number = 0; + + /** + * With Arguments as current key. + */ + public static const API_KEY_NOT_VALID: Number = 1000; + /** + * With arguments as current token value + */ + public static const AUTH_TOKEN_NOT_VALID: Number = 1001; + /** + * With arguments as input JSON and output class anme + */ + public static const ERROR_CONVERTING_JSON_TO_JAVA: Number = 1002; + /** + * With arguments as JAVA class name + */ + public static const ERROR_CONVERTING_JAVA_TO_JSON: Number = 1003; + + public static const ERROR_FROM_WEBSERVICE_CALL: Number = 1004; + /** + * With arguments as current API server name + */ + public static const API_SERVER_NOT_VALID: Number = 1005; + + } +} \ No newline at end of file diff --git a/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrors.as b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrors.as new file mode 100644 index 00000000000..c8ac95a5c59 --- /dev/null +++ b/samples/client/petstore/flash/src/main/flex/io/swagger/swagger/exception/ApiErrors.as @@ -0,0 +1,10 @@ +package io.swagger.exception +{ + public class ApiError extends Error + { + public function ApiError(id:*=0, message:*="") + { + super(message,id); + } + } +} \ No newline at end of file diff --git a/samples/client/petstore/flash/lib/ASAXB-0.1.1.swc b/samples/client/petstore/flash/src/main/flex/lib/ASAXB-0.1.1.swc similarity index 100% rename from samples/client/petstore/flash/lib/ASAXB-0.1.1.swc rename to samples/client/petstore/flash/src/main/flex/lib/ASAXB-0.1.1.swc diff --git a/samples/client/petstore/flash/lib/ext/as3corelib.swc b/samples/client/petstore/flash/src/main/flex/lib/as3corelib.swc similarity index 100% rename from samples/client/petstore/flash/lib/ext/as3corelib.swc rename to samples/client/petstore/flash/src/main/flex/lib/as3corelib.swc diff --git a/samples/client/petstore/flash/lib/ext/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc b/samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc similarity index 100% rename from samples/client/petstore/flash/lib/ext/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc rename to samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc diff --git a/samples/client/petstore/flash/lib/ext/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc b/samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc similarity index 100% rename from samples/client/petstore/flash/lib/ext/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc rename to samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc diff --git a/samples/client/petstore/flash/lib/ext/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc b/samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc similarity index 100% rename from samples/client/petstore/flash/lib/ext/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc rename to samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc diff --git a/samples/client/petstore/flash/lib/ext/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc b/samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc similarity index 100% rename from samples/client/petstore/flash/lib/ext/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc rename to samples/client/petstore/flash/src/main/flex/lib/ext/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java index d1aee33af00..c1657233fdc 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/api/PetApi.java @@ -243,7 +243,7 @@ public class PetApi { }; final String contentType = apiClient.selectHeaderContentType(contentTypes); - String[] authNames = new String[] { "api_key", "petstore_auth" }; + String[] authNames = new String[] { "petstore_auth", "api_key" }; TypeRef returnType = new TypeRef() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); diff --git a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java index d7c2038dead..f5cdc5fb71f 100644 --- a/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/default/src/main/java/io/swagger/client/model/Pet.java @@ -1,8 +1,8 @@ package io.swagger.client.model; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java index d1aee33af00..c1657233fdc 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/api/PetApi.java @@ -243,7 +243,7 @@ public class PetApi { }; final String contentType = apiClient.selectHeaderContentType(contentTypes); - String[] authNames = new String[] { "api_key", "petstore_auth" }; + String[] authNames = new String[] { "petstore_auth", "api_key" }; TypeRef returnType = new TypeRef() {}; return apiClient.invokeAPI(path, "GET", queryParams, postBody, headerParams, formParams, accept, contentType, authNames, returnType); diff --git a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java index d7c2038dead..f5cdc5fb71f 100644 --- a/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java +++ b/samples/client/petstore/java/jersey2/src/main/java/io/swagger/client/model/Pet.java @@ -1,8 +1,8 @@ package io.swagger.client.model; import io.swagger.client.model.Category; -import io.swagger.client.model.Tag; import java.util.*; +import io.swagger.client.model.Tag; import io.swagger.annotations.*; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.h b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.h index ada8035e579..7802a5b46c0 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.h @@ -19,6 +19,8 @@ #import "SWGOrder.h" +@class SWGConfiguration; + /** * A key for `NSError` user info dictionaries. * @@ -33,22 +35,6 @@ extern NSString *const SWGResponseObjectErrorKey; @property(nonatomic, assign) NSTimeInterval timeoutInterval; @property(nonatomic, readonly) NSOperationQueue* queue; -/** - * Gets the Api Client instance from pool - * - * @param baseUrl The base url of api client. - * - * @return The SWGApiClient instance. - */ -+(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl; - -/** - * Gets the operations queue - * - * @return The `shardQueue` static variable. - */ -+(NSOperationQueue*) sharedQueue; - /** * Clears Cache */ @@ -120,11 +106,9 @@ extern NSString *const SWGResponseObjectErrorKey; +(void) setReachabilityChangeBlock:(void(^)(int))changeBlock; /** - * Sets the client reachability strategy - * - * @param host The host of SWGApiClient. + * Sets the api client reachability strategy */ -+(void) configureCacheReachibilityForHost:(NSString*)host; +- (void)configureCacheReachibility; /** * Detects Accept header from accepts NSArray diff --git a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m index 9ebc48af348..22b5c256402 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGApiClient.m @@ -1,7 +1,5 @@ #import "SWGApiClient.h" -@implementation SWGApiClient - NSString *const SWGResponseObjectErrorKey = @"SWGResponseObject"; static long requestId = 0; @@ -9,41 +7,75 @@ static bool offlineState = false; static NSMutableSet * queuedRequests = nil; static bool cacheEnabled = false; static AFNetworkReachabilityStatus reachabilityStatus = AFNetworkReachabilityStatusNotReachable; -static NSOperationQueue* sharedQueue; static void (^reachabilityChangeBlock)(int); +@implementation SWGApiClient + +- (instancetype)init { + NSString *baseUrl = [[SWGConfiguration sharedConfig] host]; + return [self initWithBaseURL:[NSURL URLWithString:baseUrl]]; +} + +- (instancetype)initWithBaseURL:(NSURL *)url { + self = [super initWithBaseURL:url]; + if (self) { + self.requestSerializer = [AFJSONRequestSerializer serializer]; + self.responseSerializer = [AFJSONResponseSerializer serializer]; + // configure reachability + [self configureCacheReachibility]; + } + return self; +} + ++ (void)initialize { + if (self == [SWGApiClient class]) { + queuedRequests = [[NSMutableSet alloc] init]; + // initialize URL cache + [self configureCacheWithMemoryAndDiskCapacity:4*1024*1024 diskSize:32*1024*1024]; + } +} + +#pragma mark - Setter Methods + ++ (void) setOfflineState:(BOOL) state { + offlineState = state; +} + ++ (void) setCacheEnabled:(BOOL)enabled { + cacheEnabled = enabled; +} + +- (void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey { + [self.requestSerializer setValue:value forHTTPHeaderField:forKey]; +} + #pragma mark - Log Methods - (void)logResponse:(AFHTTPRequestOperation *)operation forRequest:(NSURLRequest *)request error:(NSError*)error { SWGConfiguration *config = [SWGConfiguration sharedConfig]; - + NSString *message = [NSString stringWithFormat:@"\n[DEBUG] Request body \n~BEGIN~\n %@\n~END~\n"\ "[DEBUG] HTTP Response body \n~BEGIN~\n %@\n~END~\n", [[NSString alloc] initWithData:request.HTTPBody encoding:NSUTF8StringEncoding], operation.responseString]; - + if (config.loggingFileHanlder) { [config.loggingFileHanlder seekToEndOfFile]; [config.loggingFileHanlder writeData:[message dataUsingEncoding:NSUTF8StringEncoding]]; } - + NSLog(@"%@", message); } #pragma mark - Cache Methods -+ (void) setCacheEnabled:(BOOL)enabled { - cacheEnabled = enabled; -} - +(void)clearCache { [[NSURLCache sharedURLCache] removeAllCachedResponses]; } -#pragma mark - - +(void)configureCacheWithMemoryAndDiskCapacity: (unsigned long) memorySize diskSize: (unsigned long) diskSize { NSAssert(memorySize > 0, @"invalid in-memory cache size"); @@ -58,43 +90,7 @@ static void (^reachabilityChangeBlock)(int); [NSURLCache setSharedURLCache:cache]; } -+(NSOperationQueue*) sharedQueue { - return sharedQueue; -} - -+(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl { - static NSMutableDictionary *_pool = nil; - if (queuedRequests == nil) { - queuedRequests = [[NSMutableSet alloc]init]; - } - if(_pool == nil) { - // setup static vars - // create queue - sharedQueue = [[NSOperationQueue alloc] init]; - - // create pool - _pool = [[NSMutableDictionary alloc] init]; - - // initialize URL cache - [SWGApiClient configureCacheWithMemoryAndDiskCapacity:4*1024*1024 diskSize:32*1024*1024]; - - // configure reachability - [SWGApiClient configureCacheReachibilityForHost:baseUrl]; - } - - @synchronized(self) { - SWGApiClient * client = [_pool objectForKey:baseUrl]; - if (client == nil) { - client = [[SWGApiClient alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]]; - [_pool setValue:client forKey:baseUrl ]; - if([[SWGConfiguration sharedConfig] debug]) - NSLog(@"new client for path %@", baseUrl); - } - if([[SWGConfiguration sharedConfig] debug]) - NSLog(@"returning client for path %@", baseUrl); - return client; - } -} +#pragma mark - Utility Methods /* * Detect `Accept` from accepts @@ -104,13 +100,13 @@ static void (^reachabilityChangeBlock)(int); if (accepts == nil || [accepts count] == 0) { return @""; } - + NSMutableArray *lowerAccepts = [[NSMutableArray alloc] initWithCapacity:[accepts count]]; [accepts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [lowerAccepts addObject:[obj lowercaseString]]; }]; - + if ([lowerAccepts containsObject:@"application/json"]) { return @"application/json"; } @@ -127,7 +123,7 @@ static void (^reachabilityChangeBlock)(int); if (contentTypes == nil || [contentTypes count] == 0) { return @"application/json"; } - + NSMutableArray *lowerContentTypes = [[NSMutableArray alloc] initWithCapacity:[contentTypes count]]; [contentTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { [lowerContentTypes addObject:[obj lowercaseString]]; @@ -141,11 +137,23 @@ static void (^reachabilityChangeBlock)(int); } } --(void)setHeaderValue:(NSString*) value - forKey:(NSString*) forKey { - [self.requestSerializer setValue:value forHTTPHeaderField:forKey]; ++ (NSString*)escape:(id)unescaped { + if([unescaped isKindOfClass:[NSString class]]){ + return (NSString *)CFBridgingRelease + (CFURLCreateStringByAddingPercentEscapes( + NULL, + (__bridge CFStringRef) unescaped, + NULL, + (CFStringRef)@"!*'();:@&=+$,/?%#[]", + kCFStringEncodingUTF8)); + } + else { + return [NSString stringWithFormat:@"%@", unescaped]; + } } +#pragma mark - Request Methods + +(unsigned long)requestQueueSize { return [queuedRequests count]; } @@ -171,46 +179,28 @@ static void (^reachabilityChangeBlock)(int); [queuedRequests removeObject:requestId]; } -+(NSString*) escape:(id)unescaped { - if([unescaped isKindOfClass:[NSString class]]){ - return (NSString *)CFBridgingRelease - (CFURLCreateStringByAddingPercentEscapes( - NULL, - (__bridge CFStringRef) unescaped, - NULL, - (CFStringRef)@"!*'();:@&=+$,/?%#[]", - kCFStringEncodingUTF8)); - } - else { - return [NSString stringWithFormat:@"%@", unescaped]; - } -} - -(Boolean) executeRequestWithId:(NSNumber*) requestId { NSSet* matchingItems = [queuedRequests objectsPassingTest:^BOOL(id obj, BOOL *stop) { - if([obj intValue] == [requestId intValue]) - return TRUE; - else return FALSE; + if([obj intValue] == [requestId intValue]) { + return YES; + } + else { + return NO; + } }]; if(matchingItems.count == 1) { if([[SWGConfiguration sharedConfig] debug]) NSLog(@"removing request id %@", requestId); [queuedRequests removeObject:requestId]; - return true; + return YES; + } + else { + return NO; } - else - return false; } --(id)initWithBaseURL:(NSURL *)url { - self = [super initWithBaseURL:url]; - self.requestSerializer = [AFJSONRequestSerializer serializer]; - self.responseSerializer = [AFJSONResponseSerializer serializer]; - if (!self) - return nil; - return self; -} +#pragma mark - Reachability Methods +(AFNetworkReachabilityStatus) getReachabilityStatus { return reachabilityStatus; @@ -220,12 +210,8 @@ static void (^reachabilityChangeBlock)(int); reachabilityChangeBlock = changeBlock; } -+(void) setOfflineState:(BOOL) state { - offlineState = state; -} - -+(void) configureCacheReachibilityForHost:(NSString*)host { - [[SWGApiClient sharedClientFromPool:host].reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { +- (void) configureCacheReachibility { + [self.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { reachabilityStatus = status; switch (status) { case AFNetworkReachabilityStatusUnknown: @@ -254,16 +240,352 @@ static void (^reachabilityChangeBlock)(int); default: break; } + // call the reachability block, if configured if(reachabilityChangeBlock != nil) { reachabilityChangeBlock(status); } }]; - [[SWGApiClient sharedClientFromPool:host].reachabilityManager startMonitoring]; + + [self.reachabilityManager startMonitoring]; } --(NSString*) pathWithQueryParamsToString:(NSString*) path - queryParams:(NSDictionary*) queryParams { +#pragma mark - Deserialize methods + +- (id) deserialize:(id) data class:(NSString *) class { + NSRegularExpression *regexp = nil; + 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 "*" + if ([class hasSuffix:@"*"]) { + class = [class substringToIndex:[class length] - 1]; + } + + // pure object + if ([class isEqualToString:@"NSObject"]) { + return [[NSObject alloc] init]; + } + + // list of models + NSString *arrayOfModelsPat = @"NSArray<(.+)>"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfModelsPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + + match = [regexp firstMatchInString:class + options:0 + 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:innerType]]; + } + ]; + + return resultArray; + } + + // list of primitives + NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + match = [regexp firstMatchInString:class + options:0 + 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:innerType]]; + }]; + + return resultArray; + } + + // map + NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; + regexp = [NSRegularExpression regularExpressionWithPattern:dictPat + options:NSRegularExpressionCaseInsensitive + error:nil]; + match = [regexp firstMatchInString:class + options:0 + range:NSMakeRange(0, [class length])]; + + if (match) { + NSString *valueType = [class substringWithRange:[match rangeAtIndex:2]]; + + resultDict = [NSMutableDictionary dictionaryWithCapacity:[data count]]; + [data enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + [resultDict setValue:[self deserialize:obj class:valueType] forKey:key]; + }]; + + return resultDict; + } + + // primitives + NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"NSNumber"]; + + if ([primitiveTypes containsObject:class]) { + if ([class isEqualToString:@"NSString"]) { + return [NSString stringWithString:data]; + } + else if ([class isEqualToString:@"NSDate"]) { + return [NSDate dateWithISO8601String:data]; + } + else if ([class isEqualToString:@"NSNumber"]) { + // NSNumber from NSNumber + if ([data isKindOfClass:[NSNumber class]]) { + return data; + } + else if ([data isKindOfClass:[NSString class]]) { + // NSNumber (NSCFBoolean) from NSString + if ([[data lowercaseString] isEqualToString:@"true"] || [[data lowercaseString] isEqualToString:@"false"]) { + return [NSNumber numberWithBool:[data boolValue]]; + // NSNumber from NSString + } else { + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + formatter.numberStyle = NSNumberFormatterDecimalStyle; + return [formatter numberFromString:data]; + } + } + } + } + + // model + Class ModelClass = NSClassFromString(class); + if ([ModelClass instancesRespondToSelector:@selector(initWithDictionary:error:)]) { + return [[ModelClass alloc] initWithDictionary:data error:nil]; + } + + return nil; +} + +#pragma mark - Operation Methods + +- (void) operationWithCompletionBlock: (NSURLRequest *)request + requestId: (NSNumber *) requestId + completionBlock: (void (^)(id, NSError *))completionBlock { + AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request + success:^(AFHTTPRequestOperation *operation, id response) { + if([self executeRequestWithId:requestId]) { + if([[SWGConfiguration sharedConfig] debug]) { + [self logResponse:operation forRequest:request error:nil]; + } + completionBlock(response, nil); + } + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if([self executeRequestWithId:requestId]) { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if(operation.responseObject) { + // Add in the (parsed) response body. + userInfo[SWGResponseObjectErrorKey] = operation.responseObject; + } + NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; + + if([[SWGConfiguration sharedConfig] debug]) + [self logResponse:nil forRequest:request error:augmentedError]; + completionBlock(nil, augmentedError); + } + }]; + + [self.operationQueue addOperation:op]; +} + +- (void) downloadOperationWithCompletionBlock: (NSURLRequest *)request + requestId: (NSNumber *) requestId + completionBlock: (void (^)(id, NSError *))completionBlock { + AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request + success:^(AFHTTPRequestOperation *operation, id responseObject) { + SWGConfiguration *config = [SWGConfiguration sharedConfig]; + NSString *directory = nil; + if (config.tempFolderPath) { + directory = config.tempFolderPath; + } + else { + directory = NSTemporaryDirectory(); + } + + NSDictionary *headers = operation.response.allHeaderFields; + NSString *filename = nil; + if ([headers objectForKey:@"Content-Disposition"]) { + + NSString *pattern = @"filename=['\"]?([^'\"\\s]+)['\"]?"; + NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern + options:NSRegularExpressionCaseInsensitive + error:nil]; + NSString *contentDispositionHeader = [headers objectForKey:@"Content-Disposition"]; + NSTextCheckingResult *match = [regexp firstMatchInString:contentDispositionHeader + options:0 + range:NSMakeRange(0, [contentDispositionHeader length])]; + filename = [contentDispositionHeader substringWithRange:[match rangeAtIndex:1]]; + } + else { + filename = [NSString stringWithFormat:@"%@", [[NSProcessInfo processInfo] globallyUniqueString]]; + } + + NSString *filepath = [directory stringByAppendingPathComponent:filename]; + NSURL *file = [NSURL fileURLWithPath:filepath]; + + [operation.responseData writeToURL:file atomically:YES]; + completionBlock(file, nil); + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + + if ([self executeRequestWithId:requestId]) { + NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; + if (operation.responseObject) { + userInfo[SWGResponseObjectErrorKey] = operation.responseObject; + } + + NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; + + if ([[SWGConfiguration sharedConfig] debug]) { + [self logResponse:nil forRequest:request error:augmentedError]; + } + + completionBlock(nil, augmentedError); + } + }]; + + [self.operationQueue addOperation:op]; +} + +#pragma mark - Perform Request Methods + +-(NSNumber*) requestWithCompletionBlock: (NSString*) path + method: (NSString*) method + queryParams: (NSDictionary*) queryParams + formParams: (NSDictionary *) formParams + files: (NSDictionary *) files + body: (id) body + headerParams: (NSDictionary*) headerParams + authSettings: (NSArray *) authSettings + requestContentType: (NSString*) requestContentType + responseContentType: (NSString*) responseContentType + responseType: (NSString *) responseType + completionBlock: (void (^)(id, NSError *))completionBlock { + // setting request serializer + if ([requestContentType isEqualToString:@"application/json"]) { + self.requestSerializer = [SWGJSONRequestSerializer serializer]; + } + else if ([requestContentType isEqualToString:@"application/x-www-form-urlencoded"]) { + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + } + else if ([requestContentType isEqualToString:@"multipart/form-data"]) { + self.requestSerializer = [AFHTTPRequestSerializer serializer]; + } + else { + NSAssert(false, @"unsupport request type %@", requestContentType); + } + + // setting response serializer + if ([responseContentType isEqualToString:@"application/json"]) { + self.responseSerializer = [SWGJSONResponseSerializer serializer]; + } + else { + self.responseSerializer = [AFHTTPResponseSerializer serializer]; + } + + // auth setting + [self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings]; + + NSMutableURLRequest * request = nil; + + NSString* pathWithQueryParams = [self pathWithQueryParamsToString:path queryParams:queryParams]; + if ([pathWithQueryParams hasPrefix:@"/"]) { + pathWithQueryParams = [pathWithQueryParams substringFromIndex:1]; + } + + NSString* urlString = [[NSURL URLWithString:pathWithQueryParams relativeToURL:self.baseURL] absoluteString]; + if (files.count > 0) { + request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" + URLString:urlString + parameters:nil + constructingBodyWithBlock:^(id formData) { + [formParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding]; + [formData appendPartWithFormData:data name:key]; + }]; + [files enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + NSURL *filePath = (NSURL *)obj; + [formData appendPartWithFileURL:filePath name:key error:nil]; + }]; + } error:nil]; + } + else { + if (formParams) { + request = [self.requestSerializer requestWithMethod:method + URLString:urlString + parameters:formParams + error:nil]; + } + if (body) { + request = [self.requestSerializer requestWithMethod:method + URLString:urlString + parameters:body + error:nil]; + } + } + + BOOL hasHeaderParams = false; + if(headerParams != nil && [headerParams count] > 0) { + hasHeaderParams = true; + } + if(offlineState) { + NSLog(@"%@ cache forced", path); + [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; + } + else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { + NSLog(@"%@ cache enabled", path); + [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; + } + else { + NSLog(@"%@ cache disabled", path); + [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; + } + + if(hasHeaderParams){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [self.requestSerializer setValue:responseContentType forHTTPHeaderField:@"Accept"]; + + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + NSNumber* requestId = [SWGApiClient queueRequest]; + if ([responseType isEqualToString:@"NSURL*"]) { + [self downloadOperationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { + completionBlock(data, error); + }]; + } + else { + [self operationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { + completionBlock([self deserialize:data class:responseType], error); + }]; + } + return requestId; +} + +#pragma mark - + +- (NSString*) pathWithQueryParamsToString:(NSString*) path + queryParams:(NSDictionary*) queryParams { NSString * separator = nil; int counter = 0; @@ -323,18 +645,18 @@ static void (^reachabilityChangeBlock)(int); - (void) updateHeaderParams:(NSDictionary *__autoreleasing *)headers queryParams:(NSDictionary *__autoreleasing *)querys WithAuthSettings:(NSArray *)authSettings { - + if (!authSettings || [authSettings count] == 0) { return; } - + NSMutableDictionary *headersWithAuth = [NSMutableDictionary dictionaryWithDictionary:*headers]; NSMutableDictionary *querysWithAuth = [NSMutableDictionary dictionaryWithDictionary:*querys]; - + SWGConfiguration *config = [SWGConfiguration sharedConfig]; for (NSString *auth in authSettings) { NSDictionary *authSetting = [[config authSettings] objectForKey:auth]; - + if (authSetting) { if ([authSetting[@"in"] isEqualToString:@"header"]) { [headersWithAuth setObject:authSetting[@"value"] forKey:authSetting[@"key"]]; @@ -344,341 +666,9 @@ static void (^reachabilityChangeBlock)(int); } } } - + *headers = [NSDictionary dictionaryWithDictionary:headersWithAuth]; *querys = [NSDictionary dictionaryWithDictionary:querysWithAuth]; } -#pragma mark - Deserialize methods - -- (id) deserialize:(id) data class:(NSString *) class { - NSRegularExpression *regexp = nil; - 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 "*" - if ([class hasSuffix:@"*"]) { - class = [class substringToIndex:[class length] - 1]; - } - - // pure object - if ([class isEqualToString:@"NSObject"]) { - return [[NSObject alloc] init]; - } - - // list of models - NSString *arrayOfModelsPat = @"NSArray<(.+)>"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfModelsPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - - match = [regexp firstMatchInString:class - options:0 - 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:innerType]]; - } - ]; - - return resultArray; - } - - // list of primitives - NSString *arrayOfPrimitivesPat = @"NSArray\\* /\\* (.+) \\*/"; - regexp = [NSRegularExpression regularExpressionWithPattern:arrayOfPrimitivesPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - match = [regexp firstMatchInString:class - options:0 - 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:innerType]]; - }]; - - return resultArray; - } - - // map - NSString *dictPat = @"NSDictionary\\* /\\* (.+?), (.+) \\*/"; - regexp = [NSRegularExpression regularExpressionWithPattern:dictPat - options:NSRegularExpressionCaseInsensitive - error:nil]; - match = [regexp firstMatchInString:class - options:0 - range:NSMakeRange(0, [class length])]; - - if (match) { - NSString *valueType = [class substringWithRange:[match rangeAtIndex:2]]; - - resultDict = [NSMutableDictionary dictionaryWithCapacity:[data count]]; - [data enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - [resultDict setValue:[self deserialize:obj class:valueType] forKey:key]; - }]; - - return resultDict; - } - - // primitives - NSArray *primitiveTypes = @[@"NSString", @"NSDate", @"BOOL", @"NSNumber"]; - - if ([primitiveTypes containsObject:class]) { - if ([class isEqualToString:@"NSString"]) { - return [NSString stringWithString:data]; - } - else if ([class isEqualToString:@"NSDate"]) { - return [NSDate dateWithISO8601String:data]; - } - else if ([class isEqualToString:@"BOOL"]) { - // Returns YES on encountering one of "Y", "y", "T", "t", or a - // digit 1-9—the method ignores any trailing characters - // NSString => BOOL => NSNumber - return [NSNumber numberWithBool:[data boolValue]]; - } - else if ([class isEqualToString:@"NSNumber"]) { - // NSNumber from NSNumber - if ([data isKindOfClass:[NSNumber class]]) { - return data; - } - // NSNumber from NSString - else { - NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; - formatter.numberStyle = NSNumberFormatterDecimalStyle; - return [formatter numberFromString:data]; - } - } - } - - // model - Class ModelClass = NSClassFromString(class); - if ([ModelClass instancesRespondToSelector:@selector(initWithDictionary:error:)]) { - return [[ModelClass alloc] initWithDictionary:data error:nil]; - } - - return nil; -} - -#pragma mark - Operation Methods - -- (void) operationWithCompletionBlock: (NSURLRequest *)request - requestId: (NSNumber *) requestId - completionBlock: (void (^)(id, NSError *))completionBlock { - AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request - success:^(AFHTTPRequestOperation *operation, id response) { - if([self executeRequestWithId:requestId]) { - if([[SWGConfiguration sharedConfig] debug]) { - [self logResponse:operation forRequest:request error:nil]; - } - completionBlock(response, nil); - } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if([self executeRequestWithId:requestId]) { - NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if(operation.responseObject) { - // Add in the (parsed) response body. - userInfo[SWGResponseObjectErrorKey] = operation.responseObject; - } - NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; - - if([[SWGConfiguration sharedConfig] debug]) - [self logResponse:nil forRequest:request error:augmentedError]; - completionBlock(nil, augmentedError); - } - }]; - - [self.operationQueue addOperation:op]; -} - -- (void) downloadOperationWithCompletionBlock: (NSURLRequest *)request - requestId: (NSNumber *) requestId - completionBlock: (void (^)(id, NSError *))completionBlock { - AFHTTPRequestOperation *op = [self HTTPRequestOperationWithRequest:request - success:^(AFHTTPRequestOperation *operation, id responseObject) { - SWGConfiguration *config = [SWGConfiguration sharedConfig]; - NSString *directory = nil; - if (config.tempFolderPath) { - directory = config.tempFolderPath; - } - else { - directory = NSTemporaryDirectory(); - } - - NSDictionary *headers = operation.response.allHeaderFields; - NSString *filename = nil; - if ([headers objectForKey:@"Content-Disposition"]) { - - NSString *pattern = @"filename=['\"]?([^'\"\\s]+)['\"]?"; - NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:pattern - options:NSRegularExpressionCaseInsensitive - error:nil]; - NSString *contentDispositionHeader = [headers objectForKey:@"Content-Disposition"]; - NSTextCheckingResult *match = [regexp firstMatchInString:contentDispositionHeader - options:0 - range:NSMakeRange(0, [contentDispositionHeader length])]; - filename = [contentDispositionHeader substringWithRange:[match rangeAtIndex:1]]; - } - else { - filename = [NSString stringWithFormat:@"%@", [[NSProcessInfo processInfo] globallyUniqueString]]; - } - - NSString *filepath = [directory stringByAppendingPathComponent:filename]; - NSURL *file = [NSURL fileURLWithPath:filepath]; - - [operation.responseData writeToURL:file atomically:YES]; - completionBlock(file, nil); - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - - if ([self executeRequestWithId:requestId]) { - NSMutableDictionary *userInfo = [error.userInfo mutableCopy]; - if (operation.responseObject) { - userInfo[SWGResponseObjectErrorKey] = operation.responseObject; - } - - NSError *augmentedError = [error initWithDomain:error.domain code:error.code userInfo:userInfo]; - - if ([[SWGConfiguration sharedConfig] debug]) { - [self logResponse:nil forRequest:request error:augmentedError]; - } - - completionBlock(nil, augmentedError); - } - }]; - - [self.operationQueue addOperation:op]; -} - -#pragma mark - Perform Request Methods - --(NSNumber*) requestWithCompletionBlock: (NSString*) path - method: (NSString*) method - queryParams: (NSDictionary*) queryParams - formParams: (NSDictionary *) formParams - files: (NSDictionary *) files - body: (id) body - headerParams: (NSDictionary*) headerParams - authSettings: (NSArray *) authSettings - requestContentType: (NSString*) requestContentType - responseContentType: (NSString*) responseContentType - responseType: (NSString *) responseType - completionBlock: (void (^)(id, NSError *))completionBlock { - // setting request serializer - if ([requestContentType isEqualToString:@"application/json"]) { - self.requestSerializer = [SWGJSONRequestSerializer serializer]; - } - else if ([requestContentType isEqualToString:@"application/x-www-form-urlencoded"]) { - self.requestSerializer = [AFHTTPRequestSerializer serializer]; - } - else if ([requestContentType isEqualToString:@"multipart/form-data"]) { - self.requestSerializer = [AFHTTPRequestSerializer serializer]; - } - else { - NSAssert(false, @"unsupport request type %@", requestContentType); - } - - // setting response serializer - if ([responseContentType isEqualToString:@"application/json"]) { - self.responseSerializer = [SWGJSONResponseSerializer serializer]; - } - else { - self.responseSerializer = [AFHTTPResponseSerializer serializer]; - } - - // auth setting - [self updateHeaderParams:&headerParams queryParams:&queryParams WithAuthSettings:authSettings]; - - NSMutableURLRequest * request = nil; - NSString* pathWithQueryParams = [self pathWithQueryParamsToString:path queryParams:queryParams]; - NSString* urlString = [[NSURL URLWithString:pathWithQueryParams relativeToURL:self.baseURL] absoluteString]; - if (files.count > 0) { - request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" - URLString:urlString - parameters:nil - constructingBodyWithBlock:^(id formData) { - [formParams enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - NSData *data = [obj dataUsingEncoding:NSUTF8StringEncoding]; - [formData appendPartWithFormData:data name:key]; - }]; - [files enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - NSURL *filePath = (NSURL *)obj; - [formData appendPartWithFileURL:filePath name:key error:nil]; - }]; - } error:nil]; - } - else { - if (formParams) { - request = [self.requestSerializer requestWithMethod:method - URLString:urlString - parameters:formParams - error:nil]; - } - if (body) { - request = [self.requestSerializer requestWithMethod:method - URLString:urlString - parameters:body - error:nil]; - } - } - - BOOL hasHeaderParams = false; - if(headerParams != nil && [headerParams count] > 0) { - hasHeaderParams = true; - } - if(offlineState) { - NSLog(@"%@ cache forced", path); - [request setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; - } - else if(!hasHeaderParams && [method isEqualToString:@"GET"] && cacheEnabled) { - NSLog(@"%@ cache enabled", path); - [request setCachePolicy:NSURLRequestUseProtocolCachePolicy]; - } - else { - NSLog(@"%@ cache disabled", path); - [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; - } - - if(hasHeaderParams){ - for(NSString * key in [headerParams keyEnumerator]){ - [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; - } - } - [self.requestSerializer setValue:responseContentType forHTTPHeaderField:@"Accept"]; - - - // Always disable cookies! - [request setHTTPShouldHandleCookies:NO]; - - NSNumber* requestId = [SWGApiClient queueRequest]; - if ([responseType isEqualToString:@"NSURL*"]) { - [self downloadOperationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { - completionBlock(data, error); - }]; - } - else { - [self operationWithCompletionBlock:request requestId:requestId completionBlock:^(id data, NSError *error) { - completionBlock([self deserialize:data class:responseType], error); - }]; - } - return requestId; -} - @end - - - - diff --git a/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.h b/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.h index 0ccbe0cd8f6..99f97cdec1b 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.h @@ -1,13 +1,26 @@ #import - +#import "SWGApiClient.h" + /** The `SWGConfiguration` class manages the configurations for the sdk. * * NOTE: This class is auto generated by the swagger code generator program. * https://github.com/swagger-api/swagger-codegen * Do not edit the class manually. */ + +@class SWGApiClient; + @interface SWGConfiguration : NSObject +/** + * Default api client + */ +@property (nonatomic) SWGApiClient *apiClient; + +/** + * Default base url + */ +@property (nonatomic) NSString *host; /** * Api key values for Api Key type Authentication diff --git a/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.m b/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.m index b1dabf52f01..9cc1c07d9f9 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGConfiguration.m @@ -25,6 +25,8 @@ - (instancetype) init { self = [super init]; if (self) { + self.apiClient = nil; + self.host = @"http://petstore.swagger.io/v2"; self.username = @""; self.password = @""; self.tempFolderPath = nil; diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h index bcbf8c64f9b..f7e67d0aa1f 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.h @@ -18,8 +18,6 @@ -(void) addHeader:(NSString*)value forKey:(NSString*)key; -(unsigned long) requestQueueSize; +(SWGPetApi*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; -+(void) setBasePath:(NSString*)basePath; -+(NSString*) getBasePath; /// /// /// Update an existing pet diff --git a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m index 91386db77ef..f2e7fb64030 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGPetApi.m @@ -9,14 +9,16 @@ @implementation SWGPetApi -static NSString * basePath = @"http://petstore.swagger.io/v2"; - #pragma mark - Initialize methods - (id) init { self = [super init]; if (self) { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; + SWGConfiguration *config = [SWGConfiguration sharedConfig]; + if (config.apiClient == nil) { + config.apiClient = [[SWGApiClient alloc] init]; + } + self.apiClient = config.apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -25,12 +27,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - (id) initWithApiClient:(SWGApiClient *)apiClient { self = [super init]; if (self) { - if (apiClient) { - self.apiClient = apiClient; - } - else { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; - } + self.apiClient = apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -48,14 +45,6 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; return singletonAPI; } -+(void) setBasePath:(NSString*)path { - basePath = path; -} - -+(NSString*) getBasePath { - return basePath; -} - -(void) addHeader:(NSString*)value forKey:(NSString*)key { [self.defaultHeaders setValue:value forKey:key]; } @@ -85,12 +74,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -144,7 +134,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"PUT" queryParams: queryParams formParams: formParams @@ -176,12 +166,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -235,7 +226,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -267,12 +258,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/findByStatus", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/findByStatus"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -316,7 +308,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -348,12 +340,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/findByTags", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/findByTags"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -397,7 +390,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -434,13 +427,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/{petId}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/{petId}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -478,7 +472,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -521,13 +515,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/{petId}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/{petId}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -573,7 +568,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -613,13 +608,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/{petId}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/{petId}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -659,7 +655,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"DELETE" queryParams: queryParams formParams: formParams @@ -702,13 +698,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/pet/{petId}/uploadImage", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/pet/{petId}/uploadImage"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"petId", @"}"]] withString: [SWGApiClient escape:petId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -754,7 +751,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams diff --git a/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.h b/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.h index 7b4f99dea7b..09e67e38ed0 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.h @@ -18,8 +18,6 @@ -(void) addHeader:(NSString*)value forKey:(NSString*)key; -(unsigned long) requestQueueSize; +(SWGStoreApi*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; -+(void) setBasePath:(NSString*)basePath; -+(NSString*) getBasePath; /// /// /// Returns pet inventories by status diff --git a/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.m b/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.m index 5304b67dd07..ed792988597 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGStoreApi.m @@ -9,14 +9,16 @@ @implementation SWGStoreApi -static NSString * basePath = @"http://petstore.swagger.io/v2"; - #pragma mark - Initialize methods - (id) init { self = [super init]; if (self) { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; + SWGConfiguration *config = [SWGConfiguration sharedConfig]; + if (config.apiClient == nil) { + config.apiClient = [[SWGApiClient alloc] init]; + } + self.apiClient = config.apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -25,12 +27,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - (id) initWithApiClient:(SWGApiClient *)apiClient { self = [super init]; if (self) { - if (apiClient) { - self.apiClient = apiClient; - } - else { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; - } + self.apiClient = apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -48,14 +45,6 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; return singletonAPI; } -+(void) setBasePath:(NSString*)path { - basePath = path; -} - -+(NSString*) getBasePath { - return basePath; -} - -(void) addHeader:(NSString*)value forKey:(NSString*)key { [self.defaultHeaders setValue:value forKey:key]; } @@ -82,12 +71,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/store/inventory", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/store/inventory"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -125,7 +115,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -157,12 +147,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/store/order", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/store/order"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -216,7 +207,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -253,13 +244,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/store/order/{orderId}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/store/order/{orderId}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"orderId", @"}"]] withString: [SWGApiClient escape:orderId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"orderId", @"}"]] withString: [SWGApiClient escape:orderId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -297,7 +289,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -334,13 +326,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/store/order/{orderId}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/store/order/{orderId}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"orderId", @"}"]] withString: [SWGApiClient escape:orderId]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"orderId", @"}"]] withString: [SWGApiClient escape:orderId]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -378,7 +371,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"DELETE" queryParams: queryParams formParams: formParams diff --git a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.h b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.h index 9a3dfd9d23d..a6e69a8947d 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.h +++ b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.h @@ -18,8 +18,6 @@ -(void) addHeader:(NSString*)value forKey:(NSString*)key; -(unsigned long) requestQueueSize; +(SWGUserApi*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; -+(void) setBasePath:(NSString*)basePath; -+(NSString*) getBasePath; /// /// /// Create user diff --git a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m index 845e8d93ae3..46a76b35b57 100644 --- a/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m +++ b/samples/client/petstore/objc/SwaggerClient/SWGUserApi.m @@ -9,14 +9,16 @@ @implementation SWGUserApi -static NSString * basePath = @"http://petstore.swagger.io/v2"; - #pragma mark - Initialize methods - (id) init { self = [super init]; if (self) { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; + SWGConfiguration *config = [SWGConfiguration sharedConfig]; + if (config.apiClient == nil) { + config.apiClient = [[SWGApiClient alloc] init]; + } + self.apiClient = config.apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -25,12 +27,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - (id) initWithApiClient:(SWGApiClient *)apiClient { self = [super init]; if (self) { - if (apiClient) { - self.apiClient = apiClient; - } - else { - self.apiClient = [SWGApiClient sharedClientFromPool:basePath]; - } + self.apiClient = apiClient; self.defaultHeaders = [NSMutableDictionary dictionary]; } return self; @@ -48,14 +45,6 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; return singletonAPI; } -+(void) setBasePath:(NSString*)path { - basePath = path; -} - -+(NSString*) getBasePath { - return basePath; -} - -(void) addHeader:(NSString*)value forKey:(NSString*)key { [self.defaultHeaders setValue:value forKey:key]; } @@ -85,12 +74,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -144,7 +134,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -176,12 +166,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/createWithArray", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/createWithArray"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -235,7 +226,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -267,12 +258,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/createWithList", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/createWithList"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -326,7 +318,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"POST" queryParams: queryParams formParams: formParams @@ -361,12 +353,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/login", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/login"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -412,7 +405,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -441,12 +434,13 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/logout", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/logout"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -484,7 +478,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -521,13 +515,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/{username}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/{username}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -565,7 +560,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"GET" queryParams: queryParams formParams: formParams @@ -605,13 +600,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/{username}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/{username}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -665,7 +661,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"PUT" queryParams: queryParams formParams: formParams @@ -702,13 +698,14 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; } - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@/user/{username}", basePath]; + NSMutableString* resourcePath = [NSMutableString stringWithFormat:@"/user/{username}"]; // remove format in URL if needed - if ([requestUrl rangeOfString:@".{format}"].location != NSNotFound) - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:@".{format}"] withString:@".json"]; - - [requestUrl replaceCharactersInRange: [requestUrl rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; + if ([resourcePath rangeOfString:@".{format}"].location != NSNotFound) { + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:@".{format}"] withString:@".json"]; + } + + [resourcePath replaceCharactersInRange: [resourcePath rangeOfString:[NSString stringWithFormat:@"%@%@%@", @"{", @"username", @"}"]] withString: [SWGApiClient escape:username]]; NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; @@ -746,7 +743,7 @@ static NSString * basePath = @"http://petstore.swagger.io/v2"; - return [self.apiClient requestWithCompletionBlock: requestUrl + return [self.apiClient requestWithCompletionBlock: resourcePath method: @"DELETE" queryParams: queryParams formParams: formParams diff --git a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/SWGViewController.m b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/SWGViewController.m index 5fe98be055f..ab7f6e8f72e 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/SWGViewController.m +++ b/samples/client/petstore/objc/SwaggerClientTests/SwaggerClient/SWGViewController.m @@ -7,7 +7,9 @@ // #import "SWGViewController.h" +#import #import +#import #import @interface SWGViewController () @@ -19,11 +21,6 @@ - (void)viewDidLoad { [super viewDidLoad]; - SWGConfiguration *config = [SWGConfiguration sharedConfig]; - [config setApiKey:@"hello" forApiKeyIdentifier:@"world"]; - [config setApiKey:@"geekerzp" forApiKeyIdentifier:@"zp"]; - [config removeApiKey:@"zp"]; - NSLog(@"%@", config.apiKey); } - (void)didReceiveMemoryWarning diff --git a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m index 687eb5db7a3..0460a4be4af 100644 --- a/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m +++ b/samples/client/petstore/objc/SwaggerClientTests/Tests/DeserializationTest.m @@ -149,4 +149,17 @@ XCTAssertTrue([result[0][0] isKindOfClass:[NSString class]]); } +- (void)testDeserializeBool { + NSString *data; + NSNumber *result; + + data = @"true"; + result = [apiClient deserialize:data class:@"NSNumber*"]; + XCTAssertTrue([result isEqual:@YES]); + + data = @"false"; + result = [apiClient deserialize:data class:@"NSNumber*"]; + XCTAssertTrue([result isEqual:@NO]); +} + @end diff --git a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php index 002df7fc713..fcea7100ae4 100644 --- a/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php +++ b/samples/client/petstore/php/SwaggerClient-php/lib/Configuration.php @@ -89,7 +89,7 @@ class Configuration * * @var string */ - protected $host = 'http://localhost'; + protected $host = 'http://petstore.swagger.io/v2'; /** * Timeout (second) of the HTTP request, by default set to 0, no timeout @@ -103,7 +103,7 @@ class Configuration * * @var string */ - protected $userAgent = "PHP-Swagger"; + protected $userAgent = "PHP-Swagger/1.0.0"; /** * Debug switch (default set to false) diff --git a/samples/client/petstore/python/swagger_client/api_client.py b/samples/client/petstore/python/swagger_client/api_client.py index 24b1e52ff3e..ca9a3c05104 100644 --- a/samples/client/petstore/python/swagger_client/api_client.py +++ b/samples/client/petstore/python/swagger_client/api_client.py @@ -247,12 +247,12 @@ class ApiClient(object): return None if type(klass) == str: - if 'list[' in klass: + if klass.startswith('list['): sub_kls = re.match('list\[(.*)\]', klass).group(1) return [self.__deserialize(sub_data, sub_kls) for sub_data in data] - if 'dict(' in klass: + if klass.startswith('dict('): sub_kls = re.match('dict\(([^,]*), (.*)\)', klass).group(2) return {k: self.__deserialize(v, sub_kls) for k, v in iteritems(data)} diff --git a/samples/client/petstore/python/swagger_client/configuration.py b/samples/client/petstore/python/swagger_client/configuration.py index a175303a222..8f469b72653 100644 --- a/samples/client/petstore/python/swagger_client/configuration.py +++ b/samples/client/petstore/python/swagger_client/configuration.py @@ -19,7 +19,13 @@ Copyright 2015 SmartBear Software from __future__ import absolute_import import base64 import urllib3 -import httplib + +try: + import httplib +except ImportError: + # python3 + import http.client as httplib + import sys import logging diff --git a/samples/client/petstore/python/swagger_client/models/order.py b/samples/client/petstore/python/swagger_client/models/order.py index dd414e34f32..a381853b91f 100644 --- a/samples/client/petstore/python/swagger_client/models/order.py +++ b/samples/client/petstore/python/swagger_client/models/order.py @@ -56,7 +56,7 @@ class Order(object): self._pet_id = None self._quantity = None self._ship_date = None - self._status = None # Order Status + self._status = None self._complete = None @property diff --git a/samples/client/petstore/python/swagger_client/models/pet.py b/samples/client/petstore/python/swagger_client/models/pet.py index 1a8916bb6b7..57dc93387a9 100644 --- a/samples/client/petstore/python/swagger_client/models/pet.py +++ b/samples/client/petstore/python/swagger_client/models/pet.py @@ -57,7 +57,7 @@ class Pet(object): self._name = None self._photo_urls = None self._tags = None - self._status = None # pet status in the store + self._status = None @property def id(self): diff --git a/samples/client/petstore/python/swagger_client/models/user.py b/samples/client/petstore/python/swagger_client/models/user.py index ecb92eb9dde..7380bc94582 100644 --- a/samples/client/petstore/python/swagger_client/models/user.py +++ b/samples/client/petstore/python/swagger_client/models/user.py @@ -63,7 +63,7 @@ class User(object): self._email = None self._password = None self._phone = None - self._user_status = None # User Status + self._user_status = None @property def id(self): diff --git a/samples/client/petstore/python/swagger_client/rest.py b/samples/client/petstore/python/swagger_client/rest.py index f6161a6d60c..8a8e55eb3d1 100644 --- a/samples/client/petstore/python/swagger_client/rest.py +++ b/samples/client/petstore/python/swagger_client/rest.py @@ -216,10 +216,10 @@ class ApiException(Exception): error_message = "({0})\n"\ "Reason: {1}\n".format(self.status, self.reason) if self.headers: - error_message += "HTTP response headers: {0}".format(self.headers) + error_message += "HTTP response headers: {0}\n".format(self.headers) if self.body: - error_message += "HTTP response body: {0}".format(self.body) + error_message += "HTTP response body: {0}\n".format(self.body) return error_message