From 450894c52e69169d23feb62c715b825695bdd570 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 07:16:56 -0800 Subject: [PATCH 1/6] moved to modules --- pom.xml | 207 +- .../swagger/codegen/ClientOptInput.java | 59 - .../wordnik/swagger/codegen/ClientOpts.java | 52 - .../com/wordnik/swagger/codegen/Codegen.java | 123 - .../swagger/codegen/CodegenConfig.java | 51 - .../wordnik/swagger/codegen/CodegenModel.java | 16 - .../swagger/codegen/CodegenModelFactory.java | 38 - .../swagger/codegen/CodegenModelType.java | 20 - .../swagger/codegen/CodegenOperation.java | 29 - .../swagger/codegen/CodegenParameter.java | 37 - .../swagger/codegen/CodegenProperty.java | 24 - .../swagger/codegen/CodegenResponse.java | 10 - .../swagger/codegen/DefaultCodegen.java | 883 --- .../swagger/codegen/DefaultGenerator.java | 371 - .../wordnik/swagger/codegen/Generator.java | 8 - .../swagger/codegen/SupportingFile.java | 13 - .../swagger/codegen/auth/AuthMethod.java | 6 - .../languages/AndroidClientCodegen.java | 106 - .../codegen/languages/JavaClientCodegen.java | 115 - .../codegen/languages/JaxRSServerCodegen.java | 129 - .../languages/NodeJSServerCodegen.java | 79 - .../codegen/languages/ObjcClientCodegen.java | 216 - .../codegen/languages/PhpClientCodegen.java | 110 - .../languages/PythonClientCodegen.java | 117 - .../codegen/languages/ScalaClientCodegen.java | 182 - .../languages/ScalatraServerCodegen.java | 174 - .../codegen/languages/StaticDocCodegen.java | 72 - .../languages/StaticHtmlGenerator.java | 81 - .../codegen/languages/SwaggerGenerator.java | 38 - .../codegen/languages/TizenClientCodegen.java | 243 - src/main/resources/Groovy/ApiUtils.mustache | 50 - src/main/resources/Groovy/api.mustache | 56 - .../resources/Groovy/build.gradle.mustache | 32 - src/main/resources/Groovy/model.mustache | 21 - src/main/resources/Java/JsonUtil.mustache | 23 - src/main/resources/Java/api.mustache | 109 - src/main/resources/Java/apiException.mustache | 29 - src/main/resources/Java/apiInvoker.mustache | 187 - src/main/resources/Java/model.mustache | 49 - src/main/resources/Java/pom.mustache | 168 - .../resources/JavaJaxRS/ApiException.mustache | 9 - .../JavaJaxRS/ApiOriginFilter.mustache | 26 - .../JavaJaxRS/ApiResponseMessage.mustache | 68 - .../JavaJaxRS/NotFoundException.mustache | 9 - src/main/resources/JavaJaxRS/README.mustache | 10 - src/main/resources/JavaJaxRS/api.mustache | 40 - .../resources/JavaJaxRS/bodyParams.mustache | 1 - .../resources/JavaJaxRS/formParams.mustache | 1 - .../resources/JavaJaxRS/headerParams.mustache | 1 - src/main/resources/JavaJaxRS/model.mustache | 47 - .../resources/JavaJaxRS/pathParams.mustache | 1 - src/main/resources/JavaJaxRS/pom.mustache | 141 - .../JavaJaxRS/project/build.properties | 1 - .../resources/JavaJaxRS/project/plugins.sbt | 9 - .../resources/JavaJaxRS/queryParams.mustache | 1 - src/main/resources/JavaJaxRS/web.mustache | 54 - .../com.wordnik.swagger.codegen.CodegenConfig | 13 - src/main/resources/android-java/api.mustache | 88 - .../android-java/apiException.mustache | 29 - .../android-java/apiInvoker.mustache | 283 - .../resources/android-java/httpPatch.mustache | 16 - .../resources/android-java/jsonUtil.mustache | 20 - .../resources/android-java/model.mustache | 47 - src/main/resources/android-java/pom.mustache | 162 - src/main/resources/asyncscala/api.mustache | 59 - src/main/resources/asyncscala/client.mustache | 26 - src/main/resources/asyncscala/model.mustache | 15 - src/main/resources/asyncscala/sbt.mustache | 11 - src/main/resources/csharp/Newtonsoft.Json.dll | Bin 426496 -> 0 bytes src/main/resources/csharp/api.mustache | 101 - .../resources/csharp/apiException.mustache | 21 - src/main/resources/csharp/apiInvoker.mustache | 207 - src/main/resources/csharp/compile.mustache | 2 - src/main/resources/csharp/model.mustache | 30 - src/main/resources/flash/ASAXB-0.1.1.swc | Bin 46948 -> 0 bytes .../resources/flash/AirExecutorApp-app.xml | 146 - src/main/resources/flash/ApiClientEvent.as | 36 - src/main/resources/flash/ApiError.as | 10 - src/main/resources/flash/ApiErrorCodes.as | 34 - src/main/resources/flash/ApiInvoker.as | 289 - src/main/resources/flash/ApiUrlHelper.as | 41 - .../resources/flash/ApiUserCredentials.as | 63 - src/main/resources/flash/ListWrapper.as | 9 - src/main/resources/flash/Response.as | 56 - src/main/resources/flash/SwaggerApi.as | 75 - src/main/resources/flash/XMLWriter.as | 28 - src/main/resources/flash/api.mustache | 73 - src/main/resources/flash/as3corelib.swc | Bin 255357 -> 0 bytes src/main/resources/flash/build.properties | 29 - src/main/resources/flash/build.xml | 192 - src/main/resources/flash/facetValue.as | 8 - ...flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc | Bin 194680 -> 0 bytes ...aircilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 2294 -> 0 bytes ...it-cilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 11827 -> 0 bytes ...xunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc | Bin 165338 -> 0 bytes src/main/resources/flash/model.mustache | 40 - src/main/resources/flash/modelList.mustache | 23 - .../resources/htmlDocs/bodyParam.mustache | 3 - .../resources/htmlDocs/formParam.mustache | 3 - .../resources/htmlDocs/headerParam.mustache | 3 - src/main/resources/htmlDocs/index.mustache | 60 - .../resources/htmlDocs/pathParam.mustache | 3 - .../resources/htmlDocs/queryParam.mustache | 3 - .../resources/htmlDocs/style.css.mustache | 136 - src/main/resources/logback.xml | 12 - src/main/resources/nodejs/README.mustache | 10 - src/main/resources/nodejs/api.mustache | 62 - src/main/resources/nodejs/main.mustache | 52 - src/main/resources/nodejs/models.mustache | 3 - src/main/resources/nodejs/package.mustache | 16 - src/main/resources/objc/Podfile.mustache | 3 - src/main/resources/objc/SWGApiClient.h | 64 - src/main/resources/objc/SWGApiClient.m | 419 -- src/main/resources/objc/SWGDate.h | 12 - src/main/resources/objc/SWGDate.m | 34 - src/main/resources/objc/SWGFile.h | 13 - src/main/resources/objc/SWGFile.m | 26 - src/main/resources/objc/SWGObject.h | 6 - src/main/resources/objc/SWGObject.m | 17 - src/main/resources/objc/api-body.mustache | 234 - src/main/resources/objc/api-header.mustache | 29 - src/main/resources/objc/model-body.mustache | 94 - src/main/resources/objc/model-header.mustache | 24 - src/main/resources/php/Swagger.mustache | 231 - src/main/resources/php/api.mustache | 86 - src/main/resources/php/model.mustache | 40 - src/main/resources/python/__init__.mustache | 9 - src/main/resources/python/api.mustache | 98 - src/main/resources/python/model.mustache | 40 - src/main/resources/python/swagger.mustache | 208 - src/main/resources/python3/__init__.mustache | 9 - src/main/resources/python3/api.mustache | 96 - src/main/resources/python3/model.mustache | 40 - src/main/resources/python3/swagger.mustache | 203 - src/main/resources/ruby/api.mustache | 85 - src/main/resources/ruby/model.mustache | 41 - src/main/resources/ruby/monkey.mustache | 90 - src/main/resources/ruby/swagger.mustache | 84 - .../ruby/swagger/configuration.mustache | 22 - .../resources/ruby/swagger/request.mustache | 199 - .../resources/ruby/swagger/response.mustache | 70 - .../resources/ruby/swagger/version.mustache | 4 - src/main/resources/scala/api.mustache | 68 - src/main/resources/scala/apiInvoker.mustache | 164 - src/main/resources/scala/model.mustache | 15 - src/main/resources/scala/pom.mustache | 232 - .../resources/scalatra/Bootstrap.mustache | 20 - src/main/resources/scalatra/JettyMain.scala | 43 - src/main/resources/scalatra/JsonUtil.scala | 12 - src/main/resources/scalatra/README.mustache | 10 - .../resources/scalatra/ServletApp.mustache | 39 - src/main/resources/scalatra/api.mustache | 94 - src/main/resources/scalatra/build.sbt | 64 - src/main/resources/scalatra/model.mustache | 15 - .../scalatra/project/build.properties | 1 - .../resources/scalatra/project/plugins.sbt | 9 - src/main/resources/scalatra/sbt | 525 -- src/main/resources/scalatra/web.xml | 17 - .../assets/css/bootstrap-responsive.css | 1092 --- .../swagger-static/assets/css/bootstrap.css | 6057 ----------------- .../swagger-static/assets/css/site.css | 1 - .../swagger-static/assets/css/style.css | 292 - .../swagger-static/assets/images/logo.png | Bin 14577 -> 0 bytes .../swagger-static/assets/js/bootstrap.js | 2159 ------ .../assets/js/jquery-1.8.3.min.js | 2 - .../swagger-static/assets/js/main.js | 75 - .../resources/swagger-static/index.mustache | 58 - .../resources/swagger-static/main.mustache | 7 - .../resources/swagger-static/model.mustache | 13 - .../swagger-static/operation.mustache | 52 - .../resources/swagger-static/package.mustache | 12 - src/main/resources/swagger-static/pom.xml | 100 - src/main/resources/tizen/README.md | 2 - src/main/resources/tizen/api-body.mustache | 131 - src/main/resources/tizen/api-header.mustache | 37 - .../resources/tizen/apiclient-body.mustache | 124 - .../resources/tizen/apiclient-header.mustache | 73 - src/main/resources/tizen/error-body.mustache | 55 - .../resources/tizen/error-header.mustache | 35 - .../resources/tizen/helpers-body.mustache | 273 - .../resources/tizen/helpers-header.mustache | 45 - src/main/resources/tizen/model-body.mustache | 158 - .../resources/tizen/model-header.mustache | 58 - .../resources/tizen/modelFactory.mustache | 31 - src/main/resources/tizen/object.mustache | 27 - src/main/resources/validator/index.mustache | 262 - src/test/resources/1_2/petstore-1.2/api-docs | 60 - src/test/resources/1_2/petstore-1.2/pet | 425 -- src/test/resources/1_2/petstore-1.2/store | 145 - src/test/resources/1_2/petstore-1.2/user | 299 - src/test/resources/2_0/petstore.json | 951 --- src/test/resources/2_0/postBodyTest.json | 102 - src/test/scala/CodegenTest.scala | 98 - src/test/scala/Java/JavaModelEnumTest.scala | 33 - src/test/scala/Java/JavaModelTest.scala | 268 - src/test/scala/Objc/ObjcModelTest.scala | 260 - src/test/scala/SwaggerMigratorTest.scala | 19 - src/test/scala/php/PhpModelTest.scala | 259 - src/test/scala/scala/ScalaModelTest.scala | 241 - .../staticDocs/StaticOperationTest.scala | 65 - 200 files changed, 27 insertions(+), 25787 deletions(-) delete mode 100644 src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/ClientOpts.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/Codegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenModel.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/Generator.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/SupportingFile.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java delete mode 100755 src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java delete mode 100644 src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java delete mode 100644 src/main/resources/Groovy/ApiUtils.mustache delete mode 100644 src/main/resources/Groovy/api.mustache delete mode 100644 src/main/resources/Groovy/build.gradle.mustache delete mode 100644 src/main/resources/Groovy/model.mustache delete mode 100644 src/main/resources/Java/JsonUtil.mustache delete mode 100644 src/main/resources/Java/api.mustache delete mode 100644 src/main/resources/Java/apiException.mustache delete mode 100644 src/main/resources/Java/apiInvoker.mustache delete mode 100644 src/main/resources/Java/model.mustache delete mode 100644 src/main/resources/Java/pom.mustache delete mode 100644 src/main/resources/JavaJaxRS/ApiException.mustache delete mode 100644 src/main/resources/JavaJaxRS/ApiOriginFilter.mustache delete mode 100644 src/main/resources/JavaJaxRS/ApiResponseMessage.mustache delete mode 100644 src/main/resources/JavaJaxRS/NotFoundException.mustache delete mode 100644 src/main/resources/JavaJaxRS/README.mustache delete mode 100644 src/main/resources/JavaJaxRS/api.mustache delete mode 100644 src/main/resources/JavaJaxRS/bodyParams.mustache delete mode 100644 src/main/resources/JavaJaxRS/formParams.mustache delete mode 100644 src/main/resources/JavaJaxRS/headerParams.mustache delete mode 100644 src/main/resources/JavaJaxRS/model.mustache delete mode 100644 src/main/resources/JavaJaxRS/pathParams.mustache delete mode 100644 src/main/resources/JavaJaxRS/pom.mustache delete mode 100644 src/main/resources/JavaJaxRS/project/build.properties delete mode 100644 src/main/resources/JavaJaxRS/project/plugins.sbt delete mode 100644 src/main/resources/JavaJaxRS/queryParams.mustache delete mode 100644 src/main/resources/JavaJaxRS/web.mustache delete mode 100644 src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig delete mode 100644 src/main/resources/android-java/api.mustache delete mode 100644 src/main/resources/android-java/apiException.mustache delete mode 100644 src/main/resources/android-java/apiInvoker.mustache delete mode 100644 src/main/resources/android-java/httpPatch.mustache delete mode 100644 src/main/resources/android-java/jsonUtil.mustache delete mode 100644 src/main/resources/android-java/model.mustache delete mode 100644 src/main/resources/android-java/pom.mustache delete mode 100644 src/main/resources/asyncscala/api.mustache delete mode 100644 src/main/resources/asyncscala/client.mustache delete mode 100644 src/main/resources/asyncscala/model.mustache delete mode 100644 src/main/resources/asyncscala/sbt.mustache delete mode 100644 src/main/resources/csharp/Newtonsoft.Json.dll delete mode 100644 src/main/resources/csharp/api.mustache delete mode 100644 src/main/resources/csharp/apiException.mustache delete mode 100644 src/main/resources/csharp/apiInvoker.mustache delete mode 100644 src/main/resources/csharp/compile.mustache delete mode 100644 src/main/resources/csharp/model.mustache delete mode 100644 src/main/resources/flash/ASAXB-0.1.1.swc delete mode 100644 src/main/resources/flash/AirExecutorApp-app.xml delete mode 100644 src/main/resources/flash/ApiClientEvent.as delete mode 100644 src/main/resources/flash/ApiError.as delete mode 100644 src/main/resources/flash/ApiErrorCodes.as delete mode 100644 src/main/resources/flash/ApiInvoker.as delete mode 100644 src/main/resources/flash/ApiUrlHelper.as delete mode 100644 src/main/resources/flash/ApiUserCredentials.as delete mode 100644 src/main/resources/flash/ListWrapper.as delete mode 100644 src/main/resources/flash/Response.as delete mode 100644 src/main/resources/flash/SwaggerApi.as delete mode 100644 src/main/resources/flash/XMLWriter.as delete mode 100644 src/main/resources/flash/api.mustache delete mode 100644 src/main/resources/flash/as3corelib.swc delete mode 100644 src/main/resources/flash/build.properties delete mode 100644 src/main/resources/flash/build.xml delete mode 100644 src/main/resources/flash/facetValue.as delete mode 100644 src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc delete mode 100644 src/main/resources/flash/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc delete mode 100644 src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc delete mode 100644 src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc delete mode 100644 src/main/resources/flash/model.mustache delete mode 100644 src/main/resources/flash/modelList.mustache delete mode 100644 src/main/resources/htmlDocs/bodyParam.mustache delete mode 100644 src/main/resources/htmlDocs/formParam.mustache delete mode 100644 src/main/resources/htmlDocs/headerParam.mustache delete mode 100644 src/main/resources/htmlDocs/index.mustache delete mode 100644 src/main/resources/htmlDocs/pathParam.mustache delete mode 100644 src/main/resources/htmlDocs/queryParam.mustache delete mode 100644 src/main/resources/htmlDocs/style.css.mustache delete mode 100644 src/main/resources/logback.xml delete mode 100644 src/main/resources/nodejs/README.mustache delete mode 100644 src/main/resources/nodejs/api.mustache delete mode 100644 src/main/resources/nodejs/main.mustache delete mode 100644 src/main/resources/nodejs/models.mustache delete mode 100755 src/main/resources/nodejs/package.mustache delete mode 100644 src/main/resources/objc/Podfile.mustache delete mode 100644 src/main/resources/objc/SWGApiClient.h delete mode 100644 src/main/resources/objc/SWGApiClient.m delete mode 100644 src/main/resources/objc/SWGDate.h delete mode 100644 src/main/resources/objc/SWGDate.m delete mode 100644 src/main/resources/objc/SWGFile.h delete mode 100644 src/main/resources/objc/SWGFile.m delete mode 100644 src/main/resources/objc/SWGObject.h delete mode 100644 src/main/resources/objc/SWGObject.m delete mode 100644 src/main/resources/objc/api-body.mustache delete mode 100644 src/main/resources/objc/api-header.mustache delete mode 100644 src/main/resources/objc/model-body.mustache delete mode 100644 src/main/resources/objc/model-header.mustache delete mode 100644 src/main/resources/php/Swagger.mustache delete mode 100644 src/main/resources/php/api.mustache delete mode 100644 src/main/resources/php/model.mustache delete mode 100644 src/main/resources/python/__init__.mustache delete mode 100644 src/main/resources/python/api.mustache delete mode 100644 src/main/resources/python/model.mustache delete mode 100644 src/main/resources/python/swagger.mustache delete mode 100644 src/main/resources/python3/__init__.mustache delete mode 100644 src/main/resources/python3/api.mustache delete mode 100644 src/main/resources/python3/model.mustache delete mode 100644 src/main/resources/python3/swagger.mustache delete mode 100644 src/main/resources/ruby/api.mustache delete mode 100644 src/main/resources/ruby/model.mustache delete mode 100644 src/main/resources/ruby/monkey.mustache delete mode 100644 src/main/resources/ruby/swagger.mustache delete mode 100644 src/main/resources/ruby/swagger/configuration.mustache delete mode 100644 src/main/resources/ruby/swagger/request.mustache delete mode 100644 src/main/resources/ruby/swagger/response.mustache delete mode 100644 src/main/resources/ruby/swagger/version.mustache delete mode 100644 src/main/resources/scala/api.mustache delete mode 100644 src/main/resources/scala/apiInvoker.mustache delete mode 100644 src/main/resources/scala/model.mustache delete mode 100644 src/main/resources/scala/pom.mustache delete mode 100644 src/main/resources/scalatra/Bootstrap.mustache delete mode 100644 src/main/resources/scalatra/JettyMain.scala delete mode 100644 src/main/resources/scalatra/JsonUtil.scala delete mode 100644 src/main/resources/scalatra/README.mustache delete mode 100644 src/main/resources/scalatra/ServletApp.mustache delete mode 100644 src/main/resources/scalatra/api.mustache delete mode 100644 src/main/resources/scalatra/build.sbt delete mode 100644 src/main/resources/scalatra/model.mustache delete mode 100644 src/main/resources/scalatra/project/build.properties delete mode 100644 src/main/resources/scalatra/project/plugins.sbt delete mode 100755 src/main/resources/scalatra/sbt delete mode 100644 src/main/resources/scalatra/web.xml delete mode 100644 src/main/resources/swagger-static/assets/css/bootstrap-responsive.css delete mode 100644 src/main/resources/swagger-static/assets/css/bootstrap.css delete mode 100644 src/main/resources/swagger-static/assets/css/site.css delete mode 100644 src/main/resources/swagger-static/assets/css/style.css delete mode 100644 src/main/resources/swagger-static/assets/images/logo.png delete mode 100644 src/main/resources/swagger-static/assets/js/bootstrap.js delete mode 100644 src/main/resources/swagger-static/assets/js/jquery-1.8.3.min.js delete mode 100644 src/main/resources/swagger-static/assets/js/main.js delete mode 100644 src/main/resources/swagger-static/index.mustache delete mode 100644 src/main/resources/swagger-static/main.mustache delete mode 100644 src/main/resources/swagger-static/model.mustache delete mode 100644 src/main/resources/swagger-static/operation.mustache delete mode 100644 src/main/resources/swagger-static/package.mustache delete mode 100644 src/main/resources/swagger-static/pom.xml delete mode 100644 src/main/resources/tizen/README.md delete mode 100644 src/main/resources/tizen/api-body.mustache delete mode 100644 src/main/resources/tizen/api-header.mustache delete mode 100644 src/main/resources/tizen/apiclient-body.mustache delete mode 100644 src/main/resources/tizen/apiclient-header.mustache delete mode 100644 src/main/resources/tizen/error-body.mustache delete mode 100644 src/main/resources/tizen/error-header.mustache delete mode 100644 src/main/resources/tizen/helpers-body.mustache delete mode 100644 src/main/resources/tizen/helpers-header.mustache delete mode 100644 src/main/resources/tizen/model-body.mustache delete mode 100644 src/main/resources/tizen/model-header.mustache delete mode 100644 src/main/resources/tizen/modelFactory.mustache delete mode 100644 src/main/resources/tizen/object.mustache delete mode 100644 src/main/resources/validator/index.mustache delete mode 100644 src/test/resources/1_2/petstore-1.2/api-docs delete mode 100644 src/test/resources/1_2/petstore-1.2/pet delete mode 100644 src/test/resources/1_2/petstore-1.2/store delete mode 100644 src/test/resources/1_2/petstore-1.2/user delete mode 100644 src/test/resources/2_0/petstore.json delete mode 100644 src/test/resources/2_0/postBodyTest.json delete mode 100644 src/test/scala/CodegenTest.scala delete mode 100644 src/test/scala/Java/JavaModelEnumTest.scala delete mode 100644 src/test/scala/Java/JavaModelTest.scala delete mode 100644 src/test/scala/Objc/ObjcModelTest.scala delete mode 100644 src/test/scala/SwaggerMigratorTest.scala delete mode 100644 src/test/scala/php/PhpModelTest.scala delete mode 100644 src/test/scala/scala/ScalaModelTest.scala delete mode 100644 src/test/scala/staticDocs/StaticOperationTest.scala diff --git a/pom.xml b/pom.xml index 1205eb5d152..2666991140a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,15 +6,15 @@ 4.0.0 com.wordnik - swagger-codegen - jar - wordnik-swagger-codegen + swagger-codegen-project + pom + swagger-codegen 2.1.0-SNAPSHOT - https://github.com/wordnik/swagger-codegen + https://github.com/swagger-api/swagger-codegen - scm:git:git@github.com:wordnik/swagger-codegen.git - scm:git:git@github.com:wordnik/swagger-codegen.git - https://github.com/wordnik/swagger-codegen + scm:git:git@github.com:swagger-api/swagger-codegen.git + scm:git:git@github.com:swagger-api/swagger-codegen.git + https://github.com/swagger-api/swagger-codegen 2.2.0 @@ -28,7 +28,7 @@ github - https://github.com/wordnik/swagger-codegen/issues + https://github.com/swagger-api/swagger-core/issues @@ -44,9 +44,8 @@ - src/test/scala + src/main/java target/classes - target/test-classes org.jvnet.wagon-svn @@ -68,33 +67,6 @@ target ${project.artifactId}-${project.version} - - org.codehaus.mojo - exec-maven-plugin - 1.3.2 - - - - java - - - - - com.wordnik.swagger.codegen.Codegen - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - com.wordnik.swagger.codegen.Codegen - - - - maven-dependency-plugin @@ -109,44 +81,6 @@ - - net.alchim31.maven - scala-maven-plugin - - - - add-source - compile - testCompile - - - - - - incremental - - - -Xmx384m - - - -target:jvm-1.6 - -deprecation - - - - run-scalatest - org.scalatest.tools.Runner - - -p - ${project.build.testOutputDirectory} - - - -Xmx512m - - - - - org.apache.maven.plugins maven-source-plugin @@ -189,8 +123,8 @@ maven-compiler-plugin 3.0 - 1.7 - 1.7 + 1.6 + 1.6 @@ -218,7 +152,7 @@ maven-release-plugin 2.1 - + @@ -234,21 +168,6 @@ sign - - org.mortbay.jetty - jetty-maven-plugin - ${jetty-version} - - - com.sun.jersey - jersey-servlet - ${jersey-version} - - - - ${scala-version} - - @@ -321,6 +240,10 @@ + + modules/swagger-codegen + modules/swagger-codegen-distribution + target/site @@ -365,83 +288,16 @@ - - - io.swagger - swagger-parser - ${swagger-parser-version} - compile - - - io.swagger - swagger-legacy-spec-parser - ${swagger-parser-version} - compile - - - ${project.groupId} - swagger-core - ${swagger-core-version} - compile - - - com.samskivert - jmustache - ${jmustache-version} - compile - - - commons-io - commons-io - ${commons-io-version} - compile - - - org.apache.maven - maven-plugin-tools-api - 2.0 - - - org.apache.felix - maven-bundle-plugin - ${felix-version} - - - org.slf4j - slf4j-ext - ${slf4j-version} - compile - - - org.slf4j - slf4j-api - ${slf4j-version} - compile - - - commons-lang - commons-lang - ${commons-lang-version} - compile - - - commons-cli - commons-cli - ${commons-cli-version} - - - org.scalatest - scalatest_2.11 - ${scala-test-version} - test - - - junit - junit - ${junit-version} - test - - + + + + junit + junit + ${junit-version} + test + + + 1.0.0-SNAPSHOT 2.11.1 @@ -458,13 +314,4 @@ 2.10.4 1.9 - - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - true - - - - + \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java b/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java deleted file mode 100644 index cdfb1191b2f..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright 2014 Reverb, 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. - */ - -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.codegen.ClientOpts; - -import com.wordnik.swagger.models.Swagger; - -public class ClientOptInput { - private ClientOpts opts; - private Swagger swagger; - protected CodegenConfig config; - - public ClientOptInput swagger(Swagger swagger) { - this.setSwagger(swagger); - return this; - } - public ClientOptInput opts(ClientOpts opts) { - this.setOpts(opts); - return this; - } - - public CodegenConfig getConfig() { - return config; - } - public void setConfig(CodegenConfig config) { - this.config = config; - } - - public void setOpts(ClientOpts opts) { - this.opts = opts; - } - - public ClientOpts getOpts() { - return opts; - } - - public void setSwagger(Swagger swagger) { - this.swagger = swagger; - } - - public Swagger getSwagger() { - return swagger; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java b/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java deleted file mode 100644 index b8d681cc307..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.codegen.auth.*; - -import java.util.*; - -public class ClientOpts { - protected String uri; - protected String target; - protected AuthMethod auth; - protected Map properties = new HashMap(); - protected String outputDirectory; - - public String getUri() { - return uri; - } - public void setUri(String uri) { - this.uri = uri; - } - - public String getTarget() { - return target; - } - public void setTarget(String target) { - this.target = target; - } - - public Map getProperties() { - return properties; - } - public void setProperties(Map properties) { - this.properties = properties; - } - - public String getOutputDirectory() { - return outputDirectory; - } - public void setOutputDirectory(String outputDirectory) { - this.outputDirectory = outputDirectory; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("ClientOpts: {\n"); - sb.append(" uri: ").append(uri).append(","); - sb.append(" auth: ").append(auth).append(","); - sb.append(properties); - sb.append("}"); - return sb.toString(); - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/Codegen.java b/src/main/java/com/wordnik/swagger/codegen/Codegen.java deleted file mode 100644 index c9e39c7f2f3..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/Codegen.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.codegen.languages.*; -import com.wordnik.swagger.models.Swagger; -import com.wordnik.swagger.util.*; - -import io.swagger.parser.SwaggerParser; - -import org.apache.commons.cli.*; - -import java.io.File; -import java.util.*; - -public class Codegen extends DefaultGenerator { - static String debugInfoOptions = "\nThe following additional debug options are available for all codegen targets:" + - "\n -DdebugSwagger prints the swagger specification as interpreted by the codegen" + - "\n -DdebugModels prints models passed to the template engine" + - "\n -DdebugOperations prints operations passed to the template engine" + - "\n -DdebugSupportingFiles prints additional data passed to the template engine"; - public static void main(String[] args) { - List extensions = getExtensions(); - Map configs = new HashMap(); - - StringBuilder sb = new StringBuilder(); - for(CodegenConfig config : extensions) { - if(sb.toString().length() != 0) - sb.append(", "); - sb.append(config.getName()); - configs.put(config.getName(), config); - } - - Options options = new Options(); - options.addOption("h", "help", false, "shows this message"); - options.addOption("l", "lang", true, "client language to generate.\nAvailable languages include:\n\t[" + sb.toString() + "]"); - options.addOption("o", "output", true, "where to write the generated files"); - options.addOption("i", "input-spec", true, "location of the swagger spec, as URL or file"); - options.addOption("t", "template-dir", true, "folder containing the template files"); - options.addOption("d", "debug-info", false, "prints additional info for debugging"); - - ClientOptInput clientOptInput = new ClientOptInput(); - ClientOpts clientOpts = new ClientOpts(); - Swagger swagger = null; - - CommandLine cmd = null; - try { - CommandLineParser parser = new BasicParser(); - CodegenConfig config = null; - - cmd = parser.parse(options, args); - if (cmd.hasOption("d")) { - usage(options); - System.out.println(debugInfoOptions); - return; - } - if (cmd.hasOption("l")) - clientOptInput.setConfig(getConfig(cmd.getOptionValue("l"), configs)); - if (cmd.hasOption("o")) - clientOptInput.getConfig().setOutputDir(cmd.getOptionValue("o")); - if (cmd.hasOption("h")) { - if(cmd.hasOption("l")) { - config = getConfig(String.valueOf(cmd.getOptionValue("l")), configs); - if(config != null) { - options.addOption("h", "help", true, config.getHelp()); - usage(options); - return; - } - } - usage(options); - return; - } - if (cmd.hasOption("i")) - swagger = new SwaggerParser().read(cmd.getOptionValue("i")); - if (cmd.hasOption("t")) - clientOpts.getProperties().put("templateDir", String.valueOf(cmd.getOptionValue("t"))); - } - catch (Exception e) { - usage(options); - return; - } - try{ - clientOptInput - .opts(clientOpts) - .swagger(swagger); - new Codegen().opts(clientOptInput).generate(); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public static List getExtensions() { - ServiceLoader loader = ServiceLoader.load(CodegenConfig.class); - List output = new ArrayList(); - Iterator itr = loader.iterator(); - while(itr.hasNext()) { - output.add(itr.next()); - } - return output; - } - - static void usage(Options options) { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp( "Codegen", options ); - } - - static CodegenConfig getConfig(String name, Map configs) { - if(configs.containsKey(name)) { - return configs.get(name); - } - else { - // see if it's a class - try { - System.out.println("loading class " + name); - Class customClass = Class.forName(name); - System.out.println("loaded"); - return (CodegenConfig)customClass.newInstance(); - } - catch (Exception e) { - throw new RuntimeException("can't load class " + name); - } - } - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java b/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java deleted file mode 100644 index 73abe291c1d..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; - -public interface CodegenConfig { - String getName(); - String getHelp(); - Map additionalProperties(); - String apiPackage(); - String apiFileFolder(); - String fileSuffix(); - String outputFolder(); - String templateDir(); - String modelFileFolder(); - String modelPackage(); - String toApiName(String name); - String toModelName(String name); - String toParamName(String name); - String escapeReservedWord(String name); - String getTypeDeclaration(Property p); - String getTypeDeclaration(String name); - void processOpts(); - - Set reservedWords(); - - List supportingFiles(); - - void setOutputDir(String dir); - String getOutputDir(); - - CodegenModel fromModel(String name, Model model); - CodegenOperation fromOperation(String resourcePath, String httpMethod, Operation operation); - Set defaultIncludes(); - Map typeMapping(); - Map instantiationTypes(); - Map importMapping(); - Map apiTemplateFiles(); - Map modelTemplateFiles(); - void processSwagger(Swagger swagger); - - String toApiFilename(String name); - String toModelFilename(String name); - String toModelImport(String name); - String toApiImport(String name); - void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations); - Map postProcessModels(Map objs); - Map postProcessOperations(Map objs); -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java deleted file mode 100644 index 169886da22e..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; - -public class CodegenModel { - public String parent; - public String name, classname, description, classVarName, modelJson; - public String defaultValue; - public List vars = new ArrayList(); - public Set imports = new HashSet(); - public Boolean hasVars, emptyVars, hasMoreModels; - public ExternalDocs externalDocs; -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java deleted file mode 100644 index b369623f37c..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.wordnik.swagger.codegen; - -import java.util.HashMap; -import java.util.Map; - -public final class CodegenModelFactory { - - private static final Map> typeMapping = new HashMap>(); - - /** - * Configure a different implementation class. - * @param type the type that shall be replaced - * @param implementation the implementation class must extend the default class and must provide a public no-arg constructor - */ - public static void setTypeMapping(CodegenModelType type, Class implementation) { - if (!type.getDefaultImplementation().isAssignableFrom(implementation)) { - throw new IllegalArgumentException(implementation.getSimpleName() + " doesn't extend " + type.getDefaultImplementation().getSimpleName()); - } - try { - implementation.newInstance(); - } catch (Exception e) { - throw new IllegalArgumentException(e); - } - typeMapping.put(type, implementation); - } - - @SuppressWarnings("unchecked") - public static T newInstance(CodegenModelType type) { - Class classType = typeMapping.get(type); - try { - return (T) (classType != null ? classType : type.getDefaultImplementation()).newInstance(); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java b/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java deleted file mode 100644 index 41c877532f0..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.wordnik.swagger.codegen; - -public enum CodegenModelType { - - MODEL(CodegenModel.class), - OPERATION(CodegenOperation.class), - PARAMETER(CodegenParameter.class), - PROPERTY(CodegenProperty.class), - RESPONSE(CodegenResponse.class); - - private final Class defaultImplementation; - - private CodegenModelType(Class defaultImplementation) { - this.defaultImplementation = defaultImplementation; - } - - public Class getDefaultImplementation() { - return defaultImplementation; - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java b/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java deleted file mode 100644 index 3609e53d9ee..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.*; - -import java.util.*; - -public class CodegenOperation { - public Boolean hasConsumes, hasProduces, hasParams, returnTypeIsPrimitive, returnSimpleType, subresourceOperation; - public String path, operationId, returnType, httpMethod, returnBaseType, - returnContainer, summary, notes, baseName, defaultResponse; - - public List> consumes, produces; - public CodegenParameter bodyParam; - public List allParams = new ArrayList(); - public List bodyParams = new ArrayList(); - public List pathParams = new ArrayList(); - public List queryParams = new ArrayList(); - public List headerParams = new ArrayList(); - public List formParams = new ArrayList(); - public List tags; - public List responses = new ArrayList(); - public final List responseHeaders = new ArrayList(); - public Set imports = new HashSet(); - public List> examples; - public ExternalDocs externalDocs; - - // legacy support - public String nickname; -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java b/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java deleted file mode 100644 index 4480c172c32..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.wordnik.swagger.codegen; - -public class CodegenParameter { - public Boolean isFormParam, isQueryParam, isPathParam, isHeaderParam, - isCookieParam, isBodyParam, isFile, notFile, hasMore, isContainer, secondaryParam; - public String baseName, paramName, dataType, collectionFormat, description, baseType; - /** - * Determines whether this parameter is mandatory. If the parameter is in "path", - * this property is required and its value MUST be true. Otherwise, the property - * MAY be included and its default value is false. - */ - public Boolean required; - - public CodegenParameter copy() { - CodegenParameter output = new CodegenParameter(); - output.isFile = this.isFile; - output.notFile = this.notFile; - output.hasMore = this.hasMore; - output.isContainer = this.isContainer; - output.secondaryParam = this.secondaryParam; - output.baseName = this.baseName; - output.paramName = this.paramName; - output.dataType = this.dataType; - output.collectionFormat = this.collectionFormat; - output.description = this.description; - output.baseType = this.baseType; - output.isFormParam = this.isFormParam; - output.isQueryParam = this.isQueryParam; - output.isPathParam = this.isPathParam; - output.isHeaderParam = this.isHeaderParam; - output.isCookieParam = this.isCookieParam; - output.isBodyParam = this.isBodyParam; - output.required = this.required; - - return output; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java b/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java deleted file mode 100644 index cda9ab714d4..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wordnik.swagger.codegen; - -import java.util.*; - -public class CodegenProperty { - public String baseName, complexType, getter, setter, description, datatype, - name, min, max, defaultValue, baseType, containerType; - - /** maxLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.1 */ - public Integer maxLength; - /** minLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.2 */ - public Integer minLength; - /** pattern validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.3 */ - public String pattern; - /** A free-form property to include an example of an instance for this schema. */ - public String example; - - public Double minimum, maximum, exclusiveMinimum, exclusiveMaximum; - public Boolean hasMore = null, required = null, secondaryParam = null; - public Boolean isPrimitiveType, isContainer, isNotContainer; - public boolean isEnum; - public List _enum; - public Map allowableValues; -} diff --git a/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java b/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java deleted file mode 100644 index 92b908759b1..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.wordnik.swagger.codegen; - -import java.util.*; - -public class CodegenResponse { - public String code, message; - public Boolean hasMore; - public List> examples; - Object schema; -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java deleted file mode 100644 index e89b0f0b26f..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java +++ /dev/null @@ -1,883 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.*; -import com.wordnik.swagger.models.parameters.*; -import com.wordnik.swagger.models.properties.*; -import com.wordnik.swagger.util.Json; - -import org.apache.commons.lang.StringUtils; - -import java.util.*; - -public class DefaultCodegen { - protected String outputFolder = ""; - protected Set defaultIncludes = new HashSet(); - protected Map typeMapping = new HashMap(); - protected Map instantiationTypes = new HashMap(); - protected Set reservedWords = new HashSet(); - protected Set languageSpecificPrimitives = new HashSet(); - protected Map importMapping = new HashMap(); - protected String modelPackage = "", apiPackage = "", fileSuffix; - protected Map apiTemplateFiles = new HashMap(); - protected Map modelTemplateFiles = new HashMap(); - protected String templateDir; - protected Map additionalProperties = new HashMap(); - protected List supportingFiles = new ArrayList(); - - public void processOpts(){ - if(additionalProperties.containsKey("templateDir")) { - this.setTemplateDir((String)additionalProperties.get("templateDir")); - } - } - - // override with any special post-processing - public Map postProcessModels(Map objs) { - return objs; - } - - // override with any special post-processing - public Map postProcessOperations(Map objs) { - return objs; - } - - // override with any special handling of the entire swagger spec - public void processSwagger(Swagger swagger) {} - - // override with any special text escaping logic - public String escapeText(String input) { - if(input != null) { - String output = input.replaceAll("\n", " "); - output = output.replace("\"", "\\\""); - return output; - } - return input; - } - - public Set defaultIncludes() { - return defaultIncludes; - } - public Map typeMapping() { - return typeMapping; - } - public Map instantiationTypes() { - return instantiationTypes; - } - public Set reservedWords() { - return reservedWords; - } - public Set languageSpecificPrimitives() { - return languageSpecificPrimitives; - } - public Map importMapping() { - return importMapping; - } - public String modelPackage() { - return modelPackage; - } - public String apiPackage() { - return apiPackage; - } - public String fileSuffix() { - return fileSuffix; - } - public String templateDir() { - return templateDir; - } - public Map apiTemplateFiles() { - return apiTemplateFiles; - } - public Map modelTemplateFiles() { - return modelTemplateFiles; - } - - public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - public Map additionalProperties() { - return additionalProperties; - } - public List supportingFiles() { - return supportingFiles; - } - public String outputFolder() { - return outputFolder; - } - - public void setOutputDir(String dir) { - this.outputFolder = dir; - } - public String getOutputDir() { - return outputFolder(); - } - - public void setTemplateDir(String templateDir) { - this.templateDir = templateDir; - } - - public String toApiFilename(String name) { - return initialCaps(name) + "Api"; - } - - public String toModelFilename(String name) { - return name; - } - - public String toVarName(String name) { - if(reservedWords.contains(name)) - return escapeReservedWord(name); - else - return name; - } - - public String toParamName(String name) { - if(reservedWords.contains(name)) { - return escapeReservedWord(name); - } - return name; - } - - public String escapeReservedWord(String name) { - throw new RuntimeException("reserved word " + name + " not allowed"); - } - - public String toModelImport(String name) { - if("".equals(modelPackage())) - return name; - else - return modelPackage() + "." + name; - } - - public String toApiImport(String name) { - return apiPackage() + "." + name; - } - - public DefaultCodegen() { - defaultIncludes = new HashSet( - Arrays.asList("double", - "int", - "long", - "short", - "char", - "float", - "String", - "boolean", - "Boolean", - "Double", - "Void", - "Integer", - "Long", - "Float") - ); - - typeMapping = new HashMap(); - typeMapping.put("array", "List"); - typeMapping.put("map", "Map"); - typeMapping.put("List", "List"); - typeMapping.put("boolean", "Boolean"); - typeMapping.put("string", "String"); - typeMapping.put("int", "Integer"); - typeMapping.put("float", "Float"); - typeMapping.put("number", "BigDecimal"); - typeMapping.put("DateTime", "Date"); - typeMapping.put("long", "Long"); - typeMapping.put("short", "Short"); - typeMapping.put("char", "String"); - typeMapping.put("double", "Double"); - typeMapping.put("object", "Object"); - typeMapping.put("integer", "Integer"); - - instantiationTypes = new HashMap(); - - reservedWords = new HashSet(); - - importMapping = new HashMap(); - importMapping.put("BigDecimal", "java.math.BigDecimal"); - importMapping.put("UUID", "java.util.UUID"); - importMapping.put("File", "java.io.File"); - importMapping.put("Date", "java.util.Date"); - importMapping.put("Timestamp", "java.sql.Timestamp"); - importMapping.put("Map", "java.util.Map"); - importMapping.put("HashMap", "java.util.HashMap"); - importMapping.put("Array", "java.util.List"); - importMapping.put("ArrayList", "java.util.ArrayList"); - importMapping.put("List", "java.util.*"); - importMapping.put("Set", "java.util.*"); - importMapping.put("DateTime", "org.joda.time.*"); - importMapping.put("LocalDateTime", "org.joda.time.*"); - importMapping.put("LocalDate", "org.joda.time.*"); - importMapping.put("LocalTime", "org.joda.time.*"); - } - - public String toInstantiationType(Property p) { - if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return instantiationTypes.get("map") + ""; - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return instantiationTypes.get("array") + "<" + inner + ">"; - } - else - return null; - } - - public String toDefaultValue(Property p) { - if(p instanceof StringProperty) - return "null"; - else if (p instanceof BooleanProperty) - return "null"; - else if(p instanceof DateProperty) - return "null"; - else if(p instanceof DateTimeProperty) - return "null"; - else if (p instanceof DoubleProperty) - return "null"; - else if (p instanceof FloatProperty) - return "null"; - else if (p instanceof IntegerProperty) - return "null"; - else if (p instanceof LongProperty) - return "null"; - else if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return "new HashMap() "; - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return "new ArrayList<" + inner + ">() "; - } - else - return "null"; - } - - /** - * returns the swagger type for the property - **/ - public String getSwaggerType(Property p) { - String datatype = null; - if(p instanceof StringProperty) - datatype = "string"; - else if (p instanceof BooleanProperty) - datatype = "boolean"; - else if(p instanceof DateProperty) - datatype = "date"; - else if(p instanceof DateTimeProperty) - datatype = "DateTime"; - else if (p instanceof DoubleProperty) - datatype = "double"; - else if (p instanceof FloatProperty) - datatype = "float"; - else if (p instanceof IntegerProperty) - datatype = "integer"; - else if (p instanceof LongProperty) - datatype = "long"; - else if (p instanceof MapProperty) - datatype = "map"; - else if (p instanceof DecimalProperty) - datatype = "number"; - else if (p instanceof RefProperty) { - RefProperty r = (RefProperty)p; - datatype = r.get$ref(); - if(datatype.indexOf("#/definitions/") == 0) - datatype = datatype.substring("#/definitions/".length()); - } - else { - if(p != null) datatype = p.getType(); - } - return datatype; - } - - public String initialCaps(String name) { - return Character.toUpperCase(name.charAt(0)) + name.substring(1); - } - - public String getTypeDeclaration(String name) { - return name; - } - - public String getTypeDeclaration(Property p) { - String swaggerType = getSwaggerType(p); - if(typeMapping.containsKey(swaggerType)) - return typeMapping.get(swaggerType); - return swaggerType; - } - - public String toApiName(String name) { - if(name.length() == 0) - return "DefaultApi"; - return initialCaps(name) + "Api"; - } - - public String toModelName(String name) { - return initialCaps(name); - } - - public CodegenModel fromModel(String name, Model model) { - CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL); - if(reservedWords.contains(name)) - m.name = escapeReservedWord(name); - else - m.name = name; - m.description = model.getDescription(); - m.classname = toModelName(name); - m.classVarName = toVarName(name); - m.modelJson = Json.pretty(model); - m.externalDocs = model.getExternalDocs(); - int count = 0; - if(model instanceof ArrayModel) { - ArrayModel am = (ArrayModel) model; - ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); - CodegenProperty cp = fromProperty(name, arrayProperty); - if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) - m.imports.add(cp.complexType); - m.parent = toInstantiationType(arrayProperty); - String containerType = cp.containerType; - if(instantiationTypes.containsKey(containerType)) - m.imports.add(instantiationTypes.get(containerType)); - if(typeMapping.containsKey(containerType)) { - containerType = typeMapping.get(containerType); - cp.containerType = containerType; - m.imports.add(containerType); - } - } - else if (model instanceof RefModel) { - // TODO - } - else { - ModelImpl impl = (ModelImpl) model; - if(impl.getAdditionalProperties() != null) { - MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); - CodegenProperty cp = fromProperty(name, mapProperty); - if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) - m.imports.add(cp.complexType); - m.parent = toInstantiationType(mapProperty); - String containerType = cp.containerType; - if(instantiationTypes.containsKey(containerType)) - m.imports.add(instantiationTypes.get(containerType)); - if(typeMapping.containsKey(containerType)) { - containerType = typeMapping.get(containerType); - cp.containerType = containerType; - m.imports.add(containerType); - } - } - if(impl.getProperties() != null && impl.getProperties().size() > 0) { - m.hasVars = true; - for(String key: impl.getProperties().keySet()) { - Property prop = impl.getProperties().get(key); - - if(prop == null) { - System.out.println("null property for " + key); - } - else { - CodegenProperty cp = fromProperty(key, prop); - cp.required = false; - if(impl.getRequired() != null) { - for(String req : impl.getRequired()) { - if(key.equals(req)) - cp.required = true; - } - } - if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) { - m.imports.add(cp.complexType); - } - m.vars.add(cp); - count += 1; - if(count != impl.getProperties().keySet().size()) - cp.hasMore = new Boolean(true); - if(cp.isContainer != null) { - String arrayImport = typeMapping.get("array"); - if(arrayImport != null && - !languageSpecificPrimitives.contains(arrayImport) && - !defaultIncludes.contains(arrayImport)) - m.imports.add(arrayImport); - } - - if(cp.complexType != null && - !languageSpecificPrimitives.contains(cp.complexType) && - !defaultIncludes.contains(cp.complexType)) - m.imports.add(cp.complexType); - - if(cp.baseType != null && - !languageSpecificPrimitives.contains(cp.baseType) && - !defaultIncludes.contains(cp.baseType)) - m.imports.add(cp.baseType); - } - } - } - else { - m.emptyVars = true; - } - } - return m; - } - - public CodegenProperty fromProperty(String name, Property p) { - if(p == null) { - System.out.println("unexpected missing property for name " + null); - return null; - } - CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); - - property.name = toVarName(name); - property.baseName = name; - property.description = escapeText(p.getDescription()); - property.getter = "get" + initialCaps(name); - property.setter = "set" + initialCaps(name); - property.example = p.getExample(); - property.defaultValue = toDefaultValue(p); - - String type = getSwaggerType(p); - - if(p instanceof AbstractNumericProperty) { - AbstractNumericProperty np = (AbstractNumericProperty) p; - property.minimum = np.getMinimum(); - property.maximum = np.getMaximum(); - property.exclusiveMinimum = np.getExclusiveMinimum(); - property.exclusiveMaximum = np.getExclusiveMaximum(); - - // legacy support - Map allowableValues = new HashMap(); - if(np.getMinimum() != null) - allowableValues.put("min", np.getMinimum()); - if(np.getMaximum() != null) - allowableValues.put("max", np.getMaximum()); - property.allowableValues = allowableValues; - } - - if(p instanceof StringProperty) { - StringProperty sp = (StringProperty) p; - property.maxLength = sp.getMaxLength(); - property.minLength = sp.getMinLength(); - property.pattern = sp.getPattern(); - if(sp.getEnum() != null) { - List _enum = sp.getEnum(); - property._enum = _enum; - property.isEnum = true; - - // legacy support - Map allowableValues = new HashMap(); - allowableValues.put("values", _enum); - property.allowableValues = allowableValues; - } - } - - property.datatype = property.isEnum - ? StringUtils.capitalize(property.name) + "Enum" - : getTypeDeclaration(p); - property.baseType = getSwaggerType(p); - - if(p instanceof ArrayProperty) { - property.isContainer = true; - property.containerType = "array"; - ArrayProperty ap = (ArrayProperty) p; - CodegenProperty cp = fromProperty("inner", ap.getItems()); - if(cp == null) { - System.out.println("skipping invalid property:"); - Json.prettyPrint(p); - } - else { - property.baseType = getSwaggerType(p); - if(!languageSpecificPrimitives.contains(cp.baseType)) - property.complexType = cp.baseType; - else - property.isPrimitiveType = true; - } - } - else if(p instanceof MapProperty) { - property.isContainer = true; - property.containerType = "map"; - MapProperty ap = (MapProperty) p; - CodegenProperty cp = fromProperty("inner", ap.getAdditionalProperties()); - - property.baseType = getSwaggerType(p); - if(!languageSpecificPrimitives.contains(cp.baseType)) - property.complexType = cp.baseType; - else - property.isPrimitiveType = true; - } - else { - property.isNotContainer = true; - if(languageSpecificPrimitives().contains(type)) - property.isPrimitiveType = true; - else - property.complexType = property.baseType; - } - return property; - } - - public CodegenOperation fromOperation(String path, String httpMethod, Operation operation){ - CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); - Set imports = new HashSet(); - - String operationId = operation.getOperationId(); - if(operationId == null) { - String tmpPath = path; - tmpPath = tmpPath.replaceAll("\\{", ""); - tmpPath = tmpPath.replaceAll("\\}", ""); - String[] parts = (tmpPath + "/" + httpMethod).split("/"); - StringBuilder builder = new StringBuilder(); - if("/".equals(tmpPath)) { - // must be root tmpPath - builder.append("root"); - } - for(int i = 0; i < parts.length; i++) { - String part = parts[i]; - if(part.length() > 0) { - if(builder.toString().length() == 0) - part = Character.toLowerCase(part.charAt(0)) + part.substring(1); - else - part = initialCaps(part); - builder.append(part); - } - } - operationId = builder.toString(); - System.out.println("generated operationId " + operationId); - } - op.path = path; - op.operationId = operationId; - op.summary = escapeText(operation.getSummary()); - op.notes = escapeText(operation.getDescription()); - op.tags = operation.getTags(); - - Response methodResponse = null; - - if(operation.getConsumes() != null && operation.getConsumes().size() > 0) { - List> c = new ArrayList>(); - int count = 0; - for(String key: operation.getConsumes()) { - Map mediaType = new HashMap(); - mediaType.put("mediaType", key); - count += 1; - if (count < operation.getConsumes().size()) - mediaType.put("hasMore", "true"); - c.add(mediaType); - } - op.consumes = c; - op.hasConsumes = true; - } - - if(operation.getProduces() != null && operation.getProduces().size() > 0) { - List> c = new ArrayList>(); - int count = 0; - for(String key: operation.getProduces()) { - Map mediaType = new HashMap(); - mediaType.put("mediaType", key); - count += 1; - if (count < operation.getProduces().size()) - mediaType.put("hasMore", "true"); - c.add(mediaType); - } - op.produces = c; - op.hasProduces = true; - } - - if(operation.getResponses() != null) { - for(String responseCode: new TreeSet(operation.getResponses().keySet())) { - Response response = operation.getResponses().get(responseCode); - if (responseCode.startsWith("2")) { - // use the first, i.e. the smallest 2xx response status as methodResponse - methodResponse = response; - break; - } - } - if(methodResponse == null && operation.getResponses().keySet().contains("default")) { - methodResponse = operation.getResponses().get("default"); - } - for(String responseCode: operation.getResponses().keySet()) { - Response response = operation.getResponses().get(responseCode); - if(response != methodResponse) { - CodegenResponse r = fromResponse(responseCode, response); - op.responses.add(r); - } - for(int i = 0; i < op.responses.size() - 1; i++) { - CodegenResponse r = op.responses.get(i); - r.hasMore = new Boolean(true); - } - } - } - - if(methodResponse != null) { - if (methodResponse.getSchema() != null) { - CodegenProperty cm = fromProperty("response", methodResponse.getSchema()); - - Property responseProperty = methodResponse.getSchema(); - - if(responseProperty instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) responseProperty; - CodegenProperty innerProperty = fromProperty("response", ap.getItems()); - op.returnBaseType = innerProperty.baseType; - } - else { - if(cm.complexType != null) - op.returnBaseType = cm.complexType; - else - op.returnBaseType = cm.baseType; - } - op.examples = toExamples(methodResponse.getExamples()); - op.defaultResponse = toDefaultValue(responseProperty); - op.returnType = cm.datatype; - if(cm.isContainer != null) { - op.returnContainer = cm.complexType; - } - else - op.returnSimpleType = true; - if (languageSpecificPrimitives().contains(op.returnBaseType) || op.returnBaseType == null) - op.returnTypeIsPrimitive = true; - } - addHeaders(methodResponse, op.responseHeaders); - } - - if(op.returnBaseType == null) { - op.returnTypeIsPrimitive = true; - op.returnSimpleType = true; - } - - if(op.returnBaseType != null && - !defaultIncludes.contains(op.returnBaseType) && - !languageSpecificPrimitives.contains(op.returnBaseType)) - imports.add(op.returnBaseType); - - List parameters = operation.getParameters(); - CodegenParameter bodyParam = null; - List allParams = new ArrayList(); - List bodyParams = new ArrayList(); - List pathParams = new ArrayList(); - List queryParams = new ArrayList(); - List headerParams = new ArrayList(); - List cookieParams = new ArrayList(); - List formParams = new ArrayList(); - - if(parameters != null) { - for(Parameter param : parameters) { - CodegenParameter p = fromParameter(param, imports); - allParams.add(p); - if(param instanceof QueryParameter) { - p.isQueryParam = new Boolean(true); - queryParams.add(p.copy()); - } - else if(param instanceof PathParameter) { - p.required = true; - p.isPathParam = new Boolean(true); - pathParams.add(p.copy()); - } - else if(param instanceof HeaderParameter) { - p.isHeaderParam = new Boolean(true); - headerParams.add(p.copy()); - } - else if(param instanceof CookieParameter) { - p.isCookieParam = new Boolean(true); - cookieParams.add(p.copy()); - } - else if(param instanceof BodyParameter) { - p.isBodyParam = new Boolean(true); - bodyParam = p; - bodyParams.add(p.copy()); - } - else if(param instanceof FormParameter) { - if("file".equals(p.dataType)) - p.isFile = true; - else - p.notFile = true; - p.isFormParam = new Boolean(true); - formParams.add(p.copy()); - } - } - } - for(String i: imports) { - if(!defaultIncludes.contains(i) && !languageSpecificPrimitives.contains(i)){ - op.imports.add(i); - } - } - op.bodyParam = bodyParam; - op.httpMethod = httpMethod.toUpperCase(); - op.allParams = addHasMore(allParams); - op.bodyParams = addHasMore(bodyParams); - op.pathParams = addHasMore(pathParams); - op.queryParams = addHasMore(queryParams); - op.headerParams = addHasMore(headerParams); - // op.cookieParams = cookieParams; - op.formParams = addHasMore(formParams); - // legacy support - op.nickname = operationId; - - if(op.allParams.size() > 0) - op.hasParams = true; - op.externalDocs = operation.getExternalDocs(); - - return op; - } - - public CodegenResponse fromResponse(String responseCode, Response response) { - CodegenResponse r = CodegenModelFactory.newInstance(CodegenModelType.RESPONSE); - if("default".equals(responseCode)) - r.code = "0"; - else - r.code = responseCode; - r.message = response.getDescription(); - r.schema = response.getSchema(); - r.examples = toExamples(response.getExamples()); - return r; - } - - public CodegenParameter fromParameter(Parameter param, Set imports) { - CodegenParameter p = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); - p.baseName = param.getName(); - p.description = param.getDescription(); - p.required = param.getRequired(); - - if(param instanceof SerializableParameter) { - SerializableParameter qp = (SerializableParameter) param; - Property property = null; - String collectionFormat = null; - if("array".equals(qp.getType())) { - Property inner = qp.getItems(); - if(inner == null) { - System.out.println("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); - inner = new StringProperty().description("//TODO automatically added by swagger-codegen"); - } - property = new ArrayProperty(inner); - collectionFormat = qp.getCollectionFormat(); - CodegenProperty pr = fromProperty("inner", inner); - p.baseType = pr.datatype; - imports.add(pr.baseType); - } - else - property = PropertyBuilder.build(qp.getType(), qp.getFormat(), null); - if(property == null) { - System.out.println("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); - property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + qp.getType() + " but not supported"); - } - CodegenProperty model = fromProperty(qp.getName(), property); - p.collectionFormat = collectionFormat; - p.dataType = model.datatype; - p.paramName = toParamName(qp.getName()); - - if(model.complexType != null) { - imports.add(model.complexType); - } - } - else { - BodyParameter bp = (BodyParameter) param; - Model model = bp.getSchema(); - - if(model instanceof ModelImpl) { - ModelImpl impl = (ModelImpl) model; - CodegenModel cm = fromModel(bp.getName(), impl); - if(cm.emptyVars != null && cm.emptyVars == false) { - p.dataType = getTypeDeclaration(cm.classname); - imports.add(p.dataType); - } - else { - // TODO: missing format, so this will not always work - Property prop = PropertyBuilder.build(impl.getType(), null, null); - CodegenProperty cp = fromProperty("property", prop); - if(cp != null) { - p.dataType = cp.datatype; - } - } - } - else if(model instanceof ArrayModel) { - // to use the built-in model parsing, we unwrap the ArrayModel - // and get a single property from it - ArrayModel impl = (ArrayModel) model; - CodegenModel cm = fromModel(bp.getName(), impl); - // get the single property - ArrayProperty ap = new ArrayProperty().items(impl.getItems()); - CodegenProperty cp = fromProperty("inner", ap); - if(cp.complexType != null) { - imports.add(cp.complexType); - } - imports.add(cp.baseType); - p.dataType = cp.datatype; - p.isContainer = true; - } - else{ - Model sub = bp.getSchema(); - if(sub instanceof RefModel) { - String name = ((RefModel)sub).getSimpleRef(); - if(typeMapping.containsKey(name)) - name = typeMapping.get(name); - else { - name = toModelName(name); - if(defaultIncludes.contains(name)) { - imports.add(name); - } - imports.add(name); - name = getTypeDeclaration(name); - } - p.dataType = name; - } - } - p.paramName = toParamName(bp.getName()); - } - return p; - } - - protected List> toExamples(Map examples) { - if(examples == null) - return null; - - List> output = new ArrayList>(); - for(String key: examples.keySet()) { - String value = examples.get(key); - - Map kv = new HashMap(); - kv.put("contentType", key); - kv.put("example", value); - output.add(kv); - } - return output; - } - - private void addHeaders(Response response, List target) { - if (response.getHeaders() != null) { - for (Map.Entry headers : response.getHeaders().entrySet()) { - target.add(fromProperty(headers.getKey(), headers.getValue())); - } - } - } - - private List addHasMore(List objs) { - if(objs != null) { - for(int i = 0; i < objs.size(); i++) { - if(i > 0) - objs.get(i).secondaryParam = new Boolean(true); - if(i < objs.size() - 1) - objs.get(i).hasMore = new Boolean(true); - } - } - return objs; - } - - private Map addHasMore(Map objs) { - if(objs != null) { - for(int i = 0; i < objs.size() - 1; i++) { - if(i > 0) - objs.put("secondaryParam", new Boolean(true)); - if(i < objs.size() - 1) - objs.put("hasMore", true); - } - } - return objs; - } - - - public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { - List opList = operations.get(tag); - if(opList == null) { - opList = new ArrayList(); - operations.put(tag, opList); - } - opList.add(co); - co.baseName = tag; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java b/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java deleted file mode 100644 index d852adfec83..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java +++ /dev/null @@ -1,371 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.*; -import com.wordnik.swagger.util.*; -import com.samskivert.mustache.*; - -import org.apache.commons.io.FileUtils; - -import java.util.*; -import java.util.regex.*; -import java.io.*; - -public class DefaultGenerator implements Generator { - private CodegenConfig config; - private ClientOptInput opts = null; - private Swagger swagger = null; - - public Generator opts(ClientOptInput opts) { - this.opts = opts; - - this.swagger = opts.getSwagger(); - ClientOpts clientOpts = opts.getOpts(); - this.config = opts.getConfig(); - this.config.additionalProperties().putAll(clientOpts.getProperties()); - - return this; - } - - public void generate() { - if(swagger == null || config == null) { - throw new RuntimeException("missing swagger input or config!"); - } - if(System.getProperty("debugSwagger") != null) { - Json.prettyPrint(swagger); - } - try { - config.processOpts(); - if(swagger.getInfo() != null) { - Info info = swagger.getInfo(); - if(info.getTitle() != null) - config.additionalProperties().put("appName", info.getTitle()); - if(info.getDescription() != null) - config.additionalProperties().put("appDescription", info.getDescription()); - if(info.getContact() != null) { - Contact contact = info.getContact(); - config.additionalProperties().put("infoUrl", contact.getUrl()); - if(contact.getEmail() != null) - config.additionalProperties().put("infoEmail", contact.getEmail()); - } - if(info.getLicense() != null) { - License license = info.getLicense(); - if(license.getName() != null) - config.additionalProperties().put("licenseInfo", license.getName()); - if(license.getUrl() != null) - config.additionalProperties().put("licenseUrl", license.getUrl()); - } - } - - StringBuilder hostBuilder = new StringBuilder(); - if(swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { - hostBuilder.append(swagger.getSchemes().get(0).toValue()); - hostBuilder.append("://"); - } - else - hostBuilder.append("https://"); - hostBuilder.append(swagger.getHost()).append(swagger.getBasePath()); - String basePath = hostBuilder.toString(); - - List allOperations = new ArrayList(); - List allModels = new ArrayList(); - - // models - Map definitions = swagger.getDefinitions(); - for(String name: definitions.keySet()) { - Model model = definitions.get(name); - Map modelMap = new HashMap(); - modelMap.put(name, model); - Map models = processModels(config, modelMap); - models.putAll(config.additionalProperties()); - - allModels.add(((List)models.get("models")).get(0)); - - for(String templateName : config.modelTemplateFiles().keySet()) { - String suffix = config.modelTemplateFiles().get(templateName); - String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; - String template = readTemplate(config.templateDir() + File.separator + templateName); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - public Reader getTemplate (String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - }; - }) - .defaultValue("") - .compile(template); - writeToFile(filename, tmpl.execute(models)); - } - } - if(System.getProperty("debugModels") != null) { - System.out.println("############ Model info ############"); - Json.prettyPrint(allModels); - } - - // apis - Map> paths = processPaths(swagger.getPaths()); - for(String tag : paths.keySet()) { - List ops = paths.get(tag); - Map operation = processOperations(config, tag, ops); - operation.put("basePath", basePath); - operation.put("baseName", tag); - operation.put("modelPackage", config.modelPackage()); - operation.putAll(config.additionalProperties()); - operation.put("classname", config.toApiName(tag)); - allOperations.add(operation); - for(String templateName : config.apiTemplateFiles().keySet()) { - String suffix = config.apiTemplateFiles().get(templateName); - String filename = config.apiFileFolder() + - File.separator + - config.toApiFilename(tag) + - suffix; - - String template = readTemplate(config.templateDir() + File.separator + templateName); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - public Reader getTemplate (String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - }; - }) - .defaultValue("") - .compile(template); - - writeToFile(filename, tmpl.execute(operation)); - } - } - if(System.getProperty("debugOperations") != null) { - System.out.println("############ Operation info ############"); - Json.prettyPrint(allOperations); - } - - // supporting files - Map bundle = new HashMap(); - bundle.putAll(config.additionalProperties()); - bundle.put("apiPackage", config.apiPackage()); - - Map apis = new HashMap(); - apis.put("apis", allOperations); - if(swagger.getBasePath() != null) { - bundle.put("basePath", swagger.getBasePath()); - } - bundle.put("apiInfo", apis); - bundle.put("models", allModels); - bundle.put("apiFolder", config.apiPackage().replaceAll("\\.", "/")); - bundle.put("modelPackage", config.modelPackage()); - if (swagger.getExternalDocs() != null) { - bundle.put("externalDocs", swagger.getExternalDocs()); - } - for(int i = 0; i < allModels.size() - 1; i++) { - HashMap cm = (HashMap) allModels.get(i); - CodegenModel m = cm.get("model"); - m.hasMoreModels = true; - } - - if(System.getProperty("debugSupportingFiles") != null) { - System.out.println("############ Supporting file info ############"); - Json.prettyPrint(bundle); - } - - for(SupportingFile support : config.supportingFiles()) { - String outputFolder = config.outputFolder(); - if(support.folder != null && !"".equals(support.folder)) - outputFolder += File.separator + support.folder; - File of = new File(outputFolder); - if(!of.isDirectory()) - of.mkdirs(); - String outputFilename = outputFolder + File.separator + support.destinationFilename; - - if(support.templateFile.endsWith("mustache")) { - String template = readTemplate(config.templateDir() + File.separator + support.templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - public Reader getTemplate (String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - }; - }) - .defaultValue("") - .compile(template); - - writeToFile(outputFilename, tmpl.execute(bundle)); - } - else { - String template = readTemplate(config.templateDir() + File.separator + support.templateFile); - FileUtils.writeStringToFile(new File(outputFilename), template); - System.out.println("copying file to " + outputFilename); - } - } - - config.processSwagger(swagger); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - public Map> processPaths(Map paths) { - Map> ops = new HashMap>(); - List tags = null; - - 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); - } - return ops; - } - - public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations) { - if(operation != null) { - List tags = operation.getTags(); - if(tags == null) { - tags = new ArrayList(); - tags.add("default"); - } - - for(String tag : tags) { - CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation); - co.tags = new ArrayList(); - co.tags.add(sanitizeTag(tag)); - - config.addOperationToGroup(sanitizeTag(tag), resourcePath, operation, co, operations); - } - } - } - - protected String sanitizeTag(String tag) { - // remove spaces and make strong case - String [] parts = tag.split(" "); - StringBuffer buf = new StringBuffer(); - for(String part: parts) { - if(!"".equals(part)) { - buf.append(Character.toUpperCase(part.charAt(0))); - if(part.length() > 1) - buf.append(part.substring(1)); - } - } - return buf.toString().replaceAll("[^a-zA-Z ]", ""); - } - - public File writeToFile(String filename, String contents) throws IOException { - System.out.println("writing file " + filename); - File output = new File(filename); - - if(output.getParent() != null && !new File(output.getParent()).exists()) { - File parent = new File(output.getParent()); - parent.mkdirs(); - } - Writer out = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(output), "UTF-8")); - - out.write(contents); - out.close(); - return output; - } - - public String readTemplate(String name) { - try{ - Reader reader = getTemplateReader(name); - if(reader == null) - throw new RuntimeException("no file found"); - java.util.Scanner s = new java.util.Scanner(reader).useDelimiter("\\A"); - return s.hasNext() ? s.next() : ""; - } - catch(Exception e) { - e.printStackTrace(); - } - throw new RuntimeException("can't load template " + name); - } - - public Reader getTemplateReader(String name) { - try{ - InputStream is = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(name)); - if(is == null) - is = new FileInputStream(new File(name)); - if(is == null) - throw new RuntimeException("no file found"); - return new InputStreamReader(is); - } - catch(Exception e) { - e.printStackTrace(); - } - throw new RuntimeException("can't load template " + name); - } - - private String getCPResourcePath(String name) { - if (!"/".equals(File.separator)) - return name.replaceAll(Pattern.quote(File.separator), "/"); - return name; - } - -public Map processOperations(CodegenConfig config, String tag, List ops) { - Map operations = new HashMap(); - Map objs = new HashMap(); - objs.put("classname", config.toApiName(tag)); - objs.put("operation", ops); - operations.put("operations", objs); - operations.put("package", config.apiPackage()); - - Set allImports = new HashSet(); - for(CodegenOperation op: ops) { - allImports.addAll(op.imports); - } - - List> imports = new ArrayList>(); - for(String i: allImports) { - Map im = new HashMap(); - String m = config.importMapping().get(i); - if(m == null) - m = config.toModelImport(i); - if(m != null) { - im.put("import", m); - imports.add(im); - } - } - - operations.put("imports", imports); - config.postProcessOperations(operations); - return operations; - } - - public Map processModels(CodegenConfig config, Map definitions) { - Map objs = new HashMap(); - objs.put("package", config.modelPackage()); - List models = new ArrayList(); - List model = new ArrayList(); - Set allImports = new HashSet(); - for(String key: definitions.keySet()) { - Model mm = definitions.get(key); - CodegenModel cm = config.fromModel(key, mm); - Map mo = new HashMap(); - mo.put("model", cm); - models.add(mo); - allImports.addAll(cm.imports); - } - objs.put("models", models); - - List> imports = new ArrayList>(); - for(String i: allImports) { - Map im = new HashMap(); - String m = config.importMapping().get(i); - if(m == null) - m = config.toModelImport(i); - if(m != null && !config.defaultIncludes().contains(m)) { - im.put("import", m); - imports.add(im); - } - // add instantiation types - m = config.instantiationTypes().get(i); - if(m != null && !config.defaultIncludes().contains(m)) { - im.put("import", m); - imports.add(im); - } - } - - objs.put("imports", imports); - config.postProcessModels(objs); - - return objs; - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/Generator.java b/src/main/java/com/wordnik/swagger/codegen/Generator.java deleted file mode 100644 index 929ae580991..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/Generator.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.wordnik.swagger.codegen; - -import com.wordnik.swagger.models.Swagger; - -public interface Generator { - Generator opts(ClientOptInput opts); - void generate(); -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java b/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java deleted file mode 100644 index 85f08bfa70c..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.wordnik.swagger.codegen; - -public class SupportingFile { - public String templateFile; - public String folder; - public String destinationFilename; - - public SupportingFile(String templateFile, String folder, String destinationFilename) { - this.templateFile = templateFile; - this.folder = folder; - this.destinationFilename = destinationFilename; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java b/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java deleted file mode 100644 index 7de102ec350..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.wordnik.swagger.codegen.auth; - -public interface AuthMethod { - String getType(); - void setType(String type); -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java deleted file mode 100644 index 754ab46ac15..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/java"; - - public String getName() { - return "android"; - } - - public String getHelp() { - return "Generates an Android client library."; - } - - public AndroidClientCodegen() { - super(); - outputFolder = "generated-code/android"; - modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.put("api.mustache", ".java"); - templateDir = "android-java"; - apiPackage = "com.wordnik.client.api"; - modelPackage = "com.wordnik.client.model"; - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); - supportingFiles.add(new SupportingFile("apiInvoker.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); - supportingFiles.add(new SupportingFile("httpPatch.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "HttpPatch.java")); - supportingFiles.add(new SupportingFile("jsonUtil.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); - supportingFiles.add(new SupportingFile("apiException.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object") - ); - instantiationTypes.put("array", "ArrayList"); - instantiationTypes.put("map", "HashMap"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @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 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 toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java deleted file mode 100644 index ab710431b78..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "io.swagger.client"; - protected String groupId = "io.swagger"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/java"; - - public String getName() { - return "java"; - } - - public String getHelp() { - return "Generates a Java client library."; - } - - public JavaClientCodegen() { - super(); - outputFolder = "generated-code/java"; - modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.put("api.mustache", ".java"); - templateDir = "Java"; - apiPackage = "io.swagger.client.api"; - modelPackage = "io.swagger.client.model"; - - reservedWords = new HashSet ( - Arrays.asList( - "abstract", "continue", "for", "new", "switch", "assert", - "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", - "this", "break", "double", "implements", "protected", "throw", "byte", "else", - "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", - "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", - "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", - "native", "super", "while") - ); - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); - supportingFiles.add(new SupportingFile("apiInvoker.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); - supportingFiles.add(new SupportingFile("JsonUtil.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); - supportingFiles.add(new SupportingFile("apiException.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object") - ); - instantiationTypes.put("array", "ArrayList"); - instantiationTypes.put("map", "HashMap"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @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 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 toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java deleted file mode 100644 index 6c805e993c9..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.models.Operation; -import com.wordnik.swagger.models.Path; -import com.wordnik.swagger.util.Json; -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.api"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-server"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/java"; - protected String title = "Swagger Server"; - - public String getName() { - return "jaxrs"; - } - - public String getHelp() { - return "Generates a Java JAXRS Server application."; - } - - public JaxRSServerCodegen() { - super(); - outputFolder = "generated-code/javaJaxRS"; - modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.put("api.mustache", ".java"); - templateDir = "JavaJaxRS"; - apiPackage = "com.wordnik.api"; - modelPackage = "com.wordnik.model"; - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - additionalProperties.put("title", title); - - supportingFiles.clear(); - supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); - supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); - supportingFiles.add(new SupportingFile("ApiException.mustache", - (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiException.java")); - supportingFiles.add(new SupportingFile("ApiOriginFilter.mustache", - (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiOriginFilter.java")); - supportingFiles.add(new SupportingFile("ApiResponseMessage.mustache", - (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiResponseMessage.java")); - supportingFiles.add(new SupportingFile("NotFoundException.mustache", - (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "NotFoundException.java")); - supportingFiles.add(new SupportingFile("web.mustache", - ("src/main/webapp/WEB-INF"), "web.xml")); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float") - ); - } - - @Override - public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { - String basePath = resourcePath; - if(basePath.startsWith("/")) - basePath = basePath.substring(1); - int pos = basePath.indexOf("/"); - if(pos > 0) - basePath = basePath.substring(0, pos); - - if(basePath == "") - basePath = "default"; - else { - if(co.path.startsWith("/" + basePath)) - co.path = co.path.substring(("/" + basePath).length()); - co.subresourceOperation = !co.path.isEmpty(); - } - List opList = operations.get(basePath); - if(opList == null) { - opList = new ArrayList(); - operations.put(basePath, opList); - } - opList.add(co); - co.baseName = basePath; - } - - public Map postProcessOperations(Map objs) { - Map operations = (Map)objs.get("operations"); - if(operations != null) { - List ops = (List) operations.get("operation"); - for(CodegenOperation operation : ops) { - if(operation.returnType == null) - operation.returnType = "Void"; - else if(operation.returnType.startsWith("List")) { - String rt = operation.returnType; - int end = rt.lastIndexOf(">"); - if(end > 0) { - operation.returnType = rt.substring("List<".length(), end); - operation.returnContainer = "List"; - } - } - else if(operation.returnType.startsWith("Map")) { - String rt = operation.returnType; - int end = rt.lastIndexOf(">"); - if(end > 0) { - operation.returnType = rt.substring("Map<".length(), end); - operation.returnContainer = "Map"; - } - } - else if(operation.returnType.startsWith("Set")) { - String rt = operation.returnType; - int end = rt.lastIndexOf(">"); - if(end > 0) { - operation.returnType = rt.substring("Set<".length(), end); - operation.returnContainer = "Set"; - } - } - } - } - return objs; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java deleted file mode 100644 index b2f82498989..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - - public String getName() { - return "nodejs"; - } - - public String getHelp() { - return "Generates a node.js server application compatible with the 1.2 swagger specification."; - } - - public NodeJSServerCodegen() { - super(); - outputFolder = "generated-code/nodejs"; - apiTemplateFiles.put("api.mustache", ".js"); - templateDir = "nodejs"; - apiPackage = "app.apis"; - modelPackage = "app"; - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); - supportingFiles.add(new SupportingFile("models.mustache", modelPackage, "models.js")); - supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); - supportingFiles.add(new SupportingFile("README.mustache", "", "README.js")); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float") - ); - typeMapping.put("array", "array"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + File.separator + apiPackage().replaceAll("\\.", File.separator); - } - - public String modelFileFolder() { - return outputFolder + File.separator + modelPackage().replaceAll("\\.", File.separator); - } - - @Override - public String getSwaggerType(Property p) { - String swaggerType = super.getSwaggerType(p); - String type = null; - if(typeMapping.containsKey(swaggerType)) { - return typeMapping.get(swaggerType); - } - else - type = swaggerType; - return toModelName(type); - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java deleted file mode 100644 index 271c353b233..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.util.Json; -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { - protected Set foundationClasses = new HashSet(); - protected String sourceFolder = "client"; - protected static String PREFIX = "SWG"; - - public String getName() { - return "objc"; - } - - public String getHelp() { - return "Generates an Objective-C client library."; - } - - public ObjcClientCodegen() { - super(); - outputFolder = "generated-code/objc"; - modelTemplateFiles.put("model-header.mustache", ".h"); - modelTemplateFiles.put("model-body.mustache", ".m"); - apiTemplateFiles.put("api-header.mustache", ".h"); - apiTemplateFiles.put("api-body.mustache", ".m"); - templateDir = "objc"; - modelPackage = ""; - - defaultIncludes = new HashSet( - Arrays.asList( - "bool", - "int", - "NSString", - "NSObject", - "NSArray", - "NSNumber", - "NSDictionary", - "NSMutableArray", - "NSMutableDictionary") - ); - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "NSNumber", - "NSString", - "NSObject", - "bool") - ); - - reservedWords = new HashSet( - Arrays.asList( - "void", "char", "short", "int", "void", "char", "short", "int", - "long", "float", "double", "signed", "unsigned", "id", "const", - "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", - "self", "super" - )); - - typeMapping = new HashMap(); - typeMapping.put("enum", "NSString"); - typeMapping.put("Date", "SWGDate"); - typeMapping.put("DateTime", "SWGDate"); - // typeMapping.put("Date", "SWGDate"); - typeMapping.put("boolean", "NSNumber"); - typeMapping.put("string", "NSString"); - typeMapping.put("integer", "NSNumber"); - typeMapping.put("int", "NSNumber"); - typeMapping.put("float", "NSNumber"); - typeMapping.put("long", "NSNumber"); - typeMapping.put("double", "NSNumber"); - typeMapping.put("array", "NSArray"); - typeMapping.put("map", "NSDictionary"); - typeMapping.put("number", "NSNumber"); - typeMapping.put("List", "NSArray"); - typeMapping.put("object", "NSObject"); - - importMapping = new HashMap (); - importMapping.put("Date", "SWGDate"); - - foundationClasses = new HashSet ( - Arrays.asList( - "NSNumber", - "NSObject", - "NSString", - "NSDictionary") - ); - - instantiationTypes.put("array", "NSMutableArray"); - instantiationTypes.put("map", "NSMutableDictionary"); - - supportingFiles.add(new SupportingFile("SWGObject.h", sourceFolder, "SWGObject.h")); - supportingFiles.add(new SupportingFile("SWGObject.m", sourceFolder, "SWGObject.m")); - supportingFiles.add(new SupportingFile("SWGApiClient.h", sourceFolder, "SWGApiClient.h")); - supportingFiles.add(new SupportingFile("SWGApiClient.m", sourceFolder, "SWGApiClient.m")); - supportingFiles.add(new SupportingFile("SWGFile.h", sourceFolder, "SWGFile.h")); - supportingFiles.add(new SupportingFile("SWGFile.m", sourceFolder, "SWGFile.m")); - supportingFiles.add(new SupportingFile("SWGDate.h", sourceFolder, "SWGDate.h")); - supportingFiles.add(new SupportingFile("SWGDate.m", sourceFolder, "SWGDate.m")); - supportingFiles.add(new SupportingFile("Podfile.mustache", "", "Podfile")); - } - - @Override - public String toInstantiationType(Property p) { - if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return instantiationTypes.get("map"); - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return instantiationTypes.get("array"); - } - else - return null; - } - - @Override - public String getTypeDeclaration(String name) { - if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) - return name; - else - return name + "*"; - } - - @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) && !foundationClasses.contains(type)) - return toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } - - @Override - public String getTypeDeclaration(Property p) { - String swaggerType = getSwaggerType(p); - if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) - return toModelName(swaggerType); - else - return swaggerType + "*"; - } - - @Override - public String toModelName(String type) { - if(typeMapping.keySet().contains(type) || - foundationClasses.contains(type) || - importMapping.values().contains(type) || - defaultIncludes.contains(type) || - languageSpecificPrimitives.contains(type)) { - return Character.toUpperCase(type.charAt(0)) + type.substring(1); - } - else { - return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); - } - } - - @Override - public String toModelImport(String name) { - // name = name + ".h"; - if("".equals(modelPackage())) - return name; - else - return modelPackage() + "." + name; - } - - @Override - public String toDefaultValue(Property p) { - return null; - } - - @Override - public String apiFileFolder() { - return outputFolder + File.separator + sourceFolder; - } - - @Override - public String modelFileFolder() { - return outputFolder + File.separator + sourceFolder; - } - - @Override - public String toModelFilename(String name) { - return PREFIX + initialCaps(name); - } - - @Override - public String toApiName(String name) { - return PREFIX + initialCaps(name) + "Api"; - } - - public String toApiFilename(String name) { - return PREFIX + initialCaps(name) + "Api"; - } - - @Override - public String toVarName(String name) { - String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); - if(paramName.startsWith("new") || reservedWords.contains(paramName)) { - return escapeReservedWord(paramName); - } - else - return paramName; - } - - public String escapeReservedWord(String name) { - return "_" + name; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java deleted file mode 100644 index f27044c2db7..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.util.Json; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - // protected String sourceFolder = ""; - - public String getName() { - return "php"; - } - - public String getHelp() { - return "Generates a PHP client library."; - } - - public PhpClientCodegen() { - super(); - outputFolder = "generated-code/php"; - modelTemplateFiles.put("model.mustache", ".php"); - apiTemplateFiles.put("api.mustache", ".php"); - templateDir = "php"; - - typeMapping.clear(); - languageSpecificPrimitives.clear(); - - reservedWords = new HashSet ( - Arrays.asList( - "int") - ); - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - languageSpecificPrimitives.add("int"); - languageSpecificPrimitives.add("array"); - languageSpecificPrimitives.add("map"); - languageSpecificPrimitives.add("string"); - languageSpecificPrimitives.add("DateTime"); - - typeMapping.put("long", "int"); - typeMapping.put("integer", "int"); - typeMapping.put("Array", "array"); - typeMapping.put("String", "string"); - typeMapping.put("List", "array"); - typeMapping.put("map", "map"); - - supportingFiles.add(new SupportingFile("Swagger.mustache", "", "Swagger.php")); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @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 getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; - } - 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 = swaggerType; - if(type == null) - return null; - return type; - } - - public String toDefaultValue(Property p) { - return "null"; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java deleted file mode 100755 index c3cf3648123..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java +++ /dev/null @@ -1,117 +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. - */ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { - - public String getName() { - return "python"; - } - - public String getHelp() { - return "Generates a Python client library."; - } - - public PythonClientCodegen() { - super(); - outputFolder = "generated-code/python"; - modelTemplateFiles.put("model.mustache", ".py"); - apiTemplateFiles.put("api.mustache", ".py"); - templateDir = "python"; - - apiPackage = ""; - modelPackage = "models"; - - languageSpecificPrimitives.clear(); - languageSpecificPrimitives.add("int"); - languageSpecificPrimitives.add("float"); - languageSpecificPrimitives.add("long"); - languageSpecificPrimitives.add("list"); - languageSpecificPrimitives.add("bool"); - languageSpecificPrimitives.add("str"); - languageSpecificPrimitives.add("datetime"); - - typeMapping.clear(); - typeMapping.put("integer", "int"); - typeMapping.put("float", "float"); - typeMapping.put("long", "long"); - typeMapping.put("double", "float"); - typeMapping.put("array", "list"); - typeMapping.put("map", "map"); - typeMapping.put("boolean", "bool"); - typeMapping.put("string", "str"); - typeMapping.put("date", "datetime"); - - - supportingFiles.add(new SupportingFile("swagger.mustache", "", "swagger.py")); - supportingFiles.add(new SupportingFile("__init__.mustache", "", "__init__.py")); - supportingFiles.add(new SupportingFile("__init__.mustache", modelPackage, "__init__.py")); - - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @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 getSwaggerType(p) + "(String, " + getTypeDeclaration(inner) + ")"; - } - 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 = swaggerType; - return type; - } - - public String toDefaultValue(Property p) { - // TODO: Support Python def value - return "null"; - } -} diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java deleted file mode 100644 index 6c845a9ccb7..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java +++ /dev/null @@ -1,182 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "io.swagger.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/java"; - - public String getName() { - return "scala"; - } - - public String getHelp() { - return "Generates a Scala client library."; - } - - public ScalaClientCodegen() { - super(); - outputFolder = "generated-code/scala"; - modelTemplateFiles.put("model.mustache", ".scala"); - apiTemplateFiles.put("api.mustache", ".scala"); - templateDir = "scala"; - apiPackage = "io.swagger.client.api"; - modelPackage = "io.swagger.client.model"; - - reservedWords = new HashSet ( - Arrays.asList( - "abstract", "case", "catch", "class", "def", "do", "else", "extends", - "false", "final", "finally", "for", "forSome", "if", "implicit", - "import", "lazy", "match", "new", "null", "object", "override", "package", - "private", "protected", "return", "sealed", "super", "this", "throw", - "trait", "try", "true", "type", "val", "var", "while", "with", "yield") - ); - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); - supportingFiles.add(new SupportingFile("apiInvoker.mustache", - (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.scala")); - - importMapping.remove("List"); - importMapping.remove("Set"); - importMapping.remove("Map"); - - importMapping.put("DateTime", "org.joda.time.DateTime"); - importMapping.put("ListBuffer", "scala.collections.mutable.ListBuffer"); - - typeMapping = new HashMap(); - typeMapping.put("enum", "NSString"); - typeMapping.put("array", "List"); - typeMapping.put("set", "Set"); - typeMapping.put("boolean", "Boolean"); - typeMapping.put("string", "String"); - typeMapping.put("int", "Int"); - typeMapping.put("long", "Long"); - typeMapping.put("float", "Float"); - typeMapping.put("byte", "Byte"); - typeMapping.put("short", "Short"); - typeMapping.put("char", "Char"); - typeMapping.put("long", "Long"); - typeMapping.put("double", "Double"); - typeMapping.put("object", "Any"); - typeMapping.put("file", "File"); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Int", - "Long", - "Float", - "Object", - "List", - "Map") - ); - instantiationTypes.put("array", "ListBuffer"); - instantiationTypes.put("map", "HashMap"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; - } - 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 toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } - - @Override - public String toInstantiationType(Property p) { - if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return instantiationTypes.get("map") + "[String, " + inner + "]"; - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return instantiationTypes.get("array") + "[" + inner + "]"; - } - else - return null; - } - - public String toDefaultValue(Property p) { - if(p instanceof StringProperty) - return "null"; - else if (p instanceof BooleanProperty) - return "null"; - else if(p instanceof DateProperty) - return "null"; - else if(p instanceof DateTimeProperty) - return "null"; - else if (p instanceof DoubleProperty) - return "null"; - else if (p instanceof FloatProperty) - return "null"; - else if (p instanceof IntegerProperty) - return "null"; - else if (p instanceof LongProperty) - return "null"; - else if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return "new HashMap[String, " + inner + "]() "; - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return "new ListBuffer[" + inner + "]() "; - } - else - return "null"; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java deleted file mode 100644 index e87609b720d..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; -import com.wordnik.swagger.util.Json; - -import java.util.*; -import java.io.File; - -public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/scala"; - - public String getName() { - return "scalatra"; - } - - public String getHelp() { - return "Generates a Scala server application with Scalatra."; - } - - public ScalatraServerCodegen() { - super(); - outputFolder = "generated-code/scalatra"; - modelTemplateFiles.put("model.mustache", ".scala"); - apiTemplateFiles.put("api.mustache", ".scala"); - templateDir = "scalatra"; - apiPackage = "com.wordnik.client.api"; - modelPackage = "com.wordnik.client.model"; - - reservedWords = new HashSet ( - Arrays.asList( - "abstract", "continue", "for", "new", "switch", "assert", - "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", - "this", "break", "double", "implements", "protected", "throw", "byte", "else", - "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", - "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", - "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", - "native", "super", "while") - ); - - defaultIncludes = new HashSet( - Arrays.asList("double", - "Int", - "Long", - "Float", - "Double", - "char", - "float", - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "List", - "Set", - "Map") - ); - - typeMapping.put("integer", "Int"); - typeMapping.put("long", "Long"); - - additionalProperties.put("appName", "Swagger Sample"); - additionalProperties.put("appName", "Swagger Sample"); - additionalProperties.put("appDescription", "A sample swagger server"); - additionalProperties.put("infoUrl", "http://developers.helloreverb.com"); - additionalProperties.put("infoEmail", "hello@helloreverb.com"); - additionalProperties.put("licenseInfo", "All rights reserved"); - additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); - supportingFiles.add(new SupportingFile("build.sbt", "", "build.sbt")); - supportingFiles.add(new SupportingFile("web.xml", "/src/main/webapp/WEB-INF", "web.xml")); - supportingFiles.add(new SupportingFile("JettyMain.scala", sourceFolder, "JettyMain.scala")); - supportingFiles.add(new SupportingFile("Bootstrap.mustache", sourceFolder, "ScalatraBootstrap.scala")); - supportingFiles.add(new SupportingFile("ServletApp.mustache", sourceFolder, "ServletApp.scala")); - supportingFiles.add(new SupportingFile("project/build.properties", "project", "build.properties")); - supportingFiles.add(new SupportingFile("project/plugins.sbt", "project", "plugins.sbt")); - supportingFiles.add(new SupportingFile("sbt", "", "sbt")); - - languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object") - ); - instantiationTypes.put("array", "ArrayList"); - instantiationTypes.put("map", "HashMap"); - - importMapping = new HashMap (); - importMapping.put("BigDecimal", "java.math.BigDecimal"); - importMapping.put("UUID", "java.util.UUID"); - importMapping.put("File", "java.io.File"); - importMapping.put("Date", "java.util.Date"); - importMapping.put("Timestamp", "java.sql.Timestamp"); - importMapping.put("Map", "java.util.Map"); - importMapping.put("HashMap", "java.util.HashMap"); - importMapping.put("Array", "java.util.List"); - importMapping.put("ArrayList", "java.util.ArrayList"); - importMapping.put("DateTime", "org.joda.time.DateTime"); - importMapping.put("LocalDateTime", "org.joda.time.LocalDateTime"); - importMapping.put("LocalDate", "org.joda.time.LocalDate"); - importMapping.put("LocalTime", "org.joda.time.LocalTime"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); - } - - public String modelFileFolder() { - return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); - } - - @Override - public Map postProcessOperations(Map objs) { - Map operations = (Map) objs.get("operations"); - List operationList = (List) operations.get("operation"); - for(CodegenOperation op: operationList) { - op.httpMethod = op.httpMethod.toLowerCase(); - } - return objs; - } - - - @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; - } - 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 toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java deleted file mode 100644 index 3386a5f9fac..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "docs"; - - public String getName() { - return "dynamic-html"; - } - - public String getHelp() { - return "Generates a dynamic HTML site."; - } - - public StaticDocCodegen() { - super(); - outputFolder = "docs"; - modelTemplateFiles.put("model.mustache", ".html"); - apiTemplateFiles.put("operation.mustache", ".html"); - templateDir = "swagger-static"; - - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); - supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); - supportingFiles.add(new SupportingFile("assets/css/bootstrap-responsive.css", - outputFolder + "/assets/css", "bootstrap-responsive.css")); - supportingFiles.add(new SupportingFile("assets/css/bootstrap.css", - outputFolder + "/assets/css", "bootstrap.css")); - supportingFiles.add(new SupportingFile("assets/css/style.css", - outputFolder + "/assets/css", "style.css")); - supportingFiles.add(new SupportingFile("assets/images/logo.png", - outputFolder + "/assets/images", "logo.png")); - supportingFiles.add(new SupportingFile("assets/js/bootstrap.js", - outputFolder + "/assets/js", "bootstrap.js")); - supportingFiles.add(new SupportingFile("assets/js/jquery-1.8.3.min.js", - outputFolder + "/assets/js", "jquery-1.8.3.min.js")); - supportingFiles.add(new SupportingFile("assets/js/main.js", - outputFolder + "/assets/js", "main.js")); - supportingFiles.add(new SupportingFile("index.mustache", - outputFolder, "index.html")); - - instantiationTypes.put("array", "ArrayList"); - instantiationTypes.put("map", "HashMap"); - } - - @Override - public String escapeReservedWord(String name) { - return "_" + name; - } - - @Override - public String apiFileFolder() { - return outputFolder + File.separator + sourceFolder + File.separator + "operations"; - } - - public String modelFileFolder() { - return outputFolder + File.separator + sourceFolder + File.separator + "models"; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java b/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java deleted file mode 100644 index 42ce9fe3604..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; -import com.wordnik.swagger.util.Json; - -import java.util.*; -import java.io.File; - -public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.client"; - protected String groupId = "com.wordnik"; - protected String artifactId = "swagger-client"; - protected String artifactVersion = "1.0.0"; - protected String sourceFolder = "src/main/scala"; - - public String getName() { - return "html"; - } - - public String getHelp() { - return "Generates a static HTML file."; - } - - public StaticHtmlGenerator() { - super(); - outputFolder = "docs"; - templateDir = "htmlDocs"; - - defaultIncludes = new HashSet(); - - String partner = "our Partner"; - - if(System.getProperty("partner") != null) - partner = System.getProperty("partner"); - - additionalProperties.put("partner", partner); - additionalProperties.put("appName", "Swagger Sample"); - additionalProperties.put("appDescription", "A sample swagger server"); - additionalProperties.put("infoUrl", "https://helloreverb.com"); - additionalProperties.put("infoEmail", "hello@helloreverb.com"); - additionalProperties.put("licenseInfo", "All rights reserved"); - additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); - additionalProperties.put("invokerPackage", invokerPackage); - additionalProperties.put("groupId", groupId); - additionalProperties.put("artifactId", artifactId); - additionalProperties.put("artifactVersion", artifactVersion); - - supportingFiles.add(new SupportingFile("index.mustache", "", "index.html")); - reservedWords = new HashSet(); - - languageSpecificPrimitives = new HashSet(); - importMapping = new HashMap (); - } - - @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; - } - return super.getTypeDeclaration(p); - } - - @Override - public Map postProcessOperations(Map objs) { - Map operations = (Map) objs.get("operations"); - List operationList = (List) operations.get("operation"); - for(CodegenOperation op: operationList) { - op.httpMethod = op.httpMethod.toLowerCase(); - } - return objs; - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java b/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java deleted file mode 100644 index 49f5dc6bab4..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.util.*; -import com.wordnik.swagger.models.Swagger; - -import org.apache.commons.io.FileUtils; - -import java.io.File; - -public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { - public String getName() { - return "swagger"; - } - - public String getHelp() { - return "Creates a static swagger.json file."; - } - - public SwaggerGenerator() { - super(); - outputFolder = "generated-code/swagger"; - } - - @Override - public void processSwagger(Swagger swagger) { - String swaggerString = Json.pretty(swagger); - - try{ - String outputFile = outputFolder + File.separator + "swagger.json"; - FileUtils.writeStringToFile(new File(outputFile), swaggerString); - System.out.println("wrote file to " + outputFile); - } - catch(Exception e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java b/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java deleted file mode 100644 index d91267758ee..00000000000 --- a/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java +++ /dev/null @@ -1,243 +0,0 @@ -package com.wordnik.swagger.codegen.languages; - -import com.wordnik.swagger.util.Json; -import com.wordnik.swagger.codegen.*; -import com.wordnik.swagger.models.properties.*; - -import java.util.*; -import java.io.File; - -public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig { - protected Set foundationClasses = new HashSet(); - protected String sourceFolder = "client"; - protected static String PREFIX = "Sami"; - protected Map namespaces = new HashMap(); - - public String getName() { - return "tizen"; - } - - public String getHelp() { - return "Generates a Samsung Tizen C++ client library."; - } - - public TizenClientCodegen() { - super(); - outputFolder = "generated-code/tizen"; - modelTemplateFiles.put("model-header.mustache", ".h"); - modelTemplateFiles.put("model-body.mustache", ".cpp"); - apiTemplateFiles.put("api-header.mustache", ".h"); - apiTemplateFiles.put("api-body.mustache", ".cpp"); - templateDir = "tizen"; - modelPackage = ""; - - defaultIncludes = new HashSet( - Arrays.asList( - "bool", - "int", - "long") - ); - languageSpecificPrimitives = new HashSet(); - - additionalProperties().put("prefix", PREFIX); - - reservedWords = new HashSet( - // VERIFY - Arrays.asList( - "void", "char", "short", "int", "void", "char", "short", "int", - "long", "float", "double", "signed", "unsigned", "id", "const", - "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", - "self", "super" - )); - - super.typeMapping = new HashMap(); - - typeMapping.put("Date", "DateTime"); - typeMapping.put("DateTime", "DateTime"); - typeMapping.put("string", "String"); - typeMapping.put("integer", "Integer"); - typeMapping.put("float", "Float"); - typeMapping.put("long", "Long"); - typeMapping.put("boolean", "Boolean"); - typeMapping.put("double", "Double"); - typeMapping.put("array", "IList"); - typeMapping.put("map", "HashMap"); - typeMapping.put("number", "Long"); - typeMapping.put("object", PREFIX + "Object"); - - importMapping = new HashMap(); - - namespaces = new HashMap (); - namespaces.put("DateTime", "Tizen::Base::DateTime"); - namespaces.put("Integer", "Tizen::Base::Integer"); - namespaces.put("Long", "Tizen::Base::Long"); - namespaces.put("Boolean", "Tizen::Base::Boolean"); - namespaces.put("Float", "Tizen::Base::Float"); - namespaces.put("String", "Tizen::Base::String"); - namespaces.put("Double", "Tizen::Base::Double"); - namespaces.put("IList", "Tizen::Base::Collection::IList"); - namespaces.put("HashMap", "Tizen::Base::Collection::HashMap"); - namespaces.put("ArrayList", "Tizen::Base::Collection::ArrayList"); - namespaces.put("JsonNumber", "Tizen::Web::Json"); - namespaces.put("JsonString", "Tizen::Web::Json"); - - foundationClasses = new HashSet ( - Arrays.asList( - "String", - "Integer", - "Float") - ); - supportingFiles.clear(); - supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h")); - supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h")); - supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp")); - supportingFiles.add(new SupportingFile("apiclient-header.mustache", sourceFolder, PREFIX + "ApiClient.h")); - supportingFiles.add(new SupportingFile("apiclient-body.mustache", sourceFolder, PREFIX + "ApiClient.cpp")); - supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h")); - supportingFiles.add(new SupportingFile("error-header.mustache", sourceFolder, PREFIX + "Error.h")); - supportingFiles.add(new SupportingFile("error-body.mustache", sourceFolder, PREFIX + "Error.cpp")); - } - - @Override - public String toInstantiationType(Property p) { - if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return instantiationTypes.get("map"); - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return instantiationTypes.get("array"); - } - else - return null; - } - - @Override - public String getTypeDeclaration(String name) { - if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) - return name; - else - return name + "*"; - } - - @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) && !foundationClasses.contains(type)) - return toModelName(type); - } - else - type = swaggerType; - return toModelName(type); - } - - @Override - public String getTypeDeclaration(Property p) { - String swaggerType = getSwaggerType(p); - if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) - return toModelName(swaggerType); - else - return swaggerType + "*"; - } - - @Override - public String toModelName(String type) { - if(typeMapping.keySet().contains(type) || - typeMapping.values().contains(type) || - foundationClasses.contains(type) || - importMapping.values().contains(type) || - defaultIncludes.contains(type) || - languageSpecificPrimitives.contains(type)) { - return type; - } - else { - return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); - } - } - - @Override - public String toModelImport(String name) { - if(namespaces.containsKey(name)) { - return "using " + namespaces.get(name) + ";"; - } - return "#include \"" + name + ".h\""; - } - - @Override - public String toDefaultValue(Property p) { - if(p instanceof StringProperty) - return "new String()"; - else if (p instanceof BooleanProperty) - return "new Boolean(false)"; - else if(p instanceof DateProperty) - return "new DateTime()"; - else if(p instanceof DateTimeProperty) - return "new DateTime()"; - else if (p instanceof DoubleProperty) - return "new Double()"; - else if (p instanceof FloatProperty) - return "new Float()"; - else if (p instanceof IntegerProperty) - return "new Integer()"; - else if (p instanceof LongProperty) - return "new Long()"; - else if (p instanceof DecimalProperty) - return "new Long()"; - else if (p instanceof MapProperty) { - MapProperty ap = (MapProperty) p; - String inner = getSwaggerType(ap.getAdditionalProperties()); - return "new HashMap()"; - } - else if (p instanceof ArrayProperty) { - ArrayProperty ap = (ArrayProperty) p; - String inner = getSwaggerType(ap.getItems()); - return "new ArrayList()"; - } - // else - if(p instanceof RefProperty) { - RefProperty rp = (RefProperty) p; - return "new " + toModelName(rp.getSimpleRef()) + "()"; - } - return "null"; - } - - @Override - public String apiFileFolder() { - return outputFolder + File.separator + sourceFolder; - } - - @Override - public String modelFileFolder() { - return outputFolder + File.separator + sourceFolder; - } - - @Override - public String toModelFilename(String name) { - return PREFIX + initialCaps(name); - } - - @Override - public String toApiName(String name) { - return PREFIX + initialCaps(name) + "Api"; - } - - public String toApiFilename(String name) { - return PREFIX + initialCaps(name) + "Api"; - } - - @Override - public String toVarName(String name) { - String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); - paramName = Character.toUpperCase(paramName.charAt(0)) + paramName.substring(1); - return "p" + paramName; - } - - public String escapeReservedWord(String name) { - return "_" + name; - } -} diff --git a/src/main/resources/Groovy/ApiUtils.mustache b/src/main/resources/Groovy/ApiUtils.mustache deleted file mode 100644 index 956b834c88c..00000000000 --- a/src/main/resources/Groovy/ApiUtils.mustache +++ /dev/null @@ -1,50 +0,0 @@ -package {{invokerPackage}}; - -import groovyx.net.http.HTTPBuilder -import groovyx.net.http.Method - -import static groovyx.net.http.ContentType.JSON -import static java.net.URI.create; - -class ApiUtils { - - def invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, method, container, type) { - def (url, uriPath) = buildUrlAndUriPath(basePath, versionPath, resourcePath) - println "url=$url uriPath=$uriPath" - def http = new HTTPBuilder(url) - http.request( Method.valueOf(method), JSON ) { - uri.path = uriPath - uri.query = queryParams - response.success = { resp, json -> - if (type != null) { - onSuccess(parse(json, container, type)) - } - } - response.failure = { resp -> - onFailure(resp.status, resp.statusLine.reasonPhrase) - } - } - } - - - def buildUrlAndUriPath(basePath, versionPath, resourcePath) { - // HTTPBuilder expects to get as its constructor parameter an URL, - // without any other additions like path, therefore we need to cut the path - // from the basePath as it is represented by swagger APIs - // we use java.net.URI to manipulate the basePath - // then the uriPath will hold the rest of the path - URI baseUri = create(basePath) - def pathOnly = baseUri.getPath() - [basePath-pathOnly, pathOnly+versionPath+resourcePath] - } - - - def parse(object, container, clazz) { - if (container == "List") { - return object.collect {parse(it, "", clazz)} - } else { - return clazz.newInstance(object) - } - } - -} diff --git a/src/main/resources/Groovy/api.mustache b/src/main/resources/Groovy/api.mustache deleted file mode 100644 index 6ff66a84720..00000000000 --- a/src/main/resources/Groovy/api.mustache +++ /dev/null @@ -1,56 +0,0 @@ -package {{package}}; - - - - - -import groovyx.net.http.* -import static groovyx.net.http.ContentType.* -import static groovyx.net.http.Method.* -import {{invokerPackage}}.ApiUtils -//------------- - -{{#imports}}import {{import}} -{{/imports}} - -import java.util.*; - -@Mixin(ApiUtils) -{{#operations}} -class {{classname}} { - String basePath = "{{basePath}}" - String versionPath = "/api/v1" - - - {{#operation}} - def {{nickname}} ({{#allParams}} {{{dataType}}} {{paramName}},{{/allParams}} Closure onSuccess, Closure onFailure) { - // create path and map variables - String resourcePath = "{{path}}" - - - // query params - def queryParams = [:] - def headerParams = [:] - - {{#requiredParamCount}} - // verify required params are set - if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new RuntimeException("missing required params") - } - {{/requiredParamCount}} - - {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) - queryParams.put("{{paramName}}", String.valueOf({{paramName}})) - {{/queryParams}} - - {{#headerParams}}headerParams.put("{{paramName}}", {{paramName}}) - {{/headerParams}} - - invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, - "{{httpMethod}}", "{{returnContainer}}", - {{#returnBaseType}}{{{returnBaseType}}}.class {{/returnBaseType}}{{^returnBaseType}}null {{/returnBaseType}}) - - } - {{/operation}} -} -{{/operations}} \ No newline at end of file diff --git a/src/main/resources/Groovy/build.gradle.mustache b/src/main/resources/Groovy/build.gradle.mustache deleted file mode 100644 index d98f375c61d..00000000000 --- a/src/main/resources/Groovy/build.gradle.mustache +++ /dev/null @@ -1,32 +0,0 @@ -apply plugin: 'groovy' -apply plugin: 'idea' -def artifactory = 'buildserver.supportspace.com' -group = 'com.supportspace' -archivesBaseName = 'swagger-gen-groovy' -version = '0.1' - -buildscript { - repositories { - maven { url 'http://repo.jfrog.org/artifactory/gradle-plugins' } - } - dependencies { - classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.16') - } -} - -repositories { - mavenCentral() - mavenLocal() - mavenCentral(artifactUrls: ['http://maven.springframework.org/milestone']) - maven { url "http://$artifactory:8080/artifactory/repo" } -} - -dependencies { - groovy "org.codehaus.groovy:groovy-all:2.0.5" - compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.6' - - -} - -task wrapper(type: Wrapper) { gradleVersion = '1.6' } - diff --git a/src/main/resources/Groovy/model.mustache b/src/main/resources/Groovy/model.mustache deleted file mode 100644 index bc3ca28aaec..00000000000 --- a/src/main/resources/Groovy/model.mustache +++ /dev/null @@ -1,21 +0,0 @@ -package {{package}}; - -import groovy.transform.Canonical -{{#imports}}import {{import}}; -{{/imports}} -{{#models}} -{{#model}} -@Canonical -class {{classname}} { - {{#vars}} - - {{#description}}/* {{{description}}} */ - {{/description}} - {{{datatype}}} {{name}} = {{{defaultValue}}} - {{/vars}} - - -} - -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/Java/JsonUtil.mustache b/src/main/resources/Java/JsonUtil.mustache deleted file mode 100644 index 29d5f55ecee..00000000000 --- a/src/main/resources/Java/JsonUtil.mustache +++ /dev/null @@ -1,23 +0,0 @@ -package {{invokerPackage}}; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.core.JsonGenerator.Feature; - -import com.fasterxml.jackson.datatype.joda.*; - -public class JsonUtil { - public static ObjectMapper mapper; - - static { - mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.registerModule(new JodaModule()); - } - - public static ObjectMapper getJsonMapper() { - return mapper; - } -} diff --git a/src/main/resources/Java/api.mustache b/src/main/resources/Java/api.mustache deleted file mode 100644 index c0a697e40b4..00000000000 --- a/src/main/resources/Java/api.mustache +++ /dev/null @@ -1,109 +0,0 @@ -package {{package}}; - -import {{invokerPackage}}.ApiException; -import {{invokerPackage}}.ApiInvoker; - -import {{modelPackage}}.*; - -import java.util.*; - -{{#imports}}import {{import}}; -{{/imports}} - -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.MediaType; - -import java.io.File; -import java.util.Map; -import java.util.HashMap; - -{{#operations}} -public class {{classname}} { - String basePath = "{{basePath}}"; - ApiInvoker apiInvoker = ApiInvoker.getInstance(); - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getBasePath() { - return basePath; - } - - {{#operation}} - {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} - {{/responseModel}}{{^responseModel}} - {{/responseModel}} - {{/errorList}} - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; - {{#requiredParamCount}} - // verify required params are set - if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new ApiException(400, "missing required params"); - } - {{/requiredParamCount}} - - // create path and map variables - String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}} - .replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) - queryParams.put("{{baseName}}", String.valueOf({{paramName}})); - {{/queryParams}} - {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); - {{/headerParams}} - String[] contentTypes = { - {{#consumes}}"{{mediaType}}"{{#hasMore}},{{/hasMore}}{{/consumes}} - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - {{#formParams}}{{#notFile}} - hasFields = true; - mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); - {{/notFile}}{{#isFile}} - hasFields = true; - mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); - {{/isFile}}{{/formParams}} - if(hasFields) - postBody = mp; - } - else { - {{#formParams}}{{#notFile}}formParams.put("{{baseName}}", {{paramName}});{{/notFile}} - {{/formParams}} - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; - } - else { - return {{#returnType}}null{{/returnType}}; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return {{#returnType}} null{{/returnType}}; - } - else { - throw ex; - } - } - } - {{/operation}} -} -{{/operations}} diff --git a/src/main/resources/Java/apiException.mustache b/src/main/resources/Java/apiException.mustache deleted file mode 100644 index a6bcba75b7c..00000000000 --- a/src/main/resources/Java/apiException.mustache +++ /dev/null @@ -1,29 +0,0 @@ -package {{invokerPackage}}; - -public class ApiException extends Exception { - int code = 0; - String message = null; - - public ApiException() {} - - public ApiException(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} \ No newline at end of file diff --git a/src/main/resources/Java/apiInvoker.mustache b/src/main/resources/Java/apiInvoker.mustache deleted file mode 100644 index 881cab13e12..00000000000 --- a/src/main/resources/Java/apiInvoker.mustache +++ /dev/null @@ -1,187 +0,0 @@ -package {{invokerPackage}}; - -import com.fasterxml.jackson.core.JsonGenerator.Feature; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.client.filter.LoggingFilter; -import com.sun.jersey.api.client.WebResource.Builder; -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.Response.Status.Family; -import javax.ws.rs.core.MediaType; - -import java.util.Map; -import java.util.HashMap; -import java.util.List; -import java.io.IOException; -import java.net.URLEncoder; -import java.io.UnsupportedEncodingException; - -public class ApiInvoker { - private static ApiInvoker INSTANCE = new ApiInvoker(); - private Map hostMap = new HashMap(); - private Map defaultHeaderMap = new HashMap(); - private boolean isDebug = false; - - public void enableDebug() { - isDebug = true; - } - - public static ApiInvoker getInstance() { - return INSTANCE; - } - - public void addDefaultHeader(String key, String value) { - defaultHeaderMap.put(key, value); - } - - public String escapeString(String str) { - try{ - return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); - } - catch(UnsupportedEncodingException e) { - return str; - } - } - - public static Object deserialize(String json, String containerType, Class cls) throws ApiException { - try{ - if("List".equals(containerType)) { - JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); - List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); - return response; - } - else if(String.class.equals(cls)) { - if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) - return json.substring(1, json.length() - 2); - else - return json; - } - else { - return JsonUtil.getJsonMapper().readValue(json, cls); - } - } - catch (IOException e) { - throw new ApiException(500, e.getMessage()); - } - } - - public static String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return JsonUtil.getJsonMapper().writeValueAsString(obj); - else - return null; - } - catch (Exception e) { - throw new ApiException(500, e.getMessage()); - } - } - - public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, Map formParams, String contentType) throws ApiException { - Client client = getClient(host); - - StringBuilder b = new StringBuilder(); - - for(String key : queryParams.keySet()) { - String value = queryParams.get(key); - if (value != null){ - if(b.toString().length() == 0) - b.append("?"); - else - b.append("&"); - b.append(escapeString(key)).append("=").append(escapeString(value)); - } - } - String querystring = b.toString(); - - Builder builder = client.resource(host + path + querystring).accept("application/json"); - for(String key : headerParams.keySet()) { - builder.header(key, headerParams.get(key)); - } - - for(String key : defaultHeaderMap.keySet()) { - if(!headerParams.containsKey(key)) { - builder.header(key, defaultHeaderMap.get(key)); - } - } - ClientResponse response = null; - - if("GET".equals(method)) { - response = (ClientResponse) builder.get(ClientResponse.class); - } - else if ("POST".equals(method)) { - if(body == null) - response = builder.post(ClientResponse.class, null); - else if(body instanceof FormDataMultiPart) { - response = builder.type(contentType).post(ClientResponse.class, body); - } - else - response = builder.type(contentType).post(ClientResponse.class, serialize(body)); - } - else if ("PUT".equals(method)) { - if(body == null) - response = builder.put(ClientResponse.class, serialize(body)); - else { - if("application/x-www-form-urlencoded".equals(contentType)) { - StringBuilder formParamBuilder = new StringBuilder(); - - // encode the form params - for(String key : formParams.keySet()) { - String value = formParams.get(key); - if(value != null && !"".equals(value.trim())) { - if(formParamBuilder.length() > 0) { - formParamBuilder.append("&"); - } - try { - formParamBuilder.append(URLEncoder.encode(key, "utf8")).append("=").append(URLEncoder.encode(value, "utf8")); - } - catch (Exception e) { - // move on to next - } - } - } - response = builder.type(contentType).put(ClientResponse.class, formParamBuilder.toString()); - } - else - response = builder.type(contentType).put(ClientResponse.class, serialize(body)); - } - } - else if ("DELETE".equals(method)) { - if(body == null) - response = builder.delete(ClientResponse.class, serialize(body)); - else - response = builder.type(contentType).delete(ClientResponse.class, serialize(body)); - } - else { - throw new ApiException(500, "unknown method type " + method); - } - if(response.getClientResponseStatus() == ClientResponse.Status.NO_CONTENT) { - return null; - } - else if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { - return (String) response.getEntity(String.class); - } - else { - throw new ApiException( - response.getClientResponseStatus().getStatusCode(), - response.getEntity(String.class)); - } - } - - private Client getClient(String host) { - if(!hostMap.containsKey(host)) { - Client client = Client.create(); - if(isDebug) - client.addFilter(new LoggingFilter()); - hostMap.put(host, client); - } - return hostMap.get(host); - } -} diff --git a/src/main/resources/Java/model.mustache b/src/main/resources/Java/model.mustache deleted file mode 100644 index 60aa5d72a35..00000000000 --- a/src/main/resources/Java/model.mustache +++ /dev/null @@ -1,49 +0,0 @@ -package {{package}}; - -{{#imports}}import {{import}}; -{{/imports}} - -import com.wordnik.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; -{{#models}} - -{{#model}}{{#description}} -/** - * {{description}} - **/{{/description}} -@ApiModel(description = "{{{description}}}") -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} - - //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; - {{/min}}{{/allowableValues}}{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty(required = {{required}}, value = "{{{description}}}") - @JsonProperty("{{name}}") - public {{{datatype}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatype}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} -{{/model}} -{{/models}} diff --git a/src/main/resources/Java/pom.mustache b/src/main/resources/Java/pom.mustache deleted file mode 100644 index 73d62103e22..00000000000 --- a/src/main/resources/Java/pom.mustache +++ /dev/null @@ -1,168 +0,0 @@ - - 4.0.0 - {{groupId}} - {{artifactId}} - jar - {{artifactId}} - {{artifactVersion}} - - scm:git:git@github.com:wordnik/swagger-mustache.git - scm:git:git@github.com:wordnik/swagger-codegen.git - https://github.com/wordnik/swagger-codegen - - - 2.2.0 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12 - - - - loggerPath - conf/log4j.properties - - - -Xms512m -Xmx1500m - methods - pertest - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.2 - - - - jar - test-jar - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add_sources - generate-sources - - add-source - - - - src/main/java - - - - - add_test_sources - generate-test-sources - - add-test-source - - - - src/test/java - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - - - - com.wordnik - swagger-annotations - ${swagger-annotations-version} - - - com.sun.jersey - jersey-client - ${jersey-version} - - - com.sun.jersey.contribs - jersey-multipart - ${jersey-version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson-version} - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson-version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} - - - com.fasterxml.jackson.datatype - jackson-datatype-joda - 2.1.5 - - - joda-time - joda-time - ${jodatime-version} - - - - - junit - junit - ${junit-version} - test - - - - 1.5.0-M1 - 1.7 - 2.1.4 - 2.3 - 4.8.1 - 1.0.0 - 4.8.1 - - diff --git a/src/main/resources/JavaJaxRS/ApiException.mustache b/src/main/resources/JavaJaxRS/ApiException.mustache deleted file mode 100644 index ffab3b1088e..00000000000 --- a/src/main/resources/JavaJaxRS/ApiException.mustache +++ /dev/null @@ -1,9 +0,0 @@ -package {{apiPackage}}; - -public class ApiException extends Exception{ - private int code; - public ApiException (int code, String msg) { - super(msg); - this.code = code; - } -} diff --git a/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache b/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache deleted file mode 100644 index 68675432c64..00000000000 --- a/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache +++ /dev/null @@ -1,26 +0,0 @@ -package {{apiPackage}}; - -import java.io.IOException; - -import javax.servlet.*; -import javax.servlet.http.HttpServletResponse; - -public class ApiOriginFilter implements javax.servlet.Filter { - @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { - HttpServletResponse res = (HttpServletResponse) response; - res.addHeader("Access-Control-Allow-Origin", "*"); - res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); - res.addHeader("Access-Control-Allow-Headers", "Content-Type"); - chain.doFilter(request, response); - } - - @Override - public void destroy() { - } - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - } -} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache b/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache deleted file mode 100644 index 94711b26efb..00000000000 --- a/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache +++ /dev/null @@ -1,68 +0,0 @@ -package {{apiPackage}}; - -import javax.xml.bind.annotation.XmlTransient; - -@javax.xml.bind.annotation.XmlRootElement -public class ApiResponseMessage { - public static final int ERROR = 1; - public static final int WARNING = 2; - public static final int INFO = 3; - public static final int OK = 4; - public static final int TOO_BUSY = 5; - - int code; - String type; - String message; - - public ApiResponseMessage(){} - - public ApiResponseMessage(int code, String message){ - this.code = code; - switch(code){ - case ERROR: - setType("error"); - break; - case WARNING: - setType("warning"); - break; - case INFO: - setType("info"); - break; - case OK: - setType("ok"); - break; - case TOO_BUSY: - setType("too busy"); - break; - default: - setType("unknown"); - break; - } - this.message = message; - } - - @XmlTransient - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/src/main/resources/JavaJaxRS/NotFoundException.mustache b/src/main/resources/JavaJaxRS/NotFoundException.mustache deleted file mode 100644 index 8ab2c99e4f8..00000000000 --- a/src/main/resources/JavaJaxRS/NotFoundException.mustache +++ /dev/null @@ -1,9 +0,0 @@ -package {{apiPackage}}; - -public class NotFoundException extends ApiException { - private int code; - public NotFoundException (int code, String msg) { - super(code, msg); - this.code = code; - } -} diff --git a/src/main/resources/JavaJaxRS/README.mustache b/src/main/resources/JavaJaxRS/README.mustache deleted file mode 100644 index f8a560b776f..00000000000 --- a/src/main/resources/JavaJaxRS/README.mustache +++ /dev/null @@ -1,10 +0,0 @@ -# Swagger generated server - -## Overview -This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the -[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled scalatra server. - -This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: - -[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/api.mustache b/src/main/resources/JavaJaxRS/api.mustache deleted file mode 100644 index fe287c9ddfe..00000000000 --- a/src/main/resources/JavaJaxRS/api.mustache +++ /dev/null @@ -1,40 +0,0 @@ -package {{package}}; - -import {{modelPackage}}.*; - -import com.wordnik.swagger.annotations.*; -import com.sun.jersey.multipart.FormDataParam; - -{{#imports}}import {{import}}; -{{/imports}} - -import java.util.List; -import {{package}}.NotFoundException; - -import javax.ws.rs.core.Response; -import javax.ws.rs.*; - -@Path("/{{baseName}}") -@Api(value = "/{{baseName}}", description = "the {{baseName}} API") -{{#operations}} -public class {{classname}} { - {{#operation}} - @{{httpMethod}} - {{#subresourceOperation}}@Path("{{path}}"){{/subresourceOperation}} - {{#hasConsumes}}@Consumes({ {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} }){{/hasConsumes}} - {{#hasProduces}}@Produces({ {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }){{/hasProduces}} - @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}) - @ApiResponses(value = { {{#responses}} - @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}}, - {{/hasMore}}{{/responses}} }) - - public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, - {{/hasMore}}{{/allParams}}) - throws NotFoundException { - // do some magic! - return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); - } - - {{/operation}} -} -{{/operations}} diff --git a/src/main/resources/JavaJaxRS/bodyParams.mustache b/src/main/resources/JavaJaxRS/bodyParams.mustache deleted file mode 100644 index 86546afb9ca..00000000000 --- a/src/main/resources/JavaJaxRS/bodyParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#isBodyParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) {{{dataType}}} {{paramName}}{{/isBodyParam}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/formParams.mustache b/src/main/resources/JavaJaxRS/formParams.mustache deleted file mode 100644 index 46076485aa9..00000000000 --- a/src/main/resources/JavaJaxRS/formParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#isFormParam}}{{#notFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/notFile}}{{#isFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormDataParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/headerParams.mustache b/src/main/resources/JavaJaxRS/headerParams.mustache deleted file mode 100644 index 0f88692ad1d..00000000000 --- a/src/main/resources/JavaJaxRS/headerParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#isHeaderParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@HeaderParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/model.mustache b/src/main/resources/JavaJaxRS/model.mustache deleted file mode 100644 index f6cb2b01cdf..00000000000 --- a/src/main/resources/JavaJaxRS/model.mustache +++ /dev/null @@ -1,47 +0,0 @@ -package {{package}}; - -{{#imports}}import {{import}}; -{{/imports}} - -import com.wordnik.swagger.annotations.*; -{{#models}} - -{{#model}}{{#description}} -/** - * {{description}} - **/{{/description}} -@ApiModel(description = "{{{description}}}") -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#isEnum}} - - public enum {{datatype}} { {{#_enum}}{{.}}{{^-last}}, {{/-last}}{{/_enum}} }; - {{/isEnum}}{{/vars}} - - {{#vars}} - @ApiModelProperty(required = {{required}}, value = "{{{description}}}") - public {{{datatype}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatype}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/pathParams.mustache b/src/main/resources/JavaJaxRS/pathParams.mustache deleted file mode 100644 index 1f1b30887a4..00000000000 --- a/src/main/resources/JavaJaxRS/pathParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#isPathParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}} {{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @PathParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isPathParam}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/pom.mustache b/src/main/resources/JavaJaxRS/pom.mustache deleted file mode 100644 index e0782610efd..00000000000 --- a/src/main/resources/JavaJaxRS/pom.mustache +++ /dev/null @@ -1,141 +0,0 @@ - - 4.0.0 - {{groupId}} - {{artifactId}} - jar - {{artifactId}} - {{artifactVersion}} - - src/main/java - - - org.apache.maven.plugins - maven-war-plugin - 2.1.1 - - - maven-failsafe-plugin - 2.6 - - - - integration-test - verify - - - - - - org.mortbay.jetty - jetty-maven-plugin - ${jetty-version} - - - {{^basePath}}/{{/basePath}}{{#basePath}}{{basePath}}{{/basePath}} - - target/${project.artifactId}-${project.version} - ${project.basedir}/conf/jetty/webdefault.xml - 8079 - stopit - - - 8002 - 60000 - 8443 - - - - - - start-jetty - pre-integration-test - - run - - - 0 - true - - - - stop-jetty - post-integration-test - - stop - - - - - - - - - com.wordnik - swagger-jersey-jaxrs - ${swagger-core-version} - - - org.slf4j - slf4j-log4j12 - ${slf4j-version} - - - com.sun.jersey - jersey-core - ${jersey-version} - - - com.sun.jersey - jersey-json - ${jersey-version} - - - com.sun.jersey - jersey-servlet - ${jersey-version} - - - com.sun.jersey.contribs - jersey-multipart - ${jersey-version} - - - com.sun.jersey - jersey-server - ${jersey-version} - - - - org.scalatest - scalatest_2.9.1 - ${scala-test-version} - test - - - junit - junit - ${junit-version} - test - - - javax.servlet - servlet-api - ${servlet-api-version} - - - - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - - 1.5.0-SNAPSHOT - 8.1.11.v20130520 - 1.13 - 1.6.3 - 1.6.1 - 4.8.1 - 2.5 - - \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/project/build.properties b/src/main/resources/JavaJaxRS/project/build.properties deleted file mode 100644 index a8c2f849be3..00000000000 --- a/src/main/resources/JavaJaxRS/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.12.0 diff --git a/src/main/resources/JavaJaxRS/project/plugins.sbt b/src/main/resources/JavaJaxRS/project/plugins.sbt deleted file mode 100644 index 713b7f3e993..00000000000 --- a/src/main/resources/JavaJaxRS/project/plugins.sbt +++ /dev/null @@ -1,9 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.4") - -libraryDependencies <+= sbtVersion(v => v match { - case "0.11.0" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.0-0.2.8" - case "0.11.1" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.1-0.2.10" - case "0.11.2" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.2-0.2.11" - case "0.11.3" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.3-0.2.11.1" - case x if (x.startsWith("0.12")) => "com.github.siasia" %% "xsbt-web-plugin" % "0.12.0-0.2.11.1" -}) \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/queryParams.mustache b/src/main/resources/JavaJaxRS/queryParams.mustache deleted file mode 100644 index b9e80e5a7e7..00000000000 --- a/src/main/resources/JavaJaxRS/queryParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#isQueryParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @QueryParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isQueryParam}} \ No newline at end of file diff --git a/src/main/resources/JavaJaxRS/web.mustache b/src/main/resources/JavaJaxRS/web.mustache deleted file mode 100644 index b9cd00b71ce..00000000000 --- a/src/main/resources/JavaJaxRS/web.mustache +++ /dev/null @@ -1,54 +0,0 @@ - - - - - jersey - com.sun.jersey.spi.container.servlet.ServletContainer - - com.sun.jersey.config.property.packages - com.wordnik.swagger.jaxrs.json;com.wordnik.swagger.jaxrs.listing;{{apiPackage}} - - - com.sun.jersey.spi.container.ContainerRequestFilters - com.sun.jersey.api.container.filter.PostReplaceFilter - - - com.sun.jersey.api.json.POJOMappingFeature - true - - 1 - - - - DefaultJaxrsConfig - com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig - - api.version - 1.0.0 - - - swagger.api.title - {{{title}}} - - - swagger.api.basepath - http://localhost:8002 - - 2 - - - - jersey - /* - - - ApiOriginFilter - com.wordnik.api.ApiOriginFilter - - - ApiOriginFilter - /* - - diff --git a/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig b/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig deleted file mode 100644 index 3f8102a750d..00000000000 --- a/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig +++ /dev/null @@ -1,13 +0,0 @@ -com.wordnik.swagger.codegen.languages.AndroidClientCodegen -com.wordnik.swagger.codegen.languages.JavaClientCodegen -com.wordnik.swagger.codegen.languages.JaxRSServerCodegen -com.wordnik.swagger.codegen.languages.NodeJSServerCodegen -com.wordnik.swagger.codegen.languages.ObjcClientCodegen -com.wordnik.swagger.codegen.languages.ScalatraServerCodegen -com.wordnik.swagger.codegen.languages.ScalaClientCodegen -com.wordnik.swagger.codegen.languages.StaticDocCodegen -com.wordnik.swagger.codegen.languages.StaticHtmlGenerator -com.wordnik.swagger.codegen.languages.SwaggerGenerator -com.wordnik.swagger.codegen.languages.TizenClientCodegen -com.wordnik.swagger.codegen.languages.PhpClientCodegen -com.wordnik.swagger.codegen.languages.PythonClientCodegen \ No newline at end of file diff --git a/src/main/resources/android-java/api.mustache b/src/main/resources/android-java/api.mustache deleted file mode 100644 index 1eab419d31a..00000000000 --- a/src/main/resources/android-java/api.mustache +++ /dev/null @@ -1,88 +0,0 @@ -package {{package}}; - -import {{invokerPackage}}.ApiException; -import {{invokerPackage}}.ApiInvoker; - -import {{modelPackage}}.*; - -import java.util.*; - -{{#imports}}import {{import}}; -{{/imports}} - -import java.util.Map; -import java.util.HashMap; -import java.io.File; - -{{#operations}} -public class {{classname}} { - String basePath = "{{basePath}}"; - ApiInvoker apiInvoker = ApiInvoker.getInstance(); - - public void addHeader(String key, String value) { - getInvoker().addDefaultHeader(key, value); - } - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getBasePath() { - return basePath; - } - - {{#operation}} - {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} - {{/responseModel}}{{^responseModel}} - {{/responseModel}} - {{/errorList}} - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { - Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; - - {{#requiredParamCount}} - // verify required params are set - if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new ApiException(400, "missing required params"); - } - {{/requiredParamCount}} - - // create path and map variables - String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - - {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) - queryParams.put("{{baseName}}", String.valueOf({{paramName}})); - {{/queryParams}} - - {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); - {{/headerParams}} - - String contentType = "application/json"; - - try { - String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, contentType); - if(response != null){ - return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; - } - else { - return {{#returnType}}null{{/returnType}}; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return {{#returnType}} null{{/returnType}}; - } - else { - throw ex; - } - } - } - {{/operation}} -} -{{/operations}} diff --git a/src/main/resources/android-java/apiException.mustache b/src/main/resources/android-java/apiException.mustache deleted file mode 100644 index a6bcba75b7c..00000000000 --- a/src/main/resources/android-java/apiException.mustache +++ /dev/null @@ -1,29 +0,0 @@ -package {{invokerPackage}}; - -public class ApiException extends Exception { - int code = 0; - String message = null; - - public ApiException() {} - - public ApiException(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} \ No newline at end of file diff --git a/src/main/resources/android-java/apiInvoker.mustache b/src/main/resources/android-java/apiInvoker.mustache deleted file mode 100644 index 425c2e7e004..00000000000 --- a/src/main/resources/android-java/apiInvoker.mustache +++ /dev/null @@ -1,283 +0,0 @@ -package {{invokerPackage}}; - - -import com.fasterxml.jackson.core.JsonGenerator.Feature; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import org.apache.http.*; -import org.apache.http.client.*; -import org.apache.http.client.methods.*; -import org.apache.http.conn.*; -import org.apache.http.conn.scheme.*; -import org.apache.http.conn.ssl.*; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.*; -import org.apache.http.impl.conn.*; -import org.apache.http.params.*; -import org.apache.http.util.EntityUtils; - -import java.io.File; -import java.net.Socket; -import java.net.UnknownHostException; -import java.net.URLEncoder; - -import java.util.Map; -import java.util.HashMap; -import java.util.List; -import java.io.IOException; -import java.io.UnsupportedEncodingException; - -import java.security.GeneralSecurityException; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.cert.*; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; - -import java.util.Date; -import java.util.Random; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -public class ApiInvoker { - private static ApiInvoker INSTANCE = new ApiInvoker(); - private Map defaultHeaderMap = new HashMap(); - - private HttpClient client = null; - - private boolean ignoreSSLCertificates = false; - - private ClientConnectionManager ignoreSSLConnectionManager; - - public ApiInvoker() { - initConnectionManager(); - } - - public static ApiInvoker getInstance() { - return INSTANCE; - } - - public void ignoreSSLCertificates(boolean ignoreSSLCertificates) { - this.ignoreSSLCertificates = ignoreSSLCertificates; - } - - public void addDefaultHeader(String key, String value) { - defaultHeaderMap.put(key, value); - } - - public String escapeString(String str) { - return str; - } - - public static Object deserialize(String json, String containerType, Class cls) throws ApiException { - try{ - if("List".equals(containerType)) { - JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); - List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); - return response; - } - else if(String.class.equals(cls)) { - if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) - return json.substring(1, json.length() - 2); - else - return json; - } - else { - return JsonUtil.getJsonMapper().readValue(json, cls); - } - } - catch (IOException e) { - throw new ApiException(500, e.getMessage()); - } - } - - public static String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return JsonUtil.getJsonMapper().writeValueAsString(obj); - else - return null; - } - catch (Exception e) { - throw new ApiException(500, e.getMessage()); - } - } - - public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, String contentType) throws ApiException { - HttpClient client = getClient(host); - - StringBuilder b = new StringBuilder(); - for(String key : queryParams.keySet()) { - String value = queryParams.get(key); - if (value != null){ - if(b.toString().length() == 0) - b.append("?"); - else - b.append("&"); - b.append(escapeString(key)).append("=").append(escapeString(value)); - } - } - String url = host + path + b.toString(); - - HashMap headers = new HashMap(); - - for(String key : headerParams.keySet()) { - headers.put(key, headerParams.get(key)); - } - - for(String key : defaultHeaderMap.keySet()) { - if(!headerParams.containsKey(key)) { - headers.put(key, defaultHeaderMap.get(key)); - } - } - headers.put("Accept", "application/json"); - - HttpResponse response = null; - try{ - if("GET".equals(method)) { - HttpGet get = new HttpGet(url); - get.addHeader("Accept", "application/json"); - for(String key : headers.keySet()) { - get.setHeader(key, headers.get(key)); - } - response = client.execute(get); - } - else if ("POST".equals(method)) { - HttpPost post = new HttpPost(url); - - if (body != null) { - post.setHeader("Content-Type", contentType); - post.setEntity(new StringEntity(serialize(body), "UTF-8")); - } - for(String key : headers.keySet()) { - post.setHeader(key, headers.get(key)); - } - response = client.execute(post); - } - else if ("PUT".equals(method)) { - HttpPut put = new HttpPut(url); - if(body != null) { - put.setHeader("Content-Type", contentType); - put.setEntity(new StringEntity(serialize(body), "UTF-8")); - } - for(String key : headers.keySet()) { - put.setHeader(key, headers.get(key)); - } - response = client.execute(put); - } - else if ("DELETE".equals(method)) { - HttpDelete delete = new HttpDelete(url); - for(String key : headers.keySet()) { - delete.setHeader(key, headers.get(key)); - } - response = client.execute(delete); - } - else if ("PATCH".equals(method)) { - HttpPatch patch = new HttpPatch(url); - - if (body != null) { - patch.setHeader("Content-Type", contentType); - patch.setEntity(new StringEntity(serialize(body), "UTF-8")); - } - for(String key : headers.keySet()) { - patch.setHeader(key, headers.get(key)); - } - response = client.execute(patch); - } - - int code = response.getStatusLine().getStatusCode(); - String responseString = null; - if(code == 204) - responseString = ""; - else if(code >= 200 && code < 300) { - if(response.getEntity() != null) { - HttpEntity resEntity = response.getEntity(); - responseString = EntityUtils.toString(resEntity); - } - } - else { - if(response.getEntity() != null) { - HttpEntity resEntity = response.getEntity(); - responseString = EntityUtils.toString(resEntity); - } - else - responseString = "no data"; - throw new ApiException(code, responseString); - } - return responseString; - } - catch(IOException e) { - throw new ApiException(500, e.getMessage()); - } - } - - private HttpClient getClient(String host) { - if (client == null) { - if (ignoreSSLCertificates && ignoreSSLConnectionManager != null) { - // Trust self signed certificates - client = new DefaultHttpClient(ignoreSSLConnectionManager, new BasicHttpParams()); - } else { - client = new DefaultHttpClient(); - } - } - return client; - } - - private void initConnectionManager() { - try { - final SSLContext sslContext = SSLContext.getInstance("SSL"); - - // set up a TrustManager that trusts everything - TrustManager[] trustManagers = new TrustManager[] { - new X509TrustManager() { - public X509Certificate[] getAcceptedIssuers() { - return null; - } - public void checkClientTrusted(X509Certificate[] certs, String authType) {} - public void checkServerTrusted(X509Certificate[] certs, String authType) {} - }}; - - sslContext.init(null, trustManagers, new SecureRandom()); - - SSLSocketFactory sf = new SSLSocketFactory((KeyStore)null) { - private javax.net.ssl.SSLSocketFactory sslFactory = sslContext.getSocketFactory(); - - public Socket createSocket(Socket socket, String host, int port, boolean autoClose) - throws IOException, UnknownHostException { - return sslFactory.createSocket(socket, host, port, autoClose); - } - - public Socket createSocket() throws IOException { - return sslFactory.createSocket(); - } - }; - - sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); - Scheme httpsScheme = new Scheme("https", sf, 443); - SchemeRegistry schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(httpsScheme); - schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - - ignoreSSLConnectionManager = new SingleClientConnManager(new BasicHttpParams(), schemeRegistry); - } catch (NoSuchAlgorithmException e) { - // This will only be thrown if SSL isn't available for some reason. - } catch (KeyManagementException e) { - // This might be thrown when passing a key into init(), but no key is being passed. - } catch (GeneralSecurityException e) { - // This catches anything else that might go wrong. - // If anything goes wrong we default to the standard connection manager. - } - } -} diff --git a/src/main/resources/android-java/httpPatch.mustache b/src/main/resources/android-java/httpPatch.mustache deleted file mode 100644 index 55cec2f1279..00000000000 --- a/src/main/resources/android-java/httpPatch.mustache +++ /dev/null @@ -1,16 +0,0 @@ -package {{invokerPackage}}; - -import org.apache.http.client.methods.*; - -public class HttpPatch extends HttpPost { - public static final String METHOD_PATCH = "PATCH"; - - public HttpPatch(final String url) { - super(url); - } - - @Override - public String getMethod() { - return METHOD_PATCH; - } -} \ No newline at end of file diff --git a/src/main/resources/android-java/jsonUtil.mustache b/src/main/resources/android-java/jsonUtil.mustache deleted file mode 100644 index ef00838c17f..00000000000 --- a/src/main/resources/android-java/jsonUtil.mustache +++ /dev/null @@ -1,20 +0,0 @@ -package {{invokerPackage}}; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.core.JsonGenerator.Feature; - -public class JsonUtil { - public static ObjectMapper mapper; - - static { - mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - } - - public static ObjectMapper getJsonMapper() { - return mapper; - } -} diff --git a/src/main/resources/android-java/model.mustache b/src/main/resources/android-java/model.mustache deleted file mode 100644 index 0d60aedd068..00000000000 --- a/src/main/resources/android-java/model.mustache +++ /dev/null @@ -1,47 +0,0 @@ -package {{package}}; - -{{#imports}}import {{import}}; -{{/imports}} - -import com.wordnik.swagger.annotations.*; -{{#models}} - -{{#model}}{{#description}} -/** - * {{description}} - **/{{/description}} -@ApiModel(description = "{{{description}}}") -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} - - //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; - {{/min}}{{/allowableValues}}{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty(required = {{required}}, value = "{{{description}}}") - public {{{datatype}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatype}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/android-java/pom.mustache b/src/main/resources/android-java/pom.mustache deleted file mode 100644 index 11641082eee..00000000000 --- a/src/main/resources/android-java/pom.mustache +++ /dev/null @@ -1,162 +0,0 @@ - - 4.0.0 - {{groupId}} - {{artifactId}} - jar - {{artifactId}} - {{artifactVersion}} - - scm:git:git@github.com:wordnik/swagger-mustache.git - scm:git:git@github.com:wordnik/swagger-codegen.git - https://github.com/wordnik/swagger-codegen - - - 2.2.0 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12 - - - - loggerPath - conf/log4j.properties - - - -Xms512m -Xmx1500m - methods - pertest - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.2 - - - - jar - test-jar - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add_sources - generate-sources - - add-source - - - - src/main/java - - - - - add_test_sources - generate-test-sources - - add-test-source - - - - src/test/java - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - - - - com.wordnik - swagger-annotations - ${swagger-annotations-version} - - - com.fasterxml.jackson.core - jackson-core - ${jackson-version} - compile - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson-version} - compile - - - com.fasterxml.jackson.core - jackson-databind - ${jackson-version} - compile - - - org.apache.httpcomponents - httpclient - ${httpclient-version} - compile - - - - - junit - junit - ${junit-version} - test - - - - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - - 1.5.0-SNAPSHOT - 2.1.4 - 4.8.1 - 1.0.0 - 4.8.1 - 4.0 - - diff --git a/src/main/resources/asyncscala/api.mustache b/src/main/resources/asyncscala/api.mustache deleted file mode 100644 index 2a8664450d5..00000000000 --- a/src/main/resources/asyncscala/api.mustache +++ /dev/null @@ -1,59 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} -import com.wordnik.swagger.client._ -import scala.concurrent.{ Future, Await } -import scala.concurrent.duration._ -import collection.mutable - -{{#operations}} -class {{className}}(client: TransportClient, config: SwaggerConfig) extends ApiClient(client, config) { - - {{#operation}} - - def {{nickname}}({{#allParams}} - {{#optional}} - {{paramName}}: Option[{{dataType}}] = {{#defaultValue}}Some({{defaultValue}}){{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{#hasMore}}, {{/hasMore}} - {{/optional}} - {{^optional}} - {{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}} - {{/optional}}{{/allParams}})(implicit reader: ClientResponseReader[{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]{{#bodyParams}}, writer: RequestWriter[{{dataType}}]{{/bodyParams}}){{#returnType}}: Future[{{returnType}}]{{/returnType}}{{^returnType}}: Future[Unit]{{/returnType}} = { - // create path and map variables - val path = - (addFmt("{{path}}"){{#pathParams}} - replaceAll ("\\{" + "{{baseName}}" + "\\}",{{paramName}}.toString) - {{/pathParams}}) - - // query params - val queryParams = new mutable.HashMap[String, String] - val headerParams = new mutable.HashMap[String, String] - - {{#requiredParamCount}} - // verify required params are set - val paramCount = (Set[Any]({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) - null).size - if (paramCount != {{requiredParamCount}}) sys.error("missing required params") - {{/requiredParamCount}} - - {{#queryParams}} - {{#optional}} - if({{paramName}} != null) {{paramName}}.foreach { v => queryParams += "{{baseName}}" -> v.toString } - {{/optional}} - {{^optional}} - if({{paramName}} != null) queryParams += "{{baseName}}" -> {{paramName}}.toString - {{/optional}} - {{/queryParams}} - - {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}}.toString - {{/headerParams}} - - val resFuture = client.submit("{{httpMethod}}", path, queryParams.toMap, headerParams.toMap, {{#bodyParam}}writer.write({{bodyParam}}){{/bodyParam}}{{^bodyParam}}"{{emptyBodyParam}}"{{/bodyParam}}) - resFuture flatMap { resp => - process(reader.read(resp)) - } - } - - {{/operation}} - -} -{{/operations}} diff --git a/src/main/resources/asyncscala/client.mustache b/src/main/resources/asyncscala/client.mustache deleted file mode 100644 index d652ab07a94..00000000000 --- a/src/main/resources/asyncscala/client.mustache +++ /dev/null @@ -1,26 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} -import com.wordnik.swagger.client._ -import apis._ -import java.io.Closeable - -class {{clientName}}(config: SwaggerConfig) extends Closeable { - val locator = config.locator - val name = config.name - - private[this] val client = transportClient - - protected def transportClient: TransportClient = new RestClient(config) - - {{#apiInfo}} - {{#apis}} - val {{name}} = new {{className}}(client, config) - {{/apis}} - {{/apiInfo}} - - def close() { - client.close() - } -} \ No newline at end of file diff --git a/src/main/resources/asyncscala/model.mustache b/src/main/resources/asyncscala/model.mustache deleted file mode 100644 index 3892f28302e..00000000000 --- a/src/main/resources/asyncscala/model.mustache +++ /dev/null @@ -1,15 +0,0 @@ -package {{package}} - -import org.joda.time.DateTime - -{{#models}} - -{{#model}} -case class {{classname}} ( - {{#vars}} - - {{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}]{{/isNotRequired}} {{#hasMore}},{{/hasMore}}{{#description}} // {{description}}{{/description}}{{newline}} - {{/vars}} -) -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/asyncscala/sbt.mustache b/src/main/resources/asyncscala/sbt.mustache deleted file mode 100644 index 86d4779456a..00000000000 --- a/src/main/resources/asyncscala/sbt.mustache +++ /dev/null @@ -1,11 +0,0 @@ -organization := "{{package}}" - -name := "{{projectName}}-client" - -libraryDependencies += "com.wordnik.swagger" %% "swagger-async-httpclient" % "0.3.0-WN5" - -libraryDependencies += "joda-time" % "joda-time" % "2.3" - -libraryDependencies += "org.joda" % "joda-convert" % "1.3.1" - -libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.13" % "provided" diff --git a/src/main/resources/csharp/Newtonsoft.Json.dll b/src/main/resources/csharp/Newtonsoft.Json.dll deleted file mode 100644 index 26fdaffec145b1795af118d07ef764406d78f6f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 426496 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

BWZ_eV|^M^miQ6%*;qfy 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ΝZNt?r4^ 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 We5D(VilUEh|3}=%-*#gGP_xT_I diff --git a/src/main/resources/csharp/api.mustache b/src/main/resources/csharp/api.mustache deleted file mode 100644 index 3d556fa72f8..00000000000 --- a/src/main/resources/csharp/api.mustache +++ /dev/null @@ -1,101 +0,0 @@ - using System; - using System.Collections.Generic; - using {{invokerPackage}}; - using {{modelPackage}}; - {{#imports}} - {{/imports}} - - namespace {{package}} { - {{#operations}} - public class {{classname}} { - string basePath; - private readonly ApiInvoker apiInvoker = ApiInvoker.GetInstance(); - - public {{classname}}(String basePath = "{{basePath}}") - { - this.basePath = basePath; - } - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - // Sets the endpoint base url for the services being accessed - public void setBasePath(string basePath) { - this.basePath = basePath; - } - - // Gets the endpoint base url for the services being accessed - public String getBasePath() { - return basePath; - } - - {{#operation}} - - ///

- /// {{summary}} {{notes}} - /// - {{#allParams}}/// {{description}} - {{#hasMore}} {{/hasMore}}{{/allParams}} - /// - public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { - // create path and map variables - var path = "{{path}}".Replace("{format}","json"){{#pathParams}}.Replace("{" + "{{paramName}}" + "}", apiInvoker.escapeString({{{paramName}}}.ToString())){{/pathParams}}; - - // query params - var queryParams = new Dictionary(); - var headerParams = new Dictionary(); - var formParams = new Dictionary(); - - {{#requiredParamCount}} - // verify required params are set - if ({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new ApiException(400, "missing required params"); - } - {{/requiredParamCount}} - - {{#queryParams}}if ({{paramName}} != null){ - string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); - queryParams.Add("{{paramName}}", paramStr); - } - {{/queryParams}} - - {{#headerParams}}headerParams.Add("{{paramName}}", {{paramName}}); - {{/headerParams}} - - {{#formParams}}if ({{paramName}} != null){ - if({{paramName}} is byte[]) { - formParams.Add("{{paramName}}", {{paramName}}); - } else { - string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); - formParams.Add("{{paramName}}", paramStr); - } - } - {{/formParams}} - - try { - if (typeof({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}) == typeof(byte[])) { - var response = apiInvoker.invokeBinaryAPI(basePath, path, "GET", queryParams, null, headerParams, formParams); - return {{#returnType}}((object)response) as {{{returnType}}}{{/returnType}}; - } else { - var response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams, formParams); - if(response != null){ - return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, typeof({{{returnType}}})){{/returnType}}; - } - else { - return {{#returnType}}null{{/returnType}}; - } - } - } catch (ApiException ex) { - if(ex.ErrorCode == 404) { - return {{#returnType}}null{{/returnType}}; - } - else { - throw ex; - } - } - } - {{/operation}} - } - {{/operations}} - } \ No newline at end of file diff --git a/src/main/resources/csharp/apiException.mustache b/src/main/resources/csharp/apiException.mustache deleted file mode 100644 index 3b371aea9a8..00000000000 --- a/src/main/resources/csharp/apiException.mustache +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace {{invokerPackage}} { - public class ApiException : Exception { - - private int errorCode = 0; - - public ApiException() {} - - public int ErrorCode { - get - { - return errorCode; - } - } - - public ApiException(int errorCode, string message) : base(message) { - this.errorCode = errorCode; - } - } -} \ No newline at end of file diff --git a/src/main/resources/csharp/apiInvoker.mustache b/src/main/resources/csharp/apiInvoker.mustache deleted file mode 100644 index f7c76ee2c56..00000000000 --- a/src/main/resources/csharp/apiInvoker.mustache +++ /dev/null @@ -1,207 +0,0 @@ - using System; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using System.Net; - using System.Text; - using Newtonsoft.Json; - - namespace {{invokerPackage}} { - public class ApiInvoker { - private static readonly ApiInvoker _instance = new ApiInvoker(); - private Dictionary defaultHeaderMap = new Dictionary(); - - public static ApiInvoker GetInstance() { - return _instance; - } - - public void addDefaultHeader(string key, string value) { - defaultHeaderMap.Add(key, value); - } - - public string escapeString(string str) { - return str; - } - - public static object deserialize(string json, Type type) { - try - { - return JsonConvert.DeserializeObject(json, type); - } - catch (IOException e) { - throw new ApiException(500, e.Message); - } - - } - - public static string serialize(object obj) { - try - { - return obj != null ? JsonConvert.SerializeObject(obj) : null; - } - catch (Exception e) { - throw new ApiException(500, e.Message); - } - } - - public string invokeAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) - { - return invokeAPIInternal(host, path, method, false, queryParams, body, headerParams, formParams) as string; - } - - public byte[] invokeBinaryAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) - { - return invokeAPIInternal(host, path, method, true, queryParams, body, headerParams, formParams) as byte[]; - } - - private object invokeAPIInternal(string host, string path, string method, bool binaryResponse, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) { - var b = new StringBuilder(); - - foreach (var queryParamItem in queryParams) - { - var value = queryParamItem.Value; - if (value == null) continue; - b.Append(b.ToString().Length == 0 ? "?" : "&"); - b.Append(escapeString(queryParamItem.Key)).Append("=").Append(escapeString(value)); - } - - var querystring = b.ToString(); - - host = host.EndsWith("/") ? host.Substring(0, host.Length - 1) : host; - - var client = WebRequest.Create(host + path + querystring); - client.Method = method; - - byte[] formData = null; - if (formParams.Count > 0) - { - string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); - client.ContentType = "multipart/form-data; boundary=" + formDataBoundary; - formData = GetMultipartFormData(formParams, formDataBoundary); - client.ContentLength = formData.Length; - } - else - { - client.ContentType = "application/json"; - } - - foreach (var headerParamsItem in headerParams) - { - client.Headers.Add(headerParamsItem.Key, headerParamsItem.Value); - } - foreach (var defaultHeaderMapItem in defaultHeaderMap.Where(defaultHeaderMapItem => !headerParams.ContainsKey(defaultHeaderMapItem.Key))) - { - client.Headers.Add(defaultHeaderMapItem.Key, defaultHeaderMapItem.Value); - } - - switch (method) - { - case "GET": - break; - case "POST": - case "PUT": - case "DELETE": - using (Stream requestStream = client.GetRequestStream()) - { - if (formData != null) - { - requestStream.Write(formData, 0, formData.Length); - } - - var swRequestWriter = new StreamWriter(requestStream); - swRequestWriter.Write(serialize(body)); - swRequestWriter.Close(); - } - break; - default: - throw new ApiException(500, "unknown method type " + method); - } - - try - { - var webResponse = (HttpWebResponse)client.GetResponse(); - if (webResponse.StatusCode != HttpStatusCode.OK) - { - webResponse.Close(); - throw new ApiException((int)webResponse.StatusCode, webResponse.StatusDescription); - } - - if (binaryResponse) - { - using (var memoryStream = new MemoryStream()) - { - webResponse.GetResponseStream().CopyTo(memoryStream); - return memoryStream.ToArray(); - } - } - else - { - using (var responseReader = new StreamReader(webResponse.GetResponseStream())) - { - var responseData = responseReader.ReadToEnd(); - return responseData; - } - } - } - catch(WebException ex) - { - var response = ex.Response as HttpWebResponse; - int statusCode = 0; - if (response != null) - { - statusCode = (int)response.StatusCode; - response.Close(); - } - throw new ApiException(statusCode, ex.Message); - } - } - - private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary) - { - Stream formDataStream = new System.IO.MemoryStream(); - bool needsCLRF = false; - - foreach (var param in postParameters) - { - // Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added. - // Skip it on the first parameter, add it to subsequent parameters. - if (needsCLRF) - formDataStream.Write(Encoding.UTF8.GetBytes("\r\n"), 0, Encoding.UTF8.GetByteCount("\r\n")); - - needsCLRF = true; - - if (param.Value is byte[]) - { - string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n", - boundary, - param.Key, - "application/octet-stream"); - formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); - - // Write the file data directly to the Stream, rather than serializing it to a string. - formDataStream.Write((param.Value as byte[]), 0, (param.Value as byte[]).Length); - } - else - { - string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", - boundary, - param.Key, - param.Value); - formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); - } - } - - // Add the end of the request. Start with a newline - string footer = "\r\n--" + boundary + "--\r\n"; - formDataStream.Write(Encoding.UTF8.GetBytes(footer), 0, Encoding.UTF8.GetByteCount(footer)); - - // Dump the Stream into a byte[] - formDataStream.Position = 0; - byte[] formData = new byte[formDataStream.Length]; - formDataStream.Read(formData, 0, formData.Length); - formDataStream.Close(); - - return formData; - } - } - } diff --git a/src/main/resources/csharp/compile.mustache b/src/main/resources/csharp/compile.mustache deleted file mode 100644 index be16fb1636e..00000000000 --- a/src/main/resources/csharp/compile.mustache +++ /dev/null @@ -1,2 +0,0 @@ -SET CSCPATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319 -%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll /target:library /out:bin/{{invokerPackage}}.dll /recurse:src\*.cs /doc:bin/{{invokerPackage}}.xml \ No newline at end of file diff --git a/src/main/resources/csharp/model.mustache b/src/main/resources/csharp/model.mustache deleted file mode 100644 index d9ef4ffbedd..00000000000 --- a/src/main/resources/csharp/model.mustache +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Text; -using System.Collections; -using System.Collections.Generic; - -{{#models}} -{{#model}} -namespace {{package}} { - public class {{classname}} { - {{#vars}} - - {{#description}}/* {{{description}}} */ - {{/description}} - public {{{datatype}}} {{name}} { get; set; } - - {{/vars}} - - public override string ToString() { - var sb = new StringBuilder(); - sb.Append("class {{classname}} {\n"); - {{#vars}} - sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); - {{/vars}} - sb.Append("}\n"); - return sb.ToString(); - } - } - {{/model}} - {{/models}} -} \ No newline at end of file diff --git a/src/main/resources/flash/ASAXB-0.1.1.swc b/src/main/resources/flash/ASAXB-0.1.1.swc deleted file mode 100644 index c93590267846ce45564dfeff8275a0030e39b2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46948 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 - - - - - - AirExecutorApp - - - AirExecutorApp - - - AirExecutorApp - - - v1 - - - - - - - - - - - - - - - AirExecutorApp.swf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/flash/ApiClientEvent.as b/src/main/resources/flash/ApiClientEvent.as deleted file mode 100644 index 313da09ea78..00000000000 --- a/src/main/resources/flash/ApiClientEvent.as +++ /dev/null @@ -1,36 +0,0 @@ -package com.wordnik.swagger.event { -import com.wordnik.swagger.event.Response; - -import flash.events.Event; - -/** - * Event dispatched by the SDK to communicate success events and failure events. - * 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{ - - /** - * Event type to indicate a unsuccessful invocation - */ - public static const FAILURE_EVENT:String = "unsuccesfulInvocation"; - - /** - * Event type to indicate a successful invocation - */ - public static const SUCCESS_EVENT:String = "successfulInvocation"; - - /** - * The Response object which contains response info - */ - 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/src/main/resources/flash/ApiError.as b/src/main/resources/flash/ApiError.as deleted file mode 100644 index 13d09415829..00000000000 --- a/src/main/resources/flash/ApiError.as +++ /dev/null @@ -1,10 +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/src/main/resources/flash/ApiErrorCodes.as b/src/main/resources/flash/ApiErrorCodes.as deleted file mode 100644 index abe12178361..00000000000 --- a/src/main/resources/flash/ApiErrorCodes.as +++ /dev/null @@ -1,34 +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/src/main/resources/flash/ApiInvoker.as b/src/main/resources/flash/ApiInvoker.as deleted file mode 100644 index 40ad41af65f..00000000000 --- a/src/main/resources/flash/ApiInvoker.as +++ /dev/null @@ -1,289 +0,0 @@ -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; - - -public class ApiInvoker extends EventDispatcher -{ - - private var _apiUsageCredentials:ApiUserCredentials; - internal var _apiProxyServerUrl:String = ""; - private var _baseUrl: String = ""; - internal var _useProxyServer: Boolean = true; - private var _proxyHostName:String = ""; - private var _apiPath: String = ""; - private var _proxyPath: String = ""; - - public var _apiEventNotifier:EventDispatcher; - - private static const DELETE_DATA_DUMMY:String = "dummyDataRequiredForDeleteOverride"; - private static const X_HTTP_OVERRIDE_KEY:String = "X-HTTP-Method-Override"; - private static const CONTENT_TYPE_HEADER_KEY:String = "Content-Type"; - - public function ApiInvoker(apiUsageCredentials: ApiUserCredentials, eventNotifier: EventDispatcher, useProxy: Boolean = true) { - _apiUsageCredentials = apiUsageCredentials; - _useProxyServer = useProxy; - if(_apiUsageCredentials.hostName != null){ - _proxyHostName = _apiUsageCredentials.hostName; - } - _apiPath = _apiUsageCredentials.apiPath; - _proxyPath = _apiUsageCredentials.proxyPath; - _apiProxyServerUrl = _apiUsageCredentials.apiProxyServerUrl; - _apiEventNotifier = eventNotifier; - } - - public function invokeAPI(resourceURL: String, method: String, queryParams: Dictionary, postObject: Object, headerParams: Dictionary): AsyncToken { - //make the communication - if(_useProxyServer) { - resourceURL = _apiProxyServerUrl + resourceURL; - } - else{ - resourceURL = "http://"+ _proxyHostName + _apiPath + resourceURL; - } - - var counter: int = 0; - var symbol: String = "&"; - var paramValue: Object; - for (var paramName:String in queryParams) { - paramValue = queryParams[paramName]; - //var key:String = paramName; - // do stuff - symbol = "&"; - if(counter == 0){ - symbol = "?"; - } - resourceURL = resourceURL + symbol + paramName + "=" + paramValue.toString(); - counter++; - - } -// trace(resourceURL); - //create a httpservice and invoke the rest url waiting for response - var requestHeader:Object = new Object(); - if(headerParams != null) { - for(var key: String in headerParams) { - requestHeader[key] = headerParams[key]; - } - } - - resourceURL = ApiUrlHelper.appendTokenInfo(resourceURL, requestHeader, _apiUsageCredentials); - - var bodyData:String = marshal(postObject).toString();//restRequest.postData; - - return doRestCall(resourceURL, onApiRequestResult, onApiRequestFault, method, bodyData, requestHeader, "application/xml"); - - - } - - private function doRestCall( url : String, resultFunction : Function, faultFunction : Function = null, - restMethod : String = "GET", - bodyData : Object = null, headers: Object = null, contentType:String = "application/xml" ) : AsyncToken - { - var httpService : HTTPService = new HTTPService( ); - - if(headers == null){ - headers = new Object(); - } - httpService.method = restMethod; - - if ( restMethod.toUpperCase() != HTTPRequestMessage.GET_METHOD ) - { - //httpService.method = HTTPRequestMessage.POST_METHOD; - not required as we're using the proxy - if( bodyData == null ) - { - bodyData = new Object(); - } - - if(restMethod == HTTPRequestMessage.DELETE_METHOD){ - headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.DELETE_METHOD; - bodyData = DELETE_DATA_DUMMY; - } - else if(restMethod == HTTPRequestMessage.PUT_METHOD){ - headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.PUT_METHOD; - } - else{ - headers[CONTENT_TYPE_HEADER_KEY]= contentType; - } - } - else - { - //if the request type is GET and content type is xml then the Flex HTTPService converts it to a POST ... yeah - contentType = null; - } - - httpService.url = url; - httpService.contentType = contentType; - httpService.resultFormat = "e4x"; - httpService.headers = headers; - httpService.addEventListener( ResultEvent.RESULT, resultFunction ); - if( faultFunction != null ) - { - httpService.addEventListener( FaultEvent.FAULT, faultFunction ); - } - if(_useProxyServer){ - httpService.useProxy = true; - - var channelSet: ChannelSet = new ChannelSet(); - var httpChannel: HTTPChannel = new HTTPChannel(); - httpChannel.uri = ApiUrlHelper.getProxyUrl(_proxyHostName, _proxyPath); - channelSet.addChannel(httpChannel); - httpService.channelSet = channelSet; - } - - return httpService.send( bodyData ); - } - - private function onApiRequestResult(event:ResultEvent):void - { - var completionListener: Function = event.token.completionListener; - var result: Object = event.result; - var resultType: Class = event.token.returnType; - var resultObject:Object; - if(resultType != null) { - var context:ASAXBContext = ASAXBContext.newInstance(resultType); - var unmarshaller:Unmarshaller = context.createUnmarshaller(); - var resultXML: XML = new XML(event.result); - try{ - resultObject = unmarshaller.unmarshal(resultXML); - } - catch(error: TypeError){ - var errorResponse: Response = new Response(false, null, "Could not unmarshall response"); - if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher - var failureEvent: ApiClientEvent = new ApiClientEvent(event.token.completionEventType); - failureEvent.response = errorResponse; - _apiEventNotifier.dispatchEvent(failureEvent); - } - } - - if(resultObject is ListWrapper){ - resultObject = ListWrapper(resultObject).getList(); - } - } - - var response : Response = new Response(true, resultObject); - response.requestId = event.token.requestId; - var successEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.SUCCESS_EVENT; - - if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher - var successEvent: ApiClientEvent = new ApiClientEvent(successEventType); - successEvent.response = response; - _apiEventNotifier.dispatchEvent(successEvent); - } - } - - private function onApiRequestFault(event:FaultEvent):void - { - var completionListener: Function = event.token.completionListener; - if(completionListener != null){ - completionListener.call( null, new Response( false, null, event.fault.faultString) ); - } - - var failureEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.FAILURE_EVENT; - - if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher - var failureEvent: ApiClientEvent = new ApiClientEvent(failureEventType); - failureEvent.response = new Response( false, null, event.fault.faultString); - _apiEventNotifier.dispatchEvent(failureEvent); - } - } - - - public function marshal(source:Object):Object { -// trace("marshal got - " + source) - if(source is String) { - return source; - } else if(source is Array && source.length > 0) { - var writer:XMLWriter=new XMLWriter(); - var sourceArray: Array = source as Array; - var arrayEnclosure: String = getArrayEnclosure(sourceArray); - writer.xml.setName(arrayEnclosure); - - for (var i:int = 0; i < sourceArray.length; i++) { - var o: Object = sourceArray[i]; - writer.xml.appendChild(marshal(o)); - } - return writer.xml; - } else - return marshalObject(source); - } - - public function marshalObject(source:Object):XML - { - var writer:XMLWriter=new XMLWriter(); - var objDescriptor:XML=describeType(source); - var property:XML; - var propertyType:String; - var propertyValue:Object; - - var qualifiedClassName:String=objDescriptor.@name; - qualifiedClassName=qualifiedClassName.replace("::","."); - var className: String = qualifiedClassName.substring(qualifiedClassName.lastIndexOf(".") + 1); - className = className().toLowerCase() + className.substring(1); - writer.xml.setName(className); - - for each(property in objDescriptor.elements("variable")){ - propertyValue=source[property.@name]; - if (propertyValue!=null){ - if (ObjectUtil.isSimple(propertyValue)){ - writer.addProperty(property.@name, propertyValue.toString()); - } - else { - writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); - } - } - } - for each(property in objDescriptor.elements("accessor")){ - if (property.@access=="readonly"){ - continue; - } - propertyValue=source[property.@name]; - if (source[property.@name]!=null){ - if (ObjectUtil.isSimple(propertyValue)){ - writer.addProperty(property.@name, propertyValue.toString()); - } - else { - writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); - } - } - } - return writer.xml; - } - - public function escapeString(str: String): String { - return str; - } - - private function getArrayEnclosure(arr: Array) : String { - if(arr != null && arr.length > 0) { - var className: String = flash.utils.getQualifiedClassName(arr[0]) - if(className.indexOf("::") > 0) - className = className.substr(className.indexOf("::") + 2, className.length) - - return className.substring(0, 1).toLowerCase() + className.substring(1, className.length) + "s"; - } else - return ""; - } - - -} -} \ No newline at end of file diff --git a/src/main/resources/flash/ApiUrlHelper.as b/src/main/resources/flash/ApiUrlHelper.as deleted file mode 100644 index affa1eb0ff9..00000000000 --- a/src/main/resources/flash/ApiUrlHelper.as +++ /dev/null @@ -1,41 +0,0 @@ -package com.wordnik.swagger.common { -import com.wordnik.swagger.common.ApiUserCredentials; - -/** - * @private - * Internal class for the Rest client - */ -internal class ApiUrlHelper { - - private static const API_URL_KEY:String = "api_key"; - private static const AUTH_TOKEN_URL_KEY:String = "auth_token"; - - private static const HTTP_URL_PREFIX:String = "http://"; - - 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){ - restUrl += ( "?" + API_URL_KEY + "=" + credentials.apiToken ); - } - else{ - restUrl += ( "&" + API_URL_KEY + "=" + credentials.apiToken ); - } - requestHeader.api_key = credentials.apiToken; - - if(credentials.authToken != null && credentials.authToken != ""){ - restUrl += ( "&" + AUTH_TOKEN_URL_KEY + "=" + credentials.authToken ); - requestHeader.auth_token = credentials.authToken; - } - - return restUrl; - } - - internal static function getProxyUrl(hostName: String, proxyPath: String): String{ - if (hostName(hostName.length - 1) == "/") //remove trailing slash - { - hostName = hostName.substring(0, hostName.length - 1); - } - return HTTP_URL_PREFIX + hostName + proxyPath; - } -} -} diff --git a/src/main/resources/flash/ApiUserCredentials.as b/src/main/resources/flash/ApiUserCredentials.as deleted file mode 100644 index a7536c213e2..00000000000 --- a/src/main/resources/flash/ApiUserCredentials.as +++ /dev/null @@ -1,63 +0,0 @@ -package com.wordnik.swagger.common { - -/** - * Api account credentials. - * - */ -public class ApiUserCredentials { - /** - * An apitoken that is passed along with the requests - */ - public var apiToken:String; - /** - * A valid auth_token which could be necessary for certain operations - */ - public var authToken:String; - /** - * The userId which could be required for certain operations - */ - public var userId:Number; - /** - * 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; - - /** - * 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; - } - -} -} \ No newline at end of file diff --git a/src/main/resources/flash/ListWrapper.as b/src/main/resources/flash/ListWrapper.as deleted file mode 100644 index 1ea2ebead00..00000000000 --- a/src/main/resources/flash/ListWrapper.as +++ /dev/null @@ -1,9 +0,0 @@ -package com.wordnik.swagger.common -{ - public interface ListWrapper - { - - function getList(): Array; - - } -} \ No newline at end of file diff --git a/src/main/resources/flash/Response.as b/src/main/resources/flash/Response.as deleted file mode 100644 index 56cceb61959..00000000000 --- a/src/main/resources/flash/Response.as +++ /dev/null @@ -1,56 +0,0 @@ -package com.wordnik.swagger.event { - -/** - * Response contains info on the result of an API invocation. - * A completion listener will expect this Response object. - */ -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: "; - - 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){ - errorCode = String(errorCodeArray[0]); - } - 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 toString(): String { - return "Response (requestId:" + requestId + "; isSuccess:" + isSuccess + "; errorMessage:" + errorMessage + "; payload:" + payload + ")"; - } -} -} \ No newline at end of file diff --git a/src/main/resources/flash/SwaggerApi.as b/src/main/resources/flash/SwaggerApi.as deleted file mode 100644 index a78f3105cb1..00000000000 --- a/src/main/resources/flash/SwaggerApi.as +++ /dev/null @@ -1,75 +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 - { - - 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/src/main/resources/flash/XMLWriter.as b/src/main/resources/flash/XMLWriter.as deleted file mode 100644 index 067f49e6301..00000000000 --- a/src/main/resources/flash/XMLWriter.as +++ /dev/null @@ -1,28 +0,0 @@ -package com.wordnik.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/src/main/resources/flash/api.mustache b/src/main/resources/flash/api.mustache deleted file mode 100644 index 647ec763a24..00000000000 --- a/src/main/resources/flash/api.mustache +++ /dev/null @@ -1,73 +0,0 @@ -package {{package}} { - -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; -{{#imports}}import {{import}}; -{{/imports}} - -import mx.rpc.AsyncToken; -import mx.utils.UIDUtil; -import flash.utils.Dictionary; -import flash.events.EventDispatcher; - -{{#operations}} -public class {{classname}} extends SwaggerApi { - /** - * Constructor for the {{classname}} 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 {{classname}}(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { - super(apiCredentials, eventDispatcher); - } - -{{#operation}} - public static const event_{{nickname}}: String = "{{nickname}}"; -{{/operation}} - -{{#operation}} - - /* - * Returns {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} - */ - public function {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): String { - // create path and map variables - var path: String = "{{path}}".replace(/{format}/g,"xml"){{#pathParams}}.replace("{" + "{{paramName}}" + "}", getApiInvoker().escapeString({{{paramName}}})){{/pathParams}}; - - // query params - var queryParams: Dictionary = new Dictionary(); - var headerParams: Dictionary = new Dictionary(); - - {{#requiredParamCount}} - // verify required params are set - if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { - throw new ApiError(400, "missing required params"); - } - {{/requiredParamCount}} - - {{#queryParams}}if("null" != String({{paramName}})) - queryParams["{{paramName}}"] = toPathValue({{paramName}}); - {{/queryParams}} - - {{#headerParams}}headerParams["{{paramName}}"] = toPathValue({{paramName}}); - {{/headerParams}} - - var token:AsyncToken = getApiInvoker().invokeAPI(path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams); - - var requestId: String = getUniqueId(); - - token.requestId = requestId; - token.completionEventType = "{{nickname}}"; - - token.returnType = {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null {{/returnType}}; - return requestId; - - } - {{/operation}} -} - {{/operations}} -} \ No newline at end of file diff --git a/src/main/resources/flash/as3corelib.swc b/src/main/resources/flash/as3corelib.swc deleted file mode 100644 index 12dd6b3b0a6c661e6b4a3954856fada65493c2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255357 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 B 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®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 z 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

~0h}jbwSe;hs;-5@3l#Tag}8J4!)GZ< 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

hJ&y@SE++|eXywknW1YNUHNmX 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 diff --git a/src/main/resources/flash/build.properties b/src/main/resources/flash/build.properties deleted file mode 100644 index 8e77d88c961..00000000000 --- a/src/main/resources/flash/build.properties +++ /dev/null @@ -1,29 +0,0 @@ -# Window and document title for the documentation -title=Sample app AS3 SDK API Documentation - -#Path to the source folder where the .as files are located -sourcepath = ./src/main/flex - -# Class-folders you want to search for classes to be included in the docs, seperated by spaces (for example ../com/ ../net/ ) -# to include every .as and .mxml file within your project, just state ../ -domainextensions = ./src/main/flex - -# The Location of deployment library on your Computer (PC/Mac) for compiled SWC file -liboutputfolder = bin -liboutputfile = as3-sample-sdk.swc -libpath = lib - -# The Location of the output folder for your generated documents -docsoutputfolder = asdoc - -# The location of the test sources -testsourcepath = ./src/test/flex - -# Home directory for flex sdk, change this to build for Mac or PC using # as comment -FLEX4_SDK_HOME = /usr/local/flex_sdk_4.1.0/ -#FLEX4_SDK_HOME = /Applications/Adobe Flash Builder 4/sdks/4.1.0/ - -# The location of your asdoc.exe, change this to build for Mac or PC using # as comment -#asdoc.exe = C:/Program Files/Adobe/Flash Builder 4/sdks/3.5.0/bin/asdoc.exe -#asdoc.exe = /Applications/Adobe Flash Builder 4/sdks/3.5.0/bin/asdoc - diff --git a/src/main/resources/flash/build.xml b/src/main/resources/flash/build.xml deleted file mode 100644 index 6861dd464ec..00000000000 --- a/src/main/resources/flash/build.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - docs created - - - - - - - - - - - - - - - - - - - - - - - - SWC created - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/flash/facetValue.as b/src/main/resources/flash/facetValue.as deleted file mode 100644 index c6bfa1f27d1..00000000000 --- a/src/main/resources/flash/facetValue.as +++ /dev/null @@ -1,8 +0,0 @@ -package com.wordnik.client.model { - - public class FacetValue { - public var value: String = null; - public var count: Number = 0; - } - -} \ No newline at end of file diff --git a/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc b/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc deleted file mode 100644 index e41bc68abd969ffbbcc736ff8543b6740cb94ee1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194680 zcmV)MK)An9O9KQH00;mG0L!44Jpcdz000000000001E&B0BmVua$$0LE^~Kg04YG$ zze8732|SDk0C?KOeFuCS$C>ZU>@Ef!AV`8ulpu*JlqeE~V3Q@2k_d^kn$_I6lmQYD zX^{jCkd&2jL6q2X;^dMziE_C#r}yG0yQsV?t<=lC%jI6~y}PINwOlT__31&RHi3Jr&z zY}!|y$_=trr%#_ro}Nmc9*!qQ!8g?8>5=%@q?{NXi$C9GH*kH~4V0FhG?`4x zf%cA0&-K}{6?p|e;jrwbW|P;!sHAWzbH=&kv^c3O8Vtoor4Y0;Gqc#Nc44~UyFwUc zJ%nPjq7s$%!GmHmlO(zyS|Nis_pJX}rfpPZ-`!+H($?1hIud&T{RGr3UBJvG ztHnmSRK{63mntmf*drMB10^F9*+TG5vNMOv=@zC(n3a^9EizSrShw(Q>VbYDdJ^T> zMVJiTM3SXh|9*U9vQqP`q-~z{UxNrXYg=afh_-b$J3_Ta@Bl$&r5rr$nDuKdDoxOc zL>e`}(ZQrT=wOo8pjuRO!t6)mZc;zOpUw5PF{7{Hh@J0m&_pKUsg}ND;+gAQ_2jPJ zu7Q#1;dF9h;DKZ;ov)DA9cT+RhYNLDa1&ht$QNo$C%@Amk8OVGX7?tR0p zVPJvQFi>a>dPi*yhiyfrCI`czc55MbaFMN=Aa7YJ*oNv~QOf#bggFudMJ2vs#$7!dyemFrvwl zB1SaR9_)F%he%>XQ>Yocu2dM^l)~s1P%SvRnYA^d$GwLw-s8rj6Qh&UWBSCn?|3p* zGVAh?#I5Xr1I4lJ%*O^bU`m5Mp1OCT?o%A7D<7z3wSCTYpGp17rLy*L#E#Rad=%R1UyErqlN+WoCC1@oHB7HG33P8Bi!SUGcB-1;mG znwp#eMsC*UVK!!WI$Xjm0}nV4lM3@NdGUEzgQ{Rlm5r8K<6E?)rdy6iQ!t8`ju2Pr z`UMI--Bs+@(c824!0E$BPV`0kdXL%T(V>wX119RNY~Jae#nD3HDraGJnQPk{j--a; zsh-psF&Q~JHl6O9fW;lmKqiLbdaGNuc{=y?MtV*jJaPK?kz*%%k6Far0pqA$s1%yV zlf&^b>*=YSFY`=vY!p|0&C3>ANogx0v?WhRo`A_u>+&=vb2FVT41mLs>G)J?bmC0s zYQpBDMFPbf+6?^!N-aLD42_JA4bxFu(RjAdfM*_$PemdBQLk7z$B$2sPQ{DDlnjXF z5L?8EU@y{##3?%F%jbKcKJ|&~rT067>7qT4K{cdUV3S;Eno9FI1N=EA8uMfDhtCi^7oF_DV|CtQ|Y>)$`|;!cIk!{TuG8f zXP`p5a)Z*^oaHEPd=8z0{(LwIru*s9t=@CT~t|Ho!J28)_ZE7T*v&*=#vTNn7W1&$P zH}lVLUD<3qo(iozvV5LcGQg6-(CV6;U;q+i&!QK=v3OzyiPUo!UU?#mDnS8{4S|Mb zc)XYfx_gb5e0af~4=;|Plkwp_=W+Y2_o1P<7?iE)_{8wBczSwlYQyzoP1n553Ws1R zhoO6&oEjY~9h|1&OS%?n^I-DKnRqIa8U@N@=kp;dMxyW@*Ymm;%5p3|6|V%2f4FGy z)BA|Ez|+lf=uOj5DxE7H=ep(%JKlvu*7c;*)8nELPT@8pRB^skT#3h z*b2#vL`TP_Q}OxxH}DqM8B52Dn6CPhpPs#BFV-nur&uxv^i~XB)SMT8@raOHsJ{}#N$d@CJ>f=|1D2rq9 zN$7sCI?#hwA5QwP@Y23Sa(ZIeHy)h=&NOkxx6~GrZFn?2ITk&SEs7gm%RX6@psmYi zQBU&ba+95-#A)1a*N2}b{)(%eow)Qm& zt)>M!m11 z=66%YiaU2^i`8a#P)=oPIma2}66dm+D^_l@aq8gI$rU$l&MO|SRB&F)C9tgFNgHuVT-w8>yMap+*-}8jl3ewD-LqyJXbbx`T|~==H8cZ*Gnm{xIl=HVzZh0H!@;kuk3ChdgNqL=@JKqBVOx*f*aCt9S-v`eRQp;N@vwVU|T=`4z z{WVC&x8Zq+D?fn8+bPhI*AOBTO3bc|iP*{sQ7Q>>Z-f61LTXzG@dOBUlVGM=swH)6 z!kOw&D_vLDn+cJ1M+jMW9DLnPXszeo%n7O1=J!N11L_IzkpLf_6r;6dI#bQ|_4YoL znK=hpDI{CU9f(pVEt^t`niJj^9Ab{3f3t7YDUoTj{QLuiqVEtCX`c%RCor3kd1?%?;*6$arKP*^h3)XDGI#;k> zDOi70us&U|K11nHuSH@LNxFV*53x}i=_Y6GcFOM9Lli1)?;%bq@9ZWXLKVv%B2km6 zn<#|x^*zK*&8(Y@6Ke7G5IeO7dx(YF9Jm{AujwX!tCc!-^bi+yR`d`vb(QsyGU}e} zA(gc3!5(6wp0*xRLCbj$anOqP9^#>uscv$BQ19j*QckPFJ*0|OSN9N^)}(t#4XvH( zA+@yb&K_c=YeISy_0v71ny#(tCT>F49qA!n>TBIYI9*R5H`FFkN@yJ&!kyL)YjFEj zcB1@_k-GO(($aKy^NxhiM)(z@j<3a2`M3uF#Oy{w3pLaRmt`%bi|}R zOjRD?q)~f><^+Fb5dJX;uf2+@mV_l?JwTwmz`+F$kE6ruscK4?;Ik|#vXY_j{mt-w z{e`R7s24iQHCjdA0%kRPE0{IX+o|^FRJAAUsw3eLG@TI_%ebG`-a^%~NEyj^p3&Y; z8%TOcc5fiWqP>I8#pFc!g{#^VG^Ns_nh`_nmr&S zBeJpu((yq|--oGMm8iPpu@jkbj;caYA z-JIAQ*#eZGVCvR64A{Sw0Y&ZI46D$di|OMh^48I|Tn0%K};Q z;Y*@uzRlF8Y=0A#w5J%9F+ban5Sh8%o^ocru{!r2w9PTXamnO>@gHc19NIH5zO`nBq+WzNm8tDV-V^!5bCaNPeaHvln7n&JOjn~I&d_~e4J{p$G6r*D+bcu055SmCMCQO zR=Z?SQQQw=M&D#O!e0RnG0wC%OKKS2SR_n6-PrCVwN1RYK^?wTQrpE#JG{INLs9YC zf!suLy9t@~XZ`n*ZO?4;Zy%@iW+oyWQ(iX}r`yLBw8CGmd>Itldqwzs^Ln2&xD!8& z?9|>b4Td(4gtQMy>dwT@1N6->nm$E4yOi6A&CTU-n)JP)YE648f4Pnnl_Cplk#3(9dMR7hNL5QrV&Z`jW#VjkT z^T4=xbYcxcmmD|6X%=gEZk%Cj$wFdaj+B+OD-!ZKPX$EqBP=7P_VxFXNIyjKw6tIQ zG1l$@QFeDE?&v?jkh1nO{JKUxm^e5aIYj%{(99ZWBfpT0B4^RV+Fy$o^+@7KSqNwm)l+-^<`=w9AROT1-co#lj&HBXi3#_xtbc(RM2ux(_$UOvl;k`sz zL+>CmA57b;QeHApSGtD8Ccc{zgiE2bD8H{}ar|Df>M#R)ot;Q0uiQG|nA|_b- zB>IFmOtyAe)*D6{kp7hJRfd^TTsVGS&QVko@Pf@-`+}@?HoZ${lxGqnPxN=v{sfDb z*PA7gr!n@`G_o)zf@5{5faUBV>ev$ps zLI_`;tWIp-d|I#gZ_Z5oItQ_Bh*>gV1xIf%L5sTN_B0m)6SUn}WM$XY$&&klsapyI z$|Y}Lsivx<;ryN9szpj%4z_l5tXV4iHH*@h18p6h2%Ix{?PiD9D^Us7+y=ymS`gnV zJGorJl`2aWQwmrkU=LtC5h_=R55aQ!4)y&jl`X9hE?4kuh?rIi znbQMytSUK0_NLVYT(Yx_Jdc>Uk{U2hGx*zVMc?H>YkOb;+?>Rj%i>xPH)mxwhutYm z_o{Gn8%uF>-`TJPZcYfw^4S#vm(l_8mvmt~*x~^nxV5mkMI*{%=nkwdfs5x^hq767 z;`4^kjR{Y6arer>HS@79I$~{c>`*BXYI%&~BI4U+(L_b^-TAnPB_M_N@#xujt|;aK zjuwC<-Hce+rVH-`>2h6&De87<32})GazSWbDJaypR10hfgxi)!@)^LqRX~bNeftj| zIo4|%iKcU4qWOa5{5v$96f^{z4omqT6n)cpxgqS14;Q=@3Ba!tQk(QNm*Cb)K)5<+ zM2TUhbP0LSDtr6&Fgh`G8DjGl02lgK9bvIly`(`F3)PpyqZSagIZ3!c*5+ZVl{!on zlUYP5a>J!l0$eNsyLu44GOb5t0FiocIGSQ$rH+`DPxKx?u>flBjvJ5Ty7aC9$Cih0 z^@%Px6gPsNxQS#e8rd>%HbubsOggNvJmk6Vr+UfK{`0R3t$q(qrY!BoZp4H&!)ojrkX zGBP|TqAB;qhmt8#^98^x9g?wg@4Mk*C`z4O$Lr}O8@Wk}2KKK2hBe0@niL*fy~2`b z^*Au~8g4h}KvmgJF%6Z)GKqBX3h!_(ujcMD6)S0L_9v6K9q#8$&^h`oEQ_#5WTS2g?TVJgh%X4CoO`42R!bL zj*Vf*gi66?a>uPns1fna&=LUOe3MQ)O6uNoeQXsAl~mmlb!RKUl+)IHjOkL+$EL^P z>2mxey3L{JMD&bE(EgjsT%o^t=Fx%ZY<+q^!MMxNsTnmPG^gSTWYkJzG(I+LMW4c! zmeFd-zuOXM>X0rvDjz#}u(zye*wVw4i%0I8?s>~{i`ZsCIc@KY6k^DM##>hyxT`p@ zK$`1N*tOReLswBTaQt#AI%b_ZKN&xgz)uMMy>lAaHV_^zOtytK41G>6PfU-E-2m{r z-#41}jYm^wQ15+R*4qaGchbyIfa&ZbKPuSv({0=#(6I%RMtaNFe6^!*)Bz#sqq?3!U)@& z(`T}hJ(8l>5QV&AfV88iFE{wjk?DycbPg@sD$_b%v*;XKwIEsgZ7=4_1Pd5wbG3W* z!%TTcaVSpsa2F0u^i7P7PQ-JkG^`kn-ca`4RBaj5?FDw#;CJOuQs|Kyhb{KrJoio8 zR=REVz^%o6F141$jVmSS4}?3FKsbol%8pilIDggvp_D--0PYC+40HzM&Q^a1d}!-{ z43%aizZ(VceZwHRH&DE&0bq|nYY~Q_11Xnyz6Vrl#NyE%?;JGmey|a zZZS7|TgW{W@>&b^*%wp@21|5Q1i#B`AO>i6qT)%A+FQua+lF{ z)cR7&nTbml&a7OvBcjvf;jDu5N=~b|xtd#QIa|Y7J*R6qTgR!L&Zaq=;qnVOdm*oS5odoQ;GeDw z@P8TnUk?9=;r|HyFT(#(%Bvrvyyn$VM6ZYc8z`@RBmCb)dEK8;?)-Dg*Sv-D`gc&i z_Fa_A@1tD#5asJWOu6Hul>0sgVLn0mdhp9GQ@-KT@c%5>;a&b5`1uU{KM(&ez<+|v zUxvqDP|H^-38Clv&)?0U8fLf$mn{LnSq9Jl1 z;~?QX2nin{bZhu{<|vr=33DKGlys|vG4uNSGhru{&1Wx!nQZPJ&x9Y4;3=oTG9hf| z^0t@cZ5fJI4Dbq?3-Ml>cYeR_Jl@^SG9REHqy?LB{vy2){tR8*{VTdV=FR(;l>HU` zI{g~`2F+W)S+IVqV124!{Z7I9-GcRd1?%?<)*lqCKP*^h3)XDGI#;k>DOi70us&U| zUM*OET(JJMVEtLa`tySIuPJ?r+v1`xpq2L`29lgY{3RVg03~~246&M>2(py#M#QGl zittL)E(B!qY6NGR_abJ}au>oetvyj9Q=0|xp7s|-38#+z2)=aQhp0=}i=%{5_elh0 zmi-ArHa+(s4zt{e3Kl8|f+=5u+wYZY2+FJTx=|EU#j}z&rRzqS(xzv#eN>x4bfj!D zIX*9e<4X{XFeIZ)TzU!O4jAGNd>IK5GQNyFZY}_2;`GY6bd5U5ORiBT1;fQ&qGhP6 zBou*{d8rNxF!h^Agwsat0^P4Y4Bu3Zz8q8{xv0&1X^C(08QkxJ^R zg+#rU3IvUpG-|IC=@S^y$02E#beAf4{WFZcTEJJTDP~%GGdg0rd87s+`*Z3ZLUcq- z7U&yA$49({8UPt6E$yv>oB+tIL4b^+y^Xq?bAf0+(A$dxy`vDQUJoQ-5T+TA7t;Q2 zJ%wu_h3_e({R4DAdz5{UeS+22;q%u_sxz-6vYGe@TTeC+g^`WKB#{OpS;;11mdR$q ztz-*IT_mO`riUri{3is?a~Jspy+%9elVEnSPlDMlU8dTTG@EG5NY7}W1k1LJ^{RFm zEoxb!EaAzpAzAwjol|QQwK|06vot1S5eo>-=coap`8-7k4dhGv61rnH{(@dfI3nA@ z_7x%BlqJQ~28sE)NQ{Gg9TE@*wxN9!T1{3onP;?bQFTXR2f_gpEprL~Tp|z&B79Gw zR57_B^!E|q`U9%AMp}uEiB(M1@cpOw{pS=zibl~EX{X@Mv1c@Z``?LJkCMNm+OO$s zwil6fzoBYpHqr^Uf4~%)W$-%yel^3dMzv?D+9l}i+>(uSNsZb+=RVwKeE1it?#f1X z0g->xQB~!8kTR9RFp+@n00-t~$v!gXD7pbBj6l zfX_!5^=B(e|k`emj@@V!4m4LAEj6N50_ANOD4s14ygXhp!zF8^;d!_nh#08 z2J^i9_e}dWQ}0aNnT;HyGeG3N%UnfLWr`wW<-BYM1M_0e~oDxy8^yEGWdEmwu^r^y#2fI_V2>mZ<+R6 zrk>2sMNR_ktJ;4s^;CB5O5~J;Z@**eUHEpFc>7PL-i>c}i?`o1^&Wh?N4))ksrTaB zz2fb^n0g<+-6!7u$kYLR8xU_92~$-r+Z5Ah8Kml>gm7bZNbzL`hfM1)3|V{+4_Pst z7bQ$5niCAoKc&*6@OTZCUjdKTQstHKcpWvpTHp!!W!-Gk#n`tg_kt1VZdyk1pnfM;%NIUc{7WZOBiZ70ta~~w+8hslzKOrI7&+<-5dm7Ddp$g%b=Nj-yJo8Cj8h*_WLKSO~BNHOzQA&oI}Oit{sJoVgj+WSQL zRWPX4jZl0ak@QOah$yU&h{F1aqf2UGKP)JD?{ie2>rEO=&$Labqp_tE(#c#!0uZGX|wzz zHn~qr`B}*)sq|^Vev=CM5u? zz>2B!6jaNX^0~O|K~U(IG0=m8r9Mb8BFH)hI7!xYS8j{5?a@>{wg7hxAtGlvM{kiM zI6P%UGvld(Dof{PIyip!r=h;xCPMH9d!uQJux>I<~bN>XQeXNhT&oFkG0gnwr;AH}XRh?GmX`jH=av3X=9Ru8K-GEyS6^THzsx(#18$El_;?k4s1BQF7`mFao6s zsnHk2hXsa(2@p%5#6bw|+rnLW6-oLgLL`~WdrOnSTdw}8Bmql6D6T_WT(?!-oRb2( zb34sB-BH(XYnyZ;`tEi?Nl_s&hN_FHf`HDN7@dfY39odtAc$TbYO)H1!(w7zbK;zC zGe?aq*~F24BNt+`o9n{+Gy*`PiKLDSw&;{04%4WR(3pkN3n+xV zJ`x>o>5?q`s-HQ-%A6a#u&dYkS&WC#+ znv6o?hB3s!(e#u%KJP>2g5D0_NVJPX6Fm7IoNqS8T4xO8LQdz5HJbOeLiIEE-b`|r zhAHSk8XaDpQ%$3T*G!_u(iZVR=~1=l_o?ZjsiK%LL8Y>LhfzMlOPV&x4 zW$T`ZpUXivP%Zs=ThWKeO|{&7`Q?#`^L23D9R0lBmK#S-u1-OkjviI+5E9PSCw(bL z9Z8CUwk3r-gST9vM@b$861g)JYAr^q1VZ6p2Yl`9SPp~~2(*RT7XW{uRLAcxQnUj! zJ6k*D&S1M=2?X210kER#jc{ux3Wm_BHQc#osRCONhq<`8XTxGMkwX4Gr>{Fq!G=>+ z=g?Yo@F1Q}j?KhVdzL-&(zV=?myYGr)Ux22n_F<)#*rI(#Z;jB^dg5dcCR3bOPr*s zUEtt`QGVqq-I8}1jnC6;w{)3aPtm`Ew3fWV5SdO#&%_s07_9}v_3X)tp0}&||{+!~2ZcjJ( z5m-{_9XN^@>eH?ZH(BC~8?m;pHYrBTmgv}+KD4+JrHc@g4l}7JNtnSA%1b`#K$tRp zx(c(Wv1EF5CO&rlwpFC*y6jtz_8jXu)O(`$*zwzMl#Y?w>p?raZ#`^Hh%zYokgII z_F!w9qok-x&PT|d0YBuiH5BqG)GK>UUbB}Wyh5oruN9Drb+u)+K5y9EUcJtH(mUdP z!21YQ9;N12QSYBp^Bbx6&9v$fTKy=kg^!=6-mg%Tg&GR8oK~`=aua0n6W{?oev)#}rzl?wpOw$T6aJfZ-f0^=i zU!|76q!O?G7UgS>@HO8Br|-l6hY&mqpMCw^z7I}o5_8dJBV_cknk{}?Hy+_afx&(J0~7xb~}~ERF{BWY>d2`W*X_nhR5+i zx-QYo7*!hHLNjloM0powRO$Ml_}2Ad{qa$Fkme^TM0lAJi03mDBHH*l3bB)pk-vbq z_~$7SU;iLWO{J%Wc}|!Q3G)TQe33B!M3^rTW`>H#OZCSE{qZvW@pAp~SNh{?`s3^R z;~Vw$I zS=$bK1iaknxKr;fKVt76aS8koBcw&4IPqw8HO?^X~^Wu z$V1$hQHIREjA_WS{=$&8flLkA(69?xwvfPngCS1hTTJ^pQ+a~p6*CD-#7Z;D)2OOP z=~qZbc}DvdYQVYb{vjonYt$=!8$wmdPk~vjdvb>{DbxyJGXrhS`b zuOw`kF6}86lM{A>yn`Z4BH`K`aWhP?Hp@^Tct0iA=w|CbLhvoNe_~pep+G;TBs`IF zih0tmu$XDaQ-jJ+z=jD%r7TK9xriBc{}3FWDFmvdSO(gUS&Ywk-i@31U`u!}q4*QU zqE$^T@Lv5yQ{ah66_vD~gR?JEL!qd&zh*Hj629#5f#+YcQv_qs{)WZOy2HgtEftYQ z!2N%r@47_YWzPn9``euFU+KQV;bLM<&Oah2evOfL=#h7#Tnyt!6*<~((4`BLuczrB zfkdJn>P`D6CaMlG8x~Yhgc^qIK;NFQ#q2R#ze&b=)~>O+m?g57HbQ`y{dEumT`Rxy z+;eUOJ^Zs!JGEBmT)Ohr^wlfbM15uBAD`3yU1*_VjGFisXi9VdJAi{2J{cDB9dX(cHt(+$%i>=05pV zU{)z8w_lqT0@cL|J-)P22An$7lZp$D`NO6u0gR?%-hF3rtglygmY zMjGkEDCTZD{_w+BwNFSY%|<8{o#RPK-ImyfnNMtoWK=iZ^~9AYn(lrA>`jp!lCE}5 zub0n3YP8QwYD=PJ#sduoEvi4^hi;}Ib?ET|V!}-Pa9+N7Kl!?lYwD?bTKlGyMM1oo zkVdHf2J&%1O8b^5|3n}W%tk_xkEinQI&g&})heKx6;$ISD`|6*+Ln#9p-9#&$tFJd zEQjxAk;ZT>G?UQJtPu+ zel|POr@e4+pW2_D?eAwJ`?MDc;&+fn?Zpt#p+G>atqTG%10(nas=bV=2T`jJ^zT2X z*(ds|X#YWW3JcDuNG99gU|V|y&FT4iDRNat_jc@9j~98%OCozD!6I}-ny%bN zGE{*<1eM={Uh*dDZkVUiOUJ1lK@d&iXygc{N~rmIi-_U?-GPcYs}4(d5~h%2MA}J? z!x%2PdX2uD(s#k*J(Rs$C_8))n0w{-g85#m zybm60Oz#J?jeh`4m-$0rZm~Q`wRh3{F!o-mp2$W{Ab(M`_fhp^HgXbQOxlNpQbdb8 zgk|z!8dGAH#3@LM_ECBz8@a16$Y>vP%A**{F z34M~rOff4Eg8XQoqA^(?Ubyxd8sqx#;?ePGyfBKb6(BYEA_f$f;DE1nIH+TfFyi{A}e<@Nil7QQvC+io9{QUybSPKZm7RoFk8g1%^3>kOgjw3 z8V32kC|vpjitx33n9Y%U7zX;G2;`BVu^)gyPm9`Xe)<~y7$rZYh-`ySk+@et@P0vO z<@>F(4RBQ$%Ipr2VbXFj+3a1ZO|c`whb5{(&NP<&vifg8d(=?oaH$ zB#Pw!(!oLXbmTM{85HB@KjHfk^+4hPG`x{P1i?W#T}_)}!aMkWOLac}TZ;M}@6Sf= zr->*cNzlVR;Ng$pp@BTDJx6DIW6+ad%8is7jPEzw7U+g_GQ8~n>eN3 zpSb^GWC#LWVA-#xpU&cUsEMCKO+13S|GbEOL)_P6Oi#gMFu{paG(S(-V@!J$Q->47 zLLb$u*%dY3A19FnbiY4k`?c3GJ*hBUoq^%%aU@v9U=FxfNdMc^v>Hx?{c0+a62{%M zzJBCEaQP5Zr;42RB=!gc!2$InJ>cO3Ouz%SIG2D2hz*&XYKw^lMetp^pHsJ1`Y(t! zN5$Tgup1X_H28H-);qVP!EwsEO-;i(Th0HRZ4=cLO zfyNDywJrw`2{a4qv3Q~&#HOPt1PLx)(8c>|#RXHeqhvm9gjh=B(o!2+o0f{c^pc;71ww{}u2R~zME2(GCI*(Qhy~B+ zi>v#HYP+ORP z$$Ec&1Wj#A#JRi~0L)YcI!MT5v;e|x(eYHtn8p^i4c+}ha|Rzx~W_ozeRaA%Ev_D`{S?NxTO zLu^euYhB)TW}msS+UX5>JG{Hi-QGRki211Zn0Ej#ZooA$?nKjS>Y+-fvG>gIfL|T8 zxT&R#;?^@O$5Vc+lAFBTWa1_(H&t;{H8<68CQkg(dTw9K9cwt-!0j73-Ne~uPPcI9 zR_@xy9h?Fp1bcA=AbZ73-f+q#)LU6%(yVm2y;Z3qr!YZnBz3u zW-+to7K_y{HYfvo38$rkjMUR;pBV6Nyk$Ym_LI*L9Pvgqq872h*}C zMr3Lwbo-q`OTCqbac|IOD?V5S(@pD-sBvmVKQbZHuT%ZVgk&6&Fp;lQSQ)^24Oe`$ zpV171HRQMOi_|ZXj5IE5Ptmx(rj+4T(Y|Y}98K;)oB@B28v27x2_<2=Pw6@PrxtolpRG>l6BWW_!zFdVZf;k*JvQgm5}vLk6?~ zF`2Kytf=UeO(<$*qVl3Rj5VN7<>50V;pdQq`-RdtAbc7KKY%NpYFOzskh9vj(8!E? zWD~P;Eqr#jfqfDeY`NVGv?tc+J5woL2Y%Y{i<@%i)cQz0fj8}ixB`-Ki`NCwycAbJ z7bvDe>;V}onMcJ+W(RqcYOkPbWj0bt6KiqT2NxQ+5_^r|;WbdvEfh^ZdkxiIOL5yy ztTSFmuc*F$ABn7|`f0N_8ib5(u}eZjKX&++VoQ35SlU%S(?G6Xqg~`3KyfG31T3uw z>#`$t+Iy(FDY0qBb3~LadoP8Rw%9Nh%jx$C*DFTx0vYWCRH%->EK2Qz`pd;^bPEI% zo08}s%KfjP+&?OgIZ?=Z8E$`xoOO}UQSFQR*(9@K`XcTfToXy$cGcJhmyB)jYxDpl z=^E{$X!bJ=%sZrK!Su@i4CX=QU%)(M`d6y`E8Q{!OLIH|1*_A``JE_K!+UwgQx8e~ zt?qUa;(3IJRipx;d(sZKV0@hbEv5f}IW4%~T_N(n`N20^8wk6txA+Y4(JeGXCM5!m< zKG%}d($mtHQ}%<`N)|ME-t4Ww7|B2`lAR@y!03BeA8652bIwy&iKmujeRS#S6a;!e zSK1Mu!AXd_uNR;DMj>(foN)QbO5WBl>)+7i@Vwq)RZ@Th^9xYdz8P-qC|@A4juPK; zAk-F;y|S5mos3F~(8+1$QeGh^3_VcgCS4t;g<0)3hcMmn9o2ENJ$ZGU(&Fkk*Q+wB zcx{QJ1_q zR?%D0zq7O;{wI2^(FP5jxviZ!wO?|eE!^RpS8U=c`g}`+ULNo}N+>~(?hsmb9p*CV zo(@iBPEDMeIkj`xH?F+F(*^Qe=*ILlHCH{X{KzVH2|=djPuBL~Y0()VYFieEiW7bzsd)_hva02P>O9qQD+kP1>45p` zA~nYCLg(`6+Di|^@;#Twp4F<7y)Kqq=bp!R?1h4er`*xuVbKtB-M+rKk#x;(B!Lyw z%8fDKl~68yE#*beEAYRRn_kx)buInj_As!_Ku`{bT0_8HgYEFz8I(hQFam9%upIQa zwa;g=pMwwyp`T6^BVJdZv!mjYhh_6woc3l+haB^JAmJE z*^RJ0*^8Scat)VjIj`e#J(t&VzK)xHT;9knn=D%>ms`1|jmzzpHfk2YGi1gx%=%$z zOw2CA%1OnBOqoYUT`K0yk5aq6rnY`9dbMt4joY_133G=qn}yjTOusM#!VC&CB+Rfd zJ7`t4h0#ir#UmLW; zql#ihTrqQ5R#22Ugsa9fGIWi4C>Z5zSR2-F__ETB?Wz{f-I;ggO2VnS60SKsNE<1W zw=|H=5s%WSCB!JC$jUAtmqcg`tJzTS>Cn*@{lyIGh za%y9hNSzkv(yK&QZk5=xl2xKLw@Rdpgtp^r_xs$NP>Pwi(aUq0@dFlG#6&jKK^CPq*yLx70o7=W9c)Fz9uO(#!># zN=_bxNy`|X!Zbvd^^0b{A?R;k@ihXD^m!Pp$92`BDQk3c(ulJzpOB(R4L4h~@X28m zj6qJ%ig7u*8RlO?_+r_coS2G^;-&40sqoy+b#c zhJ`nknG)uCW0+#uJ1$s7S#Dq}Z!nST}+%C)}VeSxS z3$658B$xq76@t&o;-+TGx=9()IW4W+Cxl4Fb2Gdg^LHo+Xb=Fsr{VvMwi)lmyyW=_ zA=(za`nX>rBX|vzoRBYh?uM`1aBh|`36ncFp=`iGwrkr}s+ybJ5i=F|*Qd3nK{<=p zACJiH_2|hh% zGeFG0eY+TO&_^)HS*6R-O1E;-m@JB~KlExjp|yb?2@9ZW?uI`|wTRqM5AV z{Oll3{mkSb&h-w>W+63)je*IS)K#cesyE^Fqk)sU%4c(9)X!IXBi7+0_J;Ja_&9W+ zJi;TdoyF6>tTN(7D5RgiTeTLB5w|*wW2OvGOW#i%0i(ER6zfI_*Nqk{1$KdZak$K4rbihzL|G9MZwGU_ zU1jiUkwv@1(EG%NZza-VNio$z8{ML-;oNc!7HwO!#@Xy#AJew&7e@ke;-L+yg7=a8 zv5yHuh=-)Sc!(|3!V$@lno1kb-Uor%r}N?=_13gVBaWTLaX$$7*~3nI6+6&#@0MbwK8lUjFf2}afL1OWg`-6)XMdxJ7pYN2sJp} zK53PhZHaM z+RRRG6{E7aL=z<;R-BDVE-qDaxf&R7(IuKNjgu`I4zn$XevPJ^m6dxcgy|J#4PK*( zDs6jEU8o7?Tk~(x)Yr8|w`guCy+yNwudpWx-Tyi5SVzaE(>-I8Bhk|C72dUMy)H@S z{PWj2mx>n`y8_499M&DvD9y`5Q-!`OvcLz#>{b%0moBXigjN;u@4~E9?B|fA7s@ zqQEV6Hd&TL-{`n6J~WD352j>5#$&3476UH^Mh3(RI!E2K>B2he-w);vBXLcna3rrXuv%38XzR`Ckl!u?u z_Ub2kVLgC4T7$TBH$MZ*YZBB#Sv<;h*;9?Qt7xm%Dn499edgi0*@y+!&F#3bl}xgd z(q%2z=o)hP8m*^btYt^8(RI?vYt$#7(vIL_J3AL~u=G{!&MOV1T!yq9yK+D~sXDW; zm`2Uhr&Q;huqxU;h+4Bl2DN(|o;#r3hp$e29cZ8jw7~{EYzkwdzT%G0`f;(H7__VI zem5DhYiIV01F^Xk_vSc3#r%FWaw~3q^t@xCd1zh|n?L1Lki@pkQ;?P$Im^lPtr`3B zk>_#bg~)f#iyZn>@r|u7y5XxyTW&aHSMFX^!KIf!_|bRcX`J_d;}@~!?{Zy|M^4`w z9=TL~4qRWK27e5--nh;_IndVGuIM*o!!#54O73oKSjm-H$`-sE+s5ophfA2ARo#uf zsq}8_pP5(Np%%F+EZ4DmR)LaOgp^$<-ZIYHkQe_q^wUKW0`*(C36hVWKe0duxy3g+ z*A!qUy${8Qrl;b|+~pi8Dyz-Q6#Y5f+dVg3LyI+n8}9^;$y9u1G&!9Xg<8xd9f+0D zx6)uPtl(Qp!8;gJ#Ud!H_#&_|C7>$jiM~U<$4>7(a_H#6-V?pXCE3Dru3)bN+$d?h zPud03n^f|l(Q!!Oq2zGfo*o^?NfQLVCD%*$-+V2U@Nz|DxI7gfPtL?k@^kv;V=5dV zT%Z7ro22!_Xho+I@4NYU7wrwj7fDx&(7r-2-=1hXehbQXDyc8PjCI(O!_SNV8-}07 z*_1vEb@~HxsIwz1hdYCQIoRIjM>TD2=3GAHHh)JaeCmYn9f3|c+}a*q?CQrHI!FO-;VHZ+(?O=0&`Fn0>`Hev1(W;gY%w=kFo zo7dt@pPB@E)zM9yFo4>`(Jgr$LY)+*pW~w4#7ZbH!$pFbP;)o6;1F%1K7oSbVqsv` z_gC)_;x<^}9DP>Sj^Q_j9Mg{D4EW?MB8%=uQ5){P&qfs5FVPXE-6I5Cri4jcYjqz^ z6Vi-+Q^_SJ7Uwugb6C^IKNmX&Eu0klm@t5RB$8V(s!pM&S zQV+Gux+274u>(w2X-@0_T|%Fq>S6~^UhGi+EY)`C-C_p{g!R^-%N_isatC9#v`GGx zE2Ng=@v(%y`xOJGma9PzxpQ8Ya{+cl)1ji==04{uFZW?*DPdf#741*%DXyrlQm-vb zxaE}soJi^l7K;7a=4&xnEP~S4x+T0?3-K-4KyIM428v5-;JVThVyRYthqKg03Sxs1 z%Nu9{MT;Bewz!vD+?1_qabwLbZgi>DYZhufhm3WF(QIl+|IIcVgCchLQ5dQNC6#li z=%m^Fk6q*9na&*pH^$uZ@zM0SuBAKQIJ#C&G*|zJ3@S^vx-|?)mX8 z+3Nalw$&91TQs-!K$sh)D76Ot+;EnH0dWk*YIZ`Kv*v_9h{mxvs3HGhRhFt!`45xL z840Ev_C@4B)iBz_EI?u=Apqh90gyQ_0MgI5$i30ZZ)_}nCOURxGM*}EipVXv#62DUqA(kcn#o_m0xOeL zYIHd6i=FqSr(*>j5DUh>^4=k%-g3kN!rJ2mEEYu57hz#bpG7tz_t@k|m=slZ0XdJMe|7OeL|_>hgiLY~6a_24OY`bF(nF2(yv8 zB#VjKsBFinKXHiVf>SIPEVw|>54*XH8=7J%qqXU)r`-3HHxV1eXhy3mBIX*21f*nCQ*x?U5OG%aR>5gF7Atb#{Z<(^* zyP;}>d83f^Hq-*IMx7r5C=E=v(pU$GIT@E6DB6`hsAGtEVP?i@HK(o^p$Yz*vGzp6I9Fs112Na|=b}Fa~fcm!UEr#V+n#2c~JJ z9vlO>W&Zu>wK;|^6X4}I5Ny@Ymo?&efQmQq9_eNsliaKUQxJUQDb_Z8@M#3LP{tS*Y+lw;5F% z7cj7OY6b2>`0@5oVF(PYCqD{qR+bcz^`z6&kOU!n6-9Rb|c`;_fCD+xQ zNltaGdhK9u^2HyT)FmRma^0cG>yboxB8ossUo@YtF5iu$ecrHNJkrlwoG&?wOx$Ye z#L|sP7e};*TZ@O3U}rcW2mJv&b=@BFE?gLOOAywv{RlYffWj%@=*cQuXrs!aM#bm}q)v`h?PC^~d z>Wo_~2-dLrb!&aX+#t-2!fX)cR$AtP1%ZpolGqV&3)m3VFREbTEVU%|2g<~fKq(mx zfd4fEm)WHc2fGlbzf0SVW5Vr1Fwi|aH^Q{Nv#J!4a8qlaj@{SwX59f3`h$2XdKP&& z;(B0gI1Uack(`^H)J`E+^Od8X<-4*?Wf3b35_jw4g$=CtWSc6*w|lc*)A1yTgBR7-m14z8eK#BStK7X61e7AwKA20Tx}H2z=6&hdN;uz7(+>T z=n~s5--c!V_>SLHb_#-HB%MpYF0dBexk3c;6>hM^V7)gL=lp#SV_CK&gM8?}L43Pl zYcVucv~}7`3J92GM?r2IYV8Q+@F&Y-w&Y-IXQvztwYRMtkKwsKad`9(xk^%e*89hL)HKQg{c9=y=yjzPK^c<@0(Kn2XP1->3G0&>bTLe>8f zRcW%p+Y>ko7s?;+gfDh6CqK2{P;Oz<^;k5yHC0DK<~CopscsaL`q9A67iXT8{@%I( zE5%7iY7}cII<^ou)j>hIR)lgy{Vv1n@Q(*er*p-07wTop(|skqHTbjd7qZ30T$&`7>2<1osZyU*73Y_a$H#OWWj|yAAY|3kOw2MHttO)!yd28!%`PQ?9 z`f69Cw9K1UlQ#Q_k$5t7zDHEk5+SG1+h{yps2v;37e~*C1KVkXVOevqsD_|E#1xN~ zd}4ZREPdpx-`MXtckWzsVb3S%_jeXL+mNoqUysR?zlJ^sb2rYgxCIQp=$6l-0Xevu ztmp!iwR@A(V_4Vw4L$c_y^)^-(|E}^aRakx17SGd2P*Q1EauNUh=C_vof5ammRyf0 z%G5j&Kc^qH73;?IUAMR?mO$G|0A{1NIHturT`|VYm8YqfOvAE-eO=aaU;d|i_jUP9 z`Y|UNPc2bvWx+>|6omW#)V&FK9LaSin2|?CX5Cc)3Mat=2@(Ve5_MMrWRp0EB7x>j zcC!x@*#)4AfEonYD3IOM)g@Z3mVByxv@D+-Thdszwf4BJwP!8a+TEG4HL_<3V4Cf3 z#^dp>XKl&$w@mHM_s#CNJKG!YMP}V7TqLdK_wgYsGUCO{%*eelmcc%D^=U5++kpYG1W=yqVgUp?xog!RNYVI9;zOowq9yGNNufD?gOX@ zDFCoxa+J!0+EGH~Q7R{?#ZK)Lnq9yl+2Z| zdaH0%f8hb(rl+0y%NcY_0++m`OGvs2)Ym7`T}jGf$}DhddpqeBd-W7_i(Yfr+&@|Y zg05dr`TXGP259K7KmsW|P0Z72=mL^!C0ihgS;~jUM*V5`Ge&*Ute<6q87)c$Y$eGy z5iUl*!B_w&yTM}aloYsev#}{~<3~v|qu(HoCaGPJ972a6+J#;4UM2W4vri5$W+)}EJnB<%_7o3H0r5-%Y%W$fVE^sjmBcm@|QynM#AB(gTqO| zfrR2yd_-;b1(=5B0o4?8{Wz%TK~V5cD*36jhf3X4+E1keRKlPP=?ImBT97!nuOtCq zNkT;Mm1MuHd5Qh7<*6Xq!IRRNXQi?`?;;}cf>$LG8}m|wAU3gYvJX8gZLMNkNBb_M zyODMw-HUV|(jKI}NDm=BjIB zY~5SzuxC%vV@q|yp1sB-v2$N7Ytft7UUb~FrQG1S=`!|#|3_)_h?I5plD2`(p!C&d zar=qlQm*$}T;8_8>)(xa25FsPy%Ff;`f!;h;AIig(XbV{D$umcVh8J?M0(IJl%8Im zyOZJP*8xkkT)wq5x16zpZ2Zvn+&C;#7Z)}{MZEn)Q4#A-fuY!drU1${1&}hfzIFIq z62Of)STWfBWvix&)MBI5PE{vW-Bk5Z)l20DDmO}|xgY&>nnYhqb1OJqDufuYWnuxg z%w{i`=RAp>wlQR2>M z{+ksG4jp$klk;YHy3~WiBV2znDM)xX#a+X7l2!0({hO#WnBhh&R2IXVVOsIKJcmXt zocO();7ScK>JIShPbQ^C;hvhQaAK~CbL;~ej6i$jsyPl^2XUMD&{0}4DLBp50JmI(TyjP@1mlYlEfFW zEeN;i3>Y4s0prTz$kJkZW;&f)9@zmu^+g+v8?wGcmf2&)M}DAI_lM;#>UrjCKSL0@k zlKg51&G=LPx_;Nb{_9%tw!YS0>yeq2u0GZ`x%e=Y>G||WKWaxvB%^fqdVA6QbZ$=_ zIs4Pdspbn}RNVK@;Rvl?bYyzD0OXbnqJBP(h_S|Qd)+2YT=KyVuPRYtXI1z#+7O-4wf=}AltZ=O<|;^v~@C7pE#94GHCq;Jkm z^Q&-IUf$8I-jx#OwZ7|3HEZs#*GsWQTMhwR&m*!|dI|C`n%NtjFzSj^;f5m&*wuYO zjK5Dq#Wue86`%WfERv8Dp+HoQhr>}h7K;a+<&&};gGdwOO_mdpP@?$#568k0t}KKj z(U?{k`qq<~TT7W~@VN6om&^E3aoj^u8t?Wb}tB?qbX zFqQkM90EThF;1-m)OL*8k5k(TY8!4R+DW#q9s{o<+i9vzQ0KGM9;424RJ@3uOp{c; zroAFkd5X$2RDPApqnai*;6g=|XkHdX_ooHX_h};9+VUPzlstR$atHg{a3C-56PgYQ zq`4`WKO)$|f?$iXR&9xVjO=lW`9Z-0T%2d_9Veo2K7W?cOZf|ea2d_c-YepBSD$|Y z>5E8TLi#e&6w>QR(@3W?M9AXN4WzS3=a7B`={(Y#NEeVUBE3b#faWB99&5{ppb^XA zQ9&j2$gp4)Rjp@Oa1!g`5rGn$6@8`b{lkKrIQ9(-HsW*-3ohbn91@xY;ub9QqD3Y` z??tK*qFhuYBDw%_SUPwSz;h2>R4r_s=H=FNPeZ9a0YHJlO7Odcujqc4=wBx(vNA!? zvH)NL9qjZs2{#jbljwhlzC>BYzml|Ia4DD)_OLqNHtKwv=>M9eXi80K`zJKUN)?lo zp!>Qc$p=`?Rl>6{t`hL9S|j=zc`zd6#fSR8C95lGtNxIzVr-}^$q82fuMOe;n$_Q(jjnvGxFR`{S!@dG*Yc&h6v%*&( zxg#sINe1r1tH3ZOysFQqS|6-Tw8G7_vvbO;?Bw09dmlU^gTmcMks!uIfICuD_8XDX<^i9ReHBXUULbqFc;&-xT#9BdLAh>z3TdZmPIn5W9sAfj9*hT=)d5 z`~`d*XN4~i{b$Jv&&R|TH2N1wst13*o$O)P_jBxATegj#`+3F`f4&WD^ z50=*M-{3rWX7Q*=gnO>8EkkW?^qP1KeI?U#^S75WjRmV#62oAT|EZnw#{k{j^7u~q zAiOJ-^likc^vCWEDr*I{b#6ZGAJy-jo&0Aew;-`8^Mx z7}#Czuei(R#@x+Cb{iM@C^*ZH3#RWoM_9un6%EY|7o*`|X~SQ9e9zr{zI*_fTQBU< z14c4;=BUNPsAvdxv_v?-xrR9htq-okkrDZDrTq7vjW4{Rz~bZ_t{&1$cRl6(b;kl5 z8&FCCo;%9+;%e^;75g1soS)C|jc7Ki$JtWvY=9vf5od zdpDqzscNpZEj;K7FPopbgaveY zk(-m27hkwJ|I8M9eB?X7vj9IIIm15USzctqBun_Yuw<;jw0wVEsm5#f6vZ5!O)uQY%v{*wbyh-^ z7pDS)A*w>w;=pm?O)XY)qO+L!E9WYnL2)&9+K_eh{FyUjqgNnf^62T|bEn3d*Xgnf zVt#Oo7gciHc|8~jg~RbkFcPRS-zB%mxdsb#lRyKbx;W4AP8u#4whMkicr70OZajBu zhEXhe9DV09%PrT#iD)7b3xvWreDJM?(X-V#wY)VBdsfx?SeY_;+pY&gv3MjFPeg+i z<9%d1%!|!Ije4RK21nx5K}b0SLKsCQM9qWNu*wvXD7%m5sK# z`t(!Pt0p(rt0v3!90T4V6la%vK_PrH>IT1fp($ z;cOv_<`bK#YW3OLNSnRQ;q&+geM7zx$p+c54VX6~#u21bZ6{!MR9w{V1$Z~98DKh< zR%&mjB3d2+@Smr_W;J`Li0J^7LsU6Tm5>%DT7;EHsS=|~oGJshLtq2wG@E>LorlIN-N3RPyQ@+wtsQsp95Zc#Bu9m`tIFh&xK zJI~f6mWI3xUaf6;xsgy?N4`7yfNav9*AYDZI8qy`Cw@DuCPB69zTKt;{Ee@N(Jck3W$WDCG5%pL^K zdPg_-;5$R3f`iyXBZ6HNY++cKxkO~@KFr%dD5#f23Kq;Vmz2o&B|XP&d^vDQS=N`i z4HNQ(-$7g7YFg4?2g~IuB5d3>GNLJ#Ue@*=!EELafx$fj9Da!CZ*e1GRstq(qeW7J zxYJ9l!A~0&#h)gCEeEto{26E{eUa!tLsE2gf|5M_K>q>(Z{yW9*83MpN?S>4Or~jB z|2Z-xuOU*>FOW5E8|9*W8AYK?lt$spz?Xc5=)ZJSYKZcCC`zO7dteqN zKs&|XhlbKOi2nN|WnZ1Jlf3-{{lCNH3Mk4q2+zirr%aS@q9`sV${(R97SWU!85&|1-JPu{PVG{}+6SV`}H z0MWA#`kbpP$zB-*hBy|J*EsMx2nJ%4*Er`j4!p+Mxl&#S4PF;Zc{xp97lBtFPw5tn-&j~&%FGOIt)J2#hqu(!R?=zR#mn4db#N$^ zXR=~i!F5O^9FE&d2caB}MuN7I;V*|n17T;y)DVit!mf(fk}Xq0@ur%OQ;r0}0b9w? zlf&^y!d@y6TM>m5nDWx+QX54gISn*u(F*$qauay#%LpL{J_&oNypKvfS`V=nvvm+6 zX?YbRPbG6VL3ZXHjCz2IUf5Y^z?}t^Emm4v+K_f2?L_KFx(8`D()~ye5WAoVDpep( zRKRp#1o2E@uYq86saO(Ss-RY@aX)`r+?D3sTQAuy|W5{8vzQWQ*+h`nNvm0X0;=Av2sY_B#sm!=A`wLIPFQv@T!=a zo2+c-RVl>Z7V|uPGOcg9G=9f((KOaXXppy1^z z2NUr?V=Wed@R8v095&U?CO3^MBoJx^fNc$+lSq&+%u<->5Md26)@eB5$xhMbaeI+A zBK09{Aruk=$&w5KfdWQx5RBXqF*uOIOehs&hn3P?-73t4)R+ms@7$8hLeacy&Vh5m zO`7RTn%@6G^jj#(2d)d(jUdvQ<6FKwGcI?gRGHv=UybFP5Pbix);?HqLr^ujRd0=z zZ+z}VP}6n4iAl^uROT`>h5X^AE)xX@g40{??zJk;aEFZe31ymZ5Eovo#;S+X9ZhUv z65H4XWHW9b7M^Rt*o01Q{bJYq#!%c1&&-_MKFi|ALcu*RTz;Lr&9mp7*g9Xn`#8rR zhj!h30NWT)TlnhlggYCq^g7p>t<&uMWjr*r=wn-FT-5ymsS7u!x6g$MSLJPDIt-0% zoofw$lPcd8?sRc^>&&ZCuooB`o)VRg3SQpOfTej3W`uhFOE_heMzj?0Q3tm(OnFmd zr}8oeCl#iWbsZgk&g{$DxR8vu?t1aFCLEMWjo0hqr6bT09SRfpz z(go#kEE0z;=7<~)M`M-BRCpkssO3~8N1;VKfHfid1}-isvDmM!ZVJNh+qPB}3gevMGloA|#_&Hd zhVLRn3U?Xukp2Q}wf-UjxMd#0!?B8gmGB$=t3>}2x#n4!_2^$lgR9Ic++Y=c69su+ z{~Ed000BU=4f<~p$nEAmAqY$`;kSwVAV~DjpaLt0v>t9qP$z;gD@?$qq)6_tcE63+ zzGBGu9VX+~krTuP!E=9>b@vB`Jbyso$$x{u#ymdz!%!3c8;}2+ga;k{Az4lNvc7b) z{zt?d3g3b&u)!tnVl4ldaJc0^CiYW9#C$^B}qXw6!kyEO=TfjtMhqp6EGE%noo-rD;^gcEsMi zJj0zpW~%)y9`EM6yu5hpR%T}8E~wFkoFyA>UY8|BF$@7pZgwuaY%95ft2>f_qlr@R%)p+3>htF8G|{-($L2X*WbN?;Fy8u@?(1BrMJ?VD_}w5a<00e zf6z+iB){J;`3L=lB_px!Y=l(gCizEC-B$A<8tFu$2_uj{7>KeJ%0LkEuLa~-Y#>0* z`5+vLz>+Hz^j34KnOuaejl7shnYNG?tIzIp`kK`?-yY>qbF;6Htxv3NhkgCr+g7#l zSbudN#`;^REK^yfiiY^CxIPix2=Uwq-nVKC)mo|2!4@dgio5G#H&bT#dvgFP_=S!HhUII6;?ZZ09Y=Zs=@8Okq$5a2k&YovA{{4Pdo-EsBC0e5oeE8u zXR{MgkhEd6uj2`McbX}WiXZmpE#5R!@hN6w?gB+#Ez8CXs^W`0B^-Ew9_M-ChF9M8 zf^*|YicAn8Pu|y)4_1;QY)77YfMv6?J^^`0%-owi`^dA1%%^2F^aVYG2x_c@F4n;n zp1t^r{@ltPjQxHdbhH&r!ui4}Bdar{PJV?~d__;MfVbs)ppfcQDaT6EK`_gRleL&Z z&_6>-#L)8&2t9wWl6L7gQ<^`iu}TZ43|0R#;9L3e2Z648OeyaaKK_X8CZEvXEXiW$ zzT;(zu%1W9MD`QKx<}X%DBbUQ9jN}Nyh*RntACoDg5Yu{ezu`oaJI2?Ka4+HRzv0 zYV279ApzGYLE-D9FT}L@x8B!(53k~mcL-JoVe7g@dE7rhU) zRmmmYWj#S@Ma&8s`WRqRr2 zY)4BmXL(-+p6_E>>pTYSn=64_r8SmexVYGO(RTH5K97={%`@(TqWw5tjCIQS`n0aH z_KByVtgSn(m^hCEaySr7Kw4dP6lcm>D3S;?uhVX`DqAobut9K?&*~GI($>_{sKPI5pcc2UJmEsa$1QPNClOELGGrITvAsa2-d25NO68q+?iG@`*cp!G9_ zEJzXe71X{w(`DFS(a8=RP~u?+Oo8aS*B}awa(8}jGXfg#7khdS97K8uX&=(VNRJ>5 z5nr>W2#TU1crmyehWoi&YZwB?F zDYCLUK}5thmMyfkI@6m&Jf)vrL--+90ipmd^9q-t!eyv%MZc0#R#uaWm={0LpG#R* zR@agi34UC~kQ=7%+TUa?QzpWVm!u4Yn+74JU&Fj^V}O|aN`}BOe5~KjOE*P5ogpa| z6S{%wrm`MxO8N}sPy@piY9Sd=HOkYvWdYmj}gbv!f|$6v#o(tbG8`?<}sM{ z6*PwVEvH$(bbDbq3#f&rj&Lx%`Dvioc=0J{1%=)!^nl_=Q%S??XJ5!&POo>Fz%ELMh-SH>=>v*{f6VMlsqaT-AK%B@`} zoR?J`P0!E6HdbpFCmNarTzMju)N1(zHpZvAL?_=BHR{bU7D9r+6nl5VmlT0YiuDe_E7Nv0)tCb)o24G0u=?T)|zi_ z5o{f}B$sxJ{yklLk?upc#Ab^6-%(?;%f%VC^rds7~sJ;s~$24J%!kaB0;NO~+p`JngSPfOsbxnsnGCMWqZ__dCoMhJ7#~x<$$C$mJNPG}@z!-~ z$-yYoeK8pvM5$O1!iz$F0pix&+?}7t*$9Hl9r|se-RW>4^*|0BVVx8>RSy08%oI5M zRXXNaH^W2$UTeCcMrH^5^)&uPzzE^|<4iBXZrc7DJ@%(f9J}0EcGtk`Oa=#=-dc5+ zGP%rh0r)PLoXgD5J`4Bhj+_7>1_cU!N)GU}oh|GpLAVW-RIHWp<(g`hk97L+327V>Rmx z9Rr`0}@#*XLhm<>m$Yvy5M6cb%?*i|K@{LKzh7Ucc8QFf4Y4{0qH7*B$G1 z28_*1J9m42zRsn=Y0DxG0uTR#>=#(^pnu&Cpp|MKbk*U``)?}cytr&|uXnGY6<&cc zrfNb?)&RV0S&ygfc5#48{=@$MS`}|C&D~-8+F*@A-BznU|KljT*1BJd^N%yDOabb8 zAQ5p@%p3sb5|Tp$@sPdrHI_s1K*Cu*?Llxv1kh(fa(Eybvlcl)vZjc&I8NkPA{3T` zkwip}2H8<86gE%8h?67HXjmQy1w&1>C(B?W5N@pX!ph-TEFmYNkpWxD(3hjJcu13ng5VkFhBH2RvFo6w=p=Npi;0yqs(x~M3kSq77Kh)&!l^HQ;asm-Jv zHpfIC6}w<_OzfrNK`I`hVwhSJR6Ie&F)E&>;sh1XQSky5pQGXnRD6kwDJov4N?J=p zwo{2GnUbggn;(w6W+js1`LrfT&7YPeo87)U-_qJ9NPGCNz5Lg{Pm7Yxbs*oeUyu&r z@nJmfhhuvv-x3g{2p-4SF_CP8pJm_QI4iI{lRp|4gyRBq-8du;kB*!~nnZdE={VA7 zk)A<%7U_AU7m;2PcG0F0 zyY*tDmpIx14BOdpk*!c%o{L^Laqqh5un|w^#Rd=Yl18!{RFQ@z&`)G1EDc2Az%|k> zqzQN6lVr#DWu2`7^dqJNA5`_Q!YC_@@w$5a6avLaa)6yU27EN(*dt;k$Mk1XBW?~(k*1Qm2Lt=1RIvr>juP@ms4t= zR6Ggg`XtzzWY$BJ^^k@hT7>i?(n=U<6Vv+i>KeOkf=l!IW ziI;&*G*i4B7cZyZt`hG~QM}hvj!N+yhIn^VjxzCBx&BesgDN9dxU9d)#d{OPdlSTa z6WkBiT78IuT}!|p;vRsk{Z-cf^Ms4|d7}R$sS@(12uLY5HZyKN4Iny2Nt|M@8#Z3w zWyOYwP^NzY*joXLypOT}65;ZFi990v$(M-!6|(v+?qL2?6s`wF`ZaXvGe!EkA=1|g z>^D}5^!p_u{d1CXmx$yxMEV0(Y>LFn^lzXuAc%B`vH!Lq(zj8hZv(Q=DoXUHC{Z6u z^k>}Z&yeUZ42k{%QF3b@EF4Vgs2=%V0|E##`ZvdgbD1uN?L#UsFRvwP4&z?87iVI&7^{C<%Lss)@BY5If=bDoGXJ9GuYWzCqCz(6XEx(pG`KFCyHCm_ zjQt*6uU{|@^PRPc9m(IHEeZNE94wLVCO7O(@2vMC=Juw1yw>#)<2#Pe?@XBWPLv>n z*HvEcJ}L7n$~{?UC>St{v4CnmPB|0~#F;`FOB9lZ#uH%+`c!E?8<FXn0k+woOm>T&25%!$AJS%|t*oM^FpUBC&IF1XL3w&m4DRI? z5=p5QOfbaMj^TnXA}W@E3DZS|as631^Dep$ow-I*;)E#768$_6E09R9e(}L+!;Prj zgwc|P7xkAOK&ZjX5Blum1i$@q(I;ger1b#XC#KY91btHEg1z%dsiX$1`Kq9G#Qvj7}pf z`9Q3=X%rj)JwU?0h=!cy4-o)bB6~Kz_{Lhjz!Ct3KzhF%kyMNrQrh*w55Xit%05aefV5Kw(It2@` z#h6_F*0PDslyx=(%$cP>QrCRHUh7*=X8&cK?%30|8~M@E!f|ptGWVA-042o(435mF z7j7I`%48wpSHW`}wqWO7m;eJ(dS*#wU(&_-JDH`SZLwu~!zF`3*E*`nOrc48jm-+P z_2{;`U&`EEypu6`$TR8Xw0EYG_slaJN;X(Wvf*t>hOrBG4MZva(XgY|X&4jT#m>1o zb7%+MBq3?2rPkcMSw8EO+e-M?on~)6nLV)e-#VOQ!=Z58SuqAevB-d}WVC|?a{%($ zL~SL5l_`(0Fgq1wrxKxrz4UR(p@BqjTl<)DFcy!fn7&W+In@SVA84T#kBOtj)KNQ? zT~vVynkvmyYQ^+?T~yjjrTtVoNG*r8!$d2nrjiH{c#`7C+Zc5NrH$Zk?;(=blJ~LI z9rwEL5O?kF^dsGav>WL@q&-LvAniqZ2XQ4Po%?5Lhe9LjrW~fNy|o z2US<$sxAOYD~8j(tKf8BmG*vsDZEFE3NKHjhMxGUa9khaL9)Z#Ii8;!=Sk_t^@(fp z%B-wE%l+VG#c%qI*@Vmb74#l&gqYRmuE~B@?<#zWAir1}&))|5>aOdrK)nZ$`L0(_ zgH_C|F$Xn#!kqpQqlU_Ayn4z=DhDajUgN9vrBmF;+sHuHn{q=yKmZ6V){CA4_oPj0 z(#0h_&ISFWkbd;s;_@j#K1eTTP@gGZz{6&#_u|HCLdm>_yazYn{bS?_>g^>fJQU_= zePP)9Z0;_Kb2GOd`^9c>pN*Ll0AWH~@4K@;bG~jjJ^^*-(Ct5w$*n(;$qka^+Vjjrw@Z{3M<;Kl#;S!EdlO6$q24!rNVnCZ{Ra&q!RBhOImDd zn+FbWkb!)#yxH7iH;Nhk94+ey^vmgzJn2T_WiyfY(JcvGe&w~WpbP15H_TFPW^LAt z+_&8kGx4{XNxGwE>Si+`JGw}0n2CGP=*4$#5gaVpT>x~H;=6@Ixe?zmo@blmT2zYo0bPuR(XRXn{*74`G})5JG$Le+?q zt-jIU%9sfcq&(cEvDBM!)>fDae@b3=`E70*7%%I{?Ya39_eH;ud7R5<)5KriS((S; z)cP*XgXPWoH(hgZI=yh3$8tj#1=K(Mm3lxXFFl#F;WhAzJPx*?NpDIWt~F!8?zG{`JG>?7Oc%z|n|O2^ z*JnyX`E$xOjKd_Go}c?D>gIf1i#7Z){{c1==H{m6@A~H!X6BYM;Mv#fpXR8FIse>p zE;FC?r*rz?z1vdy@GCQgmO{2{O}MHO=k~u{vrppNRqLhUpRX8z zK_&)*+}Sb|ipJzvD8|YH17SIqNF?M)G?4IAF_1&SSj>sW0Y|gb=T_Q$PPH9fF+0@# zz6dyD%0`|*x(7WmDSWJ8lgdUVJD`{-9!i=h@lmmviY;0zp=1|=aW_)26OsycQ~N#$ za#8`fgpxig9R_4YM_7xA6tWNcDLn~k$WMw^p6E|h@-k6H*F9PEh@Rc|8XAemb1>h? z$_}wJq8P|GkTx-xZxDniH=ZWMfun=RkUoR-IMNeHhmZ~<9YH#Zbd2owYZ~cL)m`{; z?8J|w1lCcpWk_fjFpG$V$W54x&k31EELP0Ihq*-1iBYwd8Bax70lVTczA!naKhuLz zP_kk@&tsf;_^V1z8R4(8a7rIfNx1Bg*m`3E@cqhTS)WZ=;50;z#vJdtPoh6w32(% za<|~VDhOJyHYKa_X?=>zu?BKX%UqD@lpRBA9YWF$QMGdShwi;bEy8LASkb*{rJJ}N zoRgv|Qul|fRL`WG*sYWFw%gc^`sEKl{N9Hj>a+gSV({6EvaLV&I=fFUxEQw}dIVXt z$jZ;d6)gc4i8?KJG0u>DZ|M>7liVZHCEn3&>R11RJ>MvB6Bz>(2^+OSoRu`|C!IAF{# z5&f3|KLv1H?vqqYwq+&jML0wKOC;6WcVy*$U;q7yRw99OBAniz_UgaRkru&(zK=2c z9fR5L5dA%30M-01ul*5kum0bH=B7%7Tgd_MP!C^gNwx2vXeYBRur~gNneoQ3i1(+u zQvR$z0ED}*nd{Hf;%0NPVZ3CGgltY>;Rz;WtL&9cg(o-8|5VwkT6*_*1^jFoHf>pg zqzwVjJXPH5elr%HV4|rSw~L#GA_FnWr}!wF_t>lO9ynowJ+uiA|2J>c;)s zZpqY~^vvDTqz9L_FU5K%s>kSt!+K!bQYd&ubzg$pPx>XO`FM?NOQA%|dX?m0G#G)@ zBUDw{8(^VC)+_|^rCpk9(5e6&UFFmpMZ4x^?TG1gBL%o^1aj^tTb$RY48#@3!zErB+Td@SE z>#|AOd1d_U*rn^E=g(d^Gj?UH!GNuY$|huD6=c1VgD0Nc-aV?k=RAFY) zjDPh+Hd#H98BkV<2>at421*hci`cjRz?khnv56h<0F8b_KyI)L;j(r1vKKstmCg3D?p zLgNU0&&4JLJ@pL>Dv`P8m4a~xmS!{|vNptXUS!P-77SP3kSZKUHQQ@ZW; z(mhX$$N~Jv*t%}07-KNT7Iu$_MM&z&l(g@&J>6tN67$mg`l%H}-b9ZJ%wbNIUj6h+ zQWbjjaZuL*F#Z5zc%H{{o!2j1)ArA5`o)wrWrK*OtYgAP5G?fy2WsJw5HB$SUWUj7 zfNEi@28)vwP6Ly6VH#r)6|;06N_PwMh<0i*OK{w6GAq13}l zKZ9%DZs9XT|17Rv%@aRCc>SM%^aYrh-8k{HMvI>%`WHD|e__`(mJw2&+0Fo<<|Dyf z*A8~32X(Cv>#S2sof`TtF9KAAsa);p+0YBZXfXX)wW-n`j`AMZtYe*KAM*4PfLEGk(i(aByR<5VQT^&5DTbCa9Yj6OXtU6cKIB!IaMs+_d(~tGTQY!jn;hFL;NjwycO+?v(B^a^rDsnIu9-uf0 zQ`OGVs32i;A#|z`Je+WQ!bc-t9rRjTW)By{!Xj zC(_+WyNKPwRzMn&tY9?-&r`8Hmdaj;r7BoQ!H@+2gE4L{i?M@oL64)yMglDelB~oy zT9iL8J%q6A6Z+5!fC0YeZ2{n4D;d^@R}6H(hx*9sgQUzRsFN57E^*V>Sw5kieMCIu ztbPs<4wHy*C>Kp%Jt+rwMPmd^U-p9O>krFZFEC}}?YZ%rw=zrY5gSV_d`m9laOoc| z`SJW*?sj?}9G%7%?#wMMmIYdMjPr5FQ+buMJW|SXaATHl?bP=Zb5KA*{5b$=8IY4+PRl2k;krs9Yn10Qnz%7*hRh)T?Lts-YdhRue zzLw@zr0qy|A>EC153#Y8v_+9A*b4+i`X(A?CAWgM&0Y6w1=l^k3s>U0*ORitPJ+!) zZ2!u;*^k1;--LVQ*v4aUeKy_0XU<$dId);}+{v+XqvKwva9J9Bsm|p9{&;R$;}uvJ7Iu#PSs%ERf0UHz`SeFW zS_6u8o1m_x!Jm%e9Xgx7)m8UycL$?^jc0)!ra7P7(UUZHV~k`FRY0)tC0#e9JPWkB z#%+V4{`_N+Yc5wjiBV>4Rl*#BmkZPo_gUjD8(zABNtLx%!CelL0ej6Cun6g{rHxuS z)jV>Qj6}#hNIt^%0VVd{N>^B01x12dYd~)m(kGxmSVQsi&UVbdM2eT#?WLBPq z>-CkG1Yn7wZFaczi$eaZqU`?ER>xJPT`SXvD`~@YJ_kA#GV%f& zCES-f47bOBg%$d5&gGUdzRN$AS$;i}S@5%&==Kt8><5oVmTpFM z|4WZ$K-7FX6~4GvA4^ZUSqP{#ijnU+e#Ne{<%-05!G}})^bW;a|5WR`kN4>&V=U3= zH=)pn2I7!?F~L;(SfZZtZK(I*U@+>fem3$zC>*R>$^iasRE~th0XdY2hZqTjYAqk) z(Rf%6hr_iO4$)vZD2L*VQ+OZ|0pQvJIUWp0+SV7gDs6ozkccz_!mZDtwkYksj^++^ z7rIt=w%L7MzWu(S?~?k0?-k#agnL(J?)qT_y;Y1AhG?gf6B0v;4Uij>_^8~B2tlos zv_bX=KXvS(Qa5$>m;ku_)D-{^YcY(ws8Q;`4EEwN>cZUhBId3q!<39rGD^iH6~_@L z_gN~Qq2gIe&I4es`ywUJQ_oez%zc>>3dp(M>$D+Fr5SCW$#|2JMJm2V#XD5IOD%6w zcb;f(iVpM|l&ym3_IP&ZU2Y~HYJeA5-; zwoK-m1o@gE3J2oTdEfKE$CDAWvp43Degx^ONEeXaLb`-Bhjba~ZKSUweFN!7k$w#6 z$B}*l=_iqXijds%|jseVJKL}f~@=@5kRrbO1%hEq2#05f~Lqb#_>M`85?S^HT z^%>abwONOR0|K${g;koP5B7GQ66UXGzmp^=6C#L7F=!!#gomUUSPAXqI4s`W4oJPE zbaEKn$TiX@&k~4e9k?d;S!TsY>?xn%c16YF{=N#?D)r}J3#4244fHNo6w4=A`75w% zqI}@bTc+hltm9Vz(H2rw7E?*mJKl4!jp7xj^r;npQYEZ`KC=c^#`nBoIMpO&^b8if zZ6sI%etLFFUQOHe8&mRwq=WS8bC6&O%3S(98Z9NovWE$An{U3{enj??JNg~$9pwBmnj+VY4T5PpbVdoKZcQ2aEbhorX{b;+M$ zv`=}P(ZiM>A^PXYYPK=o^nv~(kOgv@x+lQW`lDoRie_El?EN-y)_DW-A^gt>n$;<|9g>1 zeIKRvu-m-LkQ}7`CrqvZ@+*wG#b1RhkiLXcf0@xiCx zuaK2&XTIs7{uOo+%S@)P8W-~~;9`EAtm4IZvYxkDhx%`lwJi1CN0iyM)b8x=tUuXB zKn(qx?5f`Ndf2HyGEVI=PyG+z&Hfwj!WdB57)b41OR^^eyJ`BrAgS)PwPd&0tN%+f zWqF55;2vh>|B5xacfJJl`x7Wl@CY`C6hH}V5wBt0Dz{+!*Pe)8{#{^xN0@9Y1L{rLa} z*gfu`uT9Booop2Sd$RH^JROoH&v!rk5Yd_cl6%QZ7RB;q7*^jy2Y@EwdyMHR@;!Vc zf5+%)>F*i!$^Ss~zhn2^4!890$r=t&cAx%%-QAx20d|%D8@qfQt?zpGvn$le>RPt< zJul=h{XV+^YuSTr)PrRoFmey|otrpBB>lgTRNqRnkG&cH7vb+FW<>qJN$PM4F{~$! zkmO-@`oD5FeX3aA25CPd!d)<5+9u&M?0vsNfcA@@6ZOxD-NLlOZ-vFZA8v(ZO6k1! z!6WjV^uwb5!{QojVZM#;=#Pl0KK8Ich|h^3i{g2}ZjnV*^dA>f{n`H2bU^>Si1LV8 z(Uj*M5rYEQ7ib?7hePi+3Ga&f7sQnZ$q=jYMG^X6`H0Iv+_l0)Yun zj8jDfu!3xW2y%v<{i?`;dcMl8<$1z>jSKp(iw{<2t@>|>4^q*Is4(l)e^Y$0I@_=R zH^}8(%w_vq;bXfmq(4*b-;ZXHJYKQ}3p2(g+f<7F_*%@x-nk(79olW1I zhIAYKC42jYXaEuLs=TBMmj4vJ{UF6asdoNIYgO4l^m5h`B2to-`0mNa0wJd&#$m zMC1-ADyp&U*bUk%gtzZD@zVBDsYg?ZX4=XDYAvr2QL^UQgd_`&ydC_#TzL&VH;APv z@9{P?0%R?;plxFNu8vNmex!Slb|c-7^Z?RcrdKHfwNTL1z>vdK3x;^Cpqq=D9wEl*p#&iR*m6cNtI4sV0lnsfBYVFgr>7^@+ zrF-g^?=CE--#DATMfQl3dx%w>Tp$i{a*1f-JgMYfn)nqzA#|I}T7 z+Ml~Uh3HB9>IznCBDL@V+EcgTrl(G;i4b&UvAv9A`D7T_L~om!Oxe*F>%sq|EH3pjH-0hoFnI&?J97o$5IDqg8&s8#I!L&hMCVfoJdEx9C+wvl# zM#`t^0o5H#Y&xp{z$PvSC0KWAFPYey*qA80wb)X+nZDJx*=~T1YIKs3=aw@!YfY4; zv-xHQ8*oilz83t{R$q$x&%c<5lyk>z1Tsg`4K;4e;0CO?iLB;5RdToH=ayU6o4sgu zacL|)Jv*?;9;!LW!1|d@HD6DNx}VugJN?X74}0{aibWzE6cXwh6W;XI2?=uv}p)@{bO<@5*jE0q7Fo(ax@%{x+=Qut@-v1)_7u;>o})9v*`x? zHOfjOd)8HTBAf4`IKj%%STrF=;{zcn40kU&5OOQT=Yo^~KA+mA?p6ZLJ~h}z+Cs{d znr)eqH9#%o1~i4Jy_ATca!6j-m{*#qrIjijka$(;qGT_a%cLGE9iUP#Aht?JAZ@o4 zqEdpA0cstj(s3%CpwcK+lhk^el5uLCXeU~;NTuhg^a7QxQ6)_s)6{uF>tKbgT3XbS z5?g<>RiOX|FpoeKsVUz;6xyC|5fx4F=XbRb#T(AI$ciLM&ZGHAG#2N_LwHPDyd(J* zsnu(Dp8BjvB)h%kFs%!XW$nX)o!DBvnv3jnihG9yuR!ekhXogLFik8; z*iUx<*ou7*s9?_4ldRO`5#agm;Rdp%Yot%Q)hG8UxB4u7^j4qRr`_taJ}1u-6Ta5@ zeY@VlmZqJs6~oEffIA?s{5(6e z4=Z0arGJ4H?Z?XBU=?0k0k=V3d9qMBWmdjcsQeSG!YeD_UdSs?6)I1gm1hc-r&xvT z3YZ4aH(Q@gx%v+E_4OUbvbU2ixz~N1m49Rf0PfyHYtej4PPtc-Zj$r}$Yd8QyjAGs zHM5r`vlsm~+(T+nWaS9Eg&%`k7!f}9h(rk^F_DqD^fCPtkhN!RN=`Lq8Bi+I@os#cO ztL}?nf>EdFUSJ3ILd6S65kJN%uVUrTlPL?hWxnTyBwFu~l#l;@8*n7hYV=bi)jVZM zHnYkgpCciadcOSOhpMVl{bw1kHRSbk1g>5)N9lbdS<`)@{|aHFc$kl3t0>FL zUUvSg#`&+ZD>+Gkj)`9-`frd_>&iqc8fSo253Bl~QT08df1N3Ekffx~mTV)b_H28y zgBWNMc8PHwVAa2g)z1juM9$wt&fg^ZA2CTW$4Pcq-h1$l2a-Xr~Sw=j)W(fi*C zUGHYRzGHO#9ism!fj9Ke$hEyIvwQV_gE^+48oW~vuv$iVK=f6zlG>Zyo9t$6*PxOc z9QlK6J!aRPsUD7`$Ot&{?_p(sOi~Amg=E)kD=Yk$e8Fbds@(f?Mq2NFGruap(< z1i%$to+f%ryrRt}gSDGv9*1|n*~ihEeSng2efssIn-;2{=|&4TGDf&D?613TzHwxV zSK%9*j?vO8)JTgE*?bqg0q`!{E3fiqv|h&(;NB76JoiEy=)hR&Ij)<&0dQh)^UO+{ z0YCLR#F;PNUXE_za(N5WSHWen;9Jv6$F|JLXo&Kd!C1W;B#bKNy>I4$vB-q6E~Kqj z5#Np}VyY>Hg+C~J=}l0l(+l|Ied(H9>^y3HaT-=!-ZG)EftN8HP0!CmR9A9w2?7Dy zczC%P_j-;gxaQ>#Z~CeR*SRWc+%sqSy|Wjk&nzjg!v%5Qklx{C*6kw(m+MFtl;3s?Xa>?c2T+; z78mLs06bInQFT96dZ==MDu<|cm|BleC7^`}RT5M=27%1lDXN^-P7$k_DMFChmkE4> zEpGP7_p)zwlOVPTtq1e1ZL%O+G+PkTMznWy?}H}Juo#I&<46aP4kA5@^ckebk)A+0 zgmf6`2+~ocV@Q)o$BDm76G?~aaE^e>@vae!`W+H10uil4u;`FFLA{q9BY=ozDcEn8cgIe#f)=D@5fz3%X;e=UumKB}@z4$an zAoIejtndZc1;PkqqcF`1r$Es{WGYS7VFj9{#x$Idvcf#7 zi1rU2kyatk^qV%4Cx8nkW<}74L8VQ)MDKCfBJULM5y)`L)Y_G#hp<*m!@O2jcWo`} zgUdb(ZQsO|B`awrpFreOA%mCD*J|@~l<=0=cHH&8kd^EXVrVpW2h^%60{S zfSv?7Ia*O8`U_*n3})kg@agO~d^-D02d4gNXT}QH={=EZk5IGq;QFn%pXv#^n}qHr zjqWDR?vAe89VDrE;p`chR;&eA)Fr!lSlr%G(YnT}(rkK~eeLeNjou zbeuIjXs;|T&gYt|IiiYYUs#;Un9`8B8g8a_d~-_?Nl$O*f$qZk|x`qV>noWW8r@CWvF-qDUm(x^7iWzhQ@fM8)c}HQQ7>x_~)+E?+}ws&mr+vY(0$%`fsOMbXDzTU&EpgDaeBm%9zvwXW^ix`ucXw~ zwX8Csay-fqf-J5ktwPgZefXiCSTR!%HS+|Vka}ncro!O|FcFRz!IH)d=TEs{<_!RW z8O~7%>Hea!VMuq)=+(+eF1~(T>|i|x>KrN4fny* zt7f#jPGmJqMV+Nv7uC%-8<>4%yVqIoq^;!XKhcbxHG|nV8036S5e`Hl-ASNz-4VbR z8Us;`3}kDENUS6aO3Ez;UF6-w~zN>Rwnjk>G{6QaflVbA?68+ z!Blzt8hNlXLeiv|&zPWjT-GO;X8bI`1|<~%6mEdA9c1N~Ih)Hc_g-OhFV$bXCa2UD zHgV6&U{cP??_wVN6f4$NCNwC%eyRj5?Zu9dR&~towt_Km7B+LvE-tCl2GSyr6sr#GD@M#+*x4ml-%K7h z)wdP4cFtrNW$)Wcc0F4$+i}jq{efn7ctJ&Jnh!Z6NEl4HMLuSzWzM~j zdEL|ih5?A`^5c7)OBq%VKJPYu@37k09rEWvlO{K+r@DGnq5qb-!F6 zeFDiatLNLvTJxumt7VoWkzh=Y1S1J+anQ-(NGRN1Z%zp%5^-nwc!KD#u%ql% zm&3t<7+`*eAmd)#Qzcwut&!Kd?#Q$AEGPVj90~>#4$Rdj`s_ZZuf^A z4(SNhqEt&zZIDXGsCJynBh-FU`~R4G6Yw~a>r5~sugI($1)y+)APE8l2@-Wz0bq9n zBvB;LyuhOmH47Auss_{~z(xU7Q?g}9>UOszTe2)mwrt62$sSv_JUh0v9__B>u{^VD zdp-JQ32@ZCyJN4%<8SQU{rr7Q&3MM%o%y!+y%(8vp>Pl+C6gasWkyE4h>XmPcoFZt z|D9yqGe(h(6-m>%YfaU3W|(zr0om>GHmx-@O5Ot?GkCh!8h{>NYfvEFJpdPI%i0x| zBe7_lXp(4(=pfNyqE8WhhUf^JP0{%Qu}_T=E1rMA8rk#K3t87X z3f#C&yfNWI3k4Ng$#Exk3Z$tUgxBe#U1Z3X@k?YUfufZrLp=?U?*oG42dr1J!SzfK zujwk(c2q^|1UDD)R}~S~#ZRF6LQcd+vLztjTyAFdWg1yf-}chusc?D@ z0}vOHkj2;MXdOTAcwc+~a zw^HmfN8-`OnjNjA;%Rr;Ggo4-OpPU@gTBfdai168<9LKHK{Y=bV22u;gD4y- zO+`#l93F9_mrOhK5USd=HbkVCyU?gZYbC_wJ}w_cbOkxa^`x0(CWyUGq-*^xh9<_O zmopkb#59`Mnq)&!+i?(8TR|M&x7NW-&jCE|kknon-_*l+(n^5zBES++AJHR3`-vVS zdYovOXoP5#Xq;$*Xo_fB)^tSRrv||_q;S;tM2U%Y?3OMKotO=o@r#Nmtk0QoAR@Md=pA~gI zizXY-TIZ%*=wN*Lo)d+wQ3S<9^X%)^`?KzQ>l1F7WMHy{B@+?6xL|z%O+vcr(J=d! ztSjqX&v*s;eF3dBRH!cNh|CA24?SSr?8E)C^`SSuXMMO^D!gO;DDG_EArIz{kO_4E zp|{_Lt8cLNtV+DU@r58vY~Ac*C_HydAIqq$zlZX?Nj~gk=-XBVw{Mj`LtXb%*mXYZ zvrPD2GbK#Ic3-x!1YylO=5c-Sd6o@T;96^t*g(3Cr;y!2J|`m7;bQ<3@0DGj;1YoU|V_dBR>cP*R4NNv4|N=CvB|aNFq7d zw8eX;MpCJC*G^2;NGuW4aDfwY8$MXHh$RlkxU?9Q*3Z>Ogh^6b%oe5>fmmf7H+xL9 zm+{h)Mh(by^}za&6g900rmN8ms8M99;V;n4s z2epRW@x|Gjt8+Q*X%aef1!p`RuK*Gos*&-f$1>gyZ{`foDY`@DH5#tvZ>~lnd$k1F z_N9I4@w~J(?^Ns#r;~ANe=Jn{yY!$xW-bTBeV*%LdNaBN}up~k}DC~*jHYauQS zl%aXi6y=V$AitXZh;naSg-p>(6K@c%L0*RRSSkI=O71qKCnK01uWc0#*9WOwqSzWV z=qICz*dSg=dYucWb2q2&qSbZ+(^E}O`X(5(R3wZ!BK~4igoz6X^=aZcSghDBWKb0F1tK6>bi`tD%pdiQS6@icg_yT0J&tX9Z8csQ2u4`niy9ofLAo6% z5U1NrSK0AHQxgeKIg{Y#7p@p5D>|5TYiMci3k5@=P$Kk9Xe=aSs21a}J%BMUnwPLT z435Pb(Q}oxAh0we6LYqYYh9cj;MzgX4sorAv%_5L>1?;nv4NGx!01Y~elN5E=_a7+&>)n@4!nIR=2Gn}&{+}g&5iEMASC*KoBf^znu z;_mj5TA`EiO;}zj*uS{8on5(kckEU8sEfmYUGDKn({^3Mwd#VeNJXm>|6WynH3bKSV5~E6)$>rp6sysE4-!PsSo zs>^{;7z z&+!6+j=wd%ut?X3Yw@r%+6^48Y9Krd^M(y&Jon7Q-{62#wtOukHVPYVSGZq^P_Wzk zWEl=Od;jg)?Kz;7sS+vpky`3(NooWR%@&MVJ9tpz=FaI(Mh@&;*UsNNI8yqY3qtok_6V#62W0HKYI{N2+o>x{z|M{pYtjjZ z!5!H{UB$v!jd{a)XnT1ToU+tlc>8RN1ayG#lR?v|V!|V_hc}JiKqHFPf-ZiZ+5Xm_pI2Cq?h0v6%ZH882Sm1J9BTiyiRTuAm@3c7Lf?>7@^f zVzzDiHT*QXwyBlA9k*@KPOh}h_Vw_d-lhsHD|5xU-YABiD+_49R@7J2ow|7L+}NqB z;}yvwETh;k?or29Sn8gAOj%*Iaie~AJw!PPbK4OEE>G)!Z zK8@&qNiL@;nC~z*PjLAu?jJEnWen*ncaXN_1s-^x`2wUg`y78*rpvxHF1gzz$=wNm z2PG+R2vP%wAyqyKN8aOW{Y(!<)&``u6v$9rPp=JP>AF+$>CD&}qGySY6P+OXEYWjB z&l9~s^diwqL??+}zQUxdbaajAb3~sf`VuZ)Ot#e>a)@+GWzR1agoO0Ei7S_r3NkcqY#k!52 zX$&qictPQ|ewq>Db^!h3Wakd+GBUe!=X=&?S@~VwgS-5^qx;eH4q*Oes=Z(OGP8b> zVK%h$>a)H=+8=zpry$d>P^JM1fu#-htIYaUCLZw-bUMaA`zik#BM;>1M(fv^^Q6B) zVUaP|E81is5{&iVGK9#^Hs_l$ceW+pl4(UtF%Jfb#tOep6%I<@X4b%zKO2|`Nb`PN z7yllcYR0nbnRYhcZ2dE8GFgswV65fLK3MnsK0(2h;xHe9#q;6(;c)p1S}dW3L&#@$ z8;5y3v+&vqNRE~9m|LY+o?M*e$|_;V7jcNS*=ZPRU4_-#7++<%uySYT7|0cz1|Bm1 zkR6-YP8_=_%wcyG-#E5YUB@wsGYB8!i!gmGkiB;^#YC=5JB9b`tgW7Y*c+}qbz&~> z7<>9*J1SJWqqdbaUU_mcoj1KdVmCSxjr%GusgXn~jSU&xoEf%~gLzFq z%)dddHk-|i3@TNIapw42%8e}KwhLhxckNVtWRud0zstWp1+F~ESZd2wXTlqsI=^h4dy;i&{ zC8QXdB!eu(#AYdjzJjim4Loo*azytu)!z8KyEt2Bfmqyyb~?u|%{;DcKd553MokVj zdF4*}P>r0m+UXiE9_p|lUA{fLeQe4aoA&iJ*lzpz%{;EHKB)D2?H;im_#;Ub-QPln zicga%nyE5VmqF?^O~syt6!F+yvfJzNF$MK~GJQLc|1^DJ#cxM0eLFo_6~7&4SJ<_^ z^+geB!?~SEmGAkX@D4$ShBlSF`M8ZUiU=FkRpDM8Z2;h+wB)_Em4BOSp>SzA7sp5P z%){Q*KxO2o;>I4GH57A~xlnX&?|t>~Ef57WOUqPAt;v>;i>eK0aT_dV$U9zJ9>hD% zEzT7(%S*S0AG#5xE*yR6vegMy(X_VxG;cm`V}c^wMva%so*H9eUuB=G(PVs3jfLZ} zokDK~s=03CQCBA(nw=4WYm2J8a3tl@&^KHTA#_JDv@f(D6?fcEOJsv9E^@c=a4o>~ zIx?{ip`#7&;>H29i*ewtD=`L3^5cB#vhLh%eXii;U%m@maR`P!sAF~z(FtnXIT`aKRzc=R3Go2htA>kxH+8_(MhQ*!6Ea3%k|Kqu ztd1a#v`Xt_MZE$8P)rPUF&q}-R)T!;zIo@!ojR8!^;yYv^ph){rvxf9o_p~;EkJ?$ zz2CTV=N)Tk;|n4Jo1(q~tWP8BI_dNS7Gz@&SiPKiz#5b@))sr^{Z8;8LPBq>6BN>UL_zA7^6rdBg4`GG+TGhP{vC+|C0 zcpgzD4!_sR!8R1DH(OtUid$D4c$;cD-wDxuV6*9qGwvSjsbMNJv^l^3^4OJ27cZQ~ zSlr{6$4*PWWk=}FEG*~d9@AP!)IYqrezb4En6P|ibp{5af@>D{DF~CaZfO|?O0+60 zu4jb)ibBi|?(Y6-bdfz8R0ZL#VMbKT+Ngh*)z02rTFh0fvqVVRAH*_B)OWpRXWPrD za0G{jsO<}FgRd5ynh+>0rACs;q(=9lM$?0Xa2`t`dRjuKD4BJkdX%V?ItqVj;x-3r z4!nrtFZ;qom8J;3YSy|8sYYhbWObTB|jcyb?x5euD(Ck*|p*w7)V zOtTJT12_^@No59H5gV`9`Hr?IBzFvKR**U)MLf2XrgW%A;jjHeu|}a54sUKDyz2rL z@^UWkebo`lNZAXY0DX8ni)(Di4JRw(F!;Q7F~198rm%|9V8-{*qXRXS#r9bB?4vTg zG(GzYND1UG_v)rw_6aHQ^pdz!d1%OeyHud$BFTi- znir=YMYtFExO#xA-CRAw)qbuX=URlTQ8R+x)H0&9c|mYhB|lO%v=%^UO--1Wx0U2kAK z(||OF`q7M)S?>>Gsduci8{O~K_aho;y*z>9@w3*%dbhLzTtK*ec73B;#`ZvQ>-_!x z#J970dVl-dZ_H}e^!?yz3}Uho zM4!Id8Lhtq(*sB0EVn@saWP;8#=6A}dC1U784x9J0nYXn&u+q57cpHD;eZ|SdrFAk z%eFhaEq?FMdT=fdBSG=oRa9+$h3`_ed2tyeR0nyfQong3zM~4PM(M!C%P5wQUOsc< z%Eil9$1Xnt`tpui(i-){N4}$O&m<)vO6$6StuqStxrzrzc2@m4<%jmtMFV8(EMPOl zV6Y9Cat-L^KrzW?t1V$AUZ)6I@C9#eD#sQOS!nd;O$P$HR!0q$Yj6d+8An!7S8MI= z?v6wvI|~_YrFJ+Rc7mAF=v6{IP^W|)IZ)Ww+7_Xg_Vfr!rh34hGLY3D?vn4Q*A}XH zHqB=Ar3m(=z7)lux=pN3?5SUpv$z(XgpV+V=QUtXVT%tWi}$1YZ&)0M;f75KGIv2Gjy-teNIqT|%%F zzgXpkr`Wxdl33=UTYB>QDy-hZU2F0?Xh$?^ofMl&7$yttbxv8QDB(@WV4dE$2h&}j zmBEFb!d2}{42qw};yMPH=NPq$OXqPOz3_kq&x~0{3tV`<|Ls~Q6 zwVuc5@mk=VB$+TZYA;zY+@H~4U093|{?d$!b5h>Zlkv*P+PXfY-wD~kT2DeFzk-dtbuWDQ-NQJ~AChi8U_A^-ue|tx z9afeeus-$G2keNpY`rR)2b1UWhB(r#)fr99x_1PS)#|$ecz)Jva6j)_KZ0$-aO*#s z4Q}AYSv3IjruAcR6>j3=?EZ}E!R)WI?)T1GZ{WEP&wreCv$NJ)tXnEYhM;ER9Q`TB zS1rW!c%)4%d`N7^+mBlfTm#s#;x!fP z!*Dq?42;{+qTlHC=hDE#h%=N`;P)W z5f*zeA*pp-4&t1ohR_>R?J$E3qlv;I5H})wOqi+UUM?Rd)dkLNydJ?370G4t76f@| zYStxpyU=3nle-S=KS=Zt(LUx6n4EcJ*-JWJAEFnct(D6BMKy-bodurGjb&I*921MQ zW4K5=hKn>HTsaQ&iyF3$lcg`tF?l7U5`bTrf*M9=R2p_;IO=U=boK>IP0pyr)sRLI zCRw&|e}cgjA#naUX*pDG>??y~!PVC@STk-}u5XOX1k3_W=LRZz&)f_5w^?V;3dMwe zj8;a6vvs&z85Y`!`h0yDqv#MJn81#Ce@RtQYZxvL7Xvj$7H9BHAE`aW4Am&(Iz4)I z^v0!&;}@<m#>{0Q!lT=(ngGPx_G&@(F~N=M)OeABd**yb#C;^6}Pxf`x2QK9KC#b^u-%v=f=*DUATJV>Wi1g z0yKKqHjr2E-p=J8&wNwt;o%xR44?1QyMG?Fp6hO4(ejUHNGi7NdhI(Al5sRW2oi8Q zf?nNW7?PC{X~xuJx+9hXqae(Xq0G-Xo>~u5PwRNd_2Sb0UXmZK7S`;%#-o> zTN#tx8MnU~L@`&!sC9aw0_UL_JDb{15+!#oJvjppE#t3NdFf|1en^pv~5dEWhiwYX1DdHP%DJr7u$XMD=r-#+hsz&gAa zrhNUK^S+Xs`9AA{5K=FdyP5B^wH%-DoG{-7=IlHA%UG% z+DVEhb`Tz@_|T@}uRbX$mFgR=t`C(ji}rDO*zwGsTED3`YHmxF!vK2Fp3lj><1R$^ zZd%oRe)ZfBE2@o_tGLLT(~Fx?S`g%WErgS*$BFpq>Exa+?m56c-3Y{@iMXF#T#a(A z(TvJQ5g8H|0?g}cUGo9mx7Hzf_e+xZAp8lVCZo)#slUv$>9{a(A{r(dAsS;%%?M!5 z>j|Bz0pS^0Bf>MG>oHgOR$c<{iMzjW}ce^Fr{P9Vrt;{+uD83oIh&x<Lf-ysPmq-h0nF zcgDIv;N@i4fY^;059A}5brsrFgjw&95MjMCryp{@C=8=S3^@U_ZeyWm0&w~LVoyk1 z&cWq;@p2tpep%>s#O0fC`Bw2VI^`{%LASx8+UH2N1zqUENN~1pDlTOL+D@TxobV|F zWvg%}dP*?>U2^B}D?_!)FF%3MH%^7aH7Z0iEYz_JeZVt&YxMvue`v%0z|Q6CYm~Pa z4fZ@YvByT#NZafEz=TfsGq(5gWnu>FVlT1mUfbgAq8LsmZ#&vAKY>slPV=tUet+x@ zpJbw8yha8xDf3l!2->U;s*zN9&~SQMjV8m%GNXZT3>IPWL{t;T{IuKSq2b;n?Y_zt zjVnR3nQ^5Rqhu)iOhf4PWsK^!hVVbK;)Y*I@j$W{{_1EP=jCp8MB9kA6YV70MRY%m z7p4l!4^5*1n;AG%qj?$n2beglt1b#-0VB7F_hw_K>y?^*MNylp%>3h4;@MuMXvD~^gCN-6R%jfh3l_kmg_>&`G( z-@DmXzNU@4^ohr3`9cOPMQ@UG3p2$q#KI!RX~=M`hG67j+hYF2F56zS2kap&yjvc{ zuiQD<_A7tVy>)$aZ(ZM_w`~1mG+e_iqNe+VZNgOy=NOA?1bE@2?Gl5GM^*aL{ag;9 z@2p%$VRTWaN8sHOe&_h1mqBp{;bk`|PA_y!hyxWX(joie#m55`D!9QD zVKc62I=(tTy~1;7^>=ltRz$?k8m$?yi!QH<6`o@r$3+oasiC6izLiJUE#YfgsEC}% zb5P>qVs8J|bzTtJ_37CaXfn6i*uRB_@*5bkqcgUZ)#eo&iXT_0ySM$|FFu}Wz4(sUL0BVkH5QA;>ozqU7H#3Q zx8k`V=4iCSRZ17^VD29zr#l&DYM;>T?xz=FA_hXo= z4l)|p&*j4iNn;!{kJ%P_ifXK>l2Z3N%;cWtwO~C{e4T6UVqa92v`zb>ePw&0$63$~ z>n}9S6D}tV>4*4D;&HNDmG3f}0KVRG5!D1j0QI62sPsENWqiJ1&h=9C2jkt zE!80C&H#4!@K&KDHkFur>_J?rtH7!HhS-dV?Y3Et0UwB++qnaa)zCw8t&Zd*ehPN{ z4)ykGVSeY`zNdFxYt0ZFy9Tx|I(@K(wypZNJK@A#*2OK_dyvsxw^0NRnV!45``fCS zy6xyV_t@j?)aVO)nG;XiQ(z<=iQ+z1$}HX^T3v;=ihPntpynwBBo&VfcwyP_g#ubb zQ$Xx-DJE0wEiR@72-S;BnHi0nS{Oo|ZY!R3$Q zrFD;h0@f&8l)ib%R2G=ZI z4F(L2XQtHWBv=QHW70Z7BRzXhU{|Tyc_=iAFi+pJF5~q(!6ex%OINHbgkaTAzN40zf<_$Iz{tyHU4k!y=OgNKB`_9qiVKtRIQGVtrsQ0#@&J; zv@4?Ii1>-Vx+CI{;4)OsWneFbhRTdIH$zWo zlyh`Xttmf=?}dY7OZmex^%PCIUiF{|@i>-B^zQPOJmuvT7^<`o3vt60LWCln!jBqc zJrgv80+>j~1=5miGVs@f7Dky->K67dzv0Ex`3hM+2{tpojkwXHvm zavhc9fn8iN9o|u^<&>Cvtlv#}6%L>PJc4qarkQi3WzUVWWY>*idU&^ucW!$}jip#n zl>1HXXn>yDbtBNQ@GQ(@LO!bPJHJiwvOd7_$z2yL_7|ZF7gm;CrIyG;UCw??WcN2> z@1b~3P2ZlLS-1%wZmwYaD&owP+E1wg%}z2vpLezt4_cpQ=^Y{{y)0Ss~w2ti`+N<)ciUunttKI?s1BX9IKyo~}7 z#xi@!M%Yxf{g7=I%Fdy4a^6kr(LA~x!*cU%zifQ~Q8%3i6(HjZUd)?zP~oCzRBZ#} zEI9w3?HFnS_dtpP7G8Q10T!@^?ZPU!${MoUU<&)T38qloM0@xU3NJm05DNDFlNb?y z_`nGb6@e4#gt=Co6|4xHP+u!>g07de2LmYN4cJ27fa7m9Q0cdx(||K>o5xRlh+S42g%~KqUlj{p#ZFX~gJA zKTLV2P6*!P-Ckb0voM#N>sndrs^;272AIpMvnxx>hEqeR#zX5)L?71H zN(H_`5477}sZKy_rES0TJ-@Qow|-@>*SLEd|6?$Yru0deha*unl1xMpRVZmVF9%HO zgOHwxC3W$9K@JGV)JQxP6Fa;Ct*I$sG}DGf3;BnM9Sbyc6)@y5jWe@^2!b#n4V;C1 zUgq-&K=KYU!9T*~mh!C&2`zCn7fhsvf6W84ZTnh~=I%~;-~O%xL=O_}CVGfy57EO! z`-mPT+RqG}yEVfOStMe^sUuK>3mPpnxD+Z*_2VS2xkSLC0B&(`+SMSC5ToX<229`9 zu(PY-B%X%EF;tzF&(fD6@rtdHr6{R~oG7Or>AID@m)F!^YKfSA5N073$88ZTQn*TshMt*qJKI00R6-M)vRRF}o%{l+_1VM?K6&%9!- zZXkE)+rEvww_ExrcYx*} z*e>d)jFedJv2A;l$(@xrMar$*16yK&*-RRO8x zB2buxmDQD;icLDQiw3|F3VTCDQc(*lOScDhQL6k6@qKW*a5*=9^X6U3#c@#v4L!aK zHXNQo+7VjjlHn@jCEHcod##Q@!eJV1ps1)Jt~PVEg{y6xwVUmXvwh}1pj~DcGxsxu zHqpAd=MdL=xq6tZeFSrIjH_X;4srEquAb!TX|86tcGf)Wn7O*#eq1XDnj|TJaXOAl zETCg_jzC>xtsnFFqH-(|PZCWLO%oj?I!yEg(Wi($Lv)1bDA7|y$B3RGI?fK)p((6a zrXYcmcSNca=2RM!8|g%;ACV3sIv(8Jw} z^R3b#zM2YTa`a z8iP5nA7^dU<>omqn=>Y?ZjK3`4^>M8(+EuMv8*TKk@~E7)|>Zs)q}udB?;3D?M{8H zk042gkW zTF*DnH(BSfh3om2ZZ@IG(8vol8aYWyl6=c_t92O_$ttw>Gbl(r2Ms2}+u#Xk)%!3O zL|1(P4zFjMvW@x1OcOL1XZ`nQ+wyJM_I!J`Bj1tlB>hNhW}lqtf(#>w$%5It>Kowj zeHSe{SrW(88eqKFeZ%?4YXH`VeSOq}@ z`)NP)(`!?#2OiMf@~*T#L?Q+}(U(LxkluH&*he0)0k+1hHAc-maOWNCW30&Nbw>BA zLZjYbXRJ5bly@DP@fO=4uk}x|iW+``Rayxj%Jx-AF{tnFBq`?O{9*mhg&GjO3em;Y zk!_Oc-TMSraaj2Q_@7r+i3{Hu1Y0h1ME7Ds(O>uJz21$$bJ@MKdbRub!#jJsQNOde zLfYLEyKnYpZ{^WF-*XNZ-EfhFq8fU8UvaLXR`OeSh2q{RH@N$ntGesOJ-4~!aSunc zx!l~}i1rgbM)Ww*FwrQ{1Ud@IEU4@C zWW3rys5WBbLZ%G~rEwZ0CG-?xWO9KnLTGGmRM@scgK)dQT?jkvDD1SO(|^0wac_N^ zS)KRFapVtUHlK7DWS{kE%{nUdx0>E$i#Ad6pCO?Frp6dK=h$JlPGHey>4f!E*0r8@ zXIzlsX<<2`>26`e(cfWZP`iM^tB#ex=PyhdS&pU?_cDGq!P&fFUBpTdR)G9?F4nI4 zZ@K+FqfK|Z7@9$iqz4mKz=vuKa}?i&SRxY9#b=B7uW_^Z)v3`~H0dh6-)aozb+iLW zsv!n5bPM75;I4>{LDQI?29m>|DS(R>YrvF>_*0W!Y$!~67tyj0gyy*O; zt1n6#y}mv~#JO>P3}Y3KUpY@vxw~%VWQ0+LbAKR&cnGcn=<2>v8ZeLV+%M&_!!900 zQ8FNxgu^=(sF?7z6|@m+6^pU1#if<5ySbGv0`|srSZ?mvuHL=!>731#&qFTpTq;y9 zjy-PAPQ1l*S2o-1*c)ZXq1qqt55iE#p2lm;;;G1BM2*JNF?82THrD+7)pRtSs-B+{ z;bhE_MASqKVX#tzaUij3NgxSdg(D~=7m2=)=u1Se6U`F6L3Env4AEJpbeJaV^7;3Vf+V6I zI0-U{);J>hFrazEh=gb)2S+6jGrC75FEhPp(dY`H=;3zLWzV6LAeneQBj`WQe61*< z_v%L2i%qe6{c6`q zd77}jQd9E1ejQI`Qq*XQy6}B&{Tqf#5#`;kH5KtnJkq~`++K#%C;ut4{*2k^CAfS4 ze=zc(hwOnK^!NxU|BhMzj%C&L36&uO>o3{8tiGPn*^HX!l+*evcHfBuH4GL0M-FbJ(5R+qAcIz72NIDSo zK1h5C60f6XV*7}>lF?Lg|9&ahtN_>JN*g3sy`2jmD7pwwYdN;5iePUMd`u%(z zZos?=+$a!x5CgFn?tiE7?tM{p)cU;uS^tRm4NHFn&+`QPm(2QOCPIXL zfja7cX1!;ve+k9cGYZ29?Ei{oTl1|O`Bt*WsmE5L9t;|?k@siXWxKsTdWd{2LP4`(QZx$Z$4yk68;S^q zt6MzY@niQCi7#Nx0N(kJfxRLC{3q2&ZY!BN&hxU%_p{ycyWaYd}gmz?0P$7pr zI{_%w(2kbyVv3Nz^x9(Eua0buoKsUnx0%(CJONat8tT#-RpV;*wgWg@y6(?cDkV!n znRSp_=a-hnLQyBpS;5i#J(8ZXN}E_i-}orHu2!MzBEfJ>gmBtk-F5X*A8M_4rhjLQ zrBb)KOAHDRp+6RD?f!>pzDIx%kJ6JZS3DcDb|0BVbLh6>Q6aOmjC!(bi__H5++54D zfD3kdwsZsIkKCIT%IIC-c+~`Zs;|M>UaRZEjyIcBj+!NbeF|j@@5Wx4-nreZ2KIQlY`7DTlnu>1ay;(p|xqKL5zAE~($kJJkjR zs1vXD$(u{FuL$e}T!)G;g%bB}q%ijwTfXIoQ*B7HdlQsxg@GS=0x)bfRPD82W0DGz zv3Lx(pwOEy4y*HMN=+pOVF@2erc{ii0*m=*LQO{_Q8k{9Ct>ZLjN-~aRYS9`M$@rm zBdONqW;aDvZwQ4#EujOUKI5nsZfb$my}LCM8Z@2`jjCv2Z+g5wf1r*vF!MM8I*FK| z8pdFkVYTn#ng=!UN&sC1lpyDg+-TxTGdEk&=22-!M*)T6$te4|>mWC~xzfwshq;H8 z0P-;|A4fcdD5~bQ1Xq$gm_`do^8{C(;`K3eMCQsF-f-FMR=5%&PXkrLW)bE;XCb3& zt&N2a#Mch7(7_>G{`azw_ZdW(ktNSb`PA6y4AHYh$B9l5eU|7sqUVWTAbOGLC8Co= zudwE$rp)?aiA_MDog>l_SS2%gMDl|K)-jFCWSz_&F<5B;L)VN*UWw_AXdlV;=+!S2opg{3$+`L?LQ#DP`gDCcrumN}pm)b9(4Zuqna^NNFIsqDxr{UDS`}4AO z10$F!*8A^m%&XS)y{tB&p?YC%ii=>S_cAUvVX%2_-jX25G+D`e4@Gm2op+CHSFiBVB0(c0YpF2b!+w ze~*IXr)U?T>7A~%=65k-&8HZKtoaFMeVVO*4A*8ltj*T*Egy5%$Z(8Hw{LzyM5_4= zLz75I%(MaTpQf{XJ4H*deuiZ`G96N%^?7#2`Z?@!PUW5DpHM;+U@4%{E`Zc)s6#I2%{RUgV z6U2V|$Kvkj-hR`*w{F&ewx_>Er`=M1ACwMsLdtI!Gx%`JGg#wP83$wb&v{_YkVz+IF>1*K*48lWnSzJPQGDm-6 z3z9U;avN&MZV5VvumwBx92CKGud_3J6^a*{Hn)OA{L<`Qz(Ve_y6dZNyE_tZ-TG#B zt$`uQ&X(JrdX&y7_zJ5tB%O=%Kw4P+l^-m0{ZC?=npo}JItc)eyZ-6Qm{GdYZClHPUO zDOo5tus4#sE?9B)gy0so9w@F?e=#=PLIPu|ha;$vNvP2{nL~)U>k&ALCjC|StH$7p zw}Kh&`V0!JbU75%8bhI`kkLe1mgZ0lk)#~26TOr6g9L0Yg=bgm5LtmWfbe9rn5~SA zED&44>_s;UuJmzs1SK(cj2p)}8{q69XA$lJNh{8klUzS-p0*uIK+;1?NQA>{Lk);q zlYNZsUu*A>ef9FuwS(P~n!t=|a_!gv`E#b^^w8ii(Gx_UBKkDZXNZmv9VL2-=oo9S zH%&=50>VU+j3Zey;qeAhtU@q#n0P`2)qw6J^&ld(kpM*olkMcqxyd`EbrTrFaF(ra zOfUlGRdrQcW5QPhL8(SD3lNWd@&WTIryek$I&PiJsuQZTroM|X4In?QX|t*|wk~9m zjF_xBqttN`_Ky&$Chlhq6dm&BM#hlIh;rNs<2R#b+!7&Doxe{Jd!Zpy(2gr&V!rZ# zbub{E^3?}ypK=Y`@w|0)J@3I*T-(53sLc*CNZ{=++!u9GJ@;yoo~6o5868@y&*=A|vEPQqVhmqR(^T#AGBoxsHkP3(M1b6Tqz^q{{p`aaV2bDRJ?lqN zJAiF$0oET`&j!S~(?k$KG1o_#eWj8zSOL-W zO-6c^ZoI{}*!unAExu!Yf}z;Bk+0jBHX$FWR@UKGP_Ob6OaSZ;V!5BB$`E27CC++y zOF-fUff7n*TR_CMFJ@Xf8>-RF!&i@BAMz?B?nZH0-AHDmxgZmZy*b`yk?8^s`;hPgu!&VgD%I0q;QXT%P|8LbGy znb=(rPQ@@=ov02?7}cSfJ&ge!F#hISNjXi^=7vpfpt zr<7fd;p6zOPTySk5Ixe0cnzWG_8-hpt+I4cEatAZ2E;E zyj&5$L6yY@_i^z#AGdm@SXQ2prFmuz*s9Tk%i9@%Stz$s z*;Eq6BU=|)TFey-oSiP5%;grbSZs$%#_r^n?@|I*lo6=QTbJ3?tz>F`VfEHbZu#ie z#qjA=6xrrRYCI;g!zM^Vu?6ZysF({&D`RAkTLY`d{tSDzZ_%>NAb{*d36aphQ@QfY zZqXQ85FOg7AmuW#1ReG6l;7qXux}Wo{X17!D%xn*igU;8 z%FVmtevj|OqB6VPJ%p^-y;D)lM9@Tduw!RtfPK#4kMTElSdP zLOpUoxfaJpyAiv^c?yiZaB1w+)v?nzPF}luMJTC!m%ar^hpyvCCJYyJKAb-RjG^m!VVif>;FL(spNkjB(-Ojq{^dPn|8U z9^A$8ygPMlx3@Fu&w-4v9FkyW^M`GTtyO72TN6&X;ccrk1E}}H4 z7p|Q?PdiPJUG=Qv@zFnp3SXW|qEULcx zuB}UnpKV3;5C5=Yu-S6E7Kw$UDJ_yrCSw}LN*oMsp1{@EU^IoXN)jzwibQHOmI`Z; zXd;oqNN#ChHkeEXH_w@9RFv>m$UAB@nI5dKA=aqTbQqeI1m50?8Alz2*3{P$0waTi zP$Cr`Og7Y-Y}MpoGUl(60MtY(8ueDl6KWz7NxREL5;dNPg@c=CAuSS)4n{oX(vljB zVrM2|gU}1na5`MKNhnmKi6ljG3A;-3u9{B968@?QQXNc16J?;%YATUP!c$Ac5`+f` z^`~Ok+u;~IM!4-b)SQmQ-DMJhnhs-A;321BofZq*xP)pXl}frb*2+R!Q?Qw})`x94E|n+zaNLcx8U!S@b_u> z`z-u@4*ot5e?JF*UuK+tm6=~<${~q@dvW-)eZDnV`e|PH^TBz;>yjFRzh?Mrg}-+A z>x929_&Wf9-SF1~e~01k2>kWG&eYJrTev@@sG-iz6Kj!ZjE+X^qeG#yYmw2Dbo8u! z6bfBhi<~=8N0;rR&dw`XLRLdZuB}C`;_vg~xAT2#kr(jyy8Sz4|Gr=RhGy5MVa+-x z;jQ)LGLo%dYNm?6}xQc%-t|~po@9pll67Xn?V0HU(00o0p?Fm`n@cW zn)JF^U3${vV!^>lx5?^BMDSWzF)4jJ35qH5m-B z)~6>Mf~@VC$$*cwdnemlS;xp^sDX9*COg{TyP9ljWLz2@4PGN_qWH^)`FjelGQs7V_z#oPo<#g-ly|8u6 ziFWNn#KD0n8PBI>DM_1N4}S5pM7V2W11PV!K_qPffR*O6iP`8 zOdv(w4}}o(_=L^vDbXJ5Y0((#nKR`2rl?-XI7;yf>=*=2B8ICyYww`wPU5qWc-}@# z<_LIv780lM?)}n~_5Ss|-mNsW!Tro+`FgjMH`cou5;<>VxY8GBpeO~rUn^b2bZZ`( zV>tX)1;176gC%}VhwIxm*SDGVwKA^1%(Cuku5O#_*Wp?PSGZvPI&yV8Tz|*r z`a8_}RvFj-o@G7NTs=0|--BxvT;YQC`{aV>aQzdT>z^>|yJcMe70Y_7xq5A`8*r_H zD_pStHGx|=T>sqW`sd90i!!c%$+Es`u0EUVU&FNuu5iKnzmTgB!!w=+u77KD{aa@J zXW}Y1G(pL~XIXz)IltT&Kp@Qj3duG@Otbz!vm&@cO3B>zlIm zJ7v7SC1-k_Bd-QjcQ*kqOBQwvmTdh8Ior5C z(TJEYjk>C+Z!@_5cXT}>{T&RFQHC@o|DA08S2^31X_DYc${Y9VUxjMclnwGAc1${~ zk1F?z2?0#_n38SIY8x4iWtv$r_2ZO!-%b^XqRJWTO(ol6y``+9`LXp01sz87?baui zjr*AnCDVdd8aP&m6lmzP(9TaQqMe^su$@R_@~0K+bBf*0&nww|`F&8j3r5)bdZ^`R zv4)?68j$sVV)^sPvI+0~1z`Clo8^~)*(gJLQvQ-+ebr(4OW2qL>g-9jQjtN z+}n`*Byj&zoBN;A)BIC3{{wtgDUpueK|5?WP|3=2`x*}ea zzp)wr4Y0h*{zkDZhvk1zHog!5z%z&mzZt4#zLr9KT2$zo=SYb~t_oIMyS_ zuOi2<*&KgKaO}5!xy12TkYks_@#{9nuM@|wtJZHg9RC}qjlYQ;f6M0h+k)dU>zgHx zzk?k2I~>1dbNm)@{FZ9{uEX*7oHqVGa{P|X@ec&YA=`Hr;!dGr? z(C}6bstVQTB6I7^!g68d8*InuiJR*g+Nz#`$H@#)1?{xl+{NX&+%h_F?TE1F>=Wi5 z>y2%7;oRe_rEb$5Z@c5R_m}JX9$v2N+q_)DQZJQ`$M(=2&08^6BZ*W(1nG2#f-+ON z9i)?)xND=7m-CjZ+uTUphB-bxbPyMc;nhwk4tg!?ha# z4_5dmKf9OaZ_y{hEG1O?V#oFs?Wq~FHiSp zKu0ucJ8lFI7L83}a7<`Yu8^mhNhTpiiO{tsTAax~js|E=Dk3j2N#W?msnb>E14Q#cK<-qu5;e@hqC+8T2I$ver$;Awyx`%7j4Uc$rH*V@fHOda`wII5C z+waf0Jy%{MExlJ}3gr0V;IdPbuGfAr_P3Xg>@Jp*bIUUGJI5{~MRmb#QLLpsVU34O3Ij?_z|BjGC z<)!AI9OzM5HC2M@@WV8b@FwB>3dSqS?GlgKhT}M~mx?m*-WKL_bGiVkNIx_WyQPB< zUC^nS=LH7F!&hyCXY4v)@yUm-p@eCY*=r-mUtV0oxSkJHu&!+*n3U~YE&@_^qY=B>$K@kt zA7V0~{2*&<2mj0r8+}7%k!)rkc_@>-@d-X~nug=IeHeYof$8>p4;b*{Rn>>UAqi zks<8VSpo4kYt124fRnl?QWvcy^gnY_KPWhS(0c8RjXmfQskq;P(V)zdr`m8ffIxj= zB)H$E-ud@GOq#umcl4or3!ydas z6;ElXIQx}JRR%ofO+i-=)h<^{sH)s<%Pr2)%ej4dXCi78w|aUN*WSft@WE{gSIauP zL_RyP9ZSKSH;&J=f+DSM*gU2oB*V2-7 zf$}z%1>N2pZo7ALxNV}xiH3wB%yGgVU0m`Makj4+|Wcmi(-)XIk-VO;)*^v7V{r_ewL*qG zs(|`ZQI=XgV}m%0dveLLh$Qw&GM-3FpJdjj2)>yVUDE*(DASE_Q7C(TnzFS>pJor( z)9f=0ZDBCu>O0m?vGw)5v9X>HeD&>V!}=`Qkzk;*At?7boBih)qH?w7Tfaa)TA!z? zj=YoS-+6cA{xmlfL$-d7O||yUw_0Bm0a5G*{sM70Dg6RNa%`@p#UpD)W3p0 z(*=jWirE9`Bj&TSV`qLHQ|s^rNRedPo9#t-hAx8RN9A{E9S(R1+x~*0`sSKEHyN~b)E5t=&WK_3k+BdfkAV@ z8>Nb#w}B%*h`*cbI{6SS6=0gDt67geOmjCiYyhTZ0E9q$zmjOWcB;plv#$#X(i^!= z9Y`0>JWO-8;DL>@brUw;aogz(6%C~@L?CFz*OQ)(xUnX9MhkNwRT5&= z67;!{S|%T+;Ux@&Z5k$)Rpu*VnUr5*3nD1dW(2qr*z^9HH*<+_-9-EOv~cd%^VDpA z*%#FvNhWsz)VpgOHjR3w2w*4lR)J!_bx{kt2#L(!b!)Y-(lwLoDp1~X2)Ab+u4jdF z#uiWMVE`rsiiZP)7eo!>s)&?gqi6-4N-nL=++3J_4nBkNy}bnvqcY~&G(LUba_-jB zo!pp+g;QW3&sLm-UkSI>@Jy!>KNp!^Yx zo6W>uRhHKdiLnvnsBRxLA>|4(k-=S4l31NYjy98aNDlcUw#7E zz)nY8FB=~O3~)G+uG=&ZsIgQ$QeWdWRul1fxM_=l8rDq7u)C~Z)l?*%RO9h@q-~oS zR*j}35jCDp4Z;zIAsS4l)np=>c6MHHOCV)9EpMpx&9`hhz8Q}8V#KdO@z*ea;lrDrps-^6^EEBX2TgM2F4^} zUat9UKof?jd5CGEH*?m?)ppMJabrJM4{{YF6Y)N-9^vXy1R?eea5c<>G44(N|IEDy zd|bzMFMQ{go$Xk(MJJa8h(dzI_5z9&0g_7+qDYEWg$oL0mw*HU6bdCumc5cCQMTM9 z%XF71*Tk}A$FgI`EpnX1FaGS93q+*j$c|E8oYl7!Bzt4K-oVj;*(b=SD{C+t1 z?%bI(<<88VnRCwna5cuAu&;~q@-1BL=IU0?wsGfnUa^B$-elV?bM*js9pdT{?z)Y; zs=0iWtNq+Q$g488L4~WWyz00^U@55ftjf66lXWugs6^_n%T@sm5RGT6WbSrv$|gD` zcT!?&YIkMBn9{XJ-h0cw{X`EEJxuggqPG*hgJ_CqFVSN}?Yv7TyGL9ya_3Jw z*S_Igj~BI*+kgRq%)#?aP30fG`l^1Gka-akGGlQ1;Fk$FsAh#bvZXYKYIn3=1 zklSY=H-XHTkUk4Jbh6J<&7Wub^P-~YL+BFQsCDMbl;P{t@|&e^K+ZR^Z!-NG?ELl> zP{Eh*$<>h0w-7b0kzvGd6SAI7fj3_VEWb}I!_xN| zT0S)8kV{XKEF2#(t%Wv!TT=d1AQSMXf|;N{)sg8SLeM=!8}cHG2h}ANJn~@3# zu0XM_R$_kH?f7xe1D09Jxmt;C2ebzGrrR1ASA7IbhOUs{i)*!%7DTp+SFWn5t|eMe zbQN=>Lk<5`tB+Ek>A`cPVJN0PGP6Kei!i1w$r7pcY#dAHJiNi(VwW&)SLv7z7(8LU=qO~cPIBRldoJ2^+ z%#ojhGRl?WKjJZYUf*-W)w=sp7D~LRS`J)JvKeRR*>gsaq(jHA~(-6t`Sb>M0{yL9`kc%P$E(Bukeu zHWkL_!;9entARlg5(6v*H!zmMKgA36iz#vR5YicjpN1cQZ-)s$QUl>wvn3H;gNNwr|&re;l zfBS)bd-rVHzW-Qq*Z%F>B=k_ib)s*0l%8)~h=&o; zP}81Y1L$Gu$3`YMgn;&u2@)=%Lkrq?$UUC9>U0>|cWnb*k1z)TIe;kRcfp8$EBBTkarwkZm@Y6sfb%7%>w`2`M73>KPUYO ztbEB?MoQzBO4(aoRYSCvXdTgdqAQ55WL76CkgM_*RAOZci6v1w$zg7B;R*m}mMu&( z)XA+l+i0`Y$ycH}d7n@x=bB~PFE#YJi0b5PU~*wVtTGUr0>rKYacFDwX7t!2>n-Q| zwIP^m&i7k}RDJFF-1N*YMPG+=6o-{SGw@n}-mh;EZhUY)Lf<{66Bm?7_E;^m_0U(O z+$evXvqrGOlNy@0?r|)+Mkt&zbu1%XFekCDuH^+H%dvX!daoo3d2d`MZ^Vv1Mqlxp zuDKo^#0T|}7FZ-y(s0=dYhqGXm^w*o1t+qAsfe^_QrBLBzLAk)v6^vwH(0DAyN_+#zHd8x=k{#fwf(@c(F7AdA_V1e92YSgV%doRjAm}<-a}R3?&{4kThp8odXpXP%$+a4u;hbdUytTx;aKnOj@Aw$`?uA>^2f&|

h-lptIpe;z<>mXEWr^6cO2Du~P4-yR#jS!6z zjS-C#O%UxQx{>G&L^l!L!s_aw$~ATeIUSNJQP-Z;c1boSSD-GMVna~~YTR3yrfq?B zCbKB0gT_6mw`LXlPg^-kK~N>#!Rp9=qjRn{8R~rrb3p-@B%69)+aWNCt2d$dl~*U* zO)yGYMniQnMOHPxP$xr``osE>94_iIv0~);)9+1bYcFQBZw;t3{c4|PRjrDC8YLTLR^ci#St$uOkyd1TD``pzzHes8 z_z|W*!irfx#!TL4*aFPo!iYOUEWDK&>`AT7CabEp75G2RL{mJ?^!Kn_!R=(#*;8c= zknAk7y^zsJkxU~+viGu7b&e!3q^D-bH;2aw<L4A7STBu<~=HLRTLAnYhG) zWDpj(BYme`+r-t-3?lGdyBW1>$tGKbe;2Lo9byeiA(6{xQk2S7bl)`@yDA=ClcnNU z*T@J3jHgY@%gg6fl$Ms>c69J?#m!SlM2b~z^LO{@J@7Mr<%~o^0j(3Yup2&m~uM>1$lkEi?@toi_~{W;KDR z7VrlGQ8nfd#neb75?AAiC@kj^iKvQGK!abYYECUV0Xd}N$ z1C~MtCR-g=l!0xkX42|{VWVnCZyk8{L=rHqk}FkQtL9oQS}7eW%}why&4nHpOS5j-YPEZ_?h5!-1FJTx zy)IiJxf@Uo#FvH8(#Gs6X16v&Ot;nEmUXvC_H|Nz1-D+_;O__!4H69z4HJzJjS`I! zjT21}?IgO9=oYrpXR}JMmULM5qsO4i{VoS%UW5~st8U>MQ>qd6Q>`IL(OLuowbUW_ zC$C4CPHV$0RtvMOxW%F}J9Dv>XtnNe7mE*IA*Zz!oDFS2(VpR5C@D)>vHvlY)Z- zIcWG47a)((TBbsJ3>_7U2u=fvQ`JzO@pg!S&IaL8(j}Qz1?JiXlRm@HT{R^wVPsEW zM0k!OtdgEXAJrm)2P4?b2-C(wYMSXYMuakqV8{BQ63r_{gjZlC*TP;w07#>b2rBsZ zv{J%?mO|W1SWsPfwXOgrPE-H>lCj46cVQt=kbI`4)T+!Xf6ABf5usB}v>p(6SXue< zlrIqGd5-2q$-3oa^Tmmdzh-I|MY+K261##z71wGx6$eLA+^dnvzaC1F3+NuqZX7Z7 z#uFrLguQ4r^U5gH6O*FN!nkHrX!ep+VKrr!9WEytZKIPSiC}jbZrlhqrZDo2Uf2P> zGl1Pt0PYsa-xc8{NY2Pas28&QBL9}MMO_8q+OEh@8UEhN8WupVFN*i3*WdF`A$Nqd zAffgcsc7d7ob6kM@;tnEcfR;!ifJQ_V?3ub3;=AVE$##wo+9gs)+K9P)JRrRIf8Dd z4UR!qT(xvMU@t`T^P^c08jS3NV~96DJUW$bTbkQ|5e@Qn>=S2kB$>>g%b6@WSd)}R2&*`4=`$8x{4+{ z6~lzK32w5C;=kyg zal|gUOf!p!X1eBOr!XqLt7vj)@;goz<{x8Uu#j0cH=-@%aH(hpt2j0?HZa%4$81j^ z+_3QvT<);W7gig<;=75Olfy*SB5Ycgd%ebVxn`M;EGExoCbPbIp4ygN#JuVC_XsoV zvrCJckUtVov6sW{(H|%PH^f3=znX~p0|-W@2E(BU>^5TwH57&2W;~n-+6!YzjRu1; zHRzAV-LtzQY*k?&nuvx&u34i&jYbkNN73g`4FXFw5|4z`L?{+h!;wf>jraq8H5Lg3 z)I=m21QLY1Xx#588YC+Gj;N7vJm#4@DX39@DC(X)1*wr}G^&P!ekfHq9<&$QBM

c+=2zb8*`tZoifDYR)0wel8Dk`8bzH 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

=VKvD_j_= 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 z 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�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

8a+^k&lv zJI>ziUkcJ1dxiXgPfuNOoUNF|9^Bt<2zB?aN}R9~fR8&ay`}zJI$1k2a?l@x_2u>? z<3;6=T3a%U?z~?|Rx!NShvIWZSrfc&8Ch&qEll`QpK zU8D`UJ~cWK8aqwKW$)0CJ~(>u>ln^}H9YR9t7V#8R z`oZ2TW=hd@*!wd5w173@mhRSp1t&wOc-U0wsXVs@*j?A^GP7P($J(2qo*&;QOkFgp z&*L>J&uZtO{0LwD^0`mxZRkW+;$Gw>u@2Ea diff --git a/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc b/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc deleted file mode 100644 index b69064ac765f0f18a653b41d75eeced098798172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11827 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 diff --git a/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc b/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc deleted file mode 100644 index a90af750bb5d351e5f4b937975b86b9c0e69dd25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165338 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

;oB7G##fs?TY%1uw5tp` z=()=FcOc1nN>y~yAxfDZujE-QLxmYmEdhgU;$3weCfDv9xys)?lsFY)Da6Y=P_Z*3JR1OuA6mjiP;f7%O$lY)h;hB(?q z+@CggvWNq%)gS{ctvd@Iz`!f7!~E-e6e6$FmTGBZy^3(Bjd_i`WqiAWxan80#$ss& ziSCdZNOj6QptHyT5RVuxT?Z)-GODowSbX$=%;J=7z1EtZx?dvJRxt4n(5#vDo+WF zQG4rn92s<}T}~809l2nLDRRMGufA$3rpz`{YgB!2A=_lfmEI!OWyjUtV%BZPwcZl8 zh2oneJtTogDwX6iX^y0uQaP!)&y`d|QY6iga3ZMMHNy2PX;qzth0+e>D`59osFSZ` zyOR~&6;i6=G`o@{pwd?Uv3@NWa)h2pcj~I~WaUJn62^Eg5_9^o5OZSJ678)irmFp% zJUjGK6IExbQ=Wd60u7sxda1Ggv#>%QK+Zzh&-ybh4q%HqZ_x|h`EF3`J}4O1kqx0W61Q^{9*?-KSVN~&A*uf}7&OW7zEq>5Ip6W{y@WuwRqedJ|G zS5;Mej{5sn>aPdET_L>{`vy0&n|Z-C1i@*Rg7LJq3|qbh#*@fbFQ@twVZbJCMNY(j zvTz@rCajZh19lrwP3-NMzM_z%7Eg$2yn(7Z6AWO=9U`TZr?9(VB5l=Mk=`h~8zz!5 zd`QHgH_qNkFB%e!{6JuQf=AxVnIyyYXIhnPO}1Dq5emp-M{~w8(yz^P%3h7sb6<19 zcnm?+T7f4xRfGLxE)dTD>K#OK2Sh;R_yORc-@M_0~VPG(rx=J*Hezd z1GX934MW^`Q19WJylymm8+L5Q+F}$im)@$Oi^LXf+HHlr? zyKmpF;mf9gnx7#1iZnu^Pc|vOVm3qXelp=4F*d70nJ$xDQu&mzUEx?~E_8tHICu~V zHSSf&HOcFDMx97t8ra@lz1L|-JRH6$W8Yb`kYe8lZxn`|$!7S5SwZN~HRl*I&Zb0W zRa5VX_{E-jGW}M`V%zdrl_$WtnJ*zT5}j2cr~6dUcfgeiXr5K+EW66K@ndCV^sqOR zp&IdS-Rz(r9Ts5!Ib3+4nw-&iyHQKQ5zasB5FfpYs_?DC4)_k zg;NJXZHzS|4cOe=pf+F)h02le6J(#) z2l_nnJOxPjnf$^KNxOiddJQ#yF3?S(USg;rLoGA>bIAjhx{zE{nKg#G*ie@k>M}!J zX{c)qwVf{f)FMx(>=o2mUTI2~^f?j~`4*+-NqM!BRI*f(%&-Jz$%<5^R1)W&s(cM{ zV{=mr4_kTI#=})ST+PF^JnZ1%Iv%d);RYTiU{1NmBY{_Km-4V>FA;1YY%<89bx6Z0 z!F5R0sikyvqm|KhiC(-;lEKJdhjgB)wM#lt7x)Krh_>^3vuQg;Q?)y2BW$OQ5O5>Z zrFItYk&{Yow*rGm7a_5S6di0h3qHB?Eclg;tOIF3q=tI5q@M29VNhcmxN4n|GEcLO zNRsudT@7&lBnoki`ujA@qxEStMw>Cq&Ez(W#wZ_0<2F*l zKMr(-KvWzhFT`ZJgFxznZi-HlnrpZY35-ohOYpm+AQ3>6m3)Mqq^$3^vyyoGeNerL zeL&>Q=M)E0?5i>76I`d?JdFb^JppH7IeY}zlR(3era?H(o`Ug{q=C(z20luZ_ADn` zOa)np7Odp2?c0%0L72=g9Djv<8iZy69rM2c>2Q=!q~KUMHby!Xp8-;A^tfbCZE`MY ze?=%DvS&`lt89CgZ&b$xUVX;8CO>&{sGYgFe)1+|+ELG$<@yn_;C!$?!zpv$$1O^8hgkaC=V@0@91lSB}?A8%vf*OZ9V4gk_#GWVz=E&&bHV8e~OF)g*yX8A`g$?}p~ z4!YtYw}2XD(Uxh&JfyqiKK-sUvUw;p%D=Jhz;*z+aX7;Vu7G)ikzgBp!C#+9bl)`BSo^2uXp z*0U08YUa+2O(W#x&W!W;n$&51BJ~BhM1zK0K+cS{Qt}R}&hyOW?yzxPsU~>=MLI|~ z@>2mxG5KQE3gx1b;t&tZcsPfL$FvQ{oG+I3Po0g#X-ZjuRv8_r5vv2-R@-J^wNq=x3xNf*gMRN>pjR5~Cn zW=oJ>BCRVWolsy5v(<^cTrB$)SV_dDcQkjs<|X}PohBk&A!ESTt2eV=|H+t!*%wMx z**@*~f>otg@n1e>@5*(tD+D?_&f$Pg@(yI&h2^@K^V3=W;m#Wm(W?USYU{RLdw1^Y z*s-f~gPqxa3Wz7imFKmW<|sjEPGy6Ry%93CUJe~@UZVpVkE$c1!-sMuZD(*AzHEkJ zs?T!fz}Mw8e#w{5t`6ImnwNV66izL*OZ#|k@)W&E-EZaQ@^2bea!l}cQM1TKd%2o;2iL)D>0p>;BN7Lkcx!p)q2CjZUC*L=W`^SQWe5i!tusUepcMit$l z7#Z1Gag|bG$d$xT6X_-7Z0qROL|$gdF>dU4t>Ia3=o>ui3Be;W_W27_KJev*Qa;Hy zM?wm1UPa}+CATY}kmb|zx%fyK3&ZmA`V|o#MtK&E>++*QBC}}ZnR5f5*XzjNVS=z?b1BI zA3QqG;Vs5T>`Aa)%9p@DzXLavyimJTiCF@YrnPGovI3IYu2v`{!q^T~xCO{cyHWwz zO}SmJBIXP?qy@MkDfz(yJzIuxjj$3(H00VIIjr}}XOWiO(4*8yygMWJ3&X@2ke7D&Y)|gd@^kF5YQ&W?Prl(7seB�~c8v?UGd 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 M!Xh9Y)XD@T0fItD@c;k- diff --git a/src/main/resources/flash/model.mustache b/src/main/resources/flash/model.mustache deleted file mode 100644 index c3369514e80..00000000000 --- a/src/main/resources/flash/model.mustache +++ /dev/null @@ -1,40 +0,0 @@ -package {{package}} { - -{{#imports}}import {{import}}; -{{/imports}} - -{{#models}} -{{#model}} - [XmlRootNode(name="{{classname}}")] - public class {{classname}} { - {{#vars}} - - {{#description}}/* {{description}} */ - {{/description}} - - {{#isList}} - // 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}} - public var {{name}}: {{{datatype}}} = {{{defaultValue}}}; - - {{/vars}} - - public function toString(): String { - var str: String = "{{classname}}: "; - {{#vars}} - str += " ({{name}}: " + {{name}} + ")"; - {{/vars}} - return str; - } - - -} -{{/model}} - {{/models}} - -} diff --git a/src/main/resources/flash/modelList.mustache b/src/main/resources/flash/modelList.mustache deleted file mode 100644 index b0c3bd73f83..00000000000 --- a/src/main/resources/flash/modelList.mustache +++ /dev/null @@ -1,23 +0,0 @@ -package {{package}} { - -import com.wordnik.swagger.common.ListWrapper; -{{#imports}}import {{import}}; -{{/imports}} - -{{#models}} -{{#model}} - public class {{classname}}List implements ListWrapper { - // This declaration below of _{{name}}_obj_class is to force flash compiler to include this class - private var _{{classVarName}}_obj_class: {{package}}.{{classname}} = null; - [XmlElements(name="{{classVarName}}", type="{{package}}.{{classname}}")] - public var {{classVarName}}: Array = new Array(); - - public function getList(): Array{ - return {{classVarName}}; - } - -} -{{/model}} - {{/models}} - -} diff --git a/src/main/resources/htmlDocs/bodyParam.mustache b/src/main/resources/htmlDocs/bodyParam.mustache deleted file mode 100644 index 2fd81183a5b..00000000000 --- a/src/main/resources/htmlDocs/bodyParam.mustache +++ /dev/null @@ -1,3 +0,0 @@ -{{#isBodyParam}}

- -
Body Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isBodyParam}} \ No newline at end of file diff --git a/src/main/resources/htmlDocs/formParam.mustache b/src/main/resources/htmlDocs/formParam.mustache deleted file mode 100644 index 97f342e60d7..00000000000 --- a/src/main/resources/htmlDocs/formParam.mustache +++ /dev/null @@ -1,3 +0,0 @@ -{{#isFormParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
- -
Form Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isFormParam}} \ No newline at end of file diff --git a/src/main/resources/htmlDocs/headerParam.mustache b/src/main/resources/htmlDocs/headerParam.mustache deleted file mode 100644 index 903713493be..00000000000 --- a/src/main/resources/htmlDocs/headerParam.mustache +++ /dev/null @@ -1,3 +0,0 @@ -{{#isHeaderParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
- -
Header Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isHeaderParam}} \ No newline at end of file diff --git a/src/main/resources/htmlDocs/index.mustache b/src/main/resources/htmlDocs/index.mustache deleted file mode 100644 index ccd35c8723d..00000000000 --- a/src/main/resources/htmlDocs/index.mustache +++ /dev/null @@ -1,60 +0,0 @@ - - - - API Reference - - - -

{{{appName}}}

-
{{{appDescription}}} for {{partner}}
- {{#infoUrl}}
{{/infoUrl}} - {{#infoEmail}}
Contact Info: {{{infoEmail}}}
{{/infoEmail}} -
{{{licenseInfo}}}
-
{{{licenseUrl}}}
-

Access

-
Access to the API requires an api key to be provided by {{partner}} for all requests. The api key is passed as a header with the name `api_key` and the value provided by Reverb Technologies, Inc. Unless otherwise agreed upon, access to the Reverb API is intended solely for usage by {{partner}} and not third parties.
-

Methods

- {{#apiInfo}} - {{#apis}} - {{#operations}}{{#operation}} -
-
{{httpMethod}}: {{path}}
-
{{nickname}} {{summary}}
-
{{notes}}
- -

Parameters

-
- {{#allParams}}{{>queryParam}}{{>pathParam}}{{>bodyParam}}{{>headerParam}}{{>formParam}} - {{/allParams}} -
-

Return type

- - - - {{#examples}} -

Example data

-
Content-Type: {{{contentType}}}
-
{{{example}}}
- {{/examples}} -
-
- {{/operation}}{{/operations}} - {{/apis}}{{/apiInfo}} - -

Models

- {{#models}} - {{#model}} -
-

{{classname}}

-
- {{#vars}}
{{name}} {{#isNotRequired}}(optional){{/isNotRequired}}
{{datatype}} {{description}}
- {{/vars}} -
-
- {{/model}} - {{/models}} - - - \ No newline at end of file diff --git a/src/main/resources/htmlDocs/pathParam.mustache b/src/main/resources/htmlDocs/pathParam.mustache deleted file mode 100644 index b47805a4f04..00000000000 --- a/src/main/resources/htmlDocs/pathParam.mustache +++ /dev/null @@ -1,3 +0,0 @@ -{{#isPathParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
- -
Path Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isPathParam}} \ No newline at end of file diff --git a/src/main/resources/htmlDocs/queryParam.mustache b/src/main/resources/htmlDocs/queryParam.mustache deleted file mode 100644 index 52147fbd718..00000000000 --- a/src/main/resources/htmlDocs/queryParam.mustache +++ /dev/null @@ -1,3 +0,0 @@ -{{#isQueryParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
- -
Query Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isQueryParam}} \ No newline at end of file diff --git a/src/main/resources/htmlDocs/style.css.mustache b/src/main/resources/htmlDocs/style.css.mustache deleted file mode 100644 index 0421bcc8c3c..00000000000 --- a/src/main/resources/htmlDocs/style.css.mustache +++ /dev/null @@ -1,136 +0,0 @@ -body { - font-family: Trebuchet MS, sans-serif; - font-size: 15px; - color: #444; - margin-right: 24px; -} - -h1 { - font-size: 25px; -} -h2 { - font-size: 20px; -} -h3 { - font-size: 16px; - font-weight: bold; -} -hr { - height: 1px; - border: 0; - color: #ddd; - background-color: #ddd; - display: none; -} - -.app-desc { - clear: both; - margin-left: 20px; -} -.param-name { - width: 100%; -} -.license-info { - margin-left: 20px; -} - -.license-url { - margin-left: 20px; -} - -.model { - margin: 0 0 0px 20px; -} - -.method { - margin-left: 20px; -} - -.method-notes { - margin: 10px 0 20px 0; - font-size: 90%; - color: #555; -} - -pre { - padding: 10px; -} - -pre.get { - background-color: #0f6ab4; -} - -pre.post { - background-color: #10a54a; -} - -pre.put { - background-color: #c5862b; -} - -pre.delete { - background-color: #a41e22; -} - -.huge { - color: #fff; -} - -pre.example { - background-color: #f3f3f3; - padding: 10px; - border: 1px solid #ddd; -} - -code { - white-space: pre; -} - -.nickname { - font-weight: bold; -} - -.method-path { - font-size: 1.5em; - background-color: #0f6ab4; -} - -.parameter { - width: 500px; -} - -.param { - width: 500px; - padding: 10px 0 0 20px; - font-weight: bold; -} - -.param-desc { - width: 700px; - padding: 0 0 0 20px; - color: #777; -} - -.param-type { - font-style: italic; -} - -.field-label { - padding: 0; - margin: 0; - clear: both; -} - -.field-items { - padding: 0 0 15px 0; - margin-bottom: 15px; -} - -.return-type { - clear: both; - padding-bottom: 10px; -} - -.param-header { - font-weight: bold; -} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index c7d0db9d3a2..00000000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - diff --git a/src/main/resources/nodejs/README.mustache b/src/main/resources/nodejs/README.mustache deleted file mode 100644 index 881e7dd92c5..00000000000 --- a/src/main/resources/nodejs/README.mustache +++ /dev/null @@ -1,10 +0,0 @@ -# Swagger generated server - -## Overview -This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the -[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a node.js server. - -This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: - -[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/node) \ No newline at end of file diff --git a/src/main/resources/nodejs/api.mustache b/src/main/resources/nodejs/api.mustache deleted file mode 100644 index 82f0145ce8e..00000000000 --- a/src/main/resources/nodejs/api.mustache +++ /dev/null @@ -1,62 +0,0 @@ -var swagger = require("swagger-node-express"); -var url = require("url"); -var errors = swagger.errors; -var params = swagger.params; - -/* add model includes */ - -function writeResponse (response, data) { - response.header('Access-Control-Allow-Origin', "*"); - response.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); - response.header("Access-Control-Allow-Headers", "Content-Type"); - response.header("Content-Type", "application/json; charset=utf-8"); - response.send(JSON.stringify(data)); -} - -exports.models = models = require("../models.js"); - -{{#operations}} -{{#operation}} -exports.{{nickname}} = { - 'spec': { - "description" : "Operations about pets", - "path" : "{{path}}", - "notes" : "{{{notes}}}", - "summary" : "{{{summary}}}", - "method": "{{httpMethod}}", - "params" : [{{#queryParams}} - params.query("{{paramName}}", "{{description}}", "{{swaggerDataType}}", {{#required}}true{{/required}}{{^required}}false{{/required}}, {{#allowMultiple}}true{{/allowMultiple}}{{^allowMultiple}}false{{/allowMultiple}}, "{{{allowableValues}}}"{{#defaultValue}}, {{{defaultValue}}}{{/defaultValue}}){{#hasMore}},{{/hasMore}} - {{/queryParams}}].concat([{{#pathParams}} - params.path("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} - {{/pathParams}}]).concat([{{#headerParams}} - params.header("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} - {{/headerParams}}]).concat([{{#bodyParams}} - params.body("body", "{{swaggerDataType}}", "{{description}}", {{#required}}{{required}}{{/required}}{{^required}}false{{/required}}) - {{/bodyParams}}]), - {{#returnContainer}} - "type": "{{returnType}}", - "items": { - {{#returnTypeIsPrimitive}}"type": "{{returnContainer}}"{{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}}"$ref": "{{returnContainer}}"{{/returnTypeIsPrimitive}} - }, - // container - {{/returnContainer}} - {{^returnContainer}} - "type" : "{{returnType}}", - {{/returnContainer}} - "responseMessages" : [errors.invalid('id'), errors.notFound('{{returnType}}')], - "nickname" : "{{nickname}}" - }, - 'action': function (req,res) { - {{#requiredParamCount}} - {{#requiredParams}} - if (!req.params.{{baseName}}) { - throw errors.invalid('{{baseName}}'); - } - {{/requiredParams}} - {{/requiredParamCount}} - writeResponse(res, {message: "how about implementing {{nickname}} as a {{httpMethod}} method?"}); - } -}; -{{/operation}} -{{/operations}} \ No newline at end of file diff --git a/src/main/resources/nodejs/main.mustache b/src/main/resources/nodejs/main.mustache deleted file mode 100644 index 6c8be317be6..00000000000 --- a/src/main/resources/nodejs/main.mustache +++ /dev/null @@ -1,52 +0,0 @@ -var express = require("express") - , url = require("url") - , cors = require("cors") - , swagger = require("swagger-node-express") - , db = false - -var app = express(); -app.use(express.bodyParser()); - -var corsOptions = { - credentials: true, - origin: function(origin,callback) { - if(origin===undefined) { - callback(null,false); - } else { - callback(null,true); - } - } -}; - -app.use(cors(corsOptions)); - -{{#basePath}} -var subpath = express(); - -app.use("{{{basePath}}}", subpath); - -swagger.setAppHandler(subpath); -{{/basePath}} -{{^basePath}} -swagger.setAppHandler(app); -{{/basePath}} - -swagger.configureSwaggerPaths("", "api-docs", "") - -var models = require("./app/models.js"); - -{{#apiInfo}} -{{#apis}} -var {{classname}} = require("./{{apiFolder}}/{{classname}}.js"); -{{/apis}} -{{/apiInfo}} - -swagger.addModels(models) - {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}.add{{httpMethod}}({{classname}}.{{nickname}}){{/operation}}{{/operations}} - {{/apis}}{{/apiInfo}}; - -// configures the app -swagger.configure("http://localhost:8002{{basePath}}", "0.1"); - -// start the server -app.listen(8002); diff --git a/src/main/resources/nodejs/models.mustache b/src/main/resources/nodejs/models.mustache deleted file mode 100644 index 133fe7c1515..00000000000 --- a/src/main/resources/nodejs/models.mustache +++ /dev/null @@ -1,3 +0,0 @@ -exports.models = { - {{#models}}{{#model}}"{{classVarName}}": {{{modelJson}}}{{#hasMoreModels}},{{/hasMoreModels}}{{/model}}{{/models}} -} \ No newline at end of file diff --git a/src/main/resources/nodejs/package.mustache b/src/main/resources/nodejs/package.mustache deleted file mode 100755 index 322dc819966..00000000000 --- a/src/main/resources/nodejs/package.mustache +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "{{{artifactId}}}", - "description": "Wordnik node.js server generator", - "version": "{{{artifactVersion}}}", - "homepage": "{{{homepage}}}", - "main": "./{{codeDir}}/main.js", - "engines": { - "node": ">= 0.8.x" - }, - "dependencies": { - "swagger-node-express": ">= 2.0.x", - "connect": ">= 1.8.x", - "cors": "2.1.1", - "express": "3.x" - } -} \ No newline at end of file diff --git a/src/main/resources/objc/Podfile.mustache b/src/main/resources/objc/Podfile.mustache deleted file mode 100644 index ee3f0856b6f..00000000000 --- a/src/main/resources/objc/Podfile.mustache +++ /dev/null @@ -1,3 +0,0 @@ -platform :ios, '6.0' -xcodeproj '{{projectName}}/{{projectName}}.xcodeproj' -pod 'AFNetworking', '~> 1.0' diff --git a/src/main/resources/objc/SWGApiClient.h b/src/main/resources/objc/SWGApiClient.h deleted file mode 100644 index aab60cd0595..00000000000 --- a/src/main/resources/objc/SWGApiClient.h +++ /dev/null @@ -1,64 +0,0 @@ -#import -#import "AFHTTPClient.h" - -@interface SWGApiClient : AFHTTPClient - -@property(nonatomic, assign) NSURLRequestCachePolicy cachePolicy; -@property(nonatomic, assign) NSTimeInterval timeoutInterval; -@property(nonatomic, assign) BOOL logRequests; -@property(nonatomic, assign) BOOL logCacheHits; -@property(nonatomic, assign) BOOL logServerResponses; -@property(nonatomic, assign) BOOL logJSON; -@property(nonatomic, assign) BOOL logHTTP; -@property(nonatomic, readonly) NSOperationQueue* queue; - -+(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl; - -+(NSOperationQueue*) sharedQueue; - -+(void)setLoggingEnabled:(bool) state; - -+(void)clearCache; - -+(void)setCacheEnabled:(BOOL) enabled; - -+(unsigned long)requestQueueSize; - -+(void) setOfflineState:(BOOL) state; - -+(AFNetworkReachabilityStatus) getReachabilityStatus; - -+(NSNumber*) nextRequestId; - -+(NSNumber*) queueRequest; - -+(void) cancelRequest:(NSNumber*)requestId; - -+(NSString*) escape:(id)unescaped; - -+(void) setReachabilityChangeBlock:(void(^)(int))changeBlock; - -+(void) configureCacheReachibilityForHost:(NSString*)host; - --(void)setHeaderValue:(NSString*) value - forKey:(NSString*) forKey; - --(NSNumber*) dictionary:(NSString*) path - method:(NSString*) method - queryParams:(NSDictionary*) queryParams - body:(id) body - headerParams:(NSDictionary*) headerParams - requestContentType:(NSString*) requestContentType - responseContentType:(NSString*) responseContentType - completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock; - --(NSNumber*) stringWithCompletionBlock:(NSString*) path - method:(NSString*) method - queryParams:(NSDictionary*) queryParams - body:(id) body - headerParams:(NSDictionary*) headerParams - requestContentType:(NSString*) requestContentType - responseContentType:(NSString*) responseContentType - completionBlock:(void (^)(NSString*, NSError *))completionBlock; -@end - diff --git a/src/main/resources/objc/SWGApiClient.m b/src/main/resources/objc/SWGApiClient.m deleted file mode 100644 index 0b8be93ab5d..00000000000 --- a/src/main/resources/objc/SWGApiClient.m +++ /dev/null @@ -1,419 +0,0 @@ -#import "SWGApiClient.h" -#import "SWGFile.h" - -#import "AFJSONRequestOperation.h" - -@implementation SWGApiClient - -static long requestId = 0; -static bool offlineState = false; -static NSMutableSet * queuedRequests = nil; -static bool cacheEnabled = false; -static AFNetworkReachabilityStatus reachabilityStatus = AFNetworkReachabilityStatusNotReachable; -static NSOperationQueue* sharedQueue; -static void (^reachabilityChangeBlock)(int); -static bool loggingEnabled = false; - -+(void)setLoggingEnabled:(bool) state { - loggingEnabled = state; -} - -+(void)clearCache { - [[NSURLCache sharedURLCache] removeAllCachedResponses]; -} - -+(void)setCacheEnabled:(BOOL)enabled { - cacheEnabled = enabled; -} - -+(void)configureCacheWithMemoryAndDiskCapacity:(unsigned long) memorySize - diskSize:(unsigned long) diskSize { - NSAssert(memorySize > 0, @"invalid in-memory cache size"); - NSAssert(diskSize >= 0, @"invalid disk cache size"); - - NSURLCache *cache = - [[NSURLCache alloc] - initWithMemoryCapacity:memorySize - diskCapacity:diskSize - diskPath:@"swagger_url_cache"]; - - [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]]; - [client registerHTTPOperationClass:[AFJSONRequestOperation class]]; - client.parameterEncoding = AFJSONParameterEncoding; - [_pool setValue:client forKey:baseUrl ]; - if(loggingEnabled) - NSLog(@"new client for path %@", baseUrl); - } - if(loggingEnabled) - NSLog(@"returning client for path %@", baseUrl); - return client; - } -} - --(void)setHeaderValue:(NSString*) value - forKey:(NSString*) forKey { - [self setDefaultHeader:forKey value:value]; -} - -+(unsigned long)requestQueueSize { - return [queuedRequests count]; -} - -+(NSNumber*) nextRequestId { - long nextId = ++requestId; - if(loggingEnabled) - NSLog(@"got id %ld", nextId); - return [NSNumber numberWithLong:nextId]; -} - -+(NSNumber*) queueRequest { - NSNumber* requestId = [SWGApiClient nextRequestId]; - if(loggingEnabled) - NSLog(@"added %@ to request queue", requestId); - [queuedRequests addObject:requestId]; - return requestId; -} - -+(void) cancelRequest:(NSNumber*)requestId { - [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(matchingItems.count == 1) { - if(loggingEnabled) - NSLog(@"removing request id %@", requestId); - [queuedRequests removeObject:requestId]; - return true; - } - else - return false; -} - --(id)initWithBaseURL:(NSURL *)url { - self = [super initWithBaseURL:url]; - if (!self) - return nil; - return self; -} - -+(AFNetworkReachabilityStatus) getReachabilityStatus { - return reachabilityStatus; -} - -+(void) setReachabilityChangeBlock:(void(^)(int))changeBlock { - reachabilityChangeBlock = changeBlock; -} - -+(void) setOfflineState:(BOOL) state { - offlineState = state; -} - -+(void) configureCacheReachibilityForHost:(NSString*)host { - [[SWGApiClient sharedClientFromPool:host ] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { - reachabilityStatus = status; - switch (status) { - case AFNetworkReachabilityStatusUnknown: - if(loggingEnabled) - NSLog(@"reachability changed to AFNetworkReachabilityStatusUnknown"); - [SWGApiClient setOfflineState:true]; - break; - - case AFNetworkReachabilityStatusNotReachable: - if(loggingEnabled) - NSLog(@"reachability changed to AFNetworkReachabilityStatusNotReachable"); - [SWGApiClient setOfflineState:true]; - break; - - case AFNetworkReachabilityStatusReachableViaWWAN: - if(loggingEnabled) - NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWWAN"); - [SWGApiClient setOfflineState:false]; - break; - - case AFNetworkReachabilityStatusReachableViaWiFi: - if(loggingEnabled) - NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWiFi"); - [SWGApiClient setOfflineState:false]; - break; - default: - break; - } - // call the reachability block, if configured - if(reachabilityChangeBlock != nil) { - reachabilityChangeBlock(status); - } - }]; -} - --(NSString*) pathWithQueryParamsToString:(NSString*) path - queryParams:(NSDictionary*) queryParams { - NSString * separator = nil; - int counter = 0; - - NSMutableString * requestUrl = [NSMutableString stringWithFormat:@"%@", path]; - if(queryParams != nil){ - for(NSString * key in [queryParams keyEnumerator]){ - if(counter == 0) separator = @"?"; - else separator = @"&"; - NSString * value; - if([[queryParams valueForKey:key] isKindOfClass:[NSString class]]){ - value = [SWGApiClient escape:[queryParams valueForKey:key]]; - } - else { - value = [NSString stringWithFormat:@"%@", [queryParams valueForKey:key]]; - } - [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, - [SWGApiClient escape:key], value]]; - counter += 1; - } - } - return requestUrl; -} - -- (NSString*)descriptionForRequest:(NSURLRequest*)request { - return [[request URL] absoluteString]; -} - -- (void)logRequest:(NSURLRequest*)request { - NSLog(@"request: %@", [self descriptionForRequest:request]); -} - -- (void)logResponse:(id)data forRequest:(NSURLRequest*)request error:(NSError*)error { - NSLog(@"request: %@ response: %@ ", [self descriptionForRequest:request], data ); -} - - --(NSNumber*) dictionary:(NSString*) path - method:(NSString*) method - queryParams:(NSDictionary*) queryParams - body:(id) body - headerParams:(NSDictionary*) headerParams - requestContentType:(NSString*) requestContentType - responseContentType:(NSString*) responseContentType - completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock { - - NSMutableURLRequest * request = nil; - - if ([body isKindOfClass:[SWGFile class]]){ - SWGFile * file = (SWGFile*) body; - - request = [self multipartFormRequestWithMethod:@"POST" - path:path - parameters:nil - constructingBodyWithBlock: ^(id formData) { - [formData appendPartWithFileData:[file data] - name:@"image" - fileName:[file name] - mimeType:[file mimeType]]; - }]; - } - else { - request = [self requestWithMethod:method - path:[self pathWithQueryParamsToString:path queryParams:queryParams] - parameters:body]; - } - 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(body != nil) { - if([body isKindOfClass:[NSDictionary class]] || [body isKindOfClass:[NSArray class]]){ - [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; - } - else if ([body isKindOfClass:[SWGFile class]]) {} - else { - NSAssert(false, @"unsupported post type!"); - } - } - if(headerParams != nil){ - for(NSString * key in [headerParams keyEnumerator]){ - [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; - } - } - [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; - - // Always disable cookies! - [request setHTTPShouldHandleCookies:NO]; - - - if (self.logRequests) { - [self logRequest:request]; - } - - NSNumber* requestId = [SWGApiClient queueRequest]; - AFJSONRequestOperation *op = - [AFJSONRequestOperation - JSONRequestOperationWithRequest:request - success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { - if([self executeRequestWithId:requestId]) { - if(self.logServerResponses) - [self logResponse:JSON forRequest:request error:nil]; - completionBlock(JSON, nil); - } - } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) { - if([self executeRequestWithId:requestId]) { - if(self.logServerResponses) - [self logResponse:nil forRequest:request error:error]; - completionBlock(nil, error); - } - } - ]; - - [self enqueueHTTPRequestOperation:op]; - return requestId; -} - --(NSNumber*) stringWithCompletionBlock:(NSString*) path - method:(NSString*) method - queryParams:(NSDictionary*) queryParams - body:(id) body - headerParams:(NSDictionary*) headerParams - requestContentType:(NSString*) requestContentType - responseContentType:(NSString*) responseContentType - completionBlock:(void (^)(NSString*, NSError *))completionBlock { - AFHTTPClient *client = self; - client.parameterEncoding = AFJSONParameterEncoding; - - NSMutableURLRequest * request = nil; - - if ([body isKindOfClass:[SWGFile class]]){ - SWGFile * file = (SWGFile*) body; - - request = [self multipartFormRequestWithMethod:@"POST" - path:path - parameters:nil - constructingBodyWithBlock: ^(id formData) { - [formData appendPartWithFileData:[file data] - name:@"image" - fileName:[file name] - mimeType:[file mimeType]]; - }]; - } - else { - request = [self requestWithMethod:method - path:[self pathWithQueryParamsToString:path queryParams:queryParams] - parameters:body]; - } - - 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(body != nil) { - if([body isKindOfClass:[NSDictionary class]]){ - [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; - } - else if ([body isKindOfClass:[SWGFile class]]){} - else { - NSAssert(false, @"unsupported post type!"); - } - } - if(headerParams != nil){ - for(NSString * key in [headerParams keyEnumerator]){ - [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; - } - } - [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; - - // Always disable cookies! - [request setHTTPShouldHandleCookies:NO]; - - NSNumber* requestId = [SWGApiClient queueRequest]; - AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; - [op setCompletionBlockWithSuccess: - ^(AFHTTPRequestOperation *resp, - id responseObject) { - NSString *response = [resp responseString]; - if([self executeRequestWithId:requestId]) { - if(self.logServerResponses) - [self logResponse:responseObject forRequest:request error:nil]; - completionBlock(response, nil); - } - } failure:^(AFHTTPRequestOperation *operation, NSError *error) { - if([self executeRequestWithId:requestId]) { - if(self.logServerResponses) - [self logResponse:nil forRequest:request error:error]; - completionBlock(nil, error); - } - }]; - - [self enqueueHTTPRequestOperation:op]; - return requestId; -} - -@end diff --git a/src/main/resources/objc/SWGDate.h b/src/main/resources/objc/SWGDate.h deleted file mode 100644 index 2c6c7cfe01b..00000000000 --- a/src/main/resources/objc/SWGDate.h +++ /dev/null @@ -1,12 +0,0 @@ -#import -#import "SWGObject.h" - -@interface SWGDate : SWGObject { -@private - NSDate *_date; -} -@property(nonatomic, readonly) NSDate* date; - -- (id) initWithValues: (NSString*)input; --(NSString*) toString; -@end \ No newline at end of file diff --git a/src/main/resources/objc/SWGDate.m b/src/main/resources/objc/SWGDate.m deleted file mode 100644 index 07a1405626b..00000000000 --- a/src/main/resources/objc/SWGDate.m +++ /dev/null @@ -1,34 +0,0 @@ -#import "SWGDate.h" - -@implementation SWGDate - -@synthesize date = _date; - -- (id) initWithValues:(NSString*)input { - if([input isKindOfClass:[NSString class]]){ - NSDateFormatter* df = [NSDateFormatter new]; - NSLocale *locale = [[NSLocale new] - initWithLocaleIdentifier:@"en_US_POSIX"]; - [df setLocale:locale]; - [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; - - _date = [df dateFromString:input]; - } - else if([input isKindOfClass:[NSNumber class]]) { - NSTimeInterval interval = [input doubleValue]; - _date = [[NSDate alloc] initWithTimeIntervalSince1970:interval]; - } - return self; -} - --(NSString*) toString { - NSDateFormatter* df = [NSDateFormatter new]; - NSLocale *locale = [[NSLocale new] - initWithLocaleIdentifier:@"en_US_POSIX"]; - [df setLocale:locale]; - [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; - - return [df stringFromDate:_date]; -} - -@end \ No newline at end of file diff --git a/src/main/resources/objc/SWGFile.h b/src/main/resources/objc/SWGFile.h deleted file mode 100644 index fe6e81c289d..00000000000 --- a/src/main/resources/objc/SWGFile.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -@interface SWGFile : NSObject - -@property(nonatomic, readonly) NSString* name; -@property(nonatomic, readonly) NSString* mimeType; -@property(nonatomic, readonly) NSData* data; - -- (id) initWithNameData: (NSString*) filename - mimeType: (NSString*) mimeType - data: (NSData*) data; - - @end \ No newline at end of file diff --git a/src/main/resources/objc/SWGFile.m b/src/main/resources/objc/SWGFile.m deleted file mode 100644 index 42552767af4..00000000000 --- a/src/main/resources/objc/SWGFile.m +++ /dev/null @@ -1,26 +0,0 @@ -#import "SWGFile.h" - -@implementation SWGFile - -@synthesize name = _name; -@synthesize mimeType = _mimeType; -@synthesize data = _data; - -- (id) init { - self = [super init]; - return self; -} - -- (id) initWithNameData: (NSString*) filename - mimeType: (NSString*) fileMimeType - data: (NSData*) data { - self = [super init]; - if(self) { - _name = filename; - _mimeType = fileMimeType; - _data = data; - } - return self; -} - -@end \ No newline at end of file diff --git a/src/main/resources/objc/SWGObject.h b/src/main/resources/objc/SWGObject.h deleted file mode 100644 index 031bae69279..00000000000 --- a/src/main/resources/objc/SWGObject.h +++ /dev/null @@ -1,6 +0,0 @@ -#import - -@interface SWGObject : NSObject -- (id) initWithValues:(NSDictionary*)dict; -- (NSDictionary*) asDictionary; -@end diff --git a/src/main/resources/objc/SWGObject.m b/src/main/resources/objc/SWGObject.m deleted file mode 100644 index 9b37b3592b1..00000000000 --- a/src/main/resources/objc/SWGObject.m +++ /dev/null @@ -1,17 +0,0 @@ -#import "SWGObject.h" - -@implementation SWGObject - -- (id) initWithValues:(NSDictionary*)dict { - return self; -} - -- (NSDictionary*) asDictionary{ - return [NSDictionary init]; -} - -- (NSString*)description { - return [NSString stringWithFormat:@"%@ %@", [super description], [self asDictionary]]; -} - -@end diff --git a/src/main/resources/objc/api-body.mustache b/src/main/resources/objc/api-body.mustache deleted file mode 100644 index 22e2262668b..00000000000 --- a/src/main/resources/objc/api-body.mustache +++ /dev/null @@ -1,234 +0,0 @@ -{{#operations}} -#import "{{classname}}.h" -#import "SWGFile.h" -#import "SWGApiClient.h" -{{#imports}}#import "{{import}}.h" -{{/imports}} -{{newline}} - - -@implementation {{classname}} -static NSString * basePath = @"{{basePath}}"; - -+({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key { - static {{classname}}* singletonAPI = nil; - - if (singletonAPI == nil) { - singletonAPI = [[{{classname}} alloc] init]; - [singletonAPI addHeader:headerValue forKey:key]; - } - return singletonAPI; -} - -+(void) setBasePath:(NSString*)path { - basePath = path; -} - -+(NSString*) getBasePath { - return basePath; -} - --(SWGApiClient*) apiClient { - return [SWGApiClient sharedClientFromPool:basePath]; -} - --(void) addHeader:(NSString*)value forKey:(NSString*)key { - [[self apiClient] setHeaderValue:value forKey:key]; -} - --(id) init { - self = [super init]; - [self apiClient]; - return self; -} - --(void) setHeaderValue:(NSString*) value - forKey:(NSString*)key { - [[self apiClient] setHeaderValue:value forKey:key]; -} - --(unsigned long) requestQueueSize { - return [SWGApiClient requestQueueSize]; -} - - -{{#operation}} --(NSNumber*) {{nickname}}WithCompletionBlock{{^allParams}}: {{/allParams}}{{#allParams}}{{#secondaryParam}} - {{paramName}}{{/secondaryParam}}:({{{dataType}}}) {{paramName}}{{newline}} {{/allParams}} - {{#returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock{{/returnBaseType}} - {{^returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock{{/returnBaseType}} { - - id m_body = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}nil{{/bodyParam}}; - NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@{{path}}", basePath]; - - // 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: [SWGApiClient escape:{{paramName}}]]; - {{/pathParams}} - - NSString* requestContentType = @"application/json"; - NSString* responseContentType = @"application/json"; - - NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; - {{#queryParams}}if({{paramName}} != nil) - queryParams[@"{{baseName}}"] = {{paramName}};{{/queryParams}} - NSMutableDictionary* headerParams = [[NSMutableDictionary alloc] init]; - {{#headerParams}}if({{paramName}} != nil) - headerParams[@"{{baseName}}"] = {{paramName}};{{/headerParams}} - - id bodyDictionary = nil; - {{#bodyParam}} - if(m_body != nil && [m_body isKindOfClass:[NSArray class]]){ - NSMutableArray * objs = [[NSMutableArray alloc] init]; - for (id dict in (NSArray*)m_body) { - if([dict respondsToSelector:@selector(asDictionary)]) { - [objs addObject:[(SWGObject*)dict asDictionary]]; - } - else{ - [objs addObject:dict]; - } - } - bodyDictionary = objs; - } - else if([m_body respondsToSelector:@selector(asDictionary)]) { - bodyDictionary = [(SWGObject*)m_body asDictionary]; - } - else if([m_body isKindOfClass:[NSString class]]) { - // convert it to a dictionary - NSError * error; - NSString * str = (NSString*)m_body; - NSDictionary *JSON = - [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] - options:NSJSONReadingMutableContainers - error:&error]; - bodyDictionary = JSON; - } - else if([m_body isKindOfClass: [SWGFile class]]) { - requestContentType = @"form-data"; - bodyDictionary = m_body; - } - else{ - NSLog(@"don't know what to do with %@", m_body); - } - - {{/bodyParam}} - - {{#requiredParamCount}} - {{#requiredParams}} - if({{paramName}} == nil) { - // error - } - {{/requiredParams}} - {{/requiredParamCount}} - - SWGApiClient* client = [SWGApiClient sharedClientFromPool:basePath]; - - {{#returnContainer}} - return [client dictionary: requestUrl - method: @"{{httpMethod}}" - queryParams: queryParams - body: bodyDictionary - headerParams: headerParams - requestContentType: requestContentType - responseContentType: responseContentType - completionBlock: ^(NSDictionary *data, NSError *error) { - if (error) { - {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} - {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} - return; - } - - {{#returnBaseType}} - if([data isKindOfClass:[NSArray class]]){ - NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[data count]]; - for (NSDictionary* dict in (NSArray*)data) { - {{#returnTypeIsPrimitive}} - // {{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}"){{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}}{{/instantiationType}}{{newline}} - {{returnBaseType}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data]; - {{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}} - {{{returnBaseType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: dict]; - {{/returnTypeIsPrimitive}} - [objs addObject:d]; - } - completionBlock(objs, nil); - } - {{#returnSimpleType}} - {{#returnTypeIsPrimitive}}{{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data], nil;{{/returnBaseType}} - {{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}} - {{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data], nil);{{/returnBaseType}} - {{/returnTypeIsPrimitive}} - {{/returnSimpleType}} - - {{/returnBaseType}} - }]; - {{/returnContainer}} - - {{#returnSimpleType}} - {{#returnTypeIsPrimitive}} - {{#returnBaseType}} - return [client stringWithCompletionBlock: requestUrl - method: @"{{httpMethod}}" - queryParams: queryParams - body: bodyDictionary - headerParams: headerParams - requestContentType: requestContentType - responseContentType: responseContentType - completionBlock: ^(NSString *data, NSError *error) { - if (error) { - completionBlock(nil, error); - return; - } - {{returnBaseType}} *result = data ? [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data] : nil; - completionBlock(result, nil); - }];{{/returnBaseType}} - {{^returnBaseType}} - return [client stringWithCompletionBlock:requestUrl - method:@"{{httpMethod}}" - queryParams:queryParams - body:bodyDictionary - headerParams:headerParams - requestContentType: requestContentType - responseContentType: responseContentType - completionBlock:^(NSString *data, NSError *error) { - if (error) { - completionBlock(error); - return; - } - completionBlock(nil); - }]; - {{/returnBaseType}}{{/returnTypeIsPrimitive}} - {{#returnBaseType}}{{^returnTypeIsPrimitive}} - return [client dictionary:requestUrl - method:@"{{httpMethod}}" - queryParams:queryParams - body:bodyDictionary - headerParams:headerParams - requestContentType:requestContentType - responseContentType:responseContentType - completionBlock:^(NSDictionary *data, NSError *error) { - if (error) { - {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} - {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} - return; - } - {{#returnBaseType}} - {{returnBaseType}} *result = nil; - if (data) { - result = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data]; - } - {{#returnBaseType}}completionBlock(result , nil);{{/returnBaseType}} - {{/returnBaseType}} - }]; - {{/returnTypeIsPrimitive}}{{/returnBaseType}}{{/returnSimpleType}} -{{newline}} -} - -{{/operation}} - -{{newline}} -{{/operations}} -@end \ No newline at end of file diff --git a/src/main/resources/objc/api-header.mustache b/src/main/resources/objc/api-header.mustache deleted file mode 100644 index 7bc55a0fade..00000000000 --- a/src/main/resources/objc/api-header.mustache +++ /dev/null @@ -1,29 +0,0 @@ -#import -{{#imports}}#import "{{import}}.h" -{{/imports}} -{{newline}} - -{{#operations}} -@interface {{classname}}: NSObject - --(void) addHeader:(NSString*)value forKey:(NSString*)key; --(unsigned long) requestQueueSize; -+({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; -+(void) setBasePath:(NSString*)basePath; -+(NSString*) getBasePath; -{{#operation}} -/** - - {{#summary}}{{{summary}}}{{/summary}} - {{#notes}}{{{notes}}}{{/notes}} - - {{#allParams}}@param {{paramName}} {{description}} - {{/allParams}} - */ --(NSNumber*) {{nickname}}WithCompletionBlock {{^allParams}}:{{/allParams}}{{#allParams}}{{#secondaryParam}} - {{paramName}}{{/secondaryParam}}: ({{{dataType}}}) {{paramName}}{{/allParams}} -{{#returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock;{{/returnBaseType}} -{{^returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock;{{/returnBaseType}} -{{/operation}} -{{/operations}} -@end \ No newline at end of file diff --git a/src/main/resources/objc/model-body.mustache b/src/main/resources/objc/model-body.mustache deleted file mode 100644 index 43555d48a19..00000000000 --- a/src/main/resources/objc/model-body.mustache +++ /dev/null @@ -1,94 +0,0 @@ -{{#models}} -{{#model}} -#import "SWGDate.h" -#import "{{classname}}.h" - -@implementation {{classname}}{{#parent}}: {{parent}}{{/parent}} - -{{#hasVars}} --(id){{#vars}}{{name}}: ({{datatype}}) {{name}}{{^hasMore}} { {{/hasMore}} - {{/vars}} - {{#vars}}_{{name}} = {{name}}; - {{/vars}} - return self; -} -{{/hasVars}} --(id) initWithValues:(NSDictionary*)dict -{ - self = [super init]; - if(self) { - {{#vars}}{{#isPrimitiveType}}_{{name}} = dict[@"{{baseName}}"];{{/isPrimitiveType}} - {{#complexType}}id {{name}}_dict = dict[@"{{baseName}}"];{{#isContainer}} - if([{{name}}_dict isKindOfClass:[NSArray class]]) { - NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[(NSArray*){{name}}_dict count]]; - if([(NSArray*){{name}}_dict count] > 0) { - for (NSDictionary* dict in (NSArray*){{name}}_dict) { - {{{complexType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc] initWithValues:dict]; - [objs addObject:d]; - } - _{{{name}}} = [[NSArray alloc] initWithArray:objs]; - } - else { - _{{name}} = [[NSArray alloc] init]; - } - } - else { - _{{name}} = [[NSArray alloc] init]; - }{{/isContainer}} - {{#isNotContainer}}if({{name}}_dict != nil) - _{{name}} = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc]initWithValues:{{name}}_dict]; - {{/isNotContainer}} - {{/complexType}}{{/vars}} - } - return self; -} - --(NSDictionary*) asDictionary { - NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; - {{#vars}}{{#complexType}} - if(_{{name}} != nil){ - {{#isContainer}} - if([_{{name}} isKindOfClass:[NSArray class]]){ - NSMutableArray * array = [[NSMutableArray alloc] init]; - for( {{complexType}} *{{name}} in _{{name}}) { - [array addObject:[(SWGObject*){{name}} asDictionary]]; - } - dict[@"{{name}}"] = array; - } - {{/isContainer}} - {{^isContainer}} - if(_{{name}} && [_{{name}} isKindOfClass:[SWGDate class]]) { - NSString * dateString = [(SWGDate*)_{{name}} toString]; - if(dateString){ - dict[@"{{name}}"] = dateString; - } - } - else { - if(_{{name}} != nil) - dict[@"{{baseName}}"] = [(SWGObject*)_{{name}} asDictionary]; - } - {{/isContainer}} - } - {{/complexType}} - {{#isPrimitiveType}}{{#isNotContainer}} - if(_{{name}} != nil) - dict[@"{{baseName}}"] = _{{name}}; - {{/isNotContainer}} - {{#isContainer}} - if(_{{name}} != nil) { - if([_{{name}} isKindOfClass:[NSArray class]]) { - dict[@"_{{name}}"] = [[NSArray alloc] initWithArray: (NSArray*) _{{name}} copyItems:true]; - } - else if([_{{name}} isKindOfClass:[NSDictionary class]]) { - dict[@"{{name}}"] = [[NSDictionary alloc] initWithDictionary:(NSDictionary*)_{{name}} copyItems:true]; - } - } - {{/isContainer}} - {{/isPrimitiveType}}{{/vars}} - NSDictionary* output = [dict copy]; - return output; -} - -{{/model}} -@end -{{/models}} diff --git a/src/main/resources/objc/model-header.mustache b/src/main/resources/objc/model-header.mustache deleted file mode 100644 index e8dc61316e0..00000000000 --- a/src/main/resources/objc/model-header.mustache +++ /dev/null @@ -1,24 +0,0 @@ -#import -#import "SWGObject.h" -{{#imports}}#import "{{import}}.h" -{{/imports}} -{{newline}} -{{#models}} -{{#model}} - -@interface {{classname}} : {{^parent}}SWGObject{{/parent}}{{#parent}}{{parent}}{{/parent}} - -{{#vars}} -@property(nonatomic) {{datatype}} {{name}}; {{#description}}/* {{{description}}} {{#isNotRequired}}[optional]{{/isNotRequired}} */{{/description}}{{newline}} -{{/vars}} -{{#hasVars}} -- (id) {{#vars}}{{name}}: ({{datatype}}) {{name}}{{#hasMore}} - {{/hasMore}}{{^hasMore}};{{/hasMore}} - {{/vars}} -{{/hasVars}} -- (id) initWithValues: (NSDictionary*)dict; -- (NSDictionary*) asDictionary; -{{newline}} -@end -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/php/Swagger.mustache b/src/main/resources/php/Swagger.mustache deleted file mode 100644 index 7e1f24f49b6..00000000000 --- a/src/main/resources/php/Swagger.mustache +++ /dev/null @@ -1,231 +0,0 @@ -apiKey = $apiKey; - $this->apiServer = $apiServer; - } - - - /** - * @param string $resourcePath path to method endpoint - * @param string $method method to call - * @param array $queryParams parameters to be place in query URL - * @param array $postData parameters to be placed in POST body - * @param array $headerParams parameters to be place in request header - * @return mixed - */ - public function callAPI($resourcePath, $method, $queryParams, $postData, - $headerParams) { - - $headers = array(); - - # Allow API key from $headerParams to override default - $added_api_key = False; - if ($headerParams != null) { - foreach ($headerParams as $key => $val) { - $headers[] = "$key: $val"; - if ($key == 'api_key') { - $added_api_key = True; - } - } - } - if (! $added_api_key) { - $headers[] = "api_key: " . $this->apiKey; - } - - if (is_object($postData) or is_array($postData)) { - $postData = json_encode($this->sanitizeForSerialization($postData)); - } - - $url = $this->apiServer . $resourcePath; - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_TIMEOUT, 5); - // return the result on success, rather than just TRUE - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); - - if (! empty($queryParams)) { - $url = ($url . '?' . http_build_query($queryParams)); - } - - if ($method == self::$POST) { - curl_setopt($curl, CURLOPT_POST, true); - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$PUT) { - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method == self::$DELETE) { - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); - curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - } else if ($method != self::$GET) { - throw new Exception('Method ' . $method . ' is not recognized.'); - } - curl_setopt($curl, CURLOPT_URL, $url); - - // Make the request - $response = curl_exec($curl); - $response_info = curl_getinfo($curl); - - // Handle the response - if ($response_info['http_code'] == 0) { - throw new Exception("TIMEOUT: api call to " . $url . - " took more than 5s to return" ); - } else if ($response_info['http_code'] == 200) { - $data = json_decode($response); - } else if ($response_info['http_code'] == 401) { - throw new Exception("Unauthorized API request to " . $url . - ": ".json_decode($response)->message ); - } else if ($response_info['http_code'] == 404) { - $data = null; - } else { - throw new Exception("Can't connect to the api: " . $url . - " response code: " . - $response_info['http_code']); - } - return $data; - } - - /** - * Build a JSON POST object - */ - protected function sanitizeForSerialization($data) - { - if (is_scalar($data) || null === $data) { - $sanitized = $data; - } else if ($data instanceof \DateTime) { - $sanitized = $data->format(\DateTime::ISO8601); - } else if (is_array($data)) { - foreach ($data as $property => $value) { - $data[$property] = $this->sanitizeForSerialization($value); - } - $sanitized = $data; - } else if (is_object($data)) { - $values = array(); - foreach (array_keys($data::$swaggerTypes) as $property) { - $values[$property] = $this->sanitizeForSerialization($data->$property); - } - $sanitized = $values; - } else { - $sanitized = (string)$data; - } - - return $sanitized; - } - - /** - * Take value and turn it into a string suitable for inclusion in - * the path, by url-encoding. - * @param string $value a string which will be part of the path - * @return string the serialized object - */ - public static function toPathValue($value) { - return rawurlencode($value); - } - - /** - * Take value and turn it into a string suitable for inclusion in - * the query, by imploding comma-separated if it's an object. - * If it's a string, pass through unchanged. It will be url-encoded - * later. - * @param object $object an object to be serialized to a string - * @return string the serialized object - */ - public static function toQueryValue($object) { - if (is_array($object)) { - return implode(',', $object); - } else { - return $object; - } - } - - /** - * Just pass through the header value for now. Placeholder in case we - * find out we need to do something with header values. - * @param string $value a string which will be part of the header - * @return string the header string - */ - public static function toHeaderValue($value) { - return $value; - } - - /** - * Deserialize a JSON string into an object - * - * @param object $object object or primitive to be deserialized - * @param string $class class name is passed as a string - * @return object an instance of $class - */ - - public static function deserialize($data, $class) - { - if (null === $data) { - $deserialized = null; - } elseif (substr($class, 0, 4) == 'map[') { - $inner = substr($class, 4, -1); - $values = array(); - if(strrpos($inner, ",") !== false) { - $subClass = explode(',', $inner, 2)[1]; - foreach ($data as $key => $value) { - $values[] = array($key => self::deserialize($value, $subClass)); - } - } - $deserialized = $values; - } elseif (substr($class, 0, 6) == 'array[') { - $subClass = substr($class, 6, -1); - foreach ($data as $key => $value) { - $values[] = self::deserialize($value, $subClass); - } - $deserialized = $values; - } elseif ($class == 'DateTime') { - $deserialized = new \DateTime($data); - } elseif (in_array($class, array('string', 'int', 'float', 'bool'))) { - settype($data, $class); - $deserialized = $data; - } else { - $instance = new $class(); - foreach ($instance::$swaggerTypes as $property => $type) { - if (isset($data->$property)) { - $instance->$property = self::deserialize($data->$property, $type); - } - } - $deserialized = $instance; - } - - return $deserialized; - } - -} - diff --git a/src/main/resources/php/api.mustache b/src/main/resources/php/api.mustache deleted file mode 100644 index 82ea7174032..00000000000 --- a/src/main/resources/php/api.mustache +++ /dev/null @@ -1,86 +0,0 @@ -apiClient = $apiClient; - } - - {{#operation}} - /** - * {{{nickname}}} - * - * {{{summary}}} - {{#allParams}}* {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} - * {{/allParams}} - * @return {{{returnType}}} - */ - - public function {{nickname}}({{#allParams}}${{paramName}}{{#optional}}=null{{/optional}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { - - // parse inputs - $resourcePath = "{{path}}"; - $resourcePath = str_replace("{format}", "json", $resourcePath); - $method = "{{httpMethod}}"; - $queryParams = array(); - $headerParams = array(); - $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; - $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; - - {{#queryParams}}// query params - if(${{paramName}} != null) { - $queryParams['{{paramName}}'] = $this->apiClient->toQueryValue(${{paramName}}); - }{{/queryParams}} - {{#headerParams}}// header params - if(${{paramName}} != null) { - $headerParams['{{paramName}}'] = $this->apiClient->toHeaderValue(${{paramName}}); - }{{/headerParams}} - {{#pathParams}}// path params - if(${{paramName}} != null) { - $resourcePath = str_replace("{" . "{{paramName}}" . "}", - $this->apiClient->toPathValue(${{paramName}}), $resourcePath); - }{{/pathParams}} - {{#bodyParams}}// body params - $body = null; - if (isset(${{paramName}})) { - $body = ${{paramName}}; - } - {{/bodyParams}} - - // make the API Call - $response = $this->apiClient->callAPI($resourcePath, $method, - $queryParams, $body, - $headerParams); - - {{#returnType}}if(! $response) { - return null; - } - - $responseObject = $this->apiClient->deserialize($response, - '{{returnType}}'); - return $responseObject;{{/returnType}} - } - {{/operation}} -{{newline}} -{{/operations}} -} diff --git a/src/main/resources/php/model.mustache b/src/main/resources/php/model.mustache deleted file mode 100644 index cc98fa352f3..00000000000 --- a/src/main/resources/php/model.mustache +++ /dev/null @@ -1,40 +0,0 @@ - '{{{datatype}}}'{{#hasMore}}, - {{/hasMore}}{{/vars}} - ); - - {{#vars}}{{#description}} - /** - * {{{description}}} - */{{/description}} - public ${{name}}; /* {{{datatype}}} */{{/vars}} -} -{{/model}} -{{/models}} diff --git a/src/main/resources/python/__init__.mustache b/src/main/resources/python/__init__.mustache deleted file mode 100644 index 4b41ee706c7..00000000000 --- a/src/main/resources/python/__init__.mustache +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env python -"""Add all of the modules in the current directory to __all__""" -import os - -__all__ = [] - -for module in os.listdir(os.path.dirname(__file__)): - if module != '__init__.py' and module[-3:] == '.py': - __all__.append(module[:-3]) diff --git a/src/main/resources/python/api.mustache b/src/main/resources/python/api.mustache deleted file mode 100644 index 1650effd991..00000000000 --- a/src/main/resources/python/api.mustache +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python -""" -WordAPI.py -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. - -NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. -""" -import sys -import os - -from models import * - - -{{#operations}} -class {{classname}}(object): - - def __init__(self, apiClient): - self.apiClient = apiClient - - {{newline}} - {{#operation}} - def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): - """{{summary}} - - Args: - {{#allParams}} - {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} - {{newline}} - {{/allParams}} - {{newline}} - Returns: {{returnType}} - """ - - allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] - - params = locals() - for (key, val) in params['kwargs'].iteritems(): - if key not in allParams: - raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) - params[key] = val - del params['kwargs'] - - resourcePath = '{{path}}' - resourcePath = resourcePath.replace('{format}', 'json') - method = '{{httpMethod}}' - - queryParams = {} - headerParams = {} - $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; - $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; - - {{#queryParams}} - if ('{{paramName}}' in params): - queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) - {{/queryParams}} - - {{#headerParams}} - if ('{{paramName}}' in params): - headerParams['{{paramName}}'] = params['{{paramName}}'] - {{/headerParams}} - - {{#pathParams}} - if ('{{paramName}}' in params): - replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) - resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', - replacement) - {{/pathParams}} - - postData = (params['body'] if 'body' in params else None) - - response = self.apiClient.callAPI(resourcePath, method, queryParams, - postData, headerParams) - - {{#returnType}} - if not response: - return None - - responseObject = self.apiClient.deserialize(response, '{{returnType}}') - return responseObject - {{/returnType}} - {{newline}} - {{newline}} - {{/operation}} -{{newline}} -{{/operations}} -{{newline}} diff --git a/src/main/resources/python/model.mustache b/src/main/resources/python/model.mustache deleted file mode 100644 index 39547c90050..00000000000 --- a/src/main/resources/python/model.mustache +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -""" -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. -""" -{{#models}} -{{#model}} - -class {{classname}}: - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually.""" - - - def __init__(self): - self.swaggerTypes = { - {{#vars}} - '{{name}}': '{{{datatype}}}'{{#hasMore}}, - {{/hasMore}} - {{/vars}}{{newline}} - } - - - {{#vars}} - {{#description}}#{{description}} - {{/description}} - self.{{name}} = None # {{{datatype}}} - {{/vars}} -{{/model}} -{{/models}} diff --git a/src/main/resources/python/swagger.mustache b/src/main/resources/python/swagger.mustache deleted file mode 100644 index e62f854c7bf..00000000000 --- a/src/main/resources/python/swagger.mustache +++ /dev/null @@ -1,208 +0,0 @@ -#!/usr/bin/env python -"""Wordnik.com's Swagger generic API client. This client handles the client- -server communication, and is invariant across implementations. Specifics of -the methods and models for each application are generated from the Swagger -templates.""" - -import sys -import os -import re -import urllib -import urllib2 -import httplib -import json -import datetime - -from models import * - - -class ApiClient: - """Generic API client for Swagger client library builds""" - - def __init__(self, apiKey=None, apiServer=None): - if apiKey == None: - raise Exception('You must pass an apiKey when instantiating the ' - 'APIClient') - self.apiKey = apiKey - self.apiServer = apiServer - self.cookie = None - - def callAPI(self, resourcePath, method, queryParams, postData, - headerParams=None): - - url = self.apiServer + resourcePath - headers = {} - if headerParams: - for param, value in headerParams.iteritems(): - headers[param] = value - - #headers['Content-type'] = 'application/json' - headers['api_key'] = self.apiKey - - if self.cookie: - headers['Cookie'] = self.cookie - - data = None - - if queryParams: - # Need to remove None values, these should not be sent - sentQueryParams = {} - for param, value in queryParams.items(): - if value != None: - sentQueryParams[param] = value - url = url + '?' + urllib.urlencode(sentQueryParams) - - if method in ['GET']: - - #Options to add statements later on and for compatibility - pass - - elif method in ['POST', 'PUT', 'DELETE']: - - if postData: - headers['Content-type'] = 'application/json' - data = self.sanitizeForSerialization(postData) - data = json.dumps(data) - - else: - raise Exception('Method ' + method + ' is not recognized.') - - request = MethodRequest(method=method, url=url, headers=headers, - data=data) - - # Make the request - response = urllib2.urlopen(request) - if 'Set-Cookie' in response.headers: - self.cookie = response.headers['Set-Cookie'] - string = response.read() - - try: - data = json.loads(string) - except ValueError: # PUT requests don't return anything - data = None - - return data - - def toPathValue(self, obj): - """Convert a string or object to a path-friendly value - Args: - obj -- object or string value - Returns: - string -- quoted value - """ - if type(obj) == list: - return urllib.quote(','.join(obj)) - else: - return urllib.quote(str(obj)) - - def sanitizeForSerialization(self, obj): - """Dump an object into JSON for POSTing.""" - - if type(obj) == type(None): - return None - elif type(obj) in [str, int, long, float, bool]: - return obj - elif type(obj) == list: - return [self.sanitizeForSerialization(subObj) for subObj in obj] - elif type(obj) == datetime.datetime: - return obj.isoformat() - else: - if type(obj) == dict: - objDict = obj - else: - objDict = obj.__dict__ - return {key: self.sanitizeForSerialization(val) - for (key, val) in objDict.iteritems() - if key != 'swaggerTypes'} - - if type(postData) == list: - # Could be a list of objects - if type(postData[0]) in safeToDump: - data = json.dumps(postData) - else: - data = json.dumps([datum.__dict__ for datum in postData]) - elif type(postData) not in safeToDump: - data = json.dumps(postData.__dict__) - - def deserialize(self, obj, objClass): - """Derialize a JSON string into an object. - - Args: - obj -- string or object to be deserialized - objClass -- class literal for deserialzied object, or string - of class name - Returns: - object -- deserialized object""" - - # Have to accept objClass as string or actual type. Type could be a - # native Python type, or one of the model classes. - if type(objClass) == str: - if 'list[' in objClass: - match = re.match('list\[(.*)\]', objClass) - subClass = match.group(1) - return [self.deserialize(subObj, subClass) for subObj in obj] - - if (objClass in ['int', 'float', 'long', 'dict', 'list', 'str', 'bool', 'datetime']): - objClass = eval(objClass) - else: # not a native type, must be model class - objClass = eval(objClass + '.' + objClass) - - if objClass in [int, long, float, dict, list, str, bool]: - return objClass(obj) - elif objClass == datetime: - # Server will always return a time stamp in UTC, but with - # trailing +0000 indicating no offset from UTC. So don't process - # last 5 characters. - return datetime.datetime.strptime(obj[:-5], - "%Y-%m-%dT%H:%M:%S.%f") - - instance = objClass() - - for attr, attrType in instance.swaggerTypes.iteritems(): - if obj is not None and attr in obj and type(obj) in [list, dict]: - value = obj[attr] - if attrType in ['str', 'int', 'long', 'float', 'bool']: - attrType = eval(attrType) - try: - value = attrType(value) - except UnicodeEncodeError: - value = unicode(value) - except TypeError: - value = value - setattr(instance, attr, value) - elif (attrType == 'datetime'): - setattr(instance, attr, datetime.datetime.strptime(value[:-5], - "%Y-%m-%dT%H:%M:%S.%f")) - elif 'list[' in attrType: - match = re.match('list\[(.*)\]', attrType) - subClass = match.group(1) - subValues = [] - if not value: - setattr(instance, attr, None) - else: - for subValue in value: - subValues.append(self.deserialize(subValue, - subClass)) - setattr(instance, attr, subValues) - else: - setattr(instance, attr, self.deserialize(value, - objClass)) - - return instance - - -class MethodRequest(urllib2.Request): - - def __init__(self, *args, **kwargs): - """Construct a MethodRequest. Usage is the same as for - `urllib2.Request` except it also takes an optional `method` - keyword argument. If supplied, `method` will be used instead of - the default.""" - - if 'method' in kwargs: - self.method = kwargs.pop('method') - return urllib2.Request.__init__(self, *args, **kwargs) - - def get_method(self): - return getattr(self, 'method', urllib2.Request.get_method(self)) - diff --git a/src/main/resources/python3/__init__.mustache b/src/main/resources/python3/__init__.mustache deleted file mode 100644 index 4b41ee706c7..00000000000 --- a/src/main/resources/python3/__init__.mustache +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env python -"""Add all of the modules in the current directory to __all__""" -import os - -__all__ = [] - -for module in os.listdir(os.path.dirname(__file__)): - if module != '__init__.py' and module[-3:] == '.py': - __all__.append(module[:-3]) diff --git a/src/main/resources/python3/api.mustache b/src/main/resources/python3/api.mustache deleted file mode 100644 index 2d8fbdc29ca..00000000000 --- a/src/main/resources/python3/api.mustache +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env python -""" -WordAPI.py -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. - -NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. -""" -import sys -import os - -from .models import * - - -{{#operations}} -class {{classname}}(object): - - def __init__(self, apiClient): - self.apiClient = apiClient - - {{newline}} - {{#operation}} - def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): - """{{summary}} - - Args: - {{#allParams}} - {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} - {{newline}} - {{/allParams}} - {{newline}} - Returns: {{returnType}} - """ - - allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] - - params = locals() - for (key, val) in params['kwargs'].items(): - if key not in allParams: - raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) - params[key] = val - del params['kwargs'] - - resourcePath = '{{path}}' - resourcePath = resourcePath.replace('{format}', 'json') - method = '{{httpMethod}}' - - queryParams = {} - headerParams = {} - - {{#queryParams}} - if ('{{paramName}}' in params): - queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) - {{/queryParams}} - - {{#headerParams}} - if ('{{paramName}}' in params): - headerParams['{{paramName}}'] = params['{{paramName}}'] - {{/headerParams}} - - {{#pathParams}} - if ('{{paramName}}' in params): - replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) - resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', - replacement) - {{/pathParams}} - - postData = (params['body'] if 'body' in params else None) - - response = self.apiClient.callAPI(resourcePath, method, queryParams, - postData, headerParams) - - {{#returnType}} - if not response: - return None - - responseObject = self.apiClient.deserialize(response, '{{returnType}}') - return responseObject - {{/returnType}} - {{newline}} - {{newline}} - {{/operation}} -{{newline}} -{{/operations}} -{{newline}} diff --git a/src/main/resources/python3/model.mustache b/src/main/resources/python3/model.mustache deleted file mode 100644 index 39547c90050..00000000000 --- a/src/main/resources/python3/model.mustache +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -""" -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. -""" -{{#models}} -{{#model}} - -class {{classname}}: - """NOTE: This class is auto generated by the swagger code generator program. - Do not edit the class manually.""" - - - def __init__(self): - self.swaggerTypes = { - {{#vars}} - '{{name}}': '{{{datatype}}}'{{#hasMore}}, - {{/hasMore}} - {{/vars}}{{newline}} - } - - - {{#vars}} - {{#description}}#{{description}} - {{/description}} - self.{{name}} = None # {{{datatype}}} - {{/vars}} -{{/model}} -{{/models}} diff --git a/src/main/resources/python3/swagger.mustache b/src/main/resources/python3/swagger.mustache deleted file mode 100644 index a01b69794ee..00000000000 --- a/src/main/resources/python3/swagger.mustache +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python -"""Wordnik.com's Swagger generic API client. This client handles the client- -server communication, and is invariant across implementations. Specifics of -the methods and models for each application are generated from the Swagger -templates.""" - -import sys -import os -import re -import urllib.request, urllib.error, urllib.parse -import http.client -import json -import datetime - -from .models import * - - -class ApiClient: - """Generic API client for Swagger client library builds""" - - def __init__(self, apiKey=None, apiServer=None): - if apiKey == None: - raise Exception('You must pass an apiKey when instantiating the ' - 'APIClient') - self.apiKey = apiKey - self.apiServer = apiServer - self.cookie = None - - def callAPI(self, resourcePath, method, queryParams, postData, - headerParams=None): - - url = self.apiServer + resourcePath - headers = {} - if headerParams: - for param, value in headerParams.items(): - headers[param] = value - - #headers['Content-type'] = 'application/json' - headers['api_key'] = self.apiKey - - if self.cookie: - headers['Cookie'] = self.cookie - - data = None - - - if queryParams: - # Need to remove None values, these should not be sent - sentQueryParams = {} - for param, value in queryParams.items(): - if value != None: - sentQueryParams[param] = value - url = url + '?' + urllib.parse.urlencode(sentQueryParams) - - if method in ['GET']: - - #Options to add statements later on and for compatibility - pass - - elif method in ['POST', 'PUT', 'DELETE']: - - if postData: - headers['Content-type'] = 'application/json' - data = self.sanitizeForSerialization(postData) - data = json.dumps(data) - - else: - raise Exception('Method ' + method + ' is not recognized.') - - if data: - data = data.encode('utf-8') - - requestParams = MethodRequest(method=method, url=url, - headers=headers, data=data) - - # Make the request - request = urllib.request.urlopen(requestParams) - encoding = request.headers.get_content_charset() - if not encoding: - encoding = 'iso-8859-1' - response = request.read().decode(encoding) - - try: - data = json.loads(response) - except ValueError: # PUT requests don't return anything - data = None - - return data - - def toPathValue(self, obj): - """Convert a string or object to a path-friendly value - Args: - obj -- object or string value - Returns: - string -- quoted value - """ - if type(obj) == list: - return urllib.parse.quote(','.join(obj)) - else: - return urllib.parse.quote(str(obj)) - - def sanitizeForSerialization(self, obj): - """Dump an object into JSON for POSTing.""" - - if type(obj) == type(None): - return None - elif type(obj) in [str, int, float, bool]: - return obj - elif type(obj) == list: - return [self.sanitizeForSerialization(subObj) for subObj in obj] - elif type(obj) == datetime.datetime: - return obj.isoformat() - else: - if type(obj) == dict: - objDict = obj - else: - objDict = obj.__dict__ - return {key: self.sanitizeForSerialization(val) - for (key, val) in objDict.items() - if key != 'swaggerTypes'} - - def deserialize(self, obj, objClass): - """Derialize a JSON string into an object. - - Args: - obj -- string or object to be deserialized - objClass -- class literal for deserialzied object, or string - of class name - Returns: - object -- deserialized object""" - - # Have to accept objClass as string or actual type. Type could be a - # native Python type, or one of the model classes. - if type(objClass) == str: - if 'list[' in objClass: - match = re.match('list\[(.*)\]', objClass) - subClass = match.group(1) - return [self.deserialize(subObj, subClass) for subObj in obj] - - if (objClass in ['int', 'float', 'dict', 'list', 'str', 'bool', 'datetime']): - objClass = eval(objClass) - else: # not a native type, must be model class - objClass = eval(objClass + '.' + objClass) - - if objClass in [int, float, dict, list, str, bool]: - return objClass(obj) - elif objClass == datetime: - # Server will always return a time stamp in UTC, but with - # trailing +0000 indicating no offset from UTC. So don't process - # last 5 characters. - return datetime.datetime.strptime(obj[:-5], - "%Y-%m-%dT%H:%M:%S.%f") - - instance = objClass() - - for attr, attrType in instance.swaggerTypes.items(): - - if attr in obj: - value = obj[attr] - if attrType in ['str', 'int', 'float', 'bool']: - attrType = eval(attrType) - try: - value = attrType(value) - except UnicodeEncodeError: - value = unicode(value) - except TypeError: - value = value - setattr(instance, attr, value) - elif (attrType == 'datetime'): - setattr(instance, attr, datetime.datetime.strptime(value[:-5], - "%Y-%m-%dT%H:%M:%S.%f")) - elif 'list[' in attrType: - match = re.match('list\[(.*)\]', attrType) - subClass = match.group(1) - subValues = [] - if not value: - setattr(instance, attr, None) - else: - for subValue in value: - subValues.append(self.deserialize(subValue, - subClass)) - setattr(instance, attr, subValues) - else: - setattr(instance, attr, self.deserialize(value, - objClass)) - - return instance - - -class MethodRequest(urllib.request.Request): - - def __init__(self, *args, **kwargs): - """Construct a MethodRequest. Usage is the same as for - `urllib.Request` except it also takes an optional `method` - keyword argument. If supplied, `method` will be used instead of - the default.""" - - if 'method' in kwargs: - self.method = kwargs.pop('method') - return urllib.request.Request.__init__(self, *args, **kwargs) - - def get_method(self): - return getattr(self, 'method', urllib.request.Request.get_method(self)) diff --git a/src/main/resources/ruby/api.mustache b/src/main/resources/ruby/api.mustache deleted file mode 100644 index b2c546b011e..00000000000 --- a/src/main/resources/ruby/api.mustache +++ /dev/null @@ -1,85 +0,0 @@ -require "uri" - -{{#operations}} -class {{classname}} - basePath = "{{basePath}}" - # apiInvoker = APIInvoker - - def self.escapeString(string) - URI.encode(string.to_s) - end - - {{#operation}} - def self.{{nickname}} ({{#allParams}}{{paramName}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}},{{/allParams}} opts={}) - query_param_keys = [{{#queryParams}}:{{paramName}}{{#hasMore}},{{/hasMore}}{{/queryParams}}] - - {{#requiredParamCount}} - - # verify existence of params - {{#requiredParams}} - raise "{{{paramName}}} is required" if {{{paramName}}}.nil? - {{/requiredParams}} - {{/requiredParamCount}} - - # set default values and merge with input - options = { - {{#allParams}} - :{{paramName}} => {{paramName}}{{#hasMore}}, - {{/hasMore}} - {{/allParams}} - }.merge(opts) - - #resource path - path = "{{path}}".sub('{format}','json'){{#pathParams}}.sub('{' + '{{baseName}}' + '}', escapeString({{paramName}})) - {{/pathParams}}{{newline}} - - # pull querystring keys from options - queryopts = options.select do |key,value| - query_param_keys.include? key - end - - {{#headerParams}}headers = { - {{{paramName}}}: {{{paramName}}}, - } - {{/headerParams}} - {{^headerParams}}headers = nil - {{/headerParams}} - - post_body = nil - {{#bodyParam}} - if body != nil - if body.is_a?(Array) - array = Array.new - body.each do |item| - if item.respond_to?("to_body".to_sym) - array.push item.to_body - else - array.push item - end - end - post_body = array - - else - if body.respond_to?("to_body".to_sym) - post_body = body.to_body - else - post_body = body - end - end - end - {{/bodyParam}} - - {{#returnType}} - response = Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body }).make.body - {{#returnContainer}} - response.map {|response|{{/returnContainer}} {{returnBaseType}}.new(response){{#returnContainer}} }{{/returnContainer}} - {{/returnType}} - {{^returnType}} - Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body}).make - {{/returnType}} - {{newline}} - end - -{{/operation}} -end -{{/operations}} \ No newline at end of file diff --git a/src/main/resources/ruby/model.mustache b/src/main/resources/ruby/model.mustache deleted file mode 100644 index c587f12cb49..00000000000 --- a/src/main/resources/ruby/model.mustache +++ /dev/null @@ -1,41 +0,0 @@ -{{#models}} - -{{#model}} -class {{classname}} - attr_accessor {{#vars}}:{{{name}}}{{#hasMore}}, {{/hasMore}}{{/vars}}{{newline}} - # :internal => :external - def self.attribute_map - { - {{#vars}} - :{{{name}}} => :{{{baseName}}}{{#hasMore}}, - {{/hasMore}} - {{/vars}}{{newline}} - } - end - - def initialize(attributes = {}) - return if attributes.empty? - # Morph attribute keys into undescored rubyish style - {{#vars}} - if self.class.attribute_map[:"{{{name}}}"] - {{#isContainer}} - if (value = attributes["{{{baseName}}}"]).is_a?(Array) - @{{{name}}} = value{{#complexType}}.map{ |v| {{complexType}}.new(v) }{{/complexType}}{{newline}} - end - {{/isContainer}}{{^isContainer}} - @{{{name}}} = attributes["{{{baseName}}}"] - {{/isContainer}} - end - {{/vars}}{{newline}} - end - - def to_body - body = {} - self.class.attribute_map.each_pair do |key, value| - body[value] = self.send(key) unless self.send(key).nil? - end - body - end -end -{{/model}} -{{/models}} diff --git a/src/main/resources/ruby/monkey.mustache b/src/main/resources/ruby/monkey.mustache deleted file mode 100644 index 28932890af9..00000000000 --- a/src/main/resources/ruby/monkey.mustache +++ /dev/null @@ -1,90 +0,0 @@ -# module Swagger - class Object - - unless Object.method_defined? :blank? - def blank? - respond_to?(:empty?) ? empty? : !self - end - end - - unless Object.method_defined? :present? - def present? - !blank? - end - end - - end - - class String - - unless String.method_defined? :underscore - def underscore - self.gsub(/::/, '/'). - gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). - gsub(/([a-z\d])([A-Z])/,'\1_\2'). - tr("-", "_"). - downcase - end - end - - unless String.method_defined? :camelize - def camelize(first_letter_in_uppercase = true) - if first_letter_in_uppercase != :lower - self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } - else - self.to_s[0].chr.downcase + camelize(self)[1..-1] - end - end - end - - end - - class Hash - - unless Hash.method_defined? :stringify_keys - def stringify_keys - inject({}) do |options, (key, value)| - options[key.to_s] = value - options - end - end - end - - unless Hash.method_defined? :stringify_keys! - def stringify_keys! - self.replace(self.stringify_keys) - end - end - - unless Hash.method_defined? :symbolize_keys - def symbolize_keys - inject({}) do |options, (key, value)| - options[(key.to_sym rescue key) || key] = value - options - end - end - end - - unless Hash.method_defined? :symbolize_keys! - def symbolize_keys! - self.replace(self.symbolize_keys) - end - end - - unless Hash.method_defined? :symbolize_and_underscore_keys - def symbolize_and_underscore_keys - inject({}) do |options, (key, value)| - options[(key.to_s.underscore.to_sym rescue key) || key] = value - options - end - end - end - - unless Hash.method_defined? :symbolize_and_underscore_keys! - def symbolize_and_underscore_keys! - self.replace(self.symbolize_and_underscore_keys) - end - end - - end -# end \ No newline at end of file diff --git a/src/main/resources/ruby/swagger.mustache b/src/main/resources/ruby/swagger.mustache deleted file mode 100644 index 1cc3ea456c2..00000000000 --- a/src/main/resources/ruby/swagger.mustache +++ /dev/null @@ -1,84 +0,0 @@ -require 'monkey' -require 'swagger/configuration' -require 'swagger/request' -require 'swagger/response' -require 'swagger/version' -require 'logger' - -module Swagger - - class << self - attr_accessor :logger - - # A Swagger configuration object. Must act like a hash and return sensible - # values for all Swagger configuration options. See Swagger::Configuration. - attr_accessor :configuration - - attr_accessor :resources - - # Call this method to modify defaults in your initializers. - # - # @example - # Swagger.configure do |config| - # config.api_key = '1234567890abcdef' # required - # config.username = 'wordlover' # optional, but needed for user-related functions - # config.password = 'i<3words' # optional, but needed for user-related functions - # config.format = 'json' # optional, defaults to 'json' - # end - # - def configure - self.configuration ||= Configuration.new - yield(configuration) if block_given? - - # Configure logger. Default to use Rails - self.logger ||= configuration.logger || (defined?(Rails) ? Rails.logger : Logger.new(STDOUT)) - - # remove :// from scheme - configuration.scheme.sub!(/:\/\//, '') - - # remove http(s):// and anything after a slash - configuration.host.sub!(/https?:\/\//, '') - configuration.host = configuration.host.split('/').first - - # Add leading and trailing slashes to base_path - configuration.base_path = "/#{configuration.base_path}".gsub(/\/+/, '/') - configuration.base_path = "" if configuration.base_path == "/" - end - - def authenticated? - Swagger.configuration.auth_token.present? - end - - def de_authenticate - Swagger.configuration.auth_token = nil - end - - def authenticate - return if Swagger.authenticated? - - if Swagger.configuration.username.blank? || Swagger.configuration.password.blank? - raise ClientError, "Username and password are required to authenticate." - end - - request = Swagger::Request.new( - :get, - "account/authenticate/{username}", - :params => { - :username => Swagger.configuration.username, - :password => Swagger.configuration.password - } - ) - - response_body = request.response.body - Swagger.configuration.auth_token = response_body['token'] - end - - end - -end - -class ServerError < StandardError -end - -class ClientError < StandardError -end \ No newline at end of file diff --git a/src/main/resources/ruby/swagger/configuration.mustache b/src/main/resources/ruby/swagger/configuration.mustache deleted file mode 100644 index c0b3c46268c..00000000000 --- a/src/main/resources/ruby/swagger/configuration.mustache +++ /dev/null @@ -1,22 +0,0 @@ -module Swagger - - class Configuration - require 'swagger/version' - - attr_accessor :format, :api_key, :username, :password, :auth_token, :scheme, :host, :base_path, :user_agent, :logger, :inject_format, :force_ending_format, :camelize_params - - # Defaults go in here.. - def initialize - @format = 'json' - @scheme = 'http' - @host = 'api.wordnik.com' - @base_path = '/v4' - @user_agent = "ruby-#{Swagger::VERSION}" - @inject_format = true - @force_ending_format = false - @camelize_params = true - end - - end - -end \ No newline at end of file diff --git a/src/main/resources/ruby/swagger/request.mustache b/src/main/resources/ruby/swagger/request.mustache deleted file mode 100644 index 7836cb0bf03..00000000000 --- a/src/main/resources/ruby/swagger/request.mustache +++ /dev/null @@ -1,199 +0,0 @@ -module Swagger - - class Request - require 'uri' - require 'addressable/uri' - require 'typhoeus' - require "swagger/version" - - attr_accessor :host, :path, :format, :params, :body, :http_method, :headers - - - # All requests must have an HTTP method and a path - # Optionals parameters are :params, :headers, :body, :format, :host - # - def initialize(http_method, path, attributes={}) - attributes[:format] ||= Swagger.configuration.format - attributes[:params] ||= {} - - # Set default headers - default_headers = { - 'Content-Type' => "application/#{attributes[:format].downcase}", - :api_key => Swagger.configuration.api_key - } - - # api_key from headers hash trumps the default, even if its value is blank - if attributes[:headers].present? && attributes[:headers].has_key?(:api_key) - default_headers.delete(:api_key) - end - - # api_key from params hash trumps all others (headers and default_headers) - if attributes[:params].present? && attributes[:params].has_key?(:api_key) - default_headers.delete(:api_key) - attributes[:headers].delete(:api_key) if attributes[:headers].present? - end - - # Merge argument headers into defaults - attributes[:headers] = default_headers.merge(attributes[:headers] || {}) - - # Stick in the auth token if there is one - if Swagger.authenticated? - attributes[:headers].merge!({:auth_token => Swagger.configuration.auth_token}) - end - - self.http_method = http_method.to_sym - self.path = path - attributes.each do |name, value| - send("#{name.to_s.underscore.to_sym}=", value) - end - end - - # Construct a base URL - # - def url(options = {}) - u = Addressable::URI.new( - :scheme => Swagger.configuration.scheme, - :host => Swagger.configuration.host, - :path => self.interpreted_path, - :query => self.query_string.sub(/\?/, '') - ).to_s - - # Drop trailing question mark, if present - u.sub! /\?$/, '' - - # Obfuscate API key? - u.sub! /api\_key=\w+/, 'api_key=YOUR_API_KEY' if options[:obfuscated] - - u - end - - # Iterate over the params hash, injecting any path values into the path string - # - # e.g. /word.{format}/{word}/entries => /word.json/cat/entries - def interpreted_path - p = self.path.dup - - # Fill in the path params - self.params.each_pair do |key, value| - p = p.gsub("{#{key}}", value.to_s) - end - - # Stick a .{format} placeholder into the path if there isn't - # one already or an actual format like json or xml - # e.g. /words/blah => /words.{format}/blah - if Swagger.configuration.inject_format - unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } - p = p.sub(/^(\/?\w+)/, "\\1.#{format}") - end - end - - # Stick a .{format} placeholder on the end of the path if there isn't - # one already or an actual format like json or xml - # e.g. /words/blah => /words/blah.{format} - if Swagger.configuration.force_ending_format - unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } - p = "#{p}.#{format}" - end - end - - p = p.sub("{format}", self.format.to_s) - - URI.encode [Swagger.configuration.base_path, p].join("/").gsub(/\/+/, '/') - end - - # Massage the request body into a state of readiness - # If body is a hash, camelize all keys then convert to a json string - # - def body=(value) - if value.is_a?(Hash) - value = value.inject({}) do |memo, (k,v)| - memo[k.to_s.camelize(:lower).to_sym] = v - memo - end - end - @body = value - end - - # If body is an object, JSONify it before making the actual request. - # - def outgoing_body - body.is_a?(String) ? body : body.to_json - end - - # Construct a query string from the query-string-type params - def query_string - - # Iterate over all params, - # .. removing the ones that are part of the path itself. - # .. stringifying values so Addressable doesn't blow up. - query_values = {} - self.params.each_pair do |key, value| - next if self.path.include? "{#{key}}" # skip path params - next if value.blank? && value.class != FalseClass # skip empties - if Swagger.configuration.camelize_params - key = key.to_s.camelize(:lower).to_sym unless key.to_sym == :api_key # api_key is not a camelCased param - end - query_values[key] = value.to_s - end - - # We don't want to end up with '?' as our query string - # if there aren't really any params - return "" if query_values.blank? - - # Addressable requires query_values to be set after initialization.. - qs = Addressable::URI.new - qs.query_values = query_values - qs.to_s - end - - def make - logger = Logger.new STDOUT - logger.debug self.url - response = case self.http_method.to_sym - when :get,:GET - Typhoeus::Request.get( - self.url, - :headers => self.headers.stringify_keys, - ) - - when :post,:POST - Typhoeus::Request.post( - self.url, - :body => self.outgoing_body, - :headers => self.headers.stringify_keys, - ) - - when :put,:PUT - Typhoeus::Request.put( - self.url, - :body => self.outgoing_body, - :headers => self.headers.stringify_keys, - ) - - when :delete,:DELETE - Typhoeus::Request.delete( - self.url, - :body => self.outgoing_body, - :headers => self.headers.stringify_keys, - ) - end - Response.new(response) - end - - def response - self.make - end - - def response_code_pretty - return unless @response.present? - @response.code.to_s - end - - def response_headers_pretty - return unless @response.present? - # JSON.pretty_generate(@response.headers).gsub(/\n/, '
') # <- This was for RestClient - @response.headers.gsub(/\n/, '
') # <- This is for Typhoeus - end - - end -end \ No newline at end of file diff --git a/src/main/resources/ruby/swagger/response.mustache b/src/main/resources/ruby/swagger/response.mustache deleted file mode 100644 index 02a1a458eb4..00000000000 --- a/src/main/resources/ruby/swagger/response.mustache +++ /dev/null @@ -1,70 +0,0 @@ -module Swagger - - class Response - require 'json' - - attr_accessor :raw - - def initialize(raw) - self.raw = raw - - case self.code - when 500..510 then raise(ServerError, self.error_message) - when 299..426 then raise(ClientError, self.error_message) - end - end - - def code - raw.code - end - - # Account for error messages that take different forms... - def error_message - body['message'] - rescue - body - end - - # If body is JSON, parse it - # Otherwise return raw string - def body - JSON.parse raw.body - rescue - raw.body - end - - # `headers_hash` is a Typhoeus-specific extension of Hash, - # so simplify it back into a regular old Hash. - def headers - h = {} - raw.headers_hash.each {|k,v| h[k] = v } - h - end - - # Extract the response format from the header hash - # e.g. {'Content-Type' => 'application/json'} - def format - headers['Content-Type'].split("/").last.downcase - end - - def json? - format == 'json' - end - - def xml? - format == 'xml' - end - - def pretty_body - return unless body.present? - case format - when 'json' then JSON.pretty_generate(body).gsub(/\n/, '
') - end - end - - def pretty_headers - JSON.pretty_generate(headers).gsub(/\n/, '
') - end - - end -end \ No newline at end of file diff --git a/src/main/resources/ruby/swagger/version.mustache b/src/main/resources/ruby/swagger/version.mustache deleted file mode 100644 index 39357c0ed6d..00000000000 --- a/src/main/resources/ruby/swagger/version.mustache +++ /dev/null @@ -1,4 +0,0 @@ -module Swagger - VERSION = "4.06.08" -end - diff --git a/src/main/resources/scala/api.mustache b/src/main/resources/scala/api.mustache deleted file mode 100644 index 7c05406a5a8..00000000000 --- a/src/main/resources/scala/api.mustache +++ /dev/null @@ -1,68 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} -import {{invokerPackage}}.ApiInvoker -import {{invokerPackage}}.ApiException - -import java.io.File -import java.util.Date - -import scala.collection.mutable.HashMap - -{{#operations}} -class {{classname}} { - var basePath: String = "{{basePath}}" - var apiInvoker = ApiInvoker - - def addHeader(key: String, value: String) = apiInvoker.defaultHeaders += key -> value - - {{#operation}} - def {{nickname}} ({{#allParams}}{{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {{#returnType}}: Option[{{returnType}}]{{/returnType}} = { - // create path and map variables - val path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{baseName}}" + "\\}",apiInvoker.escape({{paramName}})) - - {{/pathParams}} - - {{newline}} - val contentType = { - {{#bodyParam}}if({{paramName}} != null && {{paramName}}.isInstanceOf[File] ) - "multipart/form-data" - else "application/json" - {{/bodyParam}} - {{^bodyParam}}"application/json"{{/bodyParam}} - } - - // query params - val queryParams = new HashMap[String, String] - val headerParams = new HashMap[String, String] - - {{#requiredParamCount}} - // verify required params are set - (List({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}).filter(_ != null)).size match { - case {{requiredParamCount}} => // all required values set - case _ => throw new Exception("missing required params") - } - {{/requiredParamCount}} - - {{#queryParams}}if(String.valueOf({{paramName}}) != "null") queryParams += "{{baseName}}" -> {{paramName}}.toString - {{/queryParams}} - - {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}} - {{/headerParams}} - - try { - apiInvoker.invokeApi(basePath, path, "{{httpMethod}}", queryParams.toMap, {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}None{{/bodyParam}}, headerParams.toMap, contentType) match { - case s: String => - {{#returnType}} Some(ApiInvoker.deserialize(s, "{{returnContainer}}", classOf[{{returnBaseType}}]).asInstanceOf[{{returnType}}]) - {{/returnType}} - case _ => None - } - } catch { - case ex: ApiException if ex.code == 404 => None - case ex: ApiException => throw ex - } - } - {{/operation}} -} -{{/operations}} \ No newline at end of file diff --git a/src/main/resources/scala/apiInvoker.mustache b/src/main/resources/scala/apiInvoker.mustache deleted file mode 100644 index 5c6d60d37b5..00000000000 --- a/src/main/resources/scala/apiInvoker.mustache +++ /dev/null @@ -1,164 +0,0 @@ -package {{invokerPackage}} - -import com.sun.jersey.api.client.Client -import com.sun.jersey.api.client.ClientResponse -import com.sun.jersey.api.client.config.ClientConfig -import com.sun.jersey.api.client.config.DefaultClientConfig -import com.sun.jersey.api.client.filter.LoggingFilter - -import com.sun.jersey.multipart.FormDataMultiPart -import com.sun.jersey.multipart.file.FileDataBodyPart - -import java.io.File -import java.net.URLEncoder -import javax.ws.rs.core.MediaType - -import scala.collection.JavaConverters._ -import scala.collection.mutable.HashMap - -import com.fasterxml.jackson.module.scala.DefaultScalaModule -import com.fasterxml.jackson.core.JsonGenerator.Feature -import com.fasterxml.jackson.databind._ -import com.fasterxml.jackson.annotation._ -import com.fasterxml.jackson.databind.annotation.JsonSerialize - -object ScalaJsonUtil { - def getJsonMapper = { - val mapper = new ObjectMapper() - mapper.registerModule(new DefaultScalaModule()) - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT) - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) - mapper - } -} - -object ApiInvoker { - val mapper = ScalaJsonUtil.getJsonMapper - val defaultHeaders: HashMap[String, String] = HashMap() - val hostMap: HashMap[String, Client] = HashMap() - - def escape(value: String): String = { - URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20") - } - - def escape(value: Long): String = value.toString - def escape(value: Double): String = value.toString - def escape(value: Float): String = value.toString - - def deserialize(json: String, containerType: String, cls: Class[_]) = { - if (cls == classOf[String]) { - json match { - case s: String => { - if (s.startsWith("\"") && s.endsWith("\"") && s.length > 1) s.substring(1, s.length - 2) - else s - } - case _ => null - } - } else { - containerType.toLowerCase match { - case "array" => { - val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) - val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] - response.asScala.toList - } - case "list" => { - val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) - val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] - response.asScala.toList - } - case _ => { - json match { - case e: String if ("\"\"" == e) => null - case _ => mapper.readValue(json, cls) - } - } - } - } - } - - def serialize(obj: AnyRef): String = { - if (obj != null) { - obj match { - case e: List[_] => mapper.writeValueAsString(obj.asInstanceOf[List[_]].asJava) - case _ => mapper.writeValueAsString(obj) - } - } else null - } - - def invokeApi(host: String, path: String, method: String, queryParams: Map[String, String], body: AnyRef, headerParams: Map[String, String], contentType: String): String = { - val client = getClient(host) - - val querystring = queryParams.filter(k => k._2 != null).map(k => (escape(k._1) + "=" + escape(k._2))).mkString("?", "&", "") - val builder = client.resource(host + path + querystring).accept(contentType) - headerParams.map(p => builder.header(p._1, p._2)) - defaultHeaders.map(p => { - headerParams.contains(p._1) match { - case true => // override default with supplied header - case false => if (p._2 != null) builder.header(p._1, p._2) - } - }) - - val response: ClientResponse = method match { - case "GET" => { - builder.get(classOf[ClientResponse]).asInstanceOf[ClientResponse] - } - case "POST" => { - if(body != null && body.isInstanceOf[File]) { - val file = body.asInstanceOf[File] - val form = new FormDataMultiPart() - form.field("filename", file.getName()) - form.bodyPart(new FileDataBodyPart("file", file, MediaType.MULTIPART_FORM_DATA_TYPE)) - builder.post(classOf[ClientResponse], form) - } - else { - if(body == null) builder.post(classOf[ClientResponse], serialize(body)) - else builder.`type`(contentType).post(classOf[ClientResponse], serialize(body)) - } - } - case "PUT" => { - if(body == null) builder.put(classOf[ClientResponse], null) - else builder.`type`(contentType).put(classOf[ClientResponse], serialize(body)) - } - case "DELETE" => { - builder.delete(classOf[ClientResponse]) - } - case _ => null - } - response.getClientResponseStatus().getStatusCode() match { - case 204 => "" - case code: Int if (Range(200, 299).contains(code)) => { - response.hasEntity() match { - case true => response.getEntity(classOf[String]) - case false => "" - } - } - case _ => { - val entity = response.hasEntity() match { - case true => response.getEntity(classOf[String]) - case false => "no data" - } - throw new ApiException( - response.getClientResponseStatus().getStatusCode(), - entity) - } - } - } - - def getClient(host: String): Client = { - hostMap.contains(host) match { - case true => hostMap(host) - case false => { - val client = Client.create() - // client.addFilter(new LoggingFilter()) - hostMap += host -> client - client - } - } - } -} - -class ApiException(val code: Int, msg: String) extends RuntimeException(msg) - diff --git a/src/main/resources/scala/model.mustache b/src/main/resources/scala/model.mustache deleted file mode 100644 index a45b71a8f8e..00000000000 --- a/src/main/resources/scala/model.mustache +++ /dev/null @@ -1,15 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} - -{{#models}} - -{{#model}} - -case class {{classname}} ( - {{#vars}}{{#description}}/* {{{description}}} */ - {{/description}}{{name}}: {{{datatype}}}{{#hasMore}},{{/hasMore}}{{^hasMore}}){{/hasMore}} - {{/vars}} -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/scala/pom.mustache b/src/main/resources/scala/pom.mustache deleted file mode 100644 index ac6a81caa46..00000000000 --- a/src/main/resources/scala/pom.mustache +++ /dev/null @@ -1,232 +0,0 @@ - - 4.0.0 - {{groupId}} - {{artifactId}} - jar - {{artifactId}} - {{artifactVersion}} - - 2.2.0 - - - - - maven-mongodb-plugin-repo - maven mongodb plugin repository - http://maven-mongodb-plugin.googlecode.com/svn/maven/repo - default - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12 - - - - loggerPath - conf/log4j.properties - - - -Xms512m -Xmx1500m - methods - pertest - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.2 - - - - jar - test-jar - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add_sources - generate-sources - - add-source - - - - src/main/java - - - - - add_test_sources - generate-test-sources - - add-test-source - - - - src/test/java - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.6 - 1.6 - - - - net.alchim31.maven - scala-maven-plugin - ${scala-maven-plugin-version} - - - scala-compile-first - process-resources - - add-source - compile - - - - scala-test-compile - process-test-resources - - testCompile - - - - - - -Xms128m - -Xmx1500m - - - - - - - - - org.scala-tools - maven-scala-plugin - - ${scala-version} - - - - - - - com.sun.jersey - jersey-client - ${jersey-version} - compile - - - com.sun.jersey.contribs - jersey-multipart - ${jersey-version} - compile - - - org.scala-lang - scala-library - ${scala-version} - compile - - - com.wordnik - swagger-core_${scala-short-version} - ${swagger-core-version} - compile - - - org.scalatest - scalatest_${scala-short-version} - ${scala-test-version} - test - - - junit - junit - ${junit-version} - test - - - joda-time - joda-time - ${joda-time-version} - - - org.joda - joda-convert - ${joda-version} - - - - - scala_2.10 - - 2.10.3 - 2.10 - 1.3.2 - 2.1.2 - - - - scala_2.9.1 - - true - - - 2.9.1-1 - 2.9.1 - 1.1.0 - 1.6.1 - - - - - 1.2 - 2.2 - 1.7 - 4.8.1 - 1.0.0 - 4.8.1 - 3.1.5 - - diff --git a/src/main/resources/scalatra/Bootstrap.mustache b/src/main/resources/scalatra/Bootstrap.mustache deleted file mode 100644 index 64c0b07eb28..00000000000 --- a/src/main/resources/scalatra/Bootstrap.mustache +++ /dev/null @@ -1,20 +0,0 @@ -import {{apiPackage}}._ -import akka.actor.ActorSystem -import com.wordnik.swagger.app.{ResourcesApp, SwaggerApp} -import javax.servlet.ServletContext -import org.scalatra.LifeCycle - -class ScalatraBootstrap extends LifeCycle { - implicit val swagger = new SwaggerApp - - override def init(context: ServletContext) { - implicit val system = ActorSystem("appActorSystem") - try { - {{#apiInfo}}{{#apis}}context mount (new {{classname}}, "/{{baseName}}/*") - {{/apis}}{{/apiInfo}} - context mount (new ResourcesApp, "/api-docs/*") - } catch { - case e: Throwable => e.printStackTrace() - } - } -} \ No newline at end of file diff --git a/src/main/resources/scalatra/JettyMain.scala b/src/main/resources/scalatra/JettyMain.scala deleted file mode 100644 index e25f16ba392..00000000000 --- a/src/main/resources/scalatra/JettyMain.scala +++ /dev/null @@ -1,43 +0,0 @@ -import org.eclipse.jetty.server._ -import org.eclipse.jetty.webapp.WebAppContext -import org.scalatra.servlet.ScalatraListener - -object JettyMain { - - object conf { - val port = sys.env.get("PORT") map (_.toInt) getOrElse (8080) - val stopTimeout = sys.env.get("STOP_TIMEOUT") map (_.toInt) getOrElse (5000) - val connectorIdleTimeout = sys.env.get("CONNECTOR_IDLE_TIMEOUT") map (_.toInt) getOrElse (90000) - val webapp = sys.env.get("PUBLIC") getOrElse "webapp" - val contextPath = sys.env.get("CONTEXT_PATH") getOrElse "/" - } - - def main(args: Array[String]) = { - val server: Server = new Server - println("starting jetty") - - server setStopTimeout conf.stopTimeout - //server setDumpAfterStart true - server setStopAtShutdown true - - val httpConfig = new HttpConfiguration() - httpConfig setSendDateHeader true - httpConfig setSendServerVersion false - - val connector = new NetworkTrafficServerConnector(server, new HttpConnectionFactory(httpConfig)) - connector setPort conf.port - connector setSoLingerTime 0 - connector setIdleTimeout conf.connectorIdleTimeout - server addConnector connector - - val webapp = conf.webapp - val webApp = new WebAppContext - webApp setContextPath conf.contextPath - webApp setResourceBase conf.webapp - webApp setEventListeners Array(new ScalatraListener) - - server setHandler webApp - - server.start() - } -} diff --git a/src/main/resources/scalatra/JsonUtil.scala b/src/main/resources/scalatra/JsonUtil.scala deleted file mode 100644 index 691a82f563b..00000000000 --- a/src/main/resources/scalatra/JsonUtil.scala +++ /dev/null @@ -1,12 +0,0 @@ -package json - -import com.fasterxml.jackson.module.scala.DefaultScalaModule -import com.fasterxml.jackson.core.JsonGenerator.Feature -import com.fasterxml.jackson.databind._ - -object JsonUtil { - val mapper = new ObjectMapper() - mapper.registerModule(new DefaultScalaModule()) - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) -} \ No newline at end of file diff --git a/src/main/resources/scalatra/README.mustache b/src/main/resources/scalatra/README.mustache deleted file mode 100644 index f8a560b776f..00000000000 --- a/src/main/resources/scalatra/README.mustache +++ /dev/null @@ -1,10 +0,0 @@ -# Swagger generated server - -## Overview -This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the -[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This -is an example of building a swagger-enabled scalatra server. - -This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: - -[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/src/main/resources/scalatra/ServletApp.mustache b/src/main/resources/scalatra/ServletApp.mustache deleted file mode 100644 index f6e53468ec9..00000000000 --- a/src/main/resources/scalatra/ServletApp.mustache +++ /dev/null @@ -1,39 +0,0 @@ -package com.wordnik.swagger.app - -import _root_.akka.actor.ActorSystem - -import org.scalatra.swagger.{ ApiInfo, SwaggerWithAuth, Swagger } -import org.scalatra.swagger.{JacksonSwaggerBase, Swagger} -import org.scalatra.ScalatraServlet -import org.json4s.{DefaultFormats, Formats} - -class ResourcesApp(implicit protected val system: ActorSystem, val swagger: SwaggerApp) - extends ScalatraServlet with JacksonSwaggerBase { - before() { - response.headers += ("Access-Control-Allow-Origin" -> "*") - } - - protected def buildFullUrl(path: String) = if (path.startsWith("http")) path else { - val port = request.getServerPort - val h = request.getServerName - val prot = if (port == 443) "https" else "http" - val (proto, host) = if (port != 80 && port != 443) ("http", h+":"+port.toString) else (prot, h) - "%s://%s%s%s".format( - proto, - host, - request.getContextPath, - path) - } -} - -class SwaggerApp extends Swagger(apiInfo = ApiSwagger.apiInfo, apiVersion = "1.0", swaggerVersion = "1.2") - -object ApiSwagger { - val apiInfo = ApiInfo( - """{{{appName}}}""", - """{{{appDescription}}}""", - """{{{infoUrl}}}""", - """{{{infoEmail}}}""", - """{{{licenseInfo}}}""", - """{{{licenseUrl}}}""") -} \ No newline at end of file diff --git a/src/main/resources/scalatra/api.mustache b/src/main/resources/scalatra/api.mustache deleted file mode 100644 index 54710361fe9..00000000000 --- a/src/main/resources/scalatra/api.mustache +++ /dev/null @@ -1,94 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} - -import java.io.File - -import org.scalatra.{ TypedParamSupport, ScalatraServlet } -import org.scalatra.swagger._ -import org.json4s._ -import org.json4s.JsonDSL._ -import org.scalatra.json.{ JValueResult, JacksonJsonSupport } -import org.scalatra.servlet.{FileUploadSupport, MultipartConfig, SizeConstraintExceededException} - -import scala.collection.JavaConverters._ - -class {{classname}} (implicit val swagger: Swagger) extends ScalatraServlet - with FileUploadSupport - with JacksonJsonSupport - with SwaggerSupport { - protected implicit val jsonFormats: Formats = DefaultFormats - - protected val applicationDescription: String = "{{classname}}" - override protected val applicationName: Option[String] = Some("{{baseName}}") - - before() { - contentType = formats("json") - response.headers += ("Access-Control-Allow-Origin" -> "*") - } -{{#operations}} -{{#operation}} - {{newline}} - - val {{nickname}}Operation = (apiOperation[{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]("{{nickname}}") - summary "{{{summary}}}" - parameters( - {{#allParams}}{{#isQueryParam}}queryParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} - {{/isQueryParam}} - {{#isPathParam}}pathParam[{{dataType}}]("{{paramName}}").description(""){{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} - {{/isPathParam}} - {{#isHeaderParam}}headerParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} - {{/isHeaderParam}} - {{#isBodyParam}}bodyParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} - {{/isBodyParam}} - {{#isFormParam}}formParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} - {{/isFormParam}} - {{#hasMore}},{{/hasMore}} - {{/allParams}}) - ) - - {{httpMethod}}("{{path}}",operation({{nickname}}Operation)) { - {{#allParams}} - {{#isFile}} - val {{paramName}} = fileParams("{{paramName}}") - {{/isFile}} - {{^isFile}} - {{#isPathParam}} - val {{paramName}} = params.getOrElse("{{paramName}}", halt(400)) - {{/isPathParam}} - - {{#isQueryParam}} - {{#collectionFormat}}val {{paramName}}String = params.getAs[String]("{{paramName}}") - val {{paramName}} = if("{{collectionFormat}}".equals("default")) { - {{paramName}}String match { - case Some(str) => str.split(",") - case None => List() - } - } - else - List() - {{/collectionFormat}} - {{^collectionFormat}}val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}"){{/collectionFormat}} - - {{/isQueryParam}} - - {{#isHeaderParam}} - val {{paramName}} = request.getHeader("{{paramName}}") - {{/isHeaderParam}} - - {{#isFormParam}} - val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}") - {{/isFormParam}} - - {{#isBodyParam}} - val {{paramName}} = parsedBody.extract[{{dataType}}] - {{/isBodyParam}} - {{/isFile}} - println("{{paramName}}: " + {{paramName}}) - {{/allParams}} - } - -{{/operation}} -{{/operations}} -} \ No newline at end of file diff --git a/src/main/resources/scalatra/build.sbt b/src/main/resources/scalatra/build.sbt deleted file mode 100644 index afe84c2c7f0..00000000000 --- a/src/main/resources/scalatra/build.sbt +++ /dev/null @@ -1,64 +0,0 @@ -import AssemblyKeys._ // put this at the top of the file - -import NativePackagerKeys._ - -packageArchetype.java_server - -assemblySettings - -scalariformSettings - -organization := "com.wordnik" - -seq(webSettings :_*) - -mainClass in assembly := Some("JettyMain") - -name := "scalatra-sample" - -version := "0.1.0-SNAPSHOT" - -scalaVersion := "2.11.2" - -scalacOptions += "-language:postfixOps" - -libraryDependencies ++= Seq( - "org.scalatest" %% "scalatest" % "2.2.1" % "test", - "org.scalatra" %% "scalatra" % "2.3.0.RC3", - "org.scalatra" %% "scalatra-scalate" % "2.3.0.RC3", - "org.scalatra" %% "scalatra-json" % "2.3.0.RC3", - "org.scalatra" %% "scalatra-swagger" % "2.3.0.RC3", - "org.scalatra" %% "scalatra-swagger-ext" % "2.3.0.RC3", - "org.scalatra" %% "scalatra-slf4j" % "2.3.0.RC3", - "org.json4s" %% "json4s-jackson" % "3.2.10", - "org.json4s" %% "json4s-ext" % "3.2.10", - "commons-codec" % "commons-codec" % "1.7", - "net.databinder.dispatch" %% "dispatch-core" % "0.11.2", - //"net.databinder.dispatch" %% "json4s-jackson" % "0.11.2", - "net.databinder.dispatch" %% "dispatch-json4s-jackson" % "0.11.2", - "com.typesafe.akka" %% "akka-actor" % "2.3.6", - "org.eclipse.jetty" % "jetty-server" % "9.2.3.v20140905" % "container;compile;test", - "org.eclipse.jetty" % "jetty-webapp" % "9.2.3.v20140905" % "container;compile;test", - "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;compile;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")) -) - -resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository" - -resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" - -resolvers += "Sonatype OSS Releases" at "http://oss.sonatype.org/content/repositories/releases/" - -ivyXML := - - - - - -mergeStrategy in assembly <<= (mergeStrategy in assembly) { - (old) => { - case "about.html" => MergeStrategy.discard - case x => old(x) - } -} - -net.virtualvoid.sbt.graph.Plugin.graphSettings diff --git a/src/main/resources/scalatra/model.mustache b/src/main/resources/scalatra/model.mustache deleted file mode 100644 index 8c5d1954662..00000000000 --- a/src/main/resources/scalatra/model.mustache +++ /dev/null @@ -1,15 +0,0 @@ -package {{package}} - -{{#imports}}import {{import}} -{{/imports}} - -{{#models}} - -{{#model}} -case class {{classname}} ( - {{#vars}}{{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}] {{#description}} // {{description}}{{/description}} - {{/isNotRequired}}{{#hasMore}}, - {{/hasMore}}{{/vars}} -) -{{/model}} -{{/models}} \ No newline at end of file diff --git a/src/main/resources/scalatra/project/build.properties b/src/main/resources/scalatra/project/build.properties deleted file mode 100644 index be6c454fbac..00000000000 --- a/src/main/resources/scalatra/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.13.5 diff --git a/src/main/resources/scalatra/project/plugins.sbt b/src/main/resources/scalatra/project/plugins.sbt deleted file mode 100644 index 7358abbbbc6..00000000000 --- a/src/main/resources/scalatra/project/plugins.sbt +++ /dev/null @@ -1,9 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1") - -addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.5") - -addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0") - -addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") - -addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") diff --git a/src/main/resources/scalatra/sbt b/src/main/resources/scalatra/sbt deleted file mode 100755 index 08e58821219..00000000000 --- a/src/main/resources/scalatra/sbt +++ /dev/null @@ -1,525 +0,0 @@ -#!/usr/bin/env bash -# -# A more capable sbt runner, coincidentally also called sbt. -# Author: Paul Phillips - -# todo - make this dynamic -declare -r sbt_release_version="0.13.6" -declare -r sbt_unreleased_version="0.13.6" -declare -r buildProps="project/build.properties" - -declare sbt_jar sbt_dir sbt_create sbt_version -declare scala_version sbt_explicit_version -declare verbose noshare batch trace_level log_level -declare sbt_saved_stty debugUs - -echoerr () { echo >&2 "$@"; } -vlog () { [[ -n "$verbose" ]] && echoerr "$@"; } - -# spaces are possible, e.g. sbt.version = 0.13.0 -build_props_sbt () { - [[ -r "$buildProps" ]] && \ - grep '^sbt\.version' "$buildProps" | tr '=' ' ' | awk '{ print $2; }' -} - -update_build_props_sbt () { - local ver="$1" - local old="$(build_props_sbt)" - - [[ -r "$buildProps" ]] && [[ "$ver" != "$old" ]] && { - perl -pi -e "s/^sbt\.version\b.*\$/sbt.version=${ver}/" "$buildProps" - grep -q '^sbt.version[ =]' "$buildProps" || printf "\nsbt.version=%s\n" "$ver" >> "$buildProps" - - vlog "!!!" - vlog "!!! Updated file $buildProps setting sbt.version to: $ver" - vlog "!!! Previous value was: $old" - vlog "!!!" - } -} - -set_sbt_version () { - sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" - [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version - export sbt_version -} - -# restore stty settings (echo in particular) -onSbtRunnerExit() { - [[ -n "$sbt_saved_stty" ]] || return - vlog "" - vlog "restoring stty: $sbt_saved_stty" - stty "$sbt_saved_stty" - unset sbt_saved_stty -} - -# save stty and trap exit, to ensure echo is reenabled if we are interrupted. -trap onSbtRunnerExit EXIT -sbt_saved_stty="$(stty -g 2>/dev/null)" -vlog "Saved stty: $sbt_saved_stty" - -# this seems to cover the bases on OSX, and someone will -# have to tell me about the others. -get_script_path () { - local path="$1" - [[ -L "$path" ]] || { echo "$path" ; return; } - - local target="$(readlink "$path")" - if [[ "${target:0:1}" == "/" ]]; then - echo "$target" - else - echo "${path%/*}/$target" - fi -} - -die() { - echo "Aborting: $@" - exit 1 -} - -make_url () { - version="$1" - - case "$version" in - 0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;; - 0.10.* ) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - 0.11.[12]) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; - *) echo "$sbt_launch_repo/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; - esac -} - -init_default_option_file () { - local overriding_var="${!1}" - local default_file="$2" - if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then - local envvar_file="${BASH_REMATCH[1]}" - if [[ -r "$envvar_file" ]]; then - default_file="$envvar_file" - fi - fi - echo "$default_file" -} - -declare -r cms_opts="-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" -declare -r jit_opts="-XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation" -declare -r default_jvm_opts_common="-Xms512m -Xmx1536m -Xss2m $jit_opts $cms_opts" -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" -declare -r latest_28="2.8.2" -declare -r latest_29="2.9.3" -declare -r latest_210="2.10.4" -declare -r latest_211="2.11.2" - -declare -r script_path="$(get_script_path "$BASH_SOURCE")" -declare -r script_name="${script_path##*/}" - -# some non-read-onlies set with defaults -declare java_cmd="java" -declare sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" -declare jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" -declare sbt_launch_repo="http://typesafe.artifactoryonline.com/typesafe/ivy-releases" - -# pull -J and -D options to give to java. -declare -a residual_args -declare -a java_args -declare -a scalac_args -declare -a sbt_commands - -# args to jvm/sbt via files or environment variables -declare -a extra_jvm_opts extra_sbt_opts - -# if set, use JAVA_HOME over java found in path -[[ -e "$JAVA_HOME/bin/java" ]] && java_cmd="$JAVA_HOME/bin/java" - -# directory to store sbt launchers -declare sbt_launch_dir="$HOME/.sbt/launchers" -[[ -d "$sbt_launch_dir" ]] || mkdir -p "$sbt_launch_dir" -[[ -w "$sbt_launch_dir" ]] || sbt_launch_dir="$(mktemp -d -t sbt_extras_launchers.XXXXXX)" - -java_version () { - local version=$("$java_cmd" -version 2>&1 | grep -e 'java version' | awk '{ print $3 }' | tr -d \") - vlog "Detected Java version: $version" - echo "${version:2:1}" -} - -# MaxPermSize critical on pre-8 jvms but incurs noisy warning on 8+ -default_jvm_opts () { - local v="$(java_version)" - if [[ $v -ge 8 ]]; then - echo "$default_jvm_opts_common" - else - echo "-XX:MaxPermSize=384m $default_jvm_opts_common" - fi -} - -build_props_scala () { - if [[ -r "$buildProps" ]]; then - versionLine="$(grep '^build.scala.versions' "$buildProps")" - versionString="${versionLine##build.scala.versions=}" - echo "${versionString%% .*}" - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - vlog "# Executing command line:" && { - for arg; do - if [[ -n "$arg" ]]; then - if printf "%s\n" "$arg" | grep -q ' '; then - printf >&2 "\"%s\"\n" "$arg" - else - printf >&2 "%s\n" "$arg" - fi - fi - done - vlog "" - } - - [[ -n "$batch" ]] && exec /dev/null; then - curl --fail --silent "$url" --output "$jar" - elif which wget >/dev/null; then - wget --quiet -O "$jar" "$url" - fi - } && [[ -r "$jar" ]] -} - -acquire_sbt_jar () { - sbt_url="$(jar_url "$sbt_version")" - sbt_jar="$(jar_file "$sbt_version")" - - [[ -r "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar" -} - -usage () { - cat < display stack traces with a max of frames (default: -1, traces suppressed) - -debug-inc enable debugging log for the incremental compiler - -no-colors disable ANSI color codes - -sbt-create start sbt even if current directory contains no sbt project - -sbt-dir path to global settings/plugins directory (default: ~/.sbt/) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11+) - -ivy path to local Ivy repository (default: ~/.ivy2) - -no-share use all local caches; no sharing - -offline put sbt in offline mode - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - -prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted - - # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version) - -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version - -sbt-version use the specified version of sbt (default: $sbt_release_version) - -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version - -sbt-jar use the specified jar as the sbt launcher - -sbt-launch-dir directory to hold sbt launchers (default: ~/.sbt/launchers) - -sbt-launch-repo repo url for downloading sbt launcher jar (default: $sbt_launch_repo) - - # scala version (default: as chosen by sbt) - -28 use $latest_28 - -29 use $latest_29 - -210 use $latest_210 - -211 use $latest_211 - -scala-home use the scala build at the specified directory - -scala-version use the specified version of scala - -binary-version use the specified scala version when searching for dependencies - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution - # The default set is used if JVM_OPTS is unset and no -jvm-opts file is found - $(default_jvm_opts) - JVM_OPTS environment variable holding either the jvm args directly, or - the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts') - Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument. - -jvm-opts file containing jvm args (if not given, .jvmopts in project root is used if present) - -Dkey=val pass -Dkey=val directly to the jvm - -J-X pass option -X directly to the jvm (-J is stripped) - - # passing options to sbt, OR to this runner - SBT_OPTS environment variable holding either the sbt args directly, or - the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts') - Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument. - -sbt-opts file containing sbt args (if not given, .sbtopts in project root is used if present) - -S-X add -X to sbt's scalacOptions (-S is stripped) -EOM -} - -addJava () { - vlog "[addJava] arg = '$1'" - java_args=( "${java_args[@]}" "$1" ) -} -addSbt () { - vlog "[addSbt] arg = '$1'" - sbt_commands=( "${sbt_commands[@]}" "$1" ) -} -setThisBuild () { - vlog "[addBuild] args = '$@'" - local key="$1" && shift - addSbt "set $key in ThisBuild := $@" -} - -addScalac () { - vlog "[addScalac] arg = '$1'" - scalac_args=( "${scalac_args[@]}" "$1" ) -} -addResidual () { - vlog "[residual] arg = '$1'" - residual_args=( "${residual_args[@]}" "$1" ) -} -addResolver () { - addSbt "set resolvers += $1" -} -addDebugger () { - addJava "-Xdebug" - addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" -} -setScalaVersion () { - [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' - addSbt "++ $1" -} - -process_args () -{ - require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - die "$opt requires <$type> argument" - fi - } - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 1 ;; - -v) verbose=true && shift ;; - -d) addSbt "--debug" && shift ;; - -w) addSbt "--warn" && shift ;; - -q) addSbt "--error" && shift ;; - -x) debugUs=true && shift ;; - -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) noshare=true && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -offline) addSbt "set offline := true" && shift ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;; - -batch) batch=true && shift ;; - -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;; - - -sbt-create) sbt_create=true && shift ;; - -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; - -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; - -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;; - -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;; - -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; - -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;; - -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;; - -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;; - -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "Some(file(\"$2\"))" && shift 2 ;; - -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; - -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;; - -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;; - - -D*) addJava "$1" && shift ;; - -J*) addJava "${1:2}" && shift ;; - -S*) addScalac "${1:2}" && shift ;; - -28) setScalaVersion "$latest_28" && shift ;; - -29) setScalaVersion "$latest_29" && shift ;; - -210) setScalaVersion "$latest_210" && shift ;; - -211) setScalaVersion "$latest_211" && shift ;; - - *) addResidual "$1" && shift ;; - esac - done -} - -# process the direct command line arguments -process_args "$@" - -# skip #-styled comments and blank lines -readConfigFile() { - while read line; do - [[ $line =~ ^# ]] || [[ -z $line ]] || echo "$line" - done < "$1" -} - -# if there are file/environment sbt_opts, process again so we -# can supply args to this runner -if [[ -r "$sbt_opts_file" ]]; then - vlog "Using sbt options defined in file $sbt_opts_file" - while read opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file") -elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then - vlog "Using sbt options defined in variable \$SBT_OPTS" - extra_sbt_opts=( $SBT_OPTS ) -else - vlog "No extra sbt options have been defined" -fi - -[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}" - -# reset "$@" to the residual args -set -- "${residual_args[@]}" -argumentCount=$# - -# set sbt version -set_sbt_version - -# only exists in 0.12+ -setTraceLevel() { - case "$sbt_version" in - "0.7."* | "0.10."* | "0.11."* ) echoerr "Cannot set trace level in sbt version $sbt_version" ;; - *) setThisBuild traceLevel $trace_level ;; - esac -} - -# set scalacOptions if we were given any -S opts -[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[@]}\"" - -# Update build.properties on disk to set explicit version - sbt gives us no choice -[[ -n "$sbt_explicit_version" ]] && update_build_props_sbt "$sbt_explicit_version" -vlog "Detected sbt version $sbt_version" - -[[ -n "$scala_version" ]] && vlog "Overriding scala version to $scala_version" - -# no args - alert them there's stuff in here -(( argumentCount > 0 )) || { - vlog "Starting $script_name: invoke with -help for other options" - residual_args=( shell ) -} - -# verify this is an sbt dir or -create was given -[[ -r ./build.sbt || -d ./project || -n "$sbt_create" ]] || { - cat < - - - org.scalatra.servlet.ScalatraListener - - - - default - /*.html - /css/* - /js/*.js - /images/* - - diff --git a/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css b/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css deleted file mode 100644 index a3352d774ce..00000000000 --- a/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css +++ /dev/null @@ -1,1092 +0,0 @@ -/*! - * Bootstrap Responsive v2.2.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -@-ms-viewport { - width: device-width; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:hover { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/src/main/resources/swagger-static/assets/css/bootstrap.css b/src/main/resources/swagger-static/assets/css/bootstrap.css deleted file mode 100644 index db3b3bfd6a0..00000000000 --- a/src/main/resources/swagger-static/assets/css/bootstrap.css +++ /dev/null @@ -1,6057 +0,0 @@ -/*! - * Bootstrap v2.2.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover { - color: #356635; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 25px; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - margin-bottom: 5px; - font-size: 0; - white-space: nowrap; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table, table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -table th, -.table td, -table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th, -table th { - font-weight: bold; -} - -.table thead th, -table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td, -table caption + thead tr:first-child th, -table caption + thead tr:first-child td, -table colgroup + thead tr:first-child th, -table colgroup + thead tr:first-child td, -table thead:first-child tr:first-child th, -table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody, -table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table, -table table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th, -table tbody > tr:nth-child(odd) > td, -table tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover td, -.table-hover tbody tr:hover th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success td, -table tbody tr.success td { - background-color: #dff0d8; -} - -.table tbody tr.error td, -table tbody tr.error td { - background-color: #f2dede; -} - -.table tbody tr.warning td, -table tbody tr.warning td { - background-color: #fcf8e3; -} - -.table tbody tr.info td, -table tbody tr.info td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu li > a:focus, -.dropdown-submenu:hover > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .disabled > a, -.dropdown-menu .disabled > a:hover { - color: #999999; -} - -.dropdown-menu .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #bbbbbb; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #a2a2a2; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #c5c5c5; - border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-mini .caret, -.btn-small .caret, -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -3px; -} - -.tooltip.right { - margin-left: 3px; -} - -.tooltip.bottom { - margin-top: 3px; -} - -.tooltip.left { - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - width: 236px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media .pull-left { - margin-right: 10px; -} - -.media .pull-right { - margin-left: 10px; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} \ No newline at end of file diff --git a/src/main/resources/swagger-static/assets/css/site.css b/src/main/resources/swagger-static/assets/css/site.css deleted file mode 100644 index 2c4cd52d35f..00000000000 --- a/src/main/resources/swagger-static/assets/css/site.css +++ /dev/null @@ -1 +0,0 @@ -site.css \ No newline at end of file diff --git a/src/main/resources/swagger-static/assets/css/style.css b/src/main/resources/swagger-static/assets/css/style.css deleted file mode 100644 index b26d2ef13ca..00000000000 --- a/src/main/resources/swagger-static/assets/css/style.css +++ /dev/null @@ -1,292 +0,0 @@ -.line-numbers { - margin-right: 1.0em; -} - -.content { - padding-bottom: 100px; -} - -.column_header_name { - width: 150px; -} - -.column_header_path { - width: 350px; -} - -.column_header_name .column_header_param_type .column_header_data_type .column_header_return_type { - width: 200px; -} - -.expandable { - display: none; -} - -.main_content { - margin-top: 80px; - margin-left: 25px; - margin-right: 25px; -} - -.model { - float: left; -} - -.model-container { - float: left; - width: 500px; - padding: 0px; -} - -.model-detail-container { - clear: left; - float: left; - width: 500px; - margin-left: 40px; -} - -.model-detail-popup { - box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; - border-style: solid; - border-width: 1px; - border-color: black; - padding-left: 10px; - padding-right: 10px; - padding-top: 10px; - padding-bottom: 10px; - background-color: white; - opacity: 0.99; - z-index: 1; - overflow: scroll; - width: 400px; -} - -.model-detail-popup .code { - background-color: #E4F5FF; - font-family: monospace; - white-space: pre; - margin: 10px; - overflow: auto; -} - -.model-detail-popup h2 { - margin-top: 0px; - padding-top: 0px; -} - -.model-detail-popup li { - padding-bottom: 5px; -} - -.model-detail-popup .param-reqiured-true { - font-family: monospace; - font-weight: bold; - clear: left; - display: block; - float: left; - width: 100%; -} - -.model-detail-popup .param-required-false { - font-family: monospace; - clear: left; - display: block; - float: left; - width: 100%; -} - -.model-detail-popup .param-description { - margin-left: 50px; - float: left; -} - -.section-header { - border-bottom: 2px; - font-weight: bold; - font-size: 15px; - padding: 6px 0; - color: rgb(57,57,57); -} - -.content { - padding-top: 100px; -} - -.content h1 { - font-size: 43px; - text-align: center; - margin-top: 40px; - margin-bottom: 40px; -} - -.sidebar { - box-sizing: border-box; - float: left; - display: block; - width: 240px; - overflow: scroll; - position: fixed; -} - -.section-box { - border-bottom-style: solid; - border-bottom: 10px; -} - -.section-box ul li { - list-style: none; - margin-left: 0px; -} - -.non-sidebar { - box-sizing: border-box; - display: block; - margin-left: 240px; - margin-right: 0px; - width: 638px; -} - -.non-sidebar h2 { - clear: left; - padding-top: 20px; -} - -.param { - display: block; - float: left; - width: 220px; - clear: left; -} - -.param-description { - float: left; - font-family: 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif; -} - -.param-optional-flag { - font-style: italic; -} - -.section { - font-weight: normal; - clear: left; -} - -.section a { - text-decoration: underline; -} - -.code { - background-color: #E4F5FF; - font-family: monospace; - white-space: pre; - margin: 10px; - overflow: auto; - width: 600px; -} - -.header { - position: fixed; - text-align: left; - background-color: black; - float: left; - top: 0; - width: 100%; - height: 70px auto; - padding-bottom: 20px; - box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; -} - -.top-bar h1 a { - width: auto; -} - -.top-bar h1#logo a { - width: auto; - display: block; - clear: none; - float: left; - background-position: left;; - color: white; - text-decoration: none; -} - -.top-bar ul li { - list-style: none; -} - -.top-bar h1#logo span { - display: block; - clear: none; - float: left; - padding-top: 10px; - padding-left: 10px; - margin: 0px; -} - -.top-bar h1#logo a span.light { - color: #ffc97a; - color: #666666; - padding-left: 0px; -} - -.top-bar ul#nav { - float: none; - clear: both; - overflow: hidden; - margin: 0; - padding: 0; - display: block; - float: right; - clear: none; -} - -.top-bar ul#nav li { - float: left; - clear: none; - margin: 0; - padding: 2px 10px; - border-right: 1px solid #dddddd; -} - -.top-bar ul#nav li:first-child, .top-bar ul#nav li.first { - padding-left: 0; -} - -.top-bar ul#nav li:last-child, .top-bar ul#nav li.last { - padding-right: 0; - border-right: none; -} - -.top-bar ul#nav li { - border: none; - padding: 0 5px; -} - -.top-bar ul#nav li a { - display: block; - padding: 8px 10px 8px 10px; - color: #999999; - text-decoration: none; -} - -.top-bar ul#nav li a.strong { - color: white; -} - -.top-bar ul#nav li a:active, .top-bar ul#nav li a.active, .top-bar ul#nav li a:hover { - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - -o-border-radius: 4px; - -ms-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - background-image: -webkit-gradient(linear, 0% 100%, 0% 0%, color-stop(0%, #ff5401), color-stop(100%, #ffa014)); - background-image: -moz-linear-gradient(bottom, #ff5401 0%, #ffa014 100%); - background-image: linear-gradient(bottom, #ff5401 0%, #ffa014 100%); - color: white; -} - -.top-bar ul#nav:hover li { - border-color: #222222; -} \ No newline at end of file diff --git a/src/main/resources/swagger-static/assets/images/logo.png b/src/main/resources/swagger-static/assets/images/logo.png deleted file mode 100644 index 209e5a473fc0fcb6dcda9eb4cb660f72008929fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14577 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 (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle() - } - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.item.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - e = $.Event('slide', { - relatedTarget: $next[0] - }) - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - , action = typeof option == 'string' ? option : options.slide - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL NO CONFLICT - * ==================== */ - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - /* CAROUSEL DATA-API - * ================= */ - - $(document).on('click.carousel.data-api', '[data-slide]', function (e) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.2.2 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, 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. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSE NO CONFLICT - * ==================== */ - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - /* COLLAPSE DATA-API - * ================= */ - - $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - $(target).collapse(option) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.2.2 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, 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. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle=dropdown]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , isActive - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - $parent.toggleClass('open') - } - - $this.focus() - - return false - } - - , keydown: function (e) { - var $this - , $items - , $active - , $parent - , isActive - , index - - if (!/(38|40|27)/.test(e.keyCode)) return - - $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - $parent = getParent($this) - - isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) return $this.click() - - $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items - .eq(index) - .focus() - } - - } - - function clearMenus() { - $(toggle).each(function () { - getParent($(this)).removeClass('open') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - return $parent - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* DROPDOWN NO CONFLICT - * ==================== */ - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(document) - .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) - .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery);/* ========================================================= - * bootstrap-modal.js v2.2.2 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, 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. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - this.options.remote && this.$element.find('.modal-body').load(this.options.remote) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : - that.$element.focus().trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - - $.support.transition && this.$element.hasClass('fade') ? - this.hideWithTransition() : - this.hideModal() - } - - , enforceFocus: function () { - var that = this - $(document).on('focusin.modal', function (e) { - if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { - that.$element.focus() - } - }) - } - - , escape: function () { - var that = this - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.modal') - } - } - - , hideWithTransition: function () { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - that.hideModal() - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - that.hideModal() - }) - } - - , hideModal: function (that) { - this.$element - .hide() - .trigger('hidden') - - this.backdrop() - } - - , removeBackdrop: function () { - this.$backdrop.remove() - this.$backdrop = null - } - - , backdrop: function (callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $(' - - - \ No newline at end of file diff --git a/src/test/resources/1_2/petstore-1.2/api-docs b/src/test/resources/1_2/petstore-1.2/api-docs deleted file mode 100644 index 370eca562a7..00000000000 --- a/src/test/resources/1_2/petstore-1.2/api-docs +++ /dev/null @@ -1,60 +0,0 @@ -{ - "apiVersion": "1.0.0", - "swaggerVersion": "1.2", - "apis": [ - { - "path": "/pet", - "description": "Operations about pets" - }, - { - "path": "/user", - "description": "Operations about user" - }, - { - "path": "/store", - "description": "Operations about store" - } - ], - "authorizations": { - "oauth2": { - "type": "oauth2", - "scopes": [ - { - "scope": "email", - "description": "Access to your email address" - }, - { - "scope": "pets", - "description": "Access to your pets" - } - ], - "grantTypes": { - "implicit": { - "loginEndpoint": { - "url": "http://petstore.swagger.wordnik.com/oauth/dialog" - }, - "tokenName": "access_token" - }, - "authorization_code": { - "tokenRequestEndpoint": { - "url": "http://petstore.swagger.wordnik.com/oauth/requestToken", - "clientIdName": "client_id", - "clientSecretName": "client_secret" - }, - "tokenEndpoint": { - "url": "http://petstore.swagger.wordnik.com/oauth/token", - "tokenName": "access_code" - } - } - } - } - }, - "info": { - "title": "Swagger Sample App", - "description": "This is a sample server Petstore server. You can find out more about Swagger \n at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample,\n you can use the api key \"special-key\" to test the authorization filters", - "termsOfServiceUrl": "http://helloreverb.com/terms/", - "contact": "apiteam@wordnik.com", - "license": "Apache 2.0", - "licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.html" - } -} \ No newline at end of file diff --git a/src/test/resources/1_2/petstore-1.2/pet b/src/test/resources/1_2/petstore-1.2/pet deleted file mode 100644 index 4a8439a4424..00000000000 --- a/src/test/resources/1_2/petstore-1.2/pet +++ /dev/null @@ -1,425 +0,0 @@ -{ - "apiVersion": "1.0.0", - "swaggerVersion": "1.2", - "basePath": "http://petstore.swagger.wordnik.com/api", - "resourcePath": "/pet", - "produces": [ - "application/json", - "application/xml", - "text/plain", - "text/html" - ], - "apis": [ - { - "path": "/pet/{petId}", - "operations": [ - { - "method": "GET", - "summary": "Find pet by ID", - "notes": "Returns a pet based on ID", - "type": "Pet", - "nickname": "getPetById", - "authorizations": {}, - "parameters": [ - { - "name": "petId", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "integer", - "format": "int64", - "paramType": "path", - "minimum": "1.0", - "maximum": "100000.0" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid ID supplied" - }, - { - "code": 404, - "message": "Pet not found" - } - ] - }, - { - "method": "PATCH", - "summary": "partial updates to a pet", - "notes": "", - "type": "array", - "items": { - "$ref": "Pet" - }, - "nickname": "partialUpdate", - "produces": [ - "application/json", - "application/xml" - ], - "consumes": [ - "application/json", - "application/xml" - ], - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "petId", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "paramType": "path" - }, - { - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "type": "Pet", - "paramType": "body" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid tag value" - } - ] - }, - { - "method": "POST", - "summary": "Updates a pet in the store with form data", - "notes": "", - "type": "void", - "nickname": "updatePetWithForm", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "petId", - "description": "ID of pet that needs to be updated", - "required": true, - "type": "string", - "paramType": "path" - }, - { - "name": "name", - "description": "Updated name of the pet", - "required": false, - "type": "string", - "paramType": "form" - }, - { - "name": "status", - "description": "Updated status of the pet", - "required": false, - "type": "string", - "paramType": "form" - } - ], - "responseMessages": [ - { - "code": 405, - "message": "Invalid input" - } - ] - }, - { - "method": "DELETE", - "summary": "Deletes a pet", - "notes": "", - "type": "void", - "nickname": "deletePet", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "petId", - "description": "Pet id to delete", - "required": true, - "type": "string", - "paramType": "path" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid pet value" - } - ] - } - ] - }, - { - "path": "/pet", - "operations": [ - { - "method": "PUT", - "summary": "Update an existing pet", - "notes": "", - "type": "void", - "nickname": "updatePet", - "authorizations": {}, - "parameters": [ - { - "name": "body", - "description": "Pet object that needs to be updated in the store", - "required": true, - "type": "Pet", - "paramType": "body" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid ID supplied" - }, - { - "code": 404, - "message": "Pet not found" - }, - { - "code": 405, - "message": "Validation exception" - } - ] - }, - { - "method": "POST", - "summary": "Add a new pet to the store", - "notes": "", - "type": "void", - "nickname": "addPet", - "consumes": [ - "application/json", - "application/xml" - ], - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": true, - "type": "Pet", - "paramType": "body" - } - ], - "responseMessages": [ - { - "code": 405, - "message": "Invalid input" - } - ] - } - ] - }, - { - "path": "/pet/findByStatus", - "operations": [ - { - "method": "GET", - "summary": "Finds Pets by status", - "notes": "Multiple status values can be provided with comma seperated strings", - "type": "array", - "items": { - "$ref": "Pet" - }, - "nickname": "findPetsByStatus", - "authorizations": {}, - "parameters": [ - { - "name": "status", - "description": "Status values that need to be considered for filter", - "defaultValue": "available", - "required": true, - "type": "string", - "paramType": "query", - "enum": [ - "available", - "pending", - "sold" - ] - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid status value" - } - ] - } - ] - }, - { - "path": "/pet/findByTags", - "operations": [ - { - "method": "GET", - "summary": "Finds Pets by tags", - "notes": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", - "type": "array", - "items": { - "$ref": "Pet" - }, - "nickname": "findPetsByTags", - "authorizations": {}, - "parameters": [ - { - "name": "tags", - "description": "Tags to filter by", - "required": true, - "type": "string", - "paramType": "query" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid tag value" - } - ], - "deprecated": "true" - } - ] - }, - { - "path": "/pet/uploadImage", - "operations": [ - { - "method": "POST", - "summary": "uploads an image", - "notes": "", - "type": "void", - "nickname": "uploadFile", - "consumes": [ - "multipart/form-data" - ], - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - }, - { - "scope": "test:nothing", - "description": "nothing" - } - ] - }, - "parameters": [ - { - "name": "additionalMetadata", - "description": "Additional data to pass to server", - "required": false, - "type": "string", - "paramType": "form" - }, - { - "name": "file", - "description": "file to upload", - "required": false, - "type": "File", - "paramType": "body" - } - ] - } - ] - } - ], - "models": { - "Tag": { - "id": "Tag", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - }, - "Pet": { - "id": "Pet", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64", - "description": "unique identifier for the pet", - "minimum": "0.0", - "maximum": "100.0" - }, - "category": { - "$ref": "Category" - }, - "name": { - "type": "string" - }, - "photoUrls": { - "type": "array", - "items": { - "type": "string" - } - }, - "tags": { - "type": "array", - "items": { - "$ref": "Tag" - } - }, - "status": { - "type": "string", - "description": "pet status in the store", - "enum": [ - "available", - "pending", - "sold" - ] - } - } - }, - "Category": { - "id": "Category", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/1_2/petstore-1.2/store b/src/test/resources/1_2/petstore-1.2/store deleted file mode 100644 index e59994447cd..00000000000 --- a/src/test/resources/1_2/petstore-1.2/store +++ /dev/null @@ -1,145 +0,0 @@ -{ - "apiVersion": "1.0.0", - "swaggerVersion": "1.2", - "basePath": "http://petstore.swagger.wordnik.com/api", - "resourcePath": "/store", - "produces": [ - "application/json" - ], - "apis": [ - { - "path": "/store/order/{orderId}", - "operations": [ - { - "method": "GET", - "summary": "Find purchase order by ID", - "notes": "For valid response try integer IDs with value <= 5. Anything above 5 or nonintegers will generate API errors", - "type": "Order", - "nickname": "getOrderById", - "authorizations": {}, - "parameters": [ - { - "name": "orderId", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string", - "paramType": "path" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid ID supplied" - }, - { - "code": 404, - "message": "Order not found" - } - ] - }, - { - "method": "DELETE", - "summary": "Delete purchase order by ID", - "notes": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "type": "void", - "nickname": "deleteOrder", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "orderId", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "string", - "paramType": "path" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid ID supplied" - }, - { - "code": 404, - "message": "Order not found" - } - ] - } - ] - }, - { - "path": "/store/order", - "operations": [ - { - "method": "POST", - "summary": "Place an order for a pet", - "notes": "", - "type": "void", - "nickname": "placeOrder", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "body", - "description": "order placed for purchasing the pet", - "required": true, - "type": "Order", - "paramType": "body" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid order" - } - ] - } - ] - } - ], - "models": { - "Order": { - "id": "Order", - "description": "an order in the system", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "petId": { - "type": "integer", - "format": "int64" - }, - "quantity": { - "type": "integer", - "format": "int32" - }, - "status": { - "type": "string", - "description": "Order Status", - "enum": [ - "placed", - " approved", - " delivered" - ] - }, - "shipDate": { - "type": "string", - "format": "date-time" - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/1_2/petstore-1.2/user b/src/test/resources/1_2/petstore-1.2/user deleted file mode 100644 index c9eb3f6ff78..00000000000 --- a/src/test/resources/1_2/petstore-1.2/user +++ /dev/null @@ -1,299 +0,0 @@ -{ - "apiVersion": "1.0.0", - "swaggerVersion": "1.2", - "basePath": "http://petstore.swagger.wordnik.com/api", - "resourcePath": "/user", - "produces": [ - "application/json" - ], - "apis": [ - { - "path": "/user", - "operations": [ - { - "method": "POST", - "summary": "Create user", - "notes": "This can only be done by the logged in user.", - "type": "void", - "nickname": "createUser", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "body", - "description": "Created user object", - "required": true, - "type": "User", - "paramType": "body" - } - ] - } - ] - }, - { - "path": "/user/logout", - "operations": [ - { - "method": "GET", - "summary": "Logs out current logged in user session", - "notes": "", - "type": "void", - "nickname": "logoutUser", - "authorizations": {}, - "parameters": [] - } - ] - }, - { - "path": "/user/createWithArray", - "operations": [ - { - "method": "POST", - "summary": "Creates list of users with given input array", - "notes": "", - "type": "void", - "nickname": "createUsersWithArrayInput", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "body", - "description": "List of user object", - "required": true, - "type": "array", - "items": { - "$ref": "User" - }, - "paramType": "body" - } - ] - } - ] - }, - { - "path": "/user/createWithList", - "operations": [ - { - "method": "POST", - "summary": "Creates list of users with given list input", - "notes": "", - "type": "void", - "nickname": "createUsersWithListInput", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "body", - "description": "List of user object", - "required": true, - "type": "array", - "items": { - "$ref": "User" - }, - "paramType": "body" - } - ] - } - ] - }, - { - "path": "/user/{username}", - "operations": [ - { - "method": "PUT", - "summary": "Updated user", - "notes": "This can only be done by the logged in user.", - "type": "void", - "nickname": "updateUser", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "username", - "description": "name that need to be deleted", - "required": true, - "type": "string", - "paramType": "path" - }, - { - "name": "body", - "description": "Updated user object", - "required": true, - "type": "User", - "paramType": "body" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid username supplied" - }, - { - "code": 404, - "message": "User not found" - } - ] - }, - { - "method": "DELETE", - "summary": "Delete user", - "notes": "This can only be done by the logged in user.", - "type": "void", - "nickname": "deleteUser", - "authorizations": { - "oauth2": [ - { - "scope": "test:anything", - "description": "anything" - } - ] - }, - "parameters": [ - { - "name": "username", - "description": "The name that needs to be deleted", - "required": true, - "type": "string", - "paramType": "path" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid username supplied" - }, - { - "code": 404, - "message": "User not found" - } - ] - }, - { - "method": "GET", - "summary": "Get user by user name", - "notes": "", - "type": "User", - "nickname": "getUserByName", - "authorizations": {}, - "parameters": [ - { - "name": "username", - "description": "The name that needs to be fetched. Use user1 for testing.", - "required": true, - "type": "string", - "paramType": "path" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid username supplied" - }, - { - "code": 404, - "message": "User not found" - } - ] - } - ] - }, - { - "path": "/user/login", - "operations": [ - { - "method": "GET", - "summary": "Logs user into the system", - "notes": "", - "type": "string", - "nickname": "loginUser", - "authorizations": {}, - "parameters": [ - { - "name": "username", - "description": "The user name for login", - "required": true, - "type": "string", - "paramType": "query" - }, - { - "name": "password", - "description": "The password for login in clear text", - "required": true, - "type": "string", - "paramType": "query" - } - ], - "responseMessages": [ - { - "code": 400, - "message": "Invalid username and password combination" - } - ] - } - ] - } - ], - "models": { - "User": { - "id": "User", - "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "firstName": { - "type": "string" - }, - "username": { - "type": "string" - }, - "lastName": { - "type": "string" - }, - "email": { - "type": "string" - }, - "password": { - "type": "string" - }, - "phone": { - "type": "string" - }, - "userStatus": { - "type": "integer", - "format": "int32", - "description": "User Status", - "enum": [ - "1-registered", - "2-active", - "3-closed" - ] - } - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/2_0/petstore.json b/src/test/resources/2_0/petstore.json deleted file mode 100644 index daa8ef91b15..00000000000 --- a/src/test/resources/2_0/petstore.json +++ /dev/null @@ -1,951 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", - "version": "1.0.0", - "title": "Swagger Petstore", - "termsOfService": "http://helloreverb.com/terms/", - "contact": { - "name": "apiteam@wordnik.com" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/v2", - "schemes": [ - "http" - ], - "paths": { - "/pet": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new pet to the store", - "description": "", - "operationId": "addPet", - "consumes": [ - "application/json", - "application/xml" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Pet object that needs to be added to the store", - "required": false, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "put": { - "tags": [ - "pet" - ], - "summary": "Update an existing pet", - "description": "", - "operationId": "updatePet", - "consumes": [ - "application/json", - "application/xml" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Pet object that needs to be added to the store", - "required": false, - "schema": { - "$ref": "#/definitions/Pet" - } - } - ], - "responses": { - "405": { - "description": "Validation exception" - }, - "404": { - "description": "Pet not found" - }, - "400": { - "description": "Invalid ID supplied" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByStatus": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by status", - "description": "Multiple status values can be provided with comma seperated strings", - "operationId": "findPetsByStatus", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "query", - "name": "status", - "description": "Status values that need to be considered for filter", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid status value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/findByTags": { - "get": { - "tags": [ - "pet" - ], - "summary": "Finds Pets by tags", - "description": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", - "operationId": "findPetsByTags", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "query", - "name": "tags", - "description": "Tags to filter by", - "required": false, - "type": "array", - "items": { - "type": "string" - }, - "collectionFormat": "multi" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Pet" - } - } - }, - "400": { - "description": "Invalid tag value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/pet/{petId}/upload": { - "post": { - "tags": [ "pet" ], - "summary": "Upload an image for a pet", - "operationId": "uploadImage", - "consumes": [ - "multipart/form-data" - ], - "parameters": [ - { - "in": "formData", - "name": "petImage", - "description": "image to upload", - "type": "file" - } - ], - "responses": { - "default": { - "description": "it worked" - } - } - } - }, - "/pet/{petId}": { - "get": { - "tags": [ - "pet" - ], - "summary": "Find pet by ID", - "description": "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", - "operationId": "getPetById", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "petId", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "404": { - "description": "Pet not found" - }, - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Pet" - } - }, - "400": { - "description": "Invalid ID supplied" - } - }, - "security": [ - { - "api_key": [] - }, - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "post": { - "tags": [ - "pet" - ], - "summary": "Updates a pet in the store with form data", - "description": "", - "operationId": "updatePetWithForm", - "consumes": [ - "application/x-www-form-urlencoded" - ], - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "petId", - "description": "ID of pet that needs to be updated", - "required": true, - "type": "string" - }, - { - "in": "formData", - "name": "name", - "description": "Updated name of the pet", - "required": true, - "type": "string" - }, - { - "in": "formData", - "name": "status", - "description": "Updated status of the pet", - "required": true, - "type": "string" - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - }, - "delete": { - "tags": [ - "pet" - ], - "summary": "Deletes a pet", - "description": "", - "operationId": "deletePet", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "header", - "name": "api_key", - "description": "", - "required": true, - "type": "string" - }, - { - "in": "path", - "name": "petId", - "description": "Pet id to delete", - "required": true, - "type": "integer", - "format": "int64" - } - ], - "responses": { - "400": { - "description": "Invalid pet value" - } - }, - "security": [ - { - "petstore_auth": [ - "write:pets", - "read:pets" - ] - } - ] - } - }, - "/store/order": { - "post": { - "tags": [ - "store" - ], - "summary": "Place an order for a pet", - "description": "", - "operationId": "placeOrder", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "order placed for purchasing the pet", - "required": false, - "schema": { - "$ref": "#/definitions/Order" - } - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid Order" - } - } - } - }, - "/store/order/{orderId}": { - "get": { - "tags": [ - "store" - ], - "summary": "Find purchase order by ID", - "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", - "operationId": "getOrderById", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "orderId", - "description": "ID of pet that needs to be fetched", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "Order not found" - }, - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/Order" - } - }, - "400": { - "description": "Invalid ID supplied" - } - } - }, - "delete": { - "tags": [ - "store" - ], - "summary": "Delete purchase order by ID", - "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", - "operationId": "deleteOrder", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "orderId", - "description": "ID of the order that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "Order not found" - }, - "400": { - "description": "Invalid ID supplied" - } - } - } - }, - "/user": { - "post": { - "tags": [ - "user" - ], - "summary": "Create user", - "description": "This can only be done by the logged in user.", - "operationId": "createUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "Created user object", - "required": false, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithArray": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithArrayInput", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "User" - } - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/createWithList": { - "post": { - "tags": [ - "user" - ], - "summary": "Creates list of users with given input array", - "description": "", - "operationId": "createUsersWithListInput", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "body", - "description": "List of user object", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/User" - } - } - } - ], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/login": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs user into the system", - "description": "", - "operationId": "loginUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "query", - "name": "username", - "description": "The user name for login", - "required": false, - "type": "string" - }, - { - "in": "query", - "name": "password", - "description": "The password for login in clear text", - "required": false, - "type": "string" - } - ], - "responses": { - "200": { - "description": "successful operation", - "schema": { - "type": "string" - } - }, - "400": { - "description": "Invalid username/password supplied" - } - } - } - }, - "/user/logout": { - "get": { - "tags": [ - "user" - ], - "summary": "Logs out current logged in user session", - "description": "", - "operationId": "logoutUser", - "produces": [ - "application/json", - "application/xml" - ], - "responses": { - "default": { - "description": "successful operation" - } - } - } - }, - "/user/{username}": { - "get": { - "tags": [ - "user" - ], - "summary": "Get user by user name", - "description": "", - "operationId": "getUserByName", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "username", - "description": "The name that needs to be fetched. Use user1 for testing. ", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "200": { - "description": "successful operation", - "schema": { - "$ref": "#/definitions/User" - } - }, - "400": { - "description": "Invalid username supplied" - } - } - }, - "put": { - "tags": [ - "user" - ], - "summary": "Updated user", - "description": "This can only be done by the logged in user.", - "operationId": "updateUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "username", - "description": "name that need to be deleted", - "required": true, - "type": "string" - }, - { - "in": "body", - "name": "body", - "description": "Updated user object", - "required": false, - "schema": { - "$ref": "#/definitions/User" - } - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "400": { - "description": "Invalid user supplied" - } - } - }, - "delete": { - "tags": [ - "user" - ], - "summary": "Delete user", - "description": "This can only be done by the logged in user.", - "operationId": "deleteUser", - "produces": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "path", - "name": "username", - "description": "The name that needs to be deleted", - "required": true, - "type": "string" - } - ], - "responses": { - "404": { - "description": "User not found" - }, - "400": { - "description": "Invalid username supplied" - } - } - } - } - }, - "securityDefinitions": { - "api_key": { - "type": "apiKey", - "name": "api_key", - "in": "header" - }, - "petstore_auth": { - "type": "oauth2", - "authorizationUrl": "http://petstore.swagger.wordnik.com/api/oauth/dialog", - "flow": "implicit" - } - }, - "definitions": { - "User": { - "properties": { - "id": { - "type": "integer", - "format": "int64", - "xml": { - "name": "id" - } - }, - "username": { - "type": "string", - "xml": { - "name": "username" - } - }, - "firstName": { - "type": "string", - "xml": { - "name": "firstName" - } - }, - "lastName": { - "type": "string", - "xml": { - "name": "lastName" - } - }, - "email": { - "type": "string", - "xml": { - "name": "email" - } - }, - "password": { - "type": "string", - "xml": { - "name": "password" - } - }, - "phone": { - "type": "string", - "xml": { - "name": "phone" - } - }, - "userStatus": { - "type": "integer", - "format": "int32", - "xml": { - "name": "userStatus" - }, - "description": "User Status" - } - }, - "xml": { - "name": "User" - } - }, - "Category": { - "properties": { - "id": { - "type": "integer", - "format": "int64", - "xml": { - "name": "id" - } - }, - "name": { - "type": "string", - "xml": { - "name": "name" - } - } - }, - "xml": { - "name": "Category" - } - }, - "Pet": { - "required": [ - "name", - "photoUrls" - ], - "properties": { - "id": { - "type": "integer", - "format": "int64", - "xml": { - "name": "id" - } - }, - "category": { - "xml": { - "name": "category" - }, - "$ref": "Category" - }, - "name": { - "type": "string", - "example": "doggie", - "xml": { - "name": "name" - } - }, - "photoUrls": { - "type": "array", - "xml": { - "name": "photoUrl", - "wrapped": true - }, - "items": { - "type": "string" - } - }, - "tags": { - "type": "array", - "xml": { - "name": "tag", - "wrapped": true - }, - "items": { - "$ref": "Tag" - } - }, - "status": { - "type": "string", - "xml": { - "name": "status" - }, - "description": "pet status in the store" - } - }, - "xml": { - "name": "Pet" - } - }, - "Tag": { - "properties": { - "id": { - "type": "integer", - "format": "int64", - "xml": { - "name": "id" - } - }, - "name": { - "type": "string", - "xml": { - "name": "name" - } - } - }, - "xml": { - "name": "Tag" - } - }, - "Order": { - "properties": { - "id": { - "type": "integer", - "format": "int64", - "xml": { - "name": "id" - } - }, - "petId": { - "type": "integer", - "format": "int64", - "xml": { - "name": "petId" - } - }, - "quantity": { - "type": "integer", - "format": "int32", - "xml": { - "name": "quantity" - } - }, - "shipDate": { - "type": "string", - "format": "date-time", - "xml": { - "name": "shipDate" - } - }, - "status": { - "type": "string", - "xml": { - "name": "status" - }, - "description": "Order Status" - }, - "complete": { - "type": "boolean" - } - }, - "xml": { - "name": "Order" - } - } - } -} \ No newline at end of file diff --git a/src/test/resources/2_0/postBodyTest.json b/src/test/resources/2_0/postBodyTest.json deleted file mode 100644 index ed13a5820eb..00000000000 --- a/src/test/resources/2_0/postBodyTest.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", - "version": "1.0.0", - "title": "Swagger Petstore", - "termsOfService": "http://helloreverb.com/terms/", - "contact": { - "name": "apiteam@wordnik.com" - }, - "license": { - "name": "Apache 2.0", - "url": "http://www.apache.org/licenses/LICENSE-2.0.html" - } - }, - "host": "petstore.swagger.wordnik.com", - "basePath": "/v2", - "schemes": [ - "http" - ], - "paths": { - "/animals": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new animal to the store", - "description": "", - "consumes": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Animals", - "required": false, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Animal" - } - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - } - } - }, - "/insects": { - "post": { - "tags": [ - "pet" - ], - "summary": "Add a new insect to the store", - "description": "", - "consumes": [ - "application/json", - "application/xml" - ], - "parameters": [ - { - "in": "body", - "name": "pet", - "description": "Insects", - "required": false, - "schema": { - "$ref": "#/definitions/Insect" - } - } - ], - "responses": { - "405": { - "description": "Invalid input" - } - } - } - } - }, - "definitions": { - "Animal": { - "properties": { - "id": { - "type": "integer", - "format": "int64" - } - } - }, - "Insect": { - "properties": { - "id": { - "type": "integer", - "format": "int64" - } - } - } - } -} \ No newline at end of file diff --git a/src/test/scala/CodegenTest.scala b/src/test/scala/CodegenTest.scala deleted file mode 100644 index ecd586a6a89..00000000000 --- a/src/test/scala/CodegenTest.scala +++ /dev/null @@ -1,98 +0,0 @@ -import com.wordnik.swagger.models._ -import com.wordnik.swagger.util.Json -import io.swagger.parser._ - -import com.wordnik.swagger.codegen.DefaultCodegen - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class CodegenTest extends FlatSpec with Matchers { - behavior of "Codegen" - - it should "read a file upload param from a 2.0 spec" in { - val model = new SwaggerParser() - .read("src/test/resources/2_0/petstore.json") - - val codegen = new DefaultCodegen() - val path = "/pet/{petId}/upload" - val p = model.getPaths().get(path).getPost() - val op = codegen.fromOperation(path, "post", p) - - op.operationId should be ("uploadImage") - op.httpMethod should be ("POST") - op.hasConsumes should equal (true) - op.consumes.size should be(1) - op.consumes.get(0).get("mediaType") should be ("multipart/form-data") - - op.hasProduces should be (null) - - val allParams = op.allParams - allParams.size should be (1) - - val formParams = op.formParams - formParams.size should be (1) - - val file = formParams.get(0) - file.isFormParam should equal (true) - file.dataType should be ("file") - file.required should equal (false) - file.isFile should equal (true) - file.hasMore should be (null) - } - - it should "read formParam values from a 2.0 spec" in { - val model = new SwaggerParser() - .read("src/test/resources/2_0/petstore.json") - - val codegen = new DefaultCodegen() - val path = "/pet/{petId}" - val p = model.getPaths().get(path).getPost() - val op = codegen.fromOperation(path, "post", p) - - op.operationId should be ("updatePetWithForm") - op.httpMethod should be ("POST") - op.hasConsumes should equal (true) - op.consumes.size should be(1) - op.consumes.get(0).get("mediaType") should be ("application/x-www-form-urlencoded") - - op.hasProduces should equal (true) - op.produces.size should be(2) - op.produces.get(0).get("mediaType") should be ("application/json") - op.produces.get(0).get("hasMore") should be ("true") - op.produces.get(1).get("mediaType") should be ("application/xml") - - val pathParams = op.pathParams - pathParams.size should be (1) - - val idParam = pathParams.get(0) - idParam.isPathParam should equal (true) - idParam.dataType should be ("String") - idParam.required should equal (true) - idParam.hasMore should be (null) - - val allParams = op.allParams - allParams.size should be (3) - - val formParams = op.formParams - formParams.size should be (2) - val nameParam = formParams.get(0) - nameParam.isFormParam should equal (true) - nameParam.notFile should equal (true) - nameParam.dataType should be ("String") - nameParam.required should equal (true) - nameParam.hasMore should equal (true) - - val statusParam = formParams.get(1) - statusParam.isFormParam should equal (true) - statusParam.notFile should equal (true) - statusParam.dataType should be ("String") - statusParam.required should equal (true) - statusParam.hasMore should be (null) - } -} \ No newline at end of file diff --git a/src/test/scala/Java/JavaModelEnumTest.scala b/src/test/scala/Java/JavaModelEnumTest.scala deleted file mode 100644 index 25232b69907..00000000000 --- a/src/test/scala/Java/JavaModelEnumTest.scala +++ /dev/null @@ -1,33 +0,0 @@ -package Java - -import com.wordnik.swagger.codegen.languages.JavaClientCodegen -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ -import org.junit.runner.RunWith -import org.scalatest.{FlatSpec, Matchers} -import org.scalatest.junit.JUnitRunner - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class JavaModelEnumTest extends FlatSpec with Matchers { - - it should "convert a java model with an enum" in { - val enumProperty = new StringProperty() - enumProperty.setEnum(List("VALUE1", "VALUE2", "VALUE3").asJava) - val model = new ModelImpl() - .property("name", enumProperty) - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.vars.size should be(1) - val enumVar = cm.vars.get(0) - enumVar.baseName should be("name") - enumVar.datatype should be("NameEnum") - enumVar.name should be("name") - enumVar.defaultValue should be("null") - enumVar.baseType should be("String") - enumVar.isEnum should equal(true) - } -} \ No newline at end of file diff --git a/src/test/scala/Java/JavaModelTest.scala b/src/test/scala/Java/JavaModelTest.scala deleted file mode 100644 index 513786e4609..00000000000 --- a/src/test/scala/Java/JavaModelTest.scala +++ /dev/null @@ -1,268 +0,0 @@ -package Java - -import com.wordnik.swagger.codegen.languages.JavaClientCodegen -import com.wordnik.swagger.util.Json -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class JavaModelTest extends FlatSpec with Matchers { - - it should "convert a simple java model" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("name", new StringProperty()) - .property("createdAt", new DateTimeProperty()) - .required("id") - .required("name") - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (3) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).getter should be ("getId") - vars.get(0).setter should be ("setId") - vars.get(0).datatype should be ("Long") - vars.get(0).name should be ("id") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("Long") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("name") - vars.get(1).getter should be ("getName") - vars.get(1).setter should be ("setName") - vars.get(1).datatype should be ("String") - vars.get(1).name should be ("name") - vars.get(1).defaultValue should be ("null") - vars.get(1).baseType should be ("String") - vars.get(1).hasMore should equal (true) - vars.get(1).required should equal (true) - vars.get(1).isNotContainer should equal (true) - - vars.get(2).baseName should be ("createdAt") - vars.get(2).getter should be ("getCreatedAt") - vars.get(2).setter should be ("setCreatedAt") - vars.get(2).datatype should be ("Date") - vars.get(2).name should be ("createdAt") - vars.get(2).defaultValue should be ("null") - vars.get(2).baseType should be ("Date") - vars.get(2).hasMore should equal (null) - vars.get(2).required should equal (false) - vars.get(2).isNotContainer should equal (true) - } - - it should "convert a model with list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("urls", new ArrayProperty() - .items(new StringProperty())) - .required("id") - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (2) - - val vars = cm.vars - vars.get(1).baseName should be ("urls") - vars.get(1).getter should be ("getUrls") - vars.get(1).setter should be ("setUrls") - vars.get(1).datatype should be ("List") - vars.get(1).name should be ("urls") - vars.get(1).defaultValue should be ("new ArrayList() ") - vars.get(1).baseType should be ("List") - vars.get(1).containerType should be ("array") - vars.get(1).required should equal (false) - vars.get(1).isContainer should equal (true) - } - - it should "convert a model with a map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("translations", new MapProperty() - .additionalProperties(new StringProperty())) - .required("id") - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("translations") - vars.get(0).getter should be ("getTranslations") - vars.get(0).setter should be ("setTranslations") - vars.get(0).datatype should be ("Map") - vars.get(0).name should be ("translations") - vars.get(0).defaultValue should be ("new HashMap() ") - vars.get(0).baseType should be ("Map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex properties" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new RefProperty("#/definitions/Children")) - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("Children") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("Children") - vars.get(0).required should equal (false) - vars.get(0).isNotContainer should equal (true) - } - - it should "convert a model with complex list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new ArrayProperty() - .items(new RefProperty("#/definitions/Children"))) - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("List") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("new ArrayList() ") - vars.get(0).baseType should be ("List") - vars.get(0).containerType should be ("array") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new MapProperty() - .additionalProperties(new RefProperty("#/definitions/Children"))) - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - (cm.imports.asScala.toSet & Set("Map", "List", "Children")).size should be (3) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("Map") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("new HashMap() ") - vars.get(0).baseType should be ("Map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isNotContainer should be (null) - } - - it should "convert an array model" in { - val model = new ArrayModel() - .description("an array model") - .items(new RefProperty("#/definitions/Children")) - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an array model") - cm.vars.size should be (0) - cm.parent should be ("ArrayList") - cm.imports.size should be (3) - (cm.imports.asScala.toSet & Set("List", "ArrayList", "Children")).size should be (3) - } - - it should "convert an map model" in { - val model = new ModelImpl() - .description("an map model") - .additionalProperties(new RefProperty("#/definitions/Children")) - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an map model") - cm.vars.size should be (0) - cm.parent should be ("HashMap") - cm.imports.size should be (3) - (cm.imports.asScala.toSet & Set("Map", "HashMap", "Children")).size should be (3) - } - - it should "convert a model with upper-case property names" in { - val model = new ModelImpl() - .description("a model with upper-case property names") - .property("NAME", new StringProperty()) - .required("NAME") - - val codegen = new JavaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("NAME") - vars.get(0).getter should be ("getNAME") - vars.get(0).setter should be ("setNAME") - vars.get(0).datatype should be ("String") - vars.get(0).name should be ("NAME") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("String") - vars.get(0).hasMore should equal (null) - vars.get(0).required should equal (true) - vars.get(0).isNotContainer should equal (true) - } -} diff --git a/src/test/scala/Objc/ObjcModelTest.scala b/src/test/scala/Objc/ObjcModelTest.scala deleted file mode 100644 index 2c8db5a1223..00000000000 --- a/src/test/scala/Objc/ObjcModelTest.scala +++ /dev/null @@ -1,260 +0,0 @@ -package objc - -import com.wordnik.swagger.codegen.languages.ObjcClientCodegen -import com.wordnik.swagger.util.{ Json, SwaggerLoader } -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class ObjcModelTest extends FlatSpec with Matchers { - - it should "convert a simple java model" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("name", new StringProperty()) - .property("createdAt", new DateTimeProperty()) - .required("id") - .required("name") - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (3) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).datatype should be ("NSNumber*") - vars.get(0).name should be ("_id") - vars.get(0).defaultValue should be (null) - vars.get(0).baseType should be ("NSNumber") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("name") - vars.get(1).datatype should be ("NSString*") - vars.get(1).name should be ("name") - vars.get(1).defaultValue should be (null) - vars.get(1).baseType should be ("NSString") - vars.get(1).hasMore should equal (true) - vars.get(1).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(1).isNotContainer should equal (true) - - vars.get(2).baseName should be ("createdAt") - vars.get(2).complexType should be ("SWGDate") - vars.get(2).datatype should be ("SWGDate*") - vars.get(2).name should be ("createdAt") - vars.get(2).defaultValue should be (null) - vars.get(2).baseType should be ("SWGDate") - vars.get(2).hasMore should equal (null) - vars.get(2).required should equal (false) - vars.get(2).isNotContainer should equal (true) - - (cm.imports.asScala.toSet & - Set("SWGDate")).size should be (1) - } - - it should "convert a model with list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("urls", new ArrayProperty() - .items(new StringProperty())) - .required("id") - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (2) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).datatype should be ("NSNumber*") - vars.get(0).name should be ("_id") - vars.get(0).defaultValue should be (null) - vars.get(0).baseType should be ("NSNumber") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("urls") - vars.get(1).datatype should be ("NSArray*") - vars.get(1).name should be ("urls") - // vars.get(1).defaultValue should be ("null") - vars.get(1).baseType should be ("NSArray") - vars.get(1).hasMore should be (null) - vars.get(1).containerType should equal ("array") - vars.get(1).required should equal (false) - vars.get(1).isPrimitiveType should equal (true) - vars.get(1).isContainer should equal (true) - } - - it should "convert a model with a map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("translations", new MapProperty() - .additionalProperties(new StringProperty())) - .required("id") - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("translations") - vars.get(0).datatype should be ("NSDictionary*") - vars.get(0).name should be ("translations") - vars.get(0).baseType should be ("NSDictionary") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isPrimitiveType should equal (true) - } - - it should "convert a model with complex property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new RefProperty("#/definitions/Children")) - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).datatype should be ("SWGChildren*") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("SWGChildren") - vars.get(0).required should equal (false) - vars.get(0).isNotContainer should equal (true) - } - - it should "convert a model with complex list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new ArrayProperty() - .items(new RefProperty("#/definitions/Children"))) - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("SWGChildren") - vars.get(0).datatype should be ("NSArray*") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("NSArray") - vars.get(0).containerType should be ("array") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new MapProperty() - .additionalProperties(new RefProperty("#/definitions/Children"))) - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - (cm.imports.asScala.toSet & Set("SWGChildren")).size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("SWGChildren") - vars.get(0).datatype should be ("NSDictionary*") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("NSDictionary") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isNotContainer should be (null) - } - - it should "convert an array model" in { - val model = new ArrayModel() - .description("an array model") - .items(new RefProperty("#/definitions/Children")) - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("an array model") - cm.vars.size should be (0) - cm.parent should be ("NSMutableArray") - cm.imports.size should be (3) - (cm.imports.asScala.toSet & Set("SWGChildren", "NSArray", "NSMutableArray")).size should be (3) - } - - it should "convert an map model" in { - val model = new ModelImpl() - .description("an map model") - .additionalProperties(new RefProperty("#/definitions/Children")) - - val codegen = new ObjcClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("SWGSample") - cm.description should be ("an map model") - cm.vars.size should be (0) - cm.parent should be ("NSMutableDictionary") - cm.imports.size should be (3) - (cm.imports.asScala.toSet & Set("SWGChildren", "NSDictionary", "NSMutableDictionary")).size should be (3) - } - - it should "create proper imports per #316" in { - val model = new SwaggerLoader().read("src/test/resources/2_0/postBodyTest.json") - val codegen = new ObjcClientCodegen() - - val animalPaths = model.getPaths() - val animalOps = animalPaths.get("/animals") - animalOps.getPost() should not be (null) - val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) - animalCo.imports.size should be (1) - animalCo.imports.contains("SWGAnimal") should equal (true) - - val insectPaths = model.getPaths() - val insectOps = insectPaths.get("/insects") - insectOps.getPost() should not be (null) - val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) - insectCo.imports.size should be (1) - insectCo.imports.contains("SWGInsect") should equal (true) - } -} \ No newline at end of file diff --git a/src/test/scala/SwaggerMigratorTest.scala b/src/test/scala/SwaggerMigratorTest.scala deleted file mode 100644 index 8051e84e660..00000000000 --- a/src/test/scala/SwaggerMigratorTest.scala +++ /dev/null @@ -1,19 +0,0 @@ -import com.wordnik.swagger.models._ -import io.swagger.parser._ - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class SwaggerMigratorTest extends FlatSpec with Matchers { - behavior of "SwaggerMigrator" - - it should "read a 1.2 spec" in { - val loader = new SwaggerParser() - loader.read("src/test/resources/1_2/petstore-1.2/api-docs") - } -} \ No newline at end of file diff --git a/src/test/scala/php/PhpModelTest.scala b/src/test/scala/php/PhpModelTest.scala deleted file mode 100644 index 5e5034e5efc..00000000000 --- a/src/test/scala/php/PhpModelTest.scala +++ /dev/null @@ -1,259 +0,0 @@ -package php - -import com.wordnik.swagger.codegen.languages.PhpClientCodegen -import com.wordnik.swagger.util.Json -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ - -import io.swagger.parser.SwaggerParser - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class PhpModelTest extends FlatSpec with Matchers { - - it should "convert a simple php model" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("name", new StringProperty()) - .property("createdAt", new DateTimeProperty()) - .required("id") - .required("name") - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (3) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).datatype should be ("int") - vars.get(0).name should be ("id") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("int") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("name") - vars.get(1).datatype should be ("string") - vars.get(1).name should be ("name") - vars.get(1).defaultValue should be ("null") - vars.get(1).baseType should be ("string") - vars.get(1).hasMore should equal (true) - vars.get(1).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(1).isNotContainer should equal (true) - - vars.get(2).baseName should be ("createdAt") - vars.get(2).complexType should be (null) - vars.get(2).datatype should be ("DateTime") - vars.get(2).name should be ("createdAt") - vars.get(2).defaultValue should be ("null") - vars.get(2).baseType should be ("DateTime") - vars.get(2).hasMore should equal (null) - vars.get(2).required should equal (false) - vars.get(2).isNotContainer should equal (true) - - cm.imports.size() should be (0) - } - - it should "convert a model with list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("urls", new ArrayProperty() - .items(new StringProperty())) - .required("id") - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (2) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).datatype should be ("int") - vars.get(0).name should be ("id") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("int") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isPrimitiveType should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("urls") - vars.get(1).datatype should be ("array[string]") - vars.get(1).name should be ("urls") - vars.get(1).baseType should be ("array") - vars.get(1).hasMore should be (null) - vars.get(1).containerType should equal ("array") - vars.get(1).required should equal (false) - vars.get(1).isPrimitiveType should equal (true) - vars.get(1).isContainer should equal (true) - } - - it should "convert a model with a map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("translations", new MapProperty() - .additionalProperties(new StringProperty())) - .required("id") - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("translations") - vars.get(0).datatype should be ("map[string,string]") - vars.get(0).name should be ("translations") - vars.get(0).baseType should be ("map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isPrimitiveType should equal (true) - } - - it should "convert a model with complex property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new RefProperty("#/definitions/Children")) - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).datatype should be ("Children") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("Children") - vars.get(0).required should equal (false) - vars.get(0).isNotContainer should equal (true) - } - - it should "convert a model with complex list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new ArrayProperty() - .items(new RefProperty("#/definitions/Children"))) - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).datatype should be ("array[Children]") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("array") - vars.get(0).containerType should be ("array") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new MapProperty() - .additionalProperties(new RefProperty("#/definitions/Children"))) - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - (cm.imports.asScala.toSet & Set("Children")).size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).datatype should be ("map[string,Children]") - vars.get(0).name should be ("children") - vars.get(0).baseType should be ("map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isNotContainer should be (null) - } - - it should "convert an array model" in { - val model = new ArrayModel() - .description("an array model") - .items(new RefProperty("#/definitions/Children")) - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an array model") - cm.vars.size should be (0) - cm.imports.size should be (1) - (cm.imports.asScala.toSet & Set("Children")).size should be (1) - } - - it should "convert an map model" in { - val model = new ModelImpl() - .description("an map model") - .additionalProperties(new RefProperty("#/definitions/Children")) - - val codegen = new PhpClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an map model") - cm.vars.size should be (0) - cm.imports.size should be (2) - (cm.imports.asScala.toSet & Set("Children")).size should be (1) - } - - it should "create proper imports per #316" in { - val model = new SwaggerParser() - .read("src/test/resources/2_0/postBodyTest.json") - val codegen = new PhpClientCodegen() - - val animalPaths = model.getPaths() - val animalOps = animalPaths.get("/animals") - animalOps.getPost() should not be (null) - val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) - animalCo.imports.size should be (1) - animalCo.imports.contains("Animal") should equal (true) - - val insectPaths = model.getPaths() - val insectOps = insectPaths.get("/insects") - insectOps.getPost() should not be (null) - val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) - insectCo.imports.size should be (1) - insectCo.imports.contains("Insect") should equal (true) - } -} \ No newline at end of file diff --git a/src/test/scala/scala/ScalaModelTest.scala b/src/test/scala/scala/ScalaModelTest.scala deleted file mode 100644 index 0c71983b1d5..00000000000 --- a/src/test/scala/scala/ScalaModelTest.scala +++ /dev/null @@ -1,241 +0,0 @@ -package Java - -import com.wordnik.swagger.codegen.languages.ScalaClientCodegen -import com.wordnik.swagger.util.Json -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class ScalaModelTest extends FlatSpec with Matchers { - - it should "convert a simple scala model" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("name", new StringProperty()) - .property("createdAt", new DateTimeProperty()) - .required("id") - .required("name") - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (3) - - val vars = cm.vars - vars.get(0).baseName should be ("id") - vars.get(0).getter should be ("getId") - vars.get(0).setter should be ("setId") - vars.get(0).datatype should be ("Long") - vars.get(0).name should be ("id") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("Long") - vars.get(0).hasMore should equal (true) - vars.get(0).required should equal (true) - vars.get(0).isNotContainer should equal (true) - - vars.get(1).baseName should be ("name") - vars.get(1).getter should be ("getName") - vars.get(1).setter should be ("setName") - vars.get(1).datatype should be ("String") - vars.get(1).name should be ("name") - vars.get(1).defaultValue should be ("null") - vars.get(1).baseType should be ("String") - vars.get(1).hasMore should equal (true) - vars.get(1).required should equal (true) - vars.get(1).isNotContainer should equal (true) - - vars.get(2).baseName should be ("createdAt") - vars.get(2).getter should be ("getCreatedAt") - vars.get(2).setter should be ("setCreatedAt") - vars.get(2).datatype should be ("DateTime") - vars.get(2).name should be ("createdAt") - vars.get(2).defaultValue should be ("null") - vars.get(2).baseType should be ("DateTime") - vars.get(2).hasMore should equal (null) - vars.get(2).required should equal (false) - vars.get(2).isNotContainer should equal (true) - } - - it should "convert a model with list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("id", new LongProperty()) - .property("urls", new ArrayProperty() - .items(new StringProperty())) - .required("id") - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (2) - - val vars = cm.vars - vars.get(1).baseName should be ("urls") - vars.get(1).getter should be ("getUrls") - vars.get(1).setter should be ("setUrls") - vars.get(1).datatype should be ("List[String]") - vars.get(1).name should be ("urls") - vars.get(1).defaultValue should be ("new ListBuffer[String]() ") - vars.get(1).baseType should be ("List") - vars.get(1).containerType should be ("array") - vars.get(1).required should equal (false) - vars.get(1).isContainer should equal (true) - } - - it should "convert a model with a map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("translations", new MapProperty() - .additionalProperties(new StringProperty())) - .required("id") - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("translations") - vars.get(0).getter should be ("getTranslations") - vars.get(0).setter should be ("setTranslations") - vars.get(0).datatype should be ("Map[String, String]") - vars.get(0).name should be ("translations") - vars.get(0).defaultValue should be ("new HashMap[String, String]() ") - vars.get(0).baseType should be ("Map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex properties" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new RefProperty("#/definitions/Children")) - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("Children") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("null") - vars.get(0).baseType should be ("Children") - vars.get(0).required should equal (false) - vars.get(0).isNotContainer should equal (true) - } - - it should "convert a model with complex list property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new ArrayProperty() - .items(new RefProperty("#/definitions/Children"))) - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("List[Children]") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("new ListBuffer[Children]() ") - vars.get(0).baseType should be ("List") - vars.get(0).containerType should be ("array") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - } - - it should "convert a model with complex map property" in { - val model = new ModelImpl() - .description("a sample model") - .property("children", new MapProperty() - .additionalProperties(new RefProperty("#/definitions/Children"))) - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("a sample model") - cm.vars.size should be (1) - (cm.imports.asScala.toSet & Set("Children")).size should be (1) - - val vars = cm.vars - vars.get(0).baseName should be ("children") - vars.get(0).complexType should be ("Children") - vars.get(0).getter should be ("getChildren") - vars.get(0).setter should be ("setChildren") - vars.get(0).datatype should be ("Map[String, Children]") - vars.get(0).name should be ("children") - vars.get(0).defaultValue should be ("new HashMap[String, Children]() ") - vars.get(0).baseType should be ("Map") - vars.get(0).containerType should be ("map") - vars.get(0).required should equal (false) - vars.get(0).isContainer should equal (true) - vars.get(0).isNotContainer should be (null) - } - - it should "convert an array model" in { - val model = new ArrayModel() - .description("an array model") - .items(new RefProperty("#/definitions/Children")) - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an array model") - cm.vars.size should be (0) - cm.parent should be ("ListBuffer[Children]") - cm.imports.size should be (3) - (cm.imports.asScala.toSet & Set("List", "ListBuffer", "Children")).size should be (3) - } - - it should "convert an map model" in { - val model = new ModelImpl() - .description("an map model") - .additionalProperties(new RefProperty("#/definitions/Children")) - - val codegen = new ScalaClientCodegen() - val cm = codegen.fromModel("sample", model) - - cm.name should be ("sample") - cm.classname should be ("Sample") - cm.description should be ("an map model") - cm.vars.size should be (0) - cm.parent should be ("HashMap[String, Children]") - cm.imports.size should be (2) - (cm.imports.asScala.toSet & Set("HashMap", "Children")).size should be (2) - } -} \ No newline at end of file diff --git a/src/test/scala/staticDocs/StaticOperationTest.scala b/src/test/scala/staticDocs/StaticOperationTest.scala deleted file mode 100644 index f46201faa5b..00000000000 --- a/src/test/scala/staticDocs/StaticOperationTest.scala +++ /dev/null @@ -1,65 +0,0 @@ -package staticDocs - -import com.wordnik.swagger.codegen.languages.StaticDocCodegen -import com.wordnik.swagger.util.Json -import com.wordnik.swagger.models._ -import com.wordnik.swagger.models.properties._ - -import org.junit.runner.RunWith -import org.scalatest.junit.JUnitRunner -import org.scalatest.FlatSpec -import org.scalatest.Matchers - -import scala.collection.JavaConverters._ - -@RunWith(classOf[JUnitRunner]) -class StaticOperationTest extends FlatSpec with Matchers { - it should "convert a string parameter" in { - val property = new StringProperty() - - val codegen = new StaticDocCodegen() - val cp = codegen.fromProperty("property", property) - - cp.baseName should be ("property") - cp.datatype should be ("String") - cp.name should be ("property") - cp.baseType should be ("string") - cp.isNotContainer should equal (true) - } - - it should "convert a complex parameter" in { - val property = new RefProperty("Children") - - val codegen = new StaticDocCodegen() - val cp = codegen.fromProperty("property", property) - - cp.baseName should be ("property") - cp.complexType should be ("Children") - cp.getter should be ("getProperty") - cp.setter should be ("setProperty") - cp.datatype should be ("Children") - cp.name should be ("property") - cp.defaultValue should be ("null") - cp.baseType should be ("Children") - cp.isNotContainer should equal (true) - } - - it should "convert a complex list parameter" in { - val property = new ArrayProperty(). - items(new RefProperty("Children")) - - val codegen = new StaticDocCodegen() - val cp = codegen.fromProperty("property", property) - - cp.baseName should be ("property") - cp.complexType should be ("Children") - cp.getter should be ("getProperty") - cp.setter should be ("setProperty") - cp.datatype should be ("List") - cp.name should be ("property") - cp.baseType should be ("array") - cp.containerType should be ("array") - cp.isContainer should equal (true) - - } -} \ No newline at end of file From 6bb2e4ccb4cc5a36b6d4134eb61eeffec720a4b5 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 07:17:38 -0800 Subject: [PATCH 2/6] moved to modules per #411 --- modules/swagger-codegen-distribution/pom.xml | 63 + modules/swagger-codegen/pom.xml | 391 ++ .../swagger/codegen/ClientOptInput.java | 59 + .../wordnik/swagger/codegen/ClientOpts.java | 52 + .../com/wordnik/swagger/codegen/Codegen.java | 123 + .../swagger/codegen/CodegenConfig.java | 51 + .../wordnik/swagger/codegen/CodegenModel.java | 16 + .../swagger/codegen/CodegenModelFactory.java | 38 + .../swagger/codegen/CodegenModelType.java | 20 + .../swagger/codegen/CodegenOperation.java | 29 + .../swagger/codegen/CodegenParameter.java | 37 + .../swagger/codegen/CodegenProperty.java | 24 + .../swagger/codegen/CodegenResponse.java | 10 + .../swagger/codegen/DefaultCodegen.java | 883 +++ .../swagger/codegen/DefaultGenerator.java | 371 + .../wordnik/swagger/codegen/Generator.java | 8 + .../swagger/codegen/SupportingFile.java | 13 + .../swagger/codegen/auth/AuthMethod.java | 6 + .../com/wordnik/swagger/codegen/haproxy.cfg | 86 + .../languages/AndroidClientCodegen.java | 106 + .../codegen/languages/JavaClientCodegen.java | 115 + .../codegen/languages/JaxRSServerCodegen.java | 129 + .../languages/NodeJSServerCodegen.java | 79 + .../codegen/languages/ObjcClientCodegen.java | 216 + .../codegen/languages/PhpClientCodegen.java | 110 + .../languages/PythonClientCodegen.java | 117 + .../codegen/languages/ScalaClientCodegen.java | 182 + .../languages/ScalatraServerCodegen.java | 174 + .../codegen/languages/StaticDocCodegen.java | 72 + .../languages/StaticHtmlGenerator.java | 81 + .../codegen/languages/SwaggerGenerator.java | 38 + .../codegen/languages/TizenClientCodegen.java | 243 + .../main/resources/Groovy/ApiUtils.mustache | 50 + .../src/main/resources/Groovy/api.mustache | 56 + .../resources/Groovy/build.gradle.mustache | 32 + .../src/main/resources/Groovy/model.mustache | 21 + .../src/main/resources/Java/JsonUtil.mustache | 23 + .../src/main/resources/Java/api.mustache | 109 + .../main/resources/Java/apiException.mustache | 29 + .../main/resources/Java/apiInvoker.mustache | 187 + .../src/main/resources/Java/model.mustache | 49 + .../src/main/resources/Java/pom.mustache | 168 + .../resources/JavaJaxRS/ApiException.mustache | 9 + .../JavaJaxRS/ApiOriginFilter.mustache | 26 + .../JavaJaxRS/ApiResponseMessage.mustache | 68 + .../JavaJaxRS/NotFoundException.mustache | 9 + .../main/resources/JavaJaxRS/README.mustache | 10 + .../src/main/resources/JavaJaxRS/api.mustache | 40 + .../resources/JavaJaxRS/bodyParams.mustache | 1 + .../resources/JavaJaxRS/formParams.mustache | 1 + .../resources/JavaJaxRS/headerParams.mustache | 1 + .../main/resources/JavaJaxRS/model.mustache | 47 + .../resources/JavaJaxRS/pathParams.mustache | 1 + .../src/main/resources/JavaJaxRS/pom.mustache | 141 + .../JavaJaxRS/project/build.properties | 1 + .../resources/JavaJaxRS/project/plugins.sbt | 9 + .../resources/JavaJaxRS/queryParams.mustache | 1 + .../src/main/resources/JavaJaxRS/web.mustache | 54 + .../com.wordnik.swagger.codegen.CodegenConfig | 13 + .../main/resources/android-java/api.mustache | 88 + .../android-java/apiException.mustache | 29 + .../android-java/apiInvoker.mustache | 283 + .../resources/android-java/httpPatch.mustache | 16 + .../resources/android-java/jsonUtil.mustache | 20 + .../resources/android-java/model.mustache | 47 + .../main/resources/android-java/pom.mustache | 162 + .../main/resources/asyncscala/api.mustache | 59 + .../main/resources/asyncscala/client.mustache | 26 + .../main/resources/asyncscala/model.mustache | 15 + .../main/resources/asyncscala/sbt.mustache | 11 + .../main/resources/csharp/Newtonsoft.Json.dll | Bin 0 -> 426496 bytes .../src/main/resources/csharp/api.mustache | 101 + .../resources/csharp/apiException.mustache | 21 + .../main/resources/csharp/apiInvoker.mustache | 207 + .../main/resources/csharp/compile.mustache | 2 + .../src/main/resources/csharp/model.mustache | 30 + .../src/main/resources/flash/ASAXB-0.1.1.swc | Bin 0 -> 46948 bytes .../resources/flash/AirExecutorApp-app.xml | 146 + .../main/resources/flash/ApiClientEvent.as | 36 + .../src/main/resources/flash/ApiError.as | 10 + .../src/main/resources/flash/ApiErrorCodes.as | 34 + .../src/main/resources/flash/ApiInvoker.as | 289 + .../src/main/resources/flash/ApiUrlHelper.as | 41 + .../resources/flash/ApiUserCredentials.as | 63 + .../src/main/resources/flash/ListWrapper.as | 9 + .../src/main/resources/flash/Response.as | 56 + .../src/main/resources/flash/SwaggerApi.as | 75 + .../src/main/resources/flash/XMLWriter.as | 28 + .../src/main/resources/flash/api.mustache | 73 + .../src/main/resources/flash/as3corelib.swc | Bin 0 -> 255357 bytes .../src/main/resources/flash/build.properties | 29 + .../src/main/resources/flash/build.xml | 192 + .../src/main/resources/flash/facetValue.as | 8 + ...flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc | Bin 0 -> 194680 bytes ...aircilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 0 -> 2294 bytes ...it-cilistener-4.1.0_RC2-28-3.5.0.12683.swc | Bin 0 -> 11827 bytes ...xunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc | Bin 0 -> 165338 bytes .../src/main/resources/flash/model.mustache | 40 + .../main/resources/flash/modelList.mustache | 23 + .../resources/htmlDocs/bodyParam.mustache | 3 + .../resources/htmlDocs/formParam.mustache | 3 + .../resources/htmlDocs/headerParam.mustache | 3 + .../main/resources/htmlDocs/index.mustache | 60 + .../resources/htmlDocs/pathParam.mustache | 3 + .../resources/htmlDocs/queryParam.mustache | 3 + .../resources/htmlDocs/style.css.mustache | 136 + .../src/main/resources/logback.xml | 12 + .../src/main/resources/nodejs/README.mustache | 10 + .../src/main/resources/nodejs/api.mustache | 62 + .../src/main/resources/nodejs/main.mustache | 52 + .../src/main/resources/nodejs/models.mustache | 3 + .../main/resources/nodejs/package.mustache | 16 + .../src/main/resources/objc/Podfile.mustache | 3 + .../src/main/resources/objc/SWGApiClient.h | 64 + .../src/main/resources/objc/SWGApiClient.m | 419 ++ .../src/main/resources/objc/SWGDate.h | 12 + .../src/main/resources/objc/SWGDate.m | 34 + .../src/main/resources/objc/SWGFile.h | 13 + .../src/main/resources/objc/SWGFile.m | 26 + .../src/main/resources/objc/SWGObject.h | 6 + .../src/main/resources/objc/SWGObject.m | 17 + .../src/main/resources/objc/api-body.mustache | 234 + .../main/resources/objc/api-header.mustache | 29 + .../main/resources/objc/model-body.mustache | 94 + .../main/resources/objc/model-header.mustache | 24 + .../src/main/resources/php/Swagger.mustache | 231 + .../src/main/resources/php/api.mustache | 86 + .../src/main/resources/php/model.mustache | 40 + .../main/resources/python/__init__.mustache | 9 + .../src/main/resources/python/api.mustache | 98 + .../src/main/resources/python/model.mustache | 40 + .../main/resources/python/swagger.mustache | 208 + .../main/resources/python3/__init__.mustache | 9 + .../src/main/resources/python3/api.mustache | 96 + .../src/main/resources/python3/model.mustache | 40 + .../main/resources/python3/swagger.mustache | 203 + .../src/main/resources/ruby/api.mustache | 85 + .../src/main/resources/ruby/model.mustache | 41 + .../src/main/resources/ruby/monkey.mustache | 90 + .../src/main/resources/ruby/swagger.mustache | 84 + .../ruby/swagger/configuration.mustache | 22 + .../resources/ruby/swagger/request.mustache | 199 + .../resources/ruby/swagger/response.mustache | 70 + .../resources/ruby/swagger/version.mustache | 4 + .../src/main/resources/scala/api.mustache | 68 + .../main/resources/scala/apiInvoker.mustache | 164 + .../src/main/resources/scala/model.mustache | 15 + .../src/main/resources/scala/pom.mustache | 232 + .../resources/scalatra/Bootstrap.mustache | 20 + .../main/resources/scalatra/JettyMain.scala | 43 + .../main/resources/scalatra/JsonUtil.scala | 12 + .../main/resources/scalatra/README.mustache | 10 + .../resources/scalatra/ServletApp.mustache | 39 + .../src/main/resources/scalatra/api.mustache | 94 + .../src/main/resources/scalatra/build.sbt | 64 + .../main/resources/scalatra/model.mustache | 15 + .../scalatra/project/build.properties | 1 + .../resources/scalatra/project/plugins.sbt | 9 + .../src/main/resources/scalatra/sbt | 525 ++ .../src/main/resources/scalatra/web.xml | 17 + .../assets/css/bootstrap-responsive.css | 1092 +++ .../swagger-static/assets/css/bootstrap.css | 6057 +++++++++++++++++ .../swagger-static/assets/css/site.css | 1 + .../swagger-static/assets/css/style.css | 292 + .../swagger-static/assets/images/logo.png | Bin 0 -> 14577 bytes .../swagger-static/assets/js/bootstrap.js | 2159 ++++++ .../assets/js/jquery-1.8.3.min.js | 2 + .../swagger-static/assets/js/main.js | 75 + .../resources/swagger-static/index.mustache | 58 + .../resources/swagger-static/main.mustache | 7 + .../resources/swagger-static/model.mustache | 13 + .../swagger-static/operation.mustache | 52 + .../resources/swagger-static/package.mustache | 12 + .../src/main/resources/swagger-static/pom.xml | 100 + .../src/main/resources/tizen/README.md | 2 + .../main/resources/tizen/api-body.mustache | 131 + .../main/resources/tizen/api-header.mustache | 37 + .../resources/tizen/apiclient-body.mustache | 124 + .../resources/tizen/apiclient-header.mustache | 73 + .../main/resources/tizen/error-body.mustache | 55 + .../resources/tizen/error-header.mustache | 35 + .../resources/tizen/helpers-body.mustache | 273 + .../resources/tizen/helpers-header.mustache | 45 + .../main/resources/tizen/model-body.mustache | 158 + .../resources/tizen/model-header.mustache | 58 + .../resources/tizen/modelFactory.mustache | 31 + .../src/main/resources/tizen/object.mustache | 27 + .../main/resources/validator/index.mustache | 262 + .../test/resources/1_2/petstore-1.2/api-docs | 60 + .../src/test/resources/1_2/petstore-1.2/pet | 425 ++ .../src/test/resources/1_2/petstore-1.2/store | 145 + .../src/test/resources/1_2/petstore-1.2/user | 299 + .../src/test/resources/2_0/petstore.json | 951 +++ .../src/test/resources/2_0/postBodyTest.json | 102 + .../src/test/scala/CodegenTest.scala | 98 + .../test/scala/Java/JavaModelEnumTest.scala | 33 + .../src/test/scala/Java/JavaModelTest.scala | 268 + .../src/test/scala/Objc/ObjcModelTest.scala | 260 + .../src/test/scala/SwaggerMigratorTest.scala | 19 + .../src/test/scala/php/PhpModelTest.scala | 259 + .../src/test/scala/scala/ScalaModelTest.scala | 241 + .../staticDocs/StaticOperationTest.scala | 65 + 202 files changed, 26147 insertions(+) create mode 100644 modules/swagger-codegen-distribution/pom.xml create mode 100644 modules/swagger-codegen/pom.xml create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java create mode 100755 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java create mode 100644 modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Groovy/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/Java/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache create mode 100644 modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache create mode 100644 modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig create mode 100644 modules/swagger-codegen/src/main/resources/android-java/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/android-java/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/client.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll create mode 100644 modules/swagger-codegen/src/main/resources/csharp/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/apiException.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/compile.mustache create mode 100644 modules/swagger-codegen/src/main/resources/csharp/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/AirExecutorApp-app.xml create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiError.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/ListWrapper.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/Response.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/XMLWriter.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/as3corelib.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/flash/build.xml create mode 100644 modules/swagger-codegen/src/main/resources/flash/facetValue.as create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-aircilistener-4.1.0_RC2-28-3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc create mode 100644 modules/swagger-codegen/src/main/resources/flash/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/flash/modelList.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache create mode 100644 modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache create mode 100644 modules/swagger-codegen/src/main/resources/logback.xml create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/main.mustache create mode 100644 modules/swagger-codegen/src/main/resources/nodejs/models.mustache create mode 100755 modules/swagger-codegen/src/main/resources/nodejs/package.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/Podfile.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGDate.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGDate.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGFile.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGFile.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGObject.h create mode 100644 modules/swagger-codegen/src/main/resources/objc/SWGObject.m create mode 100644 modules/swagger-codegen/src/main/resources/objc/api-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/api-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/model-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/objc/model-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/Swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/php/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/__init__.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/__init__.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/python3/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/monkey.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache create mode 100644 modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scala/pom.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/README.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/api.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/build.sbt create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/project/build.properties create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt create mode 100755 modules/swagger-codegen/src/main/resources/scalatra/sbt create mode 100644 modules/swagger-codegen/src/main/resources/scalatra/web.xml create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/bootstrap.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/jquery-1.8.3.min.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/assets/js/main.js create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/index.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/main.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/model.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/operation.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/package.mustache create mode 100644 modules/swagger-codegen/src/main/resources/swagger-static/pom.xml create mode 100644 modules/swagger-codegen/src/main/resources/tizen/README.md create mode 100644 modules/swagger-codegen/src/main/resources/tizen/api-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/api-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/apiclient-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/apiclient-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/error-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/error-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/helpers-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/helpers-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/model-body.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/model-header.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/modelFactory.mustache create mode 100644 modules/swagger-codegen/src/main/resources/tizen/object.mustache create mode 100644 modules/swagger-codegen/src/main/resources/validator/index.mustache create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store create mode 100644 modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user create mode 100644 modules/swagger-codegen/src/test/resources/2_0/petstore.json create mode 100644 modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json create mode 100644 modules/swagger-codegen/src/test/scala/CodegenTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala create mode 100644 modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala diff --git a/modules/swagger-codegen-distribution/pom.xml b/modules/swagger-codegen-distribution/pom.xml new file mode 100644 index 00000000000..a70a79c27e1 --- /dev/null +++ b/modules/swagger-codegen-distribution/pom.xml @@ -0,0 +1,63 @@ + + + com.wordnik + swagger-codegen-project + 2.1.0-SNAPSHOT + ../.. + + 4.0.0 + com.wordnik + swagger-codegen-distribution + jar + swagger-codegen-distribution + 2.1.0-SNAPSHOT + + src/test/scala + target/classes + target/test-classes + install + target + ${project.artifactId}-${project.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 2.3 + + + package + + shade + + + false + true + + ${java.io.tmpdir}/dependency-reduced-pom.xml + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + com.wordnik.swagger.codegen.Codegen + + + + + + + + + com.wordnik + swagger-codegen + ${project.parent.version} + + + \ No newline at end of file diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml new file mode 100644 index 00000000000..8f0de9f7ddb --- /dev/null +++ b/modules/swagger-codegen/pom.xml @@ -0,0 +1,391 @@ + + + com.wordnik + swagger-codegen-project + 2.1.0-SNAPSHOT + ../.. + + 4.0.0 + com.wordnik + swagger-codegen + jar + swagger-codegen + 2.1.0-SNAPSHOT + + src/main/java + install + + + org.jvnet.wagon-svn + wagon-svn + 1.8 + + + org.apache.maven.wagon + wagon-ssh-external + 1.0-alpha-6 + + + org.apache.maven.wagon + wagon-webdav + 1.0-beta-1 + + + target + ${project.artifactId}-${project.version} + + + org.codehaus.mojo + exec-maven-plugin + 1.3.2 + + + + java + + + + + com.wordnik.swagger.codegen.Codegen + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + com.wordnik.swagger.codegen.Codegen + + + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + net.alchim31.maven + scala-maven-plugin + + + + add-source + compile + testCompile + + + + + + incremental + + + -Xmx384m + + + -target:jvm-1.6 + -deprecation + + + + run-scalatest + org.scalatest.tools.Runner + + -p + ${project.build.testOutputDirectory} + + + -Xmx512m + + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + attach-sources + verify + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.7 + + true + 1.6 + UTF-8 + 1g + + http://java.sun.com/javase/6/docs/api/ + + ${javadoc.package.exclude} + + + + attach-javadocs + verify + + jar + + + + + + maven-compiler-plugin + 3.0 + + 1.6 + 1.6 + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + development + ${project.url} + ${project.version} + com.wordnik + + + + + + org.apache.maven.plugins + maven-site-plugin + 2.1 + + + org.apache.maven.plugins + maven-release-plugin + 2.1 + + + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + org.apache.maven.plugins + maven-gpg-plugin + + release + sign + + + + + + + + release-profile + + true + + + + + net.alchim31.maven + scala-maven-plugin + + + + compile + testCompile + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + prepare-package + + add-source + + + + src/main/scala + + + + + + + + + + release-sign-artifacts + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + + + sign-artifacts + verify + + sign + + + + + + + + + + target/site + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9 + + true + true + + http://java.sun.com/javaee/5/docs/api + http://java.sun.com/j2se/1.5.0/docs/api + + + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + org.apache.maven.plugins + maven-jxr-plugin + 2.3 + + true + + + + org.apache.maven.plugins + maven-project-info-reports-plugin + 2.6 + + + + project-team + + + + + + + + + io.swagger + swagger-parser + ${swagger-parser-version} + + + io.swagger + swagger-legacy-spec-parser + ${swagger-parser-version} + + + ${project.groupId} + swagger-core + ${swagger-core-version} + + + com.samskivert + jmustache + ${jmustache-version} + + + commons-io + commons-io + ${commons-io-version} + + + org.apache.maven + maven-plugin-tools-api + 2.0 + + + org.apache.felix + maven-bundle-plugin + ${felix-version} + + + org.slf4j + slf4j-ext + ${slf4j-version} + + + org.slf4j + slf4j-api + ${slf4j-version} + + + commons-lang + commons-lang + ${commons-lang-version} + + + commons-cli + commons-cli + ${commons-cli-version} + + + org.scalatest + scalatest_2.11 + ${scala-test-version} + test + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + true + + + + diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java new file mode 100644 index 00000000000..cdfb1191b2f --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOptInput.java @@ -0,0 +1,59 @@ +/** + * Copyright 2014 Reverb, 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. + */ + +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.ClientOpts; + +import com.wordnik.swagger.models.Swagger; + +public class ClientOptInput { + private ClientOpts opts; + private Swagger swagger; + protected CodegenConfig config; + + public ClientOptInput swagger(Swagger swagger) { + this.setSwagger(swagger); + return this; + } + public ClientOptInput opts(ClientOpts opts) { + this.setOpts(opts); + return this; + } + + public CodegenConfig getConfig() { + return config; + } + public void setConfig(CodegenConfig config) { + this.config = config; + } + + public void setOpts(ClientOpts opts) { + this.opts = opts; + } + + public ClientOpts getOpts() { + return opts; + } + + public void setSwagger(Swagger swagger) { + this.swagger = swagger; + } + + public Swagger getSwagger() { + return swagger; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java new file mode 100644 index 00000000000..b8d681cc307 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/ClientOpts.java @@ -0,0 +1,52 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.auth.*; + +import java.util.*; + +public class ClientOpts { + protected String uri; + protected String target; + protected AuthMethod auth; + protected Map properties = new HashMap(); + protected String outputDirectory; + + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } + + public String getTarget() { + return target; + } + public void setTarget(String target) { + this.target = target; + } + + public Map getProperties() { + return properties; + } + public void setProperties(Map properties) { + this.properties = properties; + } + + public String getOutputDirectory() { + return outputDirectory; + } + public void setOutputDirectory(String outputDirectory) { + this.outputDirectory = outputDirectory; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("ClientOpts: {\n"); + sb.append(" uri: ").append(uri).append(","); + sb.append(" auth: ").append(auth).append(","); + sb.append(properties); + sb.append("}"); + return sb.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java new file mode 100644 index 00000000000..c9e39c7f2f3 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Codegen.java @@ -0,0 +1,123 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.codegen.languages.*; +import com.wordnik.swagger.models.Swagger; +import com.wordnik.swagger.util.*; + +import io.swagger.parser.SwaggerParser; + +import org.apache.commons.cli.*; + +import java.io.File; +import java.util.*; + +public class Codegen extends DefaultGenerator { + static String debugInfoOptions = "\nThe following additional debug options are available for all codegen targets:" + + "\n -DdebugSwagger prints the swagger specification as interpreted by the codegen" + + "\n -DdebugModels prints models passed to the template engine" + + "\n -DdebugOperations prints operations passed to the template engine" + + "\n -DdebugSupportingFiles prints additional data passed to the template engine"; + public static void main(String[] args) { + List extensions = getExtensions(); + Map configs = new HashMap(); + + StringBuilder sb = new StringBuilder(); + for(CodegenConfig config : extensions) { + if(sb.toString().length() != 0) + sb.append(", "); + sb.append(config.getName()); + configs.put(config.getName(), config); + } + + Options options = new Options(); + options.addOption("h", "help", false, "shows this message"); + options.addOption("l", "lang", true, "client language to generate.\nAvailable languages include:\n\t[" + sb.toString() + "]"); + options.addOption("o", "output", true, "where to write the generated files"); + options.addOption("i", "input-spec", true, "location of the swagger spec, as URL or file"); + options.addOption("t", "template-dir", true, "folder containing the template files"); + options.addOption("d", "debug-info", false, "prints additional info for debugging"); + + ClientOptInput clientOptInput = new ClientOptInput(); + ClientOpts clientOpts = new ClientOpts(); + Swagger swagger = null; + + CommandLine cmd = null; + try { + CommandLineParser parser = new BasicParser(); + CodegenConfig config = null; + + cmd = parser.parse(options, args); + if (cmd.hasOption("d")) { + usage(options); + System.out.println(debugInfoOptions); + return; + } + if (cmd.hasOption("l")) + clientOptInput.setConfig(getConfig(cmd.getOptionValue("l"), configs)); + if (cmd.hasOption("o")) + clientOptInput.getConfig().setOutputDir(cmd.getOptionValue("o")); + if (cmd.hasOption("h")) { + if(cmd.hasOption("l")) { + config = getConfig(String.valueOf(cmd.getOptionValue("l")), configs); + if(config != null) { + options.addOption("h", "help", true, config.getHelp()); + usage(options); + return; + } + } + usage(options); + return; + } + if (cmd.hasOption("i")) + swagger = new SwaggerParser().read(cmd.getOptionValue("i")); + if (cmd.hasOption("t")) + clientOpts.getProperties().put("templateDir", String.valueOf(cmd.getOptionValue("t"))); + } + catch (Exception e) { + usage(options); + return; + } + try{ + clientOptInput + .opts(clientOpts) + .swagger(swagger); + new Codegen().opts(clientOptInput).generate(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static List getExtensions() { + ServiceLoader loader = ServiceLoader.load(CodegenConfig.class); + List output = new ArrayList(); + Iterator itr = loader.iterator(); + while(itr.hasNext()) { + output.add(itr.next()); + } + return output; + } + + static void usage(Options options) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp( "Codegen", options ); + } + + static CodegenConfig getConfig(String name, Map configs) { + if(configs.containsKey(name)) { + return configs.get(name); + } + else { + // see if it's a class + try { + System.out.println("loading class " + name); + Class customClass = Class.forName(name); + System.out.println("loaded"); + return (CodegenConfig)customClass.newInstance(); + } + catch (Exception e) { + throw new RuntimeException("can't load class " + name); + } + } + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java new file mode 100644 index 00000000000..73abe291c1d --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenConfig.java @@ -0,0 +1,51 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; + +public interface CodegenConfig { + String getName(); + String getHelp(); + Map additionalProperties(); + String apiPackage(); + String apiFileFolder(); + String fileSuffix(); + String outputFolder(); + String templateDir(); + String modelFileFolder(); + String modelPackage(); + String toApiName(String name); + String toModelName(String name); + String toParamName(String name); + String escapeReservedWord(String name); + String getTypeDeclaration(Property p); + String getTypeDeclaration(String name); + void processOpts(); + + Set reservedWords(); + + List supportingFiles(); + + void setOutputDir(String dir); + String getOutputDir(); + + CodegenModel fromModel(String name, Model model); + CodegenOperation fromOperation(String resourcePath, String httpMethod, Operation operation); + Set defaultIncludes(); + Map typeMapping(); + Map instantiationTypes(); + Map importMapping(); + Map apiTemplateFiles(); + Map modelTemplateFiles(); + void processSwagger(Swagger swagger); + + String toApiFilename(String name); + String toModelFilename(String name); + String toModelImport(String name); + String toApiImport(String name); + void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations); + Map postProcessModels(Map objs); + Map postProcessOperations(Map objs); +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java new file mode 100644 index 00000000000..169886da22e --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModel.java @@ -0,0 +1,16 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; + +public class CodegenModel { + public String parent; + public String name, classname, description, classVarName, modelJson; + public String defaultValue; + public List vars = new ArrayList(); + public Set imports = new HashSet(); + public Boolean hasVars, emptyVars, hasMoreModels; + public ExternalDocs externalDocs; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java new file mode 100644 index 00000000000..b369623f37c --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelFactory.java @@ -0,0 +1,38 @@ +package com.wordnik.swagger.codegen; + +import java.util.HashMap; +import java.util.Map; + +public final class CodegenModelFactory { + + private static final Map> typeMapping = new HashMap>(); + + /** + * Configure a different implementation class. + * @param type the type that shall be replaced + * @param implementation the implementation class must extend the default class and must provide a public no-arg constructor + */ + public static void setTypeMapping(CodegenModelType type, Class implementation) { + if (!type.getDefaultImplementation().isAssignableFrom(implementation)) { + throw new IllegalArgumentException(implementation.getSimpleName() + " doesn't extend " + type.getDefaultImplementation().getSimpleName()); + } + try { + implementation.newInstance(); + } catch (Exception e) { + throw new IllegalArgumentException(e); + } + typeMapping.put(type, implementation); + } + + @SuppressWarnings("unchecked") + public static T newInstance(CodegenModelType type) { + Class classType = typeMapping.get(type); + try { + return (T) (classType != null ? classType : type.getDefaultImplementation()).newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java new file mode 100644 index 00000000000..41c877532f0 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenModelType.java @@ -0,0 +1,20 @@ +package com.wordnik.swagger.codegen; + +public enum CodegenModelType { + + MODEL(CodegenModel.class), + OPERATION(CodegenOperation.class), + PARAMETER(CodegenParameter.class), + PROPERTY(CodegenProperty.class), + RESPONSE(CodegenResponse.class); + + private final Class defaultImplementation; + + private CodegenModelType(Class defaultImplementation) { + this.defaultImplementation = defaultImplementation; + } + + public Class getDefaultImplementation() { + return defaultImplementation; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java new file mode 100644 index 00000000000..3609e53d9ee --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenOperation.java @@ -0,0 +1,29 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; + +import java.util.*; + +public class CodegenOperation { + public Boolean hasConsumes, hasProduces, hasParams, returnTypeIsPrimitive, returnSimpleType, subresourceOperation; + public String path, operationId, returnType, httpMethod, returnBaseType, + returnContainer, summary, notes, baseName, defaultResponse; + + public List> consumes, produces; + public CodegenParameter bodyParam; + public List allParams = new ArrayList(); + public List bodyParams = new ArrayList(); + public List pathParams = new ArrayList(); + public List queryParams = new ArrayList(); + public List headerParams = new ArrayList(); + public List formParams = new ArrayList(); + public List tags; + public List responses = new ArrayList(); + public final List responseHeaders = new ArrayList(); + public Set imports = new HashSet(); + public List> examples; + public ExternalDocs externalDocs; + + // legacy support + public String nickname; +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java new file mode 100644 index 00000000000..4480c172c32 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenParameter.java @@ -0,0 +1,37 @@ +package com.wordnik.swagger.codegen; + +public class CodegenParameter { + public Boolean isFormParam, isQueryParam, isPathParam, isHeaderParam, + isCookieParam, isBodyParam, isFile, notFile, hasMore, isContainer, secondaryParam; + public String baseName, paramName, dataType, collectionFormat, description, baseType; + /** + * Determines whether this parameter is mandatory. If the parameter is in "path", + * this property is required and its value MUST be true. Otherwise, the property + * MAY be included and its default value is false. + */ + public Boolean required; + + public CodegenParameter copy() { + CodegenParameter output = new CodegenParameter(); + output.isFile = this.isFile; + output.notFile = this.notFile; + output.hasMore = this.hasMore; + output.isContainer = this.isContainer; + output.secondaryParam = this.secondaryParam; + output.baseName = this.baseName; + output.paramName = this.paramName; + output.dataType = this.dataType; + output.collectionFormat = this.collectionFormat; + output.description = this.description; + output.baseType = this.baseType; + output.isFormParam = this.isFormParam; + output.isQueryParam = this.isQueryParam; + output.isPathParam = this.isPathParam; + output.isHeaderParam = this.isHeaderParam; + output.isCookieParam = this.isCookieParam; + output.isBodyParam = this.isBodyParam; + output.required = this.required; + + return output; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java new file mode 100644 index 00000000000..cda9ab714d4 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenProperty.java @@ -0,0 +1,24 @@ +package com.wordnik.swagger.codegen; + +import java.util.*; + +public class CodegenProperty { + public String baseName, complexType, getter, setter, description, datatype, + name, min, max, defaultValue, baseType, containerType; + + /** maxLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.1 */ + public Integer maxLength; + /** minLength validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.2 */ + public Integer minLength; + /** pattern validation for strings, see http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.2.3 */ + public String pattern; + /** A free-form property to include an example of an instance for this schema. */ + public String example; + + public Double minimum, maximum, exclusiveMinimum, exclusiveMaximum; + public Boolean hasMore = null, required = null, secondaryParam = null; + public Boolean isPrimitiveType, isContainer, isNotContainer; + public boolean isEnum; + public List _enum; + public Map allowableValues; +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java new file mode 100644 index 00000000000..92b908759b1 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/CodegenResponse.java @@ -0,0 +1,10 @@ +package com.wordnik.swagger.codegen; + +import java.util.*; + +public class CodegenResponse { + public String code, message; + public Boolean hasMore; + public List> examples; + Object schema; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java new file mode 100644 index 00000000000..e89b0f0b26f --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -0,0 +1,883 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.models.parameters.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +public class DefaultCodegen { + protected String outputFolder = ""; + protected Set defaultIncludes = new HashSet(); + protected Map typeMapping = new HashMap(); + protected Map instantiationTypes = new HashMap(); + protected Set reservedWords = new HashSet(); + protected Set languageSpecificPrimitives = new HashSet(); + protected Map importMapping = new HashMap(); + protected String modelPackage = "", apiPackage = "", fileSuffix; + protected Map apiTemplateFiles = new HashMap(); + protected Map modelTemplateFiles = new HashMap(); + protected String templateDir; + protected Map additionalProperties = new HashMap(); + protected List supportingFiles = new ArrayList(); + + public void processOpts(){ + if(additionalProperties.containsKey("templateDir")) { + this.setTemplateDir((String)additionalProperties.get("templateDir")); + } + } + + // override with any special post-processing + public Map postProcessModels(Map objs) { + return objs; + } + + // override with any special post-processing + public Map postProcessOperations(Map objs) { + return objs; + } + + // override with any special handling of the entire swagger spec + public void processSwagger(Swagger swagger) {} + + // override with any special text escaping logic + public String escapeText(String input) { + if(input != null) { + String output = input.replaceAll("\n", " "); + output = output.replace("\"", "\\\""); + return output; + } + return input; + } + + public Set defaultIncludes() { + return defaultIncludes; + } + public Map typeMapping() { + return typeMapping; + } + public Map instantiationTypes() { + return instantiationTypes; + } + public Set reservedWords() { + return reservedWords; + } + public Set languageSpecificPrimitives() { + return languageSpecificPrimitives; + } + public Map importMapping() { + return importMapping; + } + public String modelPackage() { + return modelPackage; + } + public String apiPackage() { + return apiPackage; + } + public String fileSuffix() { + return fileSuffix; + } + public String templateDir() { + return templateDir; + } + public Map apiTemplateFiles() { + return apiTemplateFiles; + } + public Map modelTemplateFiles() { + return modelTemplateFiles; + } + + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + public Map additionalProperties() { + return additionalProperties; + } + public List supportingFiles() { + return supportingFiles; + } + public String outputFolder() { + return outputFolder; + } + + public void setOutputDir(String dir) { + this.outputFolder = dir; + } + public String getOutputDir() { + return outputFolder(); + } + + public void setTemplateDir(String templateDir) { + this.templateDir = templateDir; + } + + public String toApiFilename(String name) { + return initialCaps(name) + "Api"; + } + + public String toModelFilename(String name) { + return name; + } + + public String toVarName(String name) { + if(reservedWords.contains(name)) + return escapeReservedWord(name); + else + return name; + } + + public String toParamName(String name) { + if(reservedWords.contains(name)) { + return escapeReservedWord(name); + } + return name; + } + + public String escapeReservedWord(String name) { + throw new RuntimeException("reserved word " + name + " not allowed"); + } + + public String toModelImport(String name) { + if("".equals(modelPackage())) + return name; + else + return modelPackage() + "." + name; + } + + public String toApiImport(String name) { + return apiPackage() + "." + name; + } + + public DefaultCodegen() { + defaultIncludes = new HashSet( + Arrays.asList("double", + "int", + "long", + "short", + "char", + "float", + "String", + "boolean", + "Boolean", + "Double", + "Void", + "Integer", + "Long", + "Float") + ); + + typeMapping = new HashMap(); + typeMapping.put("array", "List"); + typeMapping.put("map", "Map"); + typeMapping.put("List", "List"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("string", "String"); + typeMapping.put("int", "Integer"); + typeMapping.put("float", "Float"); + typeMapping.put("number", "BigDecimal"); + typeMapping.put("DateTime", "Date"); + typeMapping.put("long", "Long"); + typeMapping.put("short", "Short"); + typeMapping.put("char", "String"); + typeMapping.put("double", "Double"); + typeMapping.put("object", "Object"); + typeMapping.put("integer", "Integer"); + + instantiationTypes = new HashMap(); + + reservedWords = new HashSet(); + + importMapping = new HashMap(); + importMapping.put("BigDecimal", "java.math.BigDecimal"); + importMapping.put("UUID", "java.util.UUID"); + importMapping.put("File", "java.io.File"); + importMapping.put("Date", "java.util.Date"); + importMapping.put("Timestamp", "java.sql.Timestamp"); + importMapping.put("Map", "java.util.Map"); + importMapping.put("HashMap", "java.util.HashMap"); + importMapping.put("Array", "java.util.List"); + importMapping.put("ArrayList", "java.util.ArrayList"); + importMapping.put("List", "java.util.*"); + importMapping.put("Set", "java.util.*"); + importMapping.put("DateTime", "org.joda.time.*"); + importMapping.put("LocalDateTime", "org.joda.time.*"); + importMapping.put("LocalDate", "org.joda.time.*"); + importMapping.put("LocalTime", "org.joda.time.*"); + } + + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map") + ""; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array") + "<" + inner + ">"; + } + else + return null; + } + + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "null"; + else if (p instanceof BooleanProperty) + return "null"; + else if(p instanceof DateProperty) + return "null"; + else if(p instanceof DateTimeProperty) + return "null"; + else if (p instanceof DoubleProperty) + return "null"; + else if (p instanceof FloatProperty) + return "null"; + else if (p instanceof IntegerProperty) + return "null"; + else if (p instanceof LongProperty) + return "null"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap() "; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ArrayList<" + inner + ">() "; + } + else + return "null"; + } + + /** + * returns the swagger type for the property + **/ + public String getSwaggerType(Property p) { + String datatype = null; + if(p instanceof StringProperty) + datatype = "string"; + else if (p instanceof BooleanProperty) + datatype = "boolean"; + else if(p instanceof DateProperty) + datatype = "date"; + else if(p instanceof DateTimeProperty) + datatype = "DateTime"; + else if (p instanceof DoubleProperty) + datatype = "double"; + else if (p instanceof FloatProperty) + datatype = "float"; + else if (p instanceof IntegerProperty) + datatype = "integer"; + else if (p instanceof LongProperty) + datatype = "long"; + else if (p instanceof MapProperty) + datatype = "map"; + else if (p instanceof DecimalProperty) + datatype = "number"; + else if (p instanceof RefProperty) { + RefProperty r = (RefProperty)p; + datatype = r.get$ref(); + if(datatype.indexOf("#/definitions/") == 0) + datatype = datatype.substring("#/definitions/".length()); + } + else { + if(p != null) datatype = p.getType(); + } + return datatype; + } + + public String initialCaps(String name) { + return Character.toUpperCase(name.charAt(0)) + name.substring(1); + } + + public String getTypeDeclaration(String name) { + return name; + } + + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(typeMapping.containsKey(swaggerType)) + return typeMapping.get(swaggerType); + return swaggerType; + } + + public String toApiName(String name) { + if(name.length() == 0) + return "DefaultApi"; + return initialCaps(name) + "Api"; + } + + public String toModelName(String name) { + return initialCaps(name); + } + + public CodegenModel fromModel(String name, Model model) { + CodegenModel m = CodegenModelFactory.newInstance(CodegenModelType.MODEL); + if(reservedWords.contains(name)) + m.name = escapeReservedWord(name); + else + m.name = name; + m.description = model.getDescription(); + m.classname = toModelName(name); + m.classVarName = toVarName(name); + m.modelJson = Json.pretty(model); + m.externalDocs = model.getExternalDocs(); + int count = 0; + if(model instanceof ArrayModel) { + ArrayModel am = (ArrayModel) model; + ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); + CodegenProperty cp = fromProperty(name, arrayProperty); + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + m.parent = toInstantiationType(arrayProperty); + String containerType = cp.containerType; + if(instantiationTypes.containsKey(containerType)) + m.imports.add(instantiationTypes.get(containerType)); + if(typeMapping.containsKey(containerType)) { + containerType = typeMapping.get(containerType); + cp.containerType = containerType; + m.imports.add(containerType); + } + } + else if (model instanceof RefModel) { + // TODO + } + else { + ModelImpl impl = (ModelImpl) model; + if(impl.getAdditionalProperties() != null) { + MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); + CodegenProperty cp = fromProperty(name, mapProperty); + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + m.parent = toInstantiationType(mapProperty); + String containerType = cp.containerType; + if(instantiationTypes.containsKey(containerType)) + m.imports.add(instantiationTypes.get(containerType)); + if(typeMapping.containsKey(containerType)) { + containerType = typeMapping.get(containerType); + cp.containerType = containerType; + m.imports.add(containerType); + } + } + if(impl.getProperties() != null && impl.getProperties().size() > 0) { + m.hasVars = true; + for(String key: impl.getProperties().keySet()) { + Property prop = impl.getProperties().get(key); + + if(prop == null) { + System.out.println("null property for " + key); + } + else { + CodegenProperty cp = fromProperty(key, prop); + cp.required = false; + if(impl.getRequired() != null) { + for(String req : impl.getRequired()) { + if(key.equals(req)) + cp.required = true; + } + } + if(cp.complexType != null && !defaultIncludes.contains(cp.complexType)) { + m.imports.add(cp.complexType); + } + m.vars.add(cp); + count += 1; + if(count != impl.getProperties().keySet().size()) + cp.hasMore = new Boolean(true); + if(cp.isContainer != null) { + String arrayImport = typeMapping.get("array"); + if(arrayImport != null && + !languageSpecificPrimitives.contains(arrayImport) && + !defaultIncludes.contains(arrayImport)) + m.imports.add(arrayImport); + } + + if(cp.complexType != null && + !languageSpecificPrimitives.contains(cp.complexType) && + !defaultIncludes.contains(cp.complexType)) + m.imports.add(cp.complexType); + + if(cp.baseType != null && + !languageSpecificPrimitives.contains(cp.baseType) && + !defaultIncludes.contains(cp.baseType)) + m.imports.add(cp.baseType); + } + } + } + else { + m.emptyVars = true; + } + } + return m; + } + + public CodegenProperty fromProperty(String name, Property p) { + if(p == null) { + System.out.println("unexpected missing property for name " + null); + return null; + } + CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); + + property.name = toVarName(name); + property.baseName = name; + property.description = escapeText(p.getDescription()); + property.getter = "get" + initialCaps(name); + property.setter = "set" + initialCaps(name); + property.example = p.getExample(); + property.defaultValue = toDefaultValue(p); + + String type = getSwaggerType(p); + + if(p instanceof AbstractNumericProperty) { + AbstractNumericProperty np = (AbstractNumericProperty) p; + property.minimum = np.getMinimum(); + property.maximum = np.getMaximum(); + property.exclusiveMinimum = np.getExclusiveMinimum(); + property.exclusiveMaximum = np.getExclusiveMaximum(); + + // legacy support + Map allowableValues = new HashMap(); + if(np.getMinimum() != null) + allowableValues.put("min", np.getMinimum()); + if(np.getMaximum() != null) + allowableValues.put("max", np.getMaximum()); + property.allowableValues = allowableValues; + } + + if(p instanceof StringProperty) { + StringProperty sp = (StringProperty) p; + property.maxLength = sp.getMaxLength(); + property.minLength = sp.getMinLength(); + property.pattern = sp.getPattern(); + if(sp.getEnum() != null) { + List _enum = sp.getEnum(); + property._enum = _enum; + property.isEnum = true; + + // legacy support + Map allowableValues = new HashMap(); + allowableValues.put("values", _enum); + property.allowableValues = allowableValues; + } + } + + property.datatype = property.isEnum + ? StringUtils.capitalize(property.name) + "Enum" + : getTypeDeclaration(p); + property.baseType = getSwaggerType(p); + + if(p instanceof ArrayProperty) { + property.isContainer = true; + property.containerType = "array"; + ArrayProperty ap = (ArrayProperty) p; + CodegenProperty cp = fromProperty("inner", ap.getItems()); + if(cp == null) { + System.out.println("skipping invalid property:"); + Json.prettyPrint(p); + } + else { + property.baseType = getSwaggerType(p); + if(!languageSpecificPrimitives.contains(cp.baseType)) + property.complexType = cp.baseType; + else + property.isPrimitiveType = true; + } + } + else if(p instanceof MapProperty) { + property.isContainer = true; + property.containerType = "map"; + MapProperty ap = (MapProperty) p; + CodegenProperty cp = fromProperty("inner", ap.getAdditionalProperties()); + + property.baseType = getSwaggerType(p); + if(!languageSpecificPrimitives.contains(cp.baseType)) + property.complexType = cp.baseType; + else + property.isPrimitiveType = true; + } + else { + property.isNotContainer = true; + if(languageSpecificPrimitives().contains(type)) + property.isPrimitiveType = true; + else + property.complexType = property.baseType; + } + return property; + } + + public CodegenOperation fromOperation(String path, String httpMethod, Operation operation){ + CodegenOperation op = CodegenModelFactory.newInstance(CodegenModelType.OPERATION); + Set imports = new HashSet(); + + String operationId = operation.getOperationId(); + if(operationId == null) { + String tmpPath = path; + tmpPath = tmpPath.replaceAll("\\{", ""); + tmpPath = tmpPath.replaceAll("\\}", ""); + String[] parts = (tmpPath + "/" + httpMethod).split("/"); + StringBuilder builder = new StringBuilder(); + if("/".equals(tmpPath)) { + // must be root tmpPath + builder.append("root"); + } + for(int i = 0; i < parts.length; i++) { + String part = parts[i]; + if(part.length() > 0) { + if(builder.toString().length() == 0) + part = Character.toLowerCase(part.charAt(0)) + part.substring(1); + else + part = initialCaps(part); + builder.append(part); + } + } + operationId = builder.toString(); + System.out.println("generated operationId " + operationId); + } + op.path = path; + op.operationId = operationId; + op.summary = escapeText(operation.getSummary()); + op.notes = escapeText(operation.getDescription()); + op.tags = operation.getTags(); + + Response methodResponse = null; + + if(operation.getConsumes() != null && operation.getConsumes().size() > 0) { + List> c = new ArrayList>(); + int count = 0; + for(String key: operation.getConsumes()) { + Map mediaType = new HashMap(); + mediaType.put("mediaType", key); + count += 1; + if (count < operation.getConsumes().size()) + mediaType.put("hasMore", "true"); + c.add(mediaType); + } + op.consumes = c; + op.hasConsumes = true; + } + + if(operation.getProduces() != null && operation.getProduces().size() > 0) { + List> c = new ArrayList>(); + int count = 0; + for(String key: operation.getProduces()) { + Map mediaType = new HashMap(); + mediaType.put("mediaType", key); + count += 1; + if (count < operation.getProduces().size()) + mediaType.put("hasMore", "true"); + c.add(mediaType); + } + op.produces = c; + op.hasProduces = true; + } + + if(operation.getResponses() != null) { + for(String responseCode: new TreeSet(operation.getResponses().keySet())) { + Response response = operation.getResponses().get(responseCode); + if (responseCode.startsWith("2")) { + // use the first, i.e. the smallest 2xx response status as methodResponse + methodResponse = response; + break; + } + } + if(methodResponse == null && operation.getResponses().keySet().contains("default")) { + methodResponse = operation.getResponses().get("default"); + } + for(String responseCode: operation.getResponses().keySet()) { + Response response = operation.getResponses().get(responseCode); + if(response != methodResponse) { + CodegenResponse r = fromResponse(responseCode, response); + op.responses.add(r); + } + for(int i = 0; i < op.responses.size() - 1; i++) { + CodegenResponse r = op.responses.get(i); + r.hasMore = new Boolean(true); + } + } + } + + if(methodResponse != null) { + if (methodResponse.getSchema() != null) { + CodegenProperty cm = fromProperty("response", methodResponse.getSchema()); + + Property responseProperty = methodResponse.getSchema(); + + if(responseProperty instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) responseProperty; + CodegenProperty innerProperty = fromProperty("response", ap.getItems()); + op.returnBaseType = innerProperty.baseType; + } + else { + if(cm.complexType != null) + op.returnBaseType = cm.complexType; + else + op.returnBaseType = cm.baseType; + } + op.examples = toExamples(methodResponse.getExamples()); + op.defaultResponse = toDefaultValue(responseProperty); + op.returnType = cm.datatype; + if(cm.isContainer != null) { + op.returnContainer = cm.complexType; + } + else + op.returnSimpleType = true; + if (languageSpecificPrimitives().contains(op.returnBaseType) || op.returnBaseType == null) + op.returnTypeIsPrimitive = true; + } + addHeaders(methodResponse, op.responseHeaders); + } + + if(op.returnBaseType == null) { + op.returnTypeIsPrimitive = true; + op.returnSimpleType = true; + } + + if(op.returnBaseType != null && + !defaultIncludes.contains(op.returnBaseType) && + !languageSpecificPrimitives.contains(op.returnBaseType)) + imports.add(op.returnBaseType); + + List parameters = operation.getParameters(); + CodegenParameter bodyParam = null; + List allParams = new ArrayList(); + List bodyParams = new ArrayList(); + List pathParams = new ArrayList(); + List queryParams = new ArrayList(); + List headerParams = new ArrayList(); + List cookieParams = new ArrayList(); + List formParams = new ArrayList(); + + if(parameters != null) { + for(Parameter param : parameters) { + CodegenParameter p = fromParameter(param, imports); + allParams.add(p); + if(param instanceof QueryParameter) { + p.isQueryParam = new Boolean(true); + queryParams.add(p.copy()); + } + else if(param instanceof PathParameter) { + p.required = true; + p.isPathParam = new Boolean(true); + pathParams.add(p.copy()); + } + else if(param instanceof HeaderParameter) { + p.isHeaderParam = new Boolean(true); + headerParams.add(p.copy()); + } + else if(param instanceof CookieParameter) { + p.isCookieParam = new Boolean(true); + cookieParams.add(p.copy()); + } + else if(param instanceof BodyParameter) { + p.isBodyParam = new Boolean(true); + bodyParam = p; + bodyParams.add(p.copy()); + } + else if(param instanceof FormParameter) { + if("file".equals(p.dataType)) + p.isFile = true; + else + p.notFile = true; + p.isFormParam = new Boolean(true); + formParams.add(p.copy()); + } + } + } + for(String i: imports) { + if(!defaultIncludes.contains(i) && !languageSpecificPrimitives.contains(i)){ + op.imports.add(i); + } + } + op.bodyParam = bodyParam; + op.httpMethod = httpMethod.toUpperCase(); + op.allParams = addHasMore(allParams); + op.bodyParams = addHasMore(bodyParams); + op.pathParams = addHasMore(pathParams); + op.queryParams = addHasMore(queryParams); + op.headerParams = addHasMore(headerParams); + // op.cookieParams = cookieParams; + op.formParams = addHasMore(formParams); + // legacy support + op.nickname = operationId; + + if(op.allParams.size() > 0) + op.hasParams = true; + op.externalDocs = operation.getExternalDocs(); + + return op; + } + + public CodegenResponse fromResponse(String responseCode, Response response) { + CodegenResponse r = CodegenModelFactory.newInstance(CodegenModelType.RESPONSE); + if("default".equals(responseCode)) + r.code = "0"; + else + r.code = responseCode; + r.message = response.getDescription(); + r.schema = response.getSchema(); + r.examples = toExamples(response.getExamples()); + return r; + } + + public CodegenParameter fromParameter(Parameter param, Set imports) { + CodegenParameter p = CodegenModelFactory.newInstance(CodegenModelType.PARAMETER); + p.baseName = param.getName(); + p.description = param.getDescription(); + p.required = param.getRequired(); + + if(param instanceof SerializableParameter) { + SerializableParameter qp = (SerializableParameter) param; + Property property = null; + String collectionFormat = null; + if("array".equals(qp.getType())) { + Property inner = qp.getItems(); + if(inner == null) { + System.out.println("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); + inner = new StringProperty().description("//TODO automatically added by swagger-codegen"); + } + property = new ArrayProperty(inner); + collectionFormat = qp.getCollectionFormat(); + CodegenProperty pr = fromProperty("inner", inner); + p.baseType = pr.datatype; + imports.add(pr.baseType); + } + else + property = PropertyBuilder.build(qp.getType(), qp.getFormat(), null); + if(property == null) { + System.out.println("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); + property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + qp.getType() + " but not supported"); + } + CodegenProperty model = fromProperty(qp.getName(), property); + p.collectionFormat = collectionFormat; + p.dataType = model.datatype; + p.paramName = toParamName(qp.getName()); + + if(model.complexType != null) { + imports.add(model.complexType); + } + } + else { + BodyParameter bp = (BodyParameter) param; + Model model = bp.getSchema(); + + if(model instanceof ModelImpl) { + ModelImpl impl = (ModelImpl) model; + CodegenModel cm = fromModel(bp.getName(), impl); + if(cm.emptyVars != null && cm.emptyVars == false) { + p.dataType = getTypeDeclaration(cm.classname); + imports.add(p.dataType); + } + else { + // TODO: missing format, so this will not always work + Property prop = PropertyBuilder.build(impl.getType(), null, null); + CodegenProperty cp = fromProperty("property", prop); + if(cp != null) { + p.dataType = cp.datatype; + } + } + } + else if(model instanceof ArrayModel) { + // to use the built-in model parsing, we unwrap the ArrayModel + // and get a single property from it + ArrayModel impl = (ArrayModel) model; + CodegenModel cm = fromModel(bp.getName(), impl); + // get the single property + ArrayProperty ap = new ArrayProperty().items(impl.getItems()); + CodegenProperty cp = fromProperty("inner", ap); + if(cp.complexType != null) { + imports.add(cp.complexType); + } + imports.add(cp.baseType); + p.dataType = cp.datatype; + p.isContainer = true; + } + else{ + Model sub = bp.getSchema(); + if(sub instanceof RefModel) { + String name = ((RefModel)sub).getSimpleRef(); + if(typeMapping.containsKey(name)) + name = typeMapping.get(name); + else { + name = toModelName(name); + if(defaultIncludes.contains(name)) { + imports.add(name); + } + imports.add(name); + name = getTypeDeclaration(name); + } + p.dataType = name; + } + } + p.paramName = toParamName(bp.getName()); + } + return p; + } + + protected List> toExamples(Map examples) { + if(examples == null) + return null; + + List> output = new ArrayList>(); + for(String key: examples.keySet()) { + String value = examples.get(key); + + Map kv = new HashMap(); + kv.put("contentType", key); + kv.put("example", value); + output.add(kv); + } + return output; + } + + private void addHeaders(Response response, List target) { + if (response.getHeaders() != null) { + for (Map.Entry headers : response.getHeaders().entrySet()) { + target.add(fromProperty(headers.getKey(), headers.getValue())); + } + } + } + + private List addHasMore(List objs) { + if(objs != null) { + for(int i = 0; i < objs.size(); i++) { + if(i > 0) + objs.get(i).secondaryParam = new Boolean(true); + if(i < objs.size() - 1) + objs.get(i).hasMore = new Boolean(true); + } + } + return objs; + } + + private Map addHasMore(Map objs) { + if(objs != null) { + for(int i = 0; i < objs.size() - 1; i++) { + if(i > 0) + objs.put("secondaryParam", new Boolean(true)); + if(i < objs.size() - 1) + objs.put("hasMore", true); + } + } + return objs; + } + + + public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { + List opList = operations.get(tag); + if(opList == null) { + opList = new ArrayList(); + operations.put(tag, opList); + } + opList.add(co); + co.baseName = tag; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java new file mode 100644 index 00000000000..d852adfec83 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultGenerator.java @@ -0,0 +1,371 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.*; +import com.wordnik.swagger.util.*; +import com.samskivert.mustache.*; + +import org.apache.commons.io.FileUtils; + +import java.util.*; +import java.util.regex.*; +import java.io.*; + +public class DefaultGenerator implements Generator { + private CodegenConfig config; + private ClientOptInput opts = null; + private Swagger swagger = null; + + public Generator opts(ClientOptInput opts) { + this.opts = opts; + + this.swagger = opts.getSwagger(); + ClientOpts clientOpts = opts.getOpts(); + this.config = opts.getConfig(); + this.config.additionalProperties().putAll(clientOpts.getProperties()); + + return this; + } + + public void generate() { + if(swagger == null || config == null) { + throw new RuntimeException("missing swagger input or config!"); + } + if(System.getProperty("debugSwagger") != null) { + Json.prettyPrint(swagger); + } + try { + config.processOpts(); + if(swagger.getInfo() != null) { + Info info = swagger.getInfo(); + if(info.getTitle() != null) + config.additionalProperties().put("appName", info.getTitle()); + if(info.getDescription() != null) + config.additionalProperties().put("appDescription", info.getDescription()); + if(info.getContact() != null) { + Contact contact = info.getContact(); + config.additionalProperties().put("infoUrl", contact.getUrl()); + if(contact.getEmail() != null) + config.additionalProperties().put("infoEmail", contact.getEmail()); + } + if(info.getLicense() != null) { + License license = info.getLicense(); + if(license.getName() != null) + config.additionalProperties().put("licenseInfo", license.getName()); + if(license.getUrl() != null) + config.additionalProperties().put("licenseUrl", license.getUrl()); + } + } + + StringBuilder hostBuilder = new StringBuilder(); + if(swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { + hostBuilder.append(swagger.getSchemes().get(0).toValue()); + hostBuilder.append("://"); + } + else + hostBuilder.append("https://"); + hostBuilder.append(swagger.getHost()).append(swagger.getBasePath()); + String basePath = hostBuilder.toString(); + + List allOperations = new ArrayList(); + List allModels = new ArrayList(); + + // models + Map definitions = swagger.getDefinitions(); + for(String name: definitions.keySet()) { + Model model = definitions.get(name); + Map modelMap = new HashMap(); + modelMap.put(name, model); + Map models = processModels(config, modelMap); + models.putAll(config.additionalProperties()); + + allModels.add(((List)models.get("models")).get(0)); + + for(String templateName : config.modelTemplateFiles().keySet()) { + String suffix = config.modelTemplateFiles().get(templateName); + String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; + String template = readTemplate(config.templateDir() + File.separator + templateName); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + writeToFile(filename, tmpl.execute(models)); + } + } + if(System.getProperty("debugModels") != null) { + System.out.println("############ Model info ############"); + Json.prettyPrint(allModels); + } + + // apis + Map> paths = processPaths(swagger.getPaths()); + for(String tag : paths.keySet()) { + List ops = paths.get(tag); + Map operation = processOperations(config, tag, ops); + operation.put("basePath", basePath); + operation.put("baseName", tag); + operation.put("modelPackage", config.modelPackage()); + operation.putAll(config.additionalProperties()); + operation.put("classname", config.toApiName(tag)); + allOperations.add(operation); + for(String templateName : config.apiTemplateFiles().keySet()) { + String suffix = config.apiTemplateFiles().get(templateName); + String filename = config.apiFileFolder() + + File.separator + + config.toApiFilename(tag) + + suffix; + + String template = readTemplate(config.templateDir() + File.separator + templateName); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + + writeToFile(filename, tmpl.execute(operation)); + } + } + if(System.getProperty("debugOperations") != null) { + System.out.println("############ Operation info ############"); + Json.prettyPrint(allOperations); + } + + // supporting files + Map bundle = new HashMap(); + bundle.putAll(config.additionalProperties()); + bundle.put("apiPackage", config.apiPackage()); + + Map apis = new HashMap(); + apis.put("apis", allOperations); + if(swagger.getBasePath() != null) { + bundle.put("basePath", swagger.getBasePath()); + } + bundle.put("apiInfo", apis); + bundle.put("models", allModels); + bundle.put("apiFolder", config.apiPackage().replaceAll("\\.", "/")); + bundle.put("modelPackage", config.modelPackage()); + if (swagger.getExternalDocs() != null) { + bundle.put("externalDocs", swagger.getExternalDocs()); + } + for(int i = 0; i < allModels.size() - 1; i++) { + HashMap cm = (HashMap) allModels.get(i); + CodegenModel m = cm.get("model"); + m.hasMoreModels = true; + } + + if(System.getProperty("debugSupportingFiles") != null) { + System.out.println("############ Supporting file info ############"); + Json.prettyPrint(bundle); + } + + for(SupportingFile support : config.supportingFiles()) { + String outputFolder = config.outputFolder(); + if(support.folder != null && !"".equals(support.folder)) + outputFolder += File.separator + support.folder; + File of = new File(outputFolder); + if(!of.isDirectory()) + of.mkdirs(); + String outputFilename = outputFolder + File.separator + support.destinationFilename; + + if(support.templateFile.endsWith("mustache")) { + String template = readTemplate(config.templateDir() + File.separator + support.templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + public Reader getTemplate (String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + }; + }) + .defaultValue("") + .compile(template); + + writeToFile(outputFilename, tmpl.execute(bundle)); + } + else { + String template = readTemplate(config.templateDir() + File.separator + support.templateFile); + FileUtils.writeStringToFile(new File(outputFilename), template); + System.out.println("copying file to " + outputFilename); + } + } + + config.processSwagger(swagger); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public Map> processPaths(Map paths) { + Map> ops = new HashMap>(); + List tags = null; + + 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); + } + return ops; + } + + public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations) { + if(operation != null) { + List tags = operation.getTags(); + if(tags == null) { + tags = new ArrayList(); + tags.add("default"); + } + + for(String tag : tags) { + CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation); + co.tags = new ArrayList(); + co.tags.add(sanitizeTag(tag)); + + config.addOperationToGroup(sanitizeTag(tag), resourcePath, operation, co, operations); + } + } + } + + protected String sanitizeTag(String tag) { + // remove spaces and make strong case + String [] parts = tag.split(" "); + StringBuffer buf = new StringBuffer(); + for(String part: parts) { + if(!"".equals(part)) { + buf.append(Character.toUpperCase(part.charAt(0))); + if(part.length() > 1) + buf.append(part.substring(1)); + } + } + return buf.toString().replaceAll("[^a-zA-Z ]", ""); + } + + public File writeToFile(String filename, String contents) throws IOException { + System.out.println("writing file " + filename); + File output = new File(filename); + + if(output.getParent() != null && !new File(output.getParent()).exists()) { + File parent = new File(output.getParent()); + parent.mkdirs(); + } + Writer out = new BufferedWriter(new OutputStreamWriter( + new FileOutputStream(output), "UTF-8")); + + out.write(contents); + out.close(); + return output; + } + + public String readTemplate(String name) { + try{ + Reader reader = getTemplateReader(name); + if(reader == null) + throw new RuntimeException("no file found"); + java.util.Scanner s = new java.util.Scanner(reader).useDelimiter("\\A"); + return s.hasNext() ? s.next() : ""; + } + catch(Exception e) { + e.printStackTrace(); + } + throw new RuntimeException("can't load template " + name); + } + + public Reader getTemplateReader(String name) { + try{ + InputStream is = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(name)); + if(is == null) + is = new FileInputStream(new File(name)); + if(is == null) + throw new RuntimeException("no file found"); + return new InputStreamReader(is); + } + catch(Exception e) { + e.printStackTrace(); + } + throw new RuntimeException("can't load template " + name); + } + + private String getCPResourcePath(String name) { + if (!"/".equals(File.separator)) + return name.replaceAll(Pattern.quote(File.separator), "/"); + return name; + } + +public Map processOperations(CodegenConfig config, String tag, List ops) { + Map operations = new HashMap(); + Map objs = new HashMap(); + objs.put("classname", config.toApiName(tag)); + objs.put("operation", ops); + operations.put("operations", objs); + operations.put("package", config.apiPackage()); + + Set allImports = new HashSet(); + for(CodegenOperation op: ops) { + allImports.addAll(op.imports); + } + + List> imports = new ArrayList>(); + for(String i: allImports) { + Map im = new HashMap(); + String m = config.importMapping().get(i); + if(m == null) + m = config.toModelImport(i); + if(m != null) { + im.put("import", m); + imports.add(im); + } + } + + operations.put("imports", imports); + config.postProcessOperations(operations); + return operations; + } + + public Map processModels(CodegenConfig config, Map definitions) { + Map objs = new HashMap(); + objs.put("package", config.modelPackage()); + List models = new ArrayList(); + List model = new ArrayList(); + Set allImports = new HashSet(); + for(String key: definitions.keySet()) { + Model mm = definitions.get(key); + CodegenModel cm = config.fromModel(key, mm); + Map mo = new HashMap(); + mo.put("model", cm); + models.add(mo); + allImports.addAll(cm.imports); + } + objs.put("models", models); + + List> imports = new ArrayList>(); + for(String i: allImports) { + Map im = new HashMap(); + String m = config.importMapping().get(i); + if(m == null) + m = config.toModelImport(i); + if(m != null && !config.defaultIncludes().contains(m)) { + im.put("import", m); + imports.add(im); + } + // add instantiation types + m = config.instantiationTypes().get(i); + if(m != null && !config.defaultIncludes().contains(m)) { + im.put("import", m); + imports.add(im); + } + } + + objs.put("imports", imports); + config.postProcessModels(objs); + + return objs; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java new file mode 100644 index 00000000000..929ae580991 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/Generator.java @@ -0,0 +1,8 @@ +package com.wordnik.swagger.codegen; + +import com.wordnik.swagger.models.Swagger; + +public interface Generator { + Generator opts(ClientOptInput opts); + void generate(); +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java new file mode 100644 index 00000000000..85f08bfa70c --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/SupportingFile.java @@ -0,0 +1,13 @@ +package com.wordnik.swagger.codegen; + +public class SupportingFile { + public String templateFile; + public String folder; + public String destinationFilename; + + public SupportingFile(String templateFile, String folder, String destinationFilename) { + this.templateFile = templateFile; + this.folder = folder; + this.destinationFilename = destinationFilename; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java new file mode 100644 index 00000000000..7de102ec350 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/auth/AuthMethod.java @@ -0,0 +1,6 @@ +package com.wordnik.swagger.codegen.auth; + +public interface AuthMethod { + String getType(); + void setType(String type); +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg new file mode 100644 index 00000000000..9fd8d61f2ce --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/haproxy.cfg @@ -0,0 +1,86 @@ +#--------------------------------------------------------------------- +# Global settings +#--------------------------------------------------------------------- +global + log 127.0.0.1 local2 + chroot /var/lib/haproxy + pidfile /var/run/haproxy.pid + maxconn 4000 + user haproxy + group haproxy + daemon + +#--------------------------------------------------------------------- +# common defaults that all the 'listen' and 'backend' sections will +# use if not designated in their block +#--------------------------------------------------------------------- +defaults + mode http + log global + option dontlognull + option httpclose + option httplog + option forwardfor + option redispatch + timeout connect 10000 # default 10 second time out if a backend is not found + timeout client 300000 + timeout server 300000 + maxconn 60000 + retries 3 + +#--------------------------------------------------------------------- +# main frontend which proxys to the backends +#--------------------------------------------------------------------- +frontend main *:80 + default_backend app + + acl is_swagger_online hdr_beg(host) -i online.swagger.io + acl is_swagger_io hdr_beg(host) -i swagger.io + acl is_old hdr_beg(host) -i swagger.wordnik.com + acl is_old_editor hdr_beg(host) -i editor.swagger.wordnik.com + acl is_validator_swagger path_beg /swagger.json + + # online spec validator + reqrep ([^\ ]*)\ /validator/(.*) \1\ /validator/validator/\2 if is_swagger_online + + # something that didn't work + reqrep ([^\ ]*)\ /swagger.json(.*) \1\ /validator/swagger.json if is_validator_swagger + + # swagger schema + reqrep ^([^\ :]*)\ /v2/schema.json(.*) \1\ /swagger-api/swagger-spec/master/schemas/v2.0/schema.json\2 + acl is_swagger_spec path_beg /swagger-api/swagger-spec + + # swagger docs + reqrep ^([^\ :]*)\ /swagger-core/documentation/annotations/apidocs/current(.*) \1\ /swagger-core/apidocs/\2 + acl is_swagger_docs path_beg /swagger-core/apidocs + + use_backend github_swagger_io if is_swagger_docs + use_backend validator if is_swagger_online + use_backend validator if is_validator_swagger + use_backend github_swagger_io if is_swagger_io !is_swagger_spec + use_backend github_swagger_spec if is_swagger_spec + + redirect location http://editor.swagger.io if is_old_editor + redirect location http://swagger.io if is_old + +#--------------------------------------------------------------------- +# round robin balancing between the various backends +#--------------------------------------------------------------------- +backend github_swagger_io + balance roundrobin + server gh1 swagger-api.github.io:80 check + +backend github_swagger_spec + http-request set-header Host raw.githubusercontent.com + rspirep ^Content-type:(.*) Content-Type:\ application/json + rspirep ^Access-Control-Allow-Origin:(.*) Access-Control-Allow-Origin:* + balance roundrobin + server gh2 raw.githubusercontent.com:443 check ssl verify none + +backend validator + balance roundrobin + server app1 127.0.0.1:8000 check + +backend app + balance roundrobin + server app1 127.0.0.1:8000 check diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java new file mode 100644 index 00000000000..754ab46ac15 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/AndroidClientCodegen.java @@ -0,0 +1,106 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "android"; + } + + public String getHelp() { + return "Generates an Android client library."; + } + + public AndroidClientCodegen() { + super(); + outputFolder = "generated-code/android"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "android-java"; + apiPackage = "com.wordnik.client.api"; + modelPackage = "com.wordnik.client.model"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); + supportingFiles.add(new SupportingFile("httpPatch.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "HttpPatch.java")); + supportingFiles.add(new SupportingFile("jsonUtil.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); + supportingFiles.add(new SupportingFile("apiException.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @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 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 toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java new file mode 100644 index 00000000000..ab710431b78 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JavaClientCodegen.java @@ -0,0 +1,115 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "io.swagger"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "java"; + } + + public String getHelp() { + return "Generates a Java client library."; + } + + public JavaClientCodegen() { + super(); + outputFolder = "generated-code/java"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "Java"; + apiPackage = "io.swagger.client.api"; + modelPackage = "io.swagger.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.java")); + supportingFiles.add(new SupportingFile("JsonUtil.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "JsonUtil.java")); + supportingFiles.add(new SupportingFile("apiException.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiException.java")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @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 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 toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java new file mode 100644 index 00000000000..6c805e993c9 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java @@ -0,0 +1,129 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.models.Operation; +import com.wordnik.swagger.models.Path; +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.api"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-server"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + protected String title = "Swagger Server"; + + public String getName() { + return "jaxrs"; + } + + public String getHelp() { + return "Generates a Java JAXRS Server application."; + } + + public JaxRSServerCodegen() { + super(); + outputFolder = "generated-code/javaJaxRS"; + modelTemplateFiles.put("model.mustache", ".java"); + apiTemplateFiles.put("api.mustache", ".java"); + templateDir = "JavaJaxRS"; + apiPackage = "com.wordnik.api"; + modelPackage = "com.wordnik.model"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + additionalProperties.put("title", title); + + supportingFiles.clear(); + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("ApiException.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiException.java")); + supportingFiles.add(new SupportingFile("ApiOriginFilter.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiOriginFilter.java")); + supportingFiles.add(new SupportingFile("ApiResponseMessage.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiResponseMessage.java")); + supportingFiles.add(new SupportingFile("NotFoundException.mustache", + (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "NotFoundException.java")); + supportingFiles.add(new SupportingFile("web.mustache", + ("src/main/webapp/WEB-INF"), "web.xml")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float") + ); + } + + @Override + public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { + String basePath = resourcePath; + if(basePath.startsWith("/")) + basePath = basePath.substring(1); + int pos = basePath.indexOf("/"); + if(pos > 0) + basePath = basePath.substring(0, pos); + + if(basePath == "") + basePath = "default"; + else { + if(co.path.startsWith("/" + basePath)) + co.path = co.path.substring(("/" + basePath).length()); + co.subresourceOperation = !co.path.isEmpty(); + } + List opList = operations.get(basePath); + if(opList == null) { + opList = new ArrayList(); + operations.put(basePath, opList); + } + opList.add(co); + co.baseName = basePath; + } + + public Map postProcessOperations(Map objs) { + Map operations = (Map)objs.get("operations"); + if(operations != null) { + List ops = (List) operations.get("operation"); + for(CodegenOperation operation : ops) { + if(operation.returnType == null) + operation.returnType = "Void"; + else if(operation.returnType.startsWith("List")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("List<".length(), end); + operation.returnContainer = "List"; + } + } + else if(operation.returnType.startsWith("Map")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("Map<".length(), end); + operation.returnContainer = "Map"; + } + } + else if(operation.returnType.startsWith("Set")) { + String rt = operation.returnType; + int end = rt.lastIndexOf(">"); + if(end > 0) { + operation.returnType = rt.substring("Set<".length(), end); + operation.returnContainer = "Set"; + } + } + } + } + return objs; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java new file mode 100644 index 00000000000..b2f82498989 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/NodeJSServerCodegen.java @@ -0,0 +1,79 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + + public String getName() { + return "nodejs"; + } + + public String getHelp() { + return "Generates a node.js server application compatible with the 1.2 swagger specification."; + } + + public NodeJSServerCodegen() { + super(); + outputFolder = "generated-code/nodejs"; + apiTemplateFiles.put("api.mustache", ".js"); + templateDir = "nodejs"; + apiPackage = "app.apis"; + modelPackage = "app"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("models.mustache", modelPackage, "models.js")); + supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.js")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float") + ); + typeMapping.put("array", "array"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + apiPackage().replaceAll("\\.", File.separator); + } + + public String modelFileFolder() { + return outputFolder + File.separator + modelPackage().replaceAll("\\.", File.separator); + } + + @Override + public String getSwaggerType(Property p) { + String swaggerType = super.getSwaggerType(p); + String type = null; + if(typeMapping.containsKey(swaggerType)) { + return typeMapping.get(swaggerType); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java new file mode 100644 index 00000000000..271c353b233 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ObjcClientCodegen.java @@ -0,0 +1,216 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { + protected Set foundationClasses = new HashSet(); + protected String sourceFolder = "client"; + protected static String PREFIX = "SWG"; + + public String getName() { + return "objc"; + } + + public String getHelp() { + return "Generates an Objective-C client library."; + } + + public ObjcClientCodegen() { + super(); + outputFolder = "generated-code/objc"; + modelTemplateFiles.put("model-header.mustache", ".h"); + modelTemplateFiles.put("model-body.mustache", ".m"); + apiTemplateFiles.put("api-header.mustache", ".h"); + apiTemplateFiles.put("api-body.mustache", ".m"); + templateDir = "objc"; + modelPackage = ""; + + defaultIncludes = new HashSet( + Arrays.asList( + "bool", + "int", + "NSString", + "NSObject", + "NSArray", + "NSNumber", + "NSDictionary", + "NSMutableArray", + "NSMutableDictionary") + ); + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "NSNumber", + "NSString", + "NSObject", + "bool") + ); + + reservedWords = new HashSet( + Arrays.asList( + "void", "char", "short", "int", "void", "char", "short", "int", + "long", "float", "double", "signed", "unsigned", "id", "const", + "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", + "self", "super" + )); + + typeMapping = new HashMap(); + typeMapping.put("enum", "NSString"); + typeMapping.put("Date", "SWGDate"); + typeMapping.put("DateTime", "SWGDate"); + // typeMapping.put("Date", "SWGDate"); + typeMapping.put("boolean", "NSNumber"); + typeMapping.put("string", "NSString"); + typeMapping.put("integer", "NSNumber"); + typeMapping.put("int", "NSNumber"); + typeMapping.put("float", "NSNumber"); + typeMapping.put("long", "NSNumber"); + typeMapping.put("double", "NSNumber"); + typeMapping.put("array", "NSArray"); + typeMapping.put("map", "NSDictionary"); + typeMapping.put("number", "NSNumber"); + typeMapping.put("List", "NSArray"); + typeMapping.put("object", "NSObject"); + + importMapping = new HashMap (); + importMapping.put("Date", "SWGDate"); + + foundationClasses = new HashSet ( + Arrays.asList( + "NSNumber", + "NSObject", + "NSString", + "NSDictionary") + ); + + instantiationTypes.put("array", "NSMutableArray"); + instantiationTypes.put("map", "NSMutableDictionary"); + + supportingFiles.add(new SupportingFile("SWGObject.h", sourceFolder, "SWGObject.h")); + supportingFiles.add(new SupportingFile("SWGObject.m", sourceFolder, "SWGObject.m")); + supportingFiles.add(new SupportingFile("SWGApiClient.h", sourceFolder, "SWGApiClient.h")); + supportingFiles.add(new SupportingFile("SWGApiClient.m", sourceFolder, "SWGApiClient.m")); + supportingFiles.add(new SupportingFile("SWGFile.h", sourceFolder, "SWGFile.h")); + supportingFiles.add(new SupportingFile("SWGFile.m", sourceFolder, "SWGFile.m")); + supportingFiles.add(new SupportingFile("SWGDate.h", sourceFolder, "SWGDate.h")); + supportingFiles.add(new SupportingFile("SWGDate.m", sourceFolder, "SWGDate.m")); + supportingFiles.add(new SupportingFile("Podfile.mustache", "", "Podfile")); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map"); + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array"); + } + else + return null; + } + + @Override + public String getTypeDeclaration(String name) { + if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) + return name; + else + return name + "*"; + } + + @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) && !foundationClasses.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) + return toModelName(swaggerType); + else + return swaggerType + "*"; + } + + @Override + public String toModelName(String type) { + if(typeMapping.keySet().contains(type) || + foundationClasses.contains(type) || + importMapping.values().contains(type) || + defaultIncludes.contains(type) || + languageSpecificPrimitives.contains(type)) { + return Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + else { + return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + } + + @Override + public String toModelImport(String name) { + // name = name + ".h"; + if("".equals(modelPackage())) + return name; + else + return modelPackage() + "." + name; + } + + @Override + public String toDefaultValue(Property p) { + return null; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String toModelFilename(String name) { + return PREFIX + initialCaps(name); + } + + @Override + public String toApiName(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + public String toApiFilename(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + @Override + public String toVarName(String name) { + String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); + if(paramName.startsWith("new") || reservedWords.contains(paramName)) { + return escapeReservedWord(paramName); + } + else + return paramName; + } + + public String escapeReservedWord(String name) { + return "_" + name; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java new file mode 100644 index 00000000000..f27044c2db7 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PhpClientCodegen.java @@ -0,0 +1,110 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + // protected String sourceFolder = ""; + + public String getName() { + return "php"; + } + + public String getHelp() { + return "Generates a PHP client library."; + } + + public PhpClientCodegen() { + super(); + outputFolder = "generated-code/php"; + modelTemplateFiles.put("model.mustache", ".php"); + apiTemplateFiles.put("api.mustache", ".php"); + templateDir = "php"; + + typeMapping.clear(); + languageSpecificPrimitives.clear(); + + reservedWords = new HashSet ( + Arrays.asList( + "int") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + languageSpecificPrimitives.add("int"); + languageSpecificPrimitives.add("array"); + languageSpecificPrimitives.add("map"); + languageSpecificPrimitives.add("string"); + languageSpecificPrimitives.add("DateTime"); + + typeMapping.put("long", "int"); + typeMapping.put("integer", "int"); + typeMapping.put("Array", "array"); + typeMapping.put("String", "string"); + typeMapping.put("List", "array"); + typeMapping.put("map", "map"); + + supportingFiles.add(new SupportingFile("Swagger.mustache", "", "Swagger.php")); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @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 getSwaggerType(p) + "[string," + getTypeDeclaration(inner) + "]"; + } + 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 = swaggerType; + if(type == null) + return null; + return type; + } + + public String toDefaultValue(Property p) { + return "null"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java new file mode 100755 index 00000000000..c3cf3648123 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/PythonClientCodegen.java @@ -0,0 +1,117 @@ +/** + * 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. + */ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { + + public String getName() { + return "python"; + } + + public String getHelp() { + return "Generates a Python client library."; + } + + public PythonClientCodegen() { + super(); + outputFolder = "generated-code/python"; + modelTemplateFiles.put("model.mustache", ".py"); + apiTemplateFiles.put("api.mustache", ".py"); + templateDir = "python"; + + apiPackage = ""; + modelPackage = "models"; + + languageSpecificPrimitives.clear(); + languageSpecificPrimitives.add("int"); + languageSpecificPrimitives.add("float"); + languageSpecificPrimitives.add("long"); + languageSpecificPrimitives.add("list"); + languageSpecificPrimitives.add("bool"); + languageSpecificPrimitives.add("str"); + languageSpecificPrimitives.add("datetime"); + + typeMapping.clear(); + typeMapping.put("integer", "int"); + typeMapping.put("float", "float"); + typeMapping.put("long", "long"); + typeMapping.put("double", "float"); + typeMapping.put("array", "list"); + typeMapping.put("map", "map"); + typeMapping.put("boolean", "bool"); + typeMapping.put("string", "str"); + typeMapping.put("date", "datetime"); + + + supportingFiles.add(new SupportingFile("swagger.mustache", "", "swagger.py")); + supportingFiles.add(new SupportingFile("__init__.mustache", "", "__init__.py")); + supportingFiles.add(new SupportingFile("__init__.mustache", modelPackage, "__init__.py")); + + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @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 getSwaggerType(p) + "(String, " + getTypeDeclaration(inner) + ")"; + } + 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 = swaggerType; + return type; + } + + public String toDefaultValue(Property p) { + // TODO: Support Python def value + return "null"; + } +} diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java new file mode 100644 index 00000000000..6c845a9ccb7 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalaClientCodegen.java @@ -0,0 +1,182 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "io.swagger.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/java"; + + public String getName() { + return "scala"; + } + + public String getHelp() { + return "Generates a Scala client library."; + } + + public ScalaClientCodegen() { + super(); + outputFolder = "generated-code/scala"; + modelTemplateFiles.put("model.mustache", ".scala"); + apiTemplateFiles.put("api.mustache", ".scala"); + templateDir = "scala"; + apiPackage = "io.swagger.client.api"; + modelPackage = "io.swagger.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "case", "catch", "class", "def", "do", "else", "extends", + "false", "final", "finally", "for", "forSome", "if", "implicit", + "import", "lazy", "match", "new", "null", "object", "override", "package", + "private", "protected", "return", "sealed", "super", "this", "throw", + "trait", "try", "true", "type", "val", "var", "while", "with", "yield") + ); + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); + supportingFiles.add(new SupportingFile("apiInvoker.mustache", + (sourceFolder + File.separator + invokerPackage).replace(".", java.io.File.separator), "ApiInvoker.scala")); + + importMapping.remove("List"); + importMapping.remove("Set"); + importMapping.remove("Map"); + + importMapping.put("DateTime", "org.joda.time.DateTime"); + importMapping.put("ListBuffer", "scala.collections.mutable.ListBuffer"); + + typeMapping = new HashMap(); + typeMapping.put("enum", "NSString"); + typeMapping.put("array", "List"); + typeMapping.put("set", "Set"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("string", "String"); + typeMapping.put("int", "Int"); + typeMapping.put("long", "Long"); + typeMapping.put("float", "Float"); + typeMapping.put("byte", "Byte"); + typeMapping.put("short", "Short"); + typeMapping.put("char", "Char"); + typeMapping.put("long", "Long"); + typeMapping.put("double", "Double"); + typeMapping.put("object", "Any"); + typeMapping.put("file", "File"); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Int", + "Long", + "Float", + "Object", + "List", + "Map") + ); + instantiationTypes.put("array", "ListBuffer"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + 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 toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map") + "[String, " + inner + "]"; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array") + "[" + inner + "]"; + } + else + return null; + } + + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "null"; + else if (p instanceof BooleanProperty) + return "null"; + else if(p instanceof DateProperty) + return "null"; + else if(p instanceof DateTimeProperty) + return "null"; + else if (p instanceof DoubleProperty) + return "null"; + else if (p instanceof FloatProperty) + return "null"; + else if (p instanceof IntegerProperty) + return "null"; + else if (p instanceof LongProperty) + return "null"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap[String, " + inner + "]() "; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ListBuffer[" + inner + "]() "; + } + else + return "null"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java new file mode 100644 index 00000000000..e87609b720d --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/ScalatraServerCodegen.java @@ -0,0 +1,174 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import java.util.*; +import java.io.File; + +public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/scala"; + + public String getName() { + return "scalatra"; + } + + public String getHelp() { + return "Generates a Scala server application with Scalatra."; + } + + public ScalatraServerCodegen() { + super(); + outputFolder = "generated-code/scalatra"; + modelTemplateFiles.put("model.mustache", ".scala"); + apiTemplateFiles.put("api.mustache", ".scala"); + templateDir = "scalatra"; + apiPackage = "com.wordnik.client.api"; + modelPackage = "com.wordnik.client.model"; + + reservedWords = new HashSet ( + Arrays.asList( + "abstract", "continue", "for", "new", "switch", "assert", + "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", + "this", "break", "double", "implements", "protected", "throw", "byte", "else", + "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", + "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", + "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", + "native", "super", "while") + ); + + defaultIncludes = new HashSet( + Arrays.asList("double", + "Int", + "Long", + "Float", + "Double", + "char", + "float", + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "List", + "Set", + "Map") + ); + + typeMapping.put("integer", "Int"); + typeMapping.put("long", "Long"); + + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appDescription", "A sample swagger server"); + additionalProperties.put("infoUrl", "http://developers.helloreverb.com"); + additionalProperties.put("infoEmail", "hello@helloreverb.com"); + additionalProperties.put("licenseInfo", "All rights reserved"); + additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); + supportingFiles.add(new SupportingFile("build.sbt", "", "build.sbt")); + supportingFiles.add(new SupportingFile("web.xml", "/src/main/webapp/WEB-INF", "web.xml")); + supportingFiles.add(new SupportingFile("JettyMain.scala", sourceFolder, "JettyMain.scala")); + supportingFiles.add(new SupportingFile("Bootstrap.mustache", sourceFolder, "ScalatraBootstrap.scala")); + supportingFiles.add(new SupportingFile("ServletApp.mustache", sourceFolder, "ServletApp.scala")); + supportingFiles.add(new SupportingFile("project/build.properties", "project", "build.properties")); + supportingFiles.add(new SupportingFile("project/plugins.sbt", "project", "plugins.sbt")); + supportingFiles.add(new SupportingFile("sbt", "", "sbt")); + + languageSpecificPrimitives = new HashSet( + Arrays.asList( + "String", + "boolean", + "Boolean", + "Double", + "Integer", + "Long", + "Float", + "Object") + ); + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + + importMapping = new HashMap (); + importMapping.put("BigDecimal", "java.math.BigDecimal"); + importMapping.put("UUID", "java.util.UUID"); + importMapping.put("File", "java.io.File"); + importMapping.put("Date", "java.util.Date"); + importMapping.put("Timestamp", "java.sql.Timestamp"); + importMapping.put("Map", "java.util.Map"); + importMapping.put("HashMap", "java.util.HashMap"); + importMapping.put("Array", "java.util.List"); + importMapping.put("ArrayList", "java.util.ArrayList"); + importMapping.put("DateTime", "org.joda.time.DateTime"); + importMapping.put("LocalDateTime", "org.joda.time.LocalDateTime"); + importMapping.put("LocalDate", "org.joda.time.LocalDate"); + importMapping.put("LocalTime", "org.joda.time.LocalTime"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + apiPackage().replaceAll("\\.", "/"); + } + + public String modelFileFolder() { + return outputFolder + "/" + sourceFolder + "/" + modelPackage().replaceAll("\\.", "/"); + } + + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + for(CodegenOperation op: operationList) { + op.httpMethod = op.httpMethod.toLowerCase(); + } + return objs; + } + + + @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + 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 toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java new file mode 100644 index 00000000000..3386a5f9fac --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticDocCodegen.java @@ -0,0 +1,72 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "docs"; + + public String getName() { + return "dynamic-html"; + } + + public String getHelp() { + return "Generates a dynamic HTML site."; + } + + public StaticDocCodegen() { + super(); + outputFolder = "docs"; + modelTemplateFiles.put("model.mustache", ".html"); + apiTemplateFiles.put("operation.mustache", ".html"); + templateDir = "swagger-static"; + + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("main.mustache", "", "main.js")); + supportingFiles.add(new SupportingFile("assets/css/bootstrap-responsive.css", + outputFolder + "/assets/css", "bootstrap-responsive.css")); + supportingFiles.add(new SupportingFile("assets/css/bootstrap.css", + outputFolder + "/assets/css", "bootstrap.css")); + supportingFiles.add(new SupportingFile("assets/css/style.css", + outputFolder + "/assets/css", "style.css")); + supportingFiles.add(new SupportingFile("assets/images/logo.png", + outputFolder + "/assets/images", "logo.png")); + supportingFiles.add(new SupportingFile("assets/js/bootstrap.js", + outputFolder + "/assets/js", "bootstrap.js")); + supportingFiles.add(new SupportingFile("assets/js/jquery-1.8.3.min.js", + outputFolder + "/assets/js", "jquery-1.8.3.min.js")); + supportingFiles.add(new SupportingFile("assets/js/main.js", + outputFolder + "/assets/js", "main.js")); + supportingFiles.add(new SupportingFile("index.mustache", + outputFolder, "index.html")); + + instantiationTypes.put("array", "ArrayList"); + instantiationTypes.put("map", "HashMap"); + } + + @Override + public String escapeReservedWord(String name) { + return "_" + name; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator + "operations"; + } + + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder + File.separator + "models"; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java new file mode 100644 index 00000000000..42ce9fe3604 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/StaticHtmlGenerator.java @@ -0,0 +1,81 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; +import com.wordnik.swagger.util.Json; + +import java.util.*; +import java.io.File; + +public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig { + protected String invokerPackage = "com.wordnik.client"; + protected String groupId = "com.wordnik"; + protected String artifactId = "swagger-client"; + protected String artifactVersion = "1.0.0"; + protected String sourceFolder = "src/main/scala"; + + public String getName() { + return "html"; + } + + public String getHelp() { + return "Generates a static HTML file."; + } + + public StaticHtmlGenerator() { + super(); + outputFolder = "docs"; + templateDir = "htmlDocs"; + + defaultIncludes = new HashSet(); + + String partner = "our Partner"; + + if(System.getProperty("partner") != null) + partner = System.getProperty("partner"); + + additionalProperties.put("partner", partner); + additionalProperties.put("appName", "Swagger Sample"); + additionalProperties.put("appDescription", "A sample swagger server"); + additionalProperties.put("infoUrl", "https://helloreverb.com"); + additionalProperties.put("infoEmail", "hello@helloreverb.com"); + additionalProperties.put("licenseInfo", "All rights reserved"); + additionalProperties.put("licenseUrl", "http://apache.org/licenses/LICENSE-2.0.html"); + additionalProperties.put("invokerPackage", invokerPackage); + additionalProperties.put("groupId", groupId); + additionalProperties.put("artifactId", artifactId); + additionalProperties.put("artifactVersion", artifactVersion); + + supportingFiles.add(new SupportingFile("index.mustache", "", "index.html")); + reservedWords = new HashSet(); + + languageSpecificPrimitives = new HashSet(); + importMapping = new HashMap (); + } + + @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 getSwaggerType(p) + "[String, " + getTypeDeclaration(inner) + "]"; + } + return super.getTypeDeclaration(p); + } + + @Override + public Map postProcessOperations(Map objs) { + Map operations = (Map) objs.get("operations"); + List operationList = (List) operations.get("operation"); + for(CodegenOperation op: operationList) { + op.httpMethod = op.httpMethod.toLowerCase(); + } + return objs; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java new file mode 100644 index 00000000000..49f5dc6bab4 --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/SwaggerGenerator.java @@ -0,0 +1,38 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.util.*; +import com.wordnik.swagger.models.Swagger; + +import org.apache.commons.io.FileUtils; + +import java.io.File; + +public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { + public String getName() { + return "swagger"; + } + + public String getHelp() { + return "Creates a static swagger.json file."; + } + + public SwaggerGenerator() { + super(); + outputFolder = "generated-code/swagger"; + } + + @Override + public void processSwagger(Swagger swagger) { + String swaggerString = Json.pretty(swagger); + + try{ + String outputFile = outputFolder + File.separator + "swagger.json"; + FileUtils.writeStringToFile(new File(outputFile), swaggerString); + System.out.println("wrote file to " + outputFile); + } + catch(Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java new file mode 100644 index 00000000000..d91267758ee --- /dev/null +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/TizenClientCodegen.java @@ -0,0 +1,243 @@ +package com.wordnik.swagger.codegen.languages; + +import com.wordnik.swagger.util.Json; +import com.wordnik.swagger.codegen.*; +import com.wordnik.swagger.models.properties.*; + +import java.util.*; +import java.io.File; + +public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig { + protected Set foundationClasses = new HashSet(); + protected String sourceFolder = "client"; + protected static String PREFIX = "Sami"; + protected Map namespaces = new HashMap(); + + public String getName() { + return "tizen"; + } + + public String getHelp() { + return "Generates a Samsung Tizen C++ client library."; + } + + public TizenClientCodegen() { + super(); + outputFolder = "generated-code/tizen"; + modelTemplateFiles.put("model-header.mustache", ".h"); + modelTemplateFiles.put("model-body.mustache", ".cpp"); + apiTemplateFiles.put("api-header.mustache", ".h"); + apiTemplateFiles.put("api-body.mustache", ".cpp"); + templateDir = "tizen"; + modelPackage = ""; + + defaultIncludes = new HashSet( + Arrays.asList( + "bool", + "int", + "long") + ); + languageSpecificPrimitives = new HashSet(); + + additionalProperties().put("prefix", PREFIX); + + reservedWords = new HashSet( + // VERIFY + Arrays.asList( + "void", "char", "short", "int", "void", "char", "short", "int", + "long", "float", "double", "signed", "unsigned", "id", "const", + "volatile", "in", "out", "inout", "bycopy", "byref", "oneway", + "self", "super" + )); + + super.typeMapping = new HashMap(); + + typeMapping.put("Date", "DateTime"); + typeMapping.put("DateTime", "DateTime"); + typeMapping.put("string", "String"); + typeMapping.put("integer", "Integer"); + typeMapping.put("float", "Float"); + typeMapping.put("long", "Long"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("double", "Double"); + typeMapping.put("array", "IList"); + typeMapping.put("map", "HashMap"); + typeMapping.put("number", "Long"); + typeMapping.put("object", PREFIX + "Object"); + + importMapping = new HashMap(); + + namespaces = new HashMap (); + namespaces.put("DateTime", "Tizen::Base::DateTime"); + namespaces.put("Integer", "Tizen::Base::Integer"); + namespaces.put("Long", "Tizen::Base::Long"); + namespaces.put("Boolean", "Tizen::Base::Boolean"); + namespaces.put("Float", "Tizen::Base::Float"); + namespaces.put("String", "Tizen::Base::String"); + namespaces.put("Double", "Tizen::Base::Double"); + namespaces.put("IList", "Tizen::Base::Collection::IList"); + namespaces.put("HashMap", "Tizen::Base::Collection::HashMap"); + namespaces.put("ArrayList", "Tizen::Base::Collection::ArrayList"); + namespaces.put("JsonNumber", "Tizen::Web::Json"); + namespaces.put("JsonString", "Tizen::Web::Json"); + + foundationClasses = new HashSet ( + Arrays.asList( + "String", + "Integer", + "Float") + ); + supportingFiles.clear(); + supportingFiles.add(new SupportingFile("modelFactory.mustache", sourceFolder, PREFIX + "ModelFactory.h")); + supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder, PREFIX + "Helpers.h")); + supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder, PREFIX + "Helpers.cpp")); + supportingFiles.add(new SupportingFile("apiclient-header.mustache", sourceFolder, PREFIX + "ApiClient.h")); + supportingFiles.add(new SupportingFile("apiclient-body.mustache", sourceFolder, PREFIX + "ApiClient.cpp")); + supportingFiles.add(new SupportingFile("object.mustache", sourceFolder, PREFIX + "Object.h")); + supportingFiles.add(new SupportingFile("error-header.mustache", sourceFolder, PREFIX + "Error.h")); + supportingFiles.add(new SupportingFile("error-body.mustache", sourceFolder, PREFIX + "Error.cpp")); + } + + @Override + public String toInstantiationType(Property p) { + if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return instantiationTypes.get("map"); + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return instantiationTypes.get("array"); + } + else + return null; + } + + @Override + public String getTypeDeclaration(String name) { + if(languageSpecificPrimitives.contains(name) && !foundationClasses.contains(name)) + return name; + else + return name + "*"; + } + + @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) && !foundationClasses.contains(type)) + return toModelName(type); + } + else + type = swaggerType; + return toModelName(type); + } + + @Override + public String getTypeDeclaration(Property p) { + String swaggerType = getSwaggerType(p); + if(languageSpecificPrimitives.contains(swaggerType) && !foundationClasses.contains(swaggerType)) + return toModelName(swaggerType); + else + return swaggerType + "*"; + } + + @Override + public String toModelName(String type) { + if(typeMapping.keySet().contains(type) || + typeMapping.values().contains(type) || + foundationClasses.contains(type) || + importMapping.values().contains(type) || + defaultIncludes.contains(type) || + languageSpecificPrimitives.contains(type)) { + return type; + } + else { + return PREFIX + Character.toUpperCase(type.charAt(0)) + type.substring(1); + } + } + + @Override + public String toModelImport(String name) { + if(namespaces.containsKey(name)) { + return "using " + namespaces.get(name) + ";"; + } + return "#include \"" + name + ".h\""; + } + + @Override + public String toDefaultValue(Property p) { + if(p instanceof StringProperty) + return "new String()"; + else if (p instanceof BooleanProperty) + return "new Boolean(false)"; + else if(p instanceof DateProperty) + return "new DateTime()"; + else if(p instanceof DateTimeProperty) + return "new DateTime()"; + else if (p instanceof DoubleProperty) + return "new Double()"; + else if (p instanceof FloatProperty) + return "new Float()"; + else if (p instanceof IntegerProperty) + return "new Integer()"; + else if (p instanceof LongProperty) + return "new Long()"; + else if (p instanceof DecimalProperty) + return "new Long()"; + else if (p instanceof MapProperty) { + MapProperty ap = (MapProperty) p; + String inner = getSwaggerType(ap.getAdditionalProperties()); + return "new HashMap()"; + } + else if (p instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) p; + String inner = getSwaggerType(ap.getItems()); + return "new ArrayList()"; + } + // else + if(p instanceof RefProperty) { + RefProperty rp = (RefProperty) p; + return "new " + toModelName(rp.getSimpleRef()) + "()"; + } + return "null"; + } + + @Override + public String apiFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String modelFileFolder() { + return outputFolder + File.separator + sourceFolder; + } + + @Override + public String toModelFilename(String name) { + return PREFIX + initialCaps(name); + } + + @Override + public String toApiName(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + public String toApiFilename(String name) { + return PREFIX + initialCaps(name) + "Api"; + } + + @Override + public String toVarName(String name) { + String paramName = name.replaceAll("[^a-zA-Z0-9_]",""); + paramName = Character.toUpperCase(paramName.charAt(0)) + paramName.substring(1); + return "p" + paramName; + } + + public String escapeReservedWord(String name) { + return "_" + name; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache b/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache new file mode 100644 index 00000000000..956b834c88c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/ApiUtils.mustache @@ -0,0 +1,50 @@ +package {{invokerPackage}}; + +import groovyx.net.http.HTTPBuilder +import groovyx.net.http.Method + +import static groovyx.net.http.ContentType.JSON +import static java.net.URI.create; + +class ApiUtils { + + def invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, method, container, type) { + def (url, uriPath) = buildUrlAndUriPath(basePath, versionPath, resourcePath) + println "url=$url uriPath=$uriPath" + def http = new HTTPBuilder(url) + http.request( Method.valueOf(method), JSON ) { + uri.path = uriPath + uri.query = queryParams + response.success = { resp, json -> + if (type != null) { + onSuccess(parse(json, container, type)) + } + } + response.failure = { resp -> + onFailure(resp.status, resp.statusLine.reasonPhrase) + } + } + } + + + def buildUrlAndUriPath(basePath, versionPath, resourcePath) { + // HTTPBuilder expects to get as its constructor parameter an URL, + // without any other additions like path, therefore we need to cut the path + // from the basePath as it is represented by swagger APIs + // we use java.net.URI to manipulate the basePath + // then the uriPath will hold the rest of the path + URI baseUri = create(basePath) + def pathOnly = baseUri.getPath() + [basePath-pathOnly, pathOnly+versionPath+resourcePath] + } + + + def parse(object, container, clazz) { + if (container == "List") { + return object.collect {parse(it, "", clazz)} + } else { + return clazz.newInstance(object) + } + } + +} diff --git a/modules/swagger-codegen/src/main/resources/Groovy/api.mustache b/modules/swagger-codegen/src/main/resources/Groovy/api.mustache new file mode 100644 index 00000000000..6ff66a84720 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/api.mustache @@ -0,0 +1,56 @@ +package {{package}}; + + + + + +import groovyx.net.http.* +import static groovyx.net.http.ContentType.* +import static groovyx.net.http.Method.* +import {{invokerPackage}}.ApiUtils +//------------- + +{{#imports}}import {{import}} +{{/imports}} + +import java.util.*; + +@Mixin(ApiUtils) +{{#operations}} +class {{classname}} { + String basePath = "{{basePath}}" + String versionPath = "/api/v1" + + + {{#operation}} + def {{nickname}} ({{#allParams}} {{{dataType}}} {{paramName}},{{/allParams}} Closure onSuccess, Closure onFailure) { + // create path and map variables + String resourcePath = "{{path}}" + + + // query params + def queryParams = [:] + def headerParams = [:] + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new RuntimeException("missing required params") + } + {{/requiredParamCount}} + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{paramName}}", String.valueOf({{paramName}})) + {{/queryParams}} + + {{#headerParams}}headerParams.put("{{paramName}}", {{paramName}}) + {{/headerParams}} + + invokeApi(onSuccess, onFailure, basePath, versionPath, resourcePath, queryParams, headerParams, + "{{httpMethod}}", "{{returnContainer}}", + {{#returnBaseType}}{{{returnBaseType}}}.class {{/returnBaseType}}{{^returnBaseType}}null {{/returnBaseType}}) + + } + {{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache b/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache new file mode 100644 index 00000000000..d98f375c61d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/build.gradle.mustache @@ -0,0 +1,32 @@ +apply plugin: 'groovy' +apply plugin: 'idea' +def artifactory = 'buildserver.supportspace.com' +group = 'com.supportspace' +archivesBaseName = 'swagger-gen-groovy' +version = '0.1' + +buildscript { + repositories { + maven { url 'http://repo.jfrog.org/artifactory/gradle-plugins' } + } + dependencies { + classpath(group: 'org.jfrog.buildinfo', name: 'build-info-extractor-gradle', version: '2.0.16') + } +} + +repositories { + mavenCentral() + mavenLocal() + mavenCentral(artifactUrls: ['http://maven.springframework.org/milestone']) + maven { url "http://$artifactory:8080/artifactory/repo" } +} + +dependencies { + groovy "org.codehaus.groovy:groovy-all:2.0.5" + compile 'org.codehaus.groovy.modules.http-builder:http-builder:0.6' + + +} + +task wrapper(type: Wrapper) { gradleVersion = '1.6' } + diff --git a/modules/swagger-codegen/src/main/resources/Groovy/model.mustache b/modules/swagger-codegen/src/main/resources/Groovy/model.mustache new file mode 100644 index 00000000000..bc3ca28aaec --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Groovy/model.mustache @@ -0,0 +1,21 @@ +package {{package}}; + +import groovy.transform.Canonical +{{#imports}}import {{import}}; +{{/imports}} +{{#models}} +{{#model}} +@Canonical +class {{classname}} { + {{#vars}} + + {{#description}}/* {{{description}}} */ + {{/description}} + {{{datatype}}} {{name}} = {{{defaultValue}}} + {{/vars}} + + +} + +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache b/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache new file mode 100644 index 00000000000..29d5f55ecee --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/JsonUtil.mustache @@ -0,0 +1,23 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.core.JsonGenerator.Feature; + +import com.fasterxml.jackson.datatype.joda.*; + +public class JsonUtil { + public static ObjectMapper mapper; + + static { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.registerModule(new JodaModule()); + } + + public static ObjectMapper getJsonMapper() { + return mapper; + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/api.mustache b/modules/swagger-codegen/src/main/resources/Java/api.mustache new file mode 100644 index 00000000000..c0a697e40b4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/api.mustache @@ -0,0 +1,109 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiInvoker; + +import {{modelPackage}}.*; + +import java.util.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.MediaType; + +import java.io.File; +import java.util.Map; +import java.util.HashMap; + +{{#operations}} +public class {{classname}} { + String basePath = "{{basePath}}"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + {{#operation}} + {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} + {{/responseModel}}{{^responseModel}} + {{/responseModel}} + {{/errorList}} + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + // create path and map variables + String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}} + .replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{baseName}}", String.valueOf({{paramName}})); + {{/queryParams}} + {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); + {{/headerParams}} + String[] contentTypes = { + {{#consumes}}"{{mediaType}}"{{#hasMore}},{{/hasMore}}{{/consumes}} + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + {{#formParams}}{{#notFile}} + hasFields = true; + mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); + {{/notFile}}{{#isFile}} + hasFields = true; + mp.field("{{baseName}}", {{paramName}}, MediaType.MULTIPART_FORM_DATA_TYPE); + {{/isFile}}{{/formParams}} + if(hasFields) + postBody = mp; + } + else { + {{#formParams}}{{#notFile}}formParams.put("{{baseName}}", {{paramName}});{{/notFile}} + {{/formParams}} + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return {{#returnType}} null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/Java/apiException.mustache b/modules/swagger-codegen/src/main/resources/Java/apiException.mustache new file mode 100644 index 00000000000..a6bcba75b7c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/apiException.mustache @@ -0,0 +1,29 @@ +package {{invokerPackage}}; + +public class ApiException extends Exception { + int code = 0; + String message = null; + + public ApiException() {} + + public ApiException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache new file mode 100644 index 00000000000..881cab13e12 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/apiInvoker.mustache @@ -0,0 +1,187 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.client.WebResource.Builder; +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.Response.Status.Family; +import javax.ws.rs.core.MediaType; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import java.net.URLEncoder; +import java.io.UnsupportedEncodingException; + +public class ApiInvoker { + private static ApiInvoker INSTANCE = new ApiInvoker(); + private Map hostMap = new HashMap(); + private Map defaultHeaderMap = new HashMap(); + private boolean isDebug = false; + + public void enableDebug() { + isDebug = true; + } + + public static ApiInvoker getInstance() { + return INSTANCE; + } + + public void addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + } + + public String escapeString(String str) { + try{ + return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); + } + catch(UnsupportedEncodingException e) { + return str; + } + } + + public static Object deserialize(String json, String containerType, Class cls) throws ApiException { + try{ + if("List".equals(containerType)) { + JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); + List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); + return response; + } + else if(String.class.equals(cls)) { + if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) + return json.substring(1, json.length() - 2); + else + return json; + } + else { + return JsonUtil.getJsonMapper().readValue(json, cls); + } + } + catch (IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + public static String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return JsonUtil.getJsonMapper().writeValueAsString(obj); + else + return null; + } + catch (Exception e) { + throw new ApiException(500, e.getMessage()); + } + } + + public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, Map formParams, String contentType) throws ApiException { + Client client = getClient(host); + + StringBuilder b = new StringBuilder(); + + for(String key : queryParams.keySet()) { + String value = queryParams.get(key); + if (value != null){ + if(b.toString().length() == 0) + b.append("?"); + else + b.append("&"); + b.append(escapeString(key)).append("=").append(escapeString(value)); + } + } + String querystring = b.toString(); + + Builder builder = client.resource(host + path + querystring).accept("application/json"); + for(String key : headerParams.keySet()) { + builder.header(key, headerParams.get(key)); + } + + for(String key : defaultHeaderMap.keySet()) { + if(!headerParams.containsKey(key)) { + builder.header(key, defaultHeaderMap.get(key)); + } + } + ClientResponse response = null; + + if("GET".equals(method)) { + response = (ClientResponse) builder.get(ClientResponse.class); + } + else if ("POST".equals(method)) { + if(body == null) + response = builder.post(ClientResponse.class, null); + else if(body instanceof FormDataMultiPart) { + response = builder.type(contentType).post(ClientResponse.class, body); + } + else + response = builder.type(contentType).post(ClientResponse.class, serialize(body)); + } + else if ("PUT".equals(method)) { + if(body == null) + response = builder.put(ClientResponse.class, serialize(body)); + else { + if("application/x-www-form-urlencoded".equals(contentType)) { + StringBuilder formParamBuilder = new StringBuilder(); + + // encode the form params + for(String key : formParams.keySet()) { + String value = formParams.get(key); + if(value != null && !"".equals(value.trim())) { + if(formParamBuilder.length() > 0) { + formParamBuilder.append("&"); + } + try { + formParamBuilder.append(URLEncoder.encode(key, "utf8")).append("=").append(URLEncoder.encode(value, "utf8")); + } + catch (Exception e) { + // move on to next + } + } + } + response = builder.type(contentType).put(ClientResponse.class, formParamBuilder.toString()); + } + else + response = builder.type(contentType).put(ClientResponse.class, serialize(body)); + } + } + else if ("DELETE".equals(method)) { + if(body == null) + response = builder.delete(ClientResponse.class, serialize(body)); + else + response = builder.type(contentType).delete(ClientResponse.class, serialize(body)); + } + else { + throw new ApiException(500, "unknown method type " + method); + } + if(response.getClientResponseStatus() == ClientResponse.Status.NO_CONTENT) { + return null; + } + else if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { + return (String) response.getEntity(String.class); + } + else { + throw new ApiException( + response.getClientResponseStatus().getStatusCode(), + response.getEntity(String.class)); + } + } + + private Client getClient(String host) { + if(!hostMap.containsKey(host)) { + Client client = Client.create(); + if(isDebug) + client.addFilter(new LoggingFilter()); + hostMap.put(host, client); + } + return hostMap.get(host); + } +} diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache new file mode 100644 index 00000000000..60aa5d72a35 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -0,0 +1,49 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} + + //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + {{/min}}{{/allowableValues}}{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + @JsonProperty("{{name}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/pom.mustache b/modules/swagger-codegen/src/main/resources/Java/pom.mustache new file mode 100644 index 00000000000..73d62103e22 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/pom.mustache @@ -0,0 +1,168 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:wordnik/swagger-mustache.git + scm:git:git@github.com:wordnik/swagger-codegen.git + https://github.com/wordnik/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + com.wordnik + swagger-annotations + ${swagger-annotations-version} + + + com.sun.jersey + jersey-client + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + + + com.fasterxml.jackson.datatype + jackson-datatype-joda + 2.1.5 + + + joda-time + joda-time + ${jodatime-version} + + + + + junit + junit + ${junit-version} + test + + + + 1.5.0-M1 + 1.7 + 2.1.4 + 2.3 + 4.8.1 + 1.0.0 + 4.8.1 + + diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache new file mode 100644 index 00000000000..ffab3b1088e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache @@ -0,0 +1,9 @@ +package {{apiPackage}}; + +public class ApiException extends Exception{ + private int code; + public ApiException (int code, String msg) { + super(msg); + this.code = code; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache new file mode 100644 index 00000000000..68675432c64 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache @@ -0,0 +1,26 @@ +package {{apiPackage}}; + +import java.io.IOException; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; + +public class ApiOriginFilter implements javax.servlet.Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache new file mode 100644 index 00000000000..94711b26efb --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache @@ -0,0 +1,68 @@ +package {{apiPackage}}; + +import javax.xml.bind.annotation.XmlTransient; + +@javax.xml.bind.annotation.XmlRootElement +public class ApiResponseMessage { + public static final int ERROR = 1; + public static final int WARNING = 2; + public static final int INFO = 3; + public static final int OK = 4; + public static final int TOO_BUSY = 5; + + int code; + String type; + String message; + + public ApiResponseMessage(){} + + public ApiResponseMessage(int code, String message){ + this.code = code; + switch(code){ + case ERROR: + setType("error"); + break; + case WARNING: + setType("warning"); + break; + case INFO: + setType("info"); + break; + case OK: + setType("ok"); + break; + case TOO_BUSY: + setType("too busy"); + break; + default: + setType("unknown"); + break; + } + this.message = message; + } + + @XmlTransient + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache new file mode 100644 index 00000000000..8ab2c99e4f8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache @@ -0,0 +1,9 @@ +package {{apiPackage}}; + +public class NotFoundException extends ApiException { + private int code; + public NotFoundException (int code, String msg) { + super(code, msg); + this.code = code; + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache new file mode 100644 index 00000000000..f8a560b776f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a swagger-enabled scalatra server. + +This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache new file mode 100644 index 00000000000..fe287c9ddfe --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache @@ -0,0 +1,40 @@ +package {{package}}; + +import {{modelPackage}}.*; + +import com.wordnik.swagger.annotations.*; +import com.sun.jersey.multipart.FormDataParam; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.List; +import {{package}}.NotFoundException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.*; + +@Path("/{{baseName}}") +@Api(value = "/{{baseName}}", description = "the {{baseName}} API") +{{#operations}} +public class {{classname}} { + {{#operation}} + @{{httpMethod}} + {{#subresourceOperation}}@Path("{{path}}"){{/subresourceOperation}} + {{#hasConsumes}}@Consumes({ {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} }){{/hasConsumes}} + {{#hasProduces}}@Produces({ {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }){{/hasProduces}} + @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}) + @ApiResponses(value = { {{#responses}} + @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}}, + {{/hasMore}}{{/responses}} }) + + public Response {{nickname}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + {{/hasMore}}{{/allParams}}) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache new file mode 100644 index 00000000000..86546afb9ca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache @@ -0,0 +1 @@ +{{#isBodyParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) {{{dataType}}} {{paramName}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache new file mode 100644 index 00000000000..46076485aa9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache @@ -0,0 +1 @@ +{{#isFormParam}}{{#notFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/notFile}}{{#isFile}}@ApiParam(value = "{{{description}}}"{{#required}}, required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@FormDataParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache new file mode 100644 index 00000000000..0f88692ad1d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache @@ -0,0 +1 @@ +{{#isHeaderParam}}@ApiParam(value = "{{{description}}}" {{#required}},required=true{{/required}} {{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}})@HeaderParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache new file mode 100644 index 00000000000..f6cb2b01cdf --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache @@ -0,0 +1,47 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#isEnum}} + + public enum {{datatype}} { {{#_enum}}{{.}}{{^-last}}, {{/-last}}{{/_enum}} }; + {{/isEnum}}{{/vars}} + + {{#vars}} + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache new file mode 100644 index 00000000000..1f1b30887a4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache @@ -0,0 +1 @@ +{{#isPathParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}} {{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @PathParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache new file mode 100644 index 00000000000..e0782610efd --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache @@ -0,0 +1,141 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + src/main/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.mortbay.jetty + jetty-maven-plugin + ${jetty-version} + + + {{^basePath}}/{{/basePath}}{{#basePath}}{{basePath}}{{/basePath}} + + target/${project.artifactId}-${project.version} + ${project.basedir}/conf/jetty/webdefault.xml + 8079 + stopit + + + 8002 + 60000 + 8443 + + + + + + start-jetty + pre-integration-test + + run + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + + + + com.wordnik + swagger-jersey-jaxrs + ${swagger-core-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + com.sun.jersey + jersey-core + ${jersey-version} + + + com.sun.jersey + jersey-json + ${jersey-version} + + + com.sun.jersey + jersey-servlet + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.sun.jersey + jersey-server + ${jersey-version} + + + + org.scalatest + scalatest_2.9.1 + ${scala-test-version} + test + + + junit + junit + ${junit-version} + test + + + javax.servlet + servlet-api + ${servlet-api-version} + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + 1.5.0-SNAPSHOT + 8.1.11.v20130520 + 1.13 + 1.6.3 + 1.6.1 + 4.8.1 + 2.5 + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties new file mode 100644 index 00000000000..a8c2f849be3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.12.0 diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt new file mode 100644 index 00000000000..713b7f3e993 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt @@ -0,0 +1,9 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.8.4") + +libraryDependencies <+= sbtVersion(v => v match { + case "0.11.0" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.0-0.2.8" + case "0.11.1" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.1-0.2.10" + case "0.11.2" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.2-0.2.11" + case "0.11.3" => "com.github.siasia" %% "xsbt-web-plugin" % "0.11.3-0.2.11.1" + case x if (x.startsWith("0.12")) => "com.github.siasia" %% "xsbt-web-plugin" % "0.12.0-0.2.11.1" +}) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache new file mode 100644 index 00000000000..b9e80e5a7e7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache @@ -0,0 +1 @@ +{{#isQueryParam}}@ApiParam(value = "{{{description}}}"{{#required}},required=true{{/required}}{{#allowableValues}}, allowableValues="{{{allowableValues}}}"{{/allowableValues}}{{#defaultValue}}, defaultValue="{{{defaultValue}}}"{{/defaultValue}}) @QueryParam("{{paramName}}") {{{dataType}}} {{paramName}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache new file mode 100644 index 00000000000..b9cd00b71ce --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache @@ -0,0 +1,54 @@ + + + + + jersey + com.sun.jersey.spi.container.servlet.ServletContainer + + com.sun.jersey.config.property.packages + com.wordnik.swagger.jaxrs.json;com.wordnik.swagger.jaxrs.listing;{{apiPackage}} + + + com.sun.jersey.spi.container.ContainerRequestFilters + com.sun.jersey.api.container.filter.PostReplaceFilter + + + com.sun.jersey.api.json.POJOMappingFeature + true + + 1 + + + + DefaultJaxrsConfig + com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig + + api.version + 1.0.0 + + + swagger.api.title + {{{title}}} + + + swagger.api.basepath + http://localhost:8002 + + 2 + + + + jersey + /* + + + ApiOriginFilter + com.wordnik.api.ApiOriginFilter + + + ApiOriginFilter + /* + + diff --git a/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig b/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig new file mode 100644 index 00000000000..3f8102a750d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/META-INF/services/com.wordnik.swagger.codegen.CodegenConfig @@ -0,0 +1,13 @@ +com.wordnik.swagger.codegen.languages.AndroidClientCodegen +com.wordnik.swagger.codegen.languages.JavaClientCodegen +com.wordnik.swagger.codegen.languages.JaxRSServerCodegen +com.wordnik.swagger.codegen.languages.NodeJSServerCodegen +com.wordnik.swagger.codegen.languages.ObjcClientCodegen +com.wordnik.swagger.codegen.languages.ScalatraServerCodegen +com.wordnik.swagger.codegen.languages.ScalaClientCodegen +com.wordnik.swagger.codegen.languages.StaticDocCodegen +com.wordnik.swagger.codegen.languages.StaticHtmlGenerator +com.wordnik.swagger.codegen.languages.SwaggerGenerator +com.wordnik.swagger.codegen.languages.TizenClientCodegen +com.wordnik.swagger.codegen.languages.PhpClientCodegen +com.wordnik.swagger.codegen.languages.PythonClientCodegen \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/api.mustache b/modules/swagger-codegen/src/main/resources/android-java/api.mustache new file mode 100644 index 00000000000..1eab419d31a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/api.mustache @@ -0,0 +1,88 @@ +package {{package}}; + +import {{invokerPackage}}.ApiException; +import {{invokerPackage}}.ApiInvoker; + +import {{modelPackage}}.*; + +import java.util.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.Map; +import java.util.HashMap; +import java.io.File; + +{{#operations}} +public class {{classname}} { + String basePath = "{{basePath}}"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public void addHeader(String key, String value) { + getInvoker().addDefaultHeader(key, value); + } + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + {{#operation}} + {{#errorList}} //error info- code: {{code}} reason: "{{reason}}" model: {{#responseModel}}{{responseModel}} + {{/responseModel}}{{^responseModel}} + {{/responseModel}} + {{/errorList}} + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) throws ApiException { + Object postBody = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + // create path and map variables + String path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{paramName}}" + "\\}", apiInvoker.escapeString({{{paramName}}}.toString())){{/pathParams}}; + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + + {{#queryParams}}if(!"null".equals(String.valueOf({{paramName}}))) + queryParams.put("{{baseName}}", String.valueOf({{paramName}})); + {{/queryParams}} + + {{#headerParams}}headerParams.put("{{baseName}}", {{paramName}}); + {{/headerParams}} + + String contentType = "application/json"; + + try { + String response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, postBody, headerParams, contentType); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, "{{returnContainer}}", {{returnBaseType}}.class){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return {{#returnType}} null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache b/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache new file mode 100644 index 00000000000..a6bcba75b7c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/apiException.mustache @@ -0,0 +1,29 @@ +package {{invokerPackage}}; + +public class ApiException extends Exception { + int code = 0; + String message = null; + + public ApiException() {} + + public ApiException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache new file mode 100644 index 00000000000..425c2e7e004 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/apiInvoker.mustache @@ -0,0 +1,283 @@ +package {{invokerPackage}}; + + +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import org.apache.http.*; +import org.apache.http.client.*; +import org.apache.http.client.methods.*; +import org.apache.http.conn.*; +import org.apache.http.conn.scheme.*; +import org.apache.http.conn.ssl.*; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.*; +import org.apache.http.impl.conn.*; +import org.apache.http.params.*; +import org.apache.http.util.EntityUtils; + +import java.io.File; +import java.net.Socket; +import java.net.UnknownHostException; +import java.net.URLEncoder; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +import java.security.GeneralSecurityException; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.*; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import java.util.Date; +import java.util.Random; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +public class ApiInvoker { + private static ApiInvoker INSTANCE = new ApiInvoker(); + private Map defaultHeaderMap = new HashMap(); + + private HttpClient client = null; + + private boolean ignoreSSLCertificates = false; + + private ClientConnectionManager ignoreSSLConnectionManager; + + public ApiInvoker() { + initConnectionManager(); + } + + public static ApiInvoker getInstance() { + return INSTANCE; + } + + public void ignoreSSLCertificates(boolean ignoreSSLCertificates) { + this.ignoreSSLCertificates = ignoreSSLCertificates; + } + + public void addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + } + + public String escapeString(String str) { + return str; + } + + public static Object deserialize(String json, String containerType, Class cls) throws ApiException { + try{ + if("List".equals(containerType)) { + JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); + List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); + return response; + } + else if(String.class.equals(cls)) { + if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) + return json.substring(1, json.length() - 2); + else + return json; + } + else { + return JsonUtil.getJsonMapper().readValue(json, cls); + } + } + catch (IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + public static String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return JsonUtil.getJsonMapper().writeValueAsString(obj); + else + return null; + } + catch (Exception e) { + throw new ApiException(500, e.getMessage()); + } + } + + public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, String contentType) throws ApiException { + HttpClient client = getClient(host); + + StringBuilder b = new StringBuilder(); + for(String key : queryParams.keySet()) { + String value = queryParams.get(key); + if (value != null){ + if(b.toString().length() == 0) + b.append("?"); + else + b.append("&"); + b.append(escapeString(key)).append("=").append(escapeString(value)); + } + } + String url = host + path + b.toString(); + + HashMap headers = new HashMap(); + + for(String key : headerParams.keySet()) { + headers.put(key, headerParams.get(key)); + } + + for(String key : defaultHeaderMap.keySet()) { + if(!headerParams.containsKey(key)) { + headers.put(key, defaultHeaderMap.get(key)); + } + } + headers.put("Accept", "application/json"); + + HttpResponse response = null; + try{ + if("GET".equals(method)) { + HttpGet get = new HttpGet(url); + get.addHeader("Accept", "application/json"); + for(String key : headers.keySet()) { + get.setHeader(key, headers.get(key)); + } + response = client.execute(get); + } + else if ("POST".equals(method)) { + HttpPost post = new HttpPost(url); + + if (body != null) { + post.setHeader("Content-Type", contentType); + post.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + post.setHeader(key, headers.get(key)); + } + response = client.execute(post); + } + else if ("PUT".equals(method)) { + HttpPut put = new HttpPut(url); + if(body != null) { + put.setHeader("Content-Type", contentType); + put.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + put.setHeader(key, headers.get(key)); + } + response = client.execute(put); + } + else if ("DELETE".equals(method)) { + HttpDelete delete = new HttpDelete(url); + for(String key : headers.keySet()) { + delete.setHeader(key, headers.get(key)); + } + response = client.execute(delete); + } + else if ("PATCH".equals(method)) { + HttpPatch patch = new HttpPatch(url); + + if (body != null) { + patch.setHeader("Content-Type", contentType); + patch.setEntity(new StringEntity(serialize(body), "UTF-8")); + } + for(String key : headers.keySet()) { + patch.setHeader(key, headers.get(key)); + } + response = client.execute(patch); + } + + int code = response.getStatusLine().getStatusCode(); + String responseString = null; + if(code == 204) + responseString = ""; + else if(code >= 200 && code < 300) { + if(response.getEntity() != null) { + HttpEntity resEntity = response.getEntity(); + responseString = EntityUtils.toString(resEntity); + } + } + else { + if(response.getEntity() != null) { + HttpEntity resEntity = response.getEntity(); + responseString = EntityUtils.toString(resEntity); + } + else + responseString = "no data"; + throw new ApiException(code, responseString); + } + return responseString; + } + catch(IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + private HttpClient getClient(String host) { + if (client == null) { + if (ignoreSSLCertificates && ignoreSSLConnectionManager != null) { + // Trust self signed certificates + client = new DefaultHttpClient(ignoreSSLConnectionManager, new BasicHttpParams()); + } else { + client = new DefaultHttpClient(); + } + } + return client; + } + + private void initConnectionManager() { + try { + final SSLContext sslContext = SSLContext.getInstance("SSL"); + + // set up a TrustManager that trusts everything + TrustManager[] trustManagers = new TrustManager[] { + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) {} + public void checkServerTrusted(X509Certificate[] certs, String authType) {} + }}; + + sslContext.init(null, trustManagers, new SecureRandom()); + + SSLSocketFactory sf = new SSLSocketFactory((KeyStore)null) { + private javax.net.ssl.SSLSocketFactory sslFactory = sslContext.getSocketFactory(); + + public Socket createSocket(Socket socket, String host, int port, boolean autoClose) + throws IOException, UnknownHostException { + return sslFactory.createSocket(socket, host, port, autoClose); + } + + public Socket createSocket() throws IOException { + return sslFactory.createSocket(); + } + }; + + sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + Scheme httpsScheme = new Scheme("https", sf, 443); + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(httpsScheme); + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + + ignoreSSLConnectionManager = new SingleClientConnManager(new BasicHttpParams(), schemeRegistry); + } catch (NoSuchAlgorithmException e) { + // This will only be thrown if SSL isn't available for some reason. + } catch (KeyManagementException e) { + // This might be thrown when passing a key into init(), but no key is being passed. + } catch (GeneralSecurityException e) { + // This catches anything else that might go wrong. + // If anything goes wrong we default to the standard connection manager. + } + } +} diff --git a/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache b/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache new file mode 100644 index 00000000000..55cec2f1279 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/httpPatch.mustache @@ -0,0 +1,16 @@ +package {{invokerPackage}}; + +import org.apache.http.client.methods.*; + +public class HttpPatch extends HttpPost { + public static final String METHOD_PATCH = "PATCH"; + + public HttpPatch(final String url) { + super(url); + } + + @Override + public String getMethod() { + return METHOD_PATCH; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache b/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache new file mode 100644 index 00000000000..ef00838c17f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/jsonUtil.mustache @@ -0,0 +1,20 @@ +package {{invokerPackage}}; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.core.JsonGenerator.Feature; + +public class JsonUtil { + public static ObjectMapper mapper; + + static { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + } + + public static ObjectMapper getJsonMapper() { + return mapper; + } +} diff --git a/modules/swagger-codegen/src/main/resources/android-java/model.mustache b/modules/swagger-codegen/src/main/resources/android-java/model.mustache new file mode 100644 index 00000000000..0d60aedd068 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/model.mustache @@ -0,0 +1,47 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +import com.wordnik.swagger.annotations.*; +{{#models}} + +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +@ApiModel(description = "{{{description}}}") +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { {{#vars}} + private {{{datatype}}} {{name}} = {{{defaultValue}}};{{#allowableValues}} + + //{{^min}}public enum {{name}}Enum { {{#values}} {{.}}, {{/values}} }; + {{/min}}{{/allowableValues}}{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + @ApiModelProperty(required = {{required}}, value = "{{{description}}}") + public {{{datatype}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatype}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); + {{/vars}}sb.append("}\n"); + return sb.toString(); + } +} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/android-java/pom.mustache b/modules/swagger-codegen/src/main/resources/android-java/pom.mustache new file mode 100644 index 00000000000..11641082eee --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/android-java/pom.mustache @@ -0,0 +1,162 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + scm:git:git@github.com:wordnik/swagger-mustache.git + scm:git:git@github.com:wordnik/swagger-codegen.git + https://github.com/wordnik/swagger-codegen + + + 2.2.0 + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + + + + com.wordnik + swagger-annotations + ${swagger-annotations-version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-version} + compile + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-version} + compile + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-version} + compile + + + org.apache.httpcomponents + httpclient + ${httpclient-version} + compile + + + + + junit + junit + ${junit-version} + test + + + + + sonatype-snapshots + https://oss.sonatype.org/content/repositories/snapshots + + + + 1.5.0-SNAPSHOT + 2.1.4 + 4.8.1 + 1.0.0 + 4.8.1 + 4.0 + + diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache new file mode 100644 index 00000000000..2a8664450d5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/api.mustache @@ -0,0 +1,59 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import com.wordnik.swagger.client._ +import scala.concurrent.{ Future, Await } +import scala.concurrent.duration._ +import collection.mutable + +{{#operations}} +class {{className}}(client: TransportClient, config: SwaggerConfig) extends ApiClient(client, config) { + + {{#operation}} + + def {{nickname}}({{#allParams}} + {{#optional}} + {{paramName}}: Option[{{dataType}}] = {{#defaultValue}}Some({{defaultValue}}){{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{#hasMore}}, {{/hasMore}} + {{/optional}} + {{^optional}} + {{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}} + {{/optional}}{{/allParams}})(implicit reader: ClientResponseReader[{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]{{#bodyParams}}, writer: RequestWriter[{{dataType}}]{{/bodyParams}}){{#returnType}}: Future[{{returnType}}]{{/returnType}}{{^returnType}}: Future[Unit]{{/returnType}} = { + // create path and map variables + val path = + (addFmt("{{path}}"){{#pathParams}} + replaceAll ("\\{" + "{{baseName}}" + "\\}",{{paramName}}.toString) + {{/pathParams}}) + + // query params + val queryParams = new mutable.HashMap[String, String] + val headerParams = new mutable.HashMap[String, String] + + {{#requiredParamCount}} + // verify required params are set + val paramCount = (Set[Any]({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) - null).size + if (paramCount != {{requiredParamCount}}) sys.error("missing required params") + {{/requiredParamCount}} + + {{#queryParams}} + {{#optional}} + if({{paramName}} != null) {{paramName}}.foreach { v => queryParams += "{{baseName}}" -> v.toString } + {{/optional}} + {{^optional}} + if({{paramName}} != null) queryParams += "{{baseName}}" -> {{paramName}}.toString + {{/optional}} + {{/queryParams}} + + {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}}.toString + {{/headerParams}} + + val resFuture = client.submit("{{httpMethod}}", path, queryParams.toMap, headerParams.toMap, {{#bodyParam}}writer.write({{bodyParam}}){{/bodyParam}}{{^bodyParam}}"{{emptyBodyParam}}"{{/bodyParam}}) + resFuture flatMap { resp => + process(reader.read(resp)) + } + } + + {{/operation}} + +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache new file mode 100644 index 00000000000..d652ab07a94 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/client.mustache @@ -0,0 +1,26 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import com.wordnik.swagger.client._ +import apis._ +import java.io.Closeable + +class {{clientName}}(config: SwaggerConfig) extends Closeable { + val locator = config.locator + val name = config.name + + private[this] val client = transportClient + + protected def transportClient: TransportClient = new RestClient(config) + + {{#apiInfo}} + {{#apis}} + val {{name}} = new {{className}}(client, config) + {{/apis}} + {{/apiInfo}} + + def close() { + client.close() + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache new file mode 100644 index 00000000000..3892f28302e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +import org.joda.time.DateTime + +{{#models}} + +{{#model}} +case class {{classname}} ( + {{#vars}} + + {{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}]{{/isNotRequired}} {{#hasMore}},{{/hasMore}}{{#description}} // {{description}}{{/description}}{{newline}} + {{/vars}} +) +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache b/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache new file mode 100644 index 00000000000..86d4779456a --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/asyncscala/sbt.mustache @@ -0,0 +1,11 @@ +organization := "{{package}}" + +name := "{{projectName}}-client" + +libraryDependencies += "com.wordnik.swagger" %% "swagger-async-httpclient" % "0.3.0-WN5" + +libraryDependencies += "joda-time" % "joda-time" % "2.3" + +libraryDependencies += "org.joda" % "joda-convert" % "1.3.1" + +libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.13" % "provided" diff --git a/modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll b/modules/swagger-codegen/src/main/resources/csharp/Newtonsoft.Json.dll new file mode 100644 index 0000000000000000000000000000000000000000..26fdaffec145b1795af118d07ef764406d78f6f8 GIT binary patch literal 426496 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

BWZ_eV|^M^miQ6%*;qfy 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ΝZNt?r4^ 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 We5D(VilUEh|3}=%-*#gGP_xT_I literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/csharp/api.mustache b/modules/swagger-codegen/src/main/resources/csharp/api.mustache new file mode 100644 index 00000000000..3d556fa72f8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/api.mustache @@ -0,0 +1,101 @@ + using System; + using System.Collections.Generic; + using {{invokerPackage}}; + using {{modelPackage}}; + {{#imports}} + {{/imports}} + + namespace {{package}} { + {{#operations}} + public class {{classname}} { + string basePath; + private readonly ApiInvoker apiInvoker = ApiInvoker.GetInstance(); + + public {{classname}}(String basePath = "{{basePath}}") + { + this.basePath = basePath; + } + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + // Sets the endpoint base url for the services being accessed + public void setBasePath(string basePath) { + this.basePath = basePath; + } + + // Gets the endpoint base url for the services being accessed + public String getBasePath() { + return basePath; + } + + {{#operation}} + + ///

+ /// {{summary}} {{notes}} + /// + {{#allParams}}/// {{description}} + {{#hasMore}} {{/hasMore}}{{/allParams}} + /// + public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} {{nickname}} ({{#allParams}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { + // create path and map variables + var path = "{{path}}".Replace("{format}","json"){{#pathParams}}.Replace("{" + "{{paramName}}" + "}", apiInvoker.escapeString({{{paramName}}}.ToString())){{/pathParams}}; + + // query params + var queryParams = new Dictionary(); + var headerParams = new Dictionary(); + var formParams = new Dictionary(); + + {{#requiredParamCount}} + // verify required params are set + if ({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiException(400, "missing required params"); + } + {{/requiredParamCount}} + + {{#queryParams}}if ({{paramName}} != null){ + string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); + queryParams.Add("{{paramName}}", paramStr); + } + {{/queryParams}} + + {{#headerParams}}headerParams.Add("{{paramName}}", {{paramName}}); + {{/headerParams}} + + {{#formParams}}if ({{paramName}} != null){ + if({{paramName}} is byte[]) { + formParams.Add("{{paramName}}", {{paramName}}); + } else { + string paramStr = ({{paramName}} is DateTime) ? ((DateTime)(object){{paramName}}).ToString("u") : Convert.ToString({{paramName}}); + formParams.Add("{{paramName}}", paramStr); + } + } + {{/formParams}} + + try { + if (typeof({{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}) == typeof(byte[])) { + var response = apiInvoker.invokeBinaryAPI(basePath, path, "GET", queryParams, null, headerParams, formParams); + return {{#returnType}}((object)response) as {{{returnType}}}{{/returnType}}; + } else { + var response = apiInvoker.invokeAPI(basePath, path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams, formParams); + if(response != null){ + return {{#returnType}}({{{returnType}}}) ApiInvoker.deserialize(response, typeof({{{returnType}}})){{/returnType}}; + } + else { + return {{#returnType}}null{{/returnType}}; + } + } + } catch (ApiException ex) { + if(ex.ErrorCode == 404) { + return {{#returnType}}null{{/returnType}}; + } + else { + throw ex; + } + } + } + {{/operation}} + } + {{/operations}} + } \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache b/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache new file mode 100644 index 00000000000..3b371aea9a8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/apiException.mustache @@ -0,0 +1,21 @@ +using System; + +namespace {{invokerPackage}} { + public class ApiException : Exception { + + private int errorCode = 0; + + public ApiException() {} + + public int ErrorCode { + get + { + return errorCode; + } + } + + public ApiException(int errorCode, string message) : base(message) { + this.errorCode = errorCode; + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache new file mode 100644 index 00000000000..f7c76ee2c56 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/apiInvoker.mustache @@ -0,0 +1,207 @@ + using System; + using System.Collections.Generic; + using System.IO; + using System.Linq; + using System.Net; + using System.Text; + using Newtonsoft.Json; + + namespace {{invokerPackage}} { + public class ApiInvoker { + private static readonly ApiInvoker _instance = new ApiInvoker(); + private Dictionary defaultHeaderMap = new Dictionary(); + + public static ApiInvoker GetInstance() { + return _instance; + } + + public void addDefaultHeader(string key, string value) { + defaultHeaderMap.Add(key, value); + } + + public string escapeString(string str) { + return str; + } + + public static object deserialize(string json, Type type) { + try + { + return JsonConvert.DeserializeObject(json, type); + } + catch (IOException e) { + throw new ApiException(500, e.Message); + } + + } + + public static string serialize(object obj) { + try + { + return obj != null ? JsonConvert.SerializeObject(obj) : null; + } + catch (Exception e) { + throw new ApiException(500, e.Message); + } + } + + public string invokeAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) + { + return invokeAPIInternal(host, path, method, false, queryParams, body, headerParams, formParams) as string; + } + + public byte[] invokeBinaryAPI(string host, string path, string method, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) + { + return invokeAPIInternal(host, path, method, true, queryParams, body, headerParams, formParams) as byte[]; + } + + private object invokeAPIInternal(string host, string path, string method, bool binaryResponse, Dictionary queryParams, object body, Dictionary headerParams, Dictionary formParams) { + var b = new StringBuilder(); + + foreach (var queryParamItem in queryParams) + { + var value = queryParamItem.Value; + if (value == null) continue; + b.Append(b.ToString().Length == 0 ? "?" : "&"); + b.Append(escapeString(queryParamItem.Key)).Append("=").Append(escapeString(value)); + } + + var querystring = b.ToString(); + + host = host.EndsWith("/") ? host.Substring(0, host.Length - 1) : host; + + var client = WebRequest.Create(host + path + querystring); + client.Method = method; + + byte[] formData = null; + if (formParams.Count > 0) + { + string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid()); + client.ContentType = "multipart/form-data; boundary=" + formDataBoundary; + formData = GetMultipartFormData(formParams, formDataBoundary); + client.ContentLength = formData.Length; + } + else + { + client.ContentType = "application/json"; + } + + foreach (var headerParamsItem in headerParams) + { + client.Headers.Add(headerParamsItem.Key, headerParamsItem.Value); + } + foreach (var defaultHeaderMapItem in defaultHeaderMap.Where(defaultHeaderMapItem => !headerParams.ContainsKey(defaultHeaderMapItem.Key))) + { + client.Headers.Add(defaultHeaderMapItem.Key, defaultHeaderMapItem.Value); + } + + switch (method) + { + case "GET": + break; + case "POST": + case "PUT": + case "DELETE": + using (Stream requestStream = client.GetRequestStream()) + { + if (formData != null) + { + requestStream.Write(formData, 0, formData.Length); + } + + var swRequestWriter = new StreamWriter(requestStream); + swRequestWriter.Write(serialize(body)); + swRequestWriter.Close(); + } + break; + default: + throw new ApiException(500, "unknown method type " + method); + } + + try + { + var webResponse = (HttpWebResponse)client.GetResponse(); + if (webResponse.StatusCode != HttpStatusCode.OK) + { + webResponse.Close(); + throw new ApiException((int)webResponse.StatusCode, webResponse.StatusDescription); + } + + if (binaryResponse) + { + using (var memoryStream = new MemoryStream()) + { + webResponse.GetResponseStream().CopyTo(memoryStream); + return memoryStream.ToArray(); + } + } + else + { + using (var responseReader = new StreamReader(webResponse.GetResponseStream())) + { + var responseData = responseReader.ReadToEnd(); + return responseData; + } + } + } + catch(WebException ex) + { + var response = ex.Response as HttpWebResponse; + int statusCode = 0; + if (response != null) + { + statusCode = (int)response.StatusCode; + response.Close(); + } + throw new ApiException(statusCode, ex.Message); + } + } + + private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary) + { + Stream formDataStream = new System.IO.MemoryStream(); + bool needsCLRF = false; + + foreach (var param in postParameters) + { + // Thanks to feedback from commenters, add a CRLF to allow multiple parameters to be added. + // Skip it on the first parameter, add it to subsequent parameters. + if (needsCLRF) + formDataStream.Write(Encoding.UTF8.GetBytes("\r\n"), 0, Encoding.UTF8.GetByteCount("\r\n")); + + needsCLRF = true; + + if (param.Value is byte[]) + { + string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n", + boundary, + param.Key, + "application/octet-stream"); + formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); + + // Write the file data directly to the Stream, rather than serializing it to a string. + formDataStream.Write((param.Value as byte[]), 0, (param.Value as byte[]).Length); + } + else + { + string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", + boundary, + param.Key, + param.Value); + formDataStream.Write(Encoding.UTF8.GetBytes(postData), 0, Encoding.UTF8.GetByteCount(postData)); + } + } + + // Add the end of the request. Start with a newline + string footer = "\r\n--" + boundary + "--\r\n"; + formDataStream.Write(Encoding.UTF8.GetBytes(footer), 0, Encoding.UTF8.GetByteCount(footer)); + + // Dump the Stream into a byte[] + formDataStream.Position = 0; + byte[] formData = new byte[formDataStream.Length]; + formDataStream.Read(formData, 0, formData.Length); + formDataStream.Close(); + + return formData; + } + } + } diff --git a/modules/swagger-codegen/src/main/resources/csharp/compile.mustache b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache new file mode 100644 index 00000000000..be16fb1636e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/compile.mustache @@ -0,0 +1,2 @@ +SET CSCPATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319 +%CSCPATH%\csc /reference:bin/Newtonsoft.Json.dll /target:library /out:bin/{{invokerPackage}}.dll /recurse:src\*.cs /doc:bin/{{invokerPackage}}.xml \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/csharp/model.mustache b/modules/swagger-codegen/src/main/resources/csharp/model.mustache new file mode 100644 index 00000000000..d9ef4ffbedd --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/csharp/model.mustache @@ -0,0 +1,30 @@ +using System; +using System.Text; +using System.Collections; +using System.Collections.Generic; + +{{#models}} +{{#model}} +namespace {{package}} { + public class {{classname}} { + {{#vars}} + + {{#description}}/* {{{description}}} */ + {{/description}} + public {{{datatype}}} {{name}} { get; set; } + + {{/vars}} + + public override string ToString() { + var sb = new StringBuilder(); + sb.Append("class {{classname}} {\n"); + {{#vars}} + sb.Append(" {{name}}: ").Append({{name}}).Append("\n"); + {{/vars}} + sb.Append("}\n"); + return sb.ToString(); + } + } + {{/model}} + {{/models}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc b/modules/swagger-codegen/src/main/resources/flash/ASAXB-0.1.1.swc new file mode 100644 index 0000000000000000000000000000000000000000..c93590267846ce45564dfeff8275a0030e39b2fc GIT binary patch literal 46948 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 + + + + + + AirExecutorApp + + + AirExecutorApp + + + AirExecutorApp + + + v1 + + + + + + + + + + + + + + + AirExecutorApp.swf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as b/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as new file mode 100644 index 00000000000..313da09ea78 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiClientEvent.as @@ -0,0 +1,36 @@ +package com.wordnik.swagger.event { +import com.wordnik.swagger.event.Response; + +import flash.events.Event; + +/** + * Event dispatched by the SDK to communicate success events and failure events. + * 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{ + + /** + * Event type to indicate a unsuccessful invocation + */ + public static const FAILURE_EVENT:String = "unsuccesfulInvocation"; + + /** + * Event type to indicate a successful invocation + */ + public static const SUCCESS_EVENT:String = "successfulInvocation"; + + /** + * The Response object which contains response info + */ + 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/modules/swagger-codegen/src/main/resources/flash/ApiError.as b/modules/swagger-codegen/src/main/resources/flash/ApiError.as new file mode 100644 index 00000000000..13d09415829 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiError.as @@ -0,0 +1,10 @@ +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/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as b/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as new file mode 100644 index 00000000000..abe12178361 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiErrorCodes.as @@ -0,0 +1,34 @@ +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/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as b/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as new file mode 100644 index 00000000000..40ad41af65f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiInvoker.as @@ -0,0 +1,289 @@ +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; + + +public class ApiInvoker extends EventDispatcher +{ + + private var _apiUsageCredentials:ApiUserCredentials; + internal var _apiProxyServerUrl:String = ""; + private var _baseUrl: String = ""; + internal var _useProxyServer: Boolean = true; + private var _proxyHostName:String = ""; + private var _apiPath: String = ""; + private var _proxyPath: String = ""; + + public var _apiEventNotifier:EventDispatcher; + + private static const DELETE_DATA_DUMMY:String = "dummyDataRequiredForDeleteOverride"; + private static const X_HTTP_OVERRIDE_KEY:String = "X-HTTP-Method-Override"; + private static const CONTENT_TYPE_HEADER_KEY:String = "Content-Type"; + + public function ApiInvoker(apiUsageCredentials: ApiUserCredentials, eventNotifier: EventDispatcher, useProxy: Boolean = true) { + _apiUsageCredentials = apiUsageCredentials; + _useProxyServer = useProxy; + if(_apiUsageCredentials.hostName != null){ + _proxyHostName = _apiUsageCredentials.hostName; + } + _apiPath = _apiUsageCredentials.apiPath; + _proxyPath = _apiUsageCredentials.proxyPath; + _apiProxyServerUrl = _apiUsageCredentials.apiProxyServerUrl; + _apiEventNotifier = eventNotifier; + } + + public function invokeAPI(resourceURL: String, method: String, queryParams: Dictionary, postObject: Object, headerParams: Dictionary): AsyncToken { + //make the communication + if(_useProxyServer) { + resourceURL = _apiProxyServerUrl + resourceURL; + } + else{ + resourceURL = "http://"+ _proxyHostName + _apiPath + resourceURL; + } + + var counter: int = 0; + var symbol: String = "&"; + var paramValue: Object; + for (var paramName:String in queryParams) { + paramValue = queryParams[paramName]; + //var key:String = paramName; + // do stuff + symbol = "&"; + if(counter == 0){ + symbol = "?"; + } + resourceURL = resourceURL + symbol + paramName + "=" + paramValue.toString(); + counter++; + + } +// trace(resourceURL); + //create a httpservice and invoke the rest url waiting for response + var requestHeader:Object = new Object(); + if(headerParams != null) { + for(var key: String in headerParams) { + requestHeader[key] = headerParams[key]; + } + } + + resourceURL = ApiUrlHelper.appendTokenInfo(resourceURL, requestHeader, _apiUsageCredentials); + + var bodyData:String = marshal(postObject).toString();//restRequest.postData; + + return doRestCall(resourceURL, onApiRequestResult, onApiRequestFault, method, bodyData, requestHeader, "application/xml"); + + + } + + private function doRestCall( url : String, resultFunction : Function, faultFunction : Function = null, + restMethod : String = "GET", + bodyData : Object = null, headers: Object = null, contentType:String = "application/xml" ) : AsyncToken + { + var httpService : HTTPService = new HTTPService( ); + + if(headers == null){ + headers = new Object(); + } + httpService.method = restMethod; + + if ( restMethod.toUpperCase() != HTTPRequestMessage.GET_METHOD ) + { + //httpService.method = HTTPRequestMessage.POST_METHOD; - not required as we're using the proxy + if( bodyData == null ) + { + bodyData = new Object(); + } + + if(restMethod == HTTPRequestMessage.DELETE_METHOD){ + headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.DELETE_METHOD; + bodyData = DELETE_DATA_DUMMY; + } + else if(restMethod == HTTPRequestMessage.PUT_METHOD){ + headers[X_HTTP_OVERRIDE_KEY]= HTTPRequestMessage.PUT_METHOD; + } + else{ + headers[CONTENT_TYPE_HEADER_KEY]= contentType; + } + } + else + { + //if the request type is GET and content type is xml then the Flex HTTPService converts it to a POST ... yeah + contentType = null; + } + + httpService.url = url; + httpService.contentType = contentType; + httpService.resultFormat = "e4x"; + httpService.headers = headers; + httpService.addEventListener( ResultEvent.RESULT, resultFunction ); + if( faultFunction != null ) + { + httpService.addEventListener( FaultEvent.FAULT, faultFunction ); + } + if(_useProxyServer){ + httpService.useProxy = true; + + var channelSet: ChannelSet = new ChannelSet(); + var httpChannel: HTTPChannel = new HTTPChannel(); + httpChannel.uri = ApiUrlHelper.getProxyUrl(_proxyHostName, _proxyPath); + channelSet.addChannel(httpChannel); + httpService.channelSet = channelSet; + } + + return httpService.send( bodyData ); + } + + private function onApiRequestResult(event:ResultEvent):void + { + var completionListener: Function = event.token.completionListener; + var result: Object = event.result; + var resultType: Class = event.token.returnType; + var resultObject:Object; + if(resultType != null) { + var context:ASAXBContext = ASAXBContext.newInstance(resultType); + var unmarshaller:Unmarshaller = context.createUnmarshaller(); + var resultXML: XML = new XML(event.result); + try{ + resultObject = unmarshaller.unmarshal(resultXML); + } + catch(error: TypeError){ + var errorResponse: Response = new Response(false, null, "Could not unmarshall response"); + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var failureEvent: ApiClientEvent = new ApiClientEvent(event.token.completionEventType); + failureEvent.response = errorResponse; + _apiEventNotifier.dispatchEvent(failureEvent); + } + } + + if(resultObject is ListWrapper){ + resultObject = ListWrapper(resultObject).getList(); + } + } + + var response : Response = new Response(true, resultObject); + response.requestId = event.token.requestId; + var successEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.SUCCESS_EVENT; + + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var successEvent: ApiClientEvent = new ApiClientEvent(successEventType); + successEvent.response = response; + _apiEventNotifier.dispatchEvent(successEvent); + } + } + + private function onApiRequestFault(event:FaultEvent):void + { + var completionListener: Function = event.token.completionListener; + if(completionListener != null){ + completionListener.call( null, new Response( false, null, event.fault.faultString) ); + } + + var failureEventType: String = event.token.completionEventType != null ? event.token.completionEventType : ApiClientEvent.FAILURE_EVENT; + + if (_apiEventNotifier != null) { //dispatch event via assigned dispatcher + var failureEvent: ApiClientEvent = new ApiClientEvent(failureEventType); + failureEvent.response = new Response( false, null, event.fault.faultString); + _apiEventNotifier.dispatchEvent(failureEvent); + } + } + + + public function marshal(source:Object):Object { +// trace("marshal got - " + source) + if(source is String) { + return source; + } else if(source is Array && source.length > 0) { + var writer:XMLWriter=new XMLWriter(); + var sourceArray: Array = source as Array; + var arrayEnclosure: String = getArrayEnclosure(sourceArray); + writer.xml.setName(arrayEnclosure); + + for (var i:int = 0; i < sourceArray.length; i++) { + var o: Object = sourceArray[i]; + writer.xml.appendChild(marshal(o)); + } + return writer.xml; + } else + return marshalObject(source); + } + + public function marshalObject(source:Object):XML + { + var writer:XMLWriter=new XMLWriter(); + var objDescriptor:XML=describeType(source); + var property:XML; + var propertyType:String; + var propertyValue:Object; + + var qualifiedClassName:String=objDescriptor.@name; + qualifiedClassName=qualifiedClassName.replace("::","."); + var className: String = qualifiedClassName.substring(qualifiedClassName.lastIndexOf(".") + 1); + className = className().toLowerCase() + className.substring(1); + writer.xml.setName(className); + + for each(property in objDescriptor.elements("variable")){ + propertyValue=source[property.@name]; + if (propertyValue!=null){ + if (ObjectUtil.isSimple(propertyValue)){ + writer.addProperty(property.@name, propertyValue.toString()); + } + else { + writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); + } + } + } + for each(property in objDescriptor.elements("accessor")){ + if (property.@access=="readonly"){ + continue; + } + propertyValue=source[property.@name]; + if (source[property.@name]!=null){ + if (ObjectUtil.isSimple(propertyValue)){ + writer.addProperty(property.@name, propertyValue.toString()); + } + else { + writer.addProperty(property.@name, marshal(propertyValue).toXMLString()); + } + } + } + return writer.xml; + } + + public function escapeString(str: String): String { + return str; + } + + private function getArrayEnclosure(arr: Array) : String { + if(arr != null && arr.length > 0) { + var className: String = flash.utils.getQualifiedClassName(arr[0]) + if(className.indexOf("::") > 0) + className = className.substr(className.indexOf("::") + 2, className.length) + + return className.substring(0, 1).toLowerCase() + className.substring(1, className.length) + "s"; + } else + return ""; + } + + +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as b/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as new file mode 100644 index 00000000000..affa1eb0ff9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiUrlHelper.as @@ -0,0 +1,41 @@ +package com.wordnik.swagger.common { +import com.wordnik.swagger.common.ApiUserCredentials; + +/** + * @private + * Internal class for the Rest client + */ +internal class ApiUrlHelper { + + private static const API_URL_KEY:String = "api_key"; + private static const AUTH_TOKEN_URL_KEY:String = "auth_token"; + + private static const HTTP_URL_PREFIX:String = "http://"; + + 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){ + restUrl += ( "?" + API_URL_KEY + "=" + credentials.apiToken ); + } + else{ + restUrl += ( "&" + API_URL_KEY + "=" + credentials.apiToken ); + } + requestHeader.api_key = credentials.apiToken; + + if(credentials.authToken != null && credentials.authToken != ""){ + restUrl += ( "&" + AUTH_TOKEN_URL_KEY + "=" + credentials.authToken ); + requestHeader.auth_token = credentials.authToken; + } + + return restUrl; + } + + internal static function getProxyUrl(hostName: String, proxyPath: String): String{ + if (hostName(hostName.length - 1) == "/") //remove trailing slash + { + hostName = hostName.substring(0, hostName.length - 1); + } + return HTTP_URL_PREFIX + hostName + proxyPath; + } +} +} diff --git a/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as b/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as new file mode 100644 index 00000000000..a7536c213e2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ApiUserCredentials.as @@ -0,0 +1,63 @@ +package com.wordnik.swagger.common { + +/** + * Api account credentials. + * + */ +public class ApiUserCredentials { + /** + * An apitoken that is passed along with the requests + */ + public var apiToken:String; + /** + * A valid auth_token which could be necessary for certain operations + */ + public var authToken:String; + /** + * The userId which could be required for certain operations + */ + public var userId:Number; + /** + * 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; + + /** + * 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; + } + +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as b/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as new file mode 100644 index 00000000000..1ea2ebead00 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/ListWrapper.as @@ -0,0 +1,9 @@ +package com.wordnik.swagger.common +{ + public interface ListWrapper + { + + function getList(): Array; + + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/Response.as b/modules/swagger-codegen/src/main/resources/flash/Response.as new file mode 100644 index 00000000000..56cceb61959 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/Response.as @@ -0,0 +1,56 @@ +package com.wordnik.swagger.event { + +/** + * Response contains info on the result of an API invocation. + * A completion listener will expect this Response object. + */ +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: "; + + 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){ + errorCode = String(errorCodeArray[0]); + } + 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 toString(): String { + return "Response (requestId:" + requestId + "; isSuccess:" + isSuccess + "; errorMessage:" + errorMessage + "; payload:" + payload + ")"; + } +} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as b/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as new file mode 100644 index 00000000000..a78f3105cb1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/SwaggerApi.as @@ -0,0 +1,75 @@ +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 + { + + 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/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as b/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as new file mode 100644 index 00000000000..067f49e6301 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/XMLWriter.as @@ -0,0 +1,28 @@ +package com.wordnik.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/modules/swagger-codegen/src/main/resources/flash/api.mustache b/modules/swagger-codegen/src/main/resources/flash/api.mustache new file mode 100644 index 00000000000..647ec763a24 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/api.mustache @@ -0,0 +1,73 @@ +package {{package}} { + +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; +{{#imports}}import {{import}}; +{{/imports}} + +import mx.rpc.AsyncToken; +import mx.utils.UIDUtil; +import flash.utils.Dictionary; +import flash.events.EventDispatcher; + +{{#operations}} +public class {{classname}} extends SwaggerApi { + /** + * Constructor for the {{classname}} 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 {{classname}}(apiCredentials: ApiUserCredentials, eventDispatcher: EventDispatcher = null) { + super(apiCredentials, eventDispatcher); + } + +{{#operation}} + public static const event_{{nickname}}: String = "{{nickname}}"; +{{/operation}} + +{{#operation}} + + /* + * Returns {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}} + */ + public function {{nickname}} ({{#allParams}}{{paramName}}: {{{dataType}}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}): String { + // create path and map variables + var path: String = "{{path}}".replace(/{format}/g,"xml"){{#pathParams}}.replace("{" + "{{paramName}}" + "}", getApiInvoker().escapeString({{{paramName}}})){{/pathParams}}; + + // query params + var queryParams: Dictionary = new Dictionary(); + var headerParams: Dictionary = new Dictionary(); + + {{#requiredParamCount}} + // verify required params are set + if({{/requiredParamCount}}{{#requiredParams}} {{paramName}} == null {{#hasMore}}|| {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}) { + throw new ApiError(400, "missing required params"); + } + {{/requiredParamCount}} + + {{#queryParams}}if("null" != String({{paramName}})) + queryParams["{{paramName}}"] = toPathValue({{paramName}}); + {{/queryParams}} + + {{#headerParams}}headerParams["{{paramName}}"] = toPathValue({{paramName}}); + {{/headerParams}} + + var token:AsyncToken = getApiInvoker().invokeAPI(path, "{{httpMethod}}", queryParams, {{#bodyParam}}{{bodyParam}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}, headerParams); + + var requestId: String = getUniqueId(); + + token.requestId = requestId; + token.completionEventType = "{{nickname}}"; + + token.returnType = {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}null {{/returnType}}; + return requestId; + + } + {{/operation}} +} + {{/operations}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/as3corelib.swc b/modules/swagger-codegen/src/main/resources/flash/as3corelib.swc new file mode 100644 index 0000000000000000000000000000000000000000..12dd6b3b0a6c661e6b4a3954856fada65493c2e5 GIT binary patch literal 255357 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 B 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®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 z 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

~0h}jbwSe;hs;-5@3l#Tag}8J4!)GZ< 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

hJ&y@SE++|eXywknW1YNUHNmX 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 literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/build.properties b/modules/swagger-codegen/src/main/resources/flash/build.properties new file mode 100644 index 00000000000..8e77d88c961 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/build.properties @@ -0,0 +1,29 @@ +# Window and document title for the documentation +title=Sample app AS3 SDK API Documentation + +#Path to the source folder where the .as files are located +sourcepath = ./src/main/flex + +# Class-folders you want to search for classes to be included in the docs, seperated by spaces (for example ../com/ ../net/ ) +# to include every .as and .mxml file within your project, just state ../ +domainextensions = ./src/main/flex + +# The Location of deployment library on your Computer (PC/Mac) for compiled SWC file +liboutputfolder = bin +liboutputfile = as3-sample-sdk.swc +libpath = lib + +# The Location of the output folder for your generated documents +docsoutputfolder = asdoc + +# The location of the test sources +testsourcepath = ./src/test/flex + +# Home directory for flex sdk, change this to build for Mac or PC using # as comment +FLEX4_SDK_HOME = /usr/local/flex_sdk_4.1.0/ +#FLEX4_SDK_HOME = /Applications/Adobe Flash Builder 4/sdks/4.1.0/ + +# The location of your asdoc.exe, change this to build for Mac or PC using # as comment +#asdoc.exe = C:/Program Files/Adobe/Flash Builder 4/sdks/3.5.0/bin/asdoc.exe +#asdoc.exe = /Applications/Adobe Flash Builder 4/sdks/3.5.0/bin/asdoc + diff --git a/modules/swagger-codegen/src/main/resources/flash/build.xml b/modules/swagger-codegen/src/main/resources/flash/build.xml new file mode 100644 index 00000000000..6861dd464ec --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/build.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + docs created + + + + + + + + + + + + + + + + + + + + + + + + SWC created + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/facetValue.as b/modules/swagger-codegen/src/main/resources/flash/facetValue.as new file mode 100644 index 00000000000..c6bfa1f27d1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/facetValue.as @@ -0,0 +1,8 @@ +package com.wordnik.client.model { + + public class FacetValue { + public var value: String = null; + public var count: Number = 0; + } + +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-4.1.0_RC2-28-flex_3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..e41bc68abd969ffbbcc736ff8543b6740cb94ee1 GIT binary patch literal 194680 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

h-lptIpe;z<>mXEWr^6cO2Du~P4-yR#jS!6z zjS-C#O%UxQx{>G&L^l!L!s_aw$~ATeIUSNJQP-Z;c1boSSD-GMVna~~YTR3yrfq?B zCbKB0gT_6mw`LXlPg^-kK~N>#!Rp9=qjRn{8R~rrb3p-@B%69)+aWNCt2d$dl~*U* zO)yGYMniQnMOHPxP$xr``osE>94_iIv0~);)9+1bYcFQBZw;t3{c4|PRjrDC8YLTLR^ci#St$uOkyd1TD``pzzHes8 z_z|W*!irfx#!TL4*aFPo!iYOUEWDK&>`AT7CabEp75G2RL{mJ?^!Kn_!R=(#*;8c= zknAk7y^zsJkxU~+viGu7b&e!3q^D-bH;2aw<L4A7STBu<~=HLRTLAnYhG) zWDpj(BYme`+r-t-3?lGdyBW1>$tGKbe;2Lo9byeiA(6{xQk2S7bl)`@yDA=ClcnNU z*T@J3jHgY@%gg6fl$Ms>c69J?#m!SlM2b~z^LO{@J@7Mr<%~o^0j(3Yup2&m~uM>1$lkEi?@toi_~{W;KDR z7VrlGQ8nfd#neb75?AAiC@kj^iKvQGK!abYYECUV0Xd}N$ z1C~MtCR-g=l!0xkX42|{VWVnCZyk8{L=rHqk}FkQtL9oQS}7eW%}why&4nHpOS5j-YPEZ_?h5!-1FJTx zy)IiJxf@Uo#FvH8(#Gs6X16v&Ot;nEmUXvC_H|Nz1-D+_;O__!4H69z4HJzJjS`I! zjT21}?IgO9=oYrpXR}JMmULM5qsO4i{VoS%UW5~st8U>MQ>qd6Q>`IL(OLuowbUW_ zC$C4CPHV$0RtvMOxW%F}J9Dv>XtnNe7mE*IA*Zz!oDFS2(VpR5C@D)>vHvlY)Z- zIcWG47a)((TBbsJ3>_7U2u=fvQ`JzO@pg!S&IaL8(j}Qz1?JiXlRm@HT{R^wVPsEW zM0k!OtdgEXAJrm)2P4?b2-C(wYMSXYMuakqV8{BQ63r_{gjZlC*TP;w07#>b2rBsZ zv{J%?mO|W1SWsPfwXOgrPE-H>lCj46cVQt=kbI`4)T+!Xf6ABf5usB}v>p(6SXue< zlrIqGd5-2q$-3oa^Tmmdzh-I|MY+K261##z71wGx6$eLA+^dnvzaC1F3+NuqZX7Z7 z#uFrLguQ4r^U5gH6O*FN!nkHrX!ep+VKrr!9WEytZKIPSiC}jbZrlhqrZDo2Uf2P> zGl1Pt0PYsa-xc8{NY2Pas28&QBL9}MMO_8q+OEh@8UEhN8WupVFN*i3*WdF`A$Nqd zAffgcsc7d7ob6kM@;tnEcfR;!ifJQ_V?3ub3;=AVE$##wo+9gs)+K9P)JRrRIf8Dd z4UR!qT(xvMU@t`T^P^c08jS3NV~96DJUW$bTbkQ|5e@Qn>=S2kB$>>g%b6@WSd)}R2&*`4=`$8x{4+{ z6~lzK32w5C;=kyg zal|gUOf!p!X1eBOr!XqLt7vj)@;goz<{x8Uu#j0cH=-@%aH(hpt2j0?HZa%4$81j^ z+_3QvT<);W7gig<;=75Olfy*SB5Ycgd%ebVxn`M;EGExoCbPbIp4ygN#JuVC_XsoV zvrCJckUtVov6sW{(H|%PH^f3=znX~p0|-W@2E(BU>^5TwH57&2W;~n-+6!YzjRu1; zHRzAV-LtzQY*k?&nuvx&u34i&jYbkNN73g`4FXFw5|4z`L?{+h!;wf>jraq8H5Lg3 z)I=m21QLY1Xx#588YC+Gj;N7vJm#4@DX39@DC(X)1*wr}G^&P!ekfHq9<&$QBM

c+=2zb8*`tZoifDYR)0wel8Dk`8bzH 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

=VKvD_j_= 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 z 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�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

8a+^k&lv zJI>ziUkcJ1dxiXgPfuNOoUNF|9^Bt<2zB?aN}R9~fR8&ay`}zJI$1k2a?l@x_2u>? z<3;6=T3a%U?z~?|Rx!NShvIWZSrfc&8Ch&qEll`QpK zU8D`UJ~cWK8aqwKW$)0CJ~(>u>ln^}H9YR9t7V#8R z`oZ2TW=hd@*!wd5w173@mhRSp1t&wOc-U0wsXVs@*j?A^GP7P($J(2qo*&;QOkFgp z&*L>J&uZtO{0LwD^0`mxZRkW+;$Gw>u@2Ea literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-cilistener-4.1.0_RC2-28-3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..b69064ac765f0f18a653b41d75eeced098798172 GIT binary patch literal 11827 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 literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc b/modules/swagger-codegen/src/main/resources/flash/flexunit-core-flex-4.0.0.2-sdk3.5.0.12683.swc new file mode 100644 index 0000000000000000000000000000000000000000..a90af750bb5d351e5f4b937975b86b9c0e69dd25 GIT binary patch literal 165338 zcmV)RK(oJ4O9KQH00;mG0CS6xI{*Lx000000000001E&B0BmVua$$0LE^~Kg04_k$ zze8732_%IE0C?Key$N(2$8{*$)m!!K3xL564oDCrND!EP08pd=f*2AYMM@+kN)(3F z0GJ`h0x-}FK#8&)kLX3-lGu)|#Jik0&f=`ri|y=sTb7gm699~;|D5f=ymt~OF9}=c z|0I7){O_&qp6LMw1AqkSJe-3&y;R+*uDW&WR^6pu;>5q?IOo?mu8D9bJNI5@CttG+4Gv$gNH+^ObbN5Z>=KB}(xtZl@s8a?| zvCQTyh+=VhYA#!tP3MmQ*{1nqn=hLaBTxAO58NQ!OEnHttT~8k$JICIY z?pYmEOX=e$)6@Q7yw@KJ1O~Ng;L}I?*R{6(1Um3Ix5vHQ+!gGKo$fmMbSOMAc5x&& zdZqCA<-X_7z7!u_?&nrq3HQH#?7xmp|34q6zw*S@kA3~!C*9u_9^pp$4}IaMu2=;i z3K{+d>0?2T{f++NKYwXI5Xo=Xe~9NexZto=mKU;1{h54fKK)`Y|9t=B`P@=^dMPzE zm*(7DALes&MKU@x`D7uTFHFwQrKa-P++1q%WNvzyb@(J^EG(v`(}l@}^wQ)^_Ih?H zHMf}0LZ`yB++up6kXz1ArzbOW%h`pcN$l7sq1@ov?9^l-KYi4w$YiM^M@<#!OBKe9 z6n&)>L#7n{wO=KWt{?{E1B2d;pJOv6g*4Hq=p%~kbMQovC=n@7so=CYiO2|s zAW=yiUh@iXv03d5y5PCQ@q{1Y2$B^Mh;R~q2$Go~kW)Z~Jlwfg0`KtZzNF}Xnwu5W zj#EgB8DT40OwT-)otc?SUrHC2MpK0nUHWSDTh&Z{&qqxn!M95=?O7z)H9jhkeU&riJz(*)!3 z0ZAf0*~d2#pl7Qw1QaS*EjB_059RBqP;aTj5y9g)kcuKFS~$ED?7YL}bTjB>uz^s; zA`%IZ4YTC(2#gapk_g2i!iz9W1W{NCoWeU^l$zfW)b5qQT_~ViJ+Ly)sRvh9XNlSa z2_UN|)j@(ID*?4XNirlMa6M{3A7DZ&3@}0MN?MXiMhPHznrok>?-*n4Jv!gV8M`#z z(l0Hhp&Ou=Qgi)Fv*}zun=bShmT}gF-t5OlO3$2MFovBY3fcQgfp!`ybAY4%QRAc$A%V^SMGgtd6PzYlcn;G8sz~I9KWZE zmOi+5C)pJvmrhGH$I3l7#pF(!V$#$U+8hv$F!Gj=yg7mLG8L$Rl*@4P(& zkx>c|E;&iyQZUmglA#kR4ajgml4v&)XPE-`rnw}a;R6Ve0tq~8V-)DBMuEVj7Ld{& zPvOX3f^T{`JyRmLy%pV{ryZ(Hdv$kcOGkdR0y(r^VCyPWR=&Pk21iAb?a;~9-Juh` z{K@s7r4vOc@_i->S=f{)`o}M@UxON2xXZiQ)kk&oI3+LSma-WbH;%=8`bIXlT)32b zKD}_XN>2{yx%z9o8-iOlf%>Z?>eI^7)--m^aZWGXTakJRYv39mffd>`4rW%PQ}a^4peF*+ zAQF;BJ=pIveBM6^&MQywRJDmtj-rjn0}O_nAiF>#mhf>ab>s<#0ZI++M8czADp zT?2!S3^o%Ag0R3#Oc0h&=yScO&-G<-SS*Xf!K8xXFxAJxS2t&n{qw1X?BepAwvryd zn9Elz)4W_}H;2ZgxwNCD(x7?e0$iu_SE>=VInz)nQ~&mp4k7Z*2aY)tWtr0X$POw} zx;nJ|Od?jPCLw2bm5|M~m^3%M#;*tB5lgvl!FV77Yc`*(Sb#=lN+c$*S}E_gxV2>) zkeXNo7OQ9rHydwvI$R8TAOSAigz~~o+n{+sKP>OPM7l>+V@SR zS)G*Bj8-{+)%nx(Ir3b3;rh~SaO)mfH@y$+qz|X{hQf?H>io*DGDIjh!>1)?GRuyL z5neNNyCXh1E2Sq(A^pN~dSM#UUR(n5VdL9))Kif?tM_1`G++xxj)LdK?9%LsbS9Ti zGulrVD0Jz?rSzi9Xv^`18&F{0jVVVmfJ#po+fm10o)dGq>F0GZuvBR}#Y!(&N|myi z>f?oud<+K4Nf;>bJDZy+P$1MrD1}XDE+|P$USR2u?W9s0zFkh?_Z6(=&vZg2cBi3# zWT)uO4JN1a`CPuxI-Q%FgB0U9`vRkUnRWjddskQGVMp!G3~i@M*&EQdLk3&!FfJZP z^}zH~K%VDvFiGeQd}>D>yZOhs62=CXhS)Z*cjTqibtPLs3dl~=d96?r73D!jZa;5JejuPlYx+%l_y zO`ADbS_{&-#z+>I3$qeyT#3<=JF^a{0OWCO`vg&?S`uoxZXVp8RGH3)w_jN4Gx%JP z&xOJ}qcS$+E!y{9NN2WDLG8<;+pnOh%_T_K73|uAjWW5%J*E@xxvJ}K2OIq7U?4oX zl%1>O>&x(@&;p%sHh2AcI-kgA(+e|mH%mF{XH#&W)~Y!QO)!^UN;d$1K4+RYG-|e% z8LW~9x?hG58r=3QFtm;*`>N+`9Vrx+=h@8s6mE+{&y2k^on{YQnQWfzLyuoy0ERl_ zySS8FTujfLxQTn|rDRs9eIk{eTh6Dg1^C(v>B92d(%y~J-O#$-g7v!x_9au3ODu~G zCILXn#>f7xyB!|Nc~<=K?bArL9>7;P>hD-0SP4Yfq)nZ2L{Awa9}`;1ma;S7!HKuVk8t8l!Ad^BrL{a zuQ`$jgc(R9z zeo8u936&2}=RqnSqGFJ`!qgq5o;Z~UsW?RCqf~x`dX7`^1eHgr?IiV#QO`J)&rVJYHg);Sz0$r z#coP+v_4B4mZ;c5eK)B1l4Th_=q43krt-UK<9le+`>0qX)b$FX;w?g(-%qG@nYup+ zKYi5tA^3R}{yz-=!&H2gSl&+vb$^`D`sXP91fiBs5-R)%%)(n6g-28m^A z{S>_UEL?sLe!oa8pCG*Dt3;sUH=zQ*202br@wegUQv`5`Ex5H!IK@?zIa?jaNevul zKg@BCUXIwgBgHnMiEC~N6x;gxiNE<+v5)g7IL<%8aZTqr(&Tuect&Wl9dzWmwp<=4xX zKUco|`SRs2lrMj=eECb|%U>>EexrQ(M)~sJl`ns#eEF^N<+sb1zgoWh_44I!lrMj? zeED1D%QwrH|Gs?rAIg{iv3&WT%9sDSeEBI}u~UoP#5h~MmQJoTp!`;h&MFCxk+7Mgli!6v%}mlM;i8ya310t8{z6n zV|IjVBu(!c;hISEsS!>gEq%k>VXKw2K0m_wNSkw*vvZ`q{{$zI4vvrnu?d85q?ug7 zUAsLkxRob5QF+XB7q60DVHUUWh`@_d=p9MDiEm`?ruy7fJ}G2`j5y1~!*Nc1c_k^W zPDo@{R^OeZ3Ci`T?=kev9?1C$SqZ4ONYawAWUQw-Xcc(jf)^jg7at)>IU~bkQIJIG zCkQrcS#HPX>ymelFtBa<6i^VF8ml# zKTVRZj4SERxLH}AgqH^_>Ssu@E>Xt;GWEwu7gv}T-FrFCqJEaFO^KQMTW_nMBdf`V z+ldB}@R1%!G$pfVc=M+I=1r(^A3@m9ze&{pfDNq(f+(GVMBibF`nd1F z>lpbHqW%dTcV9iv_n1r9Bw*R6CH%z{RQ0ZN$k;H{a3OEDq7wD*Sa0->Bsxja@s|1z@cnx;dlUO0t4fkxtN3=Ji!b``sP8aT zRs+?)FjS|we`Tm%;njcDP@UFM75Or%SNP<94b^^z>K2cvY-p%(98i6PM^tCHkMinA z`J`jQ!6AZ=@yYJhL^ovrIKP@{?Bc%un%By4>JReC1FI7Uh@k!u56xv40n1^)@&z5s z7kKrHeDYxL2;@E}^r&CLo74KumobY2IJ#6s0{aG!1lBVx-6a>fZ}4}?C4%q_kMK$1 z4S-LHzXGsb`X;Zw!Q(fqvJV7G{3eeyB)bnF4SkEB5~t)$eX=Lh^D1Igzs*lcYqt}J z_#Q|(B?BSJQ!>z5W5XW-CH)#!#3@2!9)WuN4zG3f??6#k$nWy%@A4&5{e3>!yOunX zIkGy@D?qck1VOU?Bi8fmUq)F$kdARA~<^}aFKG~P)d(Hcs z&~A6&q29RjMEx%;Nnu`azkt>M4!-Qq^ry+303%_ZSO1hx2H=iQ1c-MSvi~`s46^$m z(ioo%v6~Rw{O^!=jk{s`LbKFW`HE@MHbmvgu@H}Z(cvj$?@Ma-R4$ljCiN!%< zyaJ8!U524VE`P&cjp2jYnEJQ;)xPf8KK1YUWGoXqO>#d5OgIu1;+!zR4WfE^h$9Zp zjiiJF>mPY-VErSn{u7Tn;?=}a!1&MD+8%7}LrA(T(H!?L(Ax9lUx0L3(qzLbjQnK7 z8jk-*cxY-bqV0hk9}+aQ9}?78h2-(faetj1+T_FRdNuJV6!8%Oil`GM$@y12oF=Q-U2F3^cKxS?yJVSsT2Ma&$&$mYK}Iqo6T>{_ zRDTSgwj@tvPOKzG$wUh&w#-ZF=ddLuZ2Htm_4Di|IhGkqB%nfH&~8ZvyGBUWt6xSG zrx0=C6u}CpuVWG!lO;|=j;{#rk7Cc=#-5uNS=XsQ4r$W-9KnjKKf!t~F~Rk;E28>U z!F@$fPfF>3(wzQl0$vK3_@@N-5j`n{qYgwK#~!VEti#oxatXV~xO_()Vf$MNU6$6-q2p5TOG?gA&Za2Gi-!d>EI zKUdGg{PGDLK;LBD`ccAt6B<8Fz6J1A!hain1mRZ&^;^PfCR&W#QNIlrPZnF=R(};Q zut_uZ#bICpzb>pL$1~$^cpXr~-w>umY#R4|xcNTe5cHy8tZ z6Vk2WC#wHRxSctfcnapp|BTerfKzNA)awsfy?&5ze<-Mbq|w{gZydVefp+M@JB?Bk zPm>!!q&{F~);maZ-(fU&2eSS!A>R=g4`6KJ8IAO=Xr!miON{jHl1~xtJA(Qr*s^3L zbG%-J+Wo0;O8s+T1s|o3tA8O}?K=SD?=J<7UGVNdMt1Svg=A1?7ks9kv4p=8k^$2r z;2MbSyMXO)1@|Yh=hu*|-qt$)?}QS+fz-)oGS9qwAXV)$?l^2X<5)({=AoGS=K4nSFqY{)!&ZZMFk3o9Ve2jKqUgl>GwbT^3hW zWxtiTIqXgb-8)kD@2gbypRv?X_A?c%L8j-c>bi%tG*9iW3ZEf`*796WFR^P~W7HMU zRN_(rA4+HN+Jm|K&^4nkpU$A}MN>rst*7T^3U&imS1>$ykGkQl%^P%Oa7l|JF5O&A zo758|t?PTWeQ8!fgQvMuZnRL5My+QX^0!3m(48DM~^{PiG$5S`MV zl&v^WgT``dIxE+@uB1BNp3Mszsx0gtl%$@q`NgH1Y#-du3hxY!FHGn1d1%GCn|}1$ zO3(OHx}8kHzlc?v@h|24Y~=YF>H2H*2!l0Q?o+$FBW(c}^G9ZS-k-?H?R18PLF^Lsfp_UNCp=h{XB0k=yNH(9n(XKd}NDFCkwzzzL zWv}m$uh-Y74ETn8Cq>*HmSl?i!=#Q#2PiL5fl}T=d21`NxQWF>DD|Ra0$)%01}gig zEK}J^G6PcOfYzw z!Epx9FnEsa>#`_hk0kn2oJdG#3WPPjZWyhJg}qZSLx~(|dxGt3$z&f+Q4-})=F$y~ zVJ&F=J+vOaZV1gHxsKv7L1CGR$1-{4RJPObA?20O53wiJ*K2 zCQA@N7c?1Jc0YqMa!y~G$r&jlzvdkPIq(IR+;~W_C^e5VEL&A6AVn9nwX;c7MoD!6 zb7+F9Y^>NawuaAwp!y*u1D_`IKTJMDELPdhi309A63)p<0_TEOfjO1uLGY8kxD_YK z4*2MED*+HN>oRq?4af76?1P6-q5#{$J*hsGtY1yklS~8KjRU&rhPRX2+sV6RKLOCq zPpU~R-P-L$Bj2N5g=UpRMUsD=hvc7Pdv~pGLxWC>{-Q7~A&~Eq0QV_q+aN(0;(r8S zSioI8pNPA75eawkqVkUt^+(Bp8`D(%ELlyqW?J8X1&|lyk)Ab_t>3ueZHET^oc8Wj zC`bJ~VQ*f=qTJ`;hS?iX)(>mcFJlB;#Mr^G2K(az7-xdZU%>l+h) z{f5^DZ+?y>J9>{!bPz%P1(LM%J~Cl}%U?qINyZJ+PG;>smfWB0&U6QoU70QhU?I>x zyRT&PK3}mCK#!+>!!oIV+_0iRd!n-Vf4}yR%&p2Oj*pvn4zAT7^~Ib#9qn){1_h%FT)foLt|4 zn#dlB4%AhttfL~e7!1Y3qEA$)G@O3d`UB*klVIk0BPt@#HOw_++iXlc}=PK=2&+i7}rR;nSxy|5c47Sc=0i)XWir8J5^Ox&$TpH3rFg&#?+ zqATtkI~c8)-dWiY-;YtN)1bc4jto-0N@6e;9dNE|HfD5RqBJoW4F(()n8aXsfGy1( ziU)?L106>REYKB7?38zcltu+F6`H8fLWMTUcUU?IEsb^V0`N36o|4VgZ{z2)jE1z+N-Rr;I5%K+zy7sZ~#Cs7LKAfetbQX4ToY8XC=mxV}3L=Xq8A4bItcP_!^ZqrPJ5N z6H5!_MYbGfrc%5Oo%eWVDkarZ(T59Qu^H`=Xe$-lsn|j39;*1MxQ|-)TMiH^MyMr5 z#keI#6z27c%orW|VL`?zE{?C`>h~5sUXep1t?myKyS=%ky#te45Ar>S5A`y5guy-r z`xy){7-TTSV3@%ug9D_o$-M_DKRA<`m%DZZu4hv;YFK z9a%f|jR5P1>JmyCk-=M(^`5x6RD1-MipOxVbXqs%z=sKVcnX(Wh8ahBQ7L64Ts9gH zVc7`lM4F*!EkQ+5It34>aV_cLrtcCj0Z_-!s56>w-AanKx7Bpgp0Ot#8OQD087JCu ztf4VS!XqB&;<^)FsYlJQSx6G4V}LG)=$g6QUD84TwDSNugdEzWEM6rT_uz%A!WxLM zg{yQ*oTcj0Rq6Juq%H#zTJ|m8muyZpWtsvAP~+10jv@5^zog2>^(Zro&cYzjZE8!- z<`w&4LmSgw*_93KqZ<&fcQW5t^u|it%^5r!UT??2{L1cZu2uUS-MKs%`#w9D_Xr!r zn&s^H{339i+=8xbdn#L4PR)%i+{os03piisJEr9bNQ=86#jGp$=%(dD^L>DrW`T7X zhc?aFe=nJa*w(Z57AJL6ik8js`Npf}ICoFg-tu zH^#DtHp!oV0OO4DsiV~kM8{vIP_d=U@0u}fRr1-h#b-GRH$j@2e=N0-x}MJ47#>K1 zO6>WU`lfUFv}^Rq3m3-DUAp$v*oBMZ=g-;n-)rG(0UM$?HJ6(L;TGLkPnKx(1oJ4c zX#y#8f2r5;4Y8IqGA-p6&w{)e0L#F|=M)JthC6>Ta;e`hlV z`*WPsoFQ}vSgrE9gG9*z)-sw~SW0ElaU+wPUM}cOXHS@JY*665c3H7!v;)HG-%TF( z*ge*v`eXUxVjg7O&6z+=o|S(PJPSW!a#OlNt|deR12x#J5DP?vXe{Wfjzoxr23@HB zYQhK{R-a4qHd3Xog|yWBntdHUzi0s=Sk!c0!0notkPkAbj4lz91?7C+PGzUX1EMdn zG!klWLM@lnO8GYGXs6CjYTsw+;wgWKibp74Z#g2ch+Uj#5AZkdUX53^fm#`%W#2&CvuI`KimNiwe2yshx$Na;z^UAmlblaxyh;T^6s(5MQ< z?wTV}TDRU+plfH~EfB;3dhIfoP=ufw6B~{(6i%mi(VS3|R8vbm8 zq43}=t*V!ZJ6ZGTLIHRjkM6ejR_{$3MBkIby`?QR+?%+{Y33>0SyB`poQc$?O{cFl z23d47-ex>ltPYD*(@FU9R1vOlV(;zp;U_Jf8JFuL78{}>-c9+N`t`4r^;ufZwp4AM0 z!yCmlv4tN}hv2r?nh;<;{I+`ZwqZtiJ0miaKXmzeU7U0fZyTAjarTD_2TuEJvagVUmVG3i`m zmy-Gv8YSA%5$$r<_fD%%#2sjUHgGaZaenzs~)nZQ@d!BItz#j{m#RPT=brS@0)OZ|IgrvnP=J^lR1 z!VC-krfqze1{M!Yc4P-uFq`12zn)L07cR}_)2SIql3%)%MWq5JI?LoX?!6CT@NQB$ z==5?ZLj`0HtX$r#@}ToKFI5>zRR-Jr1P^O2+aHa+l%8H*O4p7c_RM{E%Vu4F@1$QD zN=;bEy=dl-5*k6}CDy)H2AOG7g-x9E()eRz7p{$-f9&zIW0%J2v_@fxjpo>3FC`U_ zrgkBW+Qj`gX$3o$*f-VX)AP9->53{}yZ@5PK4n$fNDq{zd2pEmw>^9RqOyz1Zc6JY57K!f8V4)QRAw41xt+=#)Ut=lAcJ>dNH3X%^pcN& zNN%YkRNjLjz36c&KWaISmc+PoZSxdm(ja#h>q&!ae{mmaXznR?b1l8h+Q!z;2SULx zgAoR!48|CYGdRHD5Q9eiSlRO4eTD9=9bV?_NpS%)>@6MEDitjzsG+IAS^-UGQ`W4XJz*U69Mo$N|Z|1j%|2t6xTgK)D>RAe!t<`ZN9j0$dj$#&#yge4A{lr?@nm zDoOqBi@ReMSH@gRCt)ooW6x((^V68tr9Hol;e&Ar%{5k7)Rl9wNuegMy11Kq2K{?< zPXpjPs9x|XX5|8iq{L7zC>+tGP))huEh!h;-ywML6AqFiY9ErM7A6O^3xP`Qf+mCx znY2tsBlTZQ&tmdmS2A@|Z;{WUtmP(OtS z(FWT5MhL+~^l(miuo{aPO*{3;YV`A%X8vvvPBVArz6nQ1iDMqazy>S2=P{GV;QEI{ zEGTQb6p~t>jqB#K1@^{79z)wlYEZyqI+ogW*H#s={=2R#>#L=8uP?7A-JQ8_x+}Lf zBe>XLgzC*GL;^9YzZOD)5K^60acT$QX=)xcy|FlmuIb?$Esd3$9$r+60*E8_O*B1C zM1ko@5_onH9!JZn9;Kw}(HxaTGg(@YEESzBe@d)EmMGV*Bh5oi70qo;nPEq(jrLwqq+@S~9*tWhq(qN1|x%m;O7X`X`hRk~->f_FBC%o9b}{PksK zT(bf8ZCQ^?IgcjXo8yQW0)OYG+1D*|=sgYD^Y=YuD~U}LB!a)jF2N!b8>|>` zS-?5iiI`62w`jq|gXXvBVt$LXnh$_?C7{;hBB0@vZg0jmvQaXUxHh#TNqUtD=KqMQ zXUVU*4dBbJyTneq)b6!jM?xg42?-?R1BM)pNP00{1J{epO2nl`b2yueIP*0HVFUNbrNX=#VnrG4gp8JJ#& zqm_73gN!>TY55xa32t4LbzfmDh>_PRseGEfJG2cn>sXbUC74;xrhMthHpYTo{p()m#@I~xG!yDd4nT7(|Xp4pt3T@A|Q2BIBKSiBA9o!jyQ_XZm{P4XX zFxQJ@$wK`G8tICM>#AVh+CE^@8Tno+TG3QBIq)<0&4H_q*b*;}#R9@WEFgv=!Ehxb z4i1Q+!PtPosl_1fJB8wbn6na91*eV=4my}#*Xi>}oxZ(|dzF1mv)k1I+?w!uG$3HR z4f<+;$z@bhZsD}U@wDx4E8e^WH7{Flz8hb77k_; zWb>Tn%1CU;?Rhtb{}CJ*D_iuWU@nmC7*!kHP!!_DS%6y1W|$cAro~|CA_v@@osq0L z3$jC!1xV2ZDf%=EZw(KJycp9U-N(cw0dSWY0X&Q@a}^rkFBw5 z)I!&x9kz|VdzC$XHDTj#oK~M$UHdwES)z^UAt?EZR`L}r`HDK3M4hpnH^R{*9ZZFM zgUvy@RqBkEV+M1~sF~G_b1maUoK%z~`4Xg9&{8a53IKcf#k<5WEUJrLT;Xjm2R8t{VS->-81*{ANJLMf122MM8M1+Y276&aBoKQNc z)J^#VmTq3sOzS0CLC+dd;w(;%IGjyIH(L_4@$Gv${0#18a36zR3?3vNFDwaML=@Pr zfSVZ!5q9hX&ofnm!1f3{Y*8RpOb5XK`hd$E)24%CXqA6VJ&tq2qboQi46m%s^6KbH zQb-86wRKXn)R$yW$r)Z(72w=}bH_z^F@fmZ+=O}txthPO7kJ>=)m{(NA3Ubb7dE&& zx7yplo}FK1?l5-JuUYSM|DbhFY@9=_(p z<=I@SudmNPl};}J1A1N$YYEBxsfFAUFj)VzjtCyi_{aUJIW(-e>7U6$(%BT+Hr~f4 zl=aG3rcq~2pUsAFJ{dR}G7OTk=UwQ~?-KrF#hZ>0u+AA6;G#DKy zt8&BP_@H4ovb9wf2=If0B8cd*?b}{>H&(8s6b?q>GE)lkzBZp9n2uZLtb#%X3vyNv z*#$QhJWK)HjHZ}kJC!=Au-DQ_q|$DSB-@a!N*r~uEf(3!*EQ7p7;Iv&g~1L6_b|8* z*sq1>SmY4JY9*Y7?X*~tx$-u4lnlBy!jH(9tAj<_l&bBx90xY}D6-UHW5;C>o}Sh= zRZgoD$mw45`hf49xk|c$>7La!Q@{-|ZvMHX*lSIQzzLr?rAHmH0fNgbfnKNjv}VI- zY^5AZy3hqNfB?5r93{5+ch)Lw5e0~R7F#|wSB*1jMmh#{plT9p;&jE-cT@70y4ulEUer5txo|L_;Dp4 z1vZrwn)2*`NJaoqTt549T01jSSxCRAxyQ2AU*YmD6JdodTZKhgc9%=qe7Kp7%3LL! zTFZ28iP%46t@D@uwB-IFzpS|?vE%BAwV|BCKn3|sPYw12Id{8>*9kuB?J0K<=B}2g zbni35gkeJknc5B60ZK9J(9xB&S+JH+-4E4}V zl@=EYTeekyjNFN(E`D*N%2N#y{w9i+A%YHOzAVGQpe^ivUcHK{mg86tSPr8q`q zJGGBn>^$>b5jos2brsPehP2CvZZ(tkJ$=PqZtnmSsFX+eV~-vmW^jbTQ3g*km|*Y} zgQppsAl(Nn4ziC>fr(I@X6i<|Fr+yz4s%wJuJ)tAB~lc)PzbYdY*$kv-E3D=u5d1w zB>5?jbWUl@*i*QS1t9YPsBj9NgYtUj$BA>>q_O=~u1Vn$53 zxP+TvdUcXn9$^_mhMmKMHfpaXyh4wfbboyPaY0v;4gN#}9ttI>*WB~^Yht{94w18i zqZ*;IsbmAY*3(b9kLl@oBmE3iNzY-fS`$e$^Y|HR8c<+Jb{)m_Q$iqhy{Jxk>o)%)(a#L zWDYREHUhd!67Tz!?Zz%!7k|YNYQx<80}NcYu29_nWG5fYZ5_00UDo~`=NK{q2vx=v zs*E`#Wfx}BFD*RG>Wr`uuDOR%q-M{~N`2uWmp8Js{P0Q~nVTCm4%9#q=%Mr{I=^aP z%EXiW!z@#a_NB`rFFeeW$8o%%Jj*T~O3?*#(S?Um;==O$sOey%(>pJ-`s3h^5tX8# z)f5}&A7EI*jVzoQ1qQ=$M+Hp?(NM%@YB(Vli8~6FDdI7kiA4yZ*nqV>iiAig;Hcmr z0?3`74I^9#4}`2HW*QufI4j465Qz=$JZ2j|I3W2XA5j{80T9YOD2n0{Iu6QvSX}lF zD)_0emkM1}=%&I!DjcFhFBSTz7_YQ=8!upOY(^iuXlT6^!SNL?;Si)?7cx@niTC&zJF znp@Z^6zlQ>4Qp7N_r(V-5(XNl7)T7(vksq2z>r`Lc#J#uqSd1CRJKuSr;3v*ZmM{w z;-z9873(X58#nO2rp9J8mXrw5LyPgH&|)@wX`kKhzORf=~?t}Vzx7EoggPg zO<~Aliowz@fM$pRG(HKS6-hvI>t{;|lNqA%H_MmIFm7z;*rAbWv)zS-si1FGNe$zl}6QX>HSrNr~a@AYFG~d5lT5Q2qP1ftBjjs7c`09?YpGr8d zYu!6EN{gUnKUEaXpG36C1l3Xey5onW>PLtYeiL^R&2Hc1PSR<(lW3vXKQC^5z{onD zWYFN=!?n&tSfApUs@jKNgm+XG)2JNXNybf{ub;TqQ+Ty;TXQU4e;{XKY@`?6Sae`O z3=W2)2AdE=p(vW`#|JPhTd;AH{N>G|Ecz{bh+J{T1)gugSwv6KW@l<;ZN6f#g~2uk+ZpU&uoLDg3s0<~ej)`Y;fWMz z%qf%(u8>c#Qyg)x)6TTYa<$_r(4IcJ{&o8j zwC?YM*Jp8C&c>ZZ>;AJieLkjHgPzlljyS(A3Qp3A{#3|q^eDTZQ9q8bP*MjjBmq7e-4jBd?t zm>jHzD%wT`Clx(ZY{b*Tgf{eiG!{ZI@@P@!1PdC5QA$;I%T?j*iZpBueab zFL@Lt9Lk&=`&6cTT6Q=OK zx;c&6yP;t^pH3~MaUL=~tq5`}Yb|XWIW_r+a+^9NlTV znUGhTj2o(^?5jt5TnshL=1-qqn6Up zu%1jW=F`(?&gp-$koJT0?bpYaA377{@}-;p>;lN&sTnaGkH*AEWH2a(Lm&?rttQ5T z15q&&h!4_hTGx~g%@xBzEHXF{6T^XMz{3;*3am+;KDScu+v_`^3^XdzG37XO%zad_ zf>2Ivc8AmDCPI*fbz-63w4E5)g>l{lAKLhfEmUYV?A!KW+-0$glKs@eBD{%5sMt^W z5Vb_8HBN1V)H+11kF*lYFrnfI+O}CwQYAs1r>HGRofDLQ46WwGr>OX}Ubdv*1zHq2-tz&%D-A_E&kN3uqSy$(?tMkk&w0B!Qt$08_HYUa z5=sDaG=_^ovd6|3qnr~l*iPRXBs_PfI1cb!@hr!kXUi4uVfeXq2Nwc8qXN zLJytbK&Co8!dZBWwQGcP5Sw;{s=arFa}meh5zb1SM}|R8A}$X*$jJ>N+7l8;Xx&f9 zA|VH!pc3H^J|Ti|Xve73BJpSn8;{q#?!s8nxH0uDqHQ94i>TiwNwPXY*k%^)Oznl& zzelv4sox{&?-SJFB<1c28InnSLS+7Cyda1NA>}I3oRL=v9;~`X)HSklf-CZO)Z1ij zHAU682*#)uF&y>)r2k93;J+kj%ZIRu|8GS7Z-kx2x|Xo=co^${*CT}4$?b%LXb#3& zd4H|v|7*zUCx1=U@0OA#U279AqNSIOZMi34fq4N9{m`RWi#jK0A^CbRB;Qrf>a0h- zoUH3ToTwu`>eJ9jijg-7d9Ui{$XbktQ}A#)*^p^~hgLxkzrhUfg3JKVx3W6nLw9W( zyptB;<$F4By?vKNx%b>9G4cvg-@BS=Vxj+jAlaO0UQM)+)9Ndvi@SBl9e{%FlB4`B zqTV8_nbx&T8*0d2z4f;G0kU#C(N0*@aP@4PyGlvaGEK@ zCCSx03MGG>U+ski3KAWLhc6qZlw;&&-FR}4ds%&Vnj|~1w!`S*@-Z@OpXlU^ zo%6i<36k84=8}oM(6anKj_>4}IUo)ve*FX_{v7L*aqe>fazKs0MEyKj#R|XS#khfA zAjvLv060L$zx!$eqkex8-Zf?#wRc|vr0n)pM63QdS%Esb5F>iPf1P1G%YB`wKSz@L zp-J~+le&#_wA73csmh&*{ z=-ceZ_)csq$M>9Xof0l*$-k4g% z)Y?Ys#4ePjAE#Si+9^#ihiHcX)cxXTuG)pA@%zQY!v5lu-mNg1Z}x1F*iu4UQ*e3E z^fkGWz9!evmwuK*EUuKOBN&gzt>yj`g9DKO)!Q4Ah5~jo4oDseX)0M450fmjO;U`Y z9&RQ#G*O|2@}-RlJS1Ey3NTOcq7{A#;qA;8$$@bIo!SP4hxgXkH89x7U^9cQ47L-C zwn4!{a%gAnP!`rzK~;{nL1Ec^gJNIOiW?LbJyPi3cr?ZUt=zw^l?`R@d=8p1r%}OU z+I2~ta-$D2_N~ikDDm`+L*|TM+`WD``d1?WL!Ad*kH^eu213&2Ein0i}owk% z+uFMknFpGoGT-PuH%J+WV%!ej+t-#cS@A2hwX?f?sl8(w6Z3=matafHZNOQlf3rF3 z*gb!>8H=_2K;OhVac>P^Mp|0S$(rLH`)uvi1@?e0<+NR;rQFl=bH{dA;!E>$8nOZw zE*|E_}cpCQT>5+4%#u_&%a>LOBLp%H^({;zSU?da{$0NZ= zpbEcB>=1Jm6wLI7?K3L5IW6){-Q)Teh4w-0TRhs>cye(DAbYYKWf#&*P1nK$(SdFK5Rp-!BTNVB57| zFgy?mMPq@%4MX(gz2G+^z)Idf5~!wfBD*kyr_VVTE2yoeJpEARs>!Y8s>w<@M-TcD ziq%!&_##kESPX@uaWOO)2#b+$G$@7x1Gs@0j)|dAAZ9J|Lops6jEbRnD9}(W$r-;i(EcS5k?LFjtGKf=eEsesZ-sN|%Qi`u;y=uc?GkgZZPwYO4!5Bf1komARO z?Om4rkn#ZKd#H4XN{6X*gi0Yxm{=n4JW8b)mEu$yppHQ*9iz%|>U@;CMyNDOg_Beo zqvRCsUb@au=`1DZsPs4`7b$s)O3zVgmP*f4X`V_?P-&6!1?pI`6!6W5cPpGY}SkK#S?tR7jc4GH-7x#0%UXJYPc%<0JaS4v=JPmi9j}^zc!{_1Z z@CCfOgjY}E)n&YT8m@4|@fp&0nM9%%fwMGj_^5!8aV(N{n-rzLes+oZ&E z;%~4GzqOR0zKE7hYb^fZP5mT1N$!EXw+K7M{thCzMG(XLiTXipr!XTRl2_Tbq=4?r z7a+r@^=-vZ6O1y5uz~*!W)wb4)X$J4U7Mh!NZ-a&DwK?}b{k6nEJ<2c6Bek`w5WcL zOo_Ky%&aev+bl4QUX`C@RiStAtd5^VyyR;{{b_~;t3vOnKg+5j8CB7?X6w0c5j=?x zVF&+h%qaW@+pM*(P1s4%{zWUY6uJeOK3C zwBKR-k^8ydL)7H=u^9dji24Vli<=e^<*jMSeSqUEQ__^!aqDgMe<8Osp4Iw#j#K|v zR_1M}xc!d$hlB;m`2!M?M9&|6?|X`*i0T^q8j7yT2cXP9V_$QS`*WiHIZ4(rzvp^x zqK*{n-ctX9tR@=pC_n{2{;O!@^H(f=ANN;Kt$u>LyaE2Z0E5Ec67{d4iiJDsck$6WKT6Fhe?8pB>))4oUm}n%Krq?0W-;vwpC(W<33{&EpkYh^37nv5eX?m9=TQjX) zZ0kY&KgiYAwb@qn|0Gx2ZqK%<|4fqY$&TKm6CEVc4h{N$;a-A8CX##w>iREGS2cK* zPx`wj{A89_V^zd ziTzTKTI8VwD}fTMP{PPcU?qbAD{V56Q%HM)TdgB^$pjgJcf|vD)>fMvIBsP%)xDBD zm^rx8>s(t+^oUqt^o=rbjU%o@xD#yP8rN`*Bd&3HXU26%$Mu96m(#%Y1mfz&9a{s} z6B@235Z4p%&Wx*9#}zl@avQjwL0m@wm&d^MjE3tO#PtlkGvhj<Ezn+rT@E^yr$B=4$b6JX9fWX{~b zqtrtve8W9ES5IFQZF#`39?a$WhfuEsNP30Y^o*=YDAyl!k$OAKKIn3c@1pv$`+Iu9v7UqqW(Z^Ko1bj+(7K4;yx|C-ux;(bczGMJbbQ&rJ#B)i zmOyQ@+t>~;<>=p8a#Y|gEwgP*!|ZBkhXtCeyR)paR`~y1dlHqsV;t-j*oG>{X3C20 znW*+tWS;}Ztb_rwFgB>u;;iC^sW}8N=z`~Xs26{tpq=-YsklaM+UWQ7^ zr@MUa*Vq0HkC{?+p?lu5GlDE-?Z3x-L(`_kD+$@?vg6?}5^sf$O5&=(-lS_<_1?s~S3@wb|iB8_-aeEo8XVAxB z6QOuWlqiVkWXduB3c`FUc;;|QkrN7Ke{{)wM!SNXkm{W99p{cr7RuYZ1`o^zx4BJk z%KG}hMZ1M^{m^vbn(ml9b9~32XZU*0n1u;V_f=o1gwXVN)%0Lxg`i?!+o&3=RD9k~ zMGXu72B`59%c(gK`O`C{)8Ne}6D0$J(>pKjg$*LxXLML|qv75~?lxf4$GbisIWqGoYn9hqWzfLY|M=3tKbG(}NF{^cl z<(km}_drlPnDy@mJCG~Arpe6KX?TB;UFuTwBRfZ2mi;m88&gi-I~J(i25S?;U}$XT zSgY8ZY_MI?j4m$j9Qk^?hB9K^QewTKf>+C^hdO!^IYKS_CB`z$ZY!l2yF>Rvrdn2A zQ+bj3D3w^rriK$6zG;Ku#PH7RQhB?j30KLcsj8q*Q(Aic-=Z$Mf-P%uQY07@V}WpB zgDfb9V-Y;=jd`y`W9x;f@L+tPno*S)#T>!GKuiop2g71C6pf0Zfk@1|aT*cBAxH+r z#L(9@1Q`M$ONpzAk#HbVvIB6fn}Ws2U_9n#zHj3TnOuH8rMbRD;$bm@Rft3fW9!W0 zDy)k(YP93AL63H-kk2DE`I;M>l@{h9)7sMJJLntqo$zH)r!AJxuD6ddfGp5=%RwdJzn8%D9p+cNG2dHHT4QKhI zls`uKLKKU_9rcnH z>E+3!r0K7p()K05yGRf1S$L9gZy5gqM5?h^#@eu}7{APjL6BK{Gw zYG8K14hTP0f$+}&;cE;b#a6~MX}^G~)-Mv>kw-BCU;hNr8u}-Q`cQT=UVkiwhz1vdP|c0l>NMDs2BU84RT>yFh#6D0b57WWd%MMs|% zmMF@tuyR+4y1GfZw@c;yajCqw5S2rOmhR9M_Nc0F&9o-lGHsYT*`8@nbYNg3Ck7Os zD5>ea++Pv3@2V&1o$zwA9#nGwHCb7mRn+g2t8Iv4HL-`xwyA%^YMyM#v}F9r&P-=w zFW;m7Etcylt8Nb^k0kpteSu_erk4Sxx;z{@Z#cfVfN&Gp@!OGBu2JC-~J&S>yPg!9c3}N{mQIEapAr` zqrBG8w;k}K%!lxd-4}Y}^K^3p5k&h%&EHL5!%KzPY-Y)3D!k(4oXhuB`t}Zu(R|`8 zSS-70syZ&a1|#Mj7kxvb=`lc%1(dp6T{^#~Ym17rbC@pfQrDSV%vmVK31!Q&jT!wz zR+1I`e!t)!@|Tu=#Cm@{z3!Zv@B6`gRXb6S%QF~)<uOr4fQ9Oa#^xv1l+x zjd2|g$D?9&AQJa(#8ma5nP4Qu))xwGB28AG-RJZ*DlJk^W25g7tTL=EhkZvhn_0!m zyzzg}((LQk` zNhSzaByXu>E2{|}HHwK9_H0&E$MFOj;~-V-9GVFhu+fsSFmui`+R1^EjLy*)wWFvn zs+U%8FcZkP z%X#m@9BtgY)aO@LQ!aHbY4Im4kZAstF0E%F(Ysdyowq=&?%>{im+T?$QGZ|+1y%_J z*42#rhSve5ybmo4;f_`67Lx-ro-WSW!sK_nO?bImchnDo^ty&l?{4US^`j(NpQz`0 z)Q@ZKl2G7FP~dCKWYh;m`nlIYxI9RHl&GI0@bz}c^m%5*sD1vI*)^0z>R}nFzRqsD zxJ)DDc6Y#&uapuv(E`ufh3M!al<=|B7BhiG6Crw4MW{sD9L|=toDZ1UhfURj;Yo%jfob{IMn8s^>qeo zlZI80;lIh&8H(9}aBp&7W?ulsR0fz7>MuExpHOxzg&K@Oi?}kK(>8q#Q8Y5L1J1e$ zs`ow&d9-@jz&DNK&~V$#KE7}R1OrVx+rH%U%zd|kX~NU0qg5ooUZ&c?!H1<7KStiG zyIIQ@@pv=1Sy;-Z=2#sa6&3exOmJnl%P+rhm}IQ3fF=i<<*xf$FF7mA(gQi~%7SDU zL}X3E)8$TWt;ALUTd%DCf9BpaIF2Mc6AX{=2#?4c2_SJ1WD*1qkVztMWCA<@l1LKZ zeN?fkh$I^TGYhD~!NS3+>Q;BBs;gA3yLEI+YPHl5z_5ioHw4FPfh5={4$x>UoT9N*JcXu% zZ5tHc@~$iqc7h*MzyW}!?XB${dY2w-V=|GuFyb)=k_RXxFH?O?Yhh}Dkv7KK%c1_X z-OSj-9F#elnZwO!4;U$ueN5%svoMn*Mwoz-7mATf+5JQ!%~Yx zlmJBcqZoHZMSO%d*hFazerqMa8;x~}n8~n-ItgAgC(Tn?Qd}D+GD2Nbjdci>C*-&Q zIXH347tD*`XrfS_Au6KvL55q9;TB|g#e5~J7S}SWT#%obuV%I4+T)C-z>nMLEyMS? zuFvz5lQuYwpG;cdG|keaIfaq^Mgc(kUXH*uEa4v(lzG|A6XFvQjx4v0Wk+(iGxr_yC zSNN;j=#_@+^0RLlthw7-=uT{>L8U7(O&g`($G5|+M*gm|w`jNyEPev(K;@XRkZEG! za(q`l-6uAj?$^)lbyffx8AwMpKHVDthX)YtAV(vJuIysei- z-n9~ttmPgAYgZILf4di`$%DMnq`-szJs6>}#V-hT09g`sHV$gag zOu%qr$7kVEC{?DPuElqUP^uvarFxXlD{y`ka%5!r!8A3GO;M2dvSjTspPvhgPm!d@ z1<=yVio%yC&S?NRHAw?7oer2OffSz>k?ffcIA5n8g+s08uocN(JBkz7!K_i7d!}*WF3{i(cQ-m7R<`zz5KQIyLrB+F(@6 zmnQECJEqHcu-#WL_fl>-w^G8dTF%Vo=I$-y&P*4K_=w`4_p*vn!#Ce7?%TLYFq%hz zO9}czeDsvJVP$vYa+apl4Yp607gt6R+tgL+h~7l3Ds+N1K?OHvDmd5y8}uB`&^f*x zonGNLnxP)37t9+ji98NF&){+A$>7xLO7QK;<-z0RXB*O~!_<;swMsWzy3*G82AWBbuAug=Xicr>`JE#e?(5`U2W0#6aCeM0Fxm`qv=S(RrwjyXfhG;R8M?h;~b;OWF*c7 zsdU;=<^*wk5{~jXp~=`l91I|7B%X@Xcq*EtiDWwFD1Rk1o=7EWDw0aK)}JsVsc^id z-bYJg$w-6_B%*0&#qg&Iz|DpCK~v#KOcVSlK;3|(rsyuUCD7W|incj{Kw2?MI1@ze zVX};3n^@F6s4Mp~xw(rl(uErG050XdfGi;&X7Vv6$Cx9<Mj@#zH~ReZ%9hp`-R-E2Lh4urIas;oB;&nePLq!*B0M0yG76{OdY-avX2=}Sm&A$Ay~M!Zee{66B_ea-D8O?$32H}UOD zi_rTww{kI5p&r=S$kL%Zq*t0G!W>7T?jKN-?_kVhwmA-DZQ_Xuo|qJQ&4F_W`=HP; zzi}M+7}D{l#6gamC$i-5lRWwEG<`fpCy7qESa`A+T+2|o&pd_k)U9%7MY*$2iI1E$ zN9&Z!*yYZF{$8aDeT|p93FUm!P4i`5$=YLHK+$FMRx!_dm6k3^;D!<(rUh-UjiL@){DnhEG8a?b4^7k`BU2r~D~%YV9%aHp!gM zI*OrPYY#)+4PMk4!(mnf0)#3;CsTJhnK&_%YTW8CVq*SKTFm% z^5+P&Qf_JE+=(Y~*dr{ni?^iVG4@lNm(IlVMq<_wn?I!Uw^AFLq z2by$*v;SkONq>w@`eQIDTEiCo3AQMNE&5Yo!eh1Q-&!sDx5Rw3zD31~7OjzNQ$>rK ztQP${o@}>>rwI!o59KX7#@T=0YSH%roP&Iyn14mqf-N3i?%!jRB5UH!{Rgz~u^aU_ zR-^ug0OUq(qs)p%{eWcs6^-&+jru=%vfU`2X8vEm-e))J@2p1s9X9Iki23)tQO(e( zf51j1tVaF60x=k2u&Mc>45bF74`uU5B~@Z?V%{!EFg+SSvZCKMF8|@u_217xi7o7Qkt3x@-!hzWw)jg zLcK%(MwSJoc*Q5SVq!43A)9w!l$HqV9onc~&=(06{P=UVzdv8$!eN<9A>S=(_Rl|G z?PUbrEm?YOXeT0$CSHEN#%y$>0_XRWh&i^wP?%^i6fDrRWLURfC+PnN_?|MEDutCC zNX0a?tS|yjQ0h>JZI`Ws=3dxk%dMc)k=xahr8HF?1x6%L!$TVN$xY4v7Nh~BZAd$K zMnmO02Gpuc3}Z%$0FvmcC&I`oYCY57VZQAcDeXmMRSVmoJ4_lgFTkCzpcTQzJ0vTQ z%hC)nuLvVyh4h)%9-X%=3c74i94ftPzV-+Vhi^X$xyFb&aZYG%ti$X5SzW|dM)eIR zcz8`q+L~K*%VGb0+;=N#NU@vaB;(Cb#+hnHO@1)_3wfrKZByKP|t+>_cWLae$NhhM7 z>X!&`3-O-KAHJntEg*#>?t%fqbNTef=Q%)Jcc4L-pDC?IYo%W@Om>WauDb9`cFHb~ z+l#abX*1FQFQRhMMuf(uXpN;Jo;tcEYbCd20nngUhRJ5&maN&K-jpp*F6CVfF3SC9 zAc)fC#g%j5+BLb7!&h9rr@`2@*R~K~v%Eec@4-!Y|0H>l(MQXR9yVsEabv0j<=)@% zhux%~E5hwYpS|wgjhSyfNbmOF$i%b1k%>*;h#lKE@kzw??GvkfADsR4nMcHlO{hAy z@7_&f``SP$8_5w?6vO_i;B5BNe(2~X!4C(ki_Px1oM6>6R8s(};tERxN?ci{N{~djZ@( z%ik6b};FMFfqBxI98VU`(X=nbyo$3)2HkYiDXFGj=h}!{q%&fH3U< z74wNgS%H7iYPXDH%5Hhj-e3>XeMoze9wbhm;edr&*Z_H_zy^rRDT%5*9e;vkv~xnRl9FSy!k7O6A=TLtPJn z*TZoa8F$F%yLH*T6g*D?=~KEvJbXif2vOEdcqrSH_2>QJtS|3Ff-_}V_K{*>R?#$>R%SpSxD4lYmTb0Q_PxU_LxTC0?Z zOREX*o)V!wi5Oue`o?8i=Ry^89eeOoTbteXwztlUoGJlYDBb)yRBt5`Ie z^sgTPG@1-2J=MKKV~IqvfsvD^x(0BOiKqdU3nHFChfJt}QV7GKPhKvC0IoajG&+SW zB2XG-{=cKZzhOjZlq9#1N!Dpy+L3kvRuTjaM5PPbEfNh48f&1E*2yG;HdK(XOfziTWQ_AogG4haUmv*Q_s>% z{m(Wf85XHBL6b6LL!%h@V0tA*qcghIl`}NDL23PASdb) z6IT40p4hr?&ktnQiO*ooxp=MD#-(q#XRP;CgI3$J1R8m!*4Y*im7O@Wjpwsl!o+)8 zZXScVZ*p$-)3|{Z!XM@cCWD9WV*v9x2y}aIb}0u&0e!(~fvvI}oLyPY&E-!-?O{bj&tL+cIN#HgRiyC8;04|DC~8)c@0lOrRCnQ{b-?cEV0 zE(7EW8)kB+F)RzuMy9#nQ)Qp#>wd4vPkg>Z1wT*gE2u=%juo0nht^+clB5_~aq0;< znHoqV9Yi{W^f=NJNKYa?g>-~;?=}qHK1MJgVcW3O$(O5Lc0@vzC@rvlQ8%Il8?cIL z=*ZZOD8WW$cwU97jw`~EQJBF~a>6o$SEUnRjE@^@!gtie0MSux(>{`=a2u@J$0_Wc z74t0LJ9q3qA}a*IVISc_gaZ=g{<$>`wP zm^Cl}tU=zJroEEymLwT{#uU}*dGi&~j>piBX(}4>YSxLS^)3m_@4I!{`>}7Im5cCP zVV?BfwAxF2Zox^_Ri*c1o@(CCy0Ka}>FaXx9{KvmAOGi%KQ`|K&&!bu*JMZk^4t6^ zdEjBZlI-KsfJW6{fG3*4I2+S+FXs%<6f+RrV)iN7BhQ($S>L!%D)>G!=OA>1?^TSm z8&uwUO7_wvbE)_^-^7cVD^n^66yNqYOOm;o^-rl8Kgl-(TWG5JcD98lwTL(ypPr(@ zW;hA{%-R&qwDNwMd;HzyCy$HyKr3&y`B@Bn43I&9>GB~SP^;31#QY)&V!#i6XS5W1 zq)GaDh%{1s;6E(P6x#A_#e5T@k(gg4+4fMV_%L+z;dnby00{+dADC=19}46Z2yMKd zGyA5+?3={=7O|XEe_P~!qp8pQr|4a&a2XJ^O}`IVAF(@a+0Fywon)pBB)>m^9C|sV zZhv-9c6WYv7zmtKcbBBA^YT_hDWG|Fop=f!Y2gLNQ>d+#Pibd2hi|VfwZ8Sfu^RNK zDrl)HeDh7g_M6smZ#efayg;1zI^87{AMtcj;k$i4YWOZ&H7GGOKFR8aE?eTYf_r&l z$PSm&4G_8k(M!XW$ZjN0Vy?*!1l}lGIj@}$?wooS_vyGIp4slY&xZauV^-*n~3-nLz zE{^tk!BAUpklER9iG}9C)++a09J_II^fG_I>!TxQU%kG~CfhPloz6i~Xn31^*Ued# zp^iqk$+S9D$yNgxWuC9Ln%G3ApM#s#@H5ZBqBf$?#pmF)E||-f!v;N1Cs?6!o`;3i ziVY{}hAYd`i(6T+#S`l%GRwz36&DL%3G&oEXXUvL$uycyr`LzxiNxa@gx-n8l1T_C z%1JU6sSV^43n$~1v59Cb9#7N+1d67kH35Ml(duA6iD=YY^FZGEz}%n^2pgyn&;yP@ zYoI%D0FK7k9yHZcnZg(~Kz~ex!JdbaCa`Fs&FDrSU~)Sb=)u)q+soKN<1j(r`Z$x5 zOde$NaezyehXL0}J;nc${qopXBY}SH4|^F5+nl7WVM#9=P`H1M1&j z=;hak@Vc+i3uWC$o(XZwg`5WNGU4;h`HKX7!7NDcymv6JjN z%QxLFSLKPGCJX${Q7+dFmyHTXxnTE{OUxNFlU4SA@nA0*SLA~7J@Z@rwhIuXP$U4D>Emm> z0k^>vQHa2*=HZEVfJv8h$NUuN?CsPkNZlh%p(}!Br{+c8yg35`tDX9WNPWY66NFSd zbskcCrFnA^Tm|gZw?y8z%q5JdXr-=-ysPE|1lcSdB_?x{5Ocfp-AM2#aTj>Q;uh=U z2I5KONqzr~Meq!@_f$OxH$B?73QX_lCaSWAAyEULY#h^k{hnN!gpkBrY?t*sCCAiF z4I+#&C;?NL9Nyg2!7hJvt4%~33W1p-<{No2A}>b!w_0BGN)GIvHr+U| zF;R$Fg&M9W(>uDJR5pF0^iIVBG7yOhQxZParV=zV5Q%Fd3ymaWX@+wz(_MiUG+**m zm`Il#<@j9N3Z@5g8}j}MM(0CG07Z2GlUc>4iu^;g~xiZ zpnL@GSEtP3BH)00+usgIU=A{3jub6mkdMsMYmYLN&r4^~;Y$%3uS;ScyY!SakxS-f z05{1XxCt$5yuke(?W;HejhCyW@%qy$^JxsUvN}69e?PaxU$G@&;a744hfDuR#gCU~ zmsdr+_|b(2vrCIr2GzU9#JCdx{M9UvRk9r1oaG14YtV?u@imQ@sBFa0rj6j^(k+fo z5J_`n#ksILf2P`^UVl`t6uQlYR zuXAE6uM?&jC7O&K++yGE-IS?Y2;^3v3GD_KH&<*^dv7BRtJ{iXA+k1&!HG3g{U9e& z0#)}*5gU|9BCXpH|AFRq5@=IE%fcr=+=I%@FbM2Hsh@8;4ZjShPb^?Xs8>7D9!pX* z%b;48WS8vrdVEN`h{pJw$7c~VRuBptG@T}3a-|#gG)D{vm|SU(!agUU73x{O8_5tp zPcg87>Xq8yxWfT69^rXm?r{l6GPk7y($hFgskW0_@mAP0` zNGV~cf-N6H7hlSH|4Jy_>wSt1^$XB9DmmG`d~h z6)9Kpo*TKjyhxeitv<0`rj^boLi=Pa=dAsk!tYa%5x3nPAhQYWS?`7{Dz4i%%H*tQ zY-22hZH%Y>jfQDSBO6YI9pwk2k@!Hexz0OL24b<2QHT;x+J#_HD2Zf3i6z29ciYOv zG8gWTbd*Tla2Blun6e8Hfs`OqdblX3+uB_INoxfz%qWfm9BaD@25cpW>MwY_uup11 zU9Z+Aw|91QA?-%G2kBm<`;hkX-H|G3Du$Vr7)XW|ikpGKW*r!87S4=`3^R*bHh^Mf z)vzn;1l6!?eeQqfs`I(SA${#955lql7%9EvnrvOuGm}d<7b_?B8}IVT^_@$T_eqaD z(L)^a!~${46HCO9Csw2z&pmQ;Ml^(GzM zjk?Os>kYH~;?n5k^o*_g-pb2|l9}3JDsDaNAU)c!x-tfy;ND!PFI(4tlD&!e;3j;< zK|Al>`MDab4z-QoY$A6!1BbFif>eT!{zM8b1!G>yApTVNr<5pkA-PGoQlwR zELFKy(MU8AftXt9%5@h6{xFS2B2gL}NT(}Y5W`WPJ4|2@`uLE2rMUrubf zK!2UI$|If)cM|cfS5cnqXgr-7povH%uEdgv*B|rpUA`Bb!299V?#_o!j$7oKg#rD%ot|u3?pZ|h|wl9etXZ$V;9CR zBE5w4GSVwZuOYpT^d{1mkiLxc6{N2sokTi?bQ0TO?tv|i(GAhQ99g0Wsl7b)KvoX<#$`CIS3ot@&eKBz(?4V$%hDpMmiix|=7`^K{9bb%zdw4u%e4+J_l8?Sr^v=5&e4J)23+W@64j z7ipSG)nmMe7NCcYNDEK-{(zICGAGBB1@nH^TU>iQMZv`<(?l{}3bDa>zp5vmk~qXd zNDxkv@@F`c&w>RXBIJBNOGW4_UeOPeY)diIf*}#^_zz6_%`XT;H%(hf^?in4(P5Se zkUq}+eS){dEBz6|A6jh#;lVGd?NT!U4tGe3B6UjCB^ma3`w0uu<|l~xQ-qJllVUtN zWJ=Y2{Qj4%`(GyT{6LfPmx=icB->RS?*h;XC$Kumvwq#m`gHD)XjtejD|9_j z^&ZaakF2Wyh?xHkfp6`saeV7lhyuX7Nvk(F z7;0B#C+O3Y3;5;(lXbbcg#FRtG>BT&QQWYApEEo&IX4Ffb(zH_(Cu2$+iVMl%Y3(L zKmN$G24`5;9%l8Kr@HT4<<{qx)VJY*gu_$c$O&xppc;=Na|U%5JZ{pPDy1msg&Z%*A*_n4i0l}iUN z)ElvC-kR8O-ogXQR61sqzGxav#v?S6ilk^X5{YV@?_p{$Q_&AaJ;>BUOg+Mkqs(!PsbM2Z zn3`hhaWF|S&N218agI1_{3(g@l}Y1!f6XUJhM%w1t&-d>bsR2qbW(|GhBE@ewz_up z?uR0tm>f?g29Tza4k8^wdIIT5q^FP$BOO6{8tECNqewGI#~>1yOm^vR4+Pegx=*A1 z#;~MGM0N~=$e`>7(-Z1G&9~*MIKkBzW?;<_cvsgkV6M>uL3AB^z;@NCpa(jr9Swom z>2_2e^upd7EJRN8UG^Cp9Lr7|=ZP0!8+;yZNkrmJp7;`gS)nb7m3W6I-i0F$*kap> zd7k(>M9qawrJcCK6IWpa40}d{?{HRl;%DI$+4bZp>5xAAlys8MnxBK?7dSnET|~w! z`;Wt!@^1O_d>hHPokhOyF8mca-9cVt$F-VQVwY{26jb#n7o; zGphM>>Yr&wVu(Q28YJ5E7)DBdRt$7t7pzP zxBHxpZaOR8_6r3at9wqr$)FZ%Yb3%K$$@yHW5W@^SJQZ$FSrRH;b?h53@05bpZ)?2 zaE){~9E=APE@t`wNgJ$#987gG%>|DAs>+y;>3(Lk8oLNHTyP|21PvX`gy0}d(O}6^ zB@GlbN=pHgwSe5#(cX!)3u!mf-AMN!-AiPTq4K3eaiQBJL);RG1L>9sm1M^?2%ABM ziHz%qb^ImlhjgLw=|lHPS)m7iK+TwNwTqc?fw2ftAQN}UqvB~YNz7E`s^jC?hxiI{ z91I~dsssxUIOYxV^izV(DGVn0sK}?{vv+7#FOKVEhJubJPX##ed7f+(#|=mxKUZN) zM9uwKZp7%J-;yzT#9R?Bq-BhWQJvP0# zlrt9WEX`H-7R&J?YSIQP`Bt4)u}fm3Cb=rJH2j)wJ-2qfPFLC*_Bj6-0_f8wsi^;@ zFxF*{Pn8V;X7C{4 z8F_NqK$v!lFj5}zXL)pC1>oGa2p5e6-xsC7hmmkPr#?PwD}P4pjE-+CImYmY8#rBFhC6?E=JuEY++@QV5H3shGbIA(o=vh|!Y@{2qo8wX%v*3uN;_Y*Iso+>4bz;v#zU^TXZH+;Amxp^y#vBxA@)V?+G6XN9$jH{4s`XR&Ay; zg6V7((>KgF%1qy^$MlU_rVHmRaTTonmW8$7ie=SfNp**^foyBOH4Fr{5n#{PE&QfC z8Xz2xV79KOtqo6TLH;aQ?0gkyKsdkDh7@c7z~q{rd^2aa zt7e+2vue3ZQ{77|vvbuM@I;`KFW?s!Uw=Kfl;Ml(!o9h7OC_8F*9Tc!?y}g?_Oeia zu5}6I9PxB5^&Z4MI&$Xx-OE>Qj%CJ1ukWqm2%SI$-e>hH6gTyj$tZQj(C6Co_@Vdcv4@n0JIVu_uCr&e)HjXdMmS++5!Ag-8;5{3pTOJ1IZ7bN2{W$OV(z1+tt``YUMB)6!^mFj{Q+sbzInf9qZa_ zh4|>2UYwibdFnugEw}McYL<6w&epwHMQ=VwGd8Sjw_VxQ)v3AJ>6iI{yu3KF^tx52 zh&QX9&gJ=}&}`?ed>*lnZ@#=3gcjlPk|n30fO2))jozRaE4!*SQ%BunvTTIu-kS@i9zOXYD zAuo4Tch?D>+)}S`T@AXc84BQty)?Nn`8vM5bI;Y{@)&MIz9S3wa2r|XfAP8a*EH6$ zC}308=VUpqKT8$(ksYnSDl@6ri37Sd|@Y}ISj9*3vA~YROrqoC@9OIV*=_tRI zOhxEGGR$*@qmdL%C87z=FOiPvr7c+^HZZ^o4TO`tjwCOdOs69q8@7$c)5%nuh40`D zGzD4$fxxcL-RhpUU3w4|A$#?{z~Mkd9}Jvq-yQf#Lct=`a5!CVkCz09eiz-54G3mJ zT>y_x1Uz~xx+AwU(g6SvdKWXgy9kr_VGPgxOg_Ne2bu2>YdXT@5R;E$NY8%e3^S*P z`J>DkW6n5pdYLo9oJr<%GdX1eM>Owe+Hux$g0-GP?1&M7kC4x>mQm);Sg}A`FERIJ z)_Rq>Z!q~LbG;1VL*2KT`wo-uLQqgT$>0_vab?VZvHJAk6h6gwYTAzaJyUPY{{8zf72$ zSN{#d^xq=JZxJORys?Q|pa4xkvcF2N)XfIogU;(cG*n2Fe(7w%Ek({rQsja}dLvf~ z7dZgAKt{j4h4hueMJfHNB+F{|L?P@URDI*UuuRqTTp>KG@W1peeld?%4@y^`hAYTb zAa=I*h@JLDe)R=_HcbCGUO~%Reu~IHO@4-aiTo@nUH)A8^5@H!UnyVyLizF+%a^}Y zzWi$W@|Vk(Un^h!O8N3v%a>m-Up_2f{#yC+*UOjxq;ex5STz4*T9C^F*qqv z;?%$#+I4$UV#IxVL~0_QiAhN&-YX-LoA`!Dq-N6O1Ra}Sl1MAbV)WBM6@0&}YArT^ z29>7F=|{yef-o8~)in2yD*_wi79egy2>E#c?3cl^HCRyQHTXm4^%^_Zr^GGIKP4W* ziC3OC7jh)4qFJj-3hF#H7kPpP)~yH$s>#67T;hogEH55q3^LA0fz2~>nde|&_B!b> zSKt~fi!(0LXRhKecix@%@GEuF3pTWKG}M#v5kJI$d>4{4O;VrvX|$X5^Q+ICGe3{X z%@Wx2@)}#95WsQr$1vXmY*fH3Wr)T31>&0q$k8c^$fT-3CVii00%%fre)9t;p(0Xg zJHV8x=8q8HF}n~c75cEU&=<>vIz*u#hZOCBA7YsP1m4Yb@)rIiDYg7($T|7@0J_4rCpNTE$x<6S=u9MiWG#X!h0p1N<9)|(mv4aDYB|+9{|GXFQMT` zTKXmOl*IXW0cN?s%xO&d8Zp00iuwJ3d+^Kr;y{5tF~0^EaPFA*7UXGaex0mk1Np$W z{eWcpkW5kNUmqZy{u)_(fQO{t;HhiyT;^}UeRz!DB9HTq%t3zjO*q}6R8cj+Vfbg* z7`OD#FyQ9z67zTYI4R;F`N;e|lI_d)We?{M=Z~!ALu>h?nPZBu)KN7bFa3vrJo+z4 zHk=7d2wzIXSpFX%{eL7-GBlQn614M{MVN|zjWu4B{xvcG4S7@?jqzswImyP0nK-|C zgf=#m=LH*^Csy7k#QY1AO@yu;EM^i)pZS;Y57U^e7>1Rax zKgIO(KIv zpgu*C9v8rszzYm7bB2FrG5j-R_-Duv=#uiUWb?VK{!hq|e?8gp>_z^q zTqKXj$E&#dfa^KV_0KJ?e~w)L9JvC0TX`g#kL2v7{H0>%GI_wc7CBe=KC_qj>%UaR zu8H#TGYwjwV%5AtJPm7g!{+CCWSR#ktERsA(q_1CibALZ=L$KyBQ>uiQm zJp$w1%KA4v(-#PVKkpOyZ)NjuW&E12^RKxOd19LKa&!yCpQk7R!0N8p3kRWKqNX_t|(VLw65aP zQHwUYFg>%lq)%H4QuP9)HUZ~jbCV0NA6v@hL5F5w?y-gZ;??JSm=_z=L2m?--s%2p>DNw@~C3kEA&FPdioY<6(+e9zg$vgy}Vf z;aH?X%S~gkaI(>135^a6ggw<`iN;dNB#ng!(qQY7pwVb7+_bJKbsPoO=}sqbkg?FRzGGGBrr=A8%(MKJOm*t>Ya(OPL{Gysm)tP4?9x|uG3 zRrWGtA9L(u^dK|(nBy>W9ASn+AtT}qNH+p-e zJ3DEDSyKz29bVe}7`%V;EQ1v$8?eySu?X?j6cHAhFQ9tciu20Ouoh9H;mleDma=R^ ztL^!2?@V2F4O>dao|e&|FpRjmGc}g2PNG|2So3=eCKMHBEe+SlJ3DF3xqg%j{H{nm zp~RBO`u0Q0Kq69Ud89-maV3%*kmG3@fJo@g{A+h&a8(`Sprg~C(!vxUT2po#Y86r! zD`=8p!2GPb!B@fQBC^s1S3WNF3Z$-9IndtLfwU9pE~LAW?m-$P#762;iNw%vP6u;G z8BHV=w1X5#U1VdVE;;J}q%PZPd`fR@HNI{d8VRoJ(%w{LQ1l$wN53m&cidFGvNr3p zGp6k?F0@&L`YWz$KcR+0F}vf2#p_05B9=6)3gW{TaOHU7Zn)z+O2#3Wm3wKcSb$G0(_a64U5wrO2T zXmf7mnNwR_UAe!y;#gRnx1L@e3|fXjj-ZX+zkGOeo;Fxhc=N2)KR2*%k3}MBh|vc| z?x|?SWY2|*XvDJeLZ`84G#;*;UTHKQOHnQ;43rV1;;BfC#s(5RJrPN-w}p?U_?MH6 zf*c^L-gct;1Fd?nt+n0X>F;c!1_YTFXiFMVc9*bLG2Wlg@~_qcOa_QmChubEZp*(~ z+Xs>U_8XKi`LGd?@npA$$x%GM9RS>a?WA#1HhhZ94wbEak-*%JM)GfALZR2 zjH`0S16V|0;?ERBkWtJWuX1@3UmU1qdcpnwVy`U4;A=3$-X-Q;SGM9n(gTr|2 z)d$zTQr`E#-@?m1uzzNo!0Ve!H+|+0!2uB1{ZDZw?_t*+l)k{b?htvOgk`6Kg32uK}x*kFE0itr=U_wXUl@M8pP#h`pYj@S8SUf`!laV>NNb9@P-`8l9d zyLe5%h&6Rfzlg8rm*Dld&94$Gbb%5^F{dxPtBhBU@HdM2t0dc91!At290s1Mb@mx! z3)6F}_j0gw;^dxNws#q0dn%`;!8#dl@5m-&Xgz1X@3JvR%jQhP#m4 zJF^R^`=l03Mlz1=k8NNO?g9+JQoyljI+DihiOoE$H*n0Rv2Zww9KsEOOazVwZ(ei& zbH_V?U)_G>jY`BR&lIgjBH_zNGzsakaypn`^7Lc`(&P2PJNW%HmP?dc1GqDABN zjilSYaW*#xOIvav0qFy6c6tpS5rj(!Lym~I)D+=?&KJNG@=TX1yOCSLRt%(hE8kg- z)WgClEsA`dy}!619Ij(=$RG8L)!rDu8!>lHdK}vH&T72c`dom-h#ExZW$`$?KpY=4 zRRcG}o0>?tDw+7#54cibo@m0|aEn3juj(Gb62l zkw`ii?PLUzP{OMyHGxY!?hnU*O$PuQ7EblcEVQQ3-IMb4hq?ndwWC(1p z$VrIQOHMQO4AV2rIA>%4;S8XNDSEOs>$2f=xRCmgwjgas+J$sC(!EG~ksd^P80k@@ zVWcsn14svvo&0q?k+8I~ zZ2g7(9t7eZeT#q8rRl#Zw=*K7Ro76xy7*T_!DU+;!JAcMx2105M68p|C5^tCj}_Z6 zSdS%&MJ@HRzfcIJ>fV{ypm)$|J&{VO0UFSBJ>ZlyMieV>7FbNGvP6ydB^aY3C;^NV zb;O6B>kwyZ*AIy47f1FxVpsqy4154u7(X(#XEj}a&`gl57pygWwaVNRMSBI zE{wamcXHFKE4h28p8Wy)?Xs2O4}~P(a=!{COvIjS3>~K1+$>S{rTgI7ftjj9NmW8Af0+IEIQ zrIVP4k3Q=p63%kHs7*LiN_Z~ze5A3vaB#Z1tcgD-w!u!6#I~+fbuKvljIHG6&u)V$ zFIw}aa6IY@xwjEn2((s`v%y4T<+HzsDQ1V6#%v3pSm(a`EEmnVVx*E?cmMt#zMqU69?=+h|+O z??#;h&0aQ21zPOAIWJa<6V$ZsT{qkTe4 zP%o4HUBu`h;2t9HGP(&<_kf$ zRZ+D80q^*fFlqcL(a8k?^!O;`L`dljrC_{%Q2>5i%BpLK;&E97?^CtY0tm8K`UvbB zUV`|2x6GFiX(Iqg8?O{WA-R^<^TxyF@0qvOzPtR<8YJZ%t^eD{ADg#}0uDrQnksRc z22MG1y38qG;^YEOxmr%MMKpv^RShf`?gNmdo3jc^OHavOvSKa)D|4k+dIE*so2C#2 z$e5y!_wjt@YH=;^0lq6ysx1!AS>yU+2y`+U}$_uAI)5E$_TB0BE_ zV*UuZ<1Nm3%@5J!9iHhW3sw>zs!#f90#Efb#QbS;;KBF!0OgPMv!n>>P9LZ{W%~)6 zGBSDa;CtrJkjkfg#GmrZsE9P6c2KVV3f3NyeuaQ)k!LHSTJ-B^@(!=}4A1nNn5kd- zO#(0Yw}|;$M7-j|fRHJm*zqlYiy&O)WUKkx#D3GigIY}pGYR(J-v;aXe@?P(`L=9( zz8!LBJMtZwPB0sBK~!3(@H>`6#CM3c%OpNS|NJ|pr&0onu1YeWbcxW)5dMK{{8EPtTViaWVVDbqX-0?me%Q`!0rrUX6%PA??AOi zswXFbxmOqnXrxFN(@cr+cCpX zthkbjm?j*u)9vyQg|C!6rx-s9Y!@U90ZfTCPAprP16c~TF!td1GHp25S~$7oPcc%9 zQ5@dDqTMbzxUS^f4$smPc2z^QRe=(zgeFsVrP#>X!ZEvibtxBzSJF~qRbi96yRq^9 zsb}p8%jYGtxP+B71a!n4x-BjFOWE?a>AwrGKynNBmNQF>^FzyVo9Qem zjuTQKADKg0d5v#h{e~o&$AvZYdGkb2;0UT(fR{Zd0DRAx=ZkO-o?%4b%Bz}7+=UhE zf(6)XZ3B;GUBYM>L+WyZ+dxNY-8xwB_#++A zt}8ITLjZer4MVjxfV&r3Qn9?a;}PdBrTCbYEv>@wZ7F3Guw$6L&R5_1dT!;~>f{`N z_uMN($Wzr~K^lLzK6soBM^`P}mIiXr@V6M zqH$dO=s)RP&aIS!bJyv<-bgAHsNak&!_Sq}=+2czUb)b#rMCKP@66AQVq-5^kMoS> zYZI8&Sq&%0=^cVPv70qfr)w=l^Voo|_7Ty^#aCN|?@E#h56)mZ&S0|I#;2Ngy#rNA zor*y$?U9@4ew@=ZoYR~zp=my*wHN_nbdfFspyt|crUjXHfa!;r)@dA)#q_3X9zMOf zT-^mO%kL4>+g`b+ci(=b2a)y>ug`G821s@zV7ccSh61LJs@Jl!EZPGPKk(WA@}b*c<_-qxb_vC{is4OaMovm zb(3`VDe;rhr=(fVn4=&EhgwgQ0{bW=o0$)u@Tu_uA}(B56LID)u4N3VSIRpwPKn>X z^4Jc=;Swxi%DhpDajuvLvrP~pBMbyK`QFlG`F|+&9Bgst+rQqV!JaFF2kMwW46e`b zy*_&5>Xpl9N3Y+_j9ni+D|wdeJ!@umDR*y&L zLkx-3w7A44H@;w(#Q||HK>;iBo( zZ+sF`h^TL(Zf9FkNH~cfJwz`Ea}rIf*kCZ88laJQBCPT0K!H#Ou#r)`5XwMCWFgS{ zx@{)`A4~?q5S6wtx!dr8$-W|KlB)54%=Jap!T)pNe_{@iTz-^r*82!_t@jily3637 zJe7w*`XS1&#DB>Y-NqC*I*IY*VWLuqZJ-bxJq0K_CwRnB{k}USL?3?h8BYW;G zuJRf5?4o#5d2rBqzg(c~Y(kFR+k1vr)b^DW$G|2L0o-q9&Z`*8cI?w1c7 zI@pKw2-2fS`;o>#(&md8-==BTRE0@v6r}Dxu`TU` zZRuffLOx<1=Aw6okPkjGkF13ZE_p9MF^{f2?j;X13ZC*&UN$Lg6QS$?lubd|G=$u- z%BD+Yht_%}Ui#NEii|;bRE54Ku>XS}JPCdWx}K;?s2VgG_{ z2=?D!iCEcxWr=S&ZCH#OT-+*aB96y5!@C@;Q`&dsI_$GYuAjSmI`#99TwaXGi_wwow7%p8w!k-vV9Zrdt67Dz-MLN=d(4LV_S?wVBMS?QD_Ezm zlw?(_iReS>BDBSAmqcSJ|NOe*WEQ|1M&{-&SsCj=k`7ijPk3=LV8yHKtlwe1k#uZR zaMLX-EFchC>G1@dudrOSZ0#;T*NfrI@itmhfwI^bgB&1B>C4sy!pk1sw3<@E!ELn& zO^eaukxY^)Z7~8bMO%!*pQd%qJie_uEWF(F+bUcqjl#HYxQgH3NtoKIuXUpS;1f%7 zGyxVx(Ks8k8X8HZ21;Qmx(5_bCQIUkLLc z)`6m)4ofW+@pYP++zNQHUEo>>W<9$Z3o>^PV#jtuh#hj2vA7YJEqfp~Xbj2>ggjYR z6jo6AGO6q-c!<~6Tkt^I5uPSVAt4A>Ac@2_LJ}cuKEpv;RJj#g#FYRB&XE*9>WG?z zj%b)P!wH#2+E5B);6+ZoLJI7^Lmr)$gcwK^g|_~HiZxb+HC7`7W~vte24#gQ^cM-g zdl8IM=rj!$)M@Q0@kke+5-+*L7gYHQUr?2+Pl=ztY+mY>RzEVY6f>Fxc#$vnO3Qq~ z0<({&B%r=#-g-Qx=5-JSKLl>(Yg07jJ&-YEU~Ar<(h&d7oX9$+w7fIpAe>tktX<5P zr_}FqUQ_DhysP#1KK|I8TtiV(p=y%1Z`d}P@kqnw2ztnU+ush0`d)I{JdFt-g0;+< zwMXdbH;M`;M%Aywa0eSu@IjAf=C5Pz!r=(AP%e*fhjIX+H zt%)nmT$xhEa=j{?`&OU$_{%ik<~{Mm{0ux1z(4*_wrLG+PE#Kr3g+kdUH z;LG01gr2_+v*^-&cbTC~!BBZM$AYC0n$qb;KLuLrgC_|2nECZ0}Q42?utUVql zazPO|q6#h(3e!6|r=&O^NW%F*lCLPmwK3UD2}f_HJB6cnsMS1mUTFKZqgH@vHw5Dj zi?F8Nyti5(*xfzjEb0Hh$+k43;V08y8)&Pf6HII+PS@bN;%~jEISuO@s;v)ne0ET; z%5W%|ZMA+~Z#-MnrcLFWEyX@-zqHB)fctYf>(s4;;U^{@ub9P3smgplr(0*r%Vf49 z6jh*3XZ1!STaVQxL=0xJD+S}SejnYeZw4#-W_Wuqr2I6(9SXI6LL=C2x2GJ3OK1bf zo~x?LxL)gmd2Mr8)v~FLYc~3PY%MOefz+OptHq^Wyt9TY(_1fUWy1DO)EU$wI%y&m zrLlB6LgSHSnnuHMz+;JrX)F~+ia*o@xr_e3A_ezp`AOE)>7cc#weCTlB5u_ocN0A;w+K)7hG=eln z+S&o#kTrv_Beeid77_R+0{cYK!32l~Kq68F4vL0&St$Q7y%wjO2kPumwrA97PKe55{L>O>8zP4!pik+{}m85yyP4RMCU;u z8Z*z8!Rybjy5jB;=V)>6vb1Q?9B1d_)s^Oc&MUY_$+aiC7sHlY+W@7h3#86Us>DZo;(Z|C^! zeCc)*zx}!pFvM*xb(r&|+hC->P#sG2aJBcc>U{9&)wK6NuVY#TzkzhZl6BPf?_ zFO!=?Fb~!%zw`p&uk8wl>Qo5F_i&UWv{y)?l+}1ibzRgC| zN!#x8@C6;8XLS4JE4CRVNN$ttcH3fa?{&MA8_xDiF96QhZr()w@ngaGCKD}Vbu!RM zB0b=#?hvqIN^@BwoYw80rqN_LS#dT6p_(G`L{t@anJ9|5aJo0}5Q#D_3n+f0oq#E( z(#@1ThAxhecuoc8a(<;a`Ckd4vA7%{H{m?an&p;2Ya7xIq+LjNA>EBMh;%QXFA#c5 zRdK?$@C_-VVkidcupEeS%V%!XWD!k(9ctAFN?amp=QB)POx|(J&WQ^fr)4x&vL^SF z;{Hjvf0F;=llv(?xr44~ZALXmD)FZ>e2O~2wZL$3g-^Yg(DPC7(EvugP02!$^Z4UE=>i|Q3$TCaHkQKb(GkT>CZ*vG$@ zBd~F(H2i^&LlcHSDED)MhCj3fDfXN76qmS1&)J_tf0aZ!Xx+TBGtgmz8-F8Y$}x%8 zH)keSSPqO!ZZ0-gnlK*|2XnjYw5H!Gy0j`JJlhI`i6WM^jl$M_BjbGA@yf-8&&#WG zb2z^KZ!)vkSbvvWDj#6b^5tq28hQg?z(xl)65wnWlh z^$4uL*Vl;h%8eH_QSay*1Dl=nRAqJ*x%bc{JPd5Raqqvu0|G1$YVY_uWk1 zgZjfm;G(V{HI7<_APUtBR8pGW=PS9Zz2I*qif4CWmm~#+{YQ_yZ-4Irqz94qAw7ch z81aLr1=xRh#o`QBAjF6EA9&;h_8OkOi@uN5-}`3lAz zo5(tfYvT@CF|!~E!9me3USJst?2?wv6{x_SaZAW_^<0Gs#j-eMdAr(#BA#uoGNJI7 zmh=CjZfrtPsWP%nkh3(71hjFEf(a70@*LAld*>Sg&9^Pu> z?Z@6!fhfN3N^7}IjTQ#B+z2=oI-i@oCnBWOcW!7}>uI1+!x{MAj@k}XHf5qbo~_MPB9o(}Q={}^rNDm-A zi1ZNBKBR|{9wWXcgMm{vs>&n}U~mu@AbQANkirxdz&of=uBpapi9d#Zns4kFh8yw0 zOs^Z;)vCc<>lGNk<{6mi^V<0ec}$@D3apQkJa&yIUbnWAD&X1f;fb$WD}ebL#0m|y zJOtZwz`ea~0bo#dFV8m3%iaT%^t=<7hddlE@!9`;NH*U9Pz<|4eDddO1K{WyR_G6F z{y&uUXPfd(VIVO7`%3fw|3fxKLWC_z3IFi+i@-mG8XBPef^eoU%zdm*I#SO zXOD#aM>aMI99&oE^=%IuG=qj(CahW}>{^CuYk?tj_s!h9v1e#mKhIyWsA_jn`qZ)70(tY?gL zg^$hS&+;U-3E)fG@RQp1*qGROY)sU7d<*I$5e3_ZFuzKLHPP*Sp-smD1tdlzi8#L% zO{Ikx<5B%>9=#b)o?5`TP7xCbt+~S+fzd zBv}WYpsQdI$<2YCZT;wcnP243K~xhC;2s|emZGeRQ?*6JC)dV<0Fn0bybp}IL%%o`tkWRBlaih0M3VqRPW zCOT)bmUs3_zbEkKFWn&!*z2;D%jf55SMMNn5>LK%M+pUZ*&E^v$X?*OvtD6WtZiyDhlZ`@o2cOnRn$>*e10P|Lt;WYi|7V5{0m?*-#h#5^-)4BLWeL44zbvwVh zFx|4gUwhM=&y!rrTv@_728}!*d=G=3TU=dH?*a09XbUYZJ+ig!afoFITxj(9cf{Lj z9x1^fFT5^1y_Z`?ZoGQ=%-u617cbtueC4Ka_;sL%+w98fN{&L44sW3WTrz;(5cr*R zd1di_{}xJBju6k=lgrn0lXG+LVlD=<25;!GEwB+Fn43G(zWVdB#O!sRXAVal6~i^kM;No- z2^aTbF>g&f{(t7)1wO8$x*xxDA3OWr)k<2urIoFRWy{vSwJSS`WLs-X@k_Ssyu5Ps z*tL|%lF>>|%yS6|2?+_$1Ofq)P$&i30x6`WP@pZ8KhV}I5t|={(th}~lmhjIKZWvZ z|IL5SnR|Ed>Mhw0*dLv}ckaxYxpU`v=A7>VoXEHX_i12ILDm$E?w0``W2BC^2joU9DpzuXSiBD4&q9gmG^CMV0elZ7}YyGdswON1O!4~ zsT<{+70L2+d7^?9xQ^Z5ovcaMBx}>P$+~o1x*i>FRwo+7gpWn&1_LvQ?kk1m!P#Uf zygQ~Z72DkGTd4Q)utX_oQ_l^R`q-;X4LN+{4t08{+{fPMRR^?P_fA%87ljtcX1HP*2|FW^;by;$r3e7u$WseTvi_-c}5Qsd|w&0 z;18$|lOYHAsCk6UqbB{Mq$r2Cl44zy=44yZHXWqO^?aLdT3JkMlqu?Kn22!tdP-e) z8}nd8;gPjun;mOK=rW>c^P{AJYiDW@zZy1mhp(OSLykpnnjdg$I=Fzh{deipaz#v_3KYv;@sz6g4ROUO0l|3|M= zkC;qlGW({_UzFGq_~5nkVCpPsxE;JhI62R1QImd|L=b0s#~6wqQdaw&Z)A z91I1c)0zcguk_kc0qyhBj1`8o%CPYj+p+zY_`eJ2j13ku)4)F@lMPh`&BbzP^? z;^w>DpkgybSqgs1K{4GKXuF8faC8PyQ*;|@;}EF3Vn#&Gwc%9Ey67yrM&;?)B~S)K zuzjgLc4;2g^XN>zTTCHVNo0MQz_&26}QOtgSApFUP3VW3)bT;I7?0hg>aENAq_vumxi z#iOh3Oku#>wRXK2*ADCW6#10_I^x~7R)V4lUzvpy*J^IA=$o3J^<7NO`Vbrigbt~( zo$G3Q#_61l8RsD@|1L$69^DeWWi8%(x--l+Yu1M0+Pi!QekG2*v}t^qS-jI9@Pn&e z@Vya?l`q@<seW4Hyg8d1bo!Rms z#_|jY19HR<-hRVy8|#b|=KM%FR9G;u5_W?13L}ANoLk}p(xOLct1z3lqabF7d8hXl zJS@-zF;W{^;wzxCEZYEXO~JWeDyO0stno=LCG~h%u!V|Ssn}FQsJ)$v9hCSf2~x40 znj`4tHwKTvf0xTVAmn`7ZymRIhu6}<}QIa>w2=gB|)(` z_W|Ve??QSSX%guf zq{B!@kd6|m&SD`xr>hYh0?S+WvNecO-Yq!6dq-Kf0H!uudjvZ%H}wb(VsU_efYl32 z51S1i+ne{Ym5IaN4a(8PSq&=`R|~9Y+^w)qDRIGC#v{n}s4pgVi=gyPy4ebhhz(q0 z%*7GBOWgot0IH#I?CKvPm)d3DUU3*52?vJ6OYJ7O6}i=_Bv1UDsxJ|c#Yk5Wmf$K| z!o9>|I|xvxc$uhIh-R7tLWA!RR1as--7R3LhfA`yI_TuPd92@@HS z(-dQ>|3nthxRqtNn`QVj!a;t1MgZjpXsHO)Dg6gg|3gpSUiIw!vkSn0F}=#T71SCi z-~+1%L4mBG)(r>tR80E)al%O+5=uk&Mka7b7g^NUH)}iBY?rs?S02^XTpPDgAT|oNQ?CWE0UdGgUv1 z-@++;oT#55karFQVd^Jg4QvNh{jDt0XMx%0NV2Luo~U9^UnEHh{Xes^^dm%+1B8vY zv#4J|e!GRQu@dMOqK4UuDU235kHak*||vb-H>!U5#gWrBF%` zzp;YMr(KC!Q7f+#zQKOR|2N40CgC^GY6#H1;&0Fc^M8{edv4sW{tp={Ul=b}|CbEe zl9qmpFm6*{CPQWO<7H|V8oo=HaZ$A+xecUzejp&@l318#9WAa?74gLE^!f9tvAq}J zNFcAMs;~Z?Yio+Fz#wzu6cv}xaRo`*dJ4NjC9J9T6@_KWzvkqmHR})1y$EleDC{@++J+&#; zsg3DYUgc2zX1!+ay5>4wxsTW|Q1e5J>lh2X0bZ>L*|ILcm)own)CIgOW2KsS>Jr|x z_fAfa-pgImfN+EN6by{7f6Q8h?lpEDOTJ>qSqv$*esHo?r~TL7h-rT*hSu`U7*_(( zP&fo~O)$6s->|_>xib1-L!9Y+B$G}x=JPP)6kc|)9Zr|Kgp?7>E;NDV z$ovX8AQCN9wo=7TO-{t%Dxs2x(sF99pi(8ZRD=GGgy4<<$<;umMrz#(?q8)=YTHKb zc(Nq!q~fj`0uErM5LF^nic(Juw0SIhsB{x84OzNHDjlF@$1P245fnfpJXwHZl>(d> zC0?^HTSL5C!r5lx-P#2*rB>o~+yXXvqF~=E?(5y3Kza~qAJTrLw<0}+^f1yRNRJ{t zhI9bw2~xSkB9b;@vmta!eYdckNNfStEx6d~t8N%%FD6vsktKBR3SL|t0x^|?t`BVl zr5$kM$|6|gZow(w;gg9};^7lD?gwN=F{Rm3>@Kdna~H^O?gB`$y8u$`F7-4l<&tO& zGIVKSTvX41YXM2U`_lZltPWpFD*XzaS&a=*?nU5I!b{Z70~*IoehG!TWxKG#q z;RVkyNMbs~XNdYfj06wU4WR$?Fe@2|PU^Rh%IW$qk18Ybh%#JnR?M>c3`thPOU);I zs8FLjU+Axt*}JG8APZ27iAGih;NNzT2m?cWWYLphxv-yloQF4J@_0o`rlSAHfN7xEDyW2?F|?2#cY9 zj$E4WZAQ@yXcx&W|C?F(s41h{bxAYp4^$<=}+!R??8h4&&vE(;TtO$?r7G_`cBhx;`-Q>7dQi2WwBwl zX8pUwWJfPbMUmBW;ek;(cUd#*Ri}v)*Ub{A@M79NFc9L79c=>DwEVf*vSg=hH~^I} zb5>+KLkb#(PPYqm3yG=6&h2m{A~yV-s6H+b_FZM;l}~L%Ji_^eD7L9vicN9&_w*>6 zM?1w;b>1*1z8Ta@&SLHr#XZG5ZwUCQjpxAqF|LGwdTP`4bYo#q`!-*$MfVym;iAyJ zo9BOx(5Q2-C^V|xyfjnVNZ5#v8jTxpV%GBLHCvXVrP9z!XsHPPTnw3N#7uomTGzPP2W@S5a^ls)dB=_V zfandb-r&2IOFMOgM#A08WCm@N^?Z7UORO~Um8QOfF-n(7mDu=OEmuo>Ho=AsQu~JI zGO3Iuf3<4ApSn@~euc`^u=WFTAQB9(;Sjjss3xqz4{<+f76g^lU81p$3|^gChb_|( zhy-g^7DOBGo_rO6)PuB~m}HOJNfcCZ086(?xVQ`btyjDVtWq}lU)w))EjjvmK z;eFFnv%?cpsj;@T66RxKUFGlE*Uqqzv|P&-=8nVE@$@lB@(^IPXyP; z*w}APGpVzzQcM}Xh==Xs+J_qEBS+61?it*7Fu(e@<;U};&YkOhJ?zw`T3BZEDCM|$@M*IniLes9SqUg!79r|evJ zX2pYq08v1$zh!iKY7Cco>#jl^D|D^s?dwYgNi^qS@{yB=4y`j8jv7#@kY@b_gk+YJ zNA~w7Hc*v?p#w6^r(XY8EDRuXg}w_8H6!a|v8dPkR!+r#R$Z#U=C=hWs;%3V0BG1M zfoL=uQULZh?pZp4%b|F%lWn^Lk*XD!L~=0H=~n{5NTd@$Nn?yz0FXd$zdRcCES)pq zv?t;yTJOlgXe?g3%(6xf#{8^UQO4U*G~>u|R+`e~7J-3yoTcdW$D?J-O}2709u2t` ztpMamXE5j}T2IK4Kp0M564gMM4n-9box)hM>0nA@&*BYlm6R zu|U{nSOLf}KNN+1I%y{@%g<-o^f&WPk5v ze;*)}K1VFi5vf@~oJz|6Gz%|3fU>i-un7I*+4LaSKZoGv-e;&(6bk>Zq=^5-ecLop~HA} zT)V2TKLII3*}MH@HZTakxAEWlJF|h?;rF!mJEZ;I&40b4*PDr00>o3h4~e4AMEI_aVKA^wmgTi}dwK-+=Uu1b^Pde;(pL5A&b5@Sn%{ z&s+J=#IWXX~ z6HD+oRfsio+-xGYvVko=Vh<0LmJmk-wAGze15I0qD>~qE5O?Q*!$wMC19mI%#0P8^ zQrb08UP{V#4_H`7@eKItiPt(%RY5BD95>0NQtTEXx2l^4JZ@5b^FW!0)Z8-Qc9L4h zKy5Xt>mKlyk$UGqT@CA30~O`OS2EDpKpJ}nN?c@%WuVeawpM_Cd=vY>7epP+&FH)LRaqqPrwJSi~O0`qS|H^uPqF#B&LXNe=`!@`p9}B&x9S>L3e5AG&^$HLV&Fn$)`cZBhKjBtjJ5%qDxS=REyVC!O@R>l*gPVZvRikPwoa4;+g zR-Nm!8rNru`n-Yb?~$Z!F;|<$^<(T=5m)v={Wx&7>0Cdnas4b&Uo>$2Gm^9~=4#it zevv&Z;>sSVUqXd@o$EI=uHPW)w+vkWjwBt6xjHni^Xyp>SN1^tHkz{PTz{Z({Q*(` z*}(OOBft3E2tFC^-uL=}6Fx58NM1^4K;vT{Bl z@p3*PK{c^yo`9zbT7y0ABzY_T0 z#`u3y*&i@6@AK8Bv*nduA{~~AKqW)emhR{SDw=t#kjD#{FB!{aeWW zTaud7xi9G4UBLY%;C@--euZ;yQ@>;2{$1c+1KbA~_wQ-kzlUG*d-yfKC#nCebN?Yr zSp|&$1sMOU#`s5iGx;|I<9`RnwI+!-lb>pgf67=6lAlVds-sLVM&DqkhHlSgIs30dR#c6r`c*2q}C6Ii}WWBG2*a)h)S zV}s7|X^rF4$nj}e{eaH#LyTi7aC{CpKCf~7Fz48={$7FOM}ebH=lC&=$fK%lIka_-T#fXE?{5>I(&qp9PMMI>#3^jxQp|7iIO&b&g-u%lIYW_+^dbS2)LA z>R%Q({xxvi0_gT(#_?;&aai~o>M^#28USrOz>{jy4JS-$b8;W3lKFvv;ly4R#$9e$r44x2>^siU6ecdD_6<)? zf^T&Ftk^Bg-dH!8%jCUlI5W2{hk(nZ?bvKW(CXFBTn=qI^JT(fn`I`k7^_OAW^b(b z!sR~<*BuGR0_)NjFI|QS94vRrUSc+R9U{1`1%)z7C8xzn- zTv+ws$uS%qqrEXHAf`wK#FQ;b84y$SL)y2l-XA#JX9riLXSJ;Bb|Y4y-WRG?@}137 zcP*dVyzl7YV~2VNdxgA##&!3m%?q%5`2w)7#tkKI-AwUUs1vS+;a&b=-Rc=_su-h_ z(^IKpa8`U^T8B@l>+XS?7vS`Y^{w@iXarom1r#hh2tMO^<%$ryMyv#@*Ir2k3*sS| zG%s$lgNjbniK>tRR{)IfK%d-%qAwO8yF|CAq!eixQZLdrD#2})wE9Q=HqiyI@Ye<6WiO@v=TO^8ozON z%!X_hIbGSkks>0547=C-o+z7$5ltV@f&B1Ufj|-_HQ84>0H!ugHeC1 zeAzmbL$PSYW@tNd$RCTk7BxsY7z=jVjSWQ(g@WM2B@(k4zP=oag#9){q4c3O7z)Nr zn#(OWXs*d6Xt|8~r*a7@nR=;MOT|3EOcScJw*rK(xZTnQ7BMhrib@v5oz|>{UEASW zbO4oIStp|&pkis34bf%XcT0s>SzT3wv<_(l(nh3Pkv1c3LAnj;4&roK6rz~TrXGP3 zfx_|zkaPKjd|DrY9UVa-C`}Ww-&j*buU++>qR$Pq8@sP zBiA2N52JRf7COk|4yq?n%BzLyra$Uw^r@wVj&Qt=5p@(yH1yDOJoFrQD6EHG;2bWX z2QIVjmFohB7`O-`*Mc4R?xdTmz%l~c8E0O{?y_a&$%2nyc_q73%juhUX^~D{SM)m0 z6kz9dulAaD*N&Bo(4j?LgcqhWXk9yHrhpJ@KQn=Y0y6V!svq~=ci*mp`bW_3j~A+J z6jZ?bv~|q(Rq`_Mh3qV6*kim~t$=zQNMVK)0IT1!dIE@I(7>}BtEX+1q?x(V(Nrdr zo|`PfmYdW@1G7FXIPxECa zGuUa?zYpMbML{7r3f|@eFt&!QXApHAJ_mTD4^!>i$iaBP&(^NtsI^e#Y~+r{ZH6|2 z!#*e=M4iR;Cx-&@&~hsoZQ-Gf+TNnC)Rmw24C^WIhrGmbL-X?KmRn90EuCm;Y786a z>gn|?tuF6jH ze(*CXH=#|h0%8DS)?KTiHLvIaSU9#5k}JR?rcw)Na1#2$1e4tkDh8=3Ld7Vx#HqN4 znr@=jZfe^{l>`<0sdz{Sf;(=B5H>%TAbN?!wjPQ_gNb#qDToEz*c|SxX7fiKM>eUf z+MSJ&%JN&XRqVP4u4{X-z|gS8A6A2z$wVijDb>TbbiwGw;Xu;3()`eDIJoDIW* zjktWnf}OYKtUjeVRw^ysx;U zEbtf@l^T7;0dD?nU>K@{szG3q1rEUuQ^!;TA8unTFa@6BnuJdvY?|g+?p|1hc!f!I zGHLI(3t9V1>bcydVTU@EXf_I@p+_Y*KT=FCmV+=R?OpfUd-o{@s3gi}ie zweukeb;B2p;sUNUxdi~;{6JsukXn=%8-9B>T)@Tex;B`UYf*~z07{*^fq+s=YvFeVR7$k2 z)!=konvOy3LT_q^cB~C%)0Izj_69UEJ(t~jE+F1TNbB$hik5#d4nU+qL)DB#WpCL zs1wdBF*AJ*TNW;CwcH$->Y{dM;+RDq4pfAo^V$>FA|9sE=_$5nJh<5&u((Q#fWS5c zA=b0GBAhD#F|8kYU@^$R4f1@s_JDcX(0jS`va{3A_O0O%$RPuz%d{&w6b%REFx%VO z4DT*SLY;oI&aG^@UQ)H9ZUVVXx)sw{XK=0%A~Ev1KWvTadP8 z*^W(7c4fEk5R`~Os!L+oX7t>-TikQ=O}8NJM%sgPAJY9u6G(3*^$l#VK}?=uwiyv> zhS6~+$UDVa1Tm@r5vR;{AQatpnn^vn?F1*)ib;1;&8ne{JDvt1<6d>&rCc9T_j5cU z6K&w$r>_z!^r`)qa=jv303YJWzinLpsmLaJfkivXqn*4;oaEG1;u3FHPbE#T=}4RV zO(bi&tlo|Y%3XkaFupJ%r>!iFIx*jxL%qDSBl4Ho^AUN0W$_Ozi+e$63t61!dz&T!z_qsvvscLu zG7B#`r_SL^?PV;ll6L8WdV%M$1@gEr$6jR~@+kv-}F6cSUvz%UHInCkA zvAs>e%b>GFUcyGVIx(M zn@?1L3KBrWR1%2vD1j{+mDuO3VeH{tUOpeWJV8-<-<%!LhWu?-Ze=(W~> z1h5<9u4i9y_C~3uEP7#mM-l!l?`3N8@Ce2piUT=bJWGCt7b! zOwV8*%SoJRAJ3U@c{a*_(I;4k*2z8ByA$X|JH6z)Xox<6h_kpF;4swhERMd)vc7~@ zkQNb8fAab&v2fgs`YIN$-Rtz$;K8Z`v{odP*vdAlxTwe_ww15~G1XeC2^H(O28&{H zWKDulg6b<$saWPMuRvObw4PY377EaW0Nz7TV})uOD;5nO#GtXVy`ZrIFn7_PD`4#c z8Y^Kog_4LG;ZPr0@v<75M_@pSfd2tC&S60gs(X9~HRumJPYoUZmIFm9ENw{}2ja1& ztw>OX#gbQHNlP1rD1-4UuTHjW{kT(@?w(fwj0`f$D~yFURzQ3^zH@b)pGjSqn4ZfZ zGI8ey`4qtiFM}<;2z~kn!LHu(3V?HI)vfp6SRNmk_1sWYhR4fbaTR)HAjDN2tX>E9 zNLvA(PqG2LmRQPt8Kc@mg$C7wiVc!%&LWDbcZV%Ejq?LqiH58&Sj)>DEm_P%8 zqxI0GXgwfuu3~dxh_Av!?1J^BFam={xaI+sXzIX^v>DOTY0g<0xdi&F36sde?krKw%V zdrurYdSrj^aqd-IaL(XkHbf>S*tq)P>*tJHHwEXm;@S_isB^;;Q}}%May+z%nilBN zH()JHp1pWJMMvgFMkZ4k>nOO$LT%g?aTA=sO@d-#f7JenVrBpA_>T)D z1iJ?(byK@X)V%vqz%Mu2mMr8?1oi1k?^PzPAn-KTO1$*fRUw}DB9d_ zhS5eTn)@4I?jPpbs#G!UXR~oLpZl9(?q|d-GGdV!vC53tlxDRBkcmaL_0otk&c>Qc zBc^d#-F_)IztAVCJ7A2WY$edbcMJi4E{QHJ^P|eVoZM3~=eY zY!=~FYH3A&-o9md^{%_d^K#-vRf4Kn=w&bOE-$cl0T&e`xc*}3nK<~+rnyse?B~DQ z(E@_%SoNqqt5(?x{CiMM&Bi6#7!p}O6GJM8;kswGb5lHeW=r^8&*bDj&6VixjdC)i z#Z{&ifEzblJ%vPgGUL?m_o7G3*v1+0gxYlJ&_ny+19onl8>TZ)rS8KEM`n}kiqhGp z=FaIg7hgXQLn_I5pDMv${0XZ0pM&$@7L5119vzS>CK)8naQh?tKh1eS0OTD7mW_Ei$-kU0kutgL6 zbEgNQ9hUoS-)$o59s4_||1`^VI#x~C?R6S09A-o31}X26(WUH1HOl;1~5HnEue3h>jumwVyPc6 z$;3(=qyfZ#HfNFhGf7t3K#7HKW3~Y%a2wl~fb>8VveHXxTP`6BAgSIye-KX?WW~!8 z?Bj~h`_%m$OP``841gEc>MGPu@Sadc?ov-yp^LqT<#bFcvi1)jpbDvKiT zG9gRUH)?SGb`4=eR$yQCF!)A%1Ro_Fg0A-jN#Cm_eJ@d;){?pi%F49}AHfKX!bgbu zQ7wWSB3SeY-_o2jev7Dot3~iY1S`B>6N~U&Ey8yRIGg+~QU8Hx?+9lS-$QjMC};_b z`(r5RzjH4F;6c)^D-``$Qz-hG?)O~V6*i>=F39(#eMoS11;;wv%rz^nPw)!pO^c+i zt{rPh0F8;x-Y_AnAs05dbZ($f#v4Ptt+0c&&HyySV6p4N?Q6I`9Pq4&01QjJVr{iYN!>Dl zbcT3uc;x|o3%P?48w%H^QN<%~*kIkqHE`H>cNY6`v!HSVx-jHgL>65KKLZNqz&f*S z)i*X&k{J&eShG{crdd;LTs<9Q&qahwqnQUaM%J-ufRUS+noG5<&TUkS#`3it<4O-G zA;~L1=qxE}${)Se!ZqeuC@ifCoV>^M6esiukjyqVoqvG(=PcY=4Enrd^%Clv4y>Ds zJhQ_SV`GykJ)69H2P+m2FU@1qTuUYS<_V2w-snS~O5HzOu_%F_Gi=CEHr=p7(e+YM zR)OHFt!4FB)Y-`p#--k{$I^124C_WN^zG30Tx33n6Qv4%X;9_YG%G z)3)Yk(p!au2IcAqMoj0%^?g+?=TDwO@7Cwf=oy7p3RI}{~thZa|3#*_%L?=>xaL81wz@~Mr&#MiW&1*DdK6tJ%m<=xhU|)3+ z^M+R*=(T9t#l=m?9|_3N%H?R-A1D}Xb%w%zIUe-~02M?IhC>lK7Vl)c&1jtMJHzpy zwa}O3DEQ|K`lB&taZ{8#{jfKUhC_~`-XKRK@lKmz`eVD+a9obWA|bYu?d+7pkw{pM z_yc~qGZF~M@klhtNRVAcV}6^VlgR8IHp8(__u@f8j`~AUXYmlkHpXms91i+fslu_K zwNM{E86P;n5DQ7sN?IZ3UzQ(8$W%Xfr| zV^lm##YrkoQ*nlhvs8RN72imx_$ET-huQBV#PTp9m3$3r7l_5`$~qV=Lt2k?E7Iny zL$vrBBiU_j?00LN{R+){1flX~L1?~({dNmN>t4p8b$_-;Xg$ELs`|1WjNY2<5SkAO zVyn-7>H)_QV)5OX-Nxu$*=<7eXn;&kQ3SMVdmIMmmmk0_iOy&vgCq_0N$8lnrt zgten?p;;idTY3Z+v3G-7qGMYR+sHaSdj&6X1;AR$?e7uHq{Q7LloF4Ed6aVCjj|vn zFYoCQ+{D|~BUnhq-X6Byt=!imSV@%^th=jQSdIdzVS9%PvLALOwUtJ7B#CWM4zoRm zA5J8ONb5M!HYY__@#At4a}=NM89_lg=GG8yhoYIKM;3FDOeI)QCHSUT;7O}j(b zt@b3%xrCXtse4iPL3@0FKR%%LC2b&%XjA)9T~U@5&?P(q>WcQutydt@k*mZ@2CtF| z@sxTj>BuDrG%6H4kqnMSFYbh5_ZB;sHc+d+WYABIE8 zl3b#Mr5nyAJ!#LdM;$>OMoCtVvV2oKU&u8Dxt>+eGXABx{!*R)xW>OtoyaB11oRSf zZ!S?TaQ@RtZ!Y0w{9naY6lDdht>y}B=YZ{f>V1rDMXtX>XL~Wv_SJd`UjtU|vLY)P zuw()bl~;V(D$uapCcNP)X(NnmXFVH)HcDDaR_EsXt3|ZIdJ~t`)Cw#Os#;zp9nzbL z%Gz?(LZVJcR1x5$K1@brmTx`F_d&9dXb?&kUVd493kXTfkToc-K28?p{WyWlfo>Py zK>)H8&aVu)zhk-F-%Y@qWl`==^4zzG;Px_~`+JCP66et@!PF1n3nrRC^kmhaJP%KP zk3Xq}CpP^Fc%)Q6fyLr!?D~^W!IRJMCz!^e+Yr78PyUP~Thc8D!F-LiQ*izG7btw{ z5&nXxUnZAw!!7Dp&`=G|3qd&bRY>+XB)KiIO=uE60XUCVaL(D5Xv6!1V7|t9?aWKM zIzZC(cbcSYJ83Ng-$8$G@RE56GAMyW?JUu^wM5@0>g9YQ^sISByWPRkdp3Y!a_899{5cUC=MUL8Jwkp+)E~jq z3+E*DC+uQU1ec=RA=1xCvOV3N*eSHBSMgC|7rRv1WeY_A1#uq|giHPf|DD42QF*(6 z$2p?@lBC2*lH8i!`T{yx{S`_2SyC1P;fbvz;TPN7CG5%nCCLCh!SI0CR%e#g|232V zx^q?>3PKsuq4A*lCXqdq4wA^&y^S4GSP<<(L?AvPDoCwDnZ#P~YuI}~B3|-uyIjB`EF>#1O?ae>ShPB5)6$P!*_GBX2o9^`k z0j<*gEUX^IO2dvd4I`Iom>G>i@|YN-@eR4ZF5)qFBP=DCDxMkhEV#fdD4do|OreFw zv0+#~vjwE?7LG3|UFl+rBzo>5>W1xEzv|giJ*!1}X3J=zIk0SSW(N*liX))-p_*+w z4o#muo0>_?Ot5{+@PSubYC@aEs72#!ZHlpEq9z-x<8?Tg4PQLt{+ekn%-(HJNb$-zjdvvgug zA3zRGPoLMYgyPXi$@up;axfeWyU^s)=5=^omBd@- zt@Up6?(l}pF>jZ-Um`YQ4N_v#;AjXsK9#Igwo?TqOQsUAa-ijudZ~!GG^CoEYrxu4 zLa~y#6~s!GR)n=_qt@+IYzMp=Yk=CqRE$u2Cv~7e$#OFl_gcb)I&Y=Uqu`Opd4iIY zRJ@InJ1Dt}I+N6TH?<90?iLZ1P895p(yXkIa_^RGB`K%7vOcNaUeOTD${l`E-WbnD ziPL$@gHfTWhb?gTp*+XEU+g`QIEb_l=^>%4rGR0{WAB~@fnoyx)XQeoT6T-tR3_kh#vibZm_vg`BU*ttnS&m@^-NqZd}DW^SP zA_^)d&-RxP78Q&j*?$Z21f1S)#QxsDji~V7Y9Th%IV5<*4vlBkX@*}{~1fL_qBK@%z z>5mz+J>-uG+vd-wx3H>Ub)|lq#-T@)W!l#;%uL);;?VS{QSZCCSd|AOb{QkOFz6sogfoYS&s+CT;CcA)%ta$K zo^aRoX=<3;ZesyhnM%1YRt(kG{CV9C&!Wgpfw*VsJFOcUCALO=bj+mA!uiuoexhgl zWZ1Xj?ra0bV0<5d6*~bQNwo)*uQ_I%#p~uG<;{Ec4Npx?&-&Q5-G?O{pP8PTp3C^s zb5s1|Ois*R^vzCdo7#*|^B(9Mx#)wkwsV_i-}H>HC(X*px5R8y>jSpuhG*_gX`F*= zRR_AD=UDq%MMT$1G78J+ljj#DYhNpw@y5G6k5$KlyROezfF(P@1(9x7K-xt_|6RM~3TDgp$d04QvZEHx9wRGu{x+2qZd1-2%FXG)b= zU0YL!v;nCP=@z6-#AdRXVF;7Wpz$hLK+6?OXV{1)TEXp|#8y8xSR~0NbU0VS?Pns| za)_JIfSPLE&rRx0+%)f|tHexhQg4Q-d_Jf7d_#|NK^EySL^2D9uaXjSL_LD@eOdyA z*n#<{K(MYJPtx`>wsw-#lk;dNBT90m?(WSj45?=@(LGX|diMbh;m^*W!mnb~wk+%+Ab>f+9}dNPijg{C$OZp8WRggwAIj*jC;`rh6}fzL>_$7_7lV zapa@5NBqQQzeY!qq-;Y%HluXT#LK&ifV3bGHS4)q=kgiv-*ownh2S!q-c9q;x6Vdj zMu$LAh%F*wr}$v6R$xBudMIb^ehXTK=mapf`WQN zs3xNe9!wyPOl8P~f){`ld0b z<9aMZ24o=4;yMIlxD#{d&reRIW?cF!oWOd`MAm`X)mP}p8kfOMm-f6~?-|x9j}#Tt zoYA@|4{c5!fhI9tB?rW+W z{bjgKT}EO#*7}P684~!qtcxDPzx+JgMXWVTAM5?1t8VGD!rai+v+1{(o#utt?E;G? zyH~5wjt65AInwEm z)vPiE${ba!N1TDJ)#B9JV&W#G?bp zjw2mJdJ^d=q_-ix9qFA&??ReHdIss;NJo&4B26JpBOOP257K*yrQBi_M0XPil!>!j zu(5rQqZ{xFrD_ls%RW%+Q<_2T&eQ;sXxf5;=2p-QwA6x9o^>0j- zarO9oT4Wm~c~n*hK@dA4CrpGzR!^c=S}++*m@(kCOG(mCgoXLN5}FvwvI3IITVVfG zDck~*W=2fnEi8y_n7S|J#_ej)rTKA(y7$t;xKrK7A&j^_6~{;i@NX9fM3+U)5|0C= zvnNeLx&$P;>@AdT_TW|A9`IExJ2Ior0HOh)50cAjWMO1dQB6@a1oC>b&NP??MEf7=$Gx`5D50Il9%AxP?5$%s6n zK2kMd7Shru#kK&NmeDQ5Sj34lB~`psu41s z%bdBU;77FBA7Q1Bl8>U%WNj`{OR{yB)!!%czETB!cF!MFKTeYMSTFTxPYM2TJendK zaCniZUnGD*WtG_zkZ1o5KG`Px4N<>Nk_}Bl(wFcFxkLlhs|{jp(WKrGYo37Yy8+`s z{iI!5OuMXM-hW?<`F#S)X28!F%>hkoFN^lCgzwFNL;ybH-x%!?e@xKpcG}6C?Mv#v z5#COr)m~PAOy<+B%oX+D$pR?j$&3?#SpHJW@Rz87_@AhN_$#9RC;PxWYy8HS)n5_B zoJ2jUUz7O-c(}m6Zll1y*RP0%lj$n|0sCCPAs|O^N$j2az!Vl8K=%r76x$Q(8^woS zQr{%z+7CccpKU+*EO=0TkOlMsOFiHr7SIn(74IGva|bzQy(YNbo@`H+r_237K*(Up z3vRz^*(ki%3KB$J+7K09_XVmyT=Z&^0nWc2V=8GIiFtN3|o) zjV9QpvuwRFJvZw*&*uEW@tNtlv*U2=>(s)vXm9_WcqOAm-ki`xzOcd5HrXHi-6>@+ zH<+3l!YcwkB`qLQox6Y6%=uAkUp_>^mg3B4YEay0`FEp|`C-A{iK#IV zIK!${SJvWQh?Zhdl^U=x^fz*zD0;QujjsYGJxBAtPJcHBlk=&mv6F0*FsT>oso$Yi zVEp=bTzj!r2=BRO&W@rXdDRW&>s|p+#FZy74FJF&t6rs>g=3+hXXyu!BeBkqvv_2Y z!)()6z4Evyhy4Cn$&xlEMR0_Z^nzb9-PL@!D@Go)|qP{d!rIjjeRM|n5omA1pvpDiiWo1=wd@i1m_-DOPi)+} zr3q;Z(rrk$BW*{z3#lJz5NU*z2#R1aTVOLOSaCCFgYBDWhkcmj0DU6a2^%-X1)DgN z8`O!w^`(`RpzF(m`)_N({r9${2i$*`XiK>#w`_DN*IPK?)|YQDk;wYHnlb&WUV&Ag zA-{t9Jfc1-*eESXVWm|A5>yr$l*@I1=AN0eDD;$PXXa8jZ|W^Obld@bIkyr2AzbK! zru3zns|DkbbYOEOTC&o_uFS6SF&ql(hb?`Ze&u5Zj_4^}dKtsvoxA zQ@uw9Ihty@u44*gFf4}An3Jr1KckK@A<9o4swbFJyH2 zQYeU?Z>Fe-Q2$uO)7LLI;8~ny(N+lkEb5=z4}HX^-;K5VM&?lMWP)p%a2*jJCWqkE zm>Ym9jLf|lC847zXfs~MQ#^t+1^mJ7D=8L7aS-h|cYl5iy(T*wZI@)@^^Ao*wz=9} zc`9G$eiBbE_g+Kh8XwsFmG|q!cJ?^QpB*k(e^vezM_;vypnvZ*Ik%k-xZXJ z^2`dxG`{Jyub8uMB7;gq!@fcmpl4Lf-m|o0x%6yw;g&)rL&Zr81e}v#A;w650Ig8=Ff(=fdbdjN)_Xg~!_y*R8q= z(}}h4SxV9qGnrZAYCy@1Po!tJ^%yk^dBKjSMpF|P*hhvIz`Fj?8TMK&C#Uisf0;CT zL%EKxk)OC1$z&Xu)70!BHs@t_Wo{jIL=QN)*_GI0&g&4Xl%!Qr!3 z`6p&m=UtiNNTtVSrq8p^cyS-g^DH0uENsN)ZQaZo-FdL?#0!XK*Dny+m3QQAeN&^; ztYX-3u5StkM9ET}ve{x2d+~orBLDxwclbcwJkh zW9gd4IqoF%P3WjAD3z{Y?Rn^0hY91dT4F_UaqZ9H>EsvZI!`V8lTnK ziyb%QRk`AWmGo5$)~34UbKc4`zESy5p7$msw34=?>=vz`Bv|7?;YNxch38o z%82>B#QQ$teV%{|OIcHiaS+QiXv2s$DxvQQ;-;f&jkBaxx@>f&wbpYn&c>~AudVphkiEk#9K0+vY3%h=lQ14^x_pO9VZ)d;n zVBzm#zwc(hPqJrE5nAycLMz|T{+=bY>N)o8!|d<(*xyG8wfsK&{TN|CqUDdkzTi{r z{&Vc_&)6SJCw`Ir^-%IR1nf`6zhf!p+1~-oeT2A(tO%$NR3;FQtMSb; z@s#e!Ze?^Qqb^r0yGwSte2uP~xFC2}ylc0-RbT;!ctAG`5IiSX>d@)zpy+9BOo2>z zu#0%QCbEN!PD5~L?`(GPJp4XH*oEMEn6MBrfE?j=PaQT_Sfq0^6v|mmkO7;!sWLKnLKAv#Nm<3x@3<~LC7cw-NhEr zpOR|3g?53+<)AvH9O)Js1!5ZO5xj&d-GXSf5_1Zm&MavFRI^rr=9TR%0Ik^(LCs+S z)hefBSnv>65Ol8G1LJW5W!wpqu zS>PNZo6{!Yj}LO^uC`}D73%dmu2Z@AdLyEfEW94z#$K;x5kv_Tnrwp52G_{sf~QOn z)HlLIatYC#%wn4xaGu_TVeAXE0cMybZ9xsFhe^_!u(Ghnh`W9X&eK~-(t*fL4uZ%{ zZzBiD*37GIcF`#im*9pmL6Jqp)X9qc6zcM96`msMdq@sUlGA0NA=8@hN^R|=_(%g`K8G}49Tg9RoN&@{wJ7xm+&WqF(H3O)X$P+ zb-LQ)W-s|U_8LiByT9LtZvvoTrI&L3rDC@9vif;4Z^*1kXi3y4ZR!_EvNl~i-!fdM zeu>Pd>p`Q-WKv8|!pF&JdF5DMaRRhU1iD)Sx>deR)cHd03yX5UjJeM*jL7|^O15-V zQLm5@#ZX^*8NQ;Lo6=1$TzCqx!G29x!FyT3B~XF_*SIgB zk@_QI4l-~9de@_3vN_k^OdtS|wMs7m;#%SLOzIQjh-sPEdz&6y{Ce*|;H(i7zTUe; zRt2r;*7UX!Q@S4Gw6Qo(vS4&5peUyI!#lrUyyS0u;PO>+Sa?PR#Ixr`^%=2A$h_pP z1D&xCh{^4Ut(LBXEFVs6N8qj8moqQrcn2*1&dV>W&x%8)WJ!OCFm6(xXUVTXBY0p` zc6%9<5qY8hfy?TL#pI58&IEAUo)?3%RPs+RzigJxlKN3`s5aT&(%(+TYt`QeG%p+2 z_`MOz_$gFG8x%ezLJR#gqbJ4Bi0Y@sTzV(+gVy*NvGu|g^-oxF=dp}0iu37RzS2@w z(SIr?JJ`*9+MnoPeVP?X{k+)1V*k0w8d#wH&i(*zU|$xK!92I(H2?x9QCX~bu zwe>+L$rY_6S6CUk2+%X)cNo1}`ah!j9af(316S1l!%D&ivVRa4utj(%%kO(EKNj`_ z7A4X?Qnrl+{gXH%V>AC}aUqwE&L=vx@#cqkpXelQ?k0BouX?;6Y4KuOydU#;fVK8h zD5eA85{|J_{)bk||6nCcldEF;S@o*;&}CH>4X6q63mz9^@^f)MDYLtTOrB*?eu*_Q zuUE)_0$-=hUjJwC`u~f_ZKYR$`Tyd_c%yWc+$%o7=t=2KlKMu;_(|R*VMRP7>EGlL z35U9qZE$Lel-C~>i1!+E)=wVs^g`~|B zUjnXfk=5m2L0x`Rg1X#y#g}aa7`{Q_o5=s0lKL%aKCxd&?o01`!Sj$HTqPI9zmwFz z%ZEP9QmL1u9Dvxp;OT%Eua$CaaFvq1xkN8XCxE58Ac1r81Eo$@yl+d%gXx3qS(4}j zgv3QJP|IR`S6WE-CvIis{71dy|D=`N4IF;RIXuWY{ENhK85I*~wf;NS&|%>xlKK+~ zhYo}W{Hatla2#U1er#xYn`ER5lrFC3U z|F1Mu-7;RS{(G9)!aXH5>)wj!_7h4ANEnvhx zjfSyKTsr0GjZRy(p5kT(0 z61TI0Jty;*d0qxkM7C5i0SN5JW!}m@F2l(3aasKYJodsE*bkGm_V`cmG0?R5S-JfK zY_^u!^67JO?gAo0z9=uS?u?!Jiu!pOdclI;3H}^7RzOuJ8OOgyjw8Zf%j(x;eJNE2 zFlQ>rQt-Ilx~c~|mBP7?A5WtSUje^ZH1TF!$5NuZ2owL4VXQ z2jbzlQ8Z`pejQLa3ORbuG^0I_qB-IMr zjfi5m0C*z=0iy}Rjwt9`w+MCw3=crF3!l*Z7?$?idp5L}o{$Q{M7dk^_baMFB zueOh&A>>GE@Z$NDO|OooP-v-5Kb&0Me)y2?{k?CcjFyIv!sqOPgA@=ZV!08`Q{yBt zuCeuVD=x;?l@e-aDCjfu418YSN-^OfDp#G++n)nnMCs~lO)DjY=x~mVd7##l8IkZ< z@o0J&>;f+u0TcFYpvDTR7&G8+KVt|p!Yeq7Api6I*BBNL|dL~3$O*HQDW(rywE zQ9(-2@KiReAq>iFS@FH_F&bfLz%-4k|9&!(ov zcsq12?tiE~xngNDbLUet`37t`gYAm-oE6)m9s#3|>PI-`>~3Igcya=eZ}SH`j>B5R z9h{z?%q$&^`9NESTzdICV5z6aQY+>UPWS(HHsQrg{!!?`t4J!p!%&RuY}4i^4Yjkz4V3kp3K(@B&E#Gu$JJy<7n|e z>$$u}E2v=E^;;r@dSNPV|2Lw#e zu*Upx^ZLitj5ci=lhZxW6FY9MTZs+QRo9Q3UXq+%vLrdJ&%t=c7zq6T)V&FOTgP=T zd}r>x80-Kya1kj&617mGM63i!?UV#bw6!nZ1j--@h_oqECP-P1n+A65D7#}PQ4%|g z5+}A3XLlAS&SIxYUYggY0#(b&YhIhQef{ONuTMAq(k=a3f9IUJ7XT@WqUa_0^b-ej z=gyqj=g!PI=YJ9%QPfF@qH&xKc#g+Wy}h#wwaQ~!EYTUaTPw5{jYm6CM?Kc1b;aT# zS6QP&aH6YAi^sw-EfP({ouvgvi+6@%)w8t>WEbs3Q?t>yqc};mSOmF;iH-=o4gsao z!l}g(C{?Pkcf~v0Iz)m=H~9!IssdAs^O)@Tuxb!B#n1nPW9W#-MGj z5bJ~*Mmw-78TDat!8(N6DQw+>tru*AV4DQnjHZ25A+#Q$ZFB5^$Vu-`ps*YD>Ro$; zx=*MFgnGmgfmcU`c9T$V74F-Fni6WCP>&0d79u3nejx@N!_099bBsdFQ$o!NF)7q4 zFBaed_{S3r|5-h)mzu^z=eIvPlNbZ}+ z%`^JBPyXC5f8H#A9+W?Ckw0hU&)ekB+vU$Y)_*k`WgJ&KLFclIcL=GnDXsb}6b zTNJy(e7ljS=5HhhSH+gCN*$~0?NPj}%8%@`Y7fP#xdCk#1#aw7bXMyniginn8CLJ3 zgbiDJ6u}nl=}~;FF-Sp8dwY}$ws*dn$c&!R1j<;ZdCu0W29{n|#RGY~osO=j5Hhq&<}o>H@F zo3qW;!}IDT<56CiYI7$w)YkqmXE1*X@pr~)V*Lve?c|AC!=Sbh>U33Lwhwh28)ksxi*sE99KuCBZ?6{{WNC`2eE!vIm**AZprQ z!Yg|R@(Js*byHbqw!Tp9lH5WWunXc%J)gTYh0ocBn!?L38}A@&0v8q&n-Woh5d*j} z+jx$cMvt++##B?XNf~N1K1$&TJzy2&NwXkNQbC?###3bl`7}!{&Mq!1$Y-p8U5K1O z1%YR?AfKm#c&vh;!5`zh3{64Hf;`Xqf~h6RCCX6H_#TCmeIPSBGWU>uw=}y{M!(4V zmZp{^mnlO_jTb2#;RSSvj$`>382y(Fc_im5Vcj$Sn)S7$mS>l@DCo91lPg$qB_C=r z{uf0;Bmp$jwH4C-1E#&qWM38y4auHeb-EHc0R~GIL$I&2tCOv4m+?}1_-^3 zgz`MKCc8%V`+dA`4J3pDK=h$C#sl;Yl2oDrD=hazTn^obU>@DT-ouUe@KjqN*@pAz z5uRF`T`RN2OsA6TIGG)?Y5HXbiN8jPJC(0P;)Cp2j)>3S2KSKq0=S2@A93UBoUS_a z6)z&=D%2ZN@}Wz{H^3|DCPOS4R$3HqE%C9YXPAsIjQwp+s1FS|1ir%ysphGRS?9{$ zW}b|)R(LC6AAn5F|AcOT!OCVpGk#DcNTeX-M@VZxM<%z!_+uo7h#y(!3X9y2xP|)B zuOZ2ofaIUh+EcBmy7RBG-cuae@-IT&Z&9Xrh6VGXlkn4`oK%gA;4!Owk{OqHsaM^_ zUd6hdu6#Gt_@@|qdYxkosTn`x#MrM)B0GbK=T55rRxI{ka5AzK#|UU8DeLTwGb;T5 zpy%gv8MX#3K#i!x`iENl2x{>Qj+~4Op#rk@FGqphg_Lmf~2IrX2Y<9`G03H{%| z9kTtF8~;!m1pmiuknBe6+5anhwi#=689HMT^(?NGD|;7dRHgr0*1gD^{U=FaBlYHQ z%-&pv1pXNbn7uiT#BXMF=@gLpH>(_*fRN4jEfEru(0>piTfZ;~t*{9FmiG%FB>F|a z%_8()G&TZ=WRiuJd5}H@Bg$LU%j_gOt76N%O*P)4n%Qm6hh8+!s%Cp!GTx?A3lNLx z?dnvjwQ$j#-IU|oRH}Ueb3@Be?^dVC1{Bxy23%ZKxmtcmH6B${TMEf7Eco;}h*5_a zEdvnalV*%hLP^Hir>HznsK%$%)Yk0QY(wsn@q{b^jjSgr7)p?eXX9tH%jGKjloh%Q zBFo;O1@^Nlu0HiDq0rcjFPmS%FRR8gYF}llr;zMnLzTu?kayL9vF?CaKQ?2*?{3BT z6O2gTQ;7Jd)JW$lp(w^r)Pm$i{#h9*Kk|4B7~syj+wLanFRB*`LmuNLwa-gUynV=P z{1kIsR6>JYojRC0kUbDW2d}mF7tvt1^Lc6a%G1%ovGm|@3BP^K+#<2v(-NI{jTCv; zm*)Z}%g*a4)U;|Xo;#ttJnnqZ+E2Vzg1a*+Y+|)XW4~jp_6K>1K|-UbXu7KXpgjE# zpDvCazw#Q}3|@bw&EWN=VnDO)p2Y%kDMI_4Z@Y_Eka&}0ayVAaO|ax`nlobQdh_?q zQF?+sWk|jm3vO}R$`mY)&V7J(3`F|gXz}DZF?sXd$#9#slc?rU%6D_U^d~mJFl0} z4E)ZvK)9dww@o&5LaHNQgi*XS5????;PRn`qBG?3q3&!d;zR z1P1|=ud4$lU%+Pf!%Xs^F(x$3udX+eq$W=0elZx+V~4M6n|P33H&FGFmcXIMtcW1lGrS ztZ5|qTAIfzQf{2bE^{9LB`a-ChSDbo5Ea6-O@DYOJz+9ptm#~Fq@B8}J%?JoqwU4M zYR9Gz_8`w7GaihVNSV8fV!-++JhL5;8VP{h(wvsO{f9SrloHSj{fm{R^zarY4 zV{#!?Y@fUN%<-m16R=S00a2?fHd>}hLW4Vn>f(6MW6N{sKcO%;_xQYi+$!i>J-BQu zTxGoF*Ua$B%P#L_SgpN=f9f0w;#HbO?1+z2L#Xed8powEP-r_6!dWj%1{59t__F zqdhZjpU9-gw~yUDdadM1m?gQPC3D5PcG0cOR?ih_)^8&Zt}5->SnJ%mn9KHb!IU!j z9}?AZq$eO&|Kvo*TQpb_)I5Jl`iX7Z&BTqvcLRW(?v136I*Qa)DG*evGccpVZ znan8G##dugp0B(u0FUbUMQI?E^>txyXhG4gF7UbBl3B~1>U>9=z zTz8EM%-k+vpIIUOfn@L?{xQvBT9mBcU!m9PNrn zbi5>pY8|0?r+0dX=;25_5iaT@BWFC;=`J4)5F;FkNR3{*wajZBiH?wG`dA1@Vv!EJ zHO%#JDBcm*x}xy}D$$0pAfbfT+1VA=5}omg))k6{A+RIXp>@XNF|8xk6@}+S2kPy1 zpgM09qB)AIyq1V`BxczaL%xYb!e0Dv%IU1dBaw*L#F}5KFRyjlR}i;+Wy30ayFH}2 zNJx|z<}L^0mWHj`MO$Ufv}B5csxAThXYND1Kwc?WwP4bKX(O60)s{F~n4^`Et|@?#OtAfq%}j_xjw34R)*h3Z zw1Q_)jh5db_y{WP@;3?pdO#AX$nS78pDKkrr?Rf^)MfxkNV zL$v4y*ugI%xOzoj4gNI{7FM)HiyE62ZIG&|k!UQgG;e_y+Z3f~2a-zW-OSYTyzt^`PN%*BR55EAGycLy`9{CatF!Hl6!*OVRG*z_awQaYdVkYVzdw| zd9k{!9u-nB#=o(Y|3cEw+Lk3NSh7+(guSc!ECO>#Q~Kgc2YEJw-& zo?qcWRu<;NpC-jq<83@u)wY&E{@=;*c0O2zclGZkf3jL>^`lP8BmBbZ7cpJ7rm$6M zwKL;=q>|;(b=xpDJ+YM{%H#Ypi!yX$9NoD3I5$4cQ-Ndv8tiGAL3IVO@%!AV+6%~j z?ycp}tY4HO1d&2pbgHfEVq3glJEA4)pNP@ zl;FD`$_fM_+y90|tzf3k?w{e?0;NnY!8RnVA8h2GaXEf|#*M$=eRYMQI^*Y@w0F!1 ze@PK`Du2n1U+_ML!uY?$2-O;_#UIBT<-aA(w52Zw^UE%^C=)Lkf5(w$9ISo=sz=?Z z{5`bE9)`@fz5E}!@hjffB8PvA@%LQzE~Ga8ffusNvnzmz@sAwo_`{OXmRgz8r!Hn| zk~&MSWTYzmYs#S%j4k$${NlqC$a-6))co+}myLhnCg-|F<#I&-JD1A3|IU$V)^@N( zNw#unFCtLVV|in$Gu4!B3Z)X+1UaO~(gAOp=nVYq)$c2BN{^4iZhhKO82&XbontdoSVMa zx`}7o^TN7@}Yl;TTC3h1WO7n29-&a9y6}dI!E@E~EGNx2% z|6H-9@$QiB5$UFo*|!rAfr9Ig1xvtf0xfB;mS4x!M%#rpy>NavGuD!Z&pOGvvWXgq z6oKU`mLlP#qzZF8jvNFAFY$BI1uxf|s03&WR9{K+c2&xma%Ej1TmnO=a!L+P-lie@ zuPtsvi#l(EnpfI)vnF)qtA%tttG%i9S7waECO3TI-UZplYhO^R?iqIZmE5_m#4HvCwQ!7BasfE)z~r)-TmcnkvftsC zTse~gpx7l}&c)qckB{66h=6=Kb!(9?r(K;dw=|{WeZFS0h}SR3^z0P|5Un|LV)ONx zg}ai_y|0rY+ADH~J}Q}@J@^W%F-sH8%M2^de{EzqXR3EO;M6X4Di8tf5PTR$GW*9M zWAoy=8bbHL8GpDuaNjE}`;3XSu+`v7eLktsWom)x^uvZrMt$pM?UI(x=yln@owpr! z`*7|MDZ*3^q(`?7pb1rKa=iX^;w>UIX|7zS!Hah&7)M&vq>Euxj676Qs4-#Zfrh6@ z7AZQ46su-20c+2WjmwmHb7|f^9(bkQXl=NPV~Dm~Gr{Vm7N>8}DxVCs^yeze)MCux zg$SU7lQ1r@Uez+N*!@(C)T>zXE603bwlUuls=Klq<-3aE(bHphW_Fx8H8PePKAjo4 z$5Oh&i(Y@R;yD@p*sEChD~hS7v25%%mOA<>W>YpM%}sgDETgg|WRp0Y4s080g2ZGI zXtFy<6Ec_`A3GVeR0o5DW0~CO%86j+3@k~(vC*JJG`;QBD*PB6*U2X6 zY>N|p)8nC7MC*u$I`QisMVQ5?77ayWS}YQY&)k%t=22u81Hx;sw)l0=Ho?qG_@3)Z z)IM9F(<)y}Xhr#8NSg*igQl|Xa4tA7lo_})Gx+M;pzgT7YFH)SaNWtuZ17%Zp4J&| zRs-HzA{0%`u<@%U;*qYR-EJ)rEcbcPQ=UFptpuLa!8RK&VxV7z&Q4jY3^4ShG-r zf-Mp1QlXOhRdt1MtQ6`h)XL&(gxV(5cAXg~-kgu?>6ZWOT z-X+w{aE27>R-yI?d$nT+7wUc?4hqj<;k{X?haD-7x?^fur~{6Jsw1p<%>$>N*O)52 zc{{HYYHJ=gx$qk?f4lFuJJh;Xb@irv(6OGawr{_`TBfT%l3%N=zLhJjw<${NF*>Yz zl6>dxUA^SqK<7teY-o_%dis~tWTb7UJR@zO0W56N-x>{g5pIv^+TfQ*U|8z90KY0GlUW#(X8jjbuQS5;64XB>4(5lZz%t0CTX%+}Tny!^5;h_~Npp7kND{-t2P0kP%m$_Q2zoVEPq zWwuToz08(sV^CZDE@KpH3)wDWc@^q(7uMH?#d8?r{aU{bDqNqfKMT~1Tp?SD6pcw} zh-4!p0HD)Tsiup)O^k|lSHBI4W$U*=k!x$7gL2)2H}CMzc@fKXAG5#`qa2YBp^&Hq z0p&cYmt!Z|mHQYL`94Nqh*ZQTD&k4acng!N7B>F~mhvn-X4r@Zf2G2nRE@V2iXv)Q zBp0*FMbd_>kCZX|mRd$I*-YJGyo>oOW@0KLj3VYWVw2h$HuPdnP_?%})gER$+2~{J z6D+vIwp6h#Q(9p7E6ZWLDl4Ebl$DC!psZ5Vdc~&enx29BKT3>?pzwC^%YG3TiAU1q$%QsHbE`(c;yJ?7suQ~TwQuqZbf-#3fGjUONhqs8r(V>oBNDQ+(+ zrdOvW9GUl-xcwTLXRK^Zd~Wl!;hRyY>Z0UMlIlfGu<9DLixnx^&&6bBPP{v~@>(r3 zALc-w{cc1;O8p@j1Bqx{i@-lE8jZ%ZNLMTlzEH$j8VFh>6c77nwm6(0LLpZfMc6`i zMx3yP6alV#YlYoMn@7LuD9TYVG^nW2ouVC~2UNGi1DizHFIEX&O}j=v0++)MQC%+h zO2w|au3ytNMfzV zYFvib&_=3_u*BBxB%ou|ZdMIg;EbrrM^>%CP6+Hq{_ig0rb{#Gn@BlYPwL7!RD3mh zFhbI%>@t#;55Dr;Tu*N#t!aDGt{^Ys8L}I1TKGN$`;rG=yv%BqBgT=Gi&z~l2I<@C z&YP6bjQ34uUZ@{?bD^!ydWG+9DM)2(OWkK>$}c$};NSx7D{?(9G|o$LtT<-nO(%sG z<#~V1qSw&Ynl<^@Yo$syTW;1OO&4&pBMy}da9$m|Z2JPLIt|whC*svse)}jHtjLT@ zpuxs{BZI|j-mQb_Q)sThGFi3gD%FI=JJh?7LJo{)V8xo5jT;MKJp^aDk6t%gW@N*? z8;I>SD{*buLl@oT?j!px^)i3-9-17U$e`SE623H0#zad?e`oD&%U>6!N4ksHEG zA0V=7wn1|;Jvw}9a)dggd$;W89SbX-X;sO}uBei61v9~fZ7Z=4Y;s@`^Mnmc_K7b$ zy*G-eaP!>|mEXr7dL=a~q8Z@`$CX32l0*;+UaL`s*{FIBhi)0lS?yKmR*p`dEQ9RZ zI({No4h-lm+E>J@;GAnTbN6m|nI0V|2^^G(W^CS?yAv(RO^gMHM+rR)suV0PX2H8* zb_XX%?;M3qU~rTq@X2nYd54%2=|Nihj=Yig4DZDsWfX=}y-tNi3u_;icpP?Vf>I zOXka5(0Leyv2_&DAFnJo);cInlu=ZYtDkNckqp`fOgnlbRJ)v&^a``BI!VFre`Sl< zm7PBArf{u_DiAOrMSR8GDg*#(Wc4N%Q15V66$WD^$PU{q3#jY2ZVY^sE397h=pf)vruml>{d~8o2W?< zq~-0Xy~Fwi8x*Qn1TsQBA=r>mhlP5F5F3-wzp3(j7jV)G1OmXI_Iw zwpZjmUZyBZ^0h3Wtj;fG^-3t;#uqJFx;Y<#?vy@T<0vUjt0v4>dE`<{~by(RDaOWt!O?*~fW50< z-RyAl0|(WLL#VREJGUr@5n81d?>{vs-H+;v@ygV;kq|n&2vF1RLSD6F2XUO&qAHck zu?3|+-OKPU)pGa}FAd*0J z29>L7hEN+Ta2r{xyOr{*8%9N}`a4izszKo)MA=k!BEBZ`!jR%Ra=RDZgg3Q~wbO5E zRc$Sr<1sa+{yW3F+CO2&pRg1wBpIUm{V7ZFsU&B_+uKDPa8+9ji6j)DhoAtx>>+{z z)C*I+I$qbRc*{Bnv2MdiwaRVAF}(lnyHFT%7`GQvT2_08u5Z&2;v^$GgBMaR(w=d# zA*XSofKY1B5U+G7)oU()-a$4^A!WO%Pgk68(J^U(Cy$4ftyetX2wJ8sFGjwlJT&~ zP(7e14m9@m2wGUv-^+|gSRvckuVtIi;?G%PX}_1HD*E+aEc<{BmCzRV+mLUJu#z8O z$oQ`!GiMJMIj=w>8?5={%P$*`v5R;ot=cvHSq{bg6cy8RDVSgKQZT=0Kx=((Ej8OZU(yROtG;oFlST)*l`UVn^ zFOw@+kqj9Odyc`Nxse9Vci0q=X@wU294kTnK?5Fz27I2Oj0QBHrstWdPKU$%5|n-) zL)Xh+0(Zaq7tDBxrR>Ofy^vhPdhIN4f64eMyEv6@Gk(S{B2Z&;9pv&CEY;rIuH@UH zQGO1EPlXB>lOdiA!@Iv^eUX$i>r6(Kp@{JdhW>sn8G~29Bpp5*6yy|?<5$#?iA#{P z@+)TiJxg`2ekt4e{OSSiV!xK|L_>0^NH$Wv5tY6M*grGlA6Q>kA=^FFW&ATsC0Yhs zSZ{&@3FBYbRBC;8eRe}?V|L@p7G-5}liq6lE1ODgR$7gJmppQq9cW-NPt*LQlIO<# zypY|B3R!1Msgpgt)p#>cb!EGa7Qqo9B|^Y z^(4n->nU*W=AQ=ljQSaH@6nzH_YL}Ix$${kkfW#z+vZ-|7r5~So?2Oep@bBTFY(k) z7!f;B?8Jtef3RE-pyR4!4Tn+~U*Q*b8DHh*n)F_z@<#DBAfK>5$BnOXxj3{*fgC%c7Lsq=s0Ylc&@95WR{sIQX$4elMI{6c!BpjvwL1?-H&G1#V1n?4{Jc?7n9z znf6G(1WN%5`R!H8)lE)zX z|KO=xv$rNwFarNyQoY1POHI3dnCQQ_@p5@0w5^pV18l0M=^G*Dn^hU}&FWs zE%+72-mV&NmtkiimhldC3cKXpgk_0#zX~u6Q~iZxKgw4jj4aButOLRio27eLH6BsT z@r+-D_o{LvXIJeq-meyt0}82Js)!J+8Xq)MeNfivgR1c%HI*q$B{MK@AH|XfN&+V9 zQ+K9r&fXkC2l#X?Q)8nUJA=8p104&<;r_n|w%Uot)Y;-W!cFlscXUE15$;ef+ zMD|RJY(m_)PY#ca44YXvkKdgho}hbK^CGv5{du+fS})z#9^bZa&;A>C9Ny7>?P5-Q zvQJnlidJlIE;BKC$~xfY50YVrB~nk5k=U%l{cnXWw1YboXHCAMk`y-Uc|+r(CUO^(+f43K#@r4Y;?dKg zfeBRD1WGPxM_Oa7sIXbGBMlQDHOrH71}BZ37nc7@6h6^|i#FG}Zo^G)4BtAGm=Q-% zg93cxH9mx9+;GE=N}5?)VJ$nqTQxdS+YAkRq8P<`Oje<+zsxGxdSkyfp|Ec4n+szi9~-_SLQfPgyVz5xl_=$ z#}Azvhwigv)D|Cojp%=ly*7l~UmLP^m~xZgxyM{Ka`(U#J?To1jEvpAee7g4V9^(!-hSCQu5@GE;_2C3tF?z zERt*1Xl9~)hCHFQotYdaNzyV&Eco{VTLnqh%}8Q>N+*ZAOG&(kcN{u=sQ4vUNS>z1 zWcgA`(?if8iJU&KR zLmRG(TvCYArT3L`ia|V`W zDB>%tRSwNETAS|83nXPh@)gB=ig1>)tZu9Fw6nKTRF|q=it3v&D!dcZURRh6Q3`oQ zWyT>V*9#K2*}6blGBvhO4#EPOd{gqCeMd1l=} zQI0X!z5D2J=I(72$?pE=fPY={E{cf|SR8^<2*xu_jAsd* zxac*u?bcD#u;qSf2y!@+^FobIjAwE=SvIfy=@}cl^JIGbPVe+u=*is&4;|KWnarIP zC5ap$hL$6H7SM<$5j?gY9v--}>;NkT;9RCW85VxybxW()XIcfV8i}t zU#FIid0@MipR*gwzaQN*_EqL~%UzziEXf5V35?rQR#LxGduyw zgXy4^DmXf3JyH*v(uq~Yg`y-U>!XU5o}2cLQMw>dD5ekYH#5}^L0fof(}q5jo6F6$ zj8dijMbRM~UFq?RZ$SQ9V5(v~lZAma-kN%dPxE>uGbFHgwK ztU%qo-@{uw-;5=4{_~^co%6{0x*i&i&3R}zHf>op?Jz`RuHAcJ&nTBwK_8^?j24T= zLmC{Y<6111NNBN8D5S*`Xw@~;6-M~lNT=2jPK50}!=r;Juct*iBMFIXtHnDZNmm5T z!$xCWdN>q{VwzA#REu^*5(upu*P`)Q81=O}wP>UxrbWYv4lSApCs4&7({zxiTRg1A z!_kPV?E9`oJHwrpJi8X{3dLMyg8_@s71Cmna2LwMpjV#>Fg1-s)yBq%Q zfmr$<<~MQM=0o?f{G0NODeBu8iUGZuVfL%v&iFgnyBG?c6ul3ZypNQ;?=5-XSMt8U z;^ryVN0t#-K|&G0h!7R945?%$>eruyhX+t#BvnO?g^se#dO zaEo$CVIqm*LH33oMdc3Xfi22rg}JtEQ(Vlw9L0G&oHQ=Ihf(Oqw;F|h(2#GF!YXb> z`Ju{cqE^+gP0?8OOC^suC5TU2qc7$QBJ4&F*j%^BO4RzZT2V2yF{ zNp?s>21Xsb9WV4&wbmm@v~HR`IBOK&4QNzzveX4aSXqqA(NikoCC>LvBQeK5g2q#T-xqsTJ+k`m(;$l`D}4ybLCiah~2{XtI(4apMzg z>NJWB7>~2573nJD$s(pR7VWcGw9hd_VL-FJ$i#UcgYajlYym3UGtBr3#VAzefX-K0 zUoGMs57io9V|~?yp=#qgT+}#+F?8gzJ_c=y21DkLj%BO zncLZSnen_#1)+$35x8W0&nojD$uj?l1V^kgTNnq@Vy_FkY7+$iIg@?$=M2r_!plO{ z5+HGj^)(iT8jYW_La++uM1Cf7gBlc)i=m7^N8)azk_9TilwwUUUS>;_zh=hYuvBxl zIU77@p_kC(l5?jkk@nxpw@dLd_$(wso4OE?T&A=df5!^DP_`zemRcQ5 zt_I(KV(GouZ(*SKve^bNv&(EZ%X2isYl&3d$EONtZuxAojiF=>N+bDfnr^$qA?3UH zg;0y~5+;5ZzszoApXA27c>zU@o~gVKyJ|0gh#L<{L#caEhU7iGa51}%Bv;N=#-Q8} z%K*sZ88SWm2t23St+2Dnc9vd8B2(vhD%5tgH^flbPZ}1*jLv4mHBX?Z8SjgvqB5vA z%7!9-oD(0mq+|l{@DYlVT3hH{%Vd;J2>mE8$lQbQ@G&zAl)%cq7#R!kaV*5GRESUV zRIE3qU}=< zqVaVu%}7Hiv==;%oEhkU2;1Kzg{ zM|yI*viilLZ3R0ER{ssq`abWg!-UBl7+y!=h^+lbyw9IXCX*QIr_iS%^v8Use+SYf z(3U^5;tctX3ug9+u|6d$zY{8d5wiZtm046h55)fT$|6-g4&g6hgH_rXGM{zh=UBPF z;usM-FS`qc;a0XNE0VkQR^u1+BH0UB5n_22CW}L|zr$p|x>~aTEnjTQZp+?4B2Rx$ zaOYN@mof3Lua@|qWS)B<&;JLL)o9SSAH|ONElD@+y@V6_x6r%yvj5=5e^T_*G+6&@ zCe7qNwbi&^#Yqi|$KLGTvydD`e;|MskGHB*!KZ1>L2L1nk{#jg)v3X)@cx}LZLqj1 zq1p5O=VYXJt9>miVEK5D6v83Cyl%XYaLNHFY?9ICUg@By}`<^r)I&d&&5S+ILebI)xMK zCgY=O-wG5q!r8IHIIs3?Ox@g~wu1QtfjT zh8%wMKLLJ%z8Z2EPhrXGEQtZ#h-8%1=IrKBDxFP}LlOhG!<%~Iz76tg!P}0TObB`B zyGNd!az%r>p{wKBnJK$xq#St-0Bp^y)=$q0j>DU;w|Fz^x#XJZz0(uS$IR}?YXHe; zmgd+MEnwN&P5h2+?e0~t$>$};Q+w$K%o=2YHP_-+b(bZ2^!J6IOC?)hW(F#qGj9sZ zbjOP*1|8Q?$FepmUhSFJWymO;bMQU-`*L$dl{z-9dE{7)$0Ax7btl7#MC_W3$}&Dx zQM@b`PDt?oN&^3PqC^GPO$98|LL_4QII0*;0#!jIATmg#+enO}3_jd1LBz?eK~V}5 z@*k&(w35SAGOWXC(g>0vn>K0CuKQX`+)G1oFP(v7B7Y!)!00J zPBo_-<-!v~0>b3#{YSnMwpcr&KeU_Z5AD+@&^>im;6s==p330`ug28BNb;CTa(%HM z9ddlbP?P`;SHe>`2QvdB>G8~9&pqy9vX)46-pCWv)Ua_PbziND##iR({ zEWvJw#Xg>ym>eHP)Q67w&^uU+ZqafSp(E&GF)|-2MKDz=hh(?8iB9fDVqQ7vfx?|d z`Z>!Moyp;1!xdN1B7BbPD+3{3IF6q*L9L7HlUMes1$JF&dA5#@j!ls2Zo?J%tg{j? zziJVz7{qcuUK}?o=1L%=U<%*y!D&5Of7L!-b5(-VDIit-I9?1dxoV2h=~mQz$EU-E zR9w-VSI>NUN+jw!UK)cnvktM9SEW`;iIhAU$vMU6mXP~+*<(3syPw9@jV_(*P4q%$6Jm5m=Qn&?Pqkx(qA#Y3HOEfNlQY2mJL1h*dOL#HzqhR0B+ z7U}2$Uk5~v#Uo)Y5{boavJJ|8F2Vk#E9^qycHJJ}wKlth00*6crPCk>*TaUy zD;UbUYaXF_y*}oxgvV+}1-NyNdM4PSMNHTl1zRjM&C$$+bBSOrf~^p2rC_Z>TO(MT zU~2_y7c3-LRA@e-#e~)&w1m()h1MmsZlSFg+6JL-7J5SHTLkM7+IFGs5ZW%Gk&d|L z6l|}s?IX$3W^XU#KPa>lLW7V=!S8n5%_RUlK*PV_w5GfB8n}LPtMV1ht~cd1#lB2Y z^yP4pSOurz)rw+=O@|hSzpbjWdYi)5wBL|Va;06_pHJS%+S?C4kYuZC59NDVW$lrC zFIV){N8ievP7SZ4m4-4)jmPG+*O)G|+BiUNrp$KZP?_zH`@m}6~^BABxSRf%1#Ta?vKCvzu|8{lcA z-J`dGetZG4uITsCt$#%w{UBoj-c=Ddqq<5OV{AiXje#ig2x>c#D^RCs^#^PkQ``r1 zm9ZMsW8jNW^H^n7tP6Ld_0`jnwN-5qY#%S1x&WX+U%$qenPCu^av{r;DycMBQU1k@ z@-KAVN>OYwifTpqPbT#j{*xL1WkwM)il*6A?MXcRJwO*ecGMx%k=z6PGOJ+^f*as( z0k>8?%Z&%|dhe2PmKU;)ymLS^-o`JUBO8Tp=P7%yT|u4BckzBL>B4vqfzP_{nQBqK zaJsSsFI^k7_n`i>)ORJ#y@&b5l$%shJxMo9dRZ&Hx0Fq%YJUFm%f|aTs_N>fIQAfx z_W%~x`C^N5$vB9dfpe8vD8`{aAC+UsXB@_hI?UaUcS+#SR-CTv!Tf{D5hw&ZY8;Wl zK*l(V6_fXtHzB!HWnn7o>8+H7IZF4I1*lcc|Aev}!x)koBC$97;gmg)s>)W8HZcUQ zgur14yaQPb@+$GpzUovBT^`o3p=x8)WKY;F8WRwGG8M=Mh-U$Tt03@R2>b)Q2$MA4 z*jJaTCmQu^sLseUe1&EzEd|oIARFNi`(MK#q4zD zX^8hh1pjV^fM$l|j1MDlHMhD0{n_AYD&a>Y3OLU$$u5N~jgPUuMjWGr|E;p2M&ms5 zFPjN;{c)CB-nJ3bop0N8KDnH=BHHy6vUKdkw#!~4{?VI z#Q@`5qz>&>bxpqm=>0L#Ye&fXr1HlMIS}aX6_O#AU-Odjr)X|f^z&N zL#63rj(=00W2Bhl-_FeO@5*xg-!ex(Dq5mp)Q^$EXs_}yZk*?-<^pth@ac1SsgI}W z5o~OW3)8E778a7j>~q}s98X2F(Y*bV@dXZ9pRU|M3j_ZmH@+yjG0Si&eu+1?YI$X!#G<^kJp9UxH$V_ZIE!r80_-A&U76%Gdvn-8x z^p1L`H$5DfJL5CK`QQW}@9@o-XId;4j+8^gYVmL+Q8~-!AsPxNra^LRkwj-yN2{R$ zue~15M3tu9P`v*43AKjwD1$;UCH!6ABJcx89ya=0R_o4Mu z2jX8bKOPL7CF`f|lJ(O>ssgQ_`ptbw*R`2;X$zdMeKwdrYmefeOGBqfqI*^nPyN0y z^or$NKU+D=?1t}MaAjw0MDw1xWj<7A2TPP>=E0hN>i2~^Sgg>otF*P`6~?+klG7)M z(`O^jHuCr!b_VlYm4?!o{#JOa(SzjdA!J06&&_c@5TCmU`+!1c)wpGs`~Bs{iVKC^ z%vfo1=1e?>W|VNu>LJ8yAcv$Yc#%K%Ezg_=Ck|)M6qiqHqTIb~c7)vS^2mHNs~mro zElR8}&j8w2AIY4~jJW7l|1d#ByAGH9l_$@v8yP!s0*2)}2_T(w4Udvq`*!F?%Z~~e zKGVMq!eRe%kK25{5$SK8M{UcrOppgSxcf$#u`G$RR1)v>H>j3mhgX!53a_eWNsbnT zO<%E<97XK&?)el?n$JMqNO^Ez_N4CeIJObW#U~+al4IjA1rV_vs+6@Ja-sQ@q5MJY zmW3}rt5u)|1Y*?R8+v1KhWghv0jRa%(d<}Rk9V6HMCMbniG?5HT(BsNPVCC02cc4^ z&IF^$Lt*AlBqw7e$6$PnN3WwaGmdR86Z-)fPdvD;eZG`toW%TQv5FlzeGH6ePK}Kt z#;v1hwFqr_;CjY`J0us42b0>}>G9Ed7vXvjW<0oi-n7jvm;>9r8%Iu6W+Z(oml?!> ztvUHs>bkxeT-K!~Qj^_my_{v0!sKTM4i9CZVt1!=G-%CO-F0R#I%VOxZg=^}sG6~w zwM07O*Oo14yXLmO>{w)ePR)<=`UNzDHHvMg#^FHZo;z;wHL8XOnRC2z9$qEu?DK4QP{hKjKrXM-i4RL?LJ$apZ?6vs{rc^ZL8(4MC@_aL^ZdjLZ1%CwnOE=`B;NOD&mTmbp@b*By zl~*raeJCG22v4^{+|@0|@@tT$FU9+AKb|IcfZRcHGvuBicbMEe$i0)?ljM$)dy3q< z$Q>tlg51;06L+{2)wK#u;i{oDoX50q8ZGA5qyCX?8FCFpBn_uEyLXFHp)f}@4Tn5u zfN+cJ@JQ#5rQyKmQB>a+I0rJN9oc-$Ni09+WggtadVREqwM)gHm}LiU!>=`CBZle9 z#>>pcHW`~ztd}WycFEX0RY-GV>(q+0YV?4s8QZ|sjqTvtjO3Km5YqJ3Kx4mT_w6?h zkRZRakaVK8wpQcN1q^7bNxE5&$st5BaZLgbH(0>KsSAZ6uW`F%t08wUjhZ{XekJWQ z26md7L`{%v2$MA{L&h+|owWrEXcU*X8h4-y5z<}*k;X7mt1@PsN(BnpT4`=JRaZ#X zfoD8bUr5%2C%2QV&FQwqkmQV{d&am2=@zn!+QR3PRS@e9WF{42^+K#SVXUa~CgVP- z8k228+}~O#@BK`sYlf7a=aWI!>WA~a@jzK{_xa=!grg+QA*8qzD87TqjNieGcQPyM z%`)qE5x}fQI#inRL5jIX`5-esL^0d8rj`|w%NW)FG1BePHQn|B29ZC(WD|UXU1mGj zbkqA;~4Y)sHN*&&aS| zGfZL!zl7Fc9meNbYSq-mY-?)u#TIrxxtb+cQ4Et?va;rXy!^89MJ%5Smy}v4-m^?L z!vdMoa6@}uLU*&r@BYOJPKEh3>4_~g>yb3a-8do{F zc&Epj&uv2b)&4MFQ9)C>J<{ak84pHFG|b*E2COd;MKg~WWbT(0-?UdPAvgA;mG0V`UtuZ@RFueE z8Da|0SweIkOB#?)F|pmFxydZ-m4^|pr6@Uwa4K--9~&Qs@e)L-*j!r>{F&j?u-U6E zFJ*TrCpsxQOV4u-w1qTl`&Ig?II1GCPFq0J^?dwjU|@L1q&Y}($|aav zFx(|^#qNCoM;xo*mDN=>gr&FDjbh?x3zc7Fzh*eJ@Y~#CtSDqzi%L=sZbfM=w7{6c zE2L*m6WsnPgb`J;ywJkXL3^hftbOl*SF154FH6aaDbcumTS{vyOH0WPL-;yMR*l3% zDV-vuY%+?CC3W})zz{Ve7>iXSp;$_9(=dusih^J5&Xj2L6nX_$jcz$>U^58wgBjA| z^^t2|8W#bIcUu6lhbA(otXWc_od12f@-3nlPb(-4kRkMiDtnxzow>F5tDH~vvmeS`sVAe)U+qhD_Acv zy?1&S{Qq^`G-s$>H#@@#VO9$f-#cdD+iT&jSj17BXIeO(==4mZ1WRwM3mNpDfX`k9 ztEiU@q1gnpNGp?KodH{x}Z8gvAiC@!#EC*&XwM`Bmr;l#ZIzSC=Xpsu!_ z+(qOzk=sn}66RKPCUni-qo_=A^eA|fLY#CLuFAN7u`xHU${Mc9nue>gt+Xl!QyyHE z-R7!%ziVE0<I#uaSlMW2HRT&&ac+ z&}z@no6I087VR+oWaVARH@QWy=p2&zKm$e9vGEf}5pCE!!0cFX<=e}0HP`Yv42#dS zLGCHCV{n{0irILJ;iLpqB`<%?>DoigqH=sosYNJG-b2=KH_X2>gt>RfdhS8c+3A*b zXR$5+O6)h+OK>~{VB8^*cjq?UynEsOGUK^*-jq!H%f(hd$d%fF+Ia^ifhMZB6%2M?#ysB2g>DzBIe0{_N zJv?>@25e7y;7-XCb&iY;q(@}wioziD=q}H`ddC(0)*Y3iN_CaFH|LgM^0hK=Tq^0YD;IYu7Z~Y4@WyCVi-$X+TBIuyL&3U) z7LRq2MqO0v2&3`TL?rB+L8J1@rOndOk936MUXtAL1gh!+fx19LpxM5zwmHxp*od+` z_Eu9Df0>D7pwwVQM_8{HE0S!)C;~y@J7L#ggq$uGK5joRtddLIMxcj#MF$l zg$0WUXPe+L!4tyOCEObX--J4G+=kl;zE;@x3j03CUhwa?o7O~KdHDLP{>6EppH);Y z%`ahS)ji%`*f2|r>DZ`XS*nwe$9k|07F0_d@dy?@7FBx}~DQj?4);Rr=F>>)7;X;jK zJYB{cnOntjlY$Q-uLwbLj!HeM%gm=7xXk?Q06gthjDr^nL%MP3!qkw> zINB#t_CnH5_+n>=gmH^yuMVp(rM>PwV2821(s zh3*-Gp@W=Jqv8Q3Up~Mtv*qkT*0#cU3qvuj^KC27qY_h9Az8)Fx3!*!O1+JxDyMoY zkt?9IO z53;`66+^Yi$f?Wl5wu=O5J!)(ls8q6Nqg%_56q8uavv>*rWz=A1M98l_!>2kKF)Ts z74Z#~0k%kCF2#m=q<@WNeVR0LDlfs`OK36<4McXZ&obi+tbqNc;|*c9>2zfX^7x`z zqAx*-kgWv;!VA4;P&exm+5h}1OEut|1_mJrQCFL-Jy$u5S~Q*fIfe!t7q_ja*6dvj zab7aM#fUtbj{G)y5!6lMj(vxvnvqsByO<0jJwIvzJugEq9_78wl*#wm)HwpM`vJR% z&wtEPOQwj4_G8?3i;}oqS88QyRd!Vf@tnvZX3g^AC4Bqbm++}?92IZIXSZlJeDPK8?#<%MPrHn2 zuKQPKGR*n?JMt>t@0YrYtOG^kowfkC+XHU9x0WmLnNd*;f{_3Os%BRRUL{yH8Q>u^ zWGV?j=!>|DkiUUEVaB)>*2tTh7YFe^+`H9FxBjY*0HwcXh8rg-L-jdLapOAd#&y_j zcrT(=-*c7yIKdpM-|!QV7e+NI3)XsD$ZDiShZD5AUn?Ya*5(7J)u`>)+Wg=%>Mka2 ztgX_hr{F~wr~0)dni6YD*}>;fdhJXa3A^I9{;>aQ7&6<&MspM6lLHf`7&o%h-q>^{ zG(cHATYCJ&p7bf7wNr%c1)TLmGoHgUo+C4!qcfgkGoIthEw3VKOvzqb*s1J;!-|z+mZwN1lOc;|!7L+uCNuvu&8pWis1tpDP()fas#wFCsin-HX z18+r&^%CL=K9dY#=o+QD0(M1;9#)n}TbC5kc~Y|C6DA2UIq@dUj=sGX%s5YvSD*oz zgPFS~hsQI6$+5}NK{o6=K2V}~^PU?^7(x}(2WLyH<4P!{c|#^yctLEnL}j`HLW$6V z>|^vrNRQ}QI4ESi<7Qd6j-S{&dD8smG(ksX1`m%N%pi?Y8L1O;{*%MG9CTE%OV}Mv z!_?yw!_fI#M+Yfg@pZ0ieq(2rer}$VZc9jvPM(C4=lr9YyRAXD6~R^Hsh?$R$7#Zg zbdH*$I%i(;kix;3L{V~E-$ObPmtFZFWR!P$-?1}zt8bI&P21*IuQ}^LC@`=~ID^%g zfoig8o^viey1SIcO~VsIvY)IQ5XT9;uuVgfx~oMEo2UNZD9P+1OCJX`8f7W*`6tGL z&=_X!F*qcT-_sVnI}-$=D<^`v$x|r*94u?ET<~tlA$W3ZJQJLNlX37?q?QYgO_I5n ziJ?ref9%Yd=;K56KRXf&b4I-)UGS<7gh(XI|4(HYhvafI55$2%*oSWvY{A{29#l@a2FLWr>A z&{qf6)UL6&5yH;ez>ac+9W8+}s<4?umV!=P1%ZqO?h%Zx4OpXKO@cQI78GoiqZN++ z>lQI@3q##M9u~HUHwp*qxT6Eygy0>5b>po8-z@kR!L|zCBlK;;xn1z2(08KQ1%0F7 zyM^8>_+G*H3wBWOqiB7>cC)bELe?C{1fLN69--aqxR=9m2+sG4-JN%F#jg1CUY`oT zN+ozIH1sLe=&jPpuLS6!#wMSXI{8?uI2#njvl#xCz~6d>c~;$U|3+`^g<3caYo+xmj{gkUK=~Fu8Y-dndUgxjAwt$vsW(-Q=Dj_YLI!0gHznLhr+1pSm*3pDgvCf7q${MGW zxg1**r^4J31l94l2+`lW8Zmc#jVM*?k0P=TqUWq)Dy#JVf6ToLbR5TdCfe1HsqT4W z1{l1-0SSTxIV9$Z!2qO$2QdU7ilq3^lLH!$83GarP#A!cB0Cu?rX|~PZsORAlQ?^6 zCytZIjyF;6O`JXFTG=F)*38 z@fXTCg#Ux+-z3Em0l{@7K+dr9~;upBlUmE-|d^1DXK?_$aCV#)7f$?sxGppD9RiT)qW z@-wy(1>kEq9*tcez7y6*KN^v;ZXCKftLQ6$AY}7?7|dSt#Ti@9m-F9xM_*eH_4>gI z_$K1}^YnBBVRd?$0I0tRwd*g>$am2c`6DyR>!@`3ah|m?6t8FBss0n0rX#ajuIa5= z`;0bYpKem^s^$g#$45ywRzG8Vi`744E2f);h97(XeNbN^@Xn93Os|p|IoH}HxSvOz zjO`Pw!&CH=ME?X~ji>r2!De?>^>#z+KgBZ7s5xJ-9z@5V0{&G0G(ij6Pm&px)uYa+ zz_8&CtLJCQ3`H>d&ygv|jLdrfb&_d=W~AE)cF-?zlokZ}`2u16{>752>;(BDg8aA) zc%OUZr0_+ee~C=BbkDcwzXrfPE>NCLx(H;_zd|zY2*%USdh6E-SRhyE&p_?Nza*2$D;1 z!tyZ2+WmbT$7h7^1AYzpN232D0krX4YyKVmpGYy+3J6GFV*+>`MFG5Z{p+Yp(|SPJD3FiQ4v^^9Lcr1 z8^EAkWVbHygxjIZw=vT#5fXTFaz20!|F~Gh2RxqcWqt6PxE?H~!y;NTi?Y(ln(#T1 zKhNhx2pG^_WSxrmJ*)2lxr-JMALH#!ntlzYWwd;p6eVIru5(WY`u?d#O)p7qy+G%88 zOO#AgJJ)n<`;cAMVqf?d7RA@nHnyiaxvPh%?vvd`vo(W#X{CVEyN_jE84`QPk*$r` z*>>1)@}G{&6L7$_yu|9*azFcpe_;XDD&L<0OdXA?Xl72E;NZ#;aEU~8a+h<>MyR4u zo1Ic8rEW?+lw#N~$yaHK?icF=4UJWn=%)X-gEU7Oa$^C6=a zOh=^*n@;9%b}%08*rw%Ive)2gSIonG3{#HnGm3g{Fj4=~{L1p$wRw;wH*X3b9LV9| zrkSiAuB~MAY+jqouDCJzf_Zsp>*A$+Ha1VM+?cgblu|l2Es4}&Y2yckz`OB#ykdTj zI0dG{$z*-4UYC>MXu@4Jc4D!3LWxAf$*9BfrooP&Pl<#ReK7@@%h5QWQnnVx0Xe?Nr%Em2L_a14lt}7h_cH27z7lQz@mv zw5zC^-QgsG*F+*Yov0x&k~%C&5+nr+>^Fs9#Ho=3uSswlGjyu^HHB!9-1VA>iJ0Wo z1eSEjNIJ-p1mOtI_B13O>pdPu8bumMnn0RF+K+UAG-{eAu-&Gu4k2BAD5d(*zq1~t z)CQ1VtQw~z7TCJG*(W8m@02o)JoB}O!v5xbIRTS41t zJq?RPF)fjTJZsY@W|-iSQ)cAgjFPs=z(k*9f*i%zK2+(^AAzL^Dw<^#Wh@nCprQ;^ zl!1yeP*Dadnu3b1>QfaJO=CqasEE~PRy9*m75Ico5|dfabI4MtN`b0ghN@nMsu;0L zA7&NEAJIQ-sX*3$f{8wI&Xsl(D5Vz&W3Aws*ef8W%Qm|tzsUH$PB>!?7{5+{Gf*l5 z?UaD3GSK}BP|XI^PJfefn+^#!P3QJ6$M z!Rr4_!aZ|;6RIOXRT1cZ38*FmwJUEB{S8vlfnOstHZEbaYCuFc8Gh4X_)WBb_$D&^ zCNlgcGW;eod<#R#SsDJ@GDDASO6+cfA#6ha1bte|-f;1(z&9I=z|Oz1bP)e3&$c^% zBdTw2bx?V8|39@=$X=uHz=pzK`j;XF7%d#EZXuY=UPY_6lY4l+UMz{nRUFp|Z0NG} zH+Zz`mqytFaV^WY0siw9iI}Fb6^F0hHrQRPaJ#LIW>IxzMdr( ziKe1`i9~Ee4eYrd+6!y`2CNYYYC?DI2=r@D4ai|7(13^cJQR6(A5Su5LNG|qZ{^H^ zM`u>Z9W~2MA?K*Uv}9m%Vo!s>C~OHy&kaev)i1AB9Hvuysj@m@H&KfMS0hQb0gCsh zk}*rCjP9i!mh$N3v%EORE$j_J{eF3}!S1^nPlUtacqExLyKHDLY^{M`;2ib-nB>71 zF%nHC`;yUEvLE{R)Y=NZnynG#ZY{G4`Rz(L^)~hqJ6~DwUAq5q25t zkH&@f3WB4R{cjTl z`vE}`0;0W#%X3`^y9N6($QWitTB7V%OPu{`>tny#QtX#wko|I;C{V`sA)xjlmddKC z8x>Eb$4(<1M>>IY66qsn$fIZR*Eyu;kv@j>0@8~}FCo2rh6s=2uP2Z`g)~DBbZHt1 zYE2ywT3l$vLsFvRAJLD_Z0$pW!)_;X=ZN42^XXB+FDleCB6vkbCPRph(K#x3h|NDL z_*n0>4hd~cmUKfHbkaN|v^opVWizoV^aPj2!L}!7eJq3um*= zh7rLjDw;eZD5A@~9|D+wI8aXxfSS|WU^P+a@x&$l(K})NES!44A*muMwxnr7PQip+ zB^UGyaOQd^`t)KLN$P!jmCUfAZGb z`qQ8tz3GG43eObbcgT19HcOv^YI*vHitszF36MSu5rkzhIBzg*=)FQtzc!^7=T&{) z3}y}j(lTrP4JZon32Y)u-N#aIveXxm`H`D&4%CCEI?kN)&6^n6oMr1|*?yd5D-biE z)0*#f$fz=D-?pD+`~(D-_#}b2&T#yR$IlQ^1Y&U1fxxDL7vw3H^Rp-cb_t(F2@q(v z_*nwU6L_}gF6MmmZjgM}=lx88y>oZI9*~EMxrX@${TE6B#O;h%gvoxnMmY1cvDXsi zDezh%_sDS)VfPA6@2nS_*|&A4INf-MzomWa@QUD_0OF6ys}FcJ!^xS+tB>>Q173aX zo|RX#!RxS*E$KH)=6J~*l+4}9)muyMGfH+_OV*by zO^*+a!T(A+95RBqK;h=PYu}l*RgT$=T1+4y`dO0Lb97C!mb2%&wuU}-64&dX@}US+v#*pXY}?e6B4FbQRDjmcn8jyqjgeWHzX zV#5a8(DA^DuHj|uyTD)C!p*FC&KubH5p+f3QHeFfSXJ!c|I5Xlp2Ocb9-PSr^Z0;u?9#Z&(qIIfyssvB ztFi=lGcTGd(k=HKxd$15##n8xZ2Zs+bmbHTSdI1vYL8jDFWJ`*v0zf5_=w4=SgPM? zod)E1s*m04@9S&a^Nud#w3Ncu&a+dK^)sTBUZ{ku`zu|xC*SF;>jr3 z0E8p(J04>+8IH=4{um_3l1ab@paC)9RgMNC>QEC2R5?PW5S5Nm={S|b)E1>uj7t4f zIzj2fR7z3l0+pVi($iGBLe(imqn@MMHELg=4w*W-spAlpu2ZQ`TPE5yQ9B~}d8851 zR*(fz69k1x{M0RoilVd@e176q+6zA7_8lnflbV_Xw6}1u`;f?f#Xokin*;)hk9Cu# z)?}eiY;x1#LTUj1PO!g%@(AA-3u1siSCG3834tY0V+jps#7EDaJ&*J;q!*E1LV6kL z<4B)G`V`V$IdKt;|j@C0xjoMy7V zyFQ?~$T6?nGb999RY!&dDiH5stg)^EV(|I|!6Oi#*bSn9zy1`H1?v6P0s#b+9OeSS zF#Eyw_aj_$Gz!KHrV{G(ov=P`D4|dufRLVNS>ibmzH^{rk2WK(P( zV#!$yb~`HvZ-JqLPsrXQe!@t-$i(^v>DoOKkmvOr6fCASQn0_PKYN#(-adDCy*up? zp|rjNh3tH0Gkx`$pPV~D3!s)W+F}d$=5RMv}_XNxIJU&M(@AP%nv`<3(WN6!`tR==vd4CFwxZR+F1X=kr;+=44QvW&e4$B29wX#W(7ox59 zvpiokBA<|O@DoUu z4X^}DkcBc>?Ta5^^wrJlXG`i9iN%C_-t zPTWsh)Y+YYGQIc#258*!y&ItC$$0A)`B(5wUR+yP%~mSI4jkEf_c&lJ zlly=G4+kxku+DD4NGmJL*Dc9iVGi=Jsd~#-dWM|2p++=B?s%`{ftAKJJAj^O3c*|^ zMlDz4am>Vo#_MbO)v_3A<01&jc5K~MhFTcxdN6+*{+x{Wa41cEQr}`-dTW zZUj85e7XE2J)BB8Ea~+o!wB{v2aq*!%OZW@FgStO0%|~P^auQ)>;|J`il3I9%1%U$ zaf8ZRMz}IX0R&T}fhqy2I6yS9?W4A!wvSM`lLsXf9gVLjL~t}00&p$1h^_5y9Z2^R zZ=FWr;F@?i*q6iuc(QNQvdv}7wEb6MpK-!;$dkzl!x2vrPUt7WH;-Hw^@rexcwN#T z&a!O>I^;>DAYGUB5jLvGq8xIhWrA5p*`=6MUdQO|r!qFUo1-D`?Mb$~*VC-L2swgj zm83<2Oiz0ot6{LljU`;tC&ArsoSZ0-j}x0F+X2bS3CGqhL6!tJn^GXwjACnMkI@U; zjeyXrhwo%O#k7Y^5Itf{JBCueC*y<7TsTvgt3!fozqe$CN}OBHLo@u)B;RZ50gO`= zb22)+Nu0FfX2F4~g6f6KXRkgnacNwjY|H?5f@k#1@WqQ)&z`$L`=kE?u}hdglkcU(Su@%-56M0#TE zlw)lv&vhBux#u4AY-m2^VAWHyuVxGVcMTOa4>Sl5uHg&>#yfl-+&Fz&wa(5J-ifH2 zsWUDrHQ#1d&m0fRW%d#%+8y`+{NsISmv7QoqfGpdTJZ|$1ZU0XS(l}OAAJ0A``tIm9PHz4f#e3nlo%{KD*fFuQ=pSyCpkz=W3 zOirdEQ8^J!#649k>na}8im4h4C&Ny*H<1F)KwY3E5DauR9t{ixj=~~P?60rFJG?h9aB)ZCW z7ipvSj@_dx{R>7JDo=xkdEX z08zmW`@pmtjmus|bcRpBUJ$m2;s_bnKS{iIVPAI__I0x|-`IVMz|IafUT>lX^QZ7y z@_vr}{xrYm%lY2)0nouulZ+oMD6k&CD0y$N#Q%k7s?XKG2}lcIBZmnMxrR4y`p&W( zKZ7}PfrIxbXfNxWMi!Rx74?mq2v+eKl4&&CitHPuaYP#ZEYvCGB(qNa^N=9tWHX^% z1w@PBI5~dtX^&TG0)&WWfwTy%g6IOzGn?aQ2_53C>4wFUxWaHBkTozop>LH4xEv(2Nm9f|GKINf7|H6Is|1cHCEz{RrKG3 z#>U3ZU}Fh1Rx%nZ!}$9{XzU-MKU>|q_efOuBWMr-8WaDRcrO4Z$e*+NLh<$6p~UUU zI>IvQe?hz-g*$&`-sv;%{5A1jgF8j@PSU)yPP~r_f_H*7^iN5V4b?wGXR;Z&g$>q& zf)~JpzlCZ|BZ+ujf^Z0i@<9>Mf)9$S-1?RG-xu@mzyIm?-)Fz{x5?dcBfet?dywy- zLN+XXhv@$vEf@a-xl^2P)4yv5V?Z&$p-*NyGy8M<$+Ln#3BmZ?nsb zcyPsI2TWLk_xT>bZ?m>C^Ff0-0865EhKYY#VLjF~kw?1{14n`FpiE5E3M;HKTWYYS z+2_}$7cVW>vew$SN!bDOd3O@P@A3OKJKNaNrqNj<(XRw#CP-@mhhRh4RRzUpmC4X> zC}S_MH|JpETy%Rqbzm$k4cBvARgs9X_lRE4=jnPqfR?*&B0_3YM#QUECq*`MwE71z@NUY?nqgMo0kh_0B^nmnDyHN$L_UCD<9m3bntfzIqT(&9VJ2CynoQObumXG!iFz4J)`~dsF4JfcTiv?J zlXpeJk!{4N9b;&!({pne5}}p?dSGHBI`imWdeYKS=*Go$!`T(rjg{=ph2^z8kNp6F zz429+ZIkwIv??+b-6gZ4Av``Gp;5|*x`2D(Cti*fBOT^oVH zPu)+0%@Jg3Gqzj|mOm(+>?YqW7n~A_xEzo4C*?R>FaTQ;twdsAng;?;LXIXPsrp(h z0F5%~Mb9IT;t$j})~gMO6d6#P)O~^dfiCs9tPzm|M%tMapad;Ak#=xOlH6287$4$m zW#R;rlA6I$iL_H^2S`b-1Jr#Gz$Zi%MWmzDbBwxrsV7W55iKTC@g!A-n1rPbNf=i` z6l6s!$cmu02%@*n7c8{4kp|^ZK_RLVD)fk6r7l|NX@$IMTudbU`jMuP4j>&wdIIS~ zNFPQzOxim%l|Xn>kbVRWOe_dSmJrDh1SXZlA)!G)qYU=6E-=|(J2Jwa2c#dWTEQd$ zJM8FtlHSh`e)~ZT>StGMCzj&Y69ZFXMp|bJ>%6EBp2px0vT~6X8HFNF;nY3iB5BYZ z=WK@1Q&8X5(_KRT9d8S4EKe6R8tfa_bM~~xV~MBN-^#zU4v9Hu!?)SCa1tDGBw3af zfVQ{@tXqYP_edLI#3f$RFJYAGW5Dk+ddDEkyJeP-XWT|gG3^$6^h+4D+Nk2sSQSsN zr#%7>F(Ct@8kj50a1@0ZeYpr)X1+nc!GlMn>xFSWUwjTd4SAT`9-$m<$pCs#o;c#YOrX$x81_CGy?Ir#9SCkrC8wg~yvH+X7>BZjF`Rww_LN;&N z@SHadDHnb$J68$&Z|-*vR_+e09FLnEEwQGz;`lN0V0J;)He4~=UN7FU^Y{mK-{*2&VR)W9G6+9 zbLKgxgPdbS=@w{X@U+t@oYOCwXPazsVt4dQ-sb9K$;(+1^00ewF!>~?YR1XF-h`}( zHntE7Dys+<9UG0AhmrL{?>*8$7*RwxmMqR|dgRV}C~*5OHZau4T6lYc=uyLWNIArV z#c>fNbueXGr{&{pxoTbPlmdNWM7|*x&~EHi~ui^Mu}a7F$Zb}w)1g_ zPPfYg8UlIv7^)dWcDw#PqPK80LyO*)A;n2jQ;+azwH!tT7uu5H2ZDp37z;nD&Bw+L zZ!{Gds9D0bX#7Bo9O07>4yXX}21-T`XBK8kky1E-f!VIXn(czogC}#wg5tE^tYHY_ zU?Q}6TLI+873C68>xrlVb%*I2kPZ3jYz(V?n{=O<*}amzzI-!lUYeNy+b`=6?ex9W ze!p5N)m{dtkU`~Q$EV_0g;w)_<c%m`l^q-;6kebArrm5rbAmCarW7r6W4{cem=#ThwbElV(Y>EZ=czE0+WS%|7u$lUa5UMdq7d#?>(u%{ zi*iI}6EaHR4l{TIz%q*6M$`s#s;067Jv`hH)@T|?DKtR|M^ua@;(bVyNc)kdkPad}iS%KlLr6!E zjv_rpnz}R_=^z@D&0+abh6J_+5%0qC$>KLq0Z;X5GB_uN@$a{Q6? zjC6Q7 zuoqFsYI=%4_EYyrh&%-+TIP*s_>E`a252NGXsDd*Muy+WSWy^d{XpiR74>1hiKTVm zmgMKWJG64Qs2$C1$#Wf+M3}9Usey~rxoj!l{0C?BURiTV`K_7zpZw9S+tzEn*qy@K z&>4eAT*8gHUMkt3Z>V&~hXzMkO?7d^D@&FQBgKi|C5%tqP+!n*Fm4;M(;Y<_?ghwwSpp??C5{?WwkE zKKMiv*OmYUv-Cv9bysw6Ph=EF_(Jm)`l^qSx}qod)?G&Vgc!Mzbh^l zLDH1#PVSaLdSRu!2Oiv2=}O6RcTKna-f*HP_pyz%Z{xQv$70cl9A~?7Pt~iH6Uj)z zUhY(x?YCq88ecB#?vo{4j#xAnt&)%BWIUSmR`-j{#DRFzW@A=PMEd}lKxV(gR;gZ2 zM#6p7$DeXMnqVSAq`%K$oo{0hS-wBqm+~s430=Mwr|M$zfjiKkHYq)gR6W+z)6%0* z^Pmo71l8emd*Hxs03hN;1&u~DCL(}X-~r1*v1Br!xyg}$>nON%%OMbSlw;r;ZaY3KcnIws7JNhv zgUq7^hlGgTPVCWPp@BGJ!$LiA#=*(ll^7QM#N7uj=$>X|>_ubLMllI~;dKol8~K{7 zhn%8u$jReD$rukxA>SvEz$Bx8Bq$pFXM(cPKM{V&sn~xDJZ=6PF>_D9lVkoT!UAR-00x+I zfob5R10%xg@1ud?ALg?J17(R=?IL-LC%{iU-SjlP{Qmp;E8=O={m_`IvF;#s;M#6J zKEN9)4fn_q;WT@m@ghWfPd73C6CkOu2c-Zfc*@kYA19{_9s5z?ls=XvnT9)==3Mh+ zgIH*|F6yU2jXoq#E3D8X@Ec{YGp7Zy(Xgs)Ko@piVFM@$2x+FgiqK;YRV`h~x z@|aO&M0iZUu%XIJSfvfCe6my}lc&TsfpqXH)l!uUEZ4LADfh7|pF{U_RwX#U&ze;x z$!zHvY}=)3>Jr+SoNn#sqUX96_vY7m46;8{{_Ok z{UEFS7ol>GS^4Kmm5-9oky6ipj_9v%to-x5ayM4~g>vP;Oe#9tTdMpwq4GD3%DY+R zUxmu+%*ww~syt1;Qm*_fME~`TmH#HM+>4d}R=M)8S61!=3vxfp@_PW-`TJxl*gYTA zzXA37K@|ZfTs$`91dj~~brjQwSmWLz2J`-C^^^pR@U59V!UG zQ-CAhyYLhbO*LoaNm-b0hFS4%AwwgmAR>6ebu!am;b{-xt^bK+QsqRUeI8I$|06#u zc}3h@F=5I^Wpji2j#{R6mV8e?NL9pOnK2+y-k4sUH%>SB!FA8pjj^=fwgZTzryr=; zT+wvyBp&YzGZIcP5{uT-E7&a!HeFm}$vy?mro3=e%(hm1j|F&+D%e7aKCO;O9F#_u zW%?S};}RG!Hars6M7z`BLh459LFy-p4T7FY60XexH%TI*aX<`_&=formMT_gSyp=4 z*y-jAbT_Qepu7}oDKGEbotN~ZMzA!)K&CT8d5APdU?3``GuJQLHa)ZBs(=0l(}*>m zH^*b5yT%bfjr{e)7oR#idUbU8%o*+hI&op_l)ytd&95vkEwAN+IYV_3oLfN5upn%j zgVVXy>`L(E@JE8z^V;aSvzLY^&W@d`KfzKS3g*CdG`O%7Jn?emBMFTM8 zQ&`8j(b3Bnj*Y!|0|D29{9q}_3(l;q24|<&uFbEO(-{X(nFE%Noidt|MJ_wy;T?PO z{MhKFu~Sz^E?>I(#PG$otkHyla=90#^8=V$d35;F=(wNX;ozrpoR50;+*Q2U%x{{# zf|+<07d&REPg=|Uwlrt7(d-%(a-O|>=1dbm6NUz0UciJMfbK4H1c2B@ z!E!ZLt7l5^1IdJfE`AZ5n|9z@!W^bpd+NPCbTL3$Kv2JlBl3N9HpfqtKxK`Tcb`xTg)3V!62vyRG+ewH@)70%H zM02K{?iNDquC&YD#@N}@c6WdfC+iCjtQ{^1PR-=c5PtO4S@z)DU-sZTQ1;;K;vReu zK>iOL*99MkJQn_Q)j~%an(uwc|4NdFPJpI7>ESCAVgC)p|Oyy`kMejpEOLfCid_8|y2h58Lx* zTD}T9wuIt4zNbg(Ei)c@$$&<|W1mgYTpSj!=`;6VC%AcWW)2I&gVTH}(4xsKf1WHf z)$E|IL~{T3t=RGD6e?bg6QMo!Xvy-k^px7{^wJ!na3cEe=-&7;Cd23h5AWSnTN*A! zSAp+Cd*cg55zaZckX@W}RaE21a{qn!J$|3f#$kmZ#c8O>ldD4iv;vr(eNc6A-n#%H zg}7^FT#ezqwZj1JfB|f*;w}@`8U}RKb=7*Q8R<{>HjY#|k%*_{L^6?*W2tD$xADW4Iz$UVLx}BQ7|zilq%MrY zBvVHZ6^~FcM9FbVdjS-}8G}Gf5PazrphJk0R6I+?^HjV<#mA}gB-@#4Pl_Hq0g)9I zLO|GD1t$~r<)(toLmbZ5LbKr9ClH7CKp{vR{zHX>#L;lH&_bFUB83*IS#D_QE5ut8 z>^fCw5gJZ1UQYR;LQ5RDdL9;sMuta`jv+mbbR6jf(npY3aLV=*Ls;?DucCe2}h*~?uKynvzp0u0rP)RI%h-Lq% zfgt-)qQ63lkUw2lj+z8fjY?%yC%}f9-6XL>cF;yeji|x*NE`zOw_w2Fg!noH z1HRiO)GLCZf1U)#^?hXh{1?a<(D$a*_; z0&rbj(1yb-(_a{E_zTvCIQa`a>iSDK>T>Ddf}^g0{#S$p#Fo9xDy_^8l$2)D}| z*>pLQxp`3hL}k#SnQhPCtwGVNn7GeOT)Z@PcI?8{3uD8lo)Svt@)xqxb1!*HchkcY zXU0ys&Aa>vyRLM5^xUK8&x~Cf^O_kvzDUV^@B&XDEVt}pUlQhT3NT@ zTWYAu`l$!g>>4Al(k}*IP{|Cq%3x`ChObY55KZPIeJdmH z*PKSpgh%e@sn(WWfL~^Ep!TOWaX(d5RA5_NzILq|zj2ogYb93Laqr|H;e`**WEq=& zWs?Qnh~Aq>LcALwsfep$VU%M`bd+P!c-U3Zb21YnV}@%^xG%;8%>D@Y2Pf?1NnMUd zQYj`1M#FME5l(rk-mcu&$4V!n@g$RW84DiyH=Ibwi4-drizSowwbnZ(l7_?GJ9}mI zwVvD5HAWNt5eJ7TY$9q~AQ(8VM%83sN+kBf<+BW82VWn8;2WZkl6r9SA&pdS0gOT! zBLdqxsj{Dn=;I^yQ27X;Z^$7-1XUx{7N=Stl?SNpAu2vh#nUK=aw+r*wO^&;hqSBQ zL=3~VC~POI*0KM7w$X23|Cq!UOVL3#%1qe#ypJ%{u$q!*B0M0y$N<4B)C`Xth)kUov{ z8KfDc)8t^cCJSy~5FkDz+mN6L=tksXQYwUHu{95|CKKue$yC)aUa*F-dhHD$%R1UY zKy@AfA=cFhLabXxCLRao^->UK>)asy`h0*A@9%=(F7*N&>FfinMUp1_WN?#Bi~DQ@ z4rs_h5NsQ~ctq31PiXqeCp5|O2~9sgp)t=)T<=C6knq*n{xcl7_2WE$4f z4NP#qO)}b%cXQew&dPUZ(8KF zEVpLn)-d;=abptd} zXK(BT(NVI04&K4QQVK`b7Kf?&fiB$71@2~t1HsDPz5___-6a4GsP8jFb{T8t3` zbHj*863o~jB8g&nLLQWBj^fc0Hf8mA4t7?(pBhCZfLN#9;mjc)aRQ{M!$&~Hv+VvT>O^+s`QJL-1`+XY=qYaP^!Xv8ofCyGV z?1Lh*84Xc0B9LGxMD~?Y*$=KSaw`=(v>q=RU+ z**zt83GWIW-If7Cbni;8Vr-YS|`p)%An{%JSN^c{rc06vw%wTv@Vr+Z+QJG6QvJ zrgR49mXi;HHTOylZ_ldovUA%43O0Jn&pY#Aw%c7< z66~-0VKsCF>iKGjIFq6i#9OIBYv8M)2;nLV5}X5yT0v#YmYuJP90M7tA87zrMG00# zveQ+u(_9t#-tIMN)1h8-q_+oayq?OOS03c2u%j=*g#*HL0q@?fg}t>0y_>&Glg*)R z+3@_v7~q5Q__l>Au1ap}RU@UwSlV*9UwM$jz4mBNL{e|KS+FZ?4N^P>mm60jzgQn= zXhhnCv>9m&(l(+=noMkx%vBNs9Y#DZybx8yO~Fq=+qfEm+YB6&9_OpkanL&)*LyRh zxSl3V`i4xRnJIAxeftuSDWUgeWR^)5IeZD6w<}%dfxAmcLjZs@EN!Q!3_crDw0Q`boqq<;h9ZSc3wQ;;mfUqN5)@4NEG7!yRCbb}(nY-CdIUwviZ(QEQe;bbF)IW%BvRu=j`EH-!XV9NgRtIY=OAX2 zks~;_oaG)OUD_F--P3*Nx8BX zLz%@>75ISM_|t56{^*vBD)Sm*-PYeejt3~_G-2e?9NB`3i1wn|^eX$tXVzA;9_ysr zm5gt1@m(@P-1-YI&3$M?!QLAPLfkuZXOrrW#Fa=S3Wk@lL=1jL z;&L(^Ny`1PSV}9s5+xFjM`Lm#m59j6{$y0{?+YiL)=yJTCQ^)7I2ntp<|vX=@mPW} zWdb{}?g#VEXqaV6^@U}&pX!%W;r_53568nCrd|m+)H=06J*Yo&!dgkdXNHa*MkX}XlA*9ntXOYe!%_7YqokzNW^f{!9NUtMZLb{Cf2GZw|u8=mT zW+%sp|2Q153GN}Go9#J!VIwMrhXfbfcD5ppA6kPdkzv72Y(BISrEu7$?uS!2Eec0& z_SlHvA&xj4ygB*)*5w@%>IC9WfbPX(9~QjC+YAsHb$xjJ#`cYMqz(4EeqY62SCN%F z;Q#(SoLZ1~f(7y2U_pYwWUBDIo`=oq>Xe*OGPX&ZkX8uWwcacS>j8Z4h0}mhfH8G4 zaO~hBFS8A<_+kBJwpC6O!r18_ULO${OZ_7mx_&oJ*~a)M&?ZwAx`g@zP|7E9bbBe} zznjx;W1!htS$~CO>@#xOPI|mYSzWjI3D}!HKf8F9-OGpo_Kf$z{P9yH;|MiPItbtm zoGzXIam&q6tNs~+8X{3v!14T-@C2ko_$4?En{s1|Ji@$N|5s$no2k1~oU9Y)y>K?> zE2e#THU?XC*z+&H2Zv(NS>iju;!8yTRe}d|4FY>z?16g7*NFaWtOo*u4`2^}oxqU} zo@V_9Ijw(1L5X%I}o(|1MOkfD{pA)&9N_8Q}LZV%P5z z{SQDQfs?a;gW;~==|)(-KQi+D5z+s|=(g7}3fjLTnO0W06pFE4hTdysy=Uh~VD=*P zrT*s_IRK6%p~fO|N(e=w{|)qcTXC`t`&@sUA6?pH+z- z7yb_8odHdW-)3|``Uj$ao2;ih1eR6*2ZFf~gy0@IA%BPH-ys>--5EKzFYO|X2^@O` zi!(|($cD{7kQw=BSHZ6MZmzT8FW-Nk$M`}ET`&{=9yYaK_#Uh2Ve&nq|KHHy{j7ub zi`e4t^HWh-R)$&jAMjWBE)@9z76IBL{uiSE7gFS7_8z&LIgmT>CY(rS4%|&2AnVgz z`g<6G%mL#Ikh%Xm9KQZDx37gXA4|I>vb0x4999PfG^%CQ=3q3kJBQy67P{Zzm5&Rb z5$}-+@>x;;jMycty{&&%G)5!Ku~3{#Z1qgbPoxgPah%aqmaRC;!6CU z$j8v{iTXE?K`|X-o%jbLAY+t8)rCwF4ynUHKvZoj=}3P-HZ}Rp_YN;E;^Jq@s;>50 zo=5|wY)?H%yW0Gq$(Jqh-CI^%YG{3}Y^r&8CsER#dXSbx`74%3;QE(XG!EJo1+@Kw z#DV(}eu2$fsJ$nus5$IT@T*0)ThPjrQv?);)&&8^j+?#3E;c|8!tCE&iIlKEE5M8r z1_E!Kl#~;+wpJY6l=H^lv&*Yz*A^Ge*IqaEpj3fa$zVk#pbP}GcN_PVt_XkNs%(xj zedEUBOWSXa_gAUiu-1VJUMTC<*UGo$=$Lv?3OcOnN_9sdzI{BEz*u^!YKf)CqdUk7 zAaZ<608nA4=<>L|Fc6gCx>6*)w)co$$E|VdbRR7GIWbsFOKfKLpRNIQKQCJc1MI$g z^V#RuAP9BuMdQcC?CNS+bKGh4F62FK<{hZYd%pt)#Q>A}U?p?bPxLCcdOfy%Q+jz$ zG*Gu%qI#=Mo^4kFv>_kb0ZYsX9E}M@!2}toVUF9dp~+p*RKj0__x7Xt$PQYReK9-B zq(~gqksai(y!1?%*Tbk&`#?W|idTDOLq8c%H>ofvsH4<;uxKn1hohQ4^x$(>7Gtw& zf7F4PgSLRExC5R>kLqO-m)+_TXLF%|MM0S@BLunZVuF$E)9OVyQnl^V_K663BZvx{ zjWx6&6a`WC7hDcVw>5}?rp9KZElAstwj=F88YB)`6Nx4(WQd>6a%3DlY!z)_T_-7E z$Oj*uLL9KwS8UZYyNd@Z(Zlcsk6X6M53|G}P&k`$w4UN>>)@@o_0s^AebYArn_H(a zu8(&K??BQk@8SmK?s^ByGyxWNH+^2Vn|uU*79mG5N2jSi9+kwpciw+rl~hqbhq`V< zFa8AAi$4JYTAqN#=1Cqj?5QbfeO}U^#@%me=?P|>JU$8|u=F@sS~CZWs&z_b*l(D6 zip%WMoNGENPpJ&uZ$-`rbV_BIWms7QUbU$?bbjF$JVA7F;;ttu~h{`uF@6GWBW;9aJ!Cx>F5kvW2aXZ zvP*M|FO_baiex@n9p9Ey#Z}AZe18~6S%%d`)q63lml84G#)olLWM)%CDoRly<5InW zR*aXVp>c(i${q}wj^HXvo7RS=OK{3mSCGLD4v)41VqYeE_D=+oI-$db?hFYQm-Ducye0EJ|cqXeGD%h{PJDBmrKmIm~0)M zk=H|Rws^xugh^DTi`Y!bbQXl06k?F*19+BY`3_b1xWho;JEWy8;14#g`fCdl*V!Ov z@5}J;!$h~ZN@Q%+k}o+^IFt^5YI;r9x85Zi~U7F@Bm zU~uaefU91%oZ4y4{rEy2!V$3@tEJqb9X>fkf4P=*!LDO*`X&BBy7-hZ$J0tdX{R4d zXW|4hSF_PAo7WJSs97TWfZDY6ZGNJE@y5!+YPQ*E$i`e-&OWb@2eC`pY6M-`b_DUw zd?eDc`5Tbp$*>gb4|i^kG^a#t1cI8fT@89#$SPIrl;)`Vq9#C;)Xfxbswn7JX0hiPKpBCF8E;M0zTdj@bL!gF1AB>^Cs#F z{cz7rh6$Alh+Elmr^t35t(7yLmT^_6Ibi3(<(%iW9fbyGpXX}U zh*CDauy}3>;w3Gwt>P31GWsLiL|i^z<}gsnA^!oz2)|OUaj>GsGW-%<AZ2% z*c0F>ek)tzFW$(`g6~fWM`eXaEtCNo&p3o1+2f=4maE+bl8shkN3XwxzEmf6Ucc$? z#;-@F^I3OgsOlOH)0G>C8as#DdijyrpH%*-=U+4+te(<=bM1YOL7pQ%|0P{?klcHY7& zrbByuHnVD6V+?=VRckjoaPj5F2;2mumm3Ng;FP9!U+{&6)%k^`V4i!aXFgk3xi8$0-Q7BrAP_UWFjg@`=d!Y-q)9s6Ny+K;O+Fe zDmeKzP9Y_~$9TNY$wi8$x`02>5NHjw2M(x*LAcO*%J_{C-%NosT-i$%9~|TI0B2$o zCC!w!P_>PU9dMp21_6af>w-uIVmE|26OT|5qRKHU9;afAig8L3RPIA89-G!hs5nf; zLsUCWwQ=nSxmz`|fg;1l=XvNq>fJy_9Ri5Rt)3YEuJqNPWqW)Zl6hmrANsD5d zkX!HQi|eqLV2|Ci9dzd?9L^mMTRqOe<;)Z`?@F5k%3PmbTDY;c$i>Zx^unS=$=oi? zJy3`iYh8mzT_EIHf$_1qB59WBicD3qFj)O zB&r1vz8nR+z~*AOBiD((dVd4bMx@P1+lVG8f-Kq4(}1Ffq+2AUyH{SSGEA9fC(F5f#mlV4q70(9kfejvGB{~R|M3{)}5e_->&6{E(%${MSt zi{U*sym$AL!q8r;s`=^LdFJVv#jL{^d+>YPfokLBLOcCPf$7P;wtT~6lHMz)%1iTW zD}Aj$jP2_dW9-U?F^2O=UnIq+5IGW#N6OP3sFM!wv?tt^yrpO)rQ)uY2HdJQ5NraC z4Y9e=20_K+Wz-y@N?dCoxLL&ws;yJ&bJ^j=#mXtLCAH(By@AEr2R{i`*I6|U zj_$efdzc8d>BU9v+%dBEYO5y2$-Q%`PT1kLWbK2WRcgF6oL3_KvGP78+Mn3*T;i?f zST(tr8tO;keC-(}?62J#}6m(t4!LY@X4; zJ5rv8J&Q73@{Y8DRg|b$#Yc8&gDJwsrwE%)yZOwa*t{&+&XesSO$RI(34#=W5taK+ zSogr^?=?KU4Dm+E3f#5WG6%HJ+e(wb->7^NSjw*UR++VLYE3h;fWUxHOfOg_fuR&* zalDGfrbZl|kEHve~@E@jFs|Q8|)g+wIa<52zh1E!o#EN0ZUG z91TY!ax9(%59%a@0ZR3`t6qPsFA+h@l!ls>l|ug{`eK@Cuoege4g?Mc4vU2Dt1waH z%O+Th-e^XN$`Kct;x zg1^4k3gY3?bc&zt$7-&nxBzL_+QUFhw*YRb zcT(KZc{v_{URa)*Ek(BKs@>%SmAOCkfQQXs1$)+q(VaA-@)3;l zSqEEvmR85J({tPhAC41Um8)wzkUW3J7Ug zhhba>i&`y3-+)!h7K6vbJ8qT{5WYf8r#b$lUgL>**gM7}P+4{M#_|g6&9v-`5Ca8D zF643JCI-jEV0!1RFe=&>KAajE#o)xwnNM6>T3*S{+2BnM1pV2?=^Od%99#|Oxkxau zBVJ|5Y0D5X%qvu*%kpG_;{q5aH}*?x|D44jlv>cpGvF{1f!NK|{D9Ls%Id2}bXO!A z4b*Pu_SVOtZSk!wkk-ajXoyQE_R=@zr((OY!sgKzNze{2g7=s`zdAkp92OtE58n3t z+AQ09=5uR{^0`NXhgJ4e=pJrE4O5WhNlzohm$-ak>|$qUC&EJHgDlrTPz(i~Mz>=T zd(dp~z@CNzp9@BIS+vGLbXdmgmP^rx9`sUFJ>2+~I+2LU@klH#$NRzwhh@Hit#ry$ zJ+DRjqbWHSNk-&oe_vRR^~a+Q%jeBD-2Ew6MNJONxMQ30Ski-=YBAtc>jI5|cI9}W zx3O0Zw~&@dOH{P8-KNSN?ho)K(Lgqm90tsu!gkvA)P@IbQZra^&<-O&l5~(thp2Rz zipN?Bm10y%QmLOx15`QzUiDI%N@uBbo=TUg_5`I*QYq>*S6rgl>;;7=n!n&Cio31Q zzCxjEshF17j|5l5_vn3K z9U-wIuIstb?-sx$V=i*~#*U&E6viN$wu$7H{aeVy>>>dq^tv?G_1cSFf z$5{5T%iEzNyv21a@j6R9iisg!&y6l2|E{+UVhKH;sb9aFYsdudcCkhTNV;BR_wT-y zfA=mc(eMxNzpv-f(OXh%M_8j?=3VtNpcucbe>g+eLw&c4xyIZ0r-}3b2>NBS$DJt& z8VVCMm@HAuHT#Zp2YwnFEaqBnhfcC`EnVadu(t_`uXx!*g&un4cIaXL0N}R%3CKN! zxrbTq*4v>`UJ;5NcIf<8R@2WC-m^c;qcar`exLpddnAmjRMNb5vu)-6-2QN;GuMd( zHLt~~=dZ0;#An!2e!JiX^u zRbKKPm%B1?c+bqM@Vk5)AAHNDdG&{2Gx`5B_a5+ZUDuuPyRXcBZyKfmgTe-qU z$VhUW7!82x( ziHd2%Xd)9a$^q+$Lk7xk_EFbVbNLAoy^a)yCZ~iw#7H`p#ET(RTksOht)FzTT!@;f zHjr>jBUhRYH{%+tyz9x{bvxZclYv5cGhG=WvWMcCfw@Evz^YY zEMFQ@%{_x^z#~aHcJ*36lV=p153kKAWW5iz7-+37g_QhK>N*Rsl$pLVd$mtCGso!c zNjF?VnX|LW?6Kf%d5mVhZ8?w7+VU2?VLU1d3scfndJXtTx((J`xcFJk=|X<&%tNq8 z8ZRHwY+PWgSrs&Qqgm_-LdqJKNuIzkV1=FLRW3ys-jO$ zOy@@@N~HT7*w5EAZHLLNN?OMSos$Yurt2QwdMO|aB+ zWgS;GaAhM`Hru@Q4zBD1_S)FZ+_pUlAtWLxIzFMG2y=&a~=cN4iC(^C3o?!BJg7(vc@-21&;{kuz2ZDqnRI z@S6v@WHb-#WW1rb%q#myrJ*80>#DY6;YSHtp9Q@1-lb(ns;sP9x7##(tI})m*8q{T zyBE3Mt+Kgh#daON{piWF=d*pMj~!s5>bp zJ#Jj2ip8CKW<`x)sZtSbT0QC*NZh*`ik9M1l?tIyw@a^#n6OZbG|F-vZpxb#z!t)o z3*J6QC}X~Eqo*dD^VAi)SC-A{m*vY_lx0>>I%YY$#!tRkgcz#K5LP<0CAg4C;(=+@ zQQ_RcBbAJ+(PSd3#-q`Mv(l<+GMNagv1lZrCS&oKnh2-kY7F6Z;^AmgO+>?KS9KRn zBx67$o=Ueb)j;m*+%?P*$RfO3b^4(Th0Y}h)Sk-dgTlm;PBb#uh6lU;P-Cb))Db!; zGh>rwVo>2IVpz77g4pzQjw=Vbqlr66-420M*H}jH<@FrpEDVdY)Jfw`-p1wagmN0^ z@;+|#a7VAvgK8GA1i9RS85eVTLNhMO)e1{QOKaPj*3C~UOmV|s+nTlO)?>iH4tZzi zuHEGBAva8Jgxn~(F>({+Cdo~an;?kgK)A?nQq)U<5MB%DkjetJ3X~iT%!wh>WU!+FUpBmWJ(%} zz>S=(Tp+K^RQOFR&q>!pAB05|S5@BXiQ-flS!k-XZB?YcRbP#F<+4vt}O4vd*`_ZK_`hrx~_TW225>$s)oMPA9`BfVl%Rl_E zaUc5iO%x}!oAAkxME8v4C+^)dC9Kl8sw~d9CJGPO7BkittpPm;P|5;~T3Z)w%KEqn z?3W8qd#ogy7f50eIIH-=l)D$i@j9~d+MMs@xiD3@G&*^)L@+b0A`f*kuMyJE8;b>0 z4R{lw+TVxfvI9djYi!5E^a|k;vp&Oi|&XymoIm#ZF)&x!hI#qGK zXOEsad!~HY6B329A+8q$BC?oI43k)SW5XxwI=b9o;vB~>jw&H}stTxcCj#DxnPk)a zHtn86<@Cz)Qn}5pU-UXhIhI)H$=9D)btkGuDLS@t(sf(gKa__()Nu8pJD$Ido-SG2 zJ1R|8VCBveH)}^v+ zpgX#XO6;=1Jx;uykutBGYCN2X@IDc+8t*_&g%fx{mQ1LbSURErc{QF$Mb&636<+}U z5_N>)YC4m_P|+xw{RyjyWHhP9!s(crjD}-sDiMn>3|gs1(=kXel7=XeL|9G2>%5b) zXd;;;BSmrC^TcA?G!}Abo=`(b4*6Re^(L|=)YukkYYwf|w(FgtaLaZr8|n|;8oEut zD|9}TZ^?%4)kpOQLJx&5GyVNc{~*&p#F`u0vY}5g{j-c4B=CTekcOgax+mDSxr6!H z7N#=gt!RN*=7f;zCHq4G&Vy@6GQ-izwKncu$Gz*hwgC+fIkxczgE#Ep4JvQg$$h)H zwuk$>xEA4Bl>6gcOLAX|YZNt`+#2B40bggKy<)?&I1R*T%Uv!P_Re zc7bd6^Oh1{dy%iZ#MeK}HHiKW9()%M&M>~=QTTt1aqr_$nD@f}ajyL`{Jf9x_NN%% z_yNW@jqr_6!{dj+`x*HEDDxhdx%MpM!A}sLX4@y3@o^^eEuUt5>vPQb0#l4%g$mQ& z4WIu58R@$)<4=NsbZ zcg4@|iJ$+-lm?$+NKE#kys9KL!=)LVg7it@ zv!J3LffBSe;6>pYJPQf_loB+gpUP-K30+nGscil?%$(o6E?>Di z5-?5q%C(W8`7`kBW9EOCujLxEjZ(G=DE|+c1aX;zqaf}-p?#ZwmQiCZ7bpf0i>%m^ zZIw~Q4l80ig!va)7&rPC+5A@^sI4*omz)b0gM#K-p!sv8$zfP=G#d2_EBr5H^EC{= z!F)uS6^FQ&6^htSQD^(x}CX> zdob5=HQT}P(DjMqB-yHJw?Oz|41YozHVfEZ_YQ2yZJq7k%0{-BBLmxJN4A-x1KV?3 zid%|1vOA@b?dE+0yK8>vHl1f37e0yT(}s%nva{0(Niu_Ok|T#$ak|`sy`*o zq+Ug--aW-V*RpBweh(YSVUoK-s?=$(X;ya+zZ0T7Dne>Vl_Scd@&; zKX;&bAbU{WVg9o4++N&%JInR}1v2C1Mr@WHkkw}?tJBi6%=|bdlRYHuFh40lkY5G&xbj1A-_2CCsPzQXegr>HG6!1LdJp4&iPp1bQI7AWz{k;0!!I%YuNhj< za?fVn3@Mv`!*bf70YetDVE$*8+jEg>2qbyy>ODr!ku!VFsDp%H1@Zy@_Gj&Fh#=ry^T>`|B*p>k=K91M=P)YJU6fZGB2$|7<_G10 zyJko3GCw5e?xs$1H_P2qyeEIo{4mZi0UYP38t^fS3~TGhWb@;4?yllpx#P2#)dB2& zK^dma0g}@@kSpfyF5VqR=T3RuhzfqcDd+ALo+HH(OSTgn66+j6?2;eLxzVZsj-rE{ zI~fMRF8Y#8_cf1sRt`Q=bzy@-iT6ZT0uNwCe(p_+H&Q-i)JoHZ3%2d(BP%as*96J2 z-BLV*bZj&Y1F80*Xj^bziXF-2KshXZyImLip-_t`p<*4Y7cQ1YR#OG};bA06ht!tsFk2j9uCz+c*OI5V z`t|VYlCGgqmNfC9l-%gV#ey9nxeDsQopND)pu|S!nrpI+B*m6Pcuw5DRb-~ZZWBhG zAY^G#h@&|!POPT-Uq5xbh3XuwxkQZ!JKAV>96OM|gojuc#|pzI3lGqNpUXPdq0Uw_ zu*>(cb5J}YE2>CL)m>c^o|=rWrZdg$GOHP7wXe&+m0a}B@wqoGrc2F5r5cZ=(12Jp z<(oS$)mSu>P$Q{mN{yw{83>e#b8G5UqmdY*x1^G4B$-I4v1BYt2Sc$$EaI)5w$x}G zkzO*Huy5`JsYaujB)8|HXfl?9^fKu=I6fQetRdYsS?yXnL~YTMsc1}1rXvwGk%~bf zakE-yRGFm)j$)}WFU=cOxYsw_K+Zz?B`mL zbCTGV33LYKcHO9=qiy2O&3FWain1--wF~8^lrWbg+#MxBss#6BxYEOwqg?6d%FSH4 zg)67HcGfs68*7vXQjI|DM^x(3B@OoIdH{HGEi}_8J3ZdDGcB!>a|8GUw#>9MXVZ?E zZQv%smDZ+aB4nUR@_27Y&>9GehNHXXz5DkaAon1-z2qJu_b|Cf$jy>_jNIeo_K|xN zxhKdyN$#!Wo+kGUxp$CzC%Jc#d$+vVYsiwzN6NKQOOLb`xcYS{H!O#GP}7zSM;lCK zJra~rTaQv&D6*v^#0~lBZ75W1Y#`gw?I=|2YDVlE_eK=&@@&FW46lRiNH@5>MuX&$ z8|l!)7bFmNKceU{uk6NCg}`RABHb`ouLQT4M}RLnDvU$g_Enm|`zCRgaFcm6DLWO_ zYM`9c5a*1AiBks3xeGiA86AOgkPI5F9YivX(x5p+WJtPdm{e;mb8^I2w;*5L$}Rz4 zP1rcISNq*Eg?*3!a4g%n?|>BEnQLgzHo%v62_08qXGUnOwi7hYM)o)}A7>p>=@s90 zWFg+o1{||jizs&H?48 zhzE4Pa-D6Ho&xII+50gK`Gd^-AS0#Rt(eA#80P#MkOg+`2?%dK&8|W+LDJ6sAS3l$ z3<8P#022AAP=n>F_N)x4e2P-hU&T~D1@t@Fr@`GVe+Jw=%5#j&TK5Me)Fgh6ZM!t2 z`X0b!f0d4M@bCdr){FW}ffVpAzc$DB380K7twTG9v|{MnLykdh(2)=64qY>Uo%!|w z&$|PneUV+Q#G~4Ov3{H{P#9#SnjVI-dnjp3ZpdwFMj3f zNKlB%c~QSAEcB~#9YXyM9MrGc41QNxZcD|J2`pG4IrpO~8_Fa3@gX#43v2jPp=)At z+Ln$B+}uSAXIBXYpeMS@t7aDp=d@cF1nsd31xw1UmgHU_i5w2edGHhB%7BdK+QHm? zrIVA>))#;Empw>80RkKrmi*Y+$zaXbNn$;k=Edm7QY=SUdNn2Ns#|Gg^I1`03pZp` z*}|1c;8%4cpY5E16~rYmkL>j|_{mCD?}oB9+}O{UKns?opxHEwJ^iJC7y4XtPNugf z`ek<9T$57-C_z?127aEA+@VFl&c)h%^W+ff)7WjjX=A;6!kVCE(~>tz(^4d|w}rzSKB&p5;vHXNLrTt_^o zz38&aR}k5f0%7 z#QVkD4ulz$A(D3nqH%{G_I3mlu1Jn5bDC?&T}$qIa@)z>$Yh7XB~`Hu&Jkp|rF4I zvHQW>4Hh;dC`CPcHLsdcVZ}w&+91$A5on*epT5Id3!5Lj1W@tNxkZF9w+|>eeJdJ{ zQE;(2Q4K1tnwxX(%Bdc#E;9HD?cM*$mNv~^ZI}I?H^eUc5=PmbRT){XMfMGgS!7?m zIre+r5OeI+w%F6LmD*x&ShX#7rM05F-Gx$sU6vG}rNoW4`G)h;`LmOgV`Tu7OIzj% z4O$ATwZZeN?kdEJBmHw0eM_OchW;E_czrNmDx7`jLP5oc;M|}c@pSV7*?p( zFRS!jqe4c=7Fr>qWC;)8I5Z9ZHdnkY9FfBCp@%xcmS8moArW4OkhZkW`q?NR)LRmm zSe8-%miej42MWU{%JKHDG+$L22-R!yj<7lbKkkC?roKU{ZZ69QQ*{nc7OaTfEAJY1 zQjPO_Lq|9`T5jY%yX$x`xpL!sD6LY$N?Lv_=ka{W?k*i+1A7(K^fG(p90~@s z6*ME{djIm`W4T1T^bR3xWa(BUP;v_MhdAeCR@lC$%Q2(NFM^%_^@2=!@YoGS_1qEG zFl_12N^(@6RFfEP)DbHE&OL62hdT6*KsD(h!0irQ};Rw4?<$4>@vI75|r01GCy^Mdsj6>Rnyo!=i3>WcgG5~ zsT^BXD)TADmPe=Nt!?4ibiS|k!l#tI~*AateT=Ssi`GK8xXkQ-}^b@05w zXl33_%-GD(kf^o=&+xU4T-(OA?Oba$I+=Gj`0qm5Pi+s^x{N5ihPW2vTAXVsBg4FV z8Om^KyN$!}aD;1zjN{DP#=OVi^%x0O_91Ad)<%e!cW~t{uH3_ww{T^UE5lqVa%F@o zZ{^AuS0=b}fh$v7o#u+un3kJJ^ifvaGb*?ZGpZ~rdgF}h!{3$}HKgc@uCJX@Ticjh zSr6acZhgn)jji}Se0djzOI+R+!r%1eU9CW+duAQem3`p4mHjijfVkds`QUCu>pFUQ z*C7Q$>izI=jA-8sPi-20xp$I#H@WA?&5=7m?s;>i!LFS254wdQ2Q(iYSQl}a`%$YuAaOTRKY78)U_bHEydG?;t z9n8D$RKUj?_Mh^3neV_URc3zH$POY`9cZe)JU~Vn1rv7*nXBEX?7hd_Gh0NFxbW3Z z*9&x)0HHS6fS#(f7ennc_lZykFw`@6s{ns08tv*A!TPT=AL}=7631{Pt95fun?*(N zBEOo|*L8Y=%sl-j$@ zu7vN{`6}K~$d_4xwa>W674f4MScf#O71-=Je7HI;UuPSo%XC70nVF9={5%Ao$5_$x z;N>9)UNCgZhuDxxw;O|wL2dI8ALKiS^tE^#4I$+h(D?13I;aiuJYT2lI*&Ru|Lkk8 z;qm>Ts;ij1`54g7x%=G`=E8h8rBoW%d^_=G;R$#JQjohb$mp0>|CpCTNwb#sFqFBcz%`a&I=&j5xH6lh&lccz%kRh!0&jyx`eb!oH7{9LEyb4Q*VV6x z>QFFUw@4R@OvZ&FQ=hR)t+q-`k=n4BYp}p;B~_M;a)Dng7dRrnSiit8GVH)FGV@Dz zfxj}p!0SYTzgk`3bvL%aFD+i+->NC_dMxk;ENeTK+F35}ACwE6l>eZ9f&YNI`X4a! z52>7&F+syFsE1y?^(SoWaq~~vw&RjQ1>RWh%`TYb z)B{k|AJXO0I_ZbZ{1Ka_d^;fDv&BvH>=Ms*0g&ilAkqH^iK5J`qT9jXf@HRKy&>Ro9lhD-CPIc_sQ5?3N{zaPil3e9hBY&?r!!z*?dZ-&KY=~L?*=y zqWa!TSE4fYAnGVZjz^?VAUX3RvejzJ4Qn$fAdL?58O#n$&zO}lRZLN;HH|TxqKYs@ zeF96Z`Xx00)dKTVD=b0M7HrH0?6}{@ns~lk6TR~Dm71_7?CSpeJh+G0^RoE@RYhlO zb}Q7!yYN0$exo|5YQ88cSEa#$54bi7=uyZj)$^A{U06eO8&1O8v5+Awu1|HU{L?5w z`YkHykP1c3D&LYt88z|aptk3g0vFh|aRp2LEh;s-$K-Fx=C@^Qvid`L`GdHbN#-Ak zI&zfjh?na~6LrJ~9h-;rL4D_tF{h3+s6QR+$k6pDcTgR19qLrqun6XNWLmg(TnfAh zt?}JTO5isqrLFT)+F9J$xj;JCYSM9-|Hh`W&QgZEaf zq94e`CN={HQ|BQJF)mR;iv!9)Ka`)itt6Cz#YsYDC0VX1wN`VjvA%a~>`0-Qzc@C1 z>tv}kIygEuIz3t_S&|nU7D#4Ld@cn_`C_4bIZTw(E6UkuMZmkBAc1{lzvuzh$PGue zv9fw@PJ;-L)D((i}{gR0oCmXoVkSElPVCR|#HEJ12 zuE+#cC%aI!R&GL-TD8?^VO(xgg*2n0I-X=Mm#Rrzn8Z~ZWM9A^B)5^=5V>oZ;WQi) zg0rE45!8u9xKw=*jp`u)DKp5lwpwktLsm3LhYe1yA~?CmQt$@jGfnD+nJZUEWV2h~ zO>2%;0aI@FLSGduD&vy zd|6`ZbzEB3k(?-(9z{7BOq1){6@+emx=h?8W5qaOT zEONS?g*WJsc;RY2S5vKGa3vzKMQl7cD=|=1Ii`hJi0e9ZZYFCmU<^FRG`Q*$(pRv; zNRmbvzp_(ydE8!d{m_dw27OgQNJEMGy^4tHGzL`FLiMvjcsmLbg7De`7r!tTU1{u@ zv1{>()$Xtd4lFUlb}vEa;Tydg*$MAmJYi_D`Kway^%Z7`I{#Tlqw~*ynHtDQN;4_3Z;X{-0yL_ELNJ9SlpH+E4w2S zO)j+>ug)r)JtfrC99rwJmZv&v{Eo$DmKr+NCHslj*)gVSk{4STZ(mI--SIk;s3;N5 zY5fzmt$*hYOJ{DkIy0|ZxlpjkdcNm|rCX=_X6JO@yKY!w^9Dw?W?fSLX5> zrwx=s+hC?PY?yILzD<(k?|`Lz8}N`j;CGiKg?7{a*w`a?MZ!^XW8@~tO_G};H%)Ga z+-`FBvzAsvlbEg(*uMoR(v0XLvO#G74ir08on#r$MQHyVRdP52{IeF^TIyXTRj%T@K4(9Z%E}26)BWp#Ru`z0N}F zTg}m{*NSdT#(e9bI-B({OwAk{)Y^l1579H=_uFN2; z&r+{3-_LT5{f+3)u{WVk{xfvAt-K7`mp;nOUtzhX{w4`L%;(tbGkCC#=+HCl{UXbS`a?+6sPHD4T${i>ZY{QwL%c~#nK$|0OAFm*VX&4BT>HCLd=1*PH;Em)@&sC?imr|N%DXT7S8io`(TN0d2qhO0R?cfd7R;W(= zoLwf%SXMYJhtTku0u!vEF~v6dg1^imb3=CmN2gWnWD)OIHmxF8xVrT@8M!)Ujp%PL zHlopRuib*a+ivVoM%pL|jlU-frBeRhLcO7^QXX3Cj!pbTgVGWPUisL(?Z%Ext4uT~ zqv@zh>R8T-GM2EPtD(9Df08+n?S^sblHFcUgBX`VYBp#txfMp7ON>jG=@#0dGTUK# z>J7@jG8Pht&yE(xhV3@IW4UrjltcsZmjL*x^wuNe?s{B|()(O2O)oz@(DH-RB7##e|a`_(evCGaz2?oXDxfkp| zc4SOz^Fo0}Dgv5LJ3{Z&=0zIT4z8WYieIq5Pg|wb%Z0J~vr+Dg&Pq>Rw-6n2Q7dE7 zneEIC6mGT0hFFW@i7@a=(Xd1GY2biT8CO-Usd2QI6G_D*uB!G`qv=QnEvhAfHOs_c zNdvwsl88jrXe60Jd*p~OkxHtuL^=WdSvssn!|0cZ$27_SM2Tfk@lMtnLcV67?k9=P zK&YigrnA%Hu^7k6mN_{?J2${rp>4G$4t$!kwZ_Jc3e469w^qj2AXz@fokwl9W`bLv2y_&ZN?rZj2e&FCXYR*h}sqa*vRkCHEM) zedP9&dlR`glY4^PljPn)?ycmWBKI`8XUIKE?(J-+VQ|UmcaW(YiC8zb1z9(FD>8Em zM@$8E+acgyG==U?92+StU(^jO~Yj8FC8F(A7o=3+@evfRFKb4oL>{Y81C& z$06VuePsP@CvH*v?zxZ)h?I~9_9SDg9NM0T!Se`8$y5U^oCMEX5VwHXE?L#kp!eOl zYPzMn&3k6s8$G}YokQ(GR6Z=~$IXFR>j|M170vk-%P{#JJ6|R!h63F~%VrU;W`uyz zz4&I3 zEZ8WAV5cB8ql^yWMLflXkY)Q!>&qR|E9Sd$ZN;`{0uu=I#s=DQ-hQt%(q=xwkjJyL ziOwWbBI! z*>(f)VQ4e`nLr~%`vx1>h%G}!--K`)cf_ugHB~!>K%!Kbl=L0Q zXPTj#k@9W=GbTf6N9@G!6FJf5HZot0Ri}pV)xo+K9va9vjdG)e+77 zzHRu>y6E4K+m$nlMi?Eu=-*jpz5gY+FyCcQ;D;xt%B=UZtS$g|bx`-|+fJUpx$n%` zqbHA^c0m9e)oBiRz2up$L2id=CvCHaEU z2~Q10I+rSS*QLT#$--E-?T!x@@?(gE4f`b8-gJcP-JsN14_VTjk!|Zk&QH0ElNTq1 z(TqaLJ3d+}L88`ca85xwBJs%5`^{=){Nzb`GU;XJ03-2U9HdYROx{x1!sBy4x@2Hh23#MywLf8RulVOV6E)doFb~$z~EBiHf zk)e7Cc7$E0tL7rnne0~tDa(#dmC6<~<`^h>J=RDX1r*=unpvyX*r`C%tC2P+8%nEI z>RwaV_<^7tu#Nw~>#9sNA7Szf>teCUa1}CuByJ&*js02*t%4A6h=&U zFPW9CW^+gBFSh(O(!!M z$Mi^Ha_XU4<2Z!}fj1vTo;E+WhXRZiO8Qyr0oc}LrpAgPUMj}4NH_x=Zz__8$4Dj_ z1`lL+cPcr=l20%lqZ`9cA$8QAHTP%AOiZEb5p2gy9fo%-FO`$Lbg(EFI|B5^oz zk(ncG8?t*Llbv$K&s8*fp|9nfjK;DJToDZQ8m@2R@@6h~py6_1J=U?Etj&hFV+WUa za>p+2XylGg?$}LMWuu(OxI&PKa*8WyE@z0>-p@TfoE<`@+c?7IESGz^e2go7T)m0Q zH*Sm4Ho z7*{^Rc*8Tu+ydvXc_d|n%jMd0xv?oEZAv~SZRmcCZP;>PW-r?iK0eb6?!aYmkDi~2 zunm!+8HH`Qd1Pi7+_#cDhHhqJW?Yh{NSG^BlBX|Se1O~s$$g02w~_mHa^FGjJIQ?) zxsNjXd0hOwTl_pBex4LR?-4)0B!1p2e%>#BJ|KQRD1M$6KOYu9A7$*GbA};#ecSL3 zSc{=q2uBB*k2upKot2p0-6P#5G2#*=D-v1EYlRmIFXmAD*lZ-cW21sEfah>Xg2!;6C;^O37EpttK^>Y;*<>9^(EK3tox-z`K@|^2 zhBR?H@-)T@7K2sf8X4BT`C!5ZGO7K?%IXQ@cq^b%- zWf1c8O)F2|WajT$dT<8mzBP3)aeRe3jI$k*)g3Mc0?=Z=$8sIym+gR-#q*JGfe%^b z*m`9avWEWV?+e?>kkUFx>3fvYUg>+x{65QVn=Nk7Zi7I7ih&%sgxm&!enip>J6^fY zdZiyB%p@vZ6n7Ea;9s&_=WMnU65N7^Jx7@^`G5g-LlpCG*wxwm9`ir5t7H$P3yA+0 zMm9}UhwJCq06!+B%2yy8{p`o2R2i|9DlxquGxI0dMK<+sl4drI%jVw;O-?x*l`x?B zUs*0jgCz!}e~LllXc^>6Hp%+qY$iUgn*WXZTrO2iQTo@#D=Shb%j@RPST3E*;9+Hd zhLP=%e`IJIg!^|`LCmJJ`r<&a_qrC=S3VZrh?C7tGe*Ui%g!(hYw0d;*02*>( zxr3C=gV>)H^B2%*pJCr%zt8*uwMT-+hM6=j9g^ft(qT!7NIKSj80zOyS%8H;3X`D1 z9+S<-^3+`+3z)_g)Hs8?v(y%6syil<0V$>#fI%+_o%n>_}>J|GL5 z4m;2q1Qr~n->rf_EfbKdMdIT`Vp#gPY<@zJ$o4^?Ps+2o{$jtdN%1Q(Ha2-Yk-Z7N zei})*Y!c5|B%YJa&sro-K%mc6llc5x62FQh+%}0XS|q+Gn=e`sMtm#R4S!K;mmeVqE%~Z2lI0@TyF6?7@+SR(ifkMu>h_9_Y^9+JCDw(rx}nd0=Pm z6sFbQe@Y(NX?`1HHQ16jF7r%5!l^QxJ6AkM4oTkJ17F1P-%DEc@n3z56^DVLuSi($ z*;Hllavt)z6?Witp2^iWE+L4+&YPbHJ`5P{-AiYsON7Kzxf=F*o~S=RFJP^fLsNvL zTQ}RrfOZ}ahITC@GKQmTNjg;WP&}JTY?<-x@JPqVTeq+!I-7D=f49!YEHp5OsEg%F zF6~@KW-Pl0bTk%OM)=y-xn>lCbto*#-wnJ@{;ocdeYu~Bo5@TnVcU05qp3LFFDAk& zuuFLH7^X|cI9^vK)kr)QQKOMW(pyWate6Ch949zs6$>N;SlRU2T+XhDch)uFaMDZAmX zsnH+6fX;RD`t}VQ$=ytD2f16w-Ae8@a<`MagWR3u?uNoBpj)P~P zeLGi+jc&o9qm`g3@VpaeQ=fE~c@N@olP11-4j*S6FZ-GVMoH0V4L=4zJGwBQ0kPpx+x84*G4pRdVmkABiy_wfYGZdN+t^^@10K{Wh_T0ij%cxpaBXf0+kBn zReM_^ChmsQN6*}P%gG~0PoK~Boj!WRKRGpe@90E+tV~`b*_2(&Dry&n71CbTAVtXx z>wv#=c{D`e^zs7F_X_sS_Y2G?_HUt2MhTs(+hSraOvlq|G@OX3(O4!Pm>;lajh%Zs zBu=?WFv>e+$HpY;4~|&zqUk zMVfJnN_HtF9rfOr(Q9das?2!=L5)?dS~gvWE#A&5wNISvax(5|i^{fbXd<%HIomHg zvJB>u3<_7;F?z%ucMr^jb7M4=V;m9?$(jR=^7RP=k$pJb^k11BQO%pkfMi)9dzX!W z3=%$c1_nYrn%#QE5p#f}+eY;QSZ(A~X5`BI@` zoI1ArQgzveua~g2EfnU^R5lwm5XgMGFy1>|V?*0pouiKQk`{zkcEM{+c-9^gkhW^=FsHi zedGD5`!rZK&YV?Cg~ENw6%YqvHerE&e;#N;;SwvLA!1-YRg}XP$ej-1tKtuzDimR6 z99ad?Qem2(7sj_&5?jQmVP!1)uj0WQk0W_pcyo<(A2kG0oQG!j{i%s{7ST z*BV&0cuQMaY`oA2@RfB|@p>^oRcIIzzc#@J;?XMOw#Jryd4rID4;ZCL9PN0e)OaG2RukbwTDK=gV38s*HI_&w z)L15(P~&lYjVI%-s#yW~u9#6y7VURsyf*KoxkH|2kM0dMw6Qk4V@je%oNC=9F~?4e zsZyPWixDps#LFPqBenkyNuc5`(fSAkVuxDvKj0UpT;gyPGEAD4_<6+6c^kyN5*?I^KVl|?` zrc3XUwxMt!id$|+hR#!0+;T5)Wc#WuJRA|?mL1Y7XushI8hOZ?M>?d^%f1#oe?CU` zV6J8rmQ|(ClwLNoB>qPyh#H+g_s<@;3_+X(T4(UIm%ogB)>-p5Wb2B?GxixYy*i({ zME4!H)0>M7ML-Pm4t&qLr5)y-v&YSQ+HEmUG@m>qIJY6-?npTTS-S#;#~X@bL)K@p zdYWC%`=Oju$e;;}*}^i`gGgno^q~0=ewhuXAr}u11ZGD9=G&0&rNCD3c{>??YAiP9 zo6L6*sz(U&^v*e{JwoTuw&Ac3p>W~TWY(AD93jEG(I74pDSnKsKEub^;C@Kq6KtS) zcBI+-BonEk!Kq&ncB)#7t@$?dQ>>isr`eo@KT9ULa9p7ou;(pfP|q{-*V$GQT!b(0 zL*dXb(ZPH0WwiO#oLg61H`0t-&#zF~o(a&2`*!K8%>1gQJP1KwVzasR#r4Gv`F8Vb zY@iWsL46%9Ol|Dnh~H=!=c+FaFe z)RImJ_B&xFb1=Cxp(>rq$+KjJEYmIkl<`K37Ap*U7*)fMm`8HjY`?}(**kl+vmxt% z=~P8?Mq7`Y{o8D{ZMTSL+Z?Llxfcg$$|)6PJDQJ*Xq5rGN7t?PrkLc<>^+t}6@_+` zTc{kRdx0qLy>Yur+8maFE^ZzjEbHxw-KL$Dz4fz#!qqmn*t6^cEKn7J`2;FF>69f8 z8CiZR78gQ{p34f89~@hJ$Nomw?Ya4Ndv3wH6*ECJp5k^{qTysZR6l(Aej=4hXd3OX zam30_QhFj=e+uoS6+f4QTxm3dOtmp0V2I-V0}fH43Qlf-+$IJaaurR4iCY56K^stl zh~hLz)f#+r%Y5lpG4QsU+i)ChClH4n$E6X!0H&;EzawYhMkb67 zF8dt(*3%H%r!9G`wbT*%mc>qj7Ccb@?3?AF>vbQ=Z(Q<_cDV=inN?Ke;>Y#ftDz{O zW>*t+zL&GF{OA~eaL?3*#ZT=&`)1+smpJ!VVyT1@k4BVaIN82bO}!az1(awerk5`T zXal0azCc^_VnAEV9k2_LS9US5L2lo)aWg%4;Kcx6?ZtpcOnM&EyU4{rL-oagUtA23 zWxEA027=WW15M&$pb4kd5M2y3*KSgr3tkKeM1UVJhzL;Df}XEAZqJ=ZcQ34P-d!i! z=nXWOXQ#7wemZ4Lf#iy^Hy3HZdA=-&;iWCLtsP(5yE3|EG8HM2MKtw&WeQd_y@&_t z@KzBFv5xp#>z2JEk_s;yiJ*67MVW&WKrjjS6&`X4GeG2*Ss6v(8`pqWHGMGj zCrU8CUMg^ufVsIaVN4VX!()Y;3J{T9Uj(3 zI-Pb^bv@v*Q(-k8ji=Q}ED=YD0mL4NCe&D*@Cd@-7fZ*~cq$A*qG_}lg`4V-OY=3m zbUz{t)Zh!Ot>6p5ZW|$%+$aVlHz3476PKGgU(4l2&f1NQ;IqkSUrGCC;AZ%YaVNm9t$ zgDU2l6Ge#}9L0*b(t}V#dLv5a8-(%Jggk=NS?_px8yfkwkC#y*!Vg+a%+f&QRlP;L6;Yp3id(+U3!o6R|{UMm{?4wenT=Hy*MjUFO2{WYZf7y-(0*`;buihkK6agLl|KaTHsxt>x2qp!=2M7Mhv0heXWNeBVRKw5)3_O2nr zd=BVaFHZAwY|t2VW*Zsg{PXPEGlUrN1?EE`;!m?d9okDD)CV0+Uxa#lfnBrj0=7W4 zea$+l{~Eyt{3e5qp4a>>LJbH3C;fFg)~^;aTZ6a?VRVpRZYm#1$=dRc$t~nqfyqwC zg7%hg>ypRhb>hBp$K>-9t2rh=y7J7{DZ4n-F6-}lE=(0JjZR(^n$y+VybZSgszqaE z>bg$Y@K}nlo91h6clXsQFeg`0G{^z5+Dl>*)F>y`Q6X=blbLF*{(9E~3uyWuT16SE zs+(lMtFacAWewqtJHfBp87-0HbOyDt)o3ykS7VV#V#%}n`NYbHdYN#7b|1P+_n=y4 zs427w`C-mN?z1Nw}dd)+#xXfo&SXvHW&1%vP^N2VbRJBG3d=qRBZbp$`Iy!VRfvRfH zgFACRp(_Cn&V%0aJh-3FIhq&N;E6TE9lt%>?Q5w81?aAXc=+Gy++A3PFDH!5E%Fd0 z!ANdeD1(*45X(V4%rd}D7bIuNUfDcaHIQB1@Iw%4ie?+PB@5R#F{!6O?xVr+zJnYS@lOQt5Uhv!^#9 ze`thAp&O=JH*3Zv!R4u05|~&LI$#ptf~&#S0hW{dWfT_KMoR+J?pC~L6-&Y{bN6g} zBi_*NfjxOxNb@MLGDNl>uUZq5sCQDKlsQ(#;_Vld_L~QDd^XEj$7^3A77so**)ZdN z>4=#n;spNYP^#9N6FFzjb*0~BtuRy`)65euz(ZTM;$~&}|m1W-S z_SL=BZI(Xu=DMNnt9v`!Z~=DrXGf+cFWx(X2bF~-Z!K%-bgeLacm3GO-7J$HKf{$CzBO@h7Miis5_Q76pyv2#b3( zpjeHiN!yG}1eVh%E~hcEP1YQ^LEVSDS54Yy?$5E=em2LPaMLbfBmPKG;STM9n$s&1XWAMMxBp1dCl!t?TRPKzCP# zyZgpeq#(SvLKycPD1XBTFAffl6-v&b{KQaU45c7FwnP^N+_88DtIA{vO4w&YHBv!B z3dmUrTu=AAV~M1O#wI5gm(jfY#>_Dy>2o!;Wm&Tg;{gL?Lyab5$?_R&BAIcJJd!Kq zB^7124Rhz@ikmPW=s*C^Vw(&P<8m|20V=7^=uaw6_;b7Q_<&FzP}RNbB6{q%6f=%2xgSSIn4$@C%qA13;Q*-b{5%$3@}O(sYR8X@+>0sFy6NK1=F~Y z5G!>Z%@2*(BO=_fz-YEZcT?!M+~^6$CchWSLwh?%Cx%BajSgSTkGat6g!t~VK6gYC ziO%KZw5tHlEfWR8Y8=Ur525)fZc*E@EDGpwi_D_k|1CFqiM8`_&MLLV4<@4-^nt1>?}hUaUg-l>8zF*)t8t|6F`rwV)|U&0X0bH3Pzm75o!+*S1~V4d-p zm5a=k8mp;wTfsIgM9PX(wj5J+&MXjF|PQB#wwUZkQi7j8@JqDNxU4C2?My*RQ%I!sW0 zm_-^x&7oF(z22d3ZD~|ce7lKGD-GPKXaq~cRnD8Z9^ys|A}To7akZVhHgoqDu53rm zN);Y<8v$l$G6B`VW}nYkoC3T#<+d4>xwQ>5YniiQ+ssDvp>wzRhMTB^$1E%w5mnV-KZU6OQ4uw2ZMCkc)>@NOL+hrK;*v?!V(r3ns0h^=srTQxJ9T3k$O6& zQjL+}9RN-EPNS-PT3*tem>Z+6Sk-@9JiQ?qcI0;JVRvit~7&vlqihKhY zuYJfG5yNQqN**tzR#etX(q$Znwc>`VcWkV(Pc6eb>(hn&)RD;tmWk_7Nk+tCqy7t3 zEr~E^C2!T>=}1Oz09uI-y>QvKDBP5j;{;$mwdApvle!kQw{=x}X!#XkUy;u3p6+~A z7F7_q(Lgl~<2l=R;^^t~NAJ89;{~eXVG_4ooW5!0*|hq> z{7%ri;FpuDPNi;d+rNBrbLNO@qkICX-cR!F)nRO0!_vrTaoSCRtTwQf-)cG5xyR^a z401b>0?&!bi=}o7*M7P%R2aPkBXaWMbo*qn{g$cW!qnE=CJ?V3r?vJvac&tR2%F(e za|ZRL(Yy$5g@ZwUY~__)w;wI7lU2o6d#9lvL3yki+Im*Jmh;^%(0JO*Wh4qhdZc5) zGFhDyOLgRRmC7PySPj<^F3&1rN+sjG!4l5w_FN-5Ev z2R@MS|5==xnNygVX{4p13n>l*#de}HN}lbLQ|)DckyJZWQ2X@AXsNwCfB{pubAxq}xX;%R=M4@?4xMc&BUfpILdeT6M@SkTlPU zl@nNGMc=##H5*W~$wt9EG)jZ@jyy_GcMRX>I;UzAod~1h85M%j*vb1){$q6FV!`&<-Zuf<;}jI6-L{L^ei-84TbMKO z*DNv*99hYnwouj#SmDGF4ca*o84+XkOifi;t3h@AeJjmGb>yZhE0bieb8@)Q5k_5% zvMS32c$KYVB8tQ<4@}q@CEXJh>GKE2$za6Mm3Of^Sva;@D$q%>bJ%pO)EgVZqRi=H1ICId+;V3h1A9-!+Ari08wA!D+^5u1#?2`j-p;pIlEB?)M}c1(Gq%)KRh`(eUx-zdsagq zt!+(N1YjvFmGbu%beqL;PuHksPA=Tu$Gd`@;y6sv2bAZ*~91ta00`0C$^@{-%f+S zU9;^)NUw14bz~h=A^V^BaB%gx&0nWTJ`bBS5rx7ti%#_TFRd2wv)byO)vcTCcB zWF&>EzTy_8O;W!9HdVq;WkkCf<0x?-i$&65Es}`Gz&{g@M%82@oPvOsrlC&C$b^R2k1QPZgm)>t|UO$a1omZBiyS0^D)QE2N(Iv$N^kz_Jy zH>6e0a3bldTG^p?5}CNC=HgC`r?FMziB!A{UO3OdDztyBRbwHgg@yD`L#R2lUh4{l zo5Ok}6m4T|v9@?989E&r54}zQ5DWbp3;hNQeV>JX&J;J36=7-B<85HZR~VON!s8?) zEau^w4*~vIfGa_S8j;DEDr@0t8&`x0)^@IJ`jFKF{U1 zaG8v!%ER2b1`VS+@8!-7+&RKs_wm34moIR6ipwP~PjmSqmoFLnp+FDt;M;lN9bA4V zmmh)m%glJ3G2=1Dyzgd=J0FGrC*dD$t-crjpJJSSfbqr;!vE9o|6%z52;;^x;Qvwh ze-{2f#<=zg#@(NR@Xx{TXW{pA42>}NBwm*gcD?o0RasO5Dz6Spc5J@(xJD{#c=;^b7gf?*PBzF!?Nn{x*30A^X5C?*sTCNH{S^<{4L#l7yU}R?gmM^ z<^c?P9>-wd!+>=TJP9c;3=Td6sgHs@IJoN*6nPFX>5~+L!Cjw%)N>%IpT_KiyI!OR z7~J_8NZ~ZvHTXGRP95C!w-ot2w(>=+Tm2FRU&d0UrMpH;zYf9!SJziy%P#eZgh}7F zll~4UO;&Fj{T|#7et+i{N&Nxbrl>ndM}G#XAHt8|AF-N$v6Fu8CjA0#lhvJz{)1Bf z4WEA{o|*If8~!}{J9_>tKL3|^{-byXb?5(Jg9`i!q2IYPC8z!uqtfkgj6|hwhdX8b zDy4VPL+L#jhee|&(r`+h%ZuDbr^f@>BaX0!2H~PFA{iGZHYd88SH~Kej^wVzi1vmPl z8-2-*e#VV{){TD7jeg#ZzU)T-){TDAjegmUe#MP`)s245jegyY{+%2Bh8z8RH~J55 z^qX$aX0#HH+tHQo^hk!aiiaJqd#z?KXRl0=tlp^jsDn;{=|*`%#HrD z8~qnI`g1q>3pe_2ZuH;X=zqA;U%An6oi1MLs|&=Da_CaL2I2<3I+Q+qzWi3BQ@%xH?5Nv zKyeot>1@kV0(m5Sc4U~mDqz0JtFeWX6^73}6UV^#F4ygdwWjPHUHXBv@*8NC8;(D87k7_%R@*@8t#SB^g$9c1Zb9|2QTsg~*5Srv#$A z+a*HQu@B&52;$y#k{24HVwf7Az{JJS^b!0ihUNk?Db}*DT^f*}^#l&q?O3qwNg$>3 zl?%x?_^Le}QX#B<7xtzV*5tQKAH^JNZ|;!lp#6;<(p>1cu0xsw>z=|g5m^5;{;Yrv z&j2Z@cfJchVGAU%jds|n0+w8jpP6JyH?HCSzyrb`c(Mn=YA-mtH+jF-Y`=uEC2z7- zZ%Q!n3d-)4u3%U8$mv0uUA57+9!@0&vBZ$$-cZ5Boxj$&B`o$%=rI-#8tfh*p;F6} zFv&|UCe~u&dw^_;pDYYX61j))CH-6?-wz2N)CI}P`Mr?LOXNv)?ET!evZ84ErvdB! zAot!7IDHo8N*@IFAoS!XgNdLtn9m-zTO0!+!dk~3v739$Zf=l_Tvfs2-1~HaRX{SP zi6X%2*oVM131$_a6fQ454C9M?OV|@I&f6ecE06Ss*hgSIym;ISjfHE+dW*?V^)wxL z#_7Pb-0d@s%^rmRuW4*P1#NOPw~JfqfOY%aXaIBmXrZqgiQdF1eUEk*L6OUxoC`Bd??>-Ks44-m9;& zzoVK=@|oR?HGPZM)Fyok*eOU;Ijf4Ca@Qv2D|IYwCoM=Wv=)k_ad5mPZ@}VbY(TyP z>^lOG3IgQ2hj7!8ekgxCmOgPgLq#fk!=GXX@xv3%*WI}VJdmz4sT7=$s*~0 zouqA)#BP!Kx1=d%ki!?lGH{Mv&*!7U-B0Jt$9|O^m-|#Fd!Ndu5Gy=&w6Gs5`GVXNT|5|NU$mh+m1qR&4f_(+uGRK7v9IwMxv?Qg zzRsV>VS1uj>MahIW7;=F8qXE(x8IH7hz610Vc(plFLOFX|*ctvn-{(6#mi>t; zOf`5FR`R21D)~pA`)DD#7W$`59X}Rz#KQyKajN|%{5fpl_xeq? ziFPTu)>`{~;V3QUHz85Q{yUR;0t>MJk<-VVX^u+s{&;-I{Wt8P8H zpzpLg6A8i?%6OW4mcLaINS-gVcw2cRYZ{*$(ozmOcpQ^NCK06h+sk*N7*jHX6bTC*&^+bq*%Z<4T7fS=;k^8W!k$-7;al9sO0Cipn5mfPq5{nH0%l?_DnuDs zmH48B6mRz9itiCATUX|QzZ9aje z*q3-h;%fXPUs00RB(F^;u7%{DbYc%Alj%efy01|-v9Bv+6E!5`_IM5L;=IisZ1aO4 zox+*$AV3;_9s+qBe;x+q6@{gh{sNeiUMkFJlh&75*x*U&1$)PTA8= z+0!aJW0yTZWviSVKjk^z4$@Cm_A@)jLCR6>6m^Nz5+l$TVx7%DHOJ;x9aRxJvonbYVpI*(^B*LHFlfcr)3d> zHPYh5VXclGcajA$=p>)eiK^<;IBvZI^H?JY=wjW_^fV!oyEqJg2hv>vh`TrtcX1#n z{06A+Ay~Bc>Fk|)I(fu8@;vR3+~IlhsCD%DqbIrP<9l@6M!p5Ok0|Utdh&*J_YIJ` z0pWcg^&okpb)(w}o!yJ*WtvW$bdqyBai8df&O7k{b@V3dChN_8x;2u?^Fd6;p4BS2 z<{qJ*J**4N`!MwgD0~IvG5k3V$|E`()6>>lj-6qT=(R_2aXqF_@ZNCCxsU6MDeVc& z(iA=e#Y-^lBYK}&7{thv`b66LtMSBJZPMZ?{+xI#vII5w_%SEnvv$6>+4(*$^1Tha z@JSt~!4kqqv_-tg0lijwQD>jQ7AtF%;(5ez=*gSYggetUK!I${P27z1E_tH=JiZGn z?pu1nUZz^>R8^4vU*@&`5Tq|-mwyC6KmQ2wmv#14eSD$_84~t2J(+@Z_{T6l7XAs0 zO^k(q3S)^B;5`32)wPr$+<|p{(}wVyIy+@UNRATIdh!;S4B{<-FqY!m33{6YB)wwa zrka;IP=42e^1A}c?+PfttF!MTlyeBmADkP?A5vXm;*~aGT|cp*{E5zf#-Wsp=V1AN z)|1DwpiCUYl0jl6eoilJ0C_6=SE_G0;esgE_e%%1Um{Td2JlOroz=%r7Sf*21W^AD z0+3%*!4(c5zqbMTz0UrS1;`)u_h$Nz%#l0g~aC4+sI11$x}68h(ibof;mJN^oLnHL`) zvnyzF_JzO43fMmw$rE6mpzWoZ+P3h;gdz6h34?vxew`+lE9@1c2cv^0fSopoW;t3I z#ndxAp1cFBJD~SYj6Vo4-UZgXp!eOt{+I>EpQZ!je+Y~= z)zm%TAWVF#=@6^$lHpcUP^q#_rM_F1ZZ+9$X7W8?y$8bYmDd3$Ot&T83&3r&A2%0o zVt1Gh8T&p=K8VS8n&&2C7f&W*liMsJWS^Rjex1msUuAZe$vMY+LBj7%?cYu9zuTW^-=2LtlGKu=T9bRFhE-U_H z8tLSHVBH5e+@u3OW{MAevM@%B%yC(I#AJ_{$=jj(c93}aN6mEdeh5Dxci#_i1@t}u z>@l zUVDnr&*tQFkQ}u}BgtpMdKT;-ZkvNMX2LkfopYu!&LQj_)n{A(wk_+~3IPL-^>_KR z8zkwg5Sz((xNVFrtGKaq_xkmnJ9io*NBa8*Mn<&G9Xqz|5Sm&>qN8ie?j4VxLPY=I zz;w#e#`T(QySDA+gX`ymYs)4V?i}bpa(HO; zCO2bXXXpCeJGypVEwXFtw`|+lsgDdCK00t%Jw(D@{h~cb0Z-$q&yJ|;;@M3CTVrR< zg-@C6*{AP4JkY!Erd1bF3on?ha++<;Lzr13agpf^;`Hpw}79;llx3 zP@_VMlg7zsYs1iZs5BMk;Q+e1Ns%h+Lj+ejDx1{@`2gCc2J&jFM;$-*t80ZnV;>H_ z&`4cftJK!7S$mOPa7JR&MV9Xv898#`kR!W_2z5qh4~CubVh7#!RN&p08Ah(Z>2+0O z9hEskjW-_HFOWjeZZ^S{W^ww2a@!vuEJXRRMCV9<@1X%(s5MUrC)!V*fgAe=g!hM` z5ss@awjVY;g`#?1l_L)+m){It*Un>^O|k18T8zt$XmsC8yj$QRXu-PbJ=Td zCi^1dXoR-*)ML6X5@+qwQs^5bl`B;Yp=-O&@KT;Vz*Ha zj9llji4@$EXwQ6Yb!Y9m!Z1ayIh$gxOyrciQcQxtmad(#b!t;QN6&7Nqic|`>Oi{fJwR?*ZDE17mXR2yT_X0^33+Tzci zmTGIXwaJ%7L#Pc+@djVkzMwWXM_RGsW-Q&**rYZ$H^qHf`=8nvkHxVA*q>Oe0pVzD zXjbD5O_9JP>M7pX)auJxTWU*7v{B=fs_B>%$lGsscLyb_@px-P{v=X~d}Fj=d)Nwj z!BAUUq77ZCZ&JJ9}TE+_9A-m47x8be0#t~KO6hMY8DuK{l` ze4~bZlzel%*^pECa~%KPj(>N6k$0ypM|?MU?!#Wm_hbBFFiesWejNWkYzqf}9Mc@3 zU=j%aTP*t}Fw`$&{HBm3`6XGZs#<2&O2c-qeC8${xOVz`YMXM-W+MZg2@pU|9 zD}~W*DFfp>c)TZN=v51<=wELtdBx^kOLlAgscL^J`)OD_!Lmhv#cRC%jRq+xwvwj7n_vG6-k!eM65N)&^y=Slig6gpEPvESO4Dj~ez2s%OEg zuI|yozCpU5qjNpqKf|x{*cL~EB_MCf7Fo%cww#3^Y+)@udeZ1Nq(Pmv_Lw4SVzDlX zT}A>ZFz8`hxg^SIyCH>ugY0$?mCp)*vJS)!%kZ?sJDA%zaJgvYgunLn!RuNCz z$B2nnB*S`>^R4-0sFyD13ovmX4Q{=(j}4@)g(P-Jhx{>o zF(_UPvIEJ*;pSv*I#CN_;npz{s~HQojgbV_Sa{`FVlmXQgN|9tQY?9hO0JO(u^Wf@DQa~aYbctV($3-ia)3dew zsgp+w<8+>yfLnmw0?8HW#0tP->=+=Fo5rpBv2gd;xD^=-Zy6(Trm^s40>a~563^-N z2@vjmP5`?@$k-`#g_XzN0Rp;rkgOZr4eai$M&3DHBdVol8hIC&u`^6Ad$piWAU5_CY}W|_iW%A?%dDuuhXM>*7wk^E=6u#`I~O}38n zM*8$btA>>XNxUXZSEZ!-we^K1>w$ zX&-~|CiX0(`S|nES1e^L+&>oH$DZT2i34L{i+vo%`tYM%Hx?dbpTM{_79JW4zmYwU z)8TsdNf@Ky`4kQbLXhV`@PZA&3mk$MI0P?n2wvb2yucxNksx>}8v@yqIRppTXIuzA zn+3t=G7ubOpXU&~EFk!TfFPjin*LduFJBiUuhInkI-f6T3=hfU7`{oF!0@p8Jz!}_ zF6&+<(X<%HX|X&!l2{2T;|%*YOjxUGAV897ufX_3jbyFvUBgbpL=9N0v0{F8{T<*h zXzqLu`qc1ScxjwD--q#WYfac+>?1$7JP-Fd`vailkui}rcDy&jehB0Egq8NzvmXKZ zM$V_J`rX)xAA?x_KSprh3O~W{ZSqesyjl4fu%95jYe!Cp-^P9l$IpasWsav@)s*}6Z$$gx1mpI1K^VsqMDY?tq z6-n;2cJhE<$n3y375qNtUwkv#>a`8Z*4s8LkW<;g&&3?8z1PHNwnp1FrSPMFDK>g- z2v<&qkgWCcQ&pQg%iEj%wBaK9JY@v!o0)?0_CuufM5#^~@>2lm%QxQVHqZr90_TOL1@=HoF^zox{#0LaROC4Is| zIXAgu+er)_<(&JJ ztPf+_MMiXuUedtUOwdonSj_Z zJUZg(cT)WBjHzG4jr?gm!6VKVhYk#=WEd%Lm2Hu6h$hzdOE7>rU&P0upwCyoCi@!3 zR=UnHpse-{@4HF2__dAKITx>AV~TU;`Ze~|v3(j&Yhda)WLtga7ZOv9H~SpRR=9w7 zT!QXS`q1Y+YkTxB#R!7kxjoY$FmXWF+7MIYt zrkbA>$@2_3kB*D<%0M{;svuAe0Uwa!x>8Q(M#@4%sWFsAhE_|*MX=1!mKzW?yfM

;oB7G##fs?TY%1uw5tp` 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�~c8v?UGd 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 M!Xh9Y)XD@T0fItD@c;k- literal 0 HcmV?d00001 diff --git a/modules/swagger-codegen/src/main/resources/flash/model.mustache b/modules/swagger-codegen/src/main/resources/flash/model.mustache new file mode 100644 index 00000000000..c3369514e80 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/model.mustache @@ -0,0 +1,40 @@ +package {{package}} { + +{{#imports}}import {{import}}; +{{/imports}} + +{{#models}} +{{#model}} + [XmlRootNode(name="{{classname}}")] + public class {{classname}} { + {{#vars}} + + {{#description}}/* {{description}} */ + {{/description}} + + {{#isList}} + // 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}} + public var {{name}}: {{{datatype}}} = {{{defaultValue}}}; + + {{/vars}} + + public function toString(): String { + var str: String = "{{classname}}: "; + {{#vars}} + str += " ({{name}}: " + {{name}} + ")"; + {{/vars}} + return str; + } + + +} +{{/model}} + {{/models}} + +} diff --git a/modules/swagger-codegen/src/main/resources/flash/modelList.mustache b/modules/swagger-codegen/src/main/resources/flash/modelList.mustache new file mode 100644 index 00000000000..b0c3bd73f83 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/flash/modelList.mustache @@ -0,0 +1,23 @@ +package {{package}} { + +import com.wordnik.swagger.common.ListWrapper; +{{#imports}}import {{import}}; +{{/imports}} + +{{#models}} +{{#model}} + public class {{classname}}List implements ListWrapper { + // This declaration below of _{{name}}_obj_class is to force flash compiler to include this class + private var _{{classVarName}}_obj_class: {{package}}.{{classname}} = null; + [XmlElements(name="{{classVarName}}", type="{{package}}.{{classname}}")] + public var {{classVarName}}: Array = new Array(); + + public function getList(): Array{ + return {{classVarName}}; + } + +} +{{/model}} + {{/models}} + +} diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache new file mode 100644 index 00000000000..2fd81183a5b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/bodyParam.mustache @@ -0,0 +1,3 @@ +{{#isBodyParam}}

+ +
Body Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isBodyParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache new file mode 100644 index 00000000000..97f342e60d7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/formParam.mustache @@ -0,0 +1,3 @@ +{{#isFormParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Form Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isFormParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache new file mode 100644 index 00000000000..903713493be --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/headerParam.mustache @@ -0,0 +1,3 @@ +{{#isHeaderParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Header Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache new file mode 100644 index 00000000000..ccd35c8723d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/index.mustache @@ -0,0 +1,60 @@ + + + + API Reference + + + +

{{{appName}}}

+
{{{appDescription}}} for {{partner}}
+ {{#infoUrl}}
{{/infoUrl}} + {{#infoEmail}}
Contact Info: {{{infoEmail}}}
{{/infoEmail}} +
{{{licenseInfo}}}
+
{{{licenseUrl}}}
+

Access

+
Access to the API requires an api key to be provided by {{partner}} for all requests. The api key is passed as a header with the name `api_key` and the value provided by Reverb Technologies, Inc. Unless otherwise agreed upon, access to the Reverb API is intended solely for usage by {{partner}} and not third parties.
+

Methods

+ {{#apiInfo}} + {{#apis}} + {{#operations}}{{#operation}} +
+
{{httpMethod}}: {{path}}
+
{{nickname}} {{summary}}
+
{{notes}}
+ +

Parameters

+
+ {{#allParams}}{{>queryParam}}{{>pathParam}}{{>bodyParam}}{{>headerParam}}{{>formParam}} + {{/allParams}} +
+

Return type

+ + + + {{#examples}} +

Example data

+
Content-Type: {{{contentType}}}
+
{{{example}}}
+ {{/examples}} +
+
+ {{/operation}}{{/operations}} + {{/apis}}{{/apiInfo}} + +

Models

+ {{#models}} + {{#model}} +
+

{{classname}}

+
+ {{#vars}}
{{name}} {{#isNotRequired}}(optional){{/isNotRequired}}
{{datatype}} {{description}}
+ {{/vars}} +
+
+ {{/model}} + {{/models}} + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache new file mode 100644 index 00000000000..b47805a4f04 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/pathParam.mustache @@ -0,0 +1,3 @@ +{{#isPathParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Path Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isPathParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache new file mode 100644 index 00000000000..52147fbd718 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/queryParam.mustache @@ -0,0 +1,3 @@ +{{#isQueryParam}}
{{paramName}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}
+ +
Query Parameter — {{description}} {{#defaultValue}}default: {{{defaultValue}}}{{/defaultValue}}
{{/isQueryParam}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache b/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache new file mode 100644 index 00000000000..0421bcc8c3c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/htmlDocs/style.css.mustache @@ -0,0 +1,136 @@ +body { + font-family: Trebuchet MS, sans-serif; + font-size: 15px; + color: #444; + margin-right: 24px; +} + +h1 { + font-size: 25px; +} +h2 { + font-size: 20px; +} +h3 { + font-size: 16px; + font-weight: bold; +} +hr { + height: 1px; + border: 0; + color: #ddd; + background-color: #ddd; + display: none; +} + +.app-desc { + clear: both; + margin-left: 20px; +} +.param-name { + width: 100%; +} +.license-info { + margin-left: 20px; +} + +.license-url { + margin-left: 20px; +} + +.model { + margin: 0 0 0px 20px; +} + +.method { + margin-left: 20px; +} + +.method-notes { + margin: 10px 0 20px 0; + font-size: 90%; + color: #555; +} + +pre { + padding: 10px; +} + +pre.get { + background-color: #0f6ab4; +} + +pre.post { + background-color: #10a54a; +} + +pre.put { + background-color: #c5862b; +} + +pre.delete { + background-color: #a41e22; +} + +.huge { + color: #fff; +} + +pre.example { + background-color: #f3f3f3; + padding: 10px; + border: 1px solid #ddd; +} + +code { + white-space: pre; +} + +.nickname { + font-weight: bold; +} + +.method-path { + font-size: 1.5em; + background-color: #0f6ab4; +} + +.parameter { + width: 500px; +} + +.param { + width: 500px; + padding: 10px 0 0 20px; + font-weight: bold; +} + +.param-desc { + width: 700px; + padding: 0 0 0 20px; + color: #777; +} + +.param-type { + font-style: italic; +} + +.field-label { + padding: 0; + margin: 0; + clear: both; +} + +.field-items { + padding: 0 0 15px 0; + margin-bottom: 15px; +} + +.return-type { + clear: both; + padding-bottom: 10px; +} + +.param-header { + font-weight: bold; +} diff --git a/modules/swagger-codegen/src/main/resources/logback.xml b/modules/swagger-codegen/src/main/resources/logback.xml new file mode 100644 index 00000000000..c7d0db9d3a2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/logback.xml @@ -0,0 +1,12 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache new file mode 100644 index 00000000000..881e7dd92c5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a node.js server. + +This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/node) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/api.mustache b/modules/swagger-codegen/src/main/resources/nodejs/api.mustache new file mode 100644 index 00000000000..82f0145ce8e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/api.mustache @@ -0,0 +1,62 @@ +var swagger = require("swagger-node-express"); +var url = require("url"); +var errors = swagger.errors; +var params = swagger.params; + +/* add model includes */ + +function writeResponse (response, data) { + response.header('Access-Control-Allow-Origin', "*"); + response.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + response.header("Access-Control-Allow-Headers", "Content-Type"); + response.header("Content-Type", "application/json; charset=utf-8"); + response.send(JSON.stringify(data)); +} + +exports.models = models = require("../models.js"); + +{{#operations}} +{{#operation}} +exports.{{nickname}} = { + 'spec': { + "description" : "Operations about pets", + "path" : "{{path}}", + "notes" : "{{{notes}}}", + "summary" : "{{{summary}}}", + "method": "{{httpMethod}}", + "params" : [{{#queryParams}} + params.query("{{paramName}}", "{{description}}", "{{swaggerDataType}}", {{#required}}true{{/required}}{{^required}}false{{/required}}, {{#allowMultiple}}true{{/allowMultiple}}{{^allowMultiple}}false{{/allowMultiple}}, "{{{allowableValues}}}"{{#defaultValue}}, {{{defaultValue}}}{{/defaultValue}}){{#hasMore}},{{/hasMore}} + {{/queryParams}}].concat([{{#pathParams}} + params.path("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} + {{/pathParams}}]).concat([{{#headerParams}} + params.header("{{paramName}}", "{{description}}"){{#hasMore}},{{/hasMore}} + {{/headerParams}}]).concat([{{#bodyParams}} + params.body("body", "{{swaggerDataType}}", "{{description}}", {{#required}}{{required}}{{/required}}{{^required}}false{{/required}}) + {{/bodyParams}}]), + {{#returnContainer}} + "type": "{{returnType}}", + "items": { + {{#returnTypeIsPrimitive}}"type": "{{returnContainer}}"{{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}}"$ref": "{{returnContainer}}"{{/returnTypeIsPrimitive}} + }, + // container + {{/returnContainer}} + {{^returnContainer}} + "type" : "{{returnType}}", + {{/returnContainer}} + "responseMessages" : [errors.invalid('id'), errors.notFound('{{returnType}}')], + "nickname" : "{{nickname}}" + }, + 'action': function (req,res) { + {{#requiredParamCount}} + {{#requiredParams}} + if (!req.params.{{baseName}}) { + throw errors.invalid('{{baseName}}'); + } + {{/requiredParams}} + {{/requiredParamCount}} + writeResponse(res, {message: "how about implementing {{nickname}} as a {{httpMethod}} method?"}); + } +}; +{{/operation}} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/main.mustache b/modules/swagger-codegen/src/main/resources/nodejs/main.mustache new file mode 100644 index 00000000000..6c8be317be6 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/main.mustache @@ -0,0 +1,52 @@ +var express = require("express") + , url = require("url") + , cors = require("cors") + , swagger = require("swagger-node-express") + , db = false + +var app = express(); +app.use(express.bodyParser()); + +var corsOptions = { + credentials: true, + origin: function(origin,callback) { + if(origin===undefined) { + callback(null,false); + } else { + callback(null,true); + } + } +}; + +app.use(cors(corsOptions)); + +{{#basePath}} +var subpath = express(); + +app.use("{{{basePath}}}", subpath); + +swagger.setAppHandler(subpath); +{{/basePath}} +{{^basePath}} +swagger.setAppHandler(app); +{{/basePath}} + +swagger.configureSwaggerPaths("", "api-docs", "") + +var models = require("./app/models.js"); + +{{#apiInfo}} +{{#apis}} +var {{classname}} = require("./{{apiFolder}}/{{classname}}.js"); +{{/apis}} +{{/apiInfo}} + +swagger.addModels(models) + {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}.add{{httpMethod}}({{classname}}.{{nickname}}){{/operation}}{{/operations}} + {{/apis}}{{/apiInfo}}; + +// configures the app +swagger.configure("http://localhost:8002{{basePath}}", "0.1"); + +// start the server +app.listen(8002); diff --git a/modules/swagger-codegen/src/main/resources/nodejs/models.mustache b/modules/swagger-codegen/src/main/resources/nodejs/models.mustache new file mode 100644 index 00000000000..133fe7c1515 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/models.mustache @@ -0,0 +1,3 @@ +exports.models = { + {{#models}}{{#model}}"{{classVarName}}": {{{modelJson}}}{{#hasMoreModels}},{{/hasMoreModels}}{{/model}}{{/models}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/nodejs/package.mustache b/modules/swagger-codegen/src/main/resources/nodejs/package.mustache new file mode 100755 index 00000000000..322dc819966 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/nodejs/package.mustache @@ -0,0 +1,16 @@ +{ + "name": "{{{artifactId}}}", + "description": "Wordnik node.js server generator", + "version": "{{{artifactVersion}}}", + "homepage": "{{{homepage}}}", + "main": "./{{codeDir}}/main.js", + "engines": { + "node": ">= 0.8.x" + }, + "dependencies": { + "swagger-node-express": ">= 2.0.x", + "connect": ">= 1.8.x", + "cors": "2.1.1", + "express": "3.x" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache b/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache new file mode 100644 index 00000000000..ee3f0856b6f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/Podfile.mustache @@ -0,0 +1,3 @@ +platform :ios, '6.0' +xcodeproj '{{projectName}}/{{projectName}}.xcodeproj' +pod 'AFNetworking', '~> 1.0' diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h new file mode 100644 index 00000000000..aab60cd0595 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.h @@ -0,0 +1,64 @@ +#import +#import "AFHTTPClient.h" + +@interface SWGApiClient : AFHTTPClient + +@property(nonatomic, assign) NSURLRequestCachePolicy cachePolicy; +@property(nonatomic, assign) NSTimeInterval timeoutInterval; +@property(nonatomic, assign) BOOL logRequests; +@property(nonatomic, assign) BOOL logCacheHits; +@property(nonatomic, assign) BOOL logServerResponses; +@property(nonatomic, assign) BOOL logJSON; +@property(nonatomic, assign) BOOL logHTTP; +@property(nonatomic, readonly) NSOperationQueue* queue; + ++(SWGApiClient *)sharedClientFromPool:(NSString *)baseUrl; + ++(NSOperationQueue*) sharedQueue; + ++(void)setLoggingEnabled:(bool) state; + ++(void)clearCache; + ++(void)setCacheEnabled:(BOOL) enabled; + ++(unsigned long)requestQueueSize; + ++(void) setOfflineState:(BOOL) state; + ++(AFNetworkReachabilityStatus) getReachabilityStatus; + ++(NSNumber*) nextRequestId; + ++(NSNumber*) queueRequest; + ++(void) cancelRequest:(NSNumber*)requestId; + ++(NSString*) escape:(id)unescaped; + ++(void) setReachabilityChangeBlock:(void(^)(int))changeBlock; + ++(void) configureCacheReachibilityForHost:(NSString*)host; + +-(void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey; + +-(NSNumber*) dictionary:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock; + +-(NSNumber*) stringWithCompletionBlock:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSString*, NSError *))completionBlock; +@end + diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m new file mode 100644 index 00000000000..0b8be93ab5d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGApiClient.m @@ -0,0 +1,419 @@ +#import "SWGApiClient.h" +#import "SWGFile.h" + +#import "AFJSONRequestOperation.h" + +@implementation SWGApiClient + +static long requestId = 0; +static bool offlineState = false; +static NSMutableSet * queuedRequests = nil; +static bool cacheEnabled = false; +static AFNetworkReachabilityStatus reachabilityStatus = AFNetworkReachabilityStatusNotReachable; +static NSOperationQueue* sharedQueue; +static void (^reachabilityChangeBlock)(int); +static bool loggingEnabled = false; + ++(void)setLoggingEnabled:(bool) state { + loggingEnabled = state; +} + ++(void)clearCache { + [[NSURLCache sharedURLCache] removeAllCachedResponses]; +} + ++(void)setCacheEnabled:(BOOL)enabled { + cacheEnabled = enabled; +} + ++(void)configureCacheWithMemoryAndDiskCapacity:(unsigned long) memorySize + diskSize:(unsigned long) diskSize { + NSAssert(memorySize > 0, @"invalid in-memory cache size"); + NSAssert(diskSize >= 0, @"invalid disk cache size"); + + NSURLCache *cache = + [[NSURLCache alloc] + initWithMemoryCapacity:memorySize + diskCapacity:diskSize + diskPath:@"swagger_url_cache"]; + + [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]]; + [client registerHTTPOperationClass:[AFJSONRequestOperation class]]; + client.parameterEncoding = AFJSONParameterEncoding; + [_pool setValue:client forKey:baseUrl ]; + if(loggingEnabled) + NSLog(@"new client for path %@", baseUrl); + } + if(loggingEnabled) + NSLog(@"returning client for path %@", baseUrl); + return client; + } +} + +-(void)setHeaderValue:(NSString*) value + forKey:(NSString*) forKey { + [self setDefaultHeader:forKey value:value]; +} + ++(unsigned long)requestQueueSize { + return [queuedRequests count]; +} + ++(NSNumber*) nextRequestId { + long nextId = ++requestId; + if(loggingEnabled) + NSLog(@"got id %ld", nextId); + return [NSNumber numberWithLong:nextId]; +} + ++(NSNumber*) queueRequest { + NSNumber* requestId = [SWGApiClient nextRequestId]; + if(loggingEnabled) + NSLog(@"added %@ to request queue", requestId); + [queuedRequests addObject:requestId]; + return requestId; +} + ++(void) cancelRequest:(NSNumber*)requestId { + [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(matchingItems.count == 1) { + if(loggingEnabled) + NSLog(@"removing request id %@", requestId); + [queuedRequests removeObject:requestId]; + return true; + } + else + return false; +} + +-(id)initWithBaseURL:(NSURL *)url { + self = [super initWithBaseURL:url]; + if (!self) + return nil; + return self; +} + ++(AFNetworkReachabilityStatus) getReachabilityStatus { + return reachabilityStatus; +} + ++(void) setReachabilityChangeBlock:(void(^)(int))changeBlock { + reachabilityChangeBlock = changeBlock; +} + ++(void) setOfflineState:(BOOL) state { + offlineState = state; +} + ++(void) configureCacheReachibilityForHost:(NSString*)host { + [[SWGApiClient sharedClientFromPool:host ] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + reachabilityStatus = status; + switch (status) { + case AFNetworkReachabilityStatusUnknown: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusUnknown"); + [SWGApiClient setOfflineState:true]; + break; + + case AFNetworkReachabilityStatusNotReachable: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusNotReachable"); + [SWGApiClient setOfflineState:true]; + break; + + case AFNetworkReachabilityStatusReachableViaWWAN: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWWAN"); + [SWGApiClient setOfflineState:false]; + break; + + case AFNetworkReachabilityStatusReachableViaWiFi: + if(loggingEnabled) + NSLog(@"reachability changed to AFNetworkReachabilityStatusReachableViaWiFi"); + [SWGApiClient setOfflineState:false]; + break; + default: + break; + } + // call the reachability block, if configured + if(reachabilityChangeBlock != nil) { + reachabilityChangeBlock(status); + } + }]; +} + +-(NSString*) pathWithQueryParamsToString:(NSString*) path + queryParams:(NSDictionary*) queryParams { + NSString * separator = nil; + int counter = 0; + + NSMutableString * requestUrl = [NSMutableString stringWithFormat:@"%@", path]; + if(queryParams != nil){ + for(NSString * key in [queryParams keyEnumerator]){ + if(counter == 0) separator = @"?"; + else separator = @"&"; + NSString * value; + if([[queryParams valueForKey:key] isKindOfClass:[NSString class]]){ + value = [SWGApiClient escape:[queryParams valueForKey:key]]; + } + else { + value = [NSString stringWithFormat:@"%@", [queryParams valueForKey:key]]; + } + [requestUrl appendString:[NSString stringWithFormat:@"%@%@=%@", separator, + [SWGApiClient escape:key], value]]; + counter += 1; + } + } + return requestUrl; +} + +- (NSString*)descriptionForRequest:(NSURLRequest*)request { + return [[request URL] absoluteString]; +} + +- (void)logRequest:(NSURLRequest*)request { + NSLog(@"request: %@", [self descriptionForRequest:request]); +} + +- (void)logResponse:(id)data forRequest:(NSURLRequest*)request error:(NSError*)error { + NSLog(@"request: %@ response: %@ ", [self descriptionForRequest:request], data ); +} + + +-(NSNumber*) dictionary:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSDictionary*, NSError *))completionBlock { + + NSMutableURLRequest * request = nil; + + if ([body isKindOfClass:[SWGFile class]]){ + SWGFile * file = (SWGFile*) body; + + request = [self multipartFormRequestWithMethod:@"POST" + path:path + parameters:nil + constructingBodyWithBlock: ^(id formData) { + [formData appendPartWithFileData:[file data] + name:@"image" + fileName:[file name] + mimeType:[file mimeType]]; + }]; + } + else { + request = [self requestWithMethod:method + path:[self pathWithQueryParamsToString:path queryParams:queryParams] + parameters:body]; + } + 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(body != nil) { + if([body isKindOfClass:[NSDictionary class]] || [body isKindOfClass:[NSArray class]]){ + [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; + } + else if ([body isKindOfClass:[SWGFile class]]) {} + else { + NSAssert(false, @"unsupported post type!"); + } + } + if(headerParams != nil){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + + if (self.logRequests) { + [self logRequest:request]; + } + + NSNumber* requestId = [SWGApiClient queueRequest]; + AFJSONRequestOperation *op = + [AFJSONRequestOperation + JSONRequestOperationWithRequest:request + success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:JSON forRequest:request error:nil]; + completionBlock(JSON, nil); + } + } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:nil forRequest:request error:error]; + completionBlock(nil, error); + } + } + ]; + + [self enqueueHTTPRequestOperation:op]; + return requestId; +} + +-(NSNumber*) stringWithCompletionBlock:(NSString*) path + method:(NSString*) method + queryParams:(NSDictionary*) queryParams + body:(id) body + headerParams:(NSDictionary*) headerParams + requestContentType:(NSString*) requestContentType + responseContentType:(NSString*) responseContentType + completionBlock:(void (^)(NSString*, NSError *))completionBlock { + AFHTTPClient *client = self; + client.parameterEncoding = AFJSONParameterEncoding; + + NSMutableURLRequest * request = nil; + + if ([body isKindOfClass:[SWGFile class]]){ + SWGFile * file = (SWGFile*) body; + + request = [self multipartFormRequestWithMethod:@"POST" + path:path + parameters:nil + constructingBodyWithBlock: ^(id formData) { + [formData appendPartWithFileData:[file data] + name:@"image" + fileName:[file name] + mimeType:[file mimeType]]; + }]; + } + else { + request = [self requestWithMethod:method + path:[self pathWithQueryParamsToString:path queryParams:queryParams] + parameters:body]; + } + + 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(body != nil) { + if([body isKindOfClass:[NSDictionary class]]){ + [request setValue:requestContentType forHTTPHeaderField:@"Content-Type"]; + } + else if ([body isKindOfClass:[SWGFile class]]){} + else { + NSAssert(false, @"unsupported post type!"); + } + } + if(headerParams != nil){ + for(NSString * key in [headerParams keyEnumerator]){ + [request setValue:[headerParams valueForKey:key] forHTTPHeaderField:key]; + } + } + [request setValue:[headerParams valueForKey:responseContentType] forHTTPHeaderField:@"Accept"]; + + // Always disable cookies! + [request setHTTPShouldHandleCookies:NO]; + + NSNumber* requestId = [SWGApiClient queueRequest]; + AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request]; + [op setCompletionBlockWithSuccess: + ^(AFHTTPRequestOperation *resp, + id responseObject) { + NSString *response = [resp responseString]; + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:responseObject forRequest:request error:nil]; + completionBlock(response, nil); + } + } failure:^(AFHTTPRequestOperation *operation, NSError *error) { + if([self executeRequestWithId:requestId]) { + if(self.logServerResponses) + [self logResponse:nil forRequest:request error:error]; + completionBlock(nil, error); + } + }]; + + [self enqueueHTTPRequestOperation:op]; + return requestId; +} + +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGDate.h b/modules/swagger-codegen/src/main/resources/objc/SWGDate.h new file mode 100644 index 00000000000..2c6c7cfe01b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGDate.h @@ -0,0 +1,12 @@ +#import +#import "SWGObject.h" + +@interface SWGDate : SWGObject { +@private + NSDate *_date; +} +@property(nonatomic, readonly) NSDate* date; + +- (id) initWithValues: (NSString*)input; +-(NSString*) toString; +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGDate.m b/modules/swagger-codegen/src/main/resources/objc/SWGDate.m new file mode 100644 index 00000000000..07a1405626b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGDate.m @@ -0,0 +1,34 @@ +#import "SWGDate.h" + +@implementation SWGDate + +@synthesize date = _date; + +- (id) initWithValues:(NSString*)input { + if([input isKindOfClass:[NSString class]]){ + NSDateFormatter* df = [NSDateFormatter new]; + NSLocale *locale = [[NSLocale new] + initWithLocaleIdentifier:@"en_US_POSIX"]; + [df setLocale:locale]; + [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; + + _date = [df dateFromString:input]; + } + else if([input isKindOfClass:[NSNumber class]]) { + NSTimeInterval interval = [input doubleValue]; + _date = [[NSDate alloc] initWithTimeIntervalSince1970:interval]; + } + return self; +} + +-(NSString*) toString { + NSDateFormatter* df = [NSDateFormatter new]; + NSLocale *locale = [[NSLocale new] + initWithLocaleIdentifier:@"en_US_POSIX"]; + [df setLocale:locale]; + [df setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSZ"]; + + return [df stringFromDate:_date]; +} + +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGFile.h b/modules/swagger-codegen/src/main/resources/objc/SWGFile.h new file mode 100644 index 00000000000..fe6e81c289d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGFile.h @@ -0,0 +1,13 @@ +#import + +@interface SWGFile : NSObject + +@property(nonatomic, readonly) NSString* name; +@property(nonatomic, readonly) NSString* mimeType; +@property(nonatomic, readonly) NSData* data; + +- (id) initWithNameData: (NSString*) filename + mimeType: (NSString*) mimeType + data: (NSData*) data; + + @end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGFile.m b/modules/swagger-codegen/src/main/resources/objc/SWGFile.m new file mode 100644 index 00000000000..42552767af4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGFile.m @@ -0,0 +1,26 @@ +#import "SWGFile.h" + +@implementation SWGFile + +@synthesize name = _name; +@synthesize mimeType = _mimeType; +@synthesize data = _data; + +- (id) init { + self = [super init]; + return self; +} + +- (id) initWithNameData: (NSString*) filename + mimeType: (NSString*) fileMimeType + data: (NSData*) data { + self = [super init]; + if(self) { + _name = filename; + _mimeType = fileMimeType; + _data = data; + } + return self; +} + +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGObject.h b/modules/swagger-codegen/src/main/resources/objc/SWGObject.h new file mode 100644 index 00000000000..031bae69279 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGObject.h @@ -0,0 +1,6 @@ +#import + +@interface SWGObject : NSObject +- (id) initWithValues:(NSDictionary*)dict; +- (NSDictionary*) asDictionary; +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/SWGObject.m b/modules/swagger-codegen/src/main/resources/objc/SWGObject.m new file mode 100644 index 00000000000..9b37b3592b1 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/SWGObject.m @@ -0,0 +1,17 @@ +#import "SWGObject.h" + +@implementation SWGObject + +- (id) initWithValues:(NSDictionary*)dict { + return self; +} + +- (NSDictionary*) asDictionary{ + return [NSDictionary init]; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ %@", [super description], [self asDictionary]]; +} + +@end diff --git a/modules/swagger-codegen/src/main/resources/objc/api-body.mustache b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache new file mode 100644 index 00000000000..22e2262668b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/api-body.mustache @@ -0,0 +1,234 @@ +{{#operations}} +#import "{{classname}}.h" +#import "SWGFile.h" +#import "SWGApiClient.h" +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} + + +@implementation {{classname}} +static NSString * basePath = @"{{basePath}}"; + ++({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key { + static {{classname}}* singletonAPI = nil; + + if (singletonAPI == nil) { + singletonAPI = [[{{classname}} alloc] init]; + [singletonAPI addHeader:headerValue forKey:key]; + } + return singletonAPI; +} + ++(void) setBasePath:(NSString*)path { + basePath = path; +} + ++(NSString*) getBasePath { + return basePath; +} + +-(SWGApiClient*) apiClient { + return [SWGApiClient sharedClientFromPool:basePath]; +} + +-(void) addHeader:(NSString*)value forKey:(NSString*)key { + [[self apiClient] setHeaderValue:value forKey:key]; +} + +-(id) init { + self = [super init]; + [self apiClient]; + return self; +} + +-(void) setHeaderValue:(NSString*) value + forKey:(NSString*)key { + [[self apiClient] setHeaderValue:value forKey:key]; +} + +-(unsigned long) requestQueueSize { + return [SWGApiClient requestQueueSize]; +} + + +{{#operation}} +-(NSNumber*) {{nickname}}WithCompletionBlock{{^allParams}}: {{/allParams}}{{#allParams}}{{#secondaryParam}} + {{paramName}}{{/secondaryParam}}:({{{dataType}}}) {{paramName}}{{newline}} {{/allParams}} + {{#returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock{{/returnBaseType}} + {{^returnBaseType}}{{#hasParams}}completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock{{/returnBaseType}} { + + id m_body = {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}nil{{/bodyParam}}; + NSMutableString* requestUrl = [NSMutableString stringWithFormat:@"%@{{path}}", basePath]; + + // 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: [SWGApiClient escape:{{paramName}}]]; + {{/pathParams}} + + NSString* requestContentType = @"application/json"; + NSString* responseContentType = @"application/json"; + + NSMutableDictionary* queryParams = [[NSMutableDictionary alloc] init]; + {{#queryParams}}if({{paramName}} != nil) + queryParams[@"{{baseName}}"] = {{paramName}};{{/queryParams}} + NSMutableDictionary* headerParams = [[NSMutableDictionary alloc] init]; + {{#headerParams}}if({{paramName}} != nil) + headerParams[@"{{baseName}}"] = {{paramName}};{{/headerParams}} + + id bodyDictionary = nil; + {{#bodyParam}} + if(m_body != nil && [m_body isKindOfClass:[NSArray class]]){ + NSMutableArray * objs = [[NSMutableArray alloc] init]; + for (id dict in (NSArray*)m_body) { + if([dict respondsToSelector:@selector(asDictionary)]) { + [objs addObject:[(SWGObject*)dict asDictionary]]; + } + else{ + [objs addObject:dict]; + } + } + bodyDictionary = objs; + } + else if([m_body respondsToSelector:@selector(asDictionary)]) { + bodyDictionary = [(SWGObject*)m_body asDictionary]; + } + else if([m_body isKindOfClass:[NSString class]]) { + // convert it to a dictionary + NSError * error; + NSString * str = (NSString*)m_body; + NSDictionary *JSON = + [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingMutableContainers + error:&error]; + bodyDictionary = JSON; + } + else if([m_body isKindOfClass: [SWGFile class]]) { + requestContentType = @"form-data"; + bodyDictionary = m_body; + } + else{ + NSLog(@"don't know what to do with %@", m_body); + } + + {{/bodyParam}} + + {{#requiredParamCount}} + {{#requiredParams}} + if({{paramName}} == nil) { + // error + } + {{/requiredParams}} + {{/requiredParamCount}} + + SWGApiClient* client = [SWGApiClient sharedClientFromPool:basePath]; + + {{#returnContainer}} + return [client dictionary: requestUrl + method: @"{{httpMethod}}" + queryParams: queryParams + body: bodyDictionary + headerParams: headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock: ^(NSDictionary *data, NSError *error) { + if (error) { + {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} + {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} + return; + } + + {{#returnBaseType}} + if([data isKindOfClass:[NSArray class]]){ + NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[data count]]; + for (NSDictionary* dict in (NSArray*)data) { + {{#returnTypeIsPrimitive}} + // {{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}"){{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}}{{/instantiationType}}{{newline}} + {{returnBaseType}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data]; + {{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}} + {{{returnBaseType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: dict]; + {{/returnTypeIsPrimitive}} + [objs addObject:d]; + } + completionBlock(objs, nil); + } + {{#returnSimpleType}} + {{#returnTypeIsPrimitive}}{{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data], nil;{{/returnBaseType}} + {{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}} + {{#returnBaseType}}completionBlock( [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data], nil);{{/returnBaseType}} + {{/returnTypeIsPrimitive}} + {{/returnSimpleType}} + + {{/returnBaseType}} + }]; + {{/returnContainer}} + + {{#returnSimpleType}} + {{#returnTypeIsPrimitive}} + {{#returnBaseType}} + return [client stringWithCompletionBlock: requestUrl + method: @"{{httpMethod}}" + queryParams: queryParams + body: bodyDictionary + headerParams: headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock: ^(NSString *data, NSError *error) { + if (error) { + completionBlock(nil, error); + return; + } + {{returnBaseType}} *result = data ? [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithString: data] : nil; + completionBlock(result, nil); + }];{{/returnBaseType}} + {{^returnBaseType}} + return [client stringWithCompletionBlock:requestUrl + method:@"{{httpMethod}}" + queryParams:queryParams + body:bodyDictionary + headerParams:headerParams + requestContentType: requestContentType + responseContentType: responseContentType + completionBlock:^(NSString *data, NSError *error) { + if (error) { + completionBlock(error); + return; + } + completionBlock(nil); + }]; + {{/returnBaseType}}{{/returnTypeIsPrimitive}} + {{#returnBaseType}}{{^returnTypeIsPrimitive}} + return [client dictionary:requestUrl + method:@"{{httpMethod}}" + queryParams:queryParams + body:bodyDictionary + headerParams:headerParams + requestContentType:requestContentType + responseContentType:responseContentType + completionBlock:^(NSDictionary *data, NSError *error) { + if (error) { + {{#returnBaseType}}completionBlock(nil, error);{{/returnBaseType}} + {{^returnBaseType}}completionBlock(error);{{/returnBaseType}} + return; + } + {{#returnBaseType}} + {{returnBaseType}} *result = nil; + if (data) { + result = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{returnBaseType}}} {{/instantiationType}} alloc]initWithValues: data]; + } + {{#returnBaseType}}completionBlock(result , nil);{{/returnBaseType}} + {{/returnBaseType}} + }]; + {{/returnTypeIsPrimitive}}{{/returnBaseType}}{{/returnSimpleType}} +{{newline}} +} + +{{/operation}} + +{{newline}} +{{/operations}} +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/api-header.mustache b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache new file mode 100644 index 00000000000..7bc55a0fade --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/api-header.mustache @@ -0,0 +1,29 @@ +#import +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} + +{{#operations}} +@interface {{classname}}: NSObject + +-(void) addHeader:(NSString*)value forKey:(NSString*)key; +-(unsigned long) requestQueueSize; ++({{classname}}*) apiWithHeader:(NSString*)headerValue key:(NSString*)key; ++(void) setBasePath:(NSString*)basePath; ++(NSString*) getBasePath; +{{#operation}} +/** + + {{#summary}}{{{summary}}}{{/summary}} + {{#notes}}{{{notes}}}{{/notes}} + + {{#allParams}}@param {{paramName}} {{description}} + {{/allParams}} + */ +-(NSNumber*) {{nickname}}WithCompletionBlock {{^allParams}}:{{/allParams}}{{#allParams}}{{#secondaryParam}} + {{paramName}}{{/secondaryParam}}: ({{{dataType}}}) {{paramName}}{{/allParams}} +{{#returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)({{returnType}} output, NSError* error))completionBlock;{{/returnBaseType}} +{{^returnBaseType}}{{#hasParams}} completionHandler: {{/hasParams}}(void (^)(NSError* error))completionBlock;{{/returnBaseType}} +{{/operation}} +{{/operations}} +@end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/objc/model-body.mustache b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache new file mode 100644 index 00000000000..43555d48a19 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/model-body.mustache @@ -0,0 +1,94 @@ +{{#models}} +{{#model}} +#import "SWGDate.h" +#import "{{classname}}.h" + +@implementation {{classname}}{{#parent}}: {{parent}}{{/parent}} + +{{#hasVars}} +-(id){{#vars}}{{name}}: ({{datatype}}) {{name}}{{^hasMore}} { {{/hasMore}} + {{/vars}} + {{#vars}}_{{name}} = {{name}}; + {{/vars}} + return self; +} +{{/hasVars}} +-(id) initWithValues:(NSDictionary*)dict +{ + self = [super init]; + if(self) { + {{#vars}}{{#isPrimitiveType}}_{{name}} = dict[@"{{baseName}}"];{{/isPrimitiveType}} + {{#complexType}}id {{name}}_dict = dict[@"{{baseName}}"];{{#isContainer}} + if([{{name}}_dict isKindOfClass:[NSArray class]]) { + NSMutableArray * objs = [[NSMutableArray alloc] initWithCapacity:[(NSArray*){{name}}_dict count]]; + if([(NSArray*){{name}}_dict count] > 0) { + for (NSDictionary* dict in (NSArray*){{name}}_dict) { + {{{complexType}}}* d = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc] initWithValues:dict]; + [objs addObject:d]; + } + _{{{name}}} = [[NSArray alloc] initWithArray:objs]; + } + else { + _{{name}} = [[NSArray alloc] init]; + } + } + else { + _{{name}} = [[NSArray alloc] init]; + }{{/isContainer}} + {{#isNotContainer}}if({{name}}_dict != nil) + _{{name}} = [[{{#instantiationType}}NSClassFromString(@"{{{instantiationType}}}") {{/instantiationType}}{{^instantiationType}}{{{complexType}}} {{/instantiationType}} alloc]initWithValues:{{name}}_dict]; + {{/isNotContainer}} + {{/complexType}}{{/vars}} + } + return self; +} + +-(NSDictionary*) asDictionary { + NSMutableDictionary* dict = [[NSMutableDictionary alloc] init]; + {{#vars}}{{#complexType}} + if(_{{name}} != nil){ + {{#isContainer}} + if([_{{name}} isKindOfClass:[NSArray class]]){ + NSMutableArray * array = [[NSMutableArray alloc] init]; + for( {{complexType}} *{{name}} in _{{name}}) { + [array addObject:[(SWGObject*){{name}} asDictionary]]; + } + dict[@"{{name}}"] = array; + } + {{/isContainer}} + {{^isContainer}} + if(_{{name}} && [_{{name}} isKindOfClass:[SWGDate class]]) { + NSString * dateString = [(SWGDate*)_{{name}} toString]; + if(dateString){ + dict[@"{{name}}"] = dateString; + } + } + else { + if(_{{name}} != nil) + dict[@"{{baseName}}"] = [(SWGObject*)_{{name}} asDictionary]; + } + {{/isContainer}} + } + {{/complexType}} + {{#isPrimitiveType}}{{#isNotContainer}} + if(_{{name}} != nil) + dict[@"{{baseName}}"] = _{{name}}; + {{/isNotContainer}} + {{#isContainer}} + if(_{{name}} != nil) { + if([_{{name}} isKindOfClass:[NSArray class]]) { + dict[@"_{{name}}"] = [[NSArray alloc] initWithArray: (NSArray*) _{{name}} copyItems:true]; + } + else if([_{{name}} isKindOfClass:[NSDictionary class]]) { + dict[@"{{name}}"] = [[NSDictionary alloc] initWithDictionary:(NSDictionary*)_{{name}} copyItems:true]; + } + } + {{/isContainer}} + {{/isPrimitiveType}}{{/vars}} + NSDictionary* output = [dict copy]; + return output; +} + +{{/model}} +@end +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/objc/model-header.mustache b/modules/swagger-codegen/src/main/resources/objc/model-header.mustache new file mode 100644 index 00000000000..e8dc61316e0 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/objc/model-header.mustache @@ -0,0 +1,24 @@ +#import +#import "SWGObject.h" +{{#imports}}#import "{{import}}.h" +{{/imports}} +{{newline}} +{{#models}} +{{#model}} + +@interface {{classname}} : {{^parent}}SWGObject{{/parent}}{{#parent}}{{parent}}{{/parent}} + +{{#vars}} +@property(nonatomic) {{datatype}} {{name}}; {{#description}}/* {{{description}}} {{#isNotRequired}}[optional]{{/isNotRequired}} */{{/description}}{{newline}} +{{/vars}} +{{#hasVars}} +- (id) {{#vars}}{{name}}: ({{datatype}}) {{name}}{{#hasMore}} + {{/hasMore}}{{^hasMore}};{{/hasMore}} + {{/vars}} +{{/hasVars}} +- (id) initWithValues: (NSDictionary*)dict; +- (NSDictionary*) asDictionary; +{{newline}} +@end +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/php/Swagger.mustache b/modules/swagger-codegen/src/main/resources/php/Swagger.mustache new file mode 100644 index 00000000000..7e1f24f49b6 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/Swagger.mustache @@ -0,0 +1,231 @@ +apiKey = $apiKey; + $this->apiServer = $apiServer; + } + + + /** + * @param string $resourcePath path to method endpoint + * @param string $method method to call + * @param array $queryParams parameters to be place in query URL + * @param array $postData parameters to be placed in POST body + * @param array $headerParams parameters to be place in request header + * @return mixed + */ + public function callAPI($resourcePath, $method, $queryParams, $postData, + $headerParams) { + + $headers = array(); + + # Allow API key from $headerParams to override default + $added_api_key = False; + if ($headerParams != null) { + foreach ($headerParams as $key => $val) { + $headers[] = "$key: $val"; + if ($key == 'api_key') { + $added_api_key = True; + } + } + } + if (! $added_api_key) { + $headers[] = "api_key: " . $this->apiKey; + } + + if (is_object($postData) or is_array($postData)) { + $postData = json_encode($this->sanitizeForSerialization($postData)); + } + + $url = $this->apiServer . $resourcePath; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_TIMEOUT, 5); + // return the result on success, rather than just TRUE + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + + if (! empty($queryParams)) { + $url = ($url . '?' . http_build_query($queryParams)); + } + + if ($method == self::$POST) { + curl_setopt($curl, CURLOPT_POST, true); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method == self::$PUT) { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method == self::$DELETE) { + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + } else if ($method != self::$GET) { + throw new Exception('Method ' . $method . ' is not recognized.'); + } + curl_setopt($curl, CURLOPT_URL, $url); + + // Make the request + $response = curl_exec($curl); + $response_info = curl_getinfo($curl); + + // Handle the response + if ($response_info['http_code'] == 0) { + throw new Exception("TIMEOUT: api call to " . $url . + " took more than 5s to return" ); + } else if ($response_info['http_code'] == 200) { + $data = json_decode($response); + } else if ($response_info['http_code'] == 401) { + throw new Exception("Unauthorized API request to " . $url . + ": ".json_decode($response)->message ); + } else if ($response_info['http_code'] == 404) { + $data = null; + } else { + throw new Exception("Can't connect to the api: " . $url . + " response code: " . + $response_info['http_code']); + } + return $data; + } + + /** + * Build a JSON POST object + */ + protected function sanitizeForSerialization($data) + { + if (is_scalar($data) || null === $data) { + $sanitized = $data; + } else if ($data instanceof \DateTime) { + $sanitized = $data->format(\DateTime::ISO8601); + } else if (is_array($data)) { + foreach ($data as $property => $value) { + $data[$property] = $this->sanitizeForSerialization($value); + } + $sanitized = $data; + } else if (is_object($data)) { + $values = array(); + foreach (array_keys($data::$swaggerTypes) as $property) { + $values[$property] = $this->sanitizeForSerialization($data->$property); + } + $sanitized = $values; + } else { + $sanitized = (string)$data; + } + + return $sanitized; + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the path, by url-encoding. + * @param string $value a string which will be part of the path + * @return string the serialized object + */ + public static function toPathValue($value) { + return rawurlencode($value); + } + + /** + * Take value and turn it into a string suitable for inclusion in + * the query, by imploding comma-separated if it's an object. + * If it's a string, pass through unchanged. It will be url-encoded + * later. + * @param object $object an object to be serialized to a string + * @return string the serialized object + */ + public static function toQueryValue($object) { + if (is_array($object)) { + return implode(',', $object); + } else { + return $object; + } + } + + /** + * Just pass through the header value for now. Placeholder in case we + * find out we need to do something with header values. + * @param string $value a string which will be part of the header + * @return string the header string + */ + public static function toHeaderValue($value) { + return $value; + } + + /** + * Deserialize a JSON string into an object + * + * @param object $object object or primitive to be deserialized + * @param string $class class name is passed as a string + * @return object an instance of $class + */ + + public static function deserialize($data, $class) + { + if (null === $data) { + $deserialized = null; + } elseif (substr($class, 0, 4) == 'map[') { + $inner = substr($class, 4, -1); + $values = array(); + if(strrpos($inner, ",") !== false) { + $subClass = explode(',', $inner, 2)[1]; + foreach ($data as $key => $value) { + $values[] = array($key => self::deserialize($value, $subClass)); + } + } + $deserialized = $values; + } elseif (substr($class, 0, 6) == 'array[') { + $subClass = substr($class, 6, -1); + foreach ($data as $key => $value) { + $values[] = self::deserialize($value, $subClass); + } + $deserialized = $values; + } elseif ($class == 'DateTime') { + $deserialized = new \DateTime($data); + } elseif (in_array($class, array('string', 'int', 'float', 'bool'))) { + settype($data, $class); + $deserialized = $data; + } else { + $instance = new $class(); + foreach ($instance::$swaggerTypes as $property => $type) { + if (isset($data->$property)) { + $instance->$property = self::deserialize($data->$property, $type); + } + } + $deserialized = $instance; + } + + return $deserialized; + } + +} + diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache new file mode 100644 index 00000000000..82ea7174032 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -0,0 +1,86 @@ +apiClient = $apiClient; + } + + {{#operation}} + /** + * {{{nickname}}} + * + * {{{summary}}} + {{#allParams}}* {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + * {{/allParams}} + * @return {{{returnType}}} + */ + + public function {{nickname}}({{#allParams}}${{paramName}}{{#optional}}=null{{/optional}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { + + // parse inputs + $resourcePath = "{{path}}"; + $resourcePath = str_replace("{format}", "json", $resourcePath); + $method = "{{httpMethod}}"; + $queryParams = array(); + $headerParams = array(); + $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; + $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; + + {{#queryParams}}// query params + if(${{paramName}} != null) { + $queryParams['{{paramName}}'] = $this->apiClient->toQueryValue(${{paramName}}); + }{{/queryParams}} + {{#headerParams}}// header params + if(${{paramName}} != null) { + $headerParams['{{paramName}}'] = $this->apiClient->toHeaderValue(${{paramName}}); + }{{/headerParams}} + {{#pathParams}}// path params + if(${{paramName}} != null) { + $resourcePath = str_replace("{" . "{{paramName}}" . "}", + $this->apiClient->toPathValue(${{paramName}}), $resourcePath); + }{{/pathParams}} + {{#bodyParams}}// body params + $body = null; + if (isset(${{paramName}})) { + $body = ${{paramName}}; + } + {{/bodyParams}} + + // make the API Call + $response = $this->apiClient->callAPI($resourcePath, $method, + $queryParams, $body, + $headerParams); + + {{#returnType}}if(! $response) { + return null; + } + + $responseObject = $this->apiClient->deserialize($response, + '{{returnType}}'); + return $responseObject;{{/returnType}} + } + {{/operation}} +{{newline}} +{{/operations}} +} diff --git a/modules/swagger-codegen/src/main/resources/php/model.mustache b/modules/swagger-codegen/src/main/resources/php/model.mustache new file mode 100644 index 00000000000..cc98fa352f3 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/php/model.mustache @@ -0,0 +1,40 @@ + '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}}{{/vars}} + ); + + {{#vars}}{{#description}} + /** + * {{{description}}} + */{{/description}} + public ${{name}}; /* {{{datatype}}} */{{/vars}} +} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python/__init__.mustache b/modules/swagger-codegen/src/main/resources/python/__init__.mustache new file mode 100644 index 00000000000..4b41ee706c7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/__init__.mustache @@ -0,0 +1,9 @@ +#!/usr/bin/env python +"""Add all of the modules in the current directory to __all__""" +import os + +__all__ = [] + +for module in os.listdir(os.path.dirname(__file__)): + if module != '__init__.py' and module[-3:] == '.py': + __all__.append(module[:-3]) diff --git a/modules/swagger-codegen/src/main/resources/python/api.mustache b/modules/swagger-codegen/src/main/resources/python/api.mustache new file mode 100644 index 00000000000..1650effd991 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/api.mustache @@ -0,0 +1,98 @@ +#!/usr/bin/env python +""" +WordAPI.py +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. + +NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. +""" +import sys +import os + +from models import * + + +{{#operations}} +class {{classname}}(object): + + def __init__(self, apiClient): + self.apiClient = apiClient + + {{newline}} + {{#operation}} + def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): + """{{summary}} + + Args: + {{#allParams}} + {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + {{newline}} + {{/allParams}} + {{newline}} + Returns: {{returnType}} + """ + + allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] + + params = locals() + for (key, val) in params['kwargs'].iteritems(): + if key not in allParams: + raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) + params[key] = val + del params['kwargs'] + + resourcePath = '{{path}}' + resourcePath = resourcePath.replace('{format}', 'json') + method = '{{httpMethod}}' + + queryParams = {} + headerParams = {} + $headerParams['Accept'] = '{{#produces}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/produces}}'; + $headerParams['Content-Type'] = '{{#consumes}}{{mediaType}}{{#hasMore}},{{/hasMore}}{{/consumes}}'; + + {{#queryParams}} + if ('{{paramName}}' in params): + queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) + {{/queryParams}} + + {{#headerParams}} + if ('{{paramName}}' in params): + headerParams['{{paramName}}'] = params['{{paramName}}'] + {{/headerParams}} + + {{#pathParams}} + if ('{{paramName}}' in params): + replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) + resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', + replacement) + {{/pathParams}} + + postData = (params['body'] if 'body' in params else None) + + response = self.apiClient.callAPI(resourcePath, method, queryParams, + postData, headerParams) + + {{#returnType}} + if not response: + return None + + responseObject = self.apiClient.deserialize(response, '{{returnType}}') + return responseObject + {{/returnType}} + {{newline}} + {{newline}} + {{/operation}} +{{newline}} +{{/operations}} +{{newline}} diff --git a/modules/swagger-codegen/src/main/resources/python/model.mustache b/modules/swagger-codegen/src/main/resources/python/model.mustache new file mode 100644 index 00000000000..39547c90050 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/model.mustache @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +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. +""" +{{#models}} +{{#model}} + +class {{classname}}: + """NOTE: This class is auto generated by the swagger code generator program. + Do not edit the class manually.""" + + + def __init__(self): + self.swaggerTypes = { + {{#vars}} + '{{name}}': '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + + + {{#vars}} + {{#description}}#{{description}} + {{/description}} + self.{{name}} = None # {{{datatype}}} + {{/vars}} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python/swagger.mustache b/modules/swagger-codegen/src/main/resources/python/swagger.mustache new file mode 100644 index 00000000000..e62f854c7bf --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python/swagger.mustache @@ -0,0 +1,208 @@ +#!/usr/bin/env python +"""Wordnik.com's Swagger generic API client. This client handles the client- +server communication, and is invariant across implementations. Specifics of +the methods and models for each application are generated from the Swagger +templates.""" + +import sys +import os +import re +import urllib +import urllib2 +import httplib +import json +import datetime + +from models import * + + +class ApiClient: + """Generic API client for Swagger client library builds""" + + def __init__(self, apiKey=None, apiServer=None): + if apiKey == None: + raise Exception('You must pass an apiKey when instantiating the ' + 'APIClient') + self.apiKey = apiKey + self.apiServer = apiServer + self.cookie = None + + def callAPI(self, resourcePath, method, queryParams, postData, + headerParams=None): + + url = self.apiServer + resourcePath + headers = {} + if headerParams: + for param, value in headerParams.iteritems(): + headers[param] = value + + #headers['Content-type'] = 'application/json' + headers['api_key'] = self.apiKey + + if self.cookie: + headers['Cookie'] = self.cookie + + data = None + + if queryParams: + # Need to remove None values, these should not be sent + sentQueryParams = {} + for param, value in queryParams.items(): + if value != None: + sentQueryParams[param] = value + url = url + '?' + urllib.urlencode(sentQueryParams) + + if method in ['GET']: + + #Options to add statements later on and for compatibility + pass + + elif method in ['POST', 'PUT', 'DELETE']: + + if postData: + headers['Content-type'] = 'application/json' + data = self.sanitizeForSerialization(postData) + data = json.dumps(data) + + else: + raise Exception('Method ' + method + ' is not recognized.') + + request = MethodRequest(method=method, url=url, headers=headers, + data=data) + + # Make the request + response = urllib2.urlopen(request) + if 'Set-Cookie' in response.headers: + self.cookie = response.headers['Set-Cookie'] + string = response.read() + + try: + data = json.loads(string) + except ValueError: # PUT requests don't return anything + data = None + + return data + + def toPathValue(self, obj): + """Convert a string or object to a path-friendly value + Args: + obj -- object or string value + Returns: + string -- quoted value + """ + if type(obj) == list: + return urllib.quote(','.join(obj)) + else: + return urllib.quote(str(obj)) + + def sanitizeForSerialization(self, obj): + """Dump an object into JSON for POSTing.""" + + if type(obj) == type(None): + return None + elif type(obj) in [str, int, long, float, bool]: + return obj + elif type(obj) == list: + return [self.sanitizeForSerialization(subObj) for subObj in obj] + elif type(obj) == datetime.datetime: + return obj.isoformat() + else: + if type(obj) == dict: + objDict = obj + else: + objDict = obj.__dict__ + return {key: self.sanitizeForSerialization(val) + for (key, val) in objDict.iteritems() + if key != 'swaggerTypes'} + + if type(postData) == list: + # Could be a list of objects + if type(postData[0]) in safeToDump: + data = json.dumps(postData) + else: + data = json.dumps([datum.__dict__ for datum in postData]) + elif type(postData) not in safeToDump: + data = json.dumps(postData.__dict__) + + def deserialize(self, obj, objClass): + """Derialize a JSON string into an object. + + Args: + obj -- string or object to be deserialized + objClass -- class literal for deserialzied object, or string + of class name + Returns: + object -- deserialized object""" + + # Have to accept objClass as string or actual type. Type could be a + # native Python type, or one of the model classes. + if type(objClass) == str: + if 'list[' in objClass: + match = re.match('list\[(.*)\]', objClass) + subClass = match.group(1) + return [self.deserialize(subObj, subClass) for subObj in obj] + + if (objClass in ['int', 'float', 'long', 'dict', 'list', 'str', 'bool', 'datetime']): + objClass = eval(objClass) + else: # not a native type, must be model class + objClass = eval(objClass + '.' + objClass) + + if objClass in [int, long, float, dict, list, str, bool]: + return objClass(obj) + elif objClass == datetime: + # Server will always return a time stamp in UTC, but with + # trailing +0000 indicating no offset from UTC. So don't process + # last 5 characters. + return datetime.datetime.strptime(obj[:-5], + "%Y-%m-%dT%H:%M:%S.%f") + + instance = objClass() + + for attr, attrType in instance.swaggerTypes.iteritems(): + if obj is not None and attr in obj and type(obj) in [list, dict]: + value = obj[attr] + if attrType in ['str', 'int', 'long', 'float', 'bool']: + attrType = eval(attrType) + try: + value = attrType(value) + except UnicodeEncodeError: + value = unicode(value) + except TypeError: + value = value + setattr(instance, attr, value) + elif (attrType == 'datetime'): + setattr(instance, attr, datetime.datetime.strptime(value[:-5], + "%Y-%m-%dT%H:%M:%S.%f")) + elif 'list[' in attrType: + match = re.match('list\[(.*)\]', attrType) + subClass = match.group(1) + subValues = [] + if not value: + setattr(instance, attr, None) + else: + for subValue in value: + subValues.append(self.deserialize(subValue, + subClass)) + setattr(instance, attr, subValues) + else: + setattr(instance, attr, self.deserialize(value, + objClass)) + + return instance + + +class MethodRequest(urllib2.Request): + + def __init__(self, *args, **kwargs): + """Construct a MethodRequest. Usage is the same as for + `urllib2.Request` except it also takes an optional `method` + keyword argument. If supplied, `method` will be used instead of + the default.""" + + if 'method' in kwargs: + self.method = kwargs.pop('method') + return urllib2.Request.__init__(self, *args, **kwargs) + + def get_method(self): + return getattr(self, 'method', urllib2.Request.get_method(self)) + diff --git a/modules/swagger-codegen/src/main/resources/python3/__init__.mustache b/modules/swagger-codegen/src/main/resources/python3/__init__.mustache new file mode 100644 index 00000000000..4b41ee706c7 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/__init__.mustache @@ -0,0 +1,9 @@ +#!/usr/bin/env python +"""Add all of the modules in the current directory to __all__""" +import os + +__all__ = [] + +for module in os.listdir(os.path.dirname(__file__)): + if module != '__init__.py' and module[-3:] == '.py': + __all__.append(module[:-3]) diff --git a/modules/swagger-codegen/src/main/resources/python3/api.mustache b/modules/swagger-codegen/src/main/resources/python3/api.mustache new file mode 100644 index 00000000000..2d8fbdc29ca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/api.mustache @@ -0,0 +1,96 @@ +#!/usr/bin/env python +""" +WordAPI.py +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. + +NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. +""" +import sys +import os + +from .models import * + + +{{#operations}} +class {{classname}}(object): + + def __init__(self, apiClient): + self.apiClient = apiClient + + {{newline}} + {{#operation}} + def {{nickname}}(self, {{#requiredParams}}{{paramName}}{{#defaultValue}} = None{{/defaultValue}}, {{/requiredParams}}**kwargs): + """{{summary}} + + Args: + {{#allParams}} + {{paramName}}, {{dataType}}: {{description}} {{^optional}}(required){{/optional}}{{#optional}}(optional){{/optional}} + {{newline}} + {{/allParams}} + {{newline}} + Returns: {{returnType}} + """ + + allParams = [{{#allParams}}'{{paramName}}'{{#hasMore}}, {{/hasMore}}{{/allParams}}] + + params = locals() + for (key, val) in params['kwargs'].items(): + if key not in allParams: + raise TypeError("Got an unexpected keyword argument '%s' to method {{nickname}}" % key) + params[key] = val + del params['kwargs'] + + resourcePath = '{{path}}' + resourcePath = resourcePath.replace('{format}', 'json') + method = '{{httpMethod}}' + + queryParams = {} + headerParams = {} + + {{#queryParams}} + if ('{{paramName}}' in params): + queryParams['{{paramName}}'] = self.apiClient.toPathValue(params['{{paramName}}']) + {{/queryParams}} + + {{#headerParams}} + if ('{{paramName}}' in params): + headerParams['{{paramName}}'] = params['{{paramName}}'] + {{/headerParams}} + + {{#pathParams}} + if ('{{paramName}}' in params): + replacement = str(self.apiClient.toPathValue(params['{{paramName}}'])) + resourcePath = resourcePath.replace('{' + '{{baseName}}' + '}', + replacement) + {{/pathParams}} + + postData = (params['body'] if 'body' in params else None) + + response = self.apiClient.callAPI(resourcePath, method, queryParams, + postData, headerParams) + + {{#returnType}} + if not response: + return None + + responseObject = self.apiClient.deserialize(response, '{{returnType}}') + return responseObject + {{/returnType}} + {{newline}} + {{newline}} + {{/operation}} +{{newline}} +{{/operations}} +{{newline}} diff --git a/modules/swagger-codegen/src/main/resources/python3/model.mustache b/modules/swagger-codegen/src/main/resources/python3/model.mustache new file mode 100644 index 00000000000..39547c90050 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/model.mustache @@ -0,0 +1,40 @@ +#!/usr/bin/env python +""" +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. +""" +{{#models}} +{{#model}} + +class {{classname}}: + """NOTE: This class is auto generated by the swagger code generator program. + Do not edit the class manually.""" + + + def __init__(self): + self.swaggerTypes = { + {{#vars}} + '{{name}}': '{{{datatype}}}'{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + + + {{#vars}} + {{#description}}#{{description}} + {{/description}} + self.{{name}} = None # {{{datatype}}} + {{/vars}} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/python3/swagger.mustache b/modules/swagger-codegen/src/main/resources/python3/swagger.mustache new file mode 100644 index 00000000000..a01b69794ee --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/python3/swagger.mustache @@ -0,0 +1,203 @@ +#!/usr/bin/env python +"""Wordnik.com's Swagger generic API client. This client handles the client- +server communication, and is invariant across implementations. Specifics of +the methods and models for each application are generated from the Swagger +templates.""" + +import sys +import os +import re +import urllib.request, urllib.error, urllib.parse +import http.client +import json +import datetime + +from .models import * + + +class ApiClient: + """Generic API client for Swagger client library builds""" + + def __init__(self, apiKey=None, apiServer=None): + if apiKey == None: + raise Exception('You must pass an apiKey when instantiating the ' + 'APIClient') + self.apiKey = apiKey + self.apiServer = apiServer + self.cookie = None + + def callAPI(self, resourcePath, method, queryParams, postData, + headerParams=None): + + url = self.apiServer + resourcePath + headers = {} + if headerParams: + for param, value in headerParams.items(): + headers[param] = value + + #headers['Content-type'] = 'application/json' + headers['api_key'] = self.apiKey + + if self.cookie: + headers['Cookie'] = self.cookie + + data = None + + + if queryParams: + # Need to remove None values, these should not be sent + sentQueryParams = {} + for param, value in queryParams.items(): + if value != None: + sentQueryParams[param] = value + url = url + '?' + urllib.parse.urlencode(sentQueryParams) + + if method in ['GET']: + + #Options to add statements later on and for compatibility + pass + + elif method in ['POST', 'PUT', 'DELETE']: + + if postData: + headers['Content-type'] = 'application/json' + data = self.sanitizeForSerialization(postData) + data = json.dumps(data) + + else: + raise Exception('Method ' + method + ' is not recognized.') + + if data: + data = data.encode('utf-8') + + requestParams = MethodRequest(method=method, url=url, + headers=headers, data=data) + + # Make the request + request = urllib.request.urlopen(requestParams) + encoding = request.headers.get_content_charset() + if not encoding: + encoding = 'iso-8859-1' + response = request.read().decode(encoding) + + try: + data = json.loads(response) + except ValueError: # PUT requests don't return anything + data = None + + return data + + def toPathValue(self, obj): + """Convert a string or object to a path-friendly value + Args: + obj -- object or string value + Returns: + string -- quoted value + """ + if type(obj) == list: + return urllib.parse.quote(','.join(obj)) + else: + return urllib.parse.quote(str(obj)) + + def sanitizeForSerialization(self, obj): + """Dump an object into JSON for POSTing.""" + + if type(obj) == type(None): + return None + elif type(obj) in [str, int, float, bool]: + return obj + elif type(obj) == list: + return [self.sanitizeForSerialization(subObj) for subObj in obj] + elif type(obj) == datetime.datetime: + return obj.isoformat() + else: + if type(obj) == dict: + objDict = obj + else: + objDict = obj.__dict__ + return {key: self.sanitizeForSerialization(val) + for (key, val) in objDict.items() + if key != 'swaggerTypes'} + + def deserialize(self, obj, objClass): + """Derialize a JSON string into an object. + + Args: + obj -- string or object to be deserialized + objClass -- class literal for deserialzied object, or string + of class name + Returns: + object -- deserialized object""" + + # Have to accept objClass as string or actual type. Type could be a + # native Python type, or one of the model classes. + if type(objClass) == str: + if 'list[' in objClass: + match = re.match('list\[(.*)\]', objClass) + subClass = match.group(1) + return [self.deserialize(subObj, subClass) for subObj in obj] + + if (objClass in ['int', 'float', 'dict', 'list', 'str', 'bool', 'datetime']): + objClass = eval(objClass) + else: # not a native type, must be model class + objClass = eval(objClass + '.' + objClass) + + if objClass in [int, float, dict, list, str, bool]: + return objClass(obj) + elif objClass == datetime: + # Server will always return a time stamp in UTC, but with + # trailing +0000 indicating no offset from UTC. So don't process + # last 5 characters. + return datetime.datetime.strptime(obj[:-5], + "%Y-%m-%dT%H:%M:%S.%f") + + instance = objClass() + + for attr, attrType in instance.swaggerTypes.items(): + + if attr in obj: + value = obj[attr] + if attrType in ['str', 'int', 'float', 'bool']: + attrType = eval(attrType) + try: + value = attrType(value) + except UnicodeEncodeError: + value = unicode(value) + except TypeError: + value = value + setattr(instance, attr, value) + elif (attrType == 'datetime'): + setattr(instance, attr, datetime.datetime.strptime(value[:-5], + "%Y-%m-%dT%H:%M:%S.%f")) + elif 'list[' in attrType: + match = re.match('list\[(.*)\]', attrType) + subClass = match.group(1) + subValues = [] + if not value: + setattr(instance, attr, None) + else: + for subValue in value: + subValues.append(self.deserialize(subValue, + subClass)) + setattr(instance, attr, subValues) + else: + setattr(instance, attr, self.deserialize(value, + objClass)) + + return instance + + +class MethodRequest(urllib.request.Request): + + def __init__(self, *args, **kwargs): + """Construct a MethodRequest. Usage is the same as for + `urllib.Request` except it also takes an optional `method` + keyword argument. If supplied, `method` will be used instead of + the default.""" + + if 'method' in kwargs: + self.method = kwargs.pop('method') + return urllib.request.Request.__init__(self, *args, **kwargs) + + def get_method(self): + return getattr(self, 'method', urllib.request.Request.get_method(self)) diff --git a/modules/swagger-codegen/src/main/resources/ruby/api.mustache b/modules/swagger-codegen/src/main/resources/ruby/api.mustache new file mode 100644 index 00000000000..b2c546b011e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/api.mustache @@ -0,0 +1,85 @@ +require "uri" + +{{#operations}} +class {{classname}} + basePath = "{{basePath}}" + # apiInvoker = APIInvoker + + def self.escapeString(string) + URI.encode(string.to_s) + end + + {{#operation}} + def self.{{nickname}} ({{#allParams}}{{paramName}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}},{{/allParams}} opts={}) + query_param_keys = [{{#queryParams}}:{{paramName}}{{#hasMore}},{{/hasMore}}{{/queryParams}}] + + {{#requiredParamCount}} + + # verify existence of params + {{#requiredParams}} + raise "{{{paramName}}} is required" if {{{paramName}}}.nil? + {{/requiredParams}} + {{/requiredParamCount}} + + # set default values and merge with input + options = { + {{#allParams}} + :{{paramName}} => {{paramName}}{{#hasMore}}, + {{/hasMore}} + {{/allParams}} + }.merge(opts) + + #resource path + path = "{{path}}".sub('{format}','json'){{#pathParams}}.sub('{' + '{{baseName}}' + '}', escapeString({{paramName}})) + {{/pathParams}}{{newline}} + + # pull querystring keys from options + queryopts = options.select do |key,value| + query_param_keys.include? key + end + + {{#headerParams}}headers = { + {{{paramName}}}: {{{paramName}}}, + } + {{/headerParams}} + {{^headerParams}}headers = nil + {{/headerParams}} + + post_body = nil + {{#bodyParam}} + if body != nil + if body.is_a?(Array) + array = Array.new + body.each do |item| + if item.respond_to?("to_body".to_sym) + array.push item.to_body + else + array.push item + end + end + post_body = array + + else + if body.respond_to?("to_body".to_sym) + post_body = body.to_body + else + post_body = body + end + end + end + {{/bodyParam}} + + {{#returnType}} + response = Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body }).make.body + {{#returnContainer}} + response.map {|response|{{/returnContainer}} {{returnBaseType}}.new(response){{#returnContainer}} }{{/returnContainer}} + {{/returnType}} + {{^returnType}} + Swagger::Request.new(:{{httpMethod}}, path, {:params=>queryopts,:headers=>headers, :body=>post_body}).make + {{/returnType}} + {{newline}} + end + +{{/operation}} +end +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache new file mode 100644 index 00000000000..c587f12cb49 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -0,0 +1,41 @@ +{{#models}} + +{{#model}} +class {{classname}} + attr_accessor {{#vars}}:{{{name}}}{{#hasMore}}, {{/hasMore}}{{/vars}}{{newline}} + # :internal => :external + def self.attribute_map + { + {{#vars}} + :{{{name}}} => :{{{baseName}}}{{#hasMore}}, + {{/hasMore}} + {{/vars}}{{newline}} + } + end + + def initialize(attributes = {}) + return if attributes.empty? + # Morph attribute keys into undescored rubyish style + {{#vars}} + if self.class.attribute_map[:"{{{name}}}"] + {{#isContainer}} + if (value = attributes["{{{baseName}}}"]).is_a?(Array) + @{{{name}}} = value{{#complexType}}.map{ |v| {{complexType}}.new(v) }{{/complexType}}{{newline}} + end + {{/isContainer}}{{^isContainer}} + @{{{name}}} = attributes["{{{baseName}}}"] + {{/isContainer}} + end + {{/vars}}{{newline}} + end + + def to_body + body = {} + self.class.attribute_map.each_pair do |key, value| + body[value] = self.send(key) unless self.send(key).nil? + end + body + end +end +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache b/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache new file mode 100644 index 00000000000..28932890af9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/monkey.mustache @@ -0,0 +1,90 @@ +# module Swagger + class Object + + unless Object.method_defined? :blank? + def blank? + respond_to?(:empty?) ? empty? : !self + end + end + + unless Object.method_defined? :present? + def present? + !blank? + end + end + + end + + class String + + unless String.method_defined? :underscore + def underscore + self.gsub(/::/, '/'). + gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). + gsub(/([a-z\d])([A-Z])/,'\1_\2'). + tr("-", "_"). + downcase + end + end + + unless String.method_defined? :camelize + def camelize(first_letter_in_uppercase = true) + if first_letter_in_uppercase != :lower + self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } + else + self.to_s[0].chr.downcase + camelize(self)[1..-1] + end + end + end + + end + + class Hash + + unless Hash.method_defined? :stringify_keys + def stringify_keys + inject({}) do |options, (key, value)| + options[key.to_s] = value + options + end + end + end + + unless Hash.method_defined? :stringify_keys! + def stringify_keys! + self.replace(self.stringify_keys) + end + end + + unless Hash.method_defined? :symbolize_keys + def symbolize_keys + inject({}) do |options, (key, value)| + options[(key.to_sym rescue key) || key] = value + options + end + end + end + + unless Hash.method_defined? :symbolize_keys! + def symbolize_keys! + self.replace(self.symbolize_keys) + end + end + + unless Hash.method_defined? :symbolize_and_underscore_keys + def symbolize_and_underscore_keys + inject({}) do |options, (key, value)| + options[(key.to_s.underscore.to_sym rescue key) || key] = value + options + end + end + end + + unless Hash.method_defined? :symbolize_and_underscore_keys! + def symbolize_and_underscore_keys! + self.replace(self.symbolize_and_underscore_keys) + end + end + + end +# end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache new file mode 100644 index 00000000000..1cc3ea456c2 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger.mustache @@ -0,0 +1,84 @@ +require 'monkey' +require 'swagger/configuration' +require 'swagger/request' +require 'swagger/response' +require 'swagger/version' +require 'logger' + +module Swagger + + class << self + attr_accessor :logger + + # A Swagger configuration object. Must act like a hash and return sensible + # values for all Swagger configuration options. See Swagger::Configuration. + attr_accessor :configuration + + attr_accessor :resources + + # Call this method to modify defaults in your initializers. + # + # @example + # Swagger.configure do |config| + # config.api_key = '1234567890abcdef' # required + # config.username = 'wordlover' # optional, but needed for user-related functions + # config.password = 'i<3words' # optional, but needed for user-related functions + # config.format = 'json' # optional, defaults to 'json' + # end + # + def configure + self.configuration ||= Configuration.new + yield(configuration) if block_given? + + # Configure logger. Default to use Rails + self.logger ||= configuration.logger || (defined?(Rails) ? Rails.logger : Logger.new(STDOUT)) + + # remove :// from scheme + configuration.scheme.sub!(/:\/\//, '') + + # remove http(s):// and anything after a slash + configuration.host.sub!(/https?:\/\//, '') + configuration.host = configuration.host.split('/').first + + # Add leading and trailing slashes to base_path + configuration.base_path = "/#{configuration.base_path}".gsub(/\/+/, '/') + configuration.base_path = "" if configuration.base_path == "/" + end + + def authenticated? + Swagger.configuration.auth_token.present? + end + + def de_authenticate + Swagger.configuration.auth_token = nil + end + + def authenticate + return if Swagger.authenticated? + + if Swagger.configuration.username.blank? || Swagger.configuration.password.blank? + raise ClientError, "Username and password are required to authenticate." + end + + request = Swagger::Request.new( + :get, + "account/authenticate/{username}", + :params => { + :username => Swagger.configuration.username, + :password => Swagger.configuration.password + } + ) + + response_body = request.response.body + Swagger.configuration.auth_token = response_body['token'] + end + + end + +end + +class ServerError < StandardError +end + +class ClientError < StandardError +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache new file mode 100644 index 00000000000..c0b3c46268c --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/configuration.mustache @@ -0,0 +1,22 @@ +module Swagger + + class Configuration + require 'swagger/version' + + attr_accessor :format, :api_key, :username, :password, :auth_token, :scheme, :host, :base_path, :user_agent, :logger, :inject_format, :force_ending_format, :camelize_params + + # Defaults go in here.. + def initialize + @format = 'json' + @scheme = 'http' + @host = 'api.wordnik.com' + @base_path = '/v4' + @user_agent = "ruby-#{Swagger::VERSION}" + @inject_format = true + @force_ending_format = false + @camelize_params = true + end + + end + +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache new file mode 100644 index 00000000000..7836cb0bf03 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/request.mustache @@ -0,0 +1,199 @@ +module Swagger + + class Request + require 'uri' + require 'addressable/uri' + require 'typhoeus' + require "swagger/version" + + attr_accessor :host, :path, :format, :params, :body, :http_method, :headers + + + # All requests must have an HTTP method and a path + # Optionals parameters are :params, :headers, :body, :format, :host + # + def initialize(http_method, path, attributes={}) + attributes[:format] ||= Swagger.configuration.format + attributes[:params] ||= {} + + # Set default headers + default_headers = { + 'Content-Type' => "application/#{attributes[:format].downcase}", + :api_key => Swagger.configuration.api_key + } + + # api_key from headers hash trumps the default, even if its value is blank + if attributes[:headers].present? && attributes[:headers].has_key?(:api_key) + default_headers.delete(:api_key) + end + + # api_key from params hash trumps all others (headers and default_headers) + if attributes[:params].present? && attributes[:params].has_key?(:api_key) + default_headers.delete(:api_key) + attributes[:headers].delete(:api_key) if attributes[:headers].present? + end + + # Merge argument headers into defaults + attributes[:headers] = default_headers.merge(attributes[:headers] || {}) + + # Stick in the auth token if there is one + if Swagger.authenticated? + attributes[:headers].merge!({:auth_token => Swagger.configuration.auth_token}) + end + + self.http_method = http_method.to_sym + self.path = path + attributes.each do |name, value| + send("#{name.to_s.underscore.to_sym}=", value) + end + end + + # Construct a base URL + # + def url(options = {}) + u = Addressable::URI.new( + :scheme => Swagger.configuration.scheme, + :host => Swagger.configuration.host, + :path => self.interpreted_path, + :query => self.query_string.sub(/\?/, '') + ).to_s + + # Drop trailing question mark, if present + u.sub! /\?$/, '' + + # Obfuscate API key? + u.sub! /api\_key=\w+/, 'api_key=YOUR_API_KEY' if options[:obfuscated] + + u + end + + # Iterate over the params hash, injecting any path values into the path string + # + # e.g. /word.{format}/{word}/entries => /word.json/cat/entries + def interpreted_path + p = self.path.dup + + # Fill in the path params + self.params.each_pair do |key, value| + p = p.gsub("{#{key}}", value.to_s) + end + + # Stick a .{format} placeholder into the path if there isn't + # one already or an actual format like json or xml + # e.g. /words/blah => /words.{format}/blah + if Swagger.configuration.inject_format + unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } + p = p.sub(/^(\/?\w+)/, "\\1.#{format}") + end + end + + # Stick a .{format} placeholder on the end of the path if there isn't + # one already or an actual format like json or xml + # e.g. /words/blah => /words/blah.{format} + if Swagger.configuration.force_ending_format + unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s } + p = "#{p}.#{format}" + end + end + + p = p.sub("{format}", self.format.to_s) + + URI.encode [Swagger.configuration.base_path, p].join("/").gsub(/\/+/, '/') + end + + # Massage the request body into a state of readiness + # If body is a hash, camelize all keys then convert to a json string + # + def body=(value) + if value.is_a?(Hash) + value = value.inject({}) do |memo, (k,v)| + memo[k.to_s.camelize(:lower).to_sym] = v + memo + end + end + @body = value + end + + # If body is an object, JSONify it before making the actual request. + # + def outgoing_body + body.is_a?(String) ? body : body.to_json + end + + # Construct a query string from the query-string-type params + def query_string + + # Iterate over all params, + # .. removing the ones that are part of the path itself. + # .. stringifying values so Addressable doesn't blow up. + query_values = {} + self.params.each_pair do |key, value| + next if self.path.include? "{#{key}}" # skip path params + next if value.blank? && value.class != FalseClass # skip empties + if Swagger.configuration.camelize_params + key = key.to_s.camelize(:lower).to_sym unless key.to_sym == :api_key # api_key is not a camelCased param + end + query_values[key] = value.to_s + end + + # We don't want to end up with '?' as our query string + # if there aren't really any params + return "" if query_values.blank? + + # Addressable requires query_values to be set after initialization.. + qs = Addressable::URI.new + qs.query_values = query_values + qs.to_s + end + + def make + logger = Logger.new STDOUT + logger.debug self.url + response = case self.http_method.to_sym + when :get,:GET + Typhoeus::Request.get( + self.url, + :headers => self.headers.stringify_keys, + ) + + when :post,:POST + Typhoeus::Request.post( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + + when :put,:PUT + Typhoeus::Request.put( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + + when :delete,:DELETE + Typhoeus::Request.delete( + self.url, + :body => self.outgoing_body, + :headers => self.headers.stringify_keys, + ) + end + Response.new(response) + end + + def response + self.make + end + + def response_code_pretty + return unless @response.present? + @response.code.to_s + end + + def response_headers_pretty + return unless @response.present? + # JSON.pretty_generate(@response.headers).gsub(/\n/, '
') # <- This was for RestClient + @response.headers.gsub(/\n/, '
') # <- This is for Typhoeus + end + + end +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache new file mode 100644 index 00000000000..02a1a458eb4 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/response.mustache @@ -0,0 +1,70 @@ +module Swagger + + class Response + require 'json' + + attr_accessor :raw + + def initialize(raw) + self.raw = raw + + case self.code + when 500..510 then raise(ServerError, self.error_message) + when 299..426 then raise(ClientError, self.error_message) + end + end + + def code + raw.code + end + + # Account for error messages that take different forms... + def error_message + body['message'] + rescue + body + end + + # If body is JSON, parse it + # Otherwise return raw string + def body + JSON.parse raw.body + rescue + raw.body + end + + # `headers_hash` is a Typhoeus-specific extension of Hash, + # so simplify it back into a regular old Hash. + def headers + h = {} + raw.headers_hash.each {|k,v| h[k] = v } + h + end + + # Extract the response format from the header hash + # e.g. {'Content-Type' => 'application/json'} + def format + headers['Content-Type'].split("/").last.downcase + end + + def json? + format == 'json' + end + + def xml? + format == 'xml' + end + + def pretty_body + return unless body.present? + case format + when 'json' then JSON.pretty_generate(body).gsub(/\n/, '
') + end + end + + def pretty_headers + JSON.pretty_generate(headers).gsub(/\n/, '
') + end + + end +end \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache b/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache new file mode 100644 index 00000000000..39357c0ed6d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/ruby/swagger/version.mustache @@ -0,0 +1,4 @@ +module Swagger + VERSION = "4.06.08" +end + diff --git a/modules/swagger-codegen/src/main/resources/scala/api.mustache b/modules/swagger-codegen/src/main/resources/scala/api.mustache new file mode 100644 index 00000000000..7c05406a5a8 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/api.mustache @@ -0,0 +1,68 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} +import {{invokerPackage}}.ApiInvoker +import {{invokerPackage}}.ApiException + +import java.io.File +import java.util.Date + +import scala.collection.mutable.HashMap + +{{#operations}} +class {{classname}} { + var basePath: String = "{{basePath}}" + var apiInvoker = ApiInvoker + + def addHeader(key: String, value: String) = apiInvoker.defaultHeaders += key -> value + + {{#operation}} + def {{nickname}} ({{#allParams}}{{paramName}}: {{dataType}}{{#defaultValue}} = {{{defaultValue}}}{{/defaultValue}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) {{#returnType}}: Option[{{returnType}}]{{/returnType}} = { + // create path and map variables + val path = "{{path}}".replaceAll("\\{format\\}","json"){{#pathParams}}.replaceAll("\\{" + "{{baseName}}" + "\\}",apiInvoker.escape({{paramName}})) + + {{/pathParams}} + + {{newline}} + val contentType = { + {{#bodyParam}}if({{paramName}} != null && {{paramName}}.isInstanceOf[File] ) + "multipart/form-data" + else "application/json" + {{/bodyParam}} + {{^bodyParam}}"application/json"{{/bodyParam}} + } + + // query params + val queryParams = new HashMap[String, String] + val headerParams = new HashMap[String, String] + + {{#requiredParamCount}} + // verify required params are set + (List({{/requiredParamCount}}{{#requiredParams}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/requiredParams}}{{#requiredParamCount}}).filter(_ != null)).size match { + case {{requiredParamCount}} => // all required values set + case _ => throw new Exception("missing required params") + } + {{/requiredParamCount}} + + {{#queryParams}}if(String.valueOf({{paramName}}) != "null") queryParams += "{{baseName}}" -> {{paramName}}.toString + {{/queryParams}} + + {{#headerParams}}headerParams += "{{baseName}}" -> {{paramName}} + {{/headerParams}} + + try { + apiInvoker.invokeApi(basePath, path, "{{httpMethod}}", queryParams.toMap, {{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}None{{/bodyParam}}, headerParams.toMap, contentType) match { + case s: String => + {{#returnType}} Some(ApiInvoker.deserialize(s, "{{returnContainer}}", classOf[{{returnBaseType}}]).asInstanceOf[{{returnType}}]) + {{/returnType}} + case _ => None + } + } catch { + case ex: ApiException if ex.code == 404 => None + case ex: ApiException => throw ex + } + } + {{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache b/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache new file mode 100644 index 00000000000..5c6d60d37b5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/apiInvoker.mustache @@ -0,0 +1,164 @@ +package {{invokerPackage}} + +import com.sun.jersey.api.client.Client +import com.sun.jersey.api.client.ClientResponse +import com.sun.jersey.api.client.config.ClientConfig +import com.sun.jersey.api.client.config.DefaultClientConfig +import com.sun.jersey.api.client.filter.LoggingFilter + +import com.sun.jersey.multipart.FormDataMultiPart +import com.sun.jersey.multipart.file.FileDataBodyPart + +import java.io.File +import java.net.URLEncoder +import javax.ws.rs.core.MediaType + +import scala.collection.JavaConverters._ +import scala.collection.mutable.HashMap + +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.core.JsonGenerator.Feature +import com.fasterxml.jackson.databind._ +import com.fasterxml.jackson.annotation._ +import com.fasterxml.jackson.databind.annotation.JsonSerialize + +object ScalaJsonUtil { + def getJsonMapper = { + val mapper = new ObjectMapper() + mapper.registerModule(new DefaultScalaModule()) + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT) + mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY) + mapper + } +} + +object ApiInvoker { + val mapper = ScalaJsonUtil.getJsonMapper + val defaultHeaders: HashMap[String, String] = HashMap() + val hostMap: HashMap[String, Client] = HashMap() + + def escape(value: String): String = { + URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20") + } + + def escape(value: Long): String = value.toString + def escape(value: Double): String = value.toString + def escape(value: Float): String = value.toString + + def deserialize(json: String, containerType: String, cls: Class[_]) = { + if (cls == classOf[String]) { + json match { + case s: String => { + if (s.startsWith("\"") && s.endsWith("\"") && s.length > 1) s.substring(1, s.length - 2) + else s + } + case _ => null + } + } else { + containerType.toLowerCase match { + case "array" => { + val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) + val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] + response.asScala.toList + } + case "list" => { + val typeInfo = mapper.getTypeFactory().constructCollectionType(classOf[java.util.List[_]], cls) + val response = mapper.readValue(json, typeInfo).asInstanceOf[java.util.List[_]] + response.asScala.toList + } + case _ => { + json match { + case e: String if ("\"\"" == e) => null + case _ => mapper.readValue(json, cls) + } + } + } + } + } + + def serialize(obj: AnyRef): String = { + if (obj != null) { + obj match { + case e: List[_] => mapper.writeValueAsString(obj.asInstanceOf[List[_]].asJava) + case _ => mapper.writeValueAsString(obj) + } + } else null + } + + def invokeApi(host: String, path: String, method: String, queryParams: Map[String, String], body: AnyRef, headerParams: Map[String, String], contentType: String): String = { + val client = getClient(host) + + val querystring = queryParams.filter(k => k._2 != null).map(k => (escape(k._1) + "=" + escape(k._2))).mkString("?", "&", "") + val builder = client.resource(host + path + querystring).accept(contentType) + headerParams.map(p => builder.header(p._1, p._2)) + defaultHeaders.map(p => { + headerParams.contains(p._1) match { + case true => // override default with supplied header + case false => if (p._2 != null) builder.header(p._1, p._2) + } + }) + + val response: ClientResponse = method match { + case "GET" => { + builder.get(classOf[ClientResponse]).asInstanceOf[ClientResponse] + } + case "POST" => { + if(body != null && body.isInstanceOf[File]) { + val file = body.asInstanceOf[File] + val form = new FormDataMultiPart() + form.field("filename", file.getName()) + form.bodyPart(new FileDataBodyPart("file", file, MediaType.MULTIPART_FORM_DATA_TYPE)) + builder.post(classOf[ClientResponse], form) + } + else { + if(body == null) builder.post(classOf[ClientResponse], serialize(body)) + else builder.`type`(contentType).post(classOf[ClientResponse], serialize(body)) + } + } + case "PUT" => { + if(body == null) builder.put(classOf[ClientResponse], null) + else builder.`type`(contentType).put(classOf[ClientResponse], serialize(body)) + } + case "DELETE" => { + builder.delete(classOf[ClientResponse]) + } + case _ => null + } + response.getClientResponseStatus().getStatusCode() match { + case 204 => "" + case code: Int if (Range(200, 299).contains(code)) => { + response.hasEntity() match { + case true => response.getEntity(classOf[String]) + case false => "" + } + } + case _ => { + val entity = response.hasEntity() match { + case true => response.getEntity(classOf[String]) + case false => "no data" + } + throw new ApiException( + response.getClientResponseStatus().getStatusCode(), + entity) + } + } + } + + def getClient(host: String): Client = { + hostMap.contains(host) match { + case true => hostMap(host) + case false => { + val client = Client.create() + // client.addFilter(new LoggingFilter()) + hostMap += host -> client + client + } + } + } +} + +class ApiException(val code: Int, msg: String) extends RuntimeException(msg) + diff --git a/modules/swagger-codegen/src/main/resources/scala/model.mustache b/modules/swagger-codegen/src/main/resources/scala/model.mustache new file mode 100644 index 00000000000..a45b71a8f8e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +{{#models}} + +{{#model}} + +case class {{classname}} ( + {{#vars}}{{#description}}/* {{{description}}} */ + {{/description}}{{name}}: {{{datatype}}}{{#hasMore}},{{/hasMore}}{{^hasMore}}){{/hasMore}} + {{/vars}} +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scala/pom.mustache b/modules/swagger-codegen/src/main/resources/scala/pom.mustache new file mode 100644 index 00000000000..ac6a81caa46 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scala/pom.mustache @@ -0,0 +1,232 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + 2.2.0 + + + + + maven-mongodb-plugin-repo + maven mongodb plugin repository + http://maven-mongodb-plugin.googlecode.com/svn/maven/repo + default + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + pertest + + + + maven-dependency-plugin + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.2 + + + + jar + test-jar + + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin-version} + + + scala-compile-first + process-resources + + add-source + compile + + + + scala-test-compile + process-test-resources + + testCompile + + + + + + -Xms128m + -Xmx1500m + + + + + + + + + org.scala-tools + maven-scala-plugin + + ${scala-version} + + + + + + + com.sun.jersey + jersey-client + ${jersey-version} + compile + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + compile + + + org.scala-lang + scala-library + ${scala-version} + compile + + + com.wordnik + swagger-core_${scala-short-version} + ${swagger-core-version} + compile + + + org.scalatest + scalatest_${scala-short-version} + ${scala-test-version} + test + + + junit + junit + ${junit-version} + test + + + joda-time + joda-time + ${joda-time-version} + + + org.joda + joda-convert + ${joda-version} + + + + + scala_2.10 + + 2.10.3 + 2.10 + 1.3.2 + 2.1.2 + + + + scala_2.9.1 + + true + + + 2.9.1-1 + 2.9.1 + 1.1.0 + 1.6.1 + + + + + 1.2 + 2.2 + 1.7 + 4.8.1 + 1.0.0 + 4.8.1 + 3.1.5 + + diff --git a/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache b/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache new file mode 100644 index 00000000000..64c0b07eb28 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/Bootstrap.mustache @@ -0,0 +1,20 @@ +import {{apiPackage}}._ +import akka.actor.ActorSystem +import com.wordnik.swagger.app.{ResourcesApp, SwaggerApp} +import javax.servlet.ServletContext +import org.scalatra.LifeCycle + +class ScalatraBootstrap extends LifeCycle { + implicit val swagger = new SwaggerApp + + override def init(context: ServletContext) { + implicit val system = ActorSystem("appActorSystem") + try { + {{#apiInfo}}{{#apis}}context mount (new {{classname}}, "/{{baseName}}/*") + {{/apis}}{{/apiInfo}} + context mount (new ResourcesApp, "/api-docs/*") + } catch { + case e: Throwable => e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala b/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala new file mode 100644 index 00000000000..e25f16ba392 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/JettyMain.scala @@ -0,0 +1,43 @@ +import org.eclipse.jetty.server._ +import org.eclipse.jetty.webapp.WebAppContext +import org.scalatra.servlet.ScalatraListener + +object JettyMain { + + object conf { + val port = sys.env.get("PORT") map (_.toInt) getOrElse (8080) + val stopTimeout = sys.env.get("STOP_TIMEOUT") map (_.toInt) getOrElse (5000) + val connectorIdleTimeout = sys.env.get("CONNECTOR_IDLE_TIMEOUT") map (_.toInt) getOrElse (90000) + val webapp = sys.env.get("PUBLIC") getOrElse "webapp" + val contextPath = sys.env.get("CONTEXT_PATH") getOrElse "/" + } + + def main(args: Array[String]) = { + val server: Server = new Server + println("starting jetty") + + server setStopTimeout conf.stopTimeout + //server setDumpAfterStart true + server setStopAtShutdown true + + val httpConfig = new HttpConfiguration() + httpConfig setSendDateHeader true + httpConfig setSendServerVersion false + + val connector = new NetworkTrafficServerConnector(server, new HttpConnectionFactory(httpConfig)) + connector setPort conf.port + connector setSoLingerTime 0 + connector setIdleTimeout conf.connectorIdleTimeout + server addConnector connector + + val webapp = conf.webapp + val webApp = new WebAppContext + webApp setContextPath conf.contextPath + webApp setResourceBase conf.webapp + webApp setEventListeners Array(new ScalatraListener) + + server setHandler webApp + + server.start() + } +} diff --git a/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala b/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala new file mode 100644 index 00000000000..691a82f563b --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/JsonUtil.scala @@ -0,0 +1,12 @@ +package json + +import com.fasterxml.jackson.module.scala.DefaultScalaModule +import com.fasterxml.jackson.core.JsonGenerator.Feature +import com.fasterxml.jackson.databind._ + +object JsonUtil { + val mapper = new ObjectMapper() + mapper.registerModule(new DefaultScalaModule()) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache new file mode 100644 index 00000000000..f8a560b776f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a swagger-enabled scalatra server. + +This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache b/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache new file mode 100644 index 00000000000..f6e53468ec9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/ServletApp.mustache @@ -0,0 +1,39 @@ +package com.wordnik.swagger.app + +import _root_.akka.actor.ActorSystem + +import org.scalatra.swagger.{ ApiInfo, SwaggerWithAuth, Swagger } +import org.scalatra.swagger.{JacksonSwaggerBase, Swagger} +import org.scalatra.ScalatraServlet +import org.json4s.{DefaultFormats, Formats} + +class ResourcesApp(implicit protected val system: ActorSystem, val swagger: SwaggerApp) + extends ScalatraServlet with JacksonSwaggerBase { + before() { + response.headers += ("Access-Control-Allow-Origin" -> "*") + } + + protected def buildFullUrl(path: String) = if (path.startsWith("http")) path else { + val port = request.getServerPort + val h = request.getServerName + val prot = if (port == 443) "https" else "http" + val (proto, host) = if (port != 80 && port != 443) ("http", h+":"+port.toString) else (prot, h) + "%s://%s%s%s".format( + proto, + host, + request.getContextPath, + path) + } +} + +class SwaggerApp extends Swagger(apiInfo = ApiSwagger.apiInfo, apiVersion = "1.0", swaggerVersion = "1.2") + +object ApiSwagger { + val apiInfo = ApiInfo( + """{{{appName}}}""", + """{{{appDescription}}}""", + """{{{infoUrl}}}""", + """{{{infoEmail}}}""", + """{{{licenseInfo}}}""", + """{{{licenseUrl}}}""") +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/api.mustache b/modules/swagger-codegen/src/main/resources/scalatra/api.mustache new file mode 100644 index 00000000000..54710361fe9 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/api.mustache @@ -0,0 +1,94 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +import java.io.File + +import org.scalatra.{ TypedParamSupport, ScalatraServlet } +import org.scalatra.swagger._ +import org.json4s._ +import org.json4s.JsonDSL._ +import org.scalatra.json.{ JValueResult, JacksonJsonSupport } +import org.scalatra.servlet.{FileUploadSupport, MultipartConfig, SizeConstraintExceededException} + +import scala.collection.JavaConverters._ + +class {{classname}} (implicit val swagger: Swagger) extends ScalatraServlet + with FileUploadSupport + with JacksonJsonSupport + with SwaggerSupport { + protected implicit val jsonFormats: Formats = DefaultFormats + + protected val applicationDescription: String = "{{classname}}" + override protected val applicationName: Option[String] = Some("{{baseName}}") + + before() { + contentType = formats("json") + response.headers += ("Access-Control-Allow-Origin" -> "*") + } +{{#operations}} +{{#operation}} + {{newline}} + + val {{nickname}}Operation = (apiOperation[{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}]("{{nickname}}") + summary "{{{summary}}}" + parameters( + {{#allParams}}{{#isQueryParam}}queryParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isQueryParam}} + {{#isPathParam}}pathParam[{{dataType}}]("{{paramName}}").description(""){{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isPathParam}} + {{#isHeaderParam}}headerParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isHeaderParam}} + {{#isBodyParam}}bodyParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isBodyParam}} + {{#isFormParam}}formParam[{{dataType}}]("{{paramName}}").description(""){{^required}}.optional{{/required}}{{#defaultValue}}.defaultValue({{{defaultValue}}}){{/defaultValue}} + {{/isFormParam}} + {{#hasMore}},{{/hasMore}} + {{/allParams}}) + ) + + {{httpMethod}}("{{path}}",operation({{nickname}}Operation)) { + {{#allParams}} + {{#isFile}} + val {{paramName}} = fileParams("{{paramName}}") + {{/isFile}} + {{^isFile}} + {{#isPathParam}} + val {{paramName}} = params.getOrElse("{{paramName}}", halt(400)) + {{/isPathParam}} + + {{#isQueryParam}} + {{#collectionFormat}}val {{paramName}}String = params.getAs[String]("{{paramName}}") + val {{paramName}} = if("{{collectionFormat}}".equals("default")) { + {{paramName}}String match { + case Some(str) => str.split(",") + case None => List() + } + } + else + List() + {{/collectionFormat}} + {{^collectionFormat}}val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}"){{/collectionFormat}} + + {{/isQueryParam}} + + {{#isHeaderParam}} + val {{paramName}} = request.getHeader("{{paramName}}") + {{/isHeaderParam}} + + {{#isFormParam}} + val {{paramName}} = params.getAs[{{dataType}}]("{{paramName}}") + {{/isFormParam}} + + {{#isBodyParam}} + val {{paramName}} = parsedBody.extract[{{dataType}}] + {{/isBodyParam}} + {{/isFile}} + println("{{paramName}}: " + {{paramName}}) + {{/allParams}} + } + +{{/operation}} +{{/operations}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/build.sbt b/modules/swagger-codegen/src/main/resources/scalatra/build.sbt new file mode 100644 index 00000000000..afe84c2c7f0 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/build.sbt @@ -0,0 +1,64 @@ +import AssemblyKeys._ // put this at the top of the file + +import NativePackagerKeys._ + +packageArchetype.java_server + +assemblySettings + +scalariformSettings + +organization := "com.wordnik" + +seq(webSettings :_*) + +mainClass in assembly := Some("JettyMain") + +name := "scalatra-sample" + +version := "0.1.0-SNAPSHOT" + +scalaVersion := "2.11.2" + +scalacOptions += "-language:postfixOps" + +libraryDependencies ++= Seq( + "org.scalatest" %% "scalatest" % "2.2.1" % "test", + "org.scalatra" %% "scalatra" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-scalate" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-json" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-swagger" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-swagger-ext" % "2.3.0.RC3", + "org.scalatra" %% "scalatra-slf4j" % "2.3.0.RC3", + "org.json4s" %% "json4s-jackson" % "3.2.10", + "org.json4s" %% "json4s-ext" % "3.2.10", + "commons-codec" % "commons-codec" % "1.7", + "net.databinder.dispatch" %% "dispatch-core" % "0.11.2", + //"net.databinder.dispatch" %% "json4s-jackson" % "0.11.2", + "net.databinder.dispatch" %% "dispatch-json4s-jackson" % "0.11.2", + "com.typesafe.akka" %% "akka-actor" % "2.3.6", + "org.eclipse.jetty" % "jetty-server" % "9.2.3.v20140905" % "container;compile;test", + "org.eclipse.jetty" % "jetty-webapp" % "9.2.3.v20140905" % "container;compile;test", + "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "container;compile;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")) +) + +resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository" + +resolvers += "Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" + +resolvers += "Sonatype OSS Releases" at "http://oss.sonatype.org/content/repositories/releases/" + +ivyXML := + + + + + +mergeStrategy in assembly <<= (mergeStrategy in assembly) { + (old) => { + case "about.html" => MergeStrategy.discard + case x => old(x) + } +} + +net.virtualvoid.sbt.graph.Plugin.graphSettings diff --git a/modules/swagger-codegen/src/main/resources/scalatra/model.mustache b/modules/swagger-codegen/src/main/resources/scalatra/model.mustache new file mode 100644 index 00000000000..8c5d1954662 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/model.mustache @@ -0,0 +1,15 @@ +package {{package}} + +{{#imports}}import {{import}} +{{/imports}} + +{{#models}} + +{{#model}} +case class {{classname}} ( + {{#vars}}{{name}}: {{#isNotRequired}}Option[{{/isNotRequired}}{{datatype}}{{#isNotRequired}}] {{#description}} // {{description}}{{/description}} + {{/isNotRequired}}{{#hasMore}}, + {{/hasMore}}{{/vars}} +) +{{/model}} +{{/models}} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties b/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties new file mode 100644 index 00000000000..be6c454fbac --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.13.5 diff --git a/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt new file mode 100644 index 00000000000..7358abbbbc6 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/project/plugins.sbt @@ -0,0 +1,9 @@ +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.1") + +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "0.7.5") + +addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.9.0") + +addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") + +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") diff --git a/modules/swagger-codegen/src/main/resources/scalatra/sbt b/modules/swagger-codegen/src/main/resources/scalatra/sbt new file mode 100755 index 00000000000..08e58821219 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/scalatra/sbt @@ -0,0 +1,525 @@ +#!/usr/bin/env bash +# +# A more capable sbt runner, coincidentally also called sbt. +# Author: Paul Phillips + +# todo - make this dynamic +declare -r sbt_release_version="0.13.6" +declare -r sbt_unreleased_version="0.13.6" +declare -r buildProps="project/build.properties" + +declare sbt_jar sbt_dir sbt_create sbt_version +declare scala_version sbt_explicit_version +declare verbose noshare batch trace_level log_level +declare sbt_saved_stty debugUs + +echoerr () { echo >&2 "$@"; } +vlog () { [[ -n "$verbose" ]] && echoerr "$@"; } + +# spaces are possible, e.g. sbt.version = 0.13.0 +build_props_sbt () { + [[ -r "$buildProps" ]] && \ + grep '^sbt\.version' "$buildProps" | tr '=' ' ' | awk '{ print $2; }' +} + +update_build_props_sbt () { + local ver="$1" + local old="$(build_props_sbt)" + + [[ -r "$buildProps" ]] && [[ "$ver" != "$old" ]] && { + perl -pi -e "s/^sbt\.version\b.*\$/sbt.version=${ver}/" "$buildProps" + grep -q '^sbt.version[ =]' "$buildProps" || printf "\nsbt.version=%s\n" "$ver" >> "$buildProps" + + vlog "!!!" + vlog "!!! Updated file $buildProps setting sbt.version to: $ver" + vlog "!!! Previous value was: $old" + vlog "!!!" + } +} + +set_sbt_version () { + sbt_version="${sbt_explicit_version:-$(build_props_sbt)}" + [[ -n "$sbt_version" ]] || sbt_version=$sbt_release_version + export sbt_version +} + +# restore stty settings (echo in particular) +onSbtRunnerExit() { + [[ -n "$sbt_saved_stty" ]] || return + vlog "" + vlog "restoring stty: $sbt_saved_stty" + stty "$sbt_saved_stty" + unset sbt_saved_stty +} + +# save stty and trap exit, to ensure echo is reenabled if we are interrupted. +trap onSbtRunnerExit EXIT +sbt_saved_stty="$(stty -g 2>/dev/null)" +vlog "Saved stty: $sbt_saved_stty" + +# this seems to cover the bases on OSX, and someone will +# have to tell me about the others. +get_script_path () { + local path="$1" + [[ -L "$path" ]] || { echo "$path" ; return; } + + local target="$(readlink "$path")" + if [[ "${target:0:1}" == "/" ]]; then + echo "$target" + else + echo "${path%/*}/$target" + fi +} + +die() { + echo "Aborting: $@" + exit 1 +} + +make_url () { + version="$1" + + case "$version" in + 0.7.*) echo "http://simple-build-tool.googlecode.com/files/sbt-launch-0.7.7.jar" ;; + 0.10.* ) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; + 0.11.[12]) echo "$sbt_launch_repo/org.scala-tools.sbt/sbt-launch/$version/sbt-launch.jar" ;; + *) echo "$sbt_launch_repo/org.scala-sbt/sbt-launch/$version/sbt-launch.jar" ;; + esac +} + +init_default_option_file () { + local overriding_var="${!1}" + local default_file="$2" + if [[ ! -r "$default_file" && "$overriding_var" =~ ^@(.*)$ ]]; then + local envvar_file="${BASH_REMATCH[1]}" + if [[ -r "$envvar_file" ]]; then + default_file="$envvar_file" + fi + fi + echo "$default_file" +} + +declare -r cms_opts="-XX:+CMSClassUnloadingEnabled -XX:+UseConcMarkSweepGC" +declare -r jit_opts="-XX:ReservedCodeCacheSize=256m -XX:+TieredCompilation" +declare -r default_jvm_opts_common="-Xms512m -Xmx1536m -Xss2m $jit_opts $cms_opts" +declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" +declare -r latest_28="2.8.2" +declare -r latest_29="2.9.3" +declare -r latest_210="2.10.4" +declare -r latest_211="2.11.2" + +declare -r script_path="$(get_script_path "$BASH_SOURCE")" +declare -r script_name="${script_path##*/}" + +# some non-read-onlies set with defaults +declare java_cmd="java" +declare sbt_opts_file="$(init_default_option_file SBT_OPTS .sbtopts)" +declare jvm_opts_file="$(init_default_option_file JVM_OPTS .jvmopts)" +declare sbt_launch_repo="http://typesafe.artifactoryonline.com/typesafe/ivy-releases" + +# pull -J and -D options to give to java. +declare -a residual_args +declare -a java_args +declare -a scalac_args +declare -a sbt_commands + +# args to jvm/sbt via files or environment variables +declare -a extra_jvm_opts extra_sbt_opts + +# if set, use JAVA_HOME over java found in path +[[ -e "$JAVA_HOME/bin/java" ]] && java_cmd="$JAVA_HOME/bin/java" + +# directory to store sbt launchers +declare sbt_launch_dir="$HOME/.sbt/launchers" +[[ -d "$sbt_launch_dir" ]] || mkdir -p "$sbt_launch_dir" +[[ -w "$sbt_launch_dir" ]] || sbt_launch_dir="$(mktemp -d -t sbt_extras_launchers.XXXXXX)" + +java_version () { + local version=$("$java_cmd" -version 2>&1 | grep -e 'java version' | awk '{ print $3 }' | tr -d \") + vlog "Detected Java version: $version" + echo "${version:2:1}" +} + +# MaxPermSize critical on pre-8 jvms but incurs noisy warning on 8+ +default_jvm_opts () { + local v="$(java_version)" + if [[ $v -ge 8 ]]; then + echo "$default_jvm_opts_common" + else + echo "-XX:MaxPermSize=384m $default_jvm_opts_common" + fi +} + +build_props_scala () { + if [[ -r "$buildProps" ]]; then + versionLine="$(grep '^build.scala.versions' "$buildProps")" + versionString="${versionLine##build.scala.versions=}" + echo "${versionString%% .*}" + fi +} + +execRunner () { + # print the arguments one to a line, quoting any containing spaces + vlog "# Executing command line:" && { + for arg; do + if [[ -n "$arg" ]]; then + if printf "%s\n" "$arg" | grep -q ' '; then + printf >&2 "\"%s\"\n" "$arg" + else + printf >&2 "%s\n" "$arg" + fi + fi + done + vlog "" + } + + [[ -n "$batch" ]] && exec /dev/null; then + curl --fail --silent "$url" --output "$jar" + elif which wget >/dev/null; then + wget --quiet -O "$jar" "$url" + fi + } && [[ -r "$jar" ]] +} + +acquire_sbt_jar () { + sbt_url="$(jar_url "$sbt_version")" + sbt_jar="$(jar_file "$sbt_version")" + + [[ -r "$sbt_jar" ]] || download_url "$sbt_url" "$sbt_jar" +} + +usage () { + cat < display stack traces with a max of frames (default: -1, traces suppressed) + -debug-inc enable debugging log for the incremental compiler + -no-colors disable ANSI color codes + -sbt-create start sbt even if current directory contains no sbt project + -sbt-dir path to global settings/plugins directory (default: ~/.sbt/) + -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11+) + -ivy path to local Ivy repository (default: ~/.ivy2) + -no-share use all local caches; no sharing + -offline put sbt in offline mode + -jvm-debug Turn on JVM debugging, open at the given port. + -batch Disable interactive mode + -prompt Set the sbt prompt; in expr, 's' is the State and 'e' is Extracted + + # sbt version (default: sbt.version from $buildProps if present, otherwise $sbt_release_version) + -sbt-force-latest force the use of the latest release of sbt: $sbt_release_version + -sbt-version use the specified version of sbt (default: $sbt_release_version) + -sbt-dev use the latest pre-release version of sbt: $sbt_unreleased_version + -sbt-jar use the specified jar as the sbt launcher + -sbt-launch-dir directory to hold sbt launchers (default: ~/.sbt/launchers) + -sbt-launch-repo repo url for downloading sbt launcher jar (default: $sbt_launch_repo) + + # scala version (default: as chosen by sbt) + -28 use $latest_28 + -29 use $latest_29 + -210 use $latest_210 + -211 use $latest_211 + -scala-home use the scala build at the specified directory + -scala-version use the specified version of scala + -binary-version use the specified scala version when searching for dependencies + + # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) + -java-home alternate JAVA_HOME + + # passing options to the jvm - note it does NOT use JAVA_OPTS due to pollution + # The default set is used if JVM_OPTS is unset and no -jvm-opts file is found + $(default_jvm_opts) + JVM_OPTS environment variable holding either the jvm args directly, or + the reference to a file containing jvm args if given path is prepended by '@' (e.g. '@/etc/jvmopts') + Note: "@"-file is overridden by local '.jvmopts' or '-jvm-opts' argument. + -jvm-opts file containing jvm args (if not given, .jvmopts in project root is used if present) + -Dkey=val pass -Dkey=val directly to the jvm + -J-X pass option -X directly to the jvm (-J is stripped) + + # passing options to sbt, OR to this runner + SBT_OPTS environment variable holding either the sbt args directly, or + the reference to a file containing sbt args if given path is prepended by '@' (e.g. '@/etc/sbtopts') + Note: "@"-file is overridden by local '.sbtopts' or '-sbt-opts' argument. + -sbt-opts file containing sbt args (if not given, .sbtopts in project root is used if present) + -S-X add -X to sbt's scalacOptions (-S is stripped) +EOM +} + +addJava () { + vlog "[addJava] arg = '$1'" + java_args=( "${java_args[@]}" "$1" ) +} +addSbt () { + vlog "[addSbt] arg = '$1'" + sbt_commands=( "${sbt_commands[@]}" "$1" ) +} +setThisBuild () { + vlog "[addBuild] args = '$@'" + local key="$1" && shift + addSbt "set $key in ThisBuild := $@" +} + +addScalac () { + vlog "[addScalac] arg = '$1'" + scalac_args=( "${scalac_args[@]}" "$1" ) +} +addResidual () { + vlog "[residual] arg = '$1'" + residual_args=( "${residual_args[@]}" "$1" ) +} +addResolver () { + addSbt "set resolvers += $1" +} +addDebugger () { + addJava "-Xdebug" + addJava "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" +} +setScalaVersion () { + [[ "$1" == *"-SNAPSHOT" ]] && addResolver 'Resolver.sonatypeRepo("snapshots")' + addSbt "++ $1" +} + +process_args () +{ + require_arg () { + local type="$1" + local opt="$2" + local arg="$3" + + if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then + die "$opt requires <$type> argument" + fi + } + while [[ $# -gt 0 ]]; do + case "$1" in + -h|-help) usage; exit 1 ;; + -v) verbose=true && shift ;; + -d) addSbt "--debug" && shift ;; + -w) addSbt "--warn" && shift ;; + -q) addSbt "--error" && shift ;; + -x) debugUs=true && shift ;; + -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; + -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; + -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; + -no-share) noshare=true && shift ;; + -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; + -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; + -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; + -offline) addSbt "set offline := true" && shift ;; + -jvm-debug) require_arg port "$1" "$2" && addDebugger "$2" && shift 2 ;; + -batch) batch=true && shift ;; + -prompt) require_arg "expr" "$1" "$2" && setThisBuild shellPrompt "(s => { val e = Project.extract(s) ; $2 })" && shift 2 ;; + + -sbt-create) sbt_create=true && shift ;; + -sbt-jar) require_arg path "$1" "$2" && sbt_jar="$2" && shift 2 ;; + -sbt-version) require_arg version "$1" "$2" && sbt_explicit_version="$2" && shift 2 ;; + -sbt-force-latest) sbt_explicit_version="$sbt_release_version" && shift ;; + -sbt-dev) sbt_explicit_version="$sbt_unreleased_version" && shift ;; + -sbt-launch-dir) require_arg path "$1" "$2" && sbt_launch_dir="$2" && shift 2 ;; + -sbt-launch-repo) require_arg path "$1" "$2" && sbt_launch_repo="$2" && shift 2 ;; + -scala-version) require_arg version "$1" "$2" && setScalaVersion "$2" && shift 2 ;; + -binary-version) require_arg version "$1" "$2" && setThisBuild scalaBinaryVersion "\"$2\"" && shift 2 ;; + -scala-home) require_arg path "$1" "$2" && setThisBuild scalaHome "Some(file(\"$2\"))" && shift 2 ;; + -java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; + -sbt-opts) require_arg path "$1" "$2" && sbt_opts_file="$2" && shift 2 ;; + -jvm-opts) require_arg path "$1" "$2" && jvm_opts_file="$2" && shift 2 ;; + + -D*) addJava "$1" && shift ;; + -J*) addJava "${1:2}" && shift ;; + -S*) addScalac "${1:2}" && shift ;; + -28) setScalaVersion "$latest_28" && shift ;; + -29) setScalaVersion "$latest_29" && shift ;; + -210) setScalaVersion "$latest_210" && shift ;; + -211) setScalaVersion "$latest_211" && shift ;; + + *) addResidual "$1" && shift ;; + esac + done +} + +# process the direct command line arguments +process_args "$@" + +# skip #-styled comments and blank lines +readConfigFile() { + while read line; do + [[ $line =~ ^# ]] || [[ -z $line ]] || echo "$line" + done < "$1" +} + +# if there are file/environment sbt_opts, process again so we +# can supply args to this runner +if [[ -r "$sbt_opts_file" ]]; then + vlog "Using sbt options defined in file $sbt_opts_file" + while read opt; do extra_sbt_opts+=("$opt"); done < <(readConfigFile "$sbt_opts_file") +elif [[ -n "$SBT_OPTS" && ! ("$SBT_OPTS" =~ ^@.*) ]]; then + vlog "Using sbt options defined in variable \$SBT_OPTS" + extra_sbt_opts=( $SBT_OPTS ) +else + vlog "No extra sbt options have been defined" +fi + +[[ -n "${extra_sbt_opts[*]}" ]] && process_args "${extra_sbt_opts[@]}" + +# reset "$@" to the residual args +set -- "${residual_args[@]}" +argumentCount=$# + +# set sbt version +set_sbt_version + +# only exists in 0.12+ +setTraceLevel() { + case "$sbt_version" in + "0.7."* | "0.10."* | "0.11."* ) echoerr "Cannot set trace level in sbt version $sbt_version" ;; + *) setThisBuild traceLevel $trace_level ;; + esac +} + +# set scalacOptions if we were given any -S opts +[[ ${#scalac_args[@]} -eq 0 ]] || addSbt "set scalacOptions in ThisBuild += \"${scalac_args[@]}\"" + +# Update build.properties on disk to set explicit version - sbt gives us no choice +[[ -n "$sbt_explicit_version" ]] && update_build_props_sbt "$sbt_explicit_version" +vlog "Detected sbt version $sbt_version" + +[[ -n "$scala_version" ]] && vlog "Overriding scala version to $scala_version" + +# no args - alert them there's stuff in here +(( argumentCount > 0 )) || { + vlog "Starting $script_name: invoke with -help for other options" + residual_args=( shell ) +} + +# verify this is an sbt dir or -create was given +[[ -r ./build.sbt || -d ./project || -n "$sbt_create" ]] || { + cat < + + + org.scalatra.servlet.ScalatraListener + + + + default + /*.html + /css/* + /js/*.js + /images/* + + diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css new file mode 100644 index 00000000000..a3352d774ce --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap-responsive.css @@ -0,0 +1,1092 @@ +/*! + * Bootstrap Responsive v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +@-ms-viewport { + width: device-width; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .dropdown-menu a:hover { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:hover { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css new file mode 100644 index 00000000000..db3b3bfd6a0 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/bootstrap.css @@ -0,0 +1,6057 @@ +/*! + * Bootstrap v2.2.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover { + color: #356635; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 25px; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + margin-bottom: 5px; + font-size: 0; + white-space: nowrap; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table, table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +table th, +.table td, +table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th, +table th { + font-weight: bold; +} + +.table thead th, +table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td, +table caption + thead tr:first-child th, +table caption + thead tr:first-child td, +table colgroup + thead tr:first-child th, +table colgroup + thead tr:first-child td, +table thead:first-child tr:first-child th, +table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody, +table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table, +table table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th, +table tbody > tr:nth-child(odd) > td, +table tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover td, +.table-hover tbody tr:hover th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success td, +table tbody tr.success td { + background-color: #dff0d8; +} + +.table tbody tr.error td, +table tbody tr.error td { + background-color: #f2dede; +} + +.table tbody tr.warning td, +table tbody tr.warning td { + background-color: #fcf8e3; +} + +.table tbody tr.info td, +table tbody tr.info td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu li > a:focus, +.dropdown-submenu:hover > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu .disabled > a, +.dropdown-menu .disabled > a:hover { + color: #999999; +} + +.dropdown-menu .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #bbbbbb; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #a2a2a2; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #c5c5c5; + border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-mini .caret, +.btn-small .caret, +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -3px; +} + +.tooltip.right { + margin-left: 3px; +} + +.tooltip.bottom { + margin-top: 3px; +} + +.tooltip.left { + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + width: 236px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media .pull-left { + margin-right: 10px; +} + +.media .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css new file mode 100644 index 00000000000..2c4cd52d35f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/site.css @@ -0,0 +1 @@ +site.css \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css new file mode 100644 index 00000000000..b26d2ef13ca --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/swagger-static/assets/css/style.css @@ -0,0 +1,292 @@ +.line-numbers { + margin-right: 1.0em; +} + +.content { + padding-bottom: 100px; +} + +.column_header_name { + width: 150px; +} + +.column_header_path { + width: 350px; +} + +.column_header_name .column_header_param_type .column_header_data_type .column_header_return_type { + width: 200px; +} + +.expandable { + display: none; +} + +.main_content { + margin-top: 80px; + margin-left: 25px; + margin-right: 25px; +} + +.model { + float: left; +} + +.model-container { + float: left; + width: 500px; + padding: 0px; +} + +.model-detail-container { + clear: left; + float: left; + width: 500px; + margin-left: 40px; +} + +.model-detail-popup { + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; + border-style: solid; + border-width: 1px; + border-color: black; + padding-left: 10px; + padding-right: 10px; + padding-top: 10px; + padding-bottom: 10px; + background-color: white; + opacity: 0.99; + z-index: 1; + overflow: scroll; + width: 400px; +} + +.model-detail-popup .code { + background-color: #E4F5FF; + font-family: monospace; + white-space: pre; + margin: 10px; + overflow: auto; +} + +.model-detail-popup h2 { + margin-top: 0px; + padding-top: 0px; +} + +.model-detail-popup li { + padding-bottom: 5px; +} + +.model-detail-popup .param-reqiured-true { + font-family: monospace; + font-weight: bold; + clear: left; + display: block; + float: left; + width: 100%; +} + +.model-detail-popup .param-required-false { + font-family: monospace; + clear: left; + display: block; + float: left; + width: 100%; +} + +.model-detail-popup .param-description { + margin-left: 50px; + float: left; +} + +.section-header { + border-bottom: 2px; + font-weight: bold; + font-size: 15px; + padding: 6px 0; + color: rgb(57,57,57); +} + +.content { + padding-top: 100px; +} + +.content h1 { + font-size: 43px; + text-align: center; + margin-top: 40px; + margin-bottom: 40px; +} + +.sidebar { + box-sizing: border-box; + float: left; + display: block; + width: 240px; + overflow: scroll; + position: fixed; +} + +.section-box { + border-bottom-style: solid; + border-bottom: 10px; +} + +.section-box ul li { + list-style: none; + margin-left: 0px; +} + +.non-sidebar { + box-sizing: border-box; + display: block; + margin-left: 240px; + margin-right: 0px; + width: 638px; +} + +.non-sidebar h2 { + clear: left; + padding-top: 20px; +} + +.param { + display: block; + float: left; + width: 220px; + clear: left; +} + +.param-description { + float: left; + font-family: 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif; +} + +.param-optional-flag { + font-style: italic; +} + +.section { + font-weight: normal; + clear: left; +} + +.section a { + text-decoration: underline; +} + +.code { + background-color: #E4F5FF; + font-family: monospace; + white-space: pre; + margin: 10px; + overflow: auto; + width: 600px; +} + +.header { + position: fixed; + text-align: left; + background-color: black; + float: left; + top: 0; + width: 100%; + height: 70px auto; + padding-bottom: 20px; + box-shadow: rgba(0, 0, 0, 0.2) 0 2px 8px 5px; +} + +.top-bar h1 a { + width: auto; +} + +.top-bar h1#logo a { + width: auto; + display: block; + clear: none; + float: left; + background-position: left;; + color: white; + text-decoration: none; +} + +.top-bar ul li { + list-style: none; +} + +.top-bar h1#logo span { + display: block; + clear: none; + float: left; + padding-top: 10px; + padding-left: 10px; + margin: 0px; +} + +.top-bar h1#logo a span.light { + color: #ffc97a; + color: #666666; + padding-left: 0px; +} + +.top-bar ul#nav { + float: none; + clear: both; + overflow: hidden; + margin: 0; + padding: 0; + display: block; + float: right; + clear: none; +} + +.top-bar ul#nav li { + float: left; + clear: none; + margin: 0; + padding: 2px 10px; + border-right: 1px solid #dddddd; +} + +.top-bar ul#nav li:first-child, .top-bar ul#nav li.first { + padding-left: 0; +} + +.top-bar ul#nav li:last-child, .top-bar ul#nav li.last { + padding-right: 0; + border-right: none; +} + +.top-bar ul#nav li { + border: none; + padding: 0 5px; +} + +.top-bar ul#nav li a { + display: block; + padding: 8px 10px 8px 10px; + color: #999999; + text-decoration: none; +} + +.top-bar ul#nav li a.strong { + color: white; +} + +.top-bar ul#nav li a:active, .top-bar ul#nav li a.active, .top-bar ul#nav li a:hover { + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + -o-border-radius: 4px; + -ms-border-radius: 4px; + -khtml-border-radius: 4px; + border-radius: 4px; + background-image: -webkit-gradient(linear, 0% 100%, 0% 0%, color-stop(0%, #ff5401), color-stop(100%, #ffa014)); + background-image: -moz-linear-gradient(bottom, #ff5401 0%, #ffa014 100%); + background-image: linear-gradient(bottom, #ff5401 0%, #ffa014 100%); + color: white; +} + +.top-bar ul#nav:hover li { + border-color: #222222; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png b/modules/swagger-codegen/src/main/resources/swagger-static/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..209e5a473fc0fcb6dcda9eb4cb660f72008929fd GIT binary patch literal 14577 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 (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle() + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + }) + + if ($next.hasClass('active')) return + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + +}(window.jQuery);/* ============================================================= + * bootstrap-collapse.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery);/* ============================================================ + * bootstrap-dropdown.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, 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. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) return $this.click() + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) + .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery);/* ========================================================= + * bootstrap-modal.js v2.2.2 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, 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. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element + .show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function (that) { + this.$element + .hide() + .trigger('hidden') + + this.backdrop() + } + + , removeBackdrop: function () { + this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(' + + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs new file mode 100644 index 00000000000..370eca562a7 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/api-docs @@ -0,0 +1,60 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "apis": [ + { + "path": "/pet", + "description": "Operations about pets" + }, + { + "path": "/user", + "description": "Operations about user" + }, + { + "path": "/store", + "description": "Operations about store" + } + ], + "authorizations": { + "oauth2": { + "type": "oauth2", + "scopes": [ + { + "scope": "email", + "description": "Access to your email address" + }, + { + "scope": "pets", + "description": "Access to your pets" + } + ], + "grantTypes": { + "implicit": { + "loginEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/dialog" + }, + "tokenName": "access_token" + }, + "authorization_code": { + "tokenRequestEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/requestToken", + "clientIdName": "client_id", + "clientSecretName": "client_secret" + }, + "tokenEndpoint": { + "url": "http://petstore.swagger.wordnik.com/oauth/token", + "tokenName": "access_code" + } + } + } + } + }, + "info": { + "title": "Swagger Sample App", + "description": "This is a sample server Petstore server. You can find out more about Swagger \n at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample,\n you can use the api key \"special-key\" to test the authorization filters", + "termsOfServiceUrl": "http://helloreverb.com/terms/", + "contact": "apiteam@wordnik.com", + "license": "Apache 2.0", + "licenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.html" + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet new file mode 100644 index 00000000000..4a8439a4424 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/pet @@ -0,0 +1,425 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/pet", + "produces": [ + "application/json", + "application/xml", + "text/plain", + "text/html" + ], + "apis": [ + { + "path": "/pet/{petId}", + "operations": [ + { + "method": "GET", + "summary": "Find pet by ID", + "notes": "Returns a pet based on ID", + "type": "Pet", + "nickname": "getPetById", + "authorizations": {}, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "format": "int64", + "paramType": "path", + "minimum": "1.0", + "maximum": "100000.0" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Pet not found" + } + ] + }, + { + "method": "PATCH", + "summary": "partial updates to a pet", + "notes": "", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "partialUpdate", + "produces": [ + "application/json", + "application/xml" + ], + "consumes": [ + "application/json", + "application/xml" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid tag value" + } + ] + }, + { + "method": "POST", + "summary": "Updates a pet in the store with form data", + "notes": "", + "type": "void", + "nickname": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "name", + "description": "Updated name of the pet", + "required": false, + "type": "string", + "paramType": "form" + }, + { + "name": "status", + "description": "Updated status of the pet", + "required": false, + "type": "string", + "paramType": "form" + } + ], + "responseMessages": [ + { + "code": 405, + "message": "Invalid input" + } + ] + }, + { + "method": "DELETE", + "summary": "Deletes a pet", + "notes": "", + "type": "void", + "nickname": "deletePet", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "petId", + "description": "Pet id to delete", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid pet value" + } + ] + } + ] + }, + { + "path": "/pet", + "operations": [ + { + "method": "PUT", + "summary": "Update an existing pet", + "notes": "", + "type": "void", + "nickname": "updatePet", + "authorizations": {}, + "parameters": [ + { + "name": "body", + "description": "Pet object that needs to be updated in the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Pet not found" + }, + { + "code": 405, + "message": "Validation exception" + } + ] + }, + { + "method": "POST", + "summary": "Add a new pet to the store", + "notes": "", + "type": "void", + "nickname": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "type": "Pet", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 405, + "message": "Invalid input" + } + ] + } + ] + }, + { + "path": "/pet/findByStatus", + "operations": [ + { + "method": "GET", + "summary": "Finds Pets by status", + "notes": "Multiple status values can be provided with comma seperated strings", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "findPetsByStatus", + "authorizations": {}, + "parameters": [ + { + "name": "status", + "description": "Status values that need to be considered for filter", + "defaultValue": "available", + "required": true, + "type": "string", + "paramType": "query", + "enum": [ + "available", + "pending", + "sold" + ] + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid status value" + } + ] + } + ] + }, + { + "path": "/pet/findByTags", + "operations": [ + { + "method": "GET", + "summary": "Finds Pets by tags", + "notes": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", + "type": "array", + "items": { + "$ref": "Pet" + }, + "nickname": "findPetsByTags", + "authorizations": {}, + "parameters": [ + { + "name": "tags", + "description": "Tags to filter by", + "required": true, + "type": "string", + "paramType": "query" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid tag value" + } + ], + "deprecated": "true" + } + ] + }, + { + "path": "/pet/uploadImage", + "operations": [ + { + "method": "POST", + "summary": "uploads an image", + "notes": "", + "type": "void", + "nickname": "uploadFile", + "consumes": [ + "multipart/form-data" + ], + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + }, + { + "scope": "test:nothing", + "description": "nothing" + } + ] + }, + "parameters": [ + { + "name": "additionalMetadata", + "description": "Additional data to pass to server", + "required": false, + "type": "string", + "paramType": "form" + }, + { + "name": "file", + "description": "file to upload", + "required": false, + "type": "File", + "paramType": "body" + } + ] + } + ] + } + ], + "models": { + "Tag": { + "id": "Tag", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + }, + "Pet": { + "id": "Pet", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "description": "unique identifier for the pet", + "minimum": "0.0", + "maximum": "100.0" + }, + "category": { + "$ref": "Category" + }, + "name": { + "type": "string" + }, + "photoUrls": { + "type": "array", + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "items": { + "$ref": "Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + } + }, + "Category": { + "id": "Category", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store new file mode 100644 index 00000000000..e59994447cd --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/store @@ -0,0 +1,145 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/store", + "produces": [ + "application/json" + ], + "apis": [ + { + "path": "/store/order/{orderId}", + "operations": [ + { + "method": "GET", + "summary": "Find purchase order by ID", + "notes": "For valid response try integer IDs with value <= 5. Anything above 5 or nonintegers will generate API errors", + "type": "Order", + "nickname": "getOrderById", + "authorizations": {}, + "parameters": [ + { + "name": "orderId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Order not found" + } + ] + }, + { + "method": "DELETE", + "summary": "Delete purchase order by ID", + "notes": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "type": "void", + "nickname": "deleteOrder", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "orderId", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid ID supplied" + }, + { + "code": 404, + "message": "Order not found" + } + ] + } + ] + }, + { + "path": "/store/order", + "operations": [ + { + "method": "POST", + "summary": "Place an order for a pet", + "notes": "", + "type": "void", + "nickname": "placeOrder", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "type": "Order", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid order" + } + ] + } + ] + } + ], + "models": { + "Order": { + "id": "Order", + "description": "an order in the system", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + " approved", + " delivered" + ] + }, + "shipDate": { + "type": "string", + "format": "date-time" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user new file mode 100644 index 00000000000..c9eb3f6ff78 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/1_2/petstore-1.2/user @@ -0,0 +1,299 @@ +{ + "apiVersion": "1.0.0", + "swaggerVersion": "1.2", + "basePath": "http://petstore.swagger.wordnik.com/api", + "resourcePath": "/user", + "produces": [ + "application/json" + ], + "apis": [ + { + "path": "/user", + "operations": [ + { + "method": "POST", + "summary": "Create user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "createUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "Created user object", + "required": true, + "type": "User", + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/logout", + "operations": [ + { + "method": "GET", + "summary": "Logs out current logged in user session", + "notes": "", + "type": "void", + "nickname": "logoutUser", + "authorizations": {}, + "parameters": [] + } + ] + }, + { + "path": "/user/createWithArray", + "operations": [ + { + "method": "POST", + "summary": "Creates list of users with given input array", + "notes": "", + "type": "void", + "nickname": "createUsersWithArrayInput", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "List of user object", + "required": true, + "type": "array", + "items": { + "$ref": "User" + }, + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/createWithList", + "operations": [ + { + "method": "POST", + "summary": "Creates list of users with given list input", + "notes": "", + "type": "void", + "nickname": "createUsersWithListInput", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "body", + "description": "List of user object", + "required": true, + "type": "array", + "items": { + "$ref": "User" + }, + "paramType": "body" + } + ] + } + ] + }, + { + "path": "/user/{username}", + "operations": [ + { + "method": "PUT", + "summary": "Updated user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "updateUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "username", + "description": "name that need to be deleted", + "required": true, + "type": "string", + "paramType": "path" + }, + { + "name": "body", + "description": "Updated user object", + "required": true, + "type": "User", + "paramType": "body" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + }, + { + "method": "DELETE", + "summary": "Delete user", + "notes": "This can only be done by the logged in user.", + "type": "void", + "nickname": "deleteUser", + "authorizations": { + "oauth2": [ + { + "scope": "test:anything", + "description": "anything" + } + ] + }, + "parameters": [ + { + "name": "username", + "description": "The name that needs to be deleted", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + }, + { + "method": "GET", + "summary": "Get user by user name", + "notes": "", + "type": "User", + "nickname": "getUserByName", + "authorizations": {}, + "parameters": [ + { + "name": "username", + "description": "The name that needs to be fetched. Use user1 for testing.", + "required": true, + "type": "string", + "paramType": "path" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username supplied" + }, + { + "code": 404, + "message": "User not found" + } + ] + } + ] + }, + { + "path": "/user/login", + "operations": [ + { + "method": "GET", + "summary": "Logs user into the system", + "notes": "", + "type": "string", + "nickname": "loginUser", + "authorizations": {}, + "parameters": [ + { + "name": "username", + "description": "The user name for login", + "required": true, + "type": "string", + "paramType": "query" + }, + { + "name": "password", + "description": "The password for login in clear text", + "required": true, + "type": "string", + "paramType": "query" + } + ], + "responseMessages": [ + { + "code": 400, + "message": "Invalid username and password combination" + } + ] + } + ] + } + ], + "models": { + "User": { + "id": "User", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "firstName": { + "type": "string" + }, + "username": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status", + "enum": [ + "1-registered", + "2-active", + "3-closed" + ] + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/2_0/petstore.json b/modules/swagger-codegen/src/test/resources/2_0/petstore.json new file mode 100644 index 00000000000..daa8ef91b15 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/petstore.json @@ -0,0 +1,951 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "apiteam@wordnik.com" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/v2", + "schemes": [ + "http" + ], + "paths": { + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Pet object that needs to be added to the store", + "required": false, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": false, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Validation exception" + }, + "404": { + "description": "Pet not found" + }, + "400": { + "description": "Invalid ID supplied" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma seperated strings", + "operationId": "findPetsByStatus", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "status", + "description": "Status values that need to be considered for filter", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "tags", + "description": "Tags to filter by", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/upload": { + "post": { + "tags": [ "pet" ], + "summary": "Upload an image for a pet", + "operationId": "uploadImage", + "consumes": [ + "multipart/form-data" + ], + "parameters": [ + { + "in": "formData", + "name": "petImage", + "description": "image to upload", + "type": "file" + } + ], + "responses": { + "default": { + "description": "it worked" + } + } + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", + "operationId": "getPetById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "petId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "404": { + "description": "Pet not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "400": { + "description": "Invalid ID supplied" + } + }, + "security": [ + { + "api_key": [] + }, + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "petId", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "string" + }, + { + "in": "formData", + "name": "name", + "description": "Updated name of the pet", + "required": true, + "type": "string" + }, + { + "in": "formData", + "name": "status", + "description": "Updated status of the pet", + "required": true, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "header", + "name": "api_key", + "description": "", + "required": true, + "type": "string" + }, + { + "in": "path", + "name": "petId", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid pet value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": false, + "schema": { + "$ref": "#/definitions/Order" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "orderId", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "Order not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid ID supplied" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", + "operationId": "deleteOrder", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "orderId", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "Order not found" + }, + "400": { + "description": "Invalid ID supplied" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": false, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithArray": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "query", + "name": "username", + "description": "The user name for login", + "required": false, + "type": "string" + }, + { + "in": "query", + "name": "password", + "description": "The password for login in clear text", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": [ + "application/json", + "application/xml" + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "name that need to be deleted", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": false, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "400": { + "description": "Invalid user supplied" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "path", + "name": "username", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "404": { + "description": "User not found" + }, + "400": { + "description": "Invalid username supplied" + } + } + } + } + }, + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + }, + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "http://petstore.swagger.wordnik.com/api/oauth/dialog", + "flow": "implicit" + } + }, + "definitions": { + "User": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "username": { + "type": "string", + "xml": { + "name": "username" + } + }, + "firstName": { + "type": "string", + "xml": { + "name": "firstName" + } + }, + "lastName": { + "type": "string", + "xml": { + "name": "lastName" + } + }, + "email": { + "type": "string", + "xml": { + "name": "email" + } + }, + "password": { + "type": "string", + "xml": { + "name": "password" + } + }, + "phone": { + "type": "string", + "xml": { + "name": "phone" + } + }, + "userStatus": { + "type": "integer", + "format": "int32", + "xml": { + "name": "userStatus" + }, + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Category": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "name": { + "type": "string", + "xml": { + "name": "name" + } + } + }, + "xml": { + "name": "Category" + } + }, + "Pet": { + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "category": { + "xml": { + "name": "category" + }, + "$ref": "Category" + }, + "name": { + "type": "string", + "example": "doggie", + "xml": { + "name": "name" + } + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "Tag" + } + }, + "status": { + "type": "string", + "xml": { + "name": "status" + }, + "description": "pet status in the store" + } + }, + "xml": { + "name": "Pet" + } + }, + "Tag": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "name": { + "type": "string", + "xml": { + "name": "name" + } + } + }, + "xml": { + "name": "Tag" + } + }, + "Order": { + "properties": { + "id": { + "type": "integer", + "format": "int64", + "xml": { + "name": "id" + } + }, + "petId": { + "type": "integer", + "format": "int64", + "xml": { + "name": "petId" + } + }, + "quantity": { + "type": "integer", + "format": "int32", + "xml": { + "name": "quantity" + } + }, + "shipDate": { + "type": "string", + "format": "date-time", + "xml": { + "name": "shipDate" + } + }, + "status": { + "type": "string", + "xml": { + "name": "status" + }, + "description": "Order Status" + }, + "complete": { + "type": "boolean" + } + }, + "xml": { + "name": "Order" + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json b/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json new file mode 100644 index 00000000000..ed13a5820eb --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/postBodyTest.json @@ -0,0 +1,102 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at http://swagger.wordnik.com or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://helloreverb.com/terms/", + "contact": { + "name": "apiteam@wordnik.com" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.wordnik.com", + "basePath": "/v2", + "schemes": [ + "http" + ], + "paths": { + "/animals": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new animal to the store", + "description": "", + "consumes": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Animals", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Animal" + } + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + } + } + }, + "/insects": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new insect to the store", + "description": "", + "consumes": [ + "application/json", + "application/xml" + ], + "parameters": [ + { + "in": "body", + "name": "pet", + "description": "Insects", + "required": false, + "schema": { + "$ref": "#/definitions/Insect" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + } + } + } + }, + "definitions": { + "Animal": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + }, + "Insect": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + } + } + } + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/CodegenTest.scala b/modules/swagger-codegen/src/test/scala/CodegenTest.scala new file mode 100644 index 00000000000..ecd586a6a89 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/CodegenTest.scala @@ -0,0 +1,98 @@ +import com.wordnik.swagger.models._ +import com.wordnik.swagger.util.Json +import io.swagger.parser._ + +import com.wordnik.swagger.codegen.DefaultCodegen + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class CodegenTest extends FlatSpec with Matchers { + behavior of "Codegen" + + it should "read a file upload param from a 2.0 spec" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/petstore.json") + + val codegen = new DefaultCodegen() + val path = "/pet/{petId}/upload" + val p = model.getPaths().get(path).getPost() + val op = codegen.fromOperation(path, "post", p) + + op.operationId should be ("uploadImage") + op.httpMethod should be ("POST") + op.hasConsumes should equal (true) + op.consumes.size should be(1) + op.consumes.get(0).get("mediaType") should be ("multipart/form-data") + + op.hasProduces should be (null) + + val allParams = op.allParams + allParams.size should be (1) + + val formParams = op.formParams + formParams.size should be (1) + + val file = formParams.get(0) + file.isFormParam should equal (true) + file.dataType should be ("file") + file.required should equal (false) + file.isFile should equal (true) + file.hasMore should be (null) + } + + it should "read formParam values from a 2.0 spec" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/petstore.json") + + val codegen = new DefaultCodegen() + val path = "/pet/{petId}" + val p = model.getPaths().get(path).getPost() + val op = codegen.fromOperation(path, "post", p) + + op.operationId should be ("updatePetWithForm") + op.httpMethod should be ("POST") + op.hasConsumes should equal (true) + op.consumes.size should be(1) + op.consumes.get(0).get("mediaType") should be ("application/x-www-form-urlencoded") + + op.hasProduces should equal (true) + op.produces.size should be(2) + op.produces.get(0).get("mediaType") should be ("application/json") + op.produces.get(0).get("hasMore") should be ("true") + op.produces.get(1).get("mediaType") should be ("application/xml") + + val pathParams = op.pathParams + pathParams.size should be (1) + + val idParam = pathParams.get(0) + idParam.isPathParam should equal (true) + idParam.dataType should be ("String") + idParam.required should equal (true) + idParam.hasMore should be (null) + + val allParams = op.allParams + allParams.size should be (3) + + val formParams = op.formParams + formParams.size should be (2) + val nameParam = formParams.get(0) + nameParam.isFormParam should equal (true) + nameParam.notFile should equal (true) + nameParam.dataType should be ("String") + nameParam.required should equal (true) + nameParam.hasMore should equal (true) + + val statusParam = formParams.get(1) + statusParam.isFormParam should equal (true) + statusParam.notFile should equal (true) + statusParam.dataType should be ("String") + statusParam.required should equal (true) + statusParam.hasMore should be (null) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala new file mode 100644 index 00000000000..25232b69907 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Java/JavaModelEnumTest.scala @@ -0,0 +1,33 @@ +package Java + +import com.wordnik.swagger.codegen.languages.JavaClientCodegen +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ +import org.junit.runner.RunWith +import org.scalatest.{FlatSpec, Matchers} +import org.scalatest.junit.JUnitRunner + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class JavaModelEnumTest extends FlatSpec with Matchers { + + it should "convert a java model with an enum" in { + val enumProperty = new StringProperty() + enumProperty.setEnum(List("VALUE1", "VALUE2", "VALUE3").asJava) + val model = new ModelImpl() + .property("name", enumProperty) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.vars.size should be(1) + val enumVar = cm.vars.get(0) + enumVar.baseName should be("name") + enumVar.datatype should be("NameEnum") + enumVar.name should be("name") + enumVar.defaultValue should be("null") + enumVar.baseType should be("String") + enumVar.isEnum should equal(true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala b/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala new file mode 100644 index 00000000000..513786e4609 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Java/JavaModelTest.scala @@ -0,0 +1,268 @@ +package Java + +import com.wordnik.swagger.codegen.languages.JavaClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class JavaModelTest extends FlatSpec with Matchers { + + it should "convert a simple java model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).getter should be ("getId") + vars.get(0).setter should be ("setId") + vars.get(0).datatype should be ("Long") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Long") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).getter should be ("getName") + vars.get(1).setter should be ("setName") + vars.get(1).datatype should be ("String") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("String") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).getter should be ("getCreatedAt") + vars.get(2).setter should be ("setCreatedAt") + vars.get(2).datatype should be ("Date") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("Date") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(1).baseName should be ("urls") + vars.get(1).getter should be ("getUrls") + vars.get(1).setter should be ("setUrls") + vars.get(1).datatype should be ("List") + vars.get(1).name should be ("urls") + vars.get(1).defaultValue should be ("new ArrayList() ") + vars.get(1).baseType should be ("List") + vars.get(1).containerType should be ("array") + vars.get(1).required should equal (false) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).getter should be ("getTranslations") + vars.get(0).setter should be ("setTranslations") + vars.get(0).datatype should be ("Map") + vars.get(0).name should be ("translations") + vars.get(0).defaultValue should be ("new HashMap() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex properties" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("List") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new ArrayList() ") + vars.get(0).baseType should be ("List") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Map", "List", "Children")).size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Map") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new HashMap() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("ArrayList") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("List", "ArrayList", "Children")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("HashMap") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("Map", "HashMap", "Children")).size should be (3) + } + + it should "convert a model with upper-case property names" in { + val model = new ModelImpl() + .description("a model with upper-case property names") + .property("NAME", new StringProperty()) + .required("NAME") + + val codegen = new JavaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("NAME") + vars.get(0).getter should be ("getNAME") + vars.get(0).setter should be ("setNAME") + vars.get(0).datatype should be ("String") + vars.get(0).name should be ("NAME") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("String") + vars.get(0).hasMore should equal (null) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + } +} diff --git a/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala new file mode 100644 index 00000000000..2c8db5a1223 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/Objc/ObjcModelTest.scala @@ -0,0 +1,260 @@ +package objc + +import com.wordnik.swagger.codegen.languages.ObjcClientCodegen +import com.wordnik.swagger.util.{ Json, SwaggerLoader } +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class ObjcModelTest extends FlatSpec with Matchers { + + it should "convert a simple java model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("NSNumber*") + vars.get(0).name should be ("_id") + vars.get(0).defaultValue should be (null) + vars.get(0).baseType should be ("NSNumber") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).datatype should be ("NSString*") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be (null) + vars.get(1).baseType should be ("NSString") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).complexType should be ("SWGDate") + vars.get(2).datatype should be ("SWGDate*") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be (null) + vars.get(2).baseType should be ("SWGDate") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + + (cm.imports.asScala.toSet & + Set("SWGDate")).size should be (1) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("NSNumber*") + vars.get(0).name should be ("_id") + vars.get(0).defaultValue should be (null) + vars.get(0).baseType should be ("NSNumber") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("urls") + vars.get(1).datatype should be ("NSArray*") + vars.get(1).name should be ("urls") + // vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("NSArray") + vars.get(1).hasMore should be (null) + vars.get(1).containerType should equal ("array") + vars.get(1).required should equal (false) + vars.get(1).isPrimitiveType should equal (true) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).datatype should be ("NSDictionary*") + vars.get(0).name should be ("translations") + vars.get(0).baseType should be ("NSDictionary") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isPrimitiveType should equal (true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).datatype should be ("SWGChildren*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("SWGChildren") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("SWGChildren") + vars.get(0).datatype should be ("NSArray*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("NSArray") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("SWGChildren")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("SWGChildren") + vars.get(0).datatype should be ("NSDictionary*") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("NSDictionary") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("NSMutableArray") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("SWGChildren", "NSArray", "NSMutableArray")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new ObjcClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("SWGSample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("NSMutableDictionary") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("SWGChildren", "NSDictionary", "NSMutableDictionary")).size should be (3) + } + + it should "create proper imports per #316" in { + val model = new SwaggerLoader().read("src/test/resources/2_0/postBodyTest.json") + val codegen = new ObjcClientCodegen() + + val animalPaths = model.getPaths() + val animalOps = animalPaths.get("/animals") + animalOps.getPost() should not be (null) + val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) + animalCo.imports.size should be (1) + animalCo.imports.contains("SWGAnimal") should equal (true) + + val insectPaths = model.getPaths() + val insectOps = insectPaths.get("/insects") + insectOps.getPost() should not be (null) + val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) + insectCo.imports.size should be (1) + insectCo.imports.contains("SWGInsect") should equal (true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala b/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala new file mode 100644 index 00000000000..8051e84e660 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/SwaggerMigratorTest.scala @@ -0,0 +1,19 @@ +import com.wordnik.swagger.models._ +import io.swagger.parser._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class SwaggerMigratorTest extends FlatSpec with Matchers { + behavior of "SwaggerMigrator" + + it should "read a 1.2 spec" in { + val loader = new SwaggerParser() + loader.read("src/test/resources/1_2/petstore-1.2/api-docs") + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala b/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala new file mode 100644 index 00000000000..5e5034e5efc --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/php/PhpModelTest.scala @@ -0,0 +1,259 @@ +package php + +import com.wordnik.swagger.codegen.languages.PhpClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import io.swagger.parser.SwaggerParser + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class PhpModelTest extends FlatSpec with Matchers { + + it should "convert a simple php model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("int") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("int") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).datatype should be ("string") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("string") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).complexType should be (null) + vars.get(2).datatype should be ("DateTime") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("DateTime") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + + cm.imports.size() should be (0) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).datatype should be ("int") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("int") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isPrimitiveType should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("urls") + vars.get(1).datatype should be ("array[string]") + vars.get(1).name should be ("urls") + vars.get(1).baseType should be ("array") + vars.get(1).hasMore should be (null) + vars.get(1).containerType should equal ("array") + vars.get(1).required should equal (false) + vars.get(1).isPrimitiveType should equal (true) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).datatype should be ("map[string,string]") + vars.get(0).name should be ("translations") + vars.get(0).baseType should be ("map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isPrimitiveType should equal (true) + } + + it should "convert a model with complex property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).datatype should be ("array[Children]") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("array") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).datatype should be ("map[string,Children]") + vars.get(0).name should be ("children") + vars.get(0).baseType should be ("map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.imports.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new PhpClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.imports.size should be (2) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + } + + it should "create proper imports per #316" in { + val model = new SwaggerParser() + .read("src/test/resources/2_0/postBodyTest.json") + val codegen = new PhpClientCodegen() + + val animalPaths = model.getPaths() + val animalOps = animalPaths.get("/animals") + animalOps.getPost() should not be (null) + val animalCo = codegen.fromOperation("/animals", "POST", animalOps.getPost()) + animalCo.imports.size should be (1) + animalCo.imports.contains("Animal") should equal (true) + + val insectPaths = model.getPaths() + val insectOps = insectPaths.get("/insects") + insectOps.getPost() should not be (null) + val insectCo = codegen.fromOperation("/insects", "POST", insectOps.getPost()) + insectCo.imports.size should be (1) + insectCo.imports.contains("Insect") should equal (true) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala b/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala new file mode 100644 index 00000000000..0c71983b1d5 --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/scala/ScalaModelTest.scala @@ -0,0 +1,241 @@ +package Java + +import com.wordnik.swagger.codegen.languages.ScalaClientCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class ScalaModelTest extends FlatSpec with Matchers { + + it should "convert a simple scala model" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("name", new StringProperty()) + .property("createdAt", new DateTimeProperty()) + .required("id") + .required("name") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (3) + + val vars = cm.vars + vars.get(0).baseName should be ("id") + vars.get(0).getter should be ("getId") + vars.get(0).setter should be ("setId") + vars.get(0).datatype should be ("Long") + vars.get(0).name should be ("id") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Long") + vars.get(0).hasMore should equal (true) + vars.get(0).required should equal (true) + vars.get(0).isNotContainer should equal (true) + + vars.get(1).baseName should be ("name") + vars.get(1).getter should be ("getName") + vars.get(1).setter should be ("setName") + vars.get(1).datatype should be ("String") + vars.get(1).name should be ("name") + vars.get(1).defaultValue should be ("null") + vars.get(1).baseType should be ("String") + vars.get(1).hasMore should equal (true) + vars.get(1).required should equal (true) + vars.get(1).isNotContainer should equal (true) + + vars.get(2).baseName should be ("createdAt") + vars.get(2).getter should be ("getCreatedAt") + vars.get(2).setter should be ("setCreatedAt") + vars.get(2).datatype should be ("DateTime") + vars.get(2).name should be ("createdAt") + vars.get(2).defaultValue should be ("null") + vars.get(2).baseType should be ("DateTime") + vars.get(2).hasMore should equal (null) + vars.get(2).required should equal (false) + vars.get(2).isNotContainer should equal (true) + } + + it should "convert a model with list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("id", new LongProperty()) + .property("urls", new ArrayProperty() + .items(new StringProperty())) + .required("id") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (2) + + val vars = cm.vars + vars.get(1).baseName should be ("urls") + vars.get(1).getter should be ("getUrls") + vars.get(1).setter should be ("setUrls") + vars.get(1).datatype should be ("List[String]") + vars.get(1).name should be ("urls") + vars.get(1).defaultValue should be ("new ListBuffer[String]() ") + vars.get(1).baseType should be ("List") + vars.get(1).containerType should be ("array") + vars.get(1).required should equal (false) + vars.get(1).isContainer should equal (true) + } + + it should "convert a model with a map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("translations", new MapProperty() + .additionalProperties(new StringProperty())) + .required("id") + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("translations") + vars.get(0).getter should be ("getTranslations") + vars.get(0).setter should be ("setTranslations") + vars.get(0).datatype should be ("Map[String, String]") + vars.get(0).name should be ("translations") + vars.get(0).defaultValue should be ("new HashMap[String, String]() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex properties" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new RefProperty("#/definitions/Children")) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Children") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("null") + vars.get(0).baseType should be ("Children") + vars.get(0).required should equal (false) + vars.get(0).isNotContainer should equal (true) + } + + it should "convert a model with complex list property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new ArrayProperty() + .items(new RefProperty("#/definitions/Children"))) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("List[Children]") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new ListBuffer[Children]() ") + vars.get(0).baseType should be ("List") + vars.get(0).containerType should be ("array") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + } + + it should "convert a model with complex map property" in { + val model = new ModelImpl() + .description("a sample model") + .property("children", new MapProperty() + .additionalProperties(new RefProperty("#/definitions/Children"))) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("a sample model") + cm.vars.size should be (1) + (cm.imports.asScala.toSet & Set("Children")).size should be (1) + + val vars = cm.vars + vars.get(0).baseName should be ("children") + vars.get(0).complexType should be ("Children") + vars.get(0).getter should be ("getChildren") + vars.get(0).setter should be ("setChildren") + vars.get(0).datatype should be ("Map[String, Children]") + vars.get(0).name should be ("children") + vars.get(0).defaultValue should be ("new HashMap[String, Children]() ") + vars.get(0).baseType should be ("Map") + vars.get(0).containerType should be ("map") + vars.get(0).required should equal (false) + vars.get(0).isContainer should equal (true) + vars.get(0).isNotContainer should be (null) + } + + it should "convert an array model" in { + val model = new ArrayModel() + .description("an array model") + .items(new RefProperty("#/definitions/Children")) + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an array model") + cm.vars.size should be (0) + cm.parent should be ("ListBuffer[Children]") + cm.imports.size should be (3) + (cm.imports.asScala.toSet & Set("List", "ListBuffer", "Children")).size should be (3) + } + + it should "convert an map model" in { + val model = new ModelImpl() + .description("an map model") + .additionalProperties(new RefProperty("#/definitions/Children")) + + val codegen = new ScalaClientCodegen() + val cm = codegen.fromModel("sample", model) + + cm.name should be ("sample") + cm.classname should be ("Sample") + cm.description should be ("an map model") + cm.vars.size should be (0) + cm.parent should be ("HashMap[String, Children]") + cm.imports.size should be (2) + (cm.imports.asScala.toSet & Set("HashMap", "Children")).size should be (2) + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala b/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala new file mode 100644 index 00000000000..f46201faa5b --- /dev/null +++ b/modules/swagger-codegen/src/test/scala/staticDocs/StaticOperationTest.scala @@ -0,0 +1,65 @@ +package staticDocs + +import com.wordnik.swagger.codegen.languages.StaticDocCodegen +import com.wordnik.swagger.util.Json +import com.wordnik.swagger.models._ +import com.wordnik.swagger.models.properties._ + +import org.junit.runner.RunWith +import org.scalatest.junit.JUnitRunner +import org.scalatest.FlatSpec +import org.scalatest.Matchers + +import scala.collection.JavaConverters._ + +@RunWith(classOf[JUnitRunner]) +class StaticOperationTest extends FlatSpec with Matchers { + it should "convert a string parameter" in { + val property = new StringProperty() + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.datatype should be ("String") + cp.name should be ("property") + cp.baseType should be ("string") + cp.isNotContainer should equal (true) + } + + it should "convert a complex parameter" in { + val property = new RefProperty("Children") + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.complexType should be ("Children") + cp.getter should be ("getProperty") + cp.setter should be ("setProperty") + cp.datatype should be ("Children") + cp.name should be ("property") + cp.defaultValue should be ("null") + cp.baseType should be ("Children") + cp.isNotContainer should equal (true) + } + + it should "convert a complex list parameter" in { + val property = new ArrayProperty(). + items(new RefProperty("Children")) + + val codegen = new StaticDocCodegen() + val cp = codegen.fromProperty("property", property) + + cp.baseName should be ("property") + cp.complexType should be ("Children") + cp.getter should be ("getProperty") + cp.setter should be ("setProperty") + cp.datatype should be ("List") + cp.name should be ("property") + cp.baseType should be ("array") + cp.containerType should be ("array") + cp.isContainer should equal (true) + + } +} \ No newline at end of file From 11df3530f3031cd6a3602d176231abf0bd616a1e Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 10:22:19 -0800 Subject: [PATCH 3/6] added wordnik sample --- .../src/test/resources/2_0/wordnik.json | 2356 +++++++++++++++++ 1 file changed, 2356 insertions(+) create mode 100644 modules/swagger-codegen/src/test/resources/2_0/wordnik.json diff --git a/modules/swagger-codegen/src/test/resources/2_0/wordnik.json b/modules/swagger-codegen/src/test/resources/2_0/wordnik.json new file mode 100644 index 00000000000..7d38550ef4a --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/wordnik.json @@ -0,0 +1,2356 @@ +{ + "swagger": "2.0", + "info": { + "title": "The Wordnik Public API", + "version": "4.0" + }, + "host": "api.wordnik.com", + "basePath": "/v4", + "schemes": [ + "http" + ], + "security": [ + { + "apiKey": [] + } + ], + "paths": { + "/account.json/apiTokenStatus": { + "get": { + "tags": [ + "account" + ], + "summary": "Returns usage statistics for the API account.", + "operationId": "getApiTokenStatus", + "parameters": [ + { + "name": "api_key", + "in": "header", + "description": "Wordnik authentication token", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "No token supplied." + }, + "404": { + "description": "No API account with supplied token." + } + } + } + }, + "/account.json/authenticate/{username}": { + "get": { + "tags": [ + "account" + ], + "summary": "Authenticates a User", + "operationId": "authenticate", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "A confirmed Wordnik username", + "required": true, + "type": "string" + }, + { + "name": "password", + "in": "query", + "description": "The user's password", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "403": { + "description": "Account not available." + }, + "404": { + "description": "User not found." + } + } + }, + "post": { + "tags": [ + "account" + ], + "summary": "Authenticates a user", + "operationId": "authenticatePost", + "parameters": [ + { + "name": "username", + "in": "path", + "description": "A confirmed Wordnik username", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "schema": { + "type": "string" + }, + "description": "The user's password", + "required": true + } + ], + "responses": { + "200": { + "description": "success" + }, + "403": { + "description": "Account not available." + }, + "404": { + "description": "User not found." + } + } + } + }, + "/account.json/user": { + "get": { + "tags": [ + "account" + ], + "summary": "Returns the logged-in User", + "description": "Requires a valid auth_token to be set.", + "operationId": "getLoggedInUser", + "parameters": [ + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "403": { + "description": "Not logged in." + }, + "404": { + "description": "User not found." + } + } + } + }, + "/account.json/wordLists": { + "get": { + "tags": [ + "account" + ], + "summary": "Fetches WordList objects for the logged-in user.", + "operationId": "getWordListsForLoggedInUser", + "parameters": [ + { + "name": "auth_token", + "in": "header", + "description": "auth_token of logged-in user", + "required": true, + "type": "string" + }, + { + "name": "skip", + "in": "query", + "description": "Results to skip", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "403": { + "description": "Not authenticated." + }, + "404": { + "description": "User account not found." + } + } + } + }, + "/word.json/{word}": { + "get": { + "tags": [ + "word" + ], + "summary": "Given a word as a string, returns the WordObject that represents it", + "operationId": "getWord", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "String value of WordObject to return", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "includeSuggestions", + "in": "query", + "description": "Return suggestions (for correct spelling, case variants, etc.)", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/audio": { + "get": { + "tags": [ + "word" + ], + "summary": "Fetches audio metadata for a word.", + "description": "The metadata includes a time-expiring fileUrl which allows reading the audio file directly from the API. Currently only audio pronunciations from the American Heritage Dictionary in mp3 format are supported.", + "operationId": "getAudio", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to get audio for.", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "Use the canonical form of the word", + "required": false, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/definitions": { + "get": { + "tags": [ + "word" + ], + "summary": "Return definitions for a word", + "operationId": "getDefinitions", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to return definitions for", + "required": true, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "partOfSpeech", + "in": "query", + "description": "CSV list of part-of-speech types", + "required": false, + "type": "string" + }, + { + "name": "includeRelated", + "in": "query", + "description": "Return related words with definitions", + "required": false, + "type": "string" + }, + { + "name": "sourceDictionaries", + "in": "query", + "description": "Source dictionary to return definitions from. If 'all' is received, results are returned from all sources. If multiple values are received (e.g. 'century,wiktionary'), results are returned from the first specified dictionary that has definitions. If left blank, results are returned from the first dictionary that has definitions. By default, dictionaries are searched in this order: ahd, wiktionary, webster, century, wordnet", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "csv" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "includeTags", + "in": "query", + "description": "Return a closed set of XML tags in response", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + }, + "404": { + "description": "No definitions found." + } + } + } + }, + "/word.json/{word}/etymologies": { + "get": { + "tags": [ + "word" + ], + "summary": "Fetches etymology data", + "operationId": "getEtymologies", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to return", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + }, + "404": { + "description": "No definitions found." + } + } + } + }, + "/word.json/{word}/examples": { + "get": { + "tags": [ + "word" + ], + "summary": "Returns examples for a word", + "operationId": "getExamples", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to return examples for", + "required": true, + "type": "string" + }, + { + "name": "includeDuplicates", + "in": "query", + "description": "Show duplicate examples from different sources", + "required": false, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "skip", + "in": "query", + "description": "Results to skip", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/frequency": { + "get": { + "tags": [ + "word" + ], + "summary": "Returns word usage over time", + "operationId": "getWordFrequency", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to return", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "startYear", + "in": "query", + "description": "Starting Year", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "endYear", + "in": "query", + "description": "Ending Year", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + }, + "404": { + "description": "No results." + } + } + } + }, + "/word.json/{word}/hyphenation": { + "get": { + "tags": [ + "word" + ], + "summary": "Returns syllable information for a word", + "operationId": "getHyphenation", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to get syllables for", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "sourceDictionary", + "in": "query", + "description": "Get from a single dictionary. Valid options: ahd, century, wiktionary, webster, and wordnet.", + "required": false, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/phrases": { + "get": { + "tags": [ + "word" + ], + "summary": "Fetches bi-gram phrases for a word", + "operationId": "getPhrases", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to fetch phrases for", + "required": true, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "wlmi", + "in": "query", + "description": "Minimum WLMI for the phrase", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/pronunciations": { + "get": { + "tags": [ + "word" + ], + "summary": "Returns text pronunciations for a given word", + "operationId": "getTextPronunciations", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to get pronunciations for", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "sourceDictionary", + "in": "query", + "description": "Get from a single dictionary", + "required": false, + "type": "string" + }, + { + "name": "typeFormat", + "in": "query", + "description": "Text pronunciation type", + "required": false, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/relatedWords": { + "get": { + "tags": [ + "word" + ], + "summary": "Given a word as a string, returns relationships from the Word Graph", + "operationId": "getRelatedWords", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to fetch relationships for", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + }, + { + "name": "relationshipTypes", + "in": "query", + "description": "Limits the total results per type of relationship type", + "required": false, + "type": "string" + }, + { + "name": "limitPerRelationshipType", + "in": "query", + "description": "Restrict to the supplied relationship types", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/word.json/{word}/topExample": { + "get": { + "tags": [ + "word" + ], + "summary": "Returns a top example for a word", + "operationId": "getTopExample", + "parameters": [ + { + "name": "word", + "in": "path", + "description": "Word to fetch examples for", + "required": true, + "type": "string" + }, + { + "name": "useCanonical", + "in": "query", + "description": "If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.", + "required": false, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid word supplied." + } + } + } + }, + "/wordList.json/{permalink}": { + "get": { + "tags": [ + "wordList" + ], + "summary": "Fetches a WordList by ID", + "operationId": "getWordListByPermalink", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "permalink of WordList to fetch", + "required": true, + "type": "string" + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid ID supplied" + }, + "403": { + "description": "Not Authorized to access WordList" + }, + "404": { + "description": "WordList not found" + } + } + }, + "put": { + "tags": [ + "wordList" + ], + "summary": "Updates an existing WordList", + "operationId": "updateWordList", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "permalink of WordList to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated WordList", + "required": false, + "schema": { + "$ref": "#/definitions/WordList" + } + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid ID supplied" + }, + "403": { + "description": "Not Authorized to update WordList" + }, + "404": { + "description": "WordList not found" + } + } + }, + "delete": { + "tags": [ + "wordList" + ], + "summary": "Deletes an existing WordList", + "operationId": "deleteWordList", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "ID of WordList to delete", + "required": true, + "type": "string" + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid ID supplied" + }, + "403": { + "description": "Not Authorized to delete WordList" + }, + "404": { + "description": "WordList not found" + } + } + } + }, + "/wordList.json/{permalink}/deleteWords": { + "post": { + "tags": [ + "wordList" + ], + "summary": "Removes words from a WordList", + "operationId": "deleteWordsFromWordList", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "permalink of WordList to use", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Words to remove from WordList", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/StringValue" + } + } + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid permalink supplied" + }, + "403": { + "description": "Not Authorized to modify WordList" + }, + "404": { + "description": "WordList not found" + } + } + } + }, + "/wordList.json/{permalink}/words": { + "get": { + "tags": [ + "wordList" + ], + "summary": "Fetches words in a WordList", + "operationId": "getWordListWords", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "ID of WordList to use", + "required": true, + "type": "string" + }, + { + "name": "sortBy", + "in": "query", + "description": "Field to sort by", + "required": false, + "type": "string" + }, + { + "name": "sortOrder", + "in": "query", + "description": "Direction to sort", + "required": false, + "type": "string" + }, + { + "name": "skip", + "in": "query", + "description": "Results to skip", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid ID supplied" + }, + "403": { + "description": "Not Authorized to access WordList" + }, + "404": { + "description": "WordList not found" + } + } + }, + "post": { + "tags": [ + "wordList" + ], + "summary": "Adds words to a WordList", + "operationId": "addWordsToWordList", + "parameters": [ + { + "name": "permalink", + "in": "path", + "description": "permalink of WordList to user", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Array of words to add to WordList", + "required": false, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/StringValue" + } + } + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid permalink supplied" + }, + "403": { + "description": "Not Authorized to access WordList" + }, + "404": { + "description": "WordList not found" + } + } + } + }, + "/wordLists.json": { + "post": { + "tags": [ + "wordLists" + ], + "summary": "Creates a WordList.", + "operationId": "createWordList", + "parameters": [ + { + "in": "body", + "name": "body", + "description": "WordList to create", + "required": false, + "schema": { + "$ref": "#/definitions/WordList" + } + }, + { + "name": "auth_token", + "in": "header", + "description": "The auth token of the logged-in user, obtained by calling /account.json/authenticate/{username} (described above)", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid WordList supplied or mandatory fields are missing" + }, + "403": { + "description": "Not authenticated" + }, + "404": { + "description": "WordList owner not found" + } + } + } + }, + "/words.json/randomWord": { + "get": { + "tags": [ + "words" + ], + "summary": "Returns a single random WordObject", + "operationId": "getRandomWord", + "parameters": [ + { + "name": "hasDictionaryDef", + "in": "query", + "description": "Only return words with dictionary definitions", + "required": false, + "type": "string" + }, + { + "name": "includePartOfSpeech", + "in": "query", + "description": "CSV part-of-speech values to include", + "required": false, + "type": "string" + }, + { + "name": "excludePartOfSpeech", + "in": "query", + "description": "CSV part-of-speech values to exclude", + "required": false, + "type": "string" + }, + { + "name": "minCorpusCount", + "in": "query", + "description": "Minimum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxCorpusCount", + "in": "query", + "description": "Maximum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minDictionaryCount", + "in": "query", + "description": "Minimum dictionary count", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxDictionaryCount", + "in": "query", + "description": "Maximum dictionary count", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minLength", + "in": "query", + "description": "Minimum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxLength", + "in": "query", + "description": "Maximum word length", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "404": { + "description": "No word found." + } + } + } + }, + "/words.json/randomWords": { + "get": { + "tags": [ + "words" + ], + "summary": "Returns an array of random WordObjects", + "operationId": "getRandomWords", + "parameters": [ + { + "name": "hasDictionaryDef", + "in": "query", + "description": "Only return words with dictionary definitions", + "required": false, + "type": "string" + }, + { + "name": "includePartOfSpeech", + "in": "query", + "description": "CSV part-of-speech values to include", + "required": false, + "type": "string" + }, + { + "name": "excludePartOfSpeech", + "in": "query", + "description": "CSV part-of-speech values to exclude", + "required": false, + "type": "string" + }, + { + "name": "minCorpusCount", + "in": "query", + "description": "Minimum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxCorpusCount", + "in": "query", + "description": "Maximum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minDictionaryCount", + "in": "query", + "description": "Minimum dictionary count", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxDictionaryCount", + "in": "query", + "description": "Maximum dictionary count", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minLength", + "in": "query", + "description": "Minimum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxLength", + "in": "query", + "description": "Maximum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "sortBy", + "in": "query", + "description": "Attribute to sort by", + "required": false, + "type": "string" + }, + { + "name": "sortOrder", + "in": "query", + "description": "Sort direction", + "required": false, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid term supplied." + }, + "404": { + "description": "No results." + } + } + } + }, + "/words.json/reverseDictionary": { + "get": { + "tags": [ + "words" + ], + "summary": "Reverse dictionary search", + "operationId": "reverseDictionary", + "parameters": [ + { + "name": "query", + "in": "query", + "description": "Search term", + "required": true, + "type": "string" + }, + { + "name": "findSenseForWord", + "in": "query", + "description": "Restricts words and finds closest sense", + "required": false, + "type": "string" + }, + { + "name": "includeSourceDictionaries", + "in": "query", + "description": "Only include these comma-delimited source dictionaries", + "required": false, + "type": "string" + }, + { + "name": "excludeSourceDictionaries", + "in": "query", + "description": "Exclude these comma-delimited source dictionaries", + "required": false, + "type": "string" + }, + { + "name": "includePartOfSpeech", + "in": "query", + "description": "Only include these comma-delimited parts of speech", + "required": false, + "type": "string" + }, + { + "name": "excludePartOfSpeech", + "in": "query", + "description": "Exclude these comma-delimited parts of speech", + "required": false, + "type": "string" + }, + { + "name": "minCorpusCount", + "in": "query", + "description": "Minimum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxCorpusCount", + "in": "query", + "description": "Maximum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minLength", + "in": "query", + "description": "Minimum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxLength", + "in": "query", + "description": "Maximum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "expandTerms", + "in": "query", + "description": "Expand terms", + "required": false, + "type": "string" + }, + { + "name": "includeTags", + "in": "query", + "description": "Return a closed set of XML tags in response", + "required": false, + "type": "string" + }, + { + "name": "sortBy", + "in": "query", + "description": "Attribute to sort by", + "required": false, + "type": "string" + }, + { + "name": "sortOrder", + "in": "query", + "description": "Sort direction", + "required": false, + "type": "string" + }, + { + "name": "skip", + "in": "query", + "description": "Results to skip", + "required": false, + "type": "string" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid term supplied." + } + } + } + }, + "/words.json/search/{query}": { + "get": { + "tags": [ + "words" + ], + "summary": "Searches words", + "operationId": "searchWords", + "parameters": [ + { + "name": "query", + "in": "path", + "description": "Search query", + "required": true, + "type": "string" + }, + { + "name": "caseSensitive", + "in": "query", + "description": "Search case sensitive", + "required": false, + "type": "string" + }, + { + "name": "includePartOfSpeech", + "in": "query", + "description": "Only include these comma-delimited parts of speech", + "required": false, + "type": "string" + }, + { + "name": "excludePartOfSpeech", + "in": "query", + "description": "Exclude these comma-delimited parts of speech", + "required": false, + "type": "string" + }, + { + "name": "minCorpusCount", + "in": "query", + "description": "Minimum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxCorpusCount", + "in": "query", + "description": "Maximum corpus frequency for terms", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minDictionaryCount", + "in": "query", + "description": "Minimum number of dictionary entries for words returned", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxDictionaryCount", + "in": "query", + "description": "Maximum dictionary definition count", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "minLength", + "in": "query", + "description": "Minimum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "maxLength", + "in": "query", + "description": "Maximum word length", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "skip", + "in": "query", + "description": "Results to skip", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "in": "query", + "description": "Maximum number of results to return", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "responses": { + "200": { + "description": "success" + }, + "400": { + "description": "Invalid query supplied." + } + } + } + }, + "/words.json/wordOfTheDay": { + "get": { + "tags": [ + "words" + ], + "summary": "Returns a specific WordOfTheDay", + "operationId": "getWordOfTheDay", + "parameters": [ + { + "name": "date", + "in": "query", + "description": "Fetches by date in yyyy-MM-dd", + "required": false, + "type": "string" + } + ], + "responses": { + "default": { + "description": "success" + } + } + } + } + }, + "definitions": { + "User": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "status": { + "type": "integer", + "format": "int32" + }, + "faceBookId": { + "type": "string" + }, + "userName": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "Syllable": { + "properties": { + "text": { + "type": "string" + }, + "seq": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + } + } + }, + "AudioType": { + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + } + }, + "WordOfTheDay": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "parentId": { + "type": "string" + }, + "category": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "contentProvider": { + "$ref": "#/definitions/ContentProvider" + }, + "htmlExtra": { + "type": "string" + }, + "word": { + "type": "string" + }, + "definitions": { + "type": "array", + "items": { + "$ref": "#/definitions/SimpleDefinition" + } + }, + "examples": { + "type": "array", + "items": { + "$ref": "#/definitions/SimpleExample" + } + }, + "note": { + "type": "string" + }, + "publishDate": { + "type": "string", + "format": "date-time" + } + } + }, + "Facet": { + "properties": { + "facetValues": { + "type": "array", + "items": { + "$ref": "#/definitions/FacetValue" + } + }, + "name": { + "type": "string" + } + } + }, + "WordObject": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "word": { + "type": "string" + }, + "originalWord": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "type": "string" + } + }, + "canonicalForm": { + "type": "string" + }, + "vulgar": { + "type": "string" + } + } + }, + "WordSearchResults": { + "properties": { + "searchResults": { + "type": "array", + "items": { + "$ref": "#/definitions/WordSearchResult" + } + }, + "totalResults": { + "type": "integer", + "format": "int32" + } + } + }, + "AuthenticationToken": { + "properties": { + "token": { + "type": "string" + }, + "userId": { + "type": "integer", + "format": "int64" + }, + "userSignature": { + "type": "string" + } + } + }, + "ExampleSearchResults": { + "properties": { + "facets": { + "type": "array", + "items": { + "$ref": "#/definitions/Facet" + } + }, + "examples": { + "type": "array", + "items": { + "$ref": "#/definitions/Example" + } + } + } + }, + "Example": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "exampleId": { + "type": "integer", + "format": "int64" + }, + "title": { + "type": "string" + }, + "text": { + "type": "string" + }, + "score": { + "$ref": "#/definitions/ScoredWord" + }, + "sentence": { + "$ref": "#/definitions/Sentence" + }, + "word": { + "type": "string" + }, + "provider": { + "$ref": "#/definitions/ContentProvider" + }, + "year": { + "type": "integer", + "format": "int32" + }, + "rating": { + "type": "number", + "format": "float" + }, + "documentId": { + "type": "integer", + "format": "int64" + }, + "url": { + "type": "string" + } + } + }, + "SimpleDefinition": { + "properties": { + "text": { + "type": "string" + }, + "source": { + "type": "string" + }, + "note": { + "type": "string" + }, + "partOfSpeech": { + "type": "string" + } + } + }, + "ExampleUsage": { + "properties": { + "text": { + "type": "string" + } + } + }, + "AudioFile": { + "properties": { + "attributionUrl": { + "type": "string" + }, + "commentCount": { + "type": "integer", + "format": "int32" + }, + "voteCount": { + "type": "integer", + "format": "int32" + }, + "fileUrl": { + "type": "string" + }, + "audioType": { + "type": "string" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "duration": { + "type": "number", + "format": "double" + }, + "attributionText": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "description": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "voteWeightedAverage": { + "type": "number", + "format": "float" + }, + "voteAverage": { + "type": "number", + "format": "float" + }, + "word": { + "type": "string" + } + } + }, + "WordListWord": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "word": { + "type": "string" + }, + "username": { + "type": "string" + }, + "userId": { + "type": "integer", + "format": "int64" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "numberCommentsOnWord": { + "type": "integer", + "format": "int64" + }, + "numberLists": { + "type": "integer", + "format": "int64" + } + } + }, + "Bigram": { + "properties": { + "count": { + "type": "integer", + "format": "int64" + }, + "gram2": { + "type": "string" + }, + "gram1": { + "type": "string" + }, + "wlmi": { + "type": "number", + "format": "double" + }, + "mi": { + "type": "number", + "format": "double" + } + } + }, + "Frequency": { + "properties": { + "count": { + "type": "integer", + "format": "int64" + }, + "year": { + "type": "integer", + "format": "int32" + } + } + }, + "TextPron": { + "properties": { + "raw": { + "type": "string" + }, + "seq": { + "type": "integer", + "format": "int32" + }, + "rawType": { + "type": "string" + } + } + }, + "ApiTokenStatus": { + "properties": { + "valid": { + "type": "boolean" + }, + "token": { + "type": "string" + }, + "resetsInMillis": { + "type": "integer", + "format": "int64" + }, + "remainingCalls": { + "type": "integer", + "format": "int64" + }, + "expiresInMillis": { + "type": "integer", + "format": "int64" + }, + "totalRequests": { + "type": "integer", + "format": "int64" + } + } + }, + "WordList": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "permalink": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "string", + "format": "date-time" + }, + "updatedAt": { + "type": "string", + "format": "date-time" + }, + "lastActivityAt": { + "type": "string", + "format": "date-time" + }, + "username": { + "type": "string" + }, + "userId": { + "type": "integer", + "format": "int64" + }, + "description": { + "type": "string" + }, + "numberWordsInList": { + "type": "integer", + "format": "int64" + }, + "type": { + "type": "string" + } + } + }, + "WordSearchResult": { + "properties": { + "count": { + "type": "integer", + "format": "int64" + }, + "lexicality": { + "type": "number", + "format": "double" + }, + "word": { + "type": "string" + } + } + }, + "DefinitionSearchResults": { + "properties": { + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/Definition" + } + }, + "totalResults": { + "type": "integer", + "format": "int32" + } + } + }, + "Note": { + "properties": { + "noteType": { + "type": "string" + }, + "appliesTo": { + "type": "array", + "items": { + "type": "string" + } + }, + "value": { + "type": "string" + }, + "pos": { + "type": "integer", + "format": "int32" + } + } + }, + "StringValue": { + "properties": { + "word": { + "type": "string" + } + } + }, + "Related": { + "properties": { + "label1": { + "type": "string" + }, + "relationshipType": { + "type": "string" + }, + "label2": { + "type": "string" + }, + "label3": { + "type": "string" + }, + "words": { + "type": "array", + "items": { + "type": "string" + } + }, + "gram": { + "type": "string" + }, + "label4": { + "type": "string" + } + } + }, + "FacetValue": { + "properties": { + "count": { + "type": "integer", + "format": "int64" + }, + "value": { + "type": "string" + } + } + }, + "ScoredWord": { + "properties": { + "position": { + "type": "integer", + "format": "int32" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "docTermCount": { + "type": "integer", + "format": "int32" + }, + "lemma": { + "type": "string" + }, + "wordType": { + "type": "string" + }, + "score": { + "type": "number", + "format": "float" + }, + "sentenceId": { + "type": "integer", + "format": "int64" + }, + "word": { + "type": "string" + }, + "stopword": { + "type": "boolean" + }, + "baseWordScore": { + "type": "number", + "format": "double" + }, + "partOfSpeech": { + "type": "string" + } + } + }, + "Citation": { + "properties": { + "cite": { + "type": "string" + }, + "source": { + "type": "string" + } + } + }, + "Category": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + } + }, + "Root": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "categories": { + "type": "array", + "items": { + "$ref": "#/definitions/Category" + } + } + } + }, + "Sentence": { + "properties": { + "hasScoredWords": { + "type": "boolean" + }, + "id": { + "type": "integer", + "format": "int64" + }, + "scoredWords": { + "type": "array", + "items": { + "$ref": "#/definitions/ScoredWord" + } + }, + "display": { + "type": "string" + }, + "rating": { + "type": "integer", + "format": "int32" + }, + "documentMetadataId": { + "type": "integer", + "format": "int64" + } + } + }, + "ContentProvider": { + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + } + } + }, + "Label": { + "properties": { + "text": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, + "SimpleExample": { + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "title": { + "type": "string" + }, + "text": { + "type": "string" + }, + "url": { + "type": "string" + } + } + }, + "PartOfSpeech": { + "properties": { + "roots": { + "type": "array", + "items": { + "$ref": "#/definitions/Root" + } + }, + "storageAbbr": { + "type": "array", + "items": { + "type": "string" + } + }, + "allCategories": { + "type": "array", + "items": { + "$ref": "#/definitions/Category" + } + } + } + }, + "Definition": { + "properties": { + "extendedText": { + "type": "string" + }, + "text": { + "type": "string" + }, + "sourceDictionary": { + "type": "string" + }, + "citations": { + "type": "array", + "items": { + "$ref": "#/definitions/Citation" + } + }, + "labels": { + "type": "array", + "items": { + "$ref": "#/definitions/Label" + } + }, + "score": { + "type": "number", + "format": "float" + }, + "exampleUses": { + "type": "array", + "items": { + "$ref": "#/definitions/ExampleUsage" + } + }, + "attributionUrl": { + "type": "string" + }, + "seqString": { + "type": "string" + }, + "attributionText": { + "type": "string" + }, + "relatedWords": { + "type": "array", + "items": { + "$ref": "#/definitions/Related" + } + }, + "sequence": { + "type": "string" + }, + "word": { + "type": "string" + }, + "notes": { + "type": "array", + "items": { + "$ref": "#/definitions/Note" + } + }, + "textProns": { + "type": "array", + "items": { + "$ref": "#/definitions/TextPron" + } + }, + "partOfSpeech": { + "type": "string" + } + } + }, + "FrequencySummary": { + "properties": { + "unknownYearCount": { + "type": "integer", + "format": "int32" + }, + "totalCount": { + "type": "integer", + "format": "int64" + }, + "frequencyString": { + "type": "string" + }, + "word": { + "type": "string" + }, + "frequency": { + "type": "array", + "items": { + "$ref": "#/definitions/Frequency" + } + } + } + } + }, + "securityDefinitions": { + "apiKey": { + "type": "apiKey", + "in": "header", + "name": "api_key" + } + } +} \ No newline at end of file From d97c7c7668acab2abc6101e033405a69775d6cf0 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 10:22:28 -0800 Subject: [PATCH 4/6] updated bin scripts --- bin/all-petstore.sh | 21 +++++++-------------- bin/android-java-petstore.sh | 15 ++++++++++++--- bin/android-java-wordnik-api.sh | 20 ++++++++++++-------- bin/dynamic-html.sh | 15 ++++++++++++--- bin/html.sh | 15 ++++++++++++--- bin/java-petstore-filemap.sh | 16 +++++++++++++--- bin/java-petstore.sh | 16 +++++++++++++--- bin/java-wordnik-api.sh | 16 +++++++++++++--- bin/objc-petstore.sh | 16 +++++++++++++--- bin/objc-wordnik-api.sh | 16 +++++++++++++--- bin/tizen-petstore.sh | 16 +++++++++++++--- 11 files changed, 133 insertions(+), 49 deletions(-) diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index 716db5bae15..7564d9cfdb6 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -18,20 +18,13 @@ if [ ! -d "${APP_DIR}" ]; then fi cd $APP_DIR -./bin/java-wordnik-api.sh -./bin/php-wordnik-api.sh -./bin/python3-wordnik-api.sh -./bin/objc-wordnik-api.sh -./bin/python-wordnik-api.sh -./bin/scala-wordnik-api.sh - ./bin/android-java-petstore.sh -./bin/csharp-petstore.sh -./bin/flash-petstore.sh +./bin/android-java-wordnik-api.sh +./bin/dynamic-html.sh +./bin/html.sh +./bin/java-petstore-filemap.sh ./bin/java-petstore.sh +./bin/java-wordnik-api.sh ./bin/objc-petstore.sh -./bin/php-petstore.sh -./bin/python-petstore.sh -./bin/python3-petstore.sh -./bin/ruby-petstore.sh -./bin/scala-petstore.sh +./bin/objc-wordnik-api.sh +./bin/tizen-petstore.sh diff --git a/bin/android-java-petstore.sh b/bin/android-java-petstore.sh index 312953e7d81..5747ff49531 100755 --- a/bin/android-java-petstore.sh +++ b/bin/android-java-petstore.sh @@ -17,11 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i src/test/resources/petstore.json -l android -o samples/client/petstore/android-java" +ags="$@ -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l android -o samples/client/petstore/android-java" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/android-java-wordnik-api.sh b/bin/android-java-wordnik-api.sh index aba96fb9096..3f2654a1685 100755 --- a/bin/android-java-wordnik-api.sh +++ b/bin/android-java-wordnik-api.sh @@ -1,7 +1,6 @@ #!/bin/sh SCRIPT="$0" -SCALA_RUNNER_VERSION=$(scala ./bin/Version.scala) while [ -h "$SCRIPT" ] ; do ls=`ls -ld "$SCRIPT"` @@ -18,15 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ samples/client/petstore/android-java/AndroidJavaPetstoreCodegen.scala http://petstore.swagger.wordnik.com/api/api-docs special-key" +ags="$@ -i modules/swagger-codegen/src/test/resources/2_0/wordnik.json -l android -o samples/client/wordnik/android-java" -if [ -f $APP_DIR/target/scala-$SCALA_RUNNER_VERSION/*assembly*.jar ]; then - scala -cp target/scala-$SCALA_RUNNER_VERSION/*assembly*.jar $ags -else - echo "Please set scalaVersion := \"$SCALA_RUNNER_VERSION\" in build.sbt and run ./sbt assembly" -fi +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/dynamic-html.sh b/bin/dynamic-html.sh index 192cb6f0159..45dcedd5f69 100755 --- a/bin/dynamic-html.sh +++ b/bin/dynamic-html.sh @@ -17,11 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i http://petstore.swagger.wordnik.com/v2/swagger.json -l dynamic-html -o samples/swagger-dynamic-html" +ags="$@ -i http://petstore.swagger.wordnik.com/v2/swagger.json -l dynamic-html -o samples/swagger-dynamic-html" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/html.sh b/bin/html.sh index d50a5cc7cf0..95c5e01411a 100755 --- a/bin/html.sh +++ b/bin/html.sh @@ -17,11 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i http://petstore.swagger.wordnik.com/v2/swagger.json -l html -o samples/swagger-html" +ags="$@ -i http://petstore.swagger.wordnik.com/v2/swagger.json -l html -o samples/swagger-html" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/java-petstore-filemap.sh b/bin/java-petstore-filemap.sh index fbe0f86c210..04345b346ab 100755 --- a/bin/java-petstore-filemap.sh +++ b/bin/java-petstore-filemap.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i src/test/resources/petstore.json -l java -o samples/client/petstore/java" +ags="$@ -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l java -o samples/client/petstore/java" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/java-petstore.sh b/bin/java-petstore.sh index 8996c23faea..a3f15898492 100755 --- a/bin/java-petstore.sh +++ b/bin/java-petstore.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i http://petstore.swagger.wordnik.com/v2/swagger.json -l java -o samples/client/petstore/java" +ags="$@ -i http://petstore.swagger.wordnik.com/v2/swagger.json -l java -o samples/client/petstore/java" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/java-wordnik-api.sh b/bin/java-wordnik-api.sh index c1888f07fb0..b4cae8590bc 100755 --- a/bin/java-wordnik-api.sh +++ b/bin/java-wordnik-api.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i src/test/resources/wordnik.json -l java" +ags="$@ -i modules/swagger-codegen/src/test/resources/2_0/wordnik.json -l java -o samples/client/wordnik/java" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/objc-petstore.sh b/bin/objc-petstore.sh index 199ef4fb7ad..d01aebcff67 100755 --- a/bin/objc-petstore.sh +++ b/bin/objc-petstore.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i src/test/resources/petstore.json -l objc -o samples/client/petstore/objc -t src/main/resources/objc" +ags="$@ -i modules/swagger-codegen/src/test/resources/petstore.json -l objc -o samples/client/petstore/objc -t src/main/resources/objc" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/objc-wordnik-api.sh b/bin/objc-wordnik-api.sh index cde5fb50fc2..68eb1b8226d 100755 --- a/bin/objc-wordnik-api.sh +++ b/bin/objc-wordnik-api.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i src/test/resources/wordnik.json -l objc" +ags="$@ -i modules/swagger-codegen/src/test/resources/2_0/wordnik.json -l objc -o samples/client/wordnik/objc" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/tizen-petstore.sh b/bin/tizen-petstore.sh index 6026e0ca7b1..97ba32ae721 100755 --- a/bin/tizen-petstore.sh +++ b/bin/tizen-petstore.sh @@ -17,10 +17,20 @@ if [ ! -d "${APP_DIR}" ]; then APP_DIR=`cd "${APP_DIR}"; pwd` fi -cd $APP_DIR +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ com.wordnik.swagger.codegen.Codegen -i http://petstore.swagger.wordnik.com/v2/swagger.json -l tizen -o samples/client/petstore/tizen" +ags="$@ -i http://petstore.swagger.wordnik.com/v2/swagger.json -l tizen -o samples/client/petstore/tizen" -java -cp $APP_DIR/target/*:$APP_DIR/target/lib/* $ags +java $JAVA_OPTS -jar $executable $ags From 2f16ee3b295c1e6ddab1e6f3a231f140f7cbea38 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 11:34:23 -0800 Subject: [PATCH 5/6] renamed package --- .../java/com/wordnik/client/api/PetApi.java | 38 ++ .../petstore/java/JavaPetstoreCodegen.scala | 49 -- .../java/com/wordnik/client/ApiException.java | 29 -- .../java/com/wordnik/client/ApiInvoker.java | 187 ------- .../java/com/wordnik/client/JsonUtil.java | 23 - .../java/com/wordnik/client/api/PetApi.java | 409 ---------------- .../java/com/wordnik/client/api/StoreApi.java | 195 -------- .../java/com/wordnik/client/api/UserApi.java | 461 ------------------ .../com/wordnik/client/model/Category.java | 49 -- .../java/com/wordnik/client/model/Order.java | 109 ----- .../java/com/wordnik/client/model/Pet.java | 105 ---- .../java/com/wordnik/client/model/Tag.java | 49 -- .../java/com/wordnik/client/model/User.java | 131 ----- .../petstore/tizen/client/SamiStoreApi.cpp | 62 +++ .../petstore/tizen/client/SamiStoreApi.h | 4 + 15 files changed, 104 insertions(+), 1796 deletions(-) delete mode 100644 samples/client/petstore/java/JavaPetstoreCodegen.scala delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/ApiException.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/JsonUtil.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/api/PetApi.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/api/StoreApi.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/api/UserApi.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/model/Category.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/model/Order.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/model/Pet.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/model/Tag.java delete mode 100644 samples/client/petstore/java/src/main/java/com/wordnik/client/model/User.java diff --git a/samples/client/petstore/android-java/src/main/java/com/wordnik/client/api/PetApi.java b/samples/client/petstore/android-java/src/main/java/com/wordnik/client/api/PetApi.java index 5aa488c7577..c665531ff47 100644 --- a/samples/client/petstore/android-java/src/main/java/com/wordnik/client/api/PetApi.java +++ b/samples/client/petstore/android-java/src/main/java/com/wordnik/client/api/PetApi.java @@ -8,6 +8,7 @@ import com.wordnik.client.model.*; import java.util.*; import com.wordnik.client.model.Pet; +import java.io.File; import java.util.Map; import java.util.HashMap; @@ -298,4 +299,41 @@ public class PetApi { } } + + public void uploadImage (File petImage) throws ApiException { + Object postBody = null; + + + + // create path and map variables + String path = "/pet/{petId}/upload".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + + + + + + String contentType = "application/json"; + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + } diff --git a/samples/client/petstore/java/JavaPetstoreCodegen.scala b/samples/client/petstore/java/JavaPetstoreCodegen.scala deleted file mode 100644 index 1e23a176813..00000000000 --- a/samples/client/petstore/java/JavaPetstoreCodegen.scala +++ /dev/null @@ -1,49 +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. - */ - -import com.wordnik.swagger.codegen.BasicJavaGenerator - -object JavaPetstoreCodegen extends BasicJavaGenerator { - def main(args: Array[String]) = generateClient(args) - - // location of templates - override def templateDir = "src/main/resources/Java" - - // where to write generated code - override def destinationDir = "samples/client/petstore/java/src/main/java" - - // package for api invoker, error files - override def invokerPackage = Some("com.wordnik.client") - - // package for models - override def modelPackage = Some("com.wordnik.petstore.model") - - // package for api classes - override def apiPackage = Some("com.wordnik.petstore.api") - - additionalParams ++= Map( - "artifactId" -> "swagger-petstore", - "artifactVersion" -> "1.0.0", - "groupId" -> "com.wordnik") - - // supporting classes - override def supportingFiles = - List( - ("apiInvoker.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "ApiInvoker.java"), - ("JsonUtil.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "JsonUtil.java"), - ("apiException.mustache", destinationDir + java.io.File.separator + invokerPackage.get.replace(".", java.io.File.separator) + java.io.File.separator, "ApiException.java"), - ("pom.mustache", "samples/client/petstore/java", "pom.xml")) -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiException.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiException.java deleted file mode 100644 index 9a1f62b3061..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiException.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.wordnik.client; - -public class ApiException extends Exception { - int code = 0; - String message = null; - - public ApiException() {} - - public ApiException(int code, String message) { - this.code = code; - this.message = message; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java deleted file mode 100644 index cd6a73937ba..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/ApiInvoker.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.wordnik.client; - -import com.fasterxml.jackson.core.JsonGenerator.Feature; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.api.client.filter.LoggingFilter; -import com.sun.jersey.api.client.WebResource.Builder; -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.Response.Status.Family; -import javax.ws.rs.core.MediaType; - -import java.util.Map; -import java.util.HashMap; -import java.util.List; -import java.io.IOException; -import java.net.URLEncoder; -import java.io.UnsupportedEncodingException; - -public class ApiInvoker { - private static ApiInvoker INSTANCE = new ApiInvoker(); - private Map hostMap = new HashMap(); - private Map defaultHeaderMap = new HashMap(); - private boolean isDebug = false; - - public void enableDebug() { - isDebug = true; - } - - public static ApiInvoker getInstance() { - return INSTANCE; - } - - public void addDefaultHeader(String key, String value) { - defaultHeaderMap.put(key, value); - } - - public String escapeString(String str) { - try{ - return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); - } - catch(UnsupportedEncodingException e) { - return str; - } - } - - public static Object deserialize(String json, String containerType, Class cls) throws ApiException { - try{ - if("List".equals(containerType)) { - JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); - List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); - return response; - } - else if(String.class.equals(cls)) { - if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) - return json.substring(1, json.length() - 2); - else - return json; - } - else { - return JsonUtil.getJsonMapper().readValue(json, cls); - } - } - catch (IOException e) { - throw new ApiException(500, e.getMessage()); - } - } - - public static String serialize(Object obj) throws ApiException { - try { - if (obj != null) - return JsonUtil.getJsonMapper().writeValueAsString(obj); - else - return null; - } - catch (Exception e) { - throw new ApiException(500, e.getMessage()); - } - } - - public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, Map formParams, String contentType) throws ApiException { - Client client = getClient(host); - - StringBuilder b = new StringBuilder(); - - for(String key : queryParams.keySet()) { - String value = queryParams.get(key); - if (value != null){ - if(b.toString().length() == 0) - b.append("?"); - else - b.append("&"); - b.append(escapeString(key)).append("=").append(escapeString(value)); - } - } - String querystring = b.toString(); - - Builder builder = client.resource(host + path + querystring).accept("application/json"); - for(String key : headerParams.keySet()) { - builder.header(key, headerParams.get(key)); - } - - for(String key : defaultHeaderMap.keySet()) { - if(!headerParams.containsKey(key)) { - builder.header(key, defaultHeaderMap.get(key)); - } - } - ClientResponse response = null; - - if("GET".equals(method)) { - response = (ClientResponse) builder.get(ClientResponse.class); - } - else if ("POST".equals(method)) { - if(body == null) - response = builder.post(ClientResponse.class, null); - else if(body instanceof FormDataMultiPart) { - response = builder.type(contentType).post(ClientResponse.class, body); - } - else - response = builder.type(contentType).post(ClientResponse.class, serialize(body)); - } - else if ("PUT".equals(method)) { - if(body == null) - response = builder.put(ClientResponse.class, serialize(body)); - else { - if("application/x-www-form-urlencoded".equals(contentType)) { - StringBuilder formParamBuilder = new StringBuilder(); - - // encode the form params - for(String key : formParams.keySet()) { - String value = formParams.get(key); - if(value != null && !"".equals(value.trim())) { - if(formParamBuilder.length() > 0) { - formParamBuilder.append("&"); - } - try { - formParamBuilder.append(URLEncoder.encode(key, "utf8")).append("=").append(URLEncoder.encode(value, "utf8")); - } - catch (Exception e) { - // move on to next - } - } - } - response = builder.type(contentType).put(ClientResponse.class, formParamBuilder.toString()); - } - else - response = builder.type(contentType).put(ClientResponse.class, serialize(body)); - } - } - else if ("DELETE".equals(method)) { - if(body == null) - response = builder.delete(ClientResponse.class, serialize(body)); - else - response = builder.type(contentType).delete(ClientResponse.class, serialize(body)); - } - else { - throw new ApiException(500, "unknown method type " + method); - } - if(response.getClientResponseStatus() == ClientResponse.Status.NO_CONTENT) { - return null; - } - else if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { - return (String) response.getEntity(String.class); - } - else { - throw new ApiException( - response.getClientResponseStatus().getStatusCode(), - response.getEntity(String.class)); - } - } - - private Client getClient(String host) { - if(!hostMap.containsKey(host)) { - Client client = Client.create(); - if(isDebug) - client.addFilter(new LoggingFilter()); - hostMap.put(host, client); - } - return hostMap.get(host); - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/JsonUtil.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/JsonUtil.java deleted file mode 100644 index a650c968f4c..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/JsonUtil.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.wordnik.client; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.core.JsonGenerator.Feature; - -import com.fasterxml.jackson.datatype.joda.*; - -public class JsonUtil { - public static ObjectMapper mapper; - - static { - mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.registerModule(new JodaModule()); - } - - public static ObjectMapper getJsonMapper() { - return mapper; - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/PetApi.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/api/PetApi.java deleted file mode 100644 index f89c0939dc4..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/PetApi.java +++ /dev/null @@ -1,409 +0,0 @@ -package com.wordnik.client.api; - -import com.wordnik.client.ApiException; -import com.wordnik.client.ApiInvoker; - -import com.wordnik.client.model.*; - -import java.util.*; - -import com.wordnik.client.model.Pet; - -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.MediaType; - -import java.io.File; -import java.util.Map; -import java.util.HashMap; - -public class PetApi { - String basePath = "http://petstore.swagger.wordnik.com/v2"; - ApiInvoker apiInvoker = ApiInvoker.getInstance(); - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getBasePath() { - return basePath; - } - - - - public void updatePet (Pet body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/pet".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - "application/json","application/xml" - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "PUT", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public void addPet (Pet body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/pet".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - "application/json","application/xml" - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public List findPetsByStatus (List status) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/pet/findByStatus".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - if(!"null".equals(String.valueOf(status))) - queryParams.put("status", String.valueOf(status)); - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (List) ApiInvoker.deserialize(response, "Pet", Pet.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public List findPetsByTags (List tags) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/pet/findByTags".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - if(!"null".equals(String.valueOf(tags))) - queryParams.put("tags", String.valueOf(tags)); - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (List) ApiInvoker.deserialize(response, "Pet", Pet.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public Pet getPetById (Long petId) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/pet/{petId}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (Pet) ApiInvoker.deserialize(response, "", Pet.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public void updatePetWithForm (String petId, String name, String status) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/pet/{petId}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - "application/x-www-form-urlencoded" - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public void deletePet (String api_key, Long petId) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/pet/{petId}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - headerParams.put("api_key", api_key); - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/StoreApi.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/api/StoreApi.java deleted file mode 100644 index 968d5840a78..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/StoreApi.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.wordnik.client.api; - -import com.wordnik.client.ApiException; -import com.wordnik.client.ApiInvoker; - -import com.wordnik.client.model.*; - -import java.util.*; - -import com.wordnik.client.model.Order; - -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.MediaType; - -import java.io.File; -import java.util.Map; -import java.util.HashMap; - -public class StoreApi { - String basePath = "http://petstore.swagger.wordnik.com/v2"; - ApiInvoker apiInvoker = ApiInvoker.getInstance(); - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getBasePath() { - return basePath; - } - - - - public Order placeOrder (Order body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/store/order".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (Order) ApiInvoker.deserialize(response, "", Order.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public Order getOrderById (String orderId) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/store/order/{orderId}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "orderId" + "\\}", apiInvoker.escapeString(orderId.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (Order) ApiInvoker.deserialize(response, "", Order.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public void deleteOrder (String orderId) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/store/order/{orderId}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "orderId" + "\\}", apiInvoker.escapeString(orderId.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/UserApi.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/api/UserApi.java deleted file mode 100644 index 73b764f1a3d..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/api/UserApi.java +++ /dev/null @@ -1,461 +0,0 @@ -package com.wordnik.client.api; - -import com.wordnik.client.ApiException; -import com.wordnik.client.ApiInvoker; - -import com.wordnik.client.model.*; - -import java.util.*; - -import com.wordnik.client.model.User; -import java.util.*; - -import com.sun.jersey.multipart.FormDataMultiPart; - -import javax.ws.rs.core.MediaType; - -import java.io.File; -import java.util.Map; -import java.util.HashMap; - -public class UserApi { - String basePath = "http://petstore.swagger.wordnik.com/v2"; - ApiInvoker apiInvoker = ApiInvoker.getInstance(); - - public ApiInvoker getInvoker() { - return apiInvoker; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public String getBasePath() { - return basePath; - } - - - - public void createUser (User body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/user".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public void createUsersWithArrayInput (List body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/user/createWithArray".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public void createUsersWithListInput (List body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/user/createWithList".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public String loginUser (String username, String password) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/user/login".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - if(!"null".equals(String.valueOf(username))) - queryParams.put("username", String.valueOf(username)); - if(!"null".equals(String.valueOf(password))) - queryParams.put("password", String.valueOf(password)); - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (String) ApiInvoker.deserialize(response, "", String.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public void logoutUser () throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/user/logout".replaceAll("\\{format\\}","json"); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public User getUserByName (String username) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/user/{username}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return (User) ApiInvoker.deserialize(response, "", User.class); - } - else { - return null; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return null; - } - else { - throw ex; - } - } - } - - - public void updateUser (String username, User body) throws ApiException { - Object postBody = body; - - - // create path and map variables - String path = "/user/{username}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "PUT", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - - - public void deleteUser (String username) throws ApiException { - Object postBody = null; - - - // create path and map variables - String path = "/user/{username}".replaceAll("\\{format\\}","json") - .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); - - // query params - Map queryParams = new HashMap(); - Map headerParams = new HashMap(); - Map formParams = new HashMap(); - - - - - - String[] contentTypes = { - - }; - - String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; - - if(contentType.startsWith("multipart/form-data")) { - boolean hasFields = false; - FormDataMultiPart mp = new FormDataMultiPart(); - - if(hasFields) - postBody = mp; - } - else { - - } - - try { - String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); - if(response != null){ - return ; - } - else { - return ; - } - } catch (ApiException ex) { - if(ex.getCode() == 404) { - return ; - } - else { - throw ex; - } - } - } - -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Category.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Category.java deleted file mode 100644 index 5a0a18d40a5..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Category.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.wordnik.client.model; - - -import com.wordnik.swagger.annotations.*; - - -@ApiModel(description = "") -public class Category { - private Long id = null; - - //public enum idEnum { }; - - private String name = null; - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class Category {\n"); - - sb.append(" id: ").append(id).append("\n"); - sb.append(" name: ").append(name).append("\n"); - sb.append("}\n"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Order.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Order.java deleted file mode 100644 index 65af51c2f6d..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Order.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.wordnik.client.model; - -import java.util.Date; - -import com.wordnik.swagger.annotations.*; - - -@ApiModel(description = "") -public class Order { - private Long id = null; - - //public enum idEnum { }; - - private Long petId = null; - - //public enum petIdEnum { }; - - private Integer quantity = null; - - //public enum quantityEnum { }; - - private Date shipDate = null; - private String status = null; - private Boolean complete = null; - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getPetId() { - return petId; - } - public void setPetId(Long petId) { - this.petId = petId; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Integer getQuantity() { - return quantity; - } - public void setQuantity(Integer quantity) { - this.quantity = quantity; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Date getShipDate() { - return shipDate; - } - public void setShipDate(Date shipDate) { - this.shipDate = shipDate; - } - - - /** - * Order Status - **/ - @ApiModelProperty(required = false, value = "Order Status") - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Boolean getComplete() { - return complete; - } - public void setComplete(Boolean complete) { - this.complete = complete; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class Order {\n"); - - sb.append(" id: ").append(id).append("\n"); - sb.append(" petId: ").append(petId).append("\n"); - sb.append(" quantity: ").append(quantity).append("\n"); - sb.append(" shipDate: ").append(shipDate).append("\n"); - sb.append(" status: ").append(status).append("\n"); - sb.append(" complete: ").append(complete).append("\n"); - sb.append("}\n"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Pet.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Pet.java deleted file mode 100644 index f84c1d0d925..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Pet.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.wordnik.client.model; - -import com.wordnik.client.model.Category; -import com.wordnik.client.model.Tag; -import java.util.*; - -import com.wordnik.swagger.annotations.*; - - -@ApiModel(description = "") -public class Pet { - private Long id = null; - - //public enum idEnum { }; - - private Category category = null; - private String name = null; - private List photoUrls = new ArrayList() ; - private List tags = new ArrayList() ; - private String status = null; - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Category getCategory() { - return category; - } - public void setCategory(Category category) { - this.category = category; - } - - - /** - **/ - @ApiModelProperty(required = true, value = "") - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - - /** - **/ - @ApiModelProperty(required = true, value = "") - public List getPhotoUrls() { - return photoUrls; - } - public void setPhotoUrls(List photoUrls) { - this.photoUrls = photoUrls; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public List getTags() { - return tags; - } - public void setTags(List tags) { - this.tags = tags; - } - - - /** - * pet status in the store - **/ - @ApiModelProperty(required = false, value = "pet status in the store") - public String getStatus() { - return status; - } - public void setStatus(String status) { - this.status = status; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class Pet {\n"); - - sb.append(" id: ").append(id).append("\n"); - sb.append(" category: ").append(category).append("\n"); - sb.append(" name: ").append(name).append("\n"); - sb.append(" photoUrls: ").append(photoUrls).append("\n"); - sb.append(" tags: ").append(tags).append("\n"); - sb.append(" status: ").append(status).append("\n"); - sb.append("}\n"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Tag.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Tag.java deleted file mode 100644 index 6fdc13bb049..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/Tag.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.wordnik.client.model; - - -import com.wordnik.swagger.annotations.*; - - -@ApiModel(description = "") -public class Tag { - private Long id = null; - - //public enum idEnum { }; - - private String name = null; - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getName() { - return name; - } - public void setName(String name) { - this.name = name; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class Tag {\n"); - - sb.append(" id: ").append(id).append("\n"); - sb.append(" name: ").append(name).append("\n"); - sb.append("}\n"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/User.java b/samples/client/petstore/java/src/main/java/com/wordnik/client/model/User.java deleted file mode 100644 index 3e1d8d032e6..00000000000 --- a/samples/client/petstore/java/src/main/java/com/wordnik/client/model/User.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.wordnik.client.model; - - -import com.wordnik.swagger.annotations.*; - - -@ApiModel(description = "") -public class User { - private Long id = null; - - //public enum idEnum { }; - - private String username = null; - private String firstName = null; - private String lastName = null; - private String email = null; - private String password = null; - private String phone = null; - private Integer userStatus = null; - - //public enum userStatusEnum { }; - - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getFirstName() { - return firstName; - } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getLastName() { - return lastName; - } - public void setLastName(String lastName) { - this.lastName = lastName; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } - - - /** - **/ - @ApiModelProperty(required = false, value = "") - public String getPhone() { - return phone; - } - public void setPhone(String phone) { - this.phone = phone; - } - - - /** - * User Status - **/ - @ApiModelProperty(required = false, value = "User Status") - public Integer getUserStatus() { - return userStatus; - } - public void setUserStatus(Integer userStatus) { - this.userStatus = userStatus; - } - - - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class User {\n"); - - sb.append(" id: ").append(id).append("\n"); - sb.append(" username: ").append(username).append("\n"); - sb.append(" firstName: ").append(firstName).append("\n"); - sb.append(" lastName: ").append(lastName).append("\n"); - sb.append(" email: ").append(email).append("\n"); - sb.append(" password: ").append(password).append("\n"); - sb.append(" phone: ").append(phone).append("\n"); - sb.append(" userStatus: ").append(userStatus).append("\n"); - sb.append("}\n"); - return sb.toString(); - } -} diff --git a/samples/client/petstore/tizen/client/SamiStoreApi.cpp b/samples/client/petstore/tizen/client/SamiStoreApi.cpp index 0c0833ecfbd..c567896c48d 100644 --- a/samples/client/petstore/tizen/client/SamiStoreApi.cpp +++ b/samples/client/petstore/tizen/client/SamiStoreApi.cpp @@ -16,6 +16,68 @@ SamiStoreApi::~SamiStoreApi() { } +void +getInventoryProcessor(HttpResponse* pHttpResponse, void (* handler)(void*, SamiError*)) { + int code = pHttpResponse->GetHttpStatusCode(); + + if(code >= 200 && code < 300) { + ByteBuffer* pBuffer = pHttpResponse->ReadBodyN(); + IJsonValue* pJson = JsonParser::ParseN(*pBuffer); + + HashMap* out = new HashMap(); + jsonToValue(out, pJson, L"HashMap*", L"Integer"); + + if (pJson) { + if (pJson->GetType() == JSON_TYPE_OBJECT) { + JsonObject* pObject = static_cast< JsonObject* >(pJson); + pObject->RemoveAll(true); + } + else if (pJson->GetType() == JSON_TYPE_ARRAY) { + JsonArray* pArray = static_cast< JsonArray* >(pJson); + pArray->RemoveAll(true); + } + handler(out, null); + } + else { + SamiError* error = new SamiError(0, new String(L"No parsable response received")); + handler(null, error); + } + + } + else { + SamiError* error = new SamiError(code, new String(pHttpResponse->GetStatusText())); + handler(null, error); + + } +} + +HashMap* +SamiStoreApi::getInventoryWithCompletion( void (* success)(HashMap*, SamiError*)) { + client = new SamiApiClient(); + + client->success(&getInventoryProcessor, (void(*)(void*, SamiError*))success); + HashMap* headerParams = new HashMap(SingleObjectDeleter); + headerParams->Construct(); + + + + HashMap* queryParams = new HashMap(SingleObjectDeleter); + queryParams->Construct(); + + + + String* mBody = null; + + + + String url(L"/store/inventory"); + + + + client->execute(SamiStoreApi::getBasePath(), url, "GET", (IMap*)queryParams, mBody, (IMap*)headerParams, null, L"application/json"); + return null; +} + void placeOrderProcessor(HttpResponse* pHttpResponse, void (* handler)(void*, SamiError*)) { int code = pHttpResponse->GetHttpStatusCode(); diff --git a/samples/client/petstore/tizen/client/SamiStoreApi.h b/samples/client/petstore/tizen/client/SamiStoreApi.h index ad835cd42a9..510e74e9a53 100644 --- a/samples/client/petstore/tizen/client/SamiStoreApi.h +++ b/samples/client/petstore/tizen/client/SamiStoreApi.h @@ -7,6 +7,7 @@ #include "SamiOrder.h" using Tizen::Base::String; +using Tizen::Base::Integer; using namespace Tizen::Net::Http; @@ -18,6 +19,9 @@ public: virtual ~SamiStoreApi(); + HashMap* + getInventoryWithCompletion( void (* handler)(HashMap*, SamiError*)); + SamiOrder* placeOrderWithCompletion(SamiOrder* body, void (* handler)(SamiOrder*, SamiError*)); From f7c68107574599d25a479df420e3b1f4ea91e9de Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 5 Feb 2015 11:35:13 -0800 Subject: [PATCH 6/6] updated samples --- bin/all-petstore.sh | 1 + bin/jaxrs-petstore-server.sh | 36 ++ modules/swagger-codegen/pom.xml | 2 +- .../swagger/codegen/DefaultCodegen.java | 18 +- .../codegen/languages/JaxRSServerCodegen.java | 24 +- .../src/main/resources/JavaJaxRS/api.mustache | 1 + .../src/main/resources/JavaJaxRS/pom.mustache | 8 +- .../src/main/resources/JavaJaxRS/web.mustache | 2 +- pom.xml | 2 +- .../java/io/swagger/client/ApiException.java | 29 ++ .../java/io/swagger/client/ApiInvoker.java | 187 ++++++++ .../main/java/io/swagger/client/JsonUtil.java | 23 + .../java/io/swagger/client/api/PetApi.java | 403 ++++++++++++++++ .../java/io/swagger/client/api/StoreApi.java | 240 ++++++++++ .../java/io/swagger/client/api/UserApi.java | 445 ++++++++++++++++++ .../io/swagger/client/model/Category.java | 52 ++ .../java/io/swagger/client/model/Order.java | 116 +++++ .../java/io/swagger/client/model/Pet.java | 112 +++++ .../java/io/swagger/client/model/Tag.java | 52 ++ .../java/io/swagger/client/model/User.java | 140 ++++++ samples/server/petstore/jaxrs/README.md | 10 + samples/server/petstore/jaxrs/pom.xml | 135 ++++++ .../java/io/swagger/api/ApiException.java | 9 + .../java/io/swagger/api/ApiOriginFilter.java | 26 + .../io/swagger/api/ApiResponseMessage.java | 68 +++ .../io/swagger/api/NotFoundException.java | 9 + .../src/main/java/io/swagger/api/PetApi.java | 141 ++++++ .../main/java/io/swagger/api/StoreApi.java | 88 ++++ .../src/main/java/io/swagger/api/UserApi.java | 153 ++++++ .../main/java/io/swagger/model/Category.java | 46 ++ .../src/main/java/io/swagger/model/Order.java | 100 ++++ .../src/main/java/io/swagger/model/Pet.java | 102 ++++ .../src/main/java/io/swagger/model/Tag.java | 46 ++ .../src/main/java/io/swagger/model/User.java | 125 +++++ .../jaxrs/src/main/webapp/WEB-INF/web.xml | 54 +++ samples/swagger-dynamic-html/docs/index.html | 2 + .../docs/operations/StoreApi.html | 15 + samples/swagger-html/index.html | 27 +- 38 files changed, 3025 insertions(+), 24 deletions(-) create mode 100755 bin/jaxrs-petstore-server.sh create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/ApiException.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/ApiInvoker.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/JsonUtil.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/api/PetApi.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/api/StoreApi.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/api/UserApi.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/model/Category.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/model/Order.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/model/Pet.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/model/Tag.java create mode 100644 samples/client/petstore/java/src/main/java/io/swagger/client/model/User.java create mode 100644 samples/server/petstore/jaxrs/README.md create mode 100644 samples/server/petstore/jaxrs/pom.xml create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiException.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiOriginFilter.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiResponseMessage.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/NotFoundException.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/PetApi.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/StoreApi.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/api/UserApi.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Category.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Order.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Pet.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Tag.java create mode 100644 samples/server/petstore/jaxrs/src/main/java/io/swagger/model/User.java create mode 100644 samples/server/petstore/jaxrs/src/main/webapp/WEB-INF/web.xml diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index 7564d9cfdb6..8b8fd96226f 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -22,6 +22,7 @@ cd $APP_DIR ./bin/android-java-wordnik-api.sh ./bin/dynamic-html.sh ./bin/html.sh +./bin/jaxrs-petstore-server.sh ./bin/java-petstore-filemap.sh ./bin/java-petstore.sh ./bin/java-wordnik-api.sh diff --git a/bin/jaxrs-petstore-server.sh b/bin/jaxrs-petstore-server.sh new file mode 100755 index 00000000000..066651aaca0 --- /dev/null +++ b/bin/jaxrs-petstore-server.sh @@ -0,0 +1,36 @@ +#!/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 + +root=./modules/swagger-codegen-distribution/pom.xml + +# gets version of swagger-codegen +version=$(sed '//,/<\/project>/d;//!d;s/ *<\/\?version> *//g' $root | sed -n '2p' | sed -e 's,.*\([^<]*\).*,\1,g') + +executable="./modules/swagger-codegen-distribution/target/swagger-codegen-distribution-$version.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="$@ -i http://petstore.swagger.wordnik.com/v2/swagger.json -l jaxrs -o samples/server/petstore/jaxrs -t modules/swagger-codegen/src/main/resources/JavaJaxRS" + +java $JAVA_OPTS -jar $executable $ags diff --git a/modules/swagger-codegen/pom.xml b/modules/swagger-codegen/pom.xml index 8f0de9f7ddb..9ca956c85a2 100644 --- a/modules/swagger-codegen/pom.xml +++ b/modules/swagger-codegen/pom.xml @@ -9,7 +9,7 @@ com.wordnik swagger-codegen jar - swagger-codegen + swagger-codegen (core library) 2.1.0-SNAPSHOT src/main/java diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java index e89b0f0b26f..92ff8129ef4 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/DefaultCodegen.java @@ -7,9 +7,14 @@ import com.wordnik.swagger.util.Json; import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.util.*; public class DefaultCodegen { + Logger LOGGER = LoggerFactory.getLogger(DefaultCodegen.class); + protected String outputFolder = ""; protected Set defaultIncludes = new HashSet(); protected Map typeMapping = new HashMap(); @@ -375,7 +380,7 @@ public class DefaultCodegen { Property prop = impl.getProperties().get(key); if(prop == null) { - System.out.println("null property for " + key); + LOGGER.warn("null property for " + key); } else { CodegenProperty cp = fromProperty(key, prop); @@ -422,7 +427,7 @@ public class DefaultCodegen { public CodegenProperty fromProperty(String name, Property p) { if(p == null) { - System.out.println("unexpected missing property for name " + null); + LOGGER.error("unexpected missing property for name " + null); return null; } CodegenProperty property = CodegenModelFactory.newInstance(CodegenModelType.PROPERTY); @@ -481,8 +486,7 @@ public class DefaultCodegen { ArrayProperty ap = (ArrayProperty) p; CodegenProperty cp = fromProperty("inner", ap.getItems()); if(cp == null) { - System.out.println("skipping invalid property:"); - Json.prettyPrint(p); + LOGGER.warn("skipping invalid property " + Json.pretty(p)); } else { property.baseType = getSwaggerType(p); @@ -540,7 +544,7 @@ public class DefaultCodegen { } } operationId = builder.toString(); - System.out.println("generated operationId " + operationId); + LOGGER.warn("generated operationId " + operationId); } op.path = path; op.operationId = operationId; @@ -741,7 +745,7 @@ public class DefaultCodegen { if("array".equals(qp.getType())) { Property inner = qp.getItems(); if(inner == null) { - System.out.println("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); + LOGGER.warn("warning! No inner type supplied for array parameter \"" + qp.getName() + "\", using String"); inner = new StringProperty().description("//TODO automatically added by swagger-codegen"); } property = new ArrayProperty(inner); @@ -753,7 +757,7 @@ public class DefaultCodegen { else property = PropertyBuilder.build(qp.getType(), qp.getFormat(), null); if(property == null) { - System.out.println("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); + LOGGER.warn("warning! Property type \"" + qp.getType() + "\" not found for parameter \"" + param.getName() + "\", using String"); property = new StringProperty().description("//TODO automatically added by swagger-codegen. Type was " + qp.getType() + " but not supported"); } CodegenProperty model = fromProperty(qp.getName(), property); diff --git a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java index 6c805e993c9..3e6702a8473 100644 --- a/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/com/wordnik/swagger/codegen/languages/JaxRSServerCodegen.java @@ -10,8 +10,8 @@ import java.util.*; import java.io.File; public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { - protected String invokerPackage = "com.wordnik.api"; - protected String groupId = "com.wordnik"; + protected String invokerPackage = "io.swagger.api"; + protected String groupId = "io.swagger"; protected String artifactId = "swagger-server"; protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src/main/java"; @@ -31,8 +31,8 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf modelTemplateFiles.put("model.mustache", ".java"); apiTemplateFiles.put("api.mustache", ".java"); templateDir = "JavaJaxRS"; - apiPackage = "com.wordnik.api"; - modelPackage = "com.wordnik.model"; + apiPackage = "io.swagger.api"; + modelPackage = "io.swagger.model"; additionalProperties.put("invokerPackage", invokerPackage); additionalProperties.put("groupId", groupId); @@ -66,6 +66,22 @@ 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/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache index fe287c9ddfe..ce99acb1f39 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache @@ -23,6 +23,7 @@ public class {{classname}} { {{#subresourceOperation}}@Path("{{path}}"){{/subresourceOperation}} {{#hasConsumes}}@Consumes({ {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} }){{/hasConsumes}} {{#hasProduces}}@Produces({ {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }){{/hasProduces}} + // {{returnType}} @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}) @ApiResponses(value = { {{#responses}} @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}}, diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache index e0782610efd..a33f899e02c 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache @@ -123,14 +123,8 @@ ${servlet-api-version} - - - sonatype-snapshots - https://oss.sonatype.org/content/repositories/snapshots - - - 1.5.0-SNAPSHOT + 1.5.0-M1 8.1.11.v20130520 1.13 1.6.3 diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache index b9cd00b71ce..f6181046dda 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache @@ -45,7 +45,7 @@ ApiOriginFilter - com.wordnik.api.ApiOriginFilter + {{apiPackage}}.ApiOriginFilter ApiOriginFilter diff --git a/pom.xml b/pom.xml index 2666991140a..40db216c563 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ com.wordnik swagger-codegen-project pom - swagger-codegen + swagger-codegen-project 2.1.0-SNAPSHOT https://github.com/swagger-api/swagger-codegen diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/ApiException.java b/samples/client/petstore/java/src/main/java/io/swagger/client/ApiException.java new file mode 100644 index 00000000000..31bc8a0978a --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/ApiException.java @@ -0,0 +1,29 @@ +package io.swagger.client; + +public class ApiException extends Exception { + int code = 0; + String message = null; + + public ApiException() {} + + public ApiException(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/ApiInvoker.java b/samples/client/petstore/java/src/main/java/io/swagger/client/ApiInvoker.java new file mode 100644 index 00000000000..30f7e83c971 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/ApiInvoker.java @@ -0,0 +1,187 @@ +package io.swagger.client; + +import com.fasterxml.jackson.core.JsonGenerator.Feature; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.client.WebResource.Builder; +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.Response.Status.Family; +import javax.ws.rs.core.MediaType; + +import java.util.Map; +import java.util.HashMap; +import java.util.List; +import java.io.IOException; +import java.net.URLEncoder; +import java.io.UnsupportedEncodingException; + +public class ApiInvoker { + private static ApiInvoker INSTANCE = new ApiInvoker(); + private Map hostMap = new HashMap(); + private Map defaultHeaderMap = new HashMap(); + private boolean isDebug = false; + + public void enableDebug() { + isDebug = true; + } + + public static ApiInvoker getInstance() { + return INSTANCE; + } + + public void addDefaultHeader(String key, String value) { + defaultHeaderMap.put(key, value); + } + + public String escapeString(String str) { + try{ + return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); + } + catch(UnsupportedEncodingException e) { + return str; + } + } + + public static Object deserialize(String json, String containerType, Class cls) throws ApiException { + try{ + if("List".equals(containerType)) { + JavaType typeInfo = JsonUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, cls); + List response = (List) JsonUtil.getJsonMapper().readValue(json, typeInfo); + return response; + } + else if(String.class.equals(cls)) { + if(json != null && json.startsWith("\"") && json.endsWith("\"") && json.length() > 1) + return json.substring(1, json.length() - 2); + else + return json; + } + else { + return JsonUtil.getJsonMapper().readValue(json, cls); + } + } + catch (IOException e) { + throw new ApiException(500, e.getMessage()); + } + } + + public static String serialize(Object obj) throws ApiException { + try { + if (obj != null) + return JsonUtil.getJsonMapper().writeValueAsString(obj); + else + return null; + } + catch (Exception e) { + throw new ApiException(500, e.getMessage()); + } + } + + public String invokeAPI(String host, String path, String method, Map queryParams, Object body, Map headerParams, Map formParams, String contentType) throws ApiException { + Client client = getClient(host); + + StringBuilder b = new StringBuilder(); + + for(String key : queryParams.keySet()) { + String value = queryParams.get(key); + if (value != null){ + if(b.toString().length() == 0) + b.append("?"); + else + b.append("&"); + b.append(escapeString(key)).append("=").append(escapeString(value)); + } + } + String querystring = b.toString(); + + Builder builder = client.resource(host + path + querystring).accept("application/json"); + for(String key : headerParams.keySet()) { + builder.header(key, headerParams.get(key)); + } + + for(String key : defaultHeaderMap.keySet()) { + if(!headerParams.containsKey(key)) { + builder.header(key, defaultHeaderMap.get(key)); + } + } + ClientResponse response = null; + + if("GET".equals(method)) { + response = (ClientResponse) builder.get(ClientResponse.class); + } + else if ("POST".equals(method)) { + if(body == null) + response = builder.post(ClientResponse.class, null); + else if(body instanceof FormDataMultiPart) { + response = builder.type(contentType).post(ClientResponse.class, body); + } + else + response = builder.type(contentType).post(ClientResponse.class, serialize(body)); + } + else if ("PUT".equals(method)) { + if(body == null) + response = builder.put(ClientResponse.class, serialize(body)); + else { + if("application/x-www-form-urlencoded".equals(contentType)) { + StringBuilder formParamBuilder = new StringBuilder(); + + // encode the form params + for(String key : formParams.keySet()) { + String value = formParams.get(key); + if(value != null && !"".equals(value.trim())) { + if(formParamBuilder.length() > 0) { + formParamBuilder.append("&"); + } + try { + formParamBuilder.append(URLEncoder.encode(key, "utf8")).append("=").append(URLEncoder.encode(value, "utf8")); + } + catch (Exception e) { + // move on to next + } + } + } + response = builder.type(contentType).put(ClientResponse.class, formParamBuilder.toString()); + } + else + response = builder.type(contentType).put(ClientResponse.class, serialize(body)); + } + } + else if ("DELETE".equals(method)) { + if(body == null) + response = builder.delete(ClientResponse.class, serialize(body)); + else + response = builder.type(contentType).delete(ClientResponse.class, serialize(body)); + } + else { + throw new ApiException(500, "unknown method type " + method); + } + if(response.getClientResponseStatus() == ClientResponse.Status.NO_CONTENT) { + return null; + } + else if(response.getClientResponseStatus().getFamily() == Family.SUCCESSFUL) { + return (String) response.getEntity(String.class); + } + else { + throw new ApiException( + response.getClientResponseStatus().getStatusCode(), + response.getEntity(String.class)); + } + } + + private Client getClient(String host) { + if(!hostMap.containsKey(host)) { + Client client = Client.create(); + if(isDebug) + client.addFilter(new LoggingFilter()); + hostMap.put(host, client); + } + return hostMap.get(host); + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/JsonUtil.java b/samples/client/petstore/java/src/main/java/io/swagger/client/JsonUtil.java new file mode 100644 index 00000000000..8e7e686dd0c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/JsonUtil.java @@ -0,0 +1,23 @@ +package io.swagger.client; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.core.JsonGenerator.Feature; + +import com.fasterxml.jackson.datatype.joda.*; + +public class JsonUtil { + public static ObjectMapper mapper; + + static { + mapper = new ObjectMapper(); + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + mapper.registerModule(new JodaModule()); + } + + public static ObjectMapper getJsonMapper() { + return mapper; + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/api/PetApi.java b/samples/client/petstore/java/src/main/java/io/swagger/client/api/PetApi.java new file mode 100644 index 00000000000..21306184f1f --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/api/PetApi.java @@ -0,0 +1,403 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiInvoker; + +import io.swagger.client.model.*; + +import java.util.*; + +import io.swagger.client.model.Pet; + +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.MediaType; + +import java.io.File; +import java.util.Map; +import java.util.HashMap; + +public class PetApi { + String basePath = "http://petstore.swagger.wordnik.com/v2"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + + + public void updatePet (Pet body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/pet".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + "application/json","application/xml" + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "PUT", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public void addPet (Pet body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/pet".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + "application/json","application/xml" + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public List findPetsByStatus (List status) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/pet/findByStatus".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + if(!"null".equals(String.valueOf(status))) + queryParams.put("status", String.valueOf(status)); + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (List) ApiInvoker.deserialize(response, "Pet", Pet.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public List findPetsByTags (List tags) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/pet/findByTags".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + if(!"null".equals(String.valueOf(tags))) + queryParams.put("tags", String.valueOf(tags)); + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (List) ApiInvoker.deserialize(response, "Pet", Pet.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public Pet getPetById (Long petId) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/pet/{petId}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (Pet) ApiInvoker.deserialize(response, "", Pet.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public void updatePetWithForm (String petId, String name, String status) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/pet/{petId}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + "application/x-www-form-urlencoded" + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + hasFields = true; + mp.field("name", name, MediaType.MULTIPART_FORM_DATA_TYPE); + + hasFields = true; + mp.field("status", status, MediaType.MULTIPART_FORM_DATA_TYPE); + + if(hasFields) + postBody = mp; + } + else { + formParams.put("name", name); + formParams.put("status", status); + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public void deletePet (String api_key, Long petId) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/pet/{petId}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "petId" + "\\}", apiInvoker.escapeString(petId.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + headerParams.put("api_key", api_key); + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/api/StoreApi.java b/samples/client/petstore/java/src/main/java/io/swagger/client/api/StoreApi.java new file mode 100644 index 00000000000..63309b2ae39 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/api/StoreApi.java @@ -0,0 +1,240 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiInvoker; + +import io.swagger.client.model.*; + +import java.util.*; + +import java.util.Map; +import io.swagger.client.model.Order; + +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.MediaType; + +import java.io.File; +import java.util.Map; +import java.util.HashMap; + +public class StoreApi { + String basePath = "http://petstore.swagger.wordnik.com/v2"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + + + public Map getInventory () throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/store/inventory".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (Map) ApiInvoker.deserialize(response, "", Map.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public Order placeOrder (Order body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/store/order".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (Order) ApiInvoker.deserialize(response, "", Order.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public Order getOrderById (String orderId) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "orderId" + "\\}", apiInvoker.escapeString(orderId.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (Order) ApiInvoker.deserialize(response, "", Order.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public void deleteOrder (String orderId) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/store/order/{orderId}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "orderId" + "\\}", apiInvoker.escapeString(orderId.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/api/UserApi.java b/samples/client/petstore/java/src/main/java/io/swagger/client/api/UserApi.java new file mode 100644 index 00000000000..307fd2b399b --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/api/UserApi.java @@ -0,0 +1,445 @@ +package io.swagger.client.api; + +import io.swagger.client.ApiException; +import io.swagger.client.ApiInvoker; + +import io.swagger.client.model.*; + +import java.util.*; + +import io.swagger.client.model.User; +import java.util.*; + +import com.sun.jersey.multipart.FormDataMultiPart; + +import javax.ws.rs.core.MediaType; + +import java.io.File; +import java.util.Map; +import java.util.HashMap; + +public class UserApi { + String basePath = "http://petstore.swagger.wordnik.com/v2"; + ApiInvoker apiInvoker = ApiInvoker.getInstance(); + + public ApiInvoker getInvoker() { + return apiInvoker; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + } + + public String getBasePath() { + return basePath; + } + + + + public void createUser (User body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/user".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public void createUsersWithArrayInput (List body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/user/createWithArray".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public void createUsersWithListInput (List body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/user/createWithList".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "POST", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public String loginUser (String username, String password) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/user/login".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + if(!"null".equals(String.valueOf(username))) + queryParams.put("username", String.valueOf(username)); + if(!"null".equals(String.valueOf(password))) + queryParams.put("password", String.valueOf(password)); + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (String) ApiInvoker.deserialize(response, "", String.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public void logoutUser () throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/user/logout".replaceAll("\\{format\\}","json"); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public User getUserByName (String username) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/user/{username}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "GET", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return (User) ApiInvoker.deserialize(response, "", User.class); + } + else { + return null; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return null; + } + else { + throw ex; + } + } + } + + + public void updateUser (String username, User body) throws ApiException { + Object postBody = body; + + + // create path and map variables + String path = "/user/{username}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "PUT", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + + + public void deleteUser (String username) throws ApiException { + Object postBody = null; + + + // create path and map variables + String path = "/user/{username}".replaceAll("\\{format\\}","json") + .replaceAll("\\{" + "username" + "\\}", apiInvoker.escapeString(username.toString())); + + // query params + Map queryParams = new HashMap(); + Map headerParams = new HashMap(); + Map formParams = new HashMap(); + + + + String[] contentTypes = { + + }; + + String contentType = contentTypes.length > 0 ? contentTypes[0] : "application/json"; + + if(contentType.startsWith("multipart/form-data")) { + boolean hasFields = false; + FormDataMultiPart mp = new FormDataMultiPart(); + + if(hasFields) + postBody = mp; + } + else { + + } + + try { + String response = apiInvoker.invokeAPI(basePath, path, "DELETE", queryParams, postBody, headerParams, formParams, contentType); + if(response != null){ + return ; + } + else { + return ; + } + } catch (ApiException ex) { + if(ex.getCode() == 404) { + return ; + } + else { + throw ex; + } + } + } + +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/model/Category.java b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Category.java new file mode 100644 index 00000000000..32427482d2a --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Category.java @@ -0,0 +1,52 @@ +package io.swagger.client.model; + + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +public class Category { + private Long id = null; + + //public enum idEnum { }; + + private String name = null; + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/model/Order.java b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Order.java new file mode 100644 index 00000000000..1b1c94c3910 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Order.java @@ -0,0 +1,116 @@ +package io.swagger.client.model; + +import java.util.Date; + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +public class Order { + private Long id = null; + + //public enum idEnum { }; + + private Long petId = null; + + //public enum petIdEnum { }; + + private Integer quantity = null; + + //public enum quantityEnum { }; + + private Date shipDate = null; + private String status = null; + private Boolean complete = null; + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("petId") + public Long getPetId() { + return petId; + } + public void setPetId(Long petId) { + this.petId = petId; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("quantity") + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("shipDate") + public Date getShipDate() { + return shipDate; + } + public void setShipDate(Date shipDate) { + this.shipDate = shipDate; + } + + + /** + * Order Status + **/ + @ApiModelProperty(required = false, value = "Order Status") + @JsonProperty("status") + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("complete") + public Boolean getComplete() { + return complete; + } + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" petId: ").append(petId).append("\n"); + sb.append(" quantity: ").append(quantity).append("\n"); + sb.append(" shipDate: ").append(shipDate).append("\n"); + sb.append(" status: ").append(status).append("\n"); + sb.append(" complete: ").append(complete).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/model/Pet.java b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Pet.java new file mode 100644 index 00000000000..fe374748c0a --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Pet.java @@ -0,0 +1,112 @@ +package io.swagger.client.model; + +import io.swagger.client.model.Category; +import io.swagger.client.model.Tag; +import java.util.*; + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +public class Pet { + private Long id = null; + + //public enum idEnum { }; + + private Category category = null; + private String name = null; + private List photoUrls = new ArrayList() ; + private List tags = new ArrayList() ; + private String status = null; + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("category") + public Category getCategory() { + return category; + } + public void setCategory(Category category) { + this.category = category; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + /** + **/ + @ApiModelProperty(required = true, value = "") + @JsonProperty("photoUrls") + public List getPhotoUrls() { + return photoUrls; + } + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("tags") + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + + /** + * pet status in the store + **/ + @ApiModelProperty(required = false, value = "pet status in the store") + @JsonProperty("status") + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" category: ").append(category).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append(" photoUrls: ").append(photoUrls).append("\n"); + sb.append(" tags: ").append(tags).append("\n"); + sb.append(" status: ").append(status).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/model/Tag.java b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Tag.java new file mode 100644 index 00000000000..862a736d604 --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/model/Tag.java @@ -0,0 +1,52 @@ +package io.swagger.client.model; + + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +public class Tag { + private Long id = null; + + //public enum idEnum { }; + + private String name = null; + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("name") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/client/petstore/java/src/main/java/io/swagger/client/model/User.java b/samples/client/petstore/java/src/main/java/io/swagger/client/model/User.java new file mode 100644 index 00000000000..024515e6b8c --- /dev/null +++ b/samples/client/petstore/java/src/main/java/io/swagger/client/model/User.java @@ -0,0 +1,140 @@ +package io.swagger.client.model; + + +import com.wordnik.swagger.annotations.*; +import com.fasterxml.jackson.annotation.JsonProperty; + + +@ApiModel(description = "") +public class User { + private Long id = null; + + //public enum idEnum { }; + + private String username = null; + private String firstName = null; + private String lastName = null; + private String email = null; + private String password = null; + private String phone = null; + private Integer userStatus = null; + + //public enum userStatusEnum { }; + + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("id") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("username") + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("firstName") + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("lastName") + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("email") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("password") + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + + /** + **/ + @ApiModelProperty(required = false, value = "") + @JsonProperty("phone") + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + + + /** + * User Status + **/ + @ApiModelProperty(required = false, value = "User Status") + @JsonProperty("userStatus") + public Integer getUserStatus() { + return userStatus; + } + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" username: ").append(username).append("\n"); + sb.append(" firstName: ").append(firstName).append("\n"); + sb.append(" lastName: ").append(lastName).append("\n"); + sb.append(" email: ").append(email).append("\n"); + sb.append(" password: ").append(password).append("\n"); + sb.append(" phone: ").append(phone).append("\n"); + sb.append(" userStatus: ").append(userStatus).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/README.md b/samples/server/petstore/jaxrs/README.md new file mode 100644 index 00000000000..f8a560b776f --- /dev/null +++ b/samples/server/petstore/jaxrs/README.md @@ -0,0 +1,10 @@ +# Swagger generated server + +## Overview +This server was generated by the [swagger-codegen](https://github.com/wordnik/swagger-codegen) project. By using the +[swagger-spec](https://github.com/wordnik/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +is an example of building a swagger-enabled scalatra server. + +This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: + +[README](https://github.com/wordnik/swagger-codegen/tree/master/samples/server-generator/scalatra) \ No newline at end of file diff --git a/samples/server/petstore/jaxrs/pom.xml b/samples/server/petstore/jaxrs/pom.xml new file mode 100644 index 00000000000..a8bb02cb557 --- /dev/null +++ b/samples/server/petstore/jaxrs/pom.xml @@ -0,0 +1,135 @@ + + 4.0.0 + io.swagger + swagger-server + jar + swagger-server + 1.0.0 + + src/main/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.mortbay.jetty + jetty-maven-plugin + ${jetty-version} + + + /v2 + + target/${project.artifactId}-${project.version} + ${project.basedir}/conf/jetty/webdefault.xml + 8079 + stopit + + + 8002 + 60000 + 8443 + + + + + + start-jetty + pre-integration-test + + run + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + + + + com.wordnik + swagger-jersey-jaxrs + ${swagger-core-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + com.sun.jersey + jersey-core + ${jersey-version} + + + com.sun.jersey + jersey-json + ${jersey-version} + + + com.sun.jersey + jersey-servlet + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.sun.jersey + jersey-server + ${jersey-version} + + + + org.scalatest + scalatest_2.9.1 + ${scala-test-version} + test + + + junit + junit + ${junit-version} + test + + + javax.servlet + servlet-api + ${servlet-api-version} + + + + 1.5.0-M1 + 8.1.11.v20130520 + 1.13 + 1.6.3 + 1.6.1 + 4.8.1 + 2.5 + + \ No newline at end of file diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiException.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiException.java new file mode 100644 index 00000000000..cae767c0393 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiException.java @@ -0,0 +1,9 @@ +package io.swagger.api; + +public class ApiException extends Exception{ + private int code; + public ApiException (int code, String msg) { + super(msg); + this.code = code; + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiOriginFilter.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiOriginFilter.java new file mode 100644 index 00000000000..c2eeacf13d3 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiOriginFilter.java @@ -0,0 +1,26 @@ +package io.swagger.api; + +import java.io.IOException; + +import javax.servlet.*; +import javax.servlet.http.HttpServletResponse; + +public class ApiOriginFilter implements javax.servlet.Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + HttpServletResponse res = (HttpServletResponse) response; + res.addHeader("Access-Control-Allow-Origin", "*"); + res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); + res.addHeader("Access-Control-Allow-Headers", "Content-Type"); + chain.doFilter(request, response); + } + + @Override + public void destroy() { + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } +} \ No newline at end of file diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiResponseMessage.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiResponseMessage.java new file mode 100644 index 00000000000..9e5b0ee44e2 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/ApiResponseMessage.java @@ -0,0 +1,68 @@ +package io.swagger.api; + +import javax.xml.bind.annotation.XmlTransient; + +@javax.xml.bind.annotation.XmlRootElement +public class ApiResponseMessage { + public static final int ERROR = 1; + public static final int WARNING = 2; + public static final int INFO = 3; + public static final int OK = 4; + public static final int TOO_BUSY = 5; + + int code; + String type; + String message; + + public ApiResponseMessage(){} + + public ApiResponseMessage(int code, String message){ + this.code = code; + switch(code){ + case ERROR: + setType("error"); + break; + case WARNING: + setType("warning"); + break; + case INFO: + setType("info"); + break; + case OK: + setType("ok"); + break; + case TOO_BUSY: + setType("too busy"); + break; + default: + setType("unknown"); + break; + } + this.message = message; + } + + @XmlTransient + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/NotFoundException.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/NotFoundException.java new file mode 100644 index 00000000000..9c8410e47ab --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/NotFoundException.java @@ -0,0 +1,9 @@ +package io.swagger.api; + +public class NotFoundException extends ApiException { + private int code; + public NotFoundException (int code, String msg) { + super(code, msg); + this.code = code; + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/PetApi.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/PetApi.java new file mode 100644 index 00000000000..9aef181a3f6 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/PetApi.java @@ -0,0 +1,141 @@ +package io.swagger.api; + +import io.swagger.model.*; + +import com.wordnik.swagger.annotations.*; +import com.sun.jersey.multipart.FormDataParam; + +import io.swagger.model.Pet; + +import java.util.List; +import io.swagger.api.NotFoundException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.*; + +@Path("/pet") +@Api(value = "/pet", description = "the pet API") +public class PetApi { + + @PUT + + @Consumes({ "application/json", "application/xml" }) + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Update an existing pet", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Validation exception"), + + @ApiResponse(code = 404, message = "Pet not found"), + + @ApiResponse(code = 400, message = "Invalid ID supplied") }) + + public Response updatePet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @POST + + @Consumes({ "application/json", "application/xml" }) + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Add a new pet to the store", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + + public Response addPet(@ApiParam(value = "Pet object that needs to be added to the store" ) Pet body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/findByStatus") + + @Produces({ "application/json", "application/xml" }) + // Pet + @ApiOperation(value = "Finds Pets by status", notes = "Multiple status values can be provided with comma seperated strings", response = Pet.class, responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid status value") }) + + public Response findPetsByStatus(@ApiParam(value = "Status values that need to be considered for filter") @QueryParam("status") List status) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/findByTags") + + @Produces({ "application/json", "application/xml" }) + // Pet + @ApiOperation(value = "Finds Pets by tags", notes = "Muliple tags can be provided with comma seperated strings. Use tag1, tag2, tag3 for testing.", response = Pet.class, responseContainer = "List") + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid tag value") }) + + public Response findPetsByTags(@ApiParam(value = "Tags to filter by") @QueryParam("tags") List tags) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/{petId}") + + @Produces({ "application/json", "application/xml" }) + // Pet + @ApiOperation(value = "Find pet by ID", notes = "Returns a pet when ID < 10. ID > 10 or nonintegers will simulate API error conditions", response = Pet.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "Pet not found"), + + @ApiResponse(code = 400, message = "Invalid ID supplied") }) + + public Response getPetById(@ApiParam(value = "ID of pet that needs to be fetched",required=true ) @PathParam("petId") Long petId) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @POST + @Path("/{petId}") + @Consumes({ "application/x-www-form-urlencoded" }) + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Updates a pet in the store with form data", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 405, message = "Invalid input") }) + + public Response updatePetWithForm(@ApiParam(value = "ID of pet that needs to be updated",required=true ) @PathParam("petId") String petId, + @ApiParam(value = "Updated name of the pet" )@FormParam("name") String name, + @ApiParam(value = "Updated status of the pet" )@FormParam("status") String status) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @DELETE + @Path("/{petId}") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Deletes a pet", notes = "", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid pet value") }) + + public Response deletePet(@ApiParam(value = "" )@HeaderParam("api_key") String api_key, + @ApiParam(value = "Pet id to delete",required=true ) @PathParam("petId") Long petId) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/StoreApi.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/StoreApi.java new file mode 100644 index 00000000000..1706d633258 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/StoreApi.java @@ -0,0 +1,88 @@ +package io.swagger.api; + +import io.swagger.model.*; + +import com.wordnik.swagger.annotations.*; +import com.sun.jersey.multipart.FormDataParam; + +import java.util.Map; +import io.swagger.model.Order; + +import java.util.List; +import io.swagger.api.NotFoundException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.*; + +@Path("/store") +@Api(value = "/store", description = "the store API") +public class StoreApi { + + @GET + @Path("/inventory") + + @Produces({ "application/json", "application/xml" }) + // Integer + @ApiOperation(value = "Returns pet inventories by status", notes = "Returns a map of status codes to quantities", response = Integer.class) + @ApiResponses(value = { }) + + public Response getInventory() + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @POST + @Path("/order") + + @Produces({ "application/json", "application/xml" }) + // Order + @ApiOperation(value = "Place an order for a pet", notes = "", response = Order.class) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid Order") }) + + public Response placeOrder(@ApiParam(value = "order placed for purchasing the pet" ) Order body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/order/{orderId}") + + @Produces({ "application/json", "application/xml" }) + // Order + @ApiOperation(value = "Find purchase order by ID", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions", response = Order.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "Order not found"), + + @ApiResponse(code = 400, message = "Invalid ID supplied") }) + + public Response getOrderById(@ApiParam(value = "ID of pet that needs to be fetched",required=true ) @PathParam("orderId") String orderId) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @DELETE + @Path("/order/{orderId}") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Delete purchase order by ID", notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "Order not found"), + + @ApiResponse(code = 400, message = "Invalid ID supplied") }) + + public Response deleteOrder(@ApiParam(value = "ID of the order that needs to be deleted",required=true ) @PathParam("orderId") String orderId) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/UserApi.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/UserApi.java new file mode 100644 index 00000000000..b98f79880ba --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/api/UserApi.java @@ -0,0 +1,153 @@ +package io.swagger.api; + +import io.swagger.model.*; + +import com.wordnik.swagger.annotations.*; +import com.sun.jersey.multipart.FormDataParam; + +import io.swagger.model.User; +import java.util.*; + +import java.util.List; +import io.swagger.api.NotFoundException; + +import javax.ws.rs.core.Response; +import javax.ws.rs.*; + +@Path("/user") +@Api(value = "/user", description = "the user API") +public class UserApi { + + @POST + + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Create user", notes = "This can only be done by the logged in user.", response = Void.class) + @ApiResponses(value = { }) + + public Response createUser(@ApiParam(value = "Created user object" ) User body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @POST + @Path("/createWithArray") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Creates list of users with given input array", notes = "", response = Void.class) + @ApiResponses(value = { }) + + public Response createUsersWithArrayInput(@ApiParam(value = "List of user object" ) List body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @POST + @Path("/createWithList") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Creates list of users with given input array", notes = "", response = Void.class) + @ApiResponses(value = { }) + + public Response createUsersWithListInput(@ApiParam(value = "List of user object" ) List body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/login") + + @Produces({ "application/json", "application/xml" }) + // String + @ApiOperation(value = "Logs user into the system", notes = "", response = String.class) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Invalid username/password supplied") }) + + public Response loginUser(@ApiParam(value = "The user name for login") @QueryParam("username") String username, + @ApiParam(value = "The password for login in clear text") @QueryParam("password") String password) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/logout") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Logs out current logged in user session", notes = "", response = Void.class) + @ApiResponses(value = { }) + + public Response logoutUser() + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @GET + @Path("/{username}") + + @Produces({ "application/json", "application/xml" }) + // User + @ApiOperation(value = "Get user by user name", notes = "", response = User.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "User not found"), + + @ApiResponse(code = 400, message = "Invalid username supplied") }) + + public Response getUserByName(@ApiParam(value = "The name that needs to be fetched. Use user1 for testing. ",required=true ) @PathParam("username") String username) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @PUT + @Path("/{username}") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Updated user", notes = "This can only be done by the logged in user.", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "User not found"), + + @ApiResponse(code = 400, message = "Invalid user supplied") }) + + public Response updateUser(@ApiParam(value = "name that need to be deleted",required=true ) @PathParam("username") String username, + @ApiParam(value = "Updated user object" ) User body) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + + @DELETE + @Path("/{username}") + + @Produces({ "application/json", "application/xml" }) + // Void + @ApiOperation(value = "Delete user", notes = "This can only be done by the logged in user.", response = Void.class) + @ApiResponses(value = { + @ApiResponse(code = 404, message = "User not found"), + + @ApiResponse(code = 400, message = "Invalid username supplied") }) + + public Response deleteUser(@ApiParam(value = "The name that needs to be deleted",required=true ) @PathParam("username") String username) + throws NotFoundException { + // do some magic! + return Response.ok().entity(new ApiResponseMessage(ApiResponseMessage.OK, "magic!")).build(); + } + + +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Category.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Category.java new file mode 100644 index 00000000000..e6a7f9e1c7c --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Category.java @@ -0,0 +1,46 @@ +package io.swagger.model; + + +import com.wordnik.swagger.annotations.*; + + +@ApiModel(description = "") +public class Category { + /** + **/ + private Long id = null; + /** + **/ + private String name = null; + + + @ApiModelProperty(required = false, value = "") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @ApiModelProperty(required = false, value = "") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Category {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Order.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Order.java new file mode 100644 index 00000000000..edbc5250df0 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Order.java @@ -0,0 +1,100 @@ +package io.swagger.model; + +import java.util.Date; + +import com.wordnik.swagger.annotations.*; + + +@ApiModel(description = "") +public class Order { + /** + **/ + private Long id = null; + /** + **/ + private Long petId = null; + /** + **/ + private Integer quantity = null; + /** + **/ + private Date shipDate = null; + /** + * Order Status + **/ + private String status = null; + /** + **/ + private Boolean complete = null; + + + @ApiModelProperty(required = false, value = "") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @ApiModelProperty(required = false, value = "") + public Long getPetId() { + return petId; + } + public void setPetId(Long petId) { + this.petId = petId; + } + + + @ApiModelProperty(required = false, value = "") + public Integer getQuantity() { + return quantity; + } + public void setQuantity(Integer quantity) { + this.quantity = quantity; + } + + + @ApiModelProperty(required = false, value = "") + public Date getShipDate() { + return shipDate; + } + public void setShipDate(Date shipDate) { + this.shipDate = shipDate; + } + + + @ApiModelProperty(required = false, value = "Order Status") + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + + @ApiModelProperty(required = false, value = "") + public Boolean getComplete() { + return complete; + } + public void setComplete(Boolean complete) { + this.complete = complete; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Order {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" petId: ").append(petId).append("\n"); + sb.append(" quantity: ").append(quantity).append("\n"); + sb.append(" shipDate: ").append(shipDate).append("\n"); + sb.append(" status: ").append(status).append("\n"); + sb.append(" complete: ").append(complete).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Pet.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Pet.java new file mode 100644 index 00000000000..b8de517cb78 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Pet.java @@ -0,0 +1,102 @@ +package io.swagger.model; + +import io.swagger.model.Category; +import io.swagger.model.Tag; +import java.util.*; + +import com.wordnik.swagger.annotations.*; + + +@ApiModel(description = "") +public class Pet { + /** + **/ + private Long id = null; + /** + **/ + private Category category = null; + /** + **/ + private String name = null; + /** + **/ + private List photoUrls = new ArrayList() ; + /** + **/ + private List tags = new ArrayList() ; + /** + * pet status in the store + **/ + private String status = null; + + + @ApiModelProperty(required = false, value = "") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @ApiModelProperty(required = false, value = "") + public Category getCategory() { + return category; + } + public void setCategory(Category category) { + this.category = category; + } + + + @ApiModelProperty(required = true, value = "") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + @ApiModelProperty(required = true, value = "") + public List getPhotoUrls() { + return photoUrls; + } + public void setPhotoUrls(List photoUrls) { + this.photoUrls = photoUrls; + } + + + @ApiModelProperty(required = false, value = "") + public List getTags() { + return tags; + } + public void setTags(List tags) { + this.tags = tags; + } + + + @ApiModelProperty(required = false, value = "pet status in the store") + public String getStatus() { + return status; + } + public void setStatus(String status) { + this.status = status; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Pet {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" category: ").append(category).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append(" photoUrls: ").append(photoUrls).append("\n"); + sb.append(" tags: ").append(tags).append("\n"); + sb.append(" status: ").append(status).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Tag.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Tag.java new file mode 100644 index 00000000000..ee3ad3baeb9 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/Tag.java @@ -0,0 +1,46 @@ +package io.swagger.model; + + +import com.wordnik.swagger.annotations.*; + + +@ApiModel(description = "") +public class Tag { + /** + **/ + private Long id = null; + /** + **/ + private String name = null; + + + @ApiModelProperty(required = false, value = "") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @ApiModelProperty(required = false, value = "") + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class Tag {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/User.java b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/User.java new file mode 100644 index 00000000000..0cf49ba9684 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/java/io/swagger/model/User.java @@ -0,0 +1,125 @@ +package io.swagger.model; + + +import com.wordnik.swagger.annotations.*; + + +@ApiModel(description = "") +public class User { + /** + **/ + private Long id = null; + /** + **/ + private String username = null; + /** + **/ + private String firstName = null; + /** + **/ + private String lastName = null; + /** + **/ + private String email = null; + /** + **/ + private String password = null; + /** + **/ + private String phone = null; + /** + * User Status + **/ + private Integer userStatus = null; + + + @ApiModelProperty(required = false, value = "") + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + + + @ApiModelProperty(required = false, value = "") + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + + @ApiModelProperty(required = false, value = "") + public String getFirstName() { + return firstName; + } + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + + @ApiModelProperty(required = false, value = "") + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + + @ApiModelProperty(required = false, value = "") + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + + @ApiModelProperty(required = false, value = "") + public String getPassword() { + return password; + } + public void setPassword(String password) { + this.password = password; + } + + + @ApiModelProperty(required = false, value = "") + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + + + @ApiModelProperty(required = false, value = "User Status") + public Integer getUserStatus() { + return userStatus; + } + public void setUserStatus(Integer userStatus) { + this.userStatus = userStatus; + } + + + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class User {\n"); + + sb.append(" id: ").append(id).append("\n"); + sb.append(" username: ").append(username).append("\n"); + sb.append(" firstName: ").append(firstName).append("\n"); + sb.append(" lastName: ").append(lastName).append("\n"); + sb.append(" email: ").append(email).append("\n"); + sb.append(" password: ").append(password).append("\n"); + sb.append(" phone: ").append(phone).append("\n"); + sb.append(" userStatus: ").append(userStatus).append("\n"); + sb.append("}\n"); + return sb.toString(); + } +} diff --git a/samples/server/petstore/jaxrs/src/main/webapp/WEB-INF/web.xml b/samples/server/petstore/jaxrs/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 00000000000..2708ad5dd48 --- /dev/null +++ b/samples/server/petstore/jaxrs/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,54 @@ + + + + + jersey + com.sun.jersey.spi.container.servlet.ServletContainer + + com.sun.jersey.config.property.packages + com.wordnik.swagger.jaxrs.json;com.wordnik.swagger.jaxrs.listing;io.swagger.api + + + com.sun.jersey.spi.container.ContainerRequestFilters + com.sun.jersey.api.container.filter.PostReplaceFilter + + + com.sun.jersey.api.json.POJOMappingFeature + true + + 1 + + + + DefaultJaxrsConfig + com.wordnik.swagger.jaxrs.config.DefaultJaxrsConfig + + api.version + 1.0.0 + + + swagger.api.title + Swagger Server + + + swagger.api.basepath + http://localhost:8002 + + 2 + + + + jersey + /* + + + ApiOriginFilter + io.swagger.api.ApiOriginFilter + + + ApiOriginFilter + /* + + diff --git a/samples/swagger-dynamic-html/docs/index.html b/samples/swagger-dynamic-html/docs/index.html index 3fc58893379..e6c5488d455 100644 --- a/samples/swagger-dynamic-html/docs/index.html +++ b/samples/swagger-dynamic-html/docs/index.html @@ -90,6 +90,8 @@
    +
  • getInventory
  • +
  • placeOrder
  • getOrderById
  • diff --git a/samples/swagger-dynamic-html/docs/operations/StoreApi.html b/samples/swagger-dynamic-html/docs/operations/StoreApi.html index 75bd19e01a3..ecfa5fef653 100644 --- a/samples/swagger-dynamic-html/docs/operations/StoreApi.html +++ b/samples/swagger-dynamic-html/docs/operations/StoreApi.html @@ -4,6 +4,21 @@ +

    getInventory

    +
    +

    +

    Returns a map of status codes to quantities

    +

    URL

    + http://petstore.swagger.wordnik.com/v2/store/inventory +

    HTTP Method

    + GET +

    Response Type

    + +

    Parameters

    +
      + +
    +

    placeOrder


    diff --git a/samples/swagger-html/index.html b/samples/swagger-html/index.html index 077295b4a9e..2fc19ee462a 100644 --- a/samples/swagger-html/index.html +++ b/samples/swagger-html/index.html @@ -292,8 +292,12 @@
    petId (required)
    Path Parameter — ID of pet that needs to be updated
    - - +
    name (optional)
    + +
    Form Parameter — Updated name of the pet
    +
    status (optional)
    + +
    Form Parameter — Updated status of the pet

    Return type

    @@ -311,7 +315,7 @@

    Parameters

    -
    api_key (required)
    +
    api_key (optional)
    Header Parameter
    petId (required)
    @@ -329,6 +333,23 @@ +
    +
    get: /store/inventory
    +
    getInventory Returns pet inventories by status
    +
    Returns a map of status codes to quantities
    + +

    Parameters

    +
    + +
    +

    Return type

    + + + + +
    +
    +
    post: /store/order
    placeOrder Place an order for a pet