diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index cafebac..9c9c361 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -15,5 +15,7 @@ swagger.api { contact = "" license = "" licenseUrl = "http://licenseUrl" # needs to be a valid url to validate against schema + x-api-key: "test" + x-tags: ["api", "secure"] } } diff --git a/src/main/scala/play/modules/swagger/PlayApiScanner.scala b/src/main/scala/play/modules/swagger/PlayApiScanner.scala index 2a430cf..a26edc5 100644 --- a/src/main/scala/play/modules/swagger/PlayApiScanner.scala +++ b/src/main/scala/play/modules/swagger/PlayApiScanner.scala @@ -52,6 +52,12 @@ class PlayApiScanner @Inject()(config: PlaySwaggerConfig, routes: RouteWrapper, .name(config.license) .url(config.licenseUrl)) } + + val vendorExtensions = config.vendorExtensions.map { extension => + extension.name -> extension.value + }.toMap.asJava + + info.setVendorExtensions(vendorExtensions) swagger.info(info) } diff --git a/src/main/scala/play/modules/swagger/PlaySwaggerConfig.scala b/src/main/scala/play/modules/swagger/PlaySwaggerConfig.scala index a5a11cb..2686242 100644 --- a/src/main/scala/play/modules/swagger/PlaySwaggerConfig.scala +++ b/src/main/scala/play/modules/swagger/PlaySwaggerConfig.scala @@ -4,6 +4,10 @@ import com.typesafe.config.Config import javax.annotation.Nullable import play.api.Configuration +import scala.collection.JavaConverters._ + +case class Extension(name: String, value: AnyRef) + case class PlaySwaggerConfig( title: String, version: String, @@ -15,7 +19,8 @@ case class PlaySwaggerConfig( host: String, basePath: String, schemes: Seq[String], - filterClass: Option[String] + filterClass: Option[String], + vendorExtensions: List[Extension] ) { // Java APIs for reading the configuration def getSchemes: Array[String] = schemes.toArray @@ -37,7 +42,12 @@ object PlaySwaggerConfig { termsOfServiceUrl = configuration.get[String]("swagger.api.info.termsOfServiceUrl"), license = configuration.get[String]("swagger.api.info.license"), licenseUrl = configuration.get[String]("swagger.api.info.licenseUrl"), - filterClass = configuration.get[Option[String]]("swagger.filter") + filterClass = configuration.get[Option[String]]("swagger.filter"), + vendorExtensions = configuration.get[Option[Config]]("swagger.api.info").toList.map(_.entrySet()).flatMap { entries => + entries.asScala.filter(_.getKey.startsWith("x-")).map { entry => + Extension(entry.getKey, entry.getValue.unwrapped()) + }.toList.reverse + } ) } diff --git a/src/test/scala/PlayApiListingCacheSpec.scala b/src/test/scala/PlayApiListingCacheSpec.scala index 1b2cf46..f92a038 100644 --- a/src/test/scala/PlayApiListingCacheSpec.scala +++ b/src/test/scala/PlayApiListingCacheSpec.scala @@ -1,5 +1,6 @@ import java.io.File +import com.typesafe.config.ConfigValueFactory import io.swagger.config.ScannerFactory import io.swagger.models.{HttpMethod, ModelImpl} import io.swagger.models.parameters.{BodyParameter, PathParameter, QueryParameter} @@ -57,7 +58,8 @@ PUT /api/dog/api/:id testdata.DogController.add0(id:String) license = "license", licenseUrl = "http://licenseUrl", filterClass = None, - schemes = Seq.empty + schemes = Seq.empty, + vendorExtensions = List(Extension("x-api-key","test"), Extension("x-tags", java.util.Arrays.asList("api", "secure","test"))) ) val env = Environment.simple() @@ -90,6 +92,7 @@ PUT /api/dog/api/:id testdata.DogController.add0(id:String) swagger.getInfo.getTermsOfService must beEqualTo(swaggerConfig.termsOfServiceUrl) swagger.getInfo.getLicense.getName must beEqualTo(swaggerConfig.license) swagger.getSecurityDefinitions.size() must beEqualTo(1) + swagger.getInfo.getVendorExtensions.size() must beEqualTo(2) val pathDoc = swagger.getPaths.get("/document/{settlementId}/files/{fileId}/accept") pathDoc.getOperations.size must beEqualTo(1)