[
  {
    "path": ".gitattributes",
    "content": "#\n# https://help.github.com/articles/dealing-with-line-endings/\n#\n# These are explicitly windows files and should use crlf\n*.bat           text eol=crlf\n\n"
  },
  {
    "path": ".gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache\n# Ignore Gradle project-specific cache directory\n.gradle\n\n# Ignore Gradle build output directory\nbuild\n"
  },
  {
    "path": "Jenkinsfile",
    "content": "#!/usr/bin/env groovy\n\nnode {\n\tstage('checkout') {\n\t\tdeleteDir()\n\t\tcheckout scm\n\t}\n\tstage('Clean') {\n\t\twithMaven(jdk: 'java-17', maven: 'maven-3.8.4'){\n\t\t\t\tsh \"mvn clean -T100\"\n\t\t}\n\t}\n\tstage('Package') {\n\t\twithMaven(jdk: 'java-17', maven: 'maven-3.8.4'){\n\t\t\tsh \"mvn -Pjib package jib:build -T100\"\n\t\t}\n\t}\n\tstage(\"Deploy\") {\n\t\tbuild 'springdoc-openapi-demos-v2-deploy'\n\t\tdeleteDir()\n\t}\n}\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://ci-cd.springdoc.org:8443/buildStatus/icon?job=springdoc-openapi-demos%2Fmaster)](https://ci-cd.springdoc.org:8443/view/springdoc-openapi-demos/job/springdoc-openapi-demos/job/master/)\n\n\n# Spring-boot with OpenAPI Demo applications.\n\n## [Demo Spring Boot 3 Web MVC with OpenAPI 3](https://demos.springdoc.org/demo-spring-boot-3-webmvc).\n\n## [Demo Spring Boot 3 WebFlux with OpenAPI 3](https://demos.springdoc.org/demo-spring-boot-3-webflux/swagger-ui.html).\n\n## [Demo Spring Boot 3 Web MVC with OpenAPI 3 and Scalar](https://demos.springdoc.org/demo-spring-boot-webmvc-scalar/scalar).\n\n## [Demo Spring Boot 3 WebFlux with OpenAPI 3 and Scalar](https://demos.springdoc.org/demo-spring-boot-webflux-scalar/scalar).\n\n## [Demo Spring Boot 3 WebFlux with Functional endpoints OpenAPI 3](https://demos.springdoc.org/demo-spring-boot-3-webflux-functional/swagger-ui.html).\n\n## [Demo Spring Boot 3 and Spring Cloud Function Web MVC](https://demos.springdoc.org/spring-cloud-function-webmvc).\n\n## [Demo Spring Boot 3 and Spring Cloud Function WebFlux](https://demos.springdoc.org/spring-cloud-function-webflux/swagger-ui.html).\n\n## [Demo Spring Boot 3 and Spring Cloud Gateway](https://demos.springdoc.org/demo-microservices/swagger-ui.html).\n\n\n![Branching](https://springdoc.org/img/pets.png)\n\n# **Thank you for the support**\n\n* Thanks a lot [JetBrains](https://www.jetbrains.com/?from=springdoc-openapi) for\n  supporting springdoc-openapi project.\n\n![JenBrains logo](https://springdoc.org/img/jetbrains.svg)\n\n\n\n\n\n"
  },
  {
    "path": "SUPPORT.md",
    "content": "## Where to get help\n\nIf you think you've found a bug in The Architect Theme,\nplease [check the existing issues](https://github.com/pages-themes/architect/issues), and\nif no one has reported the\nproblem, [open a new issue](https://github.com/pages-themes/architect/issues/new).\n\nIf you have a general question about the theme, how to implement it, or how to customize\nit for your site you have two options:\n\n1. [Contact GitHub Support](https://github.com/contact?form%5Bsubject%5D=GitHub%20Pages%20theme%20pages-themes/architect)\n   , or\n\n2. Ask your question of the Jekyll community\n   on [talk.jekyllrb.com](https://talk.jekyllrb.com/)"
  },
  {
    "path": "demo-book-service/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-book-service/README.md",
    "content": "### Relevant Articles:\n\n- [Documenting a Spring REST API Using OpenAPI 3.0](https://www.baeldung.com/spring-rest-openapi-documentation)\n\n"
  },
  {
    "path": "demo-book-service/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-book-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t\t<!-- Runtime library -->\n\t\t<dependency>\n\t\t\t<groupId>com.github.therapi</groupId>\n\t\t\t<artifactId>therapi-runtime-javadoc</artifactId>\n\t\t\t<version>0.15.0</version>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<annotationProcessorPaths>\n\t\t\t\t\t\t<path>\n\t\t\t\t\t\t\t<groupId>com.github.therapi</groupId>\n\t\t\t\t\t\t\t<artifactId>therapi-runtime-javadoc-scribe</artifactId>\n\t\t\t\t\t\t\t<version>0.15.0</version>\n\t\t\t\t\t\t</path>\n\t\t\t\t\t</annotationProcessorPaths>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/SpringdocApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SpringdocApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringdocApplication.class, args);\n\t}\n\n\n}\n"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/controller/BookController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.controller;\n\nimport java.util.Collection;\n\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport org.springdoc.demo.services.book.exception.BookNotFoundException;\nimport org.springdoc.demo.services.book.model.Book;\nimport org.springdoc.demo.services.book.repository.BookRepository;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PatchMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * The type Book controller.\n */\n@RestController\n@RequestMapping(\"/api/book\")\npublic class BookController {\n\n\t/**\n\t * The Repository.\n\t */\n\tprivate final BookRepository repository;\n\n\t/**\n\t * Instantiates a new Book controller.\n\t *\n\t * @param repository the repository\n\t */\n\tpublic BookController(BookRepository repository) {\n\t\tthis.repository = repository;\n\t}\n\n\t/**\n\t * Find by id book.\n\t *\n\t * @param id the id\n\t * @return the book\n\t */\n\t@GetMapping(\"/{id}\")\n\tpublic Book findById(@PathVariable long id) {\n\t\treturn repository.findById(id)\n\t\t\t\t.orElseThrow(() -> new BookNotFoundException());\n\t}\n\n\t/**\n\t * Find books collection.\n\t *\n\t * @return the collection\n\t */\n\t@GetMapping(\"/\")\n\tpublic Collection<Book> findBooks() {\n\t\treturn repository.getBooks();\n\t}\n\n\t/**\n\t * Update book book.\n\t *\n\t * @param id   the id\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PutMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book updateBook(@PathVariable(\"id\") final String id, @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Patch book book.\n\t *\n\t * @param id   the id\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PatchMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book patchBook(@PathVariable(\"id\") final String id, @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Post book book.\n\t *\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PostMapping(\"/\")\n\t@ResponseStatus(HttpStatus.CREATED)\n\tpublic Book postBook(@NotNull @Valid @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Head book book.\n\t *\n\t * @return the book\n\t */\n\t@RequestMapping(method = RequestMethod.HEAD, value = \"/\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book headBook() {\n\t\treturn new Book();\n\t}\n\n\t/**\n\t * Delete book long.\n\t *\n\t * @param id the id\n\t * @return the long\n\t */\n\t@DeleteMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic long deleteBook(@PathVariable final long id) {\n\t\treturn id;\n\t}\n}\n"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/exception/BookNotFoundException.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.exception;\n\n@SuppressWarnings(\"serial\")\npublic class BookNotFoundException extends RuntimeException {\n\n\tpublic BookNotFoundException() {\n\n\t}\n\n}"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/exception/GlobalControllerExceptionHandler.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.exception;\n\nimport java.time.Instant;\n\nimport org.springframework.core.convert.ConversionFailedException;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ProblemDetail;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;\n\n@RestControllerAdvice\npublic class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler {\n\n\t@ExceptionHandler(ConversionFailedException.class)\n\t@ResponseStatus(HttpStatus.BAD_REQUEST)\n\tpublic ProblemDetail handleConnversion(RuntimeException e) {\n\t\tProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getMessage());\n\t\tproblemDetail.setTitle(\"Bookmark is Not Found\");\n\t\tproblemDetail.setProperty(\"errorCategory\", \"Generic Exception\");\n\t\tproblemDetail.setProperty(\"timestamp\", Instant.now());\n\t\treturn problemDetail;\n\t}\n\n\t@ExceptionHandler(BookNotFoundException.class)\n\t@ResponseStatus(HttpStatus.NOT_FOUND)\n\tpublic ProblemDetail handleBookNotFound(RuntimeException e) {\n\t\tProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, e.getMessage());\n\t\tproblemDetail.setTitle(\"Book Not Found\");\n\t\tproblemDetail.setProperty(\"errorCategory\", \"Generic Exception\");\n\t\tproblemDetail.setProperty(\"timestamp\", Instant.now());\n\t\treturn problemDetail;\n\t}\n}\n"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/model/Book.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.model;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\n\n/**\n * The type Book.\n */\npublic class Book {\n\n\t/**\n\t * The Id.\n\t */\n\tprivate long id;\n\n\t/**\n\t * The Title.\n\t */\n\t@NotBlank\n\t@Size(min = 0, max = 20)\n\tprivate String title;\n\n\t/**\n\t * The Author.\n\t */\n\t@NotBlank\n\t@Size(min = 0, max = 30)\n\tprivate String author;\n\n\t/**\n\t * Gets id.\n\t *\n\t * @return the id\n\t */\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\t/**\n\t * Sets id.\n\t *\n\t * @param id the id\n\t */\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\t/**\n\t * Gets title.\n\t *\n\t * @return the title\n\t */\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\t/**\n\t * Sets title.\n\t *\n\t * @param title the title\n\t */\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\t/**\n\t * Gets author.\n\t *\n\t * @return the author\n\t */\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\n\t/**\n\t * Sets author.\n\t *\n\t * @param author the author\n\t */\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n}\n"
  },
  {
    "path": "demo-book-service/src/main/java/org/springdoc/demo/services/book/repository/BookRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.repository;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\n\nimport org.springdoc.demo.services.book.model.Book;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class BookRepository {\n\n\tprivate Map<Long, Book> books = new HashMap<>();\n\n\tpublic Optional<Book> findById(long id) {\n\t\treturn Optional.ofNullable(books.get(id));\n\t}\n\n\tpublic void add(Book book) {\n\t\tbooks.put(book.getId(), book);\n\t}\n\n\tpublic Collection<Book> getBooks() {\n\t\treturn books.values();\n\t}\n}\n"
  },
  {
    "path": "demo-book-service/src/main/resources/application.yml",
    "content": "server:\n  forward-headers-strategy: framework\n\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true"
  },
  {
    "path": "demo-book-service/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<logger name=\"org.springframework\" level=\"INFO\"/>\n\t<logger name=\"org.springframework.transaction\" level=\"WARN\"/>\n\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\"/>\n\t</root>\n</configuration>"
  },
  {
    "path": "demo-book-service/src/test/java/org/springdoc/demo/services/book/SwaggerUnitTest.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book;\n\n\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupiter.api.Test;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.web.servlet.MockMvc;\nimport org.springframework.test.web.servlet.MvcResult;\n\nimport static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;\nimport static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;\n\n@AutoConfigureMockMvc\n@SpringBootTest\npublic class SwaggerUnitTest {\n\n\t@Autowired\n\tprotected MockMvc mockMvc;\n\n\t@Test\n\tpublic void shouldDisplaySwaggerUiPage() throws Exception {\n\t\tMvcResult mvcResult = mockMvc.perform(get(\"/swagger-ui/index.html\")).andExpect(status().isOk()).andReturn();\n\t\tString contentAsString = mvcResult.getResponse().getContentAsString();\n\t\tAssertions.assertTrue(contentAsString.contains(\"Swagger UI\"));\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-microservices/README.md",
    "content": "## sample microservices architecture using spring-cloud-gateway/eureka/spring-cloud-config\n\n### Relevant information:\n\n* Swagger-ui : http://localhost:8060/swagger-ui.html\n* Eureka: http://localhost:8761/\n\n"
  },
  {
    "path": "demo-microservices/config-service/.gitignore",
    "content": "/target/\n/.classpath\n/.project\n/.settings/\n"
  },
  {
    "path": "demo-microservices/config-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<artifactId>config-service</artifactId>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-config-server</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/config-service/src/main/java/org/springdoc/demo/services/config/ConfigApplication.java",
    "content": "package org.springdoc.demo.services.config;\n\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.cloud.config.server.EnableConfigServer;\n\n@SpringBootApplication\n@EnableConfigServer\npublic class ConfigApplication {\n\n\tpublic static void main(String[] args) {\n\t\tnew SpringApplicationBuilder(ConfigApplication.class).run(args);\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/application.yml",
    "content": "server:\n  port: 8088\nspring:\n  profiles:\n    active: native"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/config/department-service.yml",
    "content": "server:\n  port: 8090\n  forward-headers-strategy: framework\neureka:\n  client:\n    serviceUrl:\n      defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka}\n  instance:\n    preferIpAddress: true\n\nlogging:\n  pattern:\n    console: \"%d{yyyy-MM-dd HH:mm:ss} ${LOG_LEVEL_PATTERN:-%5p} %m%n\"\n\nspringdoc:\n  cache:\n    disabled: true\n  version: '@springdoc.version@'"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/config/discovery-service.yml",
    "content": "server:\n  port: 8761\n  forward-headers-strategy: framework\neureka:\n  client:\n    serviceUrl:\n      defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka}\n    registerWithEureka: false\n    fetchRegistry: false"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/config/employee-service.yml",
    "content": "server:\n  port: 8092\n  forward-headers-strategy: framework\neureka:\n  client:\n    serviceUrl:\n      defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka}\n  instance:\n    preferIpAddress: true\n\nlogging:\n  pattern:\n    console: \"%d{yyyy-MM-dd HH:mm:ss} ${LOG_LEVEL_PATTERN:-%5p} %m%n\"\n\nspringdoc:\n  version: '@springdoc.version@'\n  cache:\n    disabled: true"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/config/gateway-service.yml",
    "content": "server:\n  port: 8060\n  forward-headers-strategy: framework\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka}\n  instance:\n    preferIpAddress: true\n\nlogging:\n  pattern:\n    console: \"%d{yyyy-MM-dd HH:mm:ss} ${LOG_LEVEL_PATTERN:-%5p} %m%n\"\n  level:\n    org.springframework.cloud.gateway: TRACE\n    org.springframework.http.server.reactive: TRACE\n\nspring:\n  cloud:\n    gateway:\n      server:\n        webflux:\n          trusted-proxies: \"192\\\\.168\\\\.0\\\\..*|10\\\\.88\\\\.0\\\\..*|127\\\\.0\\\\.0\\\\.1|144\\\\.24\\\\.171\\\\.248\"\n          httpclient:\n            ssl:\n              useInsecureTrustManager: true\n          discovery:\n            locator:\n              enabled: true\n          routes:\n            - id: employee-service\n              uri: lb://employee-service\n              predicates:\n                - Path=/employee/**, /demo-microservices/employee/**\n              filters:\n                - ContextPathRewritePath=/demo-microservices/employee/(?<path>.*), /$\\{path}\n                - RewritePath=/employee/(?<path>.*), /$\\{path}\n            - id: department-service\n              uri: lb://department-service\n              predicates:\n                - Path=/department/**, /demo-microservices/department/**\n              filters:\n                - ContextPathRewritePath=/demo-microservices/department/(?<path>.*), /$\\{path}\n                - RewritePath=/department/(?<path>.*), /$\\{path}\n            - id: organization-service\n              uri: lb://organization-service\n              predicates:\n                - Path=/organization/**, /demo-microservices/organization/**\n              filters:\n                - ContextPathRewritePath=/demo-microservices/organization/(?<path>.*), /$\\{path}\n                - RewritePath=/organization/(?<path>.*), /$\\{path}\n            - id: openapi-proxy\n              uri: https://demos.springdoc.org\n              predicates:\n                - Path=/demo-microservices/v3/api-docs/**\n              filters:\n                - RewritePath=/demo-microservices/v3/api-docs/(?<path>.*), /demo-microservices/$\\{path}/v3/api-docs\n            - id: openapi\n              uri: http://localhost:${server.port}\n              predicates:\n                - Path=/v3/api-docs/**\n              filters:\n                - RewritePath=/v3/api-docs/(?<path>.*), /$\\{path}/v3/api-docs\n\nspringdoc:\n  cache:\n    disabled: true\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true"
  },
  {
    "path": "demo-microservices/config-service/src/main/resources/config/organization-service.yml",
    "content": "server:\n  port: 8091\n  forward-headers-strategy: framework\n\neureka:\n  client:\n    serviceUrl:\n      defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka}\n  instance:\n    preferIpAddress: true\n\nlogging:\n  pattern:\n    console: \"%d{yyyy-MM-dd HH:mm:ss} ${LOG_LEVEL_PATTERN:-%5p} %m%n\"\n\nspringdoc:\n  version: '@springdoc.version@'\n  cache:\n    disabled: true"
  },
  {
    "path": "demo-microservices/department-service/.gitignore",
    "content": "/target/\n/.classpath\n/.project\n/.settings/\n"
  },
  {
    "path": "demo-microservices/department-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>department-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-openfeign</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-openfeign-core</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/DepartmentApplication.java",
    "content": "package org.springdoc.demo.services.department;\n\nimport io.swagger.v3.oas.annotations.OpenAPIDefinition;\nimport io.swagger.v3.oas.annotations.info.Info;\nimport org.springdoc.demo.services.department.model.Department;\nimport org.springdoc.demo.services.department.repository.DepartmentRepository;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\n@EnableDiscoveryClient\n@EnableFeignClients\n@OpenAPIDefinition(info =\n@Info(title = \"Department API\", version = \"${springdoc.version}\", description = \"Documentation Department API v1.0\")\n)\npublic class DepartmentApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(DepartmentApplication.class, args);\n\t}\n\n\t@Bean\n\tDepartmentRepository repository() {\n\t\tDepartmentRepository repository = new DepartmentRepository();\n\t\trepository.add(new Department(1L, \"Development\"));\n\t\trepository.add(new Department(1L, \"Operations\"));\n\t\trepository.add(new Department(2L, \"Development\"));\n\t\trepository.add(new Department(2L, \"Operations\"));\n\t\treturn repository;\n\t}\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/client/EmployeeClient.java",
    "content": "package org.springdoc.demo.services.department.client;\n\nimport java.util.List;\n\nimport org.springdoc.demo.services.department.model.Employee;\n\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\n\n@FeignClient(name = \"employee-service\")\npublic interface EmployeeClient {\n\n\t@GetMapping(\"/department/{departmentId}\")\n\tList<Employee> findByDepartment(@PathVariable(\"departmentId\") Long departmentId);\n\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/controller/DepartmentController.java",
    "content": "package org.springdoc.demo.services.department.controller;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springdoc.demo.services.department.client.EmployeeClient;\nimport org.springdoc.demo.services.department.model.Department;\nimport org.springdoc.demo.services.department.repository.DepartmentRepository;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class DepartmentController {\n\n\tprivate static final Logger LOGGER = LoggerFactory.getLogger(DepartmentController.class);\n\n\tprivate DepartmentRepository repository;\n\n\tprivate EmployeeClient employeeClient;\n\n\tpublic DepartmentController(DepartmentRepository repository, EmployeeClient employeeClient) {\n\t\tthis.repository = repository;\n\t\tthis.employeeClient = employeeClient;\n\t}\n\n\t@PostMapping(\"/\")\n\tpublic Department add(@RequestBody Department department) {\n\t\tLOGGER.info(\"Department add: {}\", department);\n\t\treturn repository.add(department);\n\t}\n\n\t@GetMapping(\"/{id}\")\n\tpublic Department findById(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Department find: id={}\", id);\n\t\treturn repository.findById(id);\n\t}\n\n\t@GetMapping(\"/\")\n\tpublic List<Department> findAll() {\n\t\tLOGGER.info(\"Department find\");\n\t\treturn repository.findAll();\n\t}\n\n\t@GetMapping(\"/organization/{organizationId}\")\n\tpublic List<Department> findByOrganization(@PathVariable(\"organizationId\") Long organizationId) {\n\t\tLOGGER.info(\"Department find: organizationId={}\", organizationId);\n\t\treturn repository.findByOrganization(organizationId);\n\t}\n\n\t@GetMapping(\"/organization/{organizationId}/with-employees\")\n\tpublic List<Department> findByOrganizationWithEmployees(@PathVariable(\"organizationId\") Long organizationId) {\n\t\tLOGGER.info(\"Department find: organizationId={}\", organizationId);\n\t\tList<Department> departments = repository.findByOrganization(organizationId);\n\t\tdepartments.forEach(d -> d.setEmployees(employeeClient.findByDepartment(d.getId())));\n\t\treturn departments;\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/model/Department.java",
    "content": "package org.springdoc.demo.services.department.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class Department {\n\n\tprivate Long id;\n\n\tprivate Long organizationId;\n\n\tprivate String name;\n\n\tprivate List<Employee> employees = new ArrayList<>();\n\n\tpublic Department() {\n\n\t}\n\n\tpublic Department(Long organizationId, String name) {\n\t\tsuper();\n\t\tthis.organizationId = organizationId;\n\t\tthis.name = name;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Long getOrganizationId() {\n\t\treturn organizationId;\n\t}\n\n\tpublic void setOrganizationId(Long organizationId) {\n\t\tthis.organizationId = organizationId;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic List<Employee> getEmployees() {\n\t\treturn employees;\n\t}\n\n\tpublic void setEmployees(List<Employee> employees) {\n\t\tthis.employees = employees;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Department [id=\" + id + \", organizationId=\" + organizationId + \", name=\" + name + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/model/Employee.java",
    "content": "package org.springdoc.demo.services.department.model;\n\npublic class Employee {\n\n\tprivate Long id;\n\n\tprivate String name;\n\n\tprivate int age;\n\n\tprivate String position;\n\n\tpublic Employee() {\n\n\t}\n\n\tpublic Employee(String name, int age, String position) {\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t\tthis.position = position;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\n\tpublic String getPosition() {\n\t\treturn position;\n\t}\n\n\tpublic void setPosition(String position) {\n\t\tthis.position = position;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Employee [id=\" + id + \", name=\" + name + \", position=\" + position + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/java/org/springdoc/demo/services/department/repository/DepartmentRepository.java",
    "content": "package org.springdoc.demo.services.department.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\n\nimport org.springdoc.demo.services.department.model.Department;\n\npublic class DepartmentRepository {\n\n\tprivate List<Department> departments = new ArrayList<>();\n\n\tpublic Department add(Department department) {\n\t\tdepartment.setId((long) (departments.size() + 1));\n\t\tdepartments.add(department);\n\t\treturn department;\n\t}\n\n\tpublic Department findById(Long id) {\n\t\tOptional<Department> department = departments.stream().filter(a -> a.getId().equals(id)).findFirst();\n\t\tif (department.isPresent())\n\t\t\treturn department.get();\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tpublic List<Department> findAll() {\n\t\treturn departments;\n\t}\n\n\tpublic List<Department> findByOrganization(Long organizationId) {\n\t\treturn departments.stream().filter(a -> a.getOrganizationId().equals(organizationId)).collect(Collectors.toList());\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/department-service/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: department-service\n  config:\n    import: \"optional:configserver:${CONFIG_SERVER:http://localhost:8088}\"\n\n"
  },
  {
    "path": "demo-microservices/discovery-service/.gitignore",
    "content": "/target/\n/.settings/\n/.classpath\n/.project\n"
  },
  {
    "path": "demo-microservices/discovery-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>discovery-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/discovery-service/src/main/java/org/springdoc/demo/services/discovery/DiscoveryApplication.java",
    "content": "package org.springdoc.demo.services.discovery;\n\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.builder.SpringApplicationBuilder;\nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;\n\n@SpringBootApplication\n@EnableEurekaServer\npublic class DiscoveryApplication {\n\n\tpublic static void main(String[] args) {\n\t\tnew SpringApplicationBuilder(DiscoveryApplication.class).run(args);\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/discovery-service/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: discovery-service\n  config:\n    import: \"optional:configserver:${CONFIG_SERVER:http://localhost:8088}\""
  },
  {
    "path": "demo-microservices/employee-service/.gitignore",
    "content": "/target/\n/.classpath\n/.project\n/.settings/\n"
  },
  {
    "path": "demo-microservices/employee-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>employee-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/employee-service/src/main/java/org/springdoc/demo/services/employee/EmployeeApplication.java",
    "content": "package org.springdoc.demo.services.employee;\n\nimport io.swagger.v3.oas.annotations.OpenAPIDefinition;\nimport io.swagger.v3.oas.annotations.info.Info;\nimport org.springdoc.demo.services.employee.model.Employee;\nimport org.springdoc.demo.services.employee.repository.EmployeeRepository;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\n@EnableDiscoveryClient\n@OpenAPIDefinition(info =\n@Info(title = \"Employee API\", version = \"${springdoc.version}\", description = \"Documentation Employee API v1.0\")\n)\npublic class EmployeeApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(EmployeeApplication.class, args);\n\t}\n\n\t@Bean\n\tEmployeeRepository repository() {\n\t\tEmployeeRepository repository = new EmployeeRepository();\n\t\trepository.add(new Employee(1L, 1L, \"John Smith\", 34, \"Analyst\"));\n\t\trepository.add(new Employee(1L, 1L, \"Darren Hamilton\", 37, \"Manager\"));\n\t\trepository.add(new Employee(1L, 1L, \"Tom Scott\", 26, \"Developer\"));\n\t\trepository.add(new Employee(1L, 2L, \"Anna London\", 39, \"Analyst\"));\n\t\trepository.add(new Employee(1L, 2L, \"Patrick Dempsey\", 27, \"Developer\"));\n\t\trepository.add(new Employee(2L, 3L, \"Kevin Price\", 38, \"Developer\"));\n\t\trepository.add(new Employee(2L, 3L, \"Ian Scott\", 34, \"Developer\"));\n\t\trepository.add(new Employee(2L, 3L, \"Andrew Campton\", 30, \"Manager\"));\n\t\trepository.add(new Employee(2L, 4L, \"Steve Franklin\", 25, \"Developer\"));\n\t\trepository.add(new Employee(2L, 4L, \"Elisabeth Smith\", 30, \"Developer\"));\n\t\treturn repository;\n\t}\n}\n"
  },
  {
    "path": "demo-microservices/employee-service/src/main/java/org/springdoc/demo/services/employee/controller/EmployeeController.java",
    "content": "package org.springdoc.demo.services.employee.controller;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springdoc.demo.services.employee.model.Employee;\nimport org.springdoc.demo.services.employee.repository.EmployeeRepository;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class EmployeeController {\n\n\tprivate static final Logger LOGGER = LoggerFactory.getLogger(EmployeeController.class);\n\n\tprivate EmployeeRepository repository;\n\n\tpublic EmployeeController(EmployeeRepository repository) {\n\t\tthis.repository = repository;\n\t}\n\n\t@PostMapping(\"/\")\n\tpublic Employee add(@RequestBody Employee employee) {\n\t\tLOGGER.info(\"Employee add: {}\", employee);\n\t\treturn repository.add(employee);\n\t}\n\n\t@GetMapping(\"/{id}\")\n\tpublic Employee findById(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Employee find: id={}\", id);\n\t\treturn repository.findById(id);\n\t}\n\n\t@GetMapping(\"/\")\n\tpublic List<Employee> findAll() {\n\t\tLOGGER.info(\"Employee find\");\n\t\treturn repository.findAll();\n\t}\n\n\t@GetMapping(\"/department/{departmentId}\")\n\tpublic List<Employee> findByDepartment(@PathVariable(\"departmentId\") Long departmentId) {\n\t\tLOGGER.info(\"Employee find: departmentId={}\", departmentId);\n\t\treturn repository.findByDepartment(departmentId);\n\t}\n\n\t@GetMapping(\"/organization/{organizationId}\")\n\tpublic List<Employee> findByOrganization(@PathVariable(\"organizationId\") Long organizationId) {\n\t\tLOGGER.info(\"Employee find: organizationId={}\", organizationId);\n\t\treturn repository.findByOrganization(organizationId);\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/employee-service/src/main/java/org/springdoc/demo/services/employee/model/Employee.java",
    "content": "package org.springdoc.demo.services.employee.model;\n\npublic class Employee {\n\n\tprivate Long id;\n\n\tprivate Long organizationId;\n\n\tprivate Long departmentId;\n\n\tprivate String name;\n\n\tprivate int age;\n\n\tprivate String position;\n\n\tpublic Employee() {\n\n\t}\n\n\tpublic Employee(Long organizationId, Long departmentId, String name, int age, String position) {\n\t\tthis.organizationId = organizationId;\n\t\tthis.departmentId = departmentId;\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t\tthis.position = position;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Long getOrganizationId() {\n\t\treturn organizationId;\n\t}\n\n\tpublic void setOrganizationId(Long organizationId) {\n\t\tthis.organizationId = organizationId;\n\t}\n\n\tpublic Long getDepartmentId() {\n\t\treturn departmentId;\n\t}\n\n\tpublic void setDepartmentId(Long departmentId) {\n\t\tthis.departmentId = departmentId;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\n\tpublic String getPosition() {\n\t\treturn position;\n\t}\n\n\tpublic void setPosition(String position) {\n\t\tthis.position = position;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Employee [id=\" + id + \", organizationId=\" + organizationId + \", departmentId=\" + departmentId\n\t\t\t\t+ \", name=\" + name + \", position=\" + position + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/employee-service/src/main/java/org/springdoc/demo/services/employee/repository/EmployeeRepository.java",
    "content": "package org.springdoc.demo.services.employee.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.stream.Collectors;\n\nimport org.springdoc.demo.services.employee.model.Employee;\n\npublic class EmployeeRepository {\n\n\tprivate List<Employee> employees = new ArrayList<>();\n\n\tpublic Employee add(Employee employee) {\n\t\temployee.setId((long) (employees.size() + 1));\n\t\temployees.add(employee);\n\t\treturn employee;\n\t}\n\n\tpublic Employee findById(Long id) {\n\t\tOptional<Employee> employee = employees.stream().filter(a -> a.getId().equals(id)).findFirst();\n\t\tif (employee.isPresent())\n\t\t\treturn employee.get();\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tpublic List<Employee> findAll() {\n\t\treturn employees;\n\t}\n\n\tpublic List<Employee> findByDepartment(Long departmentId) {\n\t\treturn employees.stream().filter(a -> a.getDepartmentId().equals(departmentId)).collect(Collectors.toList());\n\t}\n\n\tpublic List<Employee> findByOrganization(Long organizationId) {\n\t\treturn employees.stream().filter(a -> a.getOrganizationId().equals(organizationId)).collect(Collectors.toList());\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/employee-service/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: employee-service\n  config:\n    import: \"optional:configserver:${CONFIG_SERVER:http://localhost:8088}\"\n"
  },
  {
    "path": "demo-microservices/gateway-service/.gitignore",
    "content": "/target/\n/.classpath\n/.project\n/.settings/\n"
  },
  {
    "path": "demo-microservices/gateway-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>gateway-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-gateway</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/gateway-service/src/main/java/org/springdoc/demo/services/gateway/ContextPathRewritePathGatewayFilterFactory.java",
    "content": "package org.springdoc.demo.services.gateway;\n\nimport org.springframework.cloud.gateway.filter.GatewayFilter;\nimport org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory;\nimport org.springframework.http.server.reactive.ServerHttpRequest;\nimport org.springframework.stereotype.Component;\n\nimport static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;\nimport static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;\n\n/**\n * @author bnasslahsen\n */\n@Component\npublic class ContextPathRewritePathGatewayFilterFactory extends RewritePathGatewayFilterFactory {\n\n\t@Override\n\tpublic GatewayFilter apply(Config config) {\n\t\tString replacement = config.getReplacement().replace(\"$\\\\\", \"$\");\n\t\treturn (exchange, chain) -> {\n\t\t\tServerHttpRequest req = exchange.getRequest();\n\n\t\t\taddOriginalRequestUrl(exchange, req.getURI());\n\t\t\tString path = req.getURI().getRawPath();\n\n\t\t\tString newPath = path.replaceAll(config.getRegexp(), replacement);\n\t\t\tServerHttpRequest request = req.mutate().path(newPath).contextPath(\"/\").build();\n\n\t\t\texchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, request.getURI());\n\n\t\t\treturn chain.filter(exchange.mutate().request(request).build());\n\t\t};\n\t}\n\n}"
  },
  {
    "path": "demo-microservices/gateway-service/src/main/java/org/springdoc/demo/services/gateway/GatewayApplication.java",
    "content": "package org.springdoc.demo.services.gateway;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport org.springdoc.core.properties.AbstractSwaggerUiConfigProperties.SwaggerUrl;\nimport org.springdoc.core.properties.SwaggerUiConfigProperties;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.gateway.route.RouteDefinition;\nimport org.springframework.cloud.gateway.route.RouteDefinitionLocator;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Lazy;\n\nimport static org.springdoc.core.utils.Constants.DEFAULT_API_DOCS_URL;\n\n@SpringBootApplication\n@EnableDiscoveryClient\npublic class GatewayApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(GatewayApplication.class, args);\n\t}\n\n\t@Bean\n\t@Lazy(false)\n\tpublic Set<SwaggerUrl> apis(RouteDefinitionLocator locator, SwaggerUiConfigProperties swaggerUiConfigProperties) {\n\t\tSet<SwaggerUrl> urls = new HashSet<>();\n\t\tList<RouteDefinition> definitions = locator.getRouteDefinitions().collectList().block();\n\t\tdefinitions.stream().filter(routeDefinition -> routeDefinition.getId().matches(\".*-service\")).forEach(routeDefinition -> {\n\t\t\tString name = routeDefinition.getId().replaceAll(\"-service\", \"\");\n\t\t\tSwaggerUrl swaggerUrl = new SwaggerUrl(name, DEFAULT_API_DOCS_URL+\"/\" + name, null);\n\t\t\turls.add(swaggerUrl);\n\t\t});\n\t\tswaggerUiConfigProperties.setUrls(urls);\n\t\treturn urls;\n\t}\n}\n"
  },
  {
    "path": "demo-microservices/gateway-service/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: gateway-service\n  config:\n    import: \"optional:configserver:${CONFIG_SERVER:http://localhost:8088}\"\n"
  },
  {
    "path": "demo-microservices/organization-service/.gitignore",
    "content": "/target/\n/.classpath\n/.project\n/.settings/\n"
  },
  {
    "path": "demo-microservices/organization-service/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-microservices</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>organization-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-config</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-openfeign</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-openfeign-core</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/OrganizationApplication.java",
    "content": "package org.springdoc.demo.services.organization;\n\nimport io.swagger.v3.oas.annotations.OpenAPIDefinition;\nimport io.swagger.v3.oas.annotations.info.Info;\nimport org.springdoc.demo.services.organization.model.Organization;\nimport org.springdoc.demo.services.organization.repository.OrganizationRepository;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.cloud.client.discovery.EnableDiscoveryClient;\nimport org.springframework.cloud.openfeign.EnableFeignClients;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\n@EnableDiscoveryClient\n@EnableFeignClients\n@OpenAPIDefinition(info =\n@Info(title = \"Organization API\", version = \"${springdoc.version}\", description = \"Documentation Organization API v1.0\")\n)\npublic class OrganizationApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(OrganizationApplication.class, args);\n\t}\n\n\t@Bean\n\tOrganizationRepository repository() {\n\t\tOrganizationRepository repository = new OrganizationRepository();\n\t\trepository.add(new Organization(\"Microsoft\", \"Redmond, Washington, USA\"));\n\t\trepository.add(new Organization(\"Oracle\", \"Redwood City, California, USA\"));\n\t\treturn repository;\n\t}\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/client/DepartmentClient.java",
    "content": "package org.springdoc.demo.services.organization.client;\n\nimport java.util.List;\n\nimport org.springdoc.demo.services.organization.model.Department;\n\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\n\n@FeignClient(name = \"department-service\")\npublic interface DepartmentClient {\n\n\t@GetMapping(\"/organization/{organizationId}\")\n\tpublic List<Department> findByOrganization(@PathVariable(\"organizationId\") Long organizationId);\n\n\t@GetMapping(\"/organization/{organizationId}/with-employees\")\n\tpublic List<Department> findByOrganizationWithEmployees(@PathVariable(\"organizationId\") Long organizationId);\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/client/EmployeeClient.java",
    "content": "package org.springdoc.demo.services.organization.client;\n\nimport java.util.List;\n\nimport org.springdoc.demo.services.organization.model.Employee;\n\nimport org.springframework.cloud.openfeign.FeignClient;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\n\n@FeignClient(name = \"employee-service\")\npublic interface EmployeeClient {\n\n\t@GetMapping(\"/organization/{organizationId}\")\n\tList<Employee> findByOrganization(@PathVariable(\"organizationId\") Long organizationId);\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/controller/OrganizationController.java",
    "content": "package org.springdoc.demo.services.organization.controller;\n\nimport java.util.List;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springdoc.demo.services.organization.client.DepartmentClient;\nimport org.springdoc.demo.services.organization.client.EmployeeClient;\nimport org.springdoc.demo.services.organization.model.Organization;\nimport org.springdoc.demo.services.organization.repository.OrganizationRepository;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class OrganizationController {\n\n\tprivate static final Logger LOGGER = LoggerFactory.getLogger(OrganizationController.class);\n\n\tprivate OrganizationRepository repository;\n\n\tprivate DepartmentClient departmentClient;\n\n\tprivate EmployeeClient employeeClient;\n\n\tpublic OrganizationController(OrganizationRepository repository, DepartmentClient departmentClient, EmployeeClient employeeClient) {\n\t\tthis.repository = repository;\n\t\tthis.departmentClient = departmentClient;\n\t\tthis.employeeClient = employeeClient;\n\t}\n\n\t@PostMapping\n\tpublic Organization add(@RequestBody Organization organization) {\n\t\tLOGGER.info(\"Organization add: {}\", organization);\n\t\treturn repository.add(organization);\n\t}\n\n\t@GetMapping\n\tpublic List<Organization> findAll() {\n\t\tLOGGER.info(\"Organization find\");\n\t\treturn repository.findAll();\n\t}\n\n\t@GetMapping(\"/{id}\")\n\tpublic Organization findById(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Organization find: id={}\", id);\n\t\treturn repository.findById(id);\n\t}\n\n\t@GetMapping(\"/{id}/with-departments\")\n\tpublic Organization findByIdWithDepartments(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Organization find: id={}\", id);\n\t\tOrganization organization = repository.findById(id);\n\t\torganization.setDepartments(departmentClient.findByOrganization(organization.getId()));\n\t\treturn organization;\n\t}\n\n\t@GetMapping(\"/{id}/with-departments-and-employees\")\n\tpublic Organization findByIdWithDepartmentsAndEmployees(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Organization find: id={}\", id);\n\t\tOrganization organization = repository.findById(id);\n\t\torganization.setDepartments(departmentClient.findByOrganizationWithEmployees(organization.getId()));\n\t\treturn organization;\n\t}\n\n\t@GetMapping(\"/{id}/with-employees\")\n\tpublic Organization findByIdWithEmployees(@PathVariable(\"id\") Long id) {\n\t\tLOGGER.info(\"Organization find: id={}\", id);\n\t\tOrganization organization = repository.findById(id);\n\t\torganization.setEmployees(employeeClient.findByOrganization(organization.getId()));\n\t\treturn organization;\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/model/Department.java",
    "content": "package org.springdoc.demo.services.organization.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class Department {\n\n\tprivate Long id;\n\n\tprivate String name;\n\n\tprivate List<Employee> employees = new ArrayList<>();\n\n\tpublic Department() {\n\n\t}\n\n\tpublic Department(String name) {\n\t\tsuper();\n\t\tthis.name = name;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic List<Employee> getEmployees() {\n\t\treturn employees;\n\t}\n\n\tpublic void setEmployees(List<Employee> employees) {\n\t\tthis.employees = employees;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Department [id=\" + id + \", name=\" + name + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/model/Employee.java",
    "content": "package org.springdoc.demo.services.organization.model;\n\npublic class Employee {\n\n\tprivate Long id;\n\n\tprivate String name;\n\n\tprivate int age;\n\n\tprivate String position;\n\n\tpublic Employee() {\n\n\t}\n\n\tpublic Employee(String name, int age, String position) {\n\t\tthis.name = name;\n\t\tthis.age = age;\n\t\tthis.position = position;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\n\tpublic String getPosition() {\n\t\treturn position;\n\t}\n\n\tpublic void setPosition(String position) {\n\t\tthis.position = position;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Employee [id=\" + id + \", name=\" + name + \", position=\" + position + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/model/Organization.java",
    "content": "package org.springdoc.demo.services.organization.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class Organization {\n\n\tprivate Long id;\n\n\tprivate String name;\n\n\tprivate String address;\n\n\tprivate List<Department> departments = new ArrayList<>();\n\n\tprivate List<Employee> employees = new ArrayList<>();\n\n\tpublic Organization() {\n\n\t}\n\n\tpublic Organization(String name, String address) {\n\t\tthis.name = name;\n\t\tthis.address = address;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic String getAddress() {\n\t\treturn address;\n\t}\n\n\tpublic void setAddress(String address) {\n\t\tthis.address = address;\n\t}\n\n\tpublic List<Department> getDepartments() {\n\t\treturn departments;\n\t}\n\n\tpublic void setDepartments(List<Department> departments) {\n\t\tthis.departments = departments;\n\t}\n\n\tpublic List<Employee> getEmployees() {\n\t\treturn employees;\n\t}\n\n\tpublic void setEmployees(List<Employee> employees) {\n\t\tthis.employees = employees;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Organization [id=\" + id + \", name=\" + name + \", address=\" + address + \"]\";\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/java/org/springdoc/demo/services/organization/repository/OrganizationRepository.java",
    "content": "package org.springdoc.demo.services.organization.repository;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Optional;\n\nimport org.springdoc.demo.services.organization.model.Organization;\n\npublic class OrganizationRepository {\n\n\tprivate List<Organization> organizations = new ArrayList<>();\n\n\tpublic Organization add(Organization organization) {\n\t\torganization.setId((long) (organizations.size() + 1));\n\t\torganizations.add(organization);\n\t\treturn organization;\n\t}\n\n\tpublic Organization findById(Long id) {\n\t\tOptional<Organization> organization = organizations.stream().filter(a -> a.getId().equals(id)).findFirst();\n\t\tif (organization.isPresent())\n\t\t\treturn organization.get();\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tpublic List<Organization> findAll() {\n\t\treturn organizations;\n\t}\n\n}\n"
  },
  {
    "path": "demo-microservices/organization-service/src/main/resources/application.yml",
    "content": "spring:\n  application:\n    name: organization-service\n  config:\n    import: \"optional:configserver:${CONFIG_SERVER:http://localhost:8088}\"\n"
  },
  {
    "path": "demo-microservices/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<packaging>pom</packaging>\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>demo-microservices</artifactId>\n\n\t<modules>\n\t\t<module>config-service</module>\n\t\t<module>discovery-service</module>\n\t\t<module>employee-service</module>\n\t\t<module>department-service</module>\n\t\t<module>organization-service</module>\n\t\t<module>gateway-service</module>\n\t</modules>\n\n</project>"
  },
  {
    "path": "demo-oauth2/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-oauth2/README.md",
    "content": "## Spring Security OAuth - New Stack\n\n### Relevant information:\n\n1. `oauth-authorization-server` is a Keycloak Authorization Server wrapped as a Spring\n   Boot application\n2. There is one OAuth Client registered in the Authorization Server:\n    1. Client Id: newClient\n    2. Client secret: newClientSecret\n    3. Redirect Uris:\n        - http://127.0.0.1:8081/resource-server/swagger-ui/oauth2-redirect.html\n        - http://127.0.0.1:8082/resource-server/swagger-ui/oauth2-redirect.html\n\n3. There is a test user registered in the Authorization Server:\n\n- josh@test.com / 123\n\n4. `oauth-resource-server-webmvc` is a Spring Boot WebMVC based RESTFul API, acting as a\n   backend Application\n   swagger-ui:  http://127.0.0.1:8081/resource-server/swagger-ui.html\n\n5. `oauth-resource-server-webflux` is a Spring Boot WebFlux based RESTFul API, acting as a\n   backend Application\n   swagger-ui:  http://127.0.0.1:8082/resource-server/swagger-ui.html\n\n"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-oauth2</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>oauth-authorization-server</artifactId>\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.security</groupId>\n\t\t\t<artifactId>spring-security-oauth2-authorization-server</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-jdbc</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t</dependency>\n\t</dependencies>\n</project>\n"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/AuthorizationServerApp.java",
    "content": "package org.springdoc.demo.auth;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class AuthorizationServerApp {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(AuthorizationServerApp.class, args);\n\t}\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/DefaultSecurityConfig.java",
    "content": "package org.springdoc.demo.auth;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;\nimport org.springframework.security.core.userdetails.User;\nimport org.springframework.security.core.userdetails.UserDetails;\nimport org.springframework.security.core.userdetails.UserDetailsService;\nimport org.springframework.security.provisioning.InMemoryUserDetailsManager;\nimport org.springframework.security.web.SecurityFilterChain;\n\nimport static org.springframework.security.config.Customizer.withDefaults;\n\n@EnableWebSecurity\n@Configuration(proxyBeanMethods = false)\npublic class DefaultSecurityConfig {\n\n\t@Bean\n\tSecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.authorizeHttpRequests(authz ->\n\t\t\t\t\t\tauthz.requestMatchers(\"/v3/api-docs/**\", \"/swagger-ui/**\", \"/swagger-ui.html\").permitAll()\n\t\t\t\t\t\t\t\t.anyRequest().authenticated()\n\t\t\t\t)\n\t\t\t\t.cors(withDefaults())\n\t\t\t\t.formLogin(withDefaults());\n\t\treturn http.build();\n\t}\n\n\t@Bean\n\tUserDetailsService users() {\n\t\tUserDetails user = User.withDefaultPasswordEncoder()\n\t\t\t\t.username(\"josh@test.com\")\n\t\t\t\t.password(\"123\")\n\t\t\t\t.roles(\"USER\")\n\t\t\t\t.build();\n\t\treturn new InMemoryUserDetailsManager(user);\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/Jwks.java",
    "content": "package org.springdoc.demo.auth;\n\nimport java.security.KeyPair;\nimport java.security.interfaces.RSAPrivateKey;\nimport java.security.interfaces.RSAPublicKey;\nimport java.util.UUID;\n\nimport com.nimbusds.jose.jwk.RSAKey;\n\npublic final class Jwks {\n\n\tprivate Jwks() {\n\t}\n\n\tpublic static RSAKey generateRsa() {\n\t\tKeyPair keyPair = KeyGeneratorUtils.generateRsaKey();\n\t\tRSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();\n\t\tRSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();\n\t\treturn new RSAKey.Builder(publicKey)\n\t\t\t\t.privateKey(privateKey)\n\t\t\t\t.keyID(UUID.randomUUID().toString())\n\t\t\t\t.build();\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/KeyGeneratorUtils.java",
    "content": "package org.springdoc.demo.auth;\n\nimport java.math.BigInteger;\nimport java.security.KeyPair;\nimport java.security.KeyPairGenerator;\nimport java.security.spec.ECFieldFp;\nimport java.security.spec.ECParameterSpec;\nimport java.security.spec.ECPoint;\nimport java.security.spec.EllipticCurve;\n\nfinal class KeyGeneratorUtils {\n\n\tprivate KeyGeneratorUtils() {\n\t}\n\n\tstatic KeyPair generateRsaKey() {\n\t\tKeyPair keyPair;\n\t\ttry {\n\t\t\tKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(\"RSA\");\n\t\t\tkeyPairGenerator.initialize(2048);\n\t\t\tkeyPair = keyPairGenerator.generateKeyPair();\n\t\t}\n\t\tcatch (Exception ex) {\n\t\t\tthrow new IllegalStateException(ex);\n\t\t}\n\t\treturn keyPair;\n\t}\n\n\tstatic KeyPair generateEcKey() {\n\t\tEllipticCurve ellipticCurve = new EllipticCurve(\n\t\t\t\tnew ECFieldFp(\n\t\t\t\t\t\tnew BigInteger(\"115792089210356248762697446949407573530086143415290314195533631308867097853951\")),\n\t\t\t\tnew BigInteger(\"115792089210356248762697446949407573530086143415290314195533631308867097853948\"),\n\t\t\t\tnew BigInteger(\"41058363725152142129326129780047268409114441015993725554835256314039467401291\"));\n\t\tECPoint ecPoint = new ECPoint(\n\t\t\t\tnew BigInteger(\"48439561293906451759052585252797914202762949526041747995844080717082404635286\"),\n\t\t\t\tnew BigInteger(\"36134250956749795798585127919587881956611106672985015071877198253568414405109\"));\n\t\tECParameterSpec ecParameterSpec = new ECParameterSpec(\n\t\t\t\tellipticCurve,\n\t\t\t\tecPoint,\n\t\t\t\tnew BigInteger(\"115792089210356248762697446949407573529996955224135760342422259061068512044369\"),\n\t\t\t\t1);\n\n\t\tKeyPair keyPair;\n\t\ttry {\n\t\t\tKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(\"EC\");\n\t\t\tkeyPairGenerator.initialize(ecParameterSpec);\n\t\t\tkeyPair = keyPairGenerator.generateKeyPair();\n\t\t}\n\t\tcatch (Exception ex) {\n\t\t\tthrow new IllegalStateException(ex);\n\t\t}\n\t\treturn keyPair;\n\t}\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/java/org/springdoc/demo/auth/SecurityConfig.java",
    "content": "package org.springdoc.demo.auth;\n\nimport java.util.List;\nimport java.util.UUID;\n\nimport com.nimbusds.jose.jwk.JWKSet;\nimport com.nimbusds.jose.jwk.RSAKey;\nimport com.nimbusds.jose.jwk.source.JWKSource;\nimport com.nimbusds.jose.proc.SecurityContext;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.core.Ordered;\nimport org.springframework.core.annotation.Order;\nimport org.springframework.jdbc.core.JdbcTemplate;\nimport org.springframework.jdbc.datasource.embedded.EmbeddedDatabase;\nimport org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;\nimport org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;\nimport org.springframework.security.config.Customizer;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;\nimport org.springframework.security.oauth2.core.AuthorizationGrantType;\nimport org.springframework.security.oauth2.core.ClientAuthenticationMethod;\nimport org.springframework.security.oauth2.core.oidc.OidcScopes;\nimport org.springframework.security.oauth2.jwt.JwtDecoder;\nimport org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationConsentService;\nimport org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;\nimport org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;\nimport org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;\nimport org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClient;\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;\nimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;\nimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;\nimport org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;\nimport org.springframework.security.web.SecurityFilterChain;\nimport org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;\nimport org.springframework.web.cors.CorsConfiguration;\nimport org.springframework.web.cors.CorsConfigurationSource;\nimport org.springframework.web.cors.UrlBasedCorsConfigurationSource;\n\nimport static org.springframework.security.config.Customizer.withDefaults;\n\n\n@Configuration(proxyBeanMethods = false)\npublic class SecurityConfig {\n\tprivate static final List<String> ALLOWED_HEADERS = List.of(\"Access-Control-Allow-Origin\", \"x-requested-with\");\n\tprivate static final List<String> ALLOWED_METHODS = List.of(\"POST\");\n\tprivate static final List<String> ALLOWED_ALL = List.of(\"http://127.0.0.1:8081\", \"http://127.0.0.1:8082\", \"http://144.24.171.248:8095\",\"http://144.24.171.248:8096\", \"https://demos.springdoc.org\");\n\n\t@Bean\n\tCorsConfigurationSource corsConfigurationSource() {\n\t\tCorsConfiguration configuration = new CorsConfiguration();\n\t\tconfiguration.setAllowedOrigins(ALLOWED_ALL);\n\t\tconfiguration.setAllowedMethods(ALLOWED_METHODS);\n\t\tconfiguration.setAllowedHeaders(ALLOWED_HEADERS);\n\t\tUrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();\n\t\tsource.registerCorsConfiguration(\"/**\", configuration);\n\t\treturn source;\n\t}\n\n\t@Bean\n\t@Order(Ordered.HIGHEST_PRECEDENCE)\n\tpublic SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {\n\t\tOAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);\n\t\thttp.getConfigurer(OAuth2AuthorizationServerConfigurer.class)\n\t\t\t\t.oidc(Customizer.withDefaults());\n\t\thttp\n\t\t\t\t.cors(withDefaults())\n\t\t\t\t.exceptionHandling(exceptions ->\n\t\t\t\t\t\texceptions.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint(\"/login\"))\n\t\t\t\t)\n\t\t\t\t.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);\n\t\t\n\t\treturn http.build();\n\t}\n\n\t@Bean\n\tpublic RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {\n\t\tRegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())\n\t\t\t\t.clientId(\"newClient\")\n\t\t\t\t.clientSecret(\"{noop}newClientSecret\")\n\t\t\t\t.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST)\n\t\t\t\t.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)\n\t\t\t\t.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)\n\t\t\t\t.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)\n\t\t\t\t.redirectUri(\"http://127.0.0.1:8081/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.redirectUri(\"http://127.0.0.1:8082/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.redirectUri(\"http://144.24.171.248:8095/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.redirectUri(\"http://144.24.171.248:8096/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.redirectUri(\"https://demos.springdoc.org/oauth-resource-server-webmvc/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.redirectUri(\"https://demos.springdoc.org/oauth-resource-server-webflux/resource-server/swagger-ui/oauth2-redirect.html\")\n\t\t\t\t.scope(OidcScopes.OPENID)\n\t\t\t\t.scope(OidcScopes.PROFILE)\n\t\t\t\t.scope(\"springdoc.read\")\n\t\t\t\t.scope(\"springdoc.write\")\n\t\t\t\t.build();\n\n\t\t// Save registered client in db as if in-memory\n\t\tJdbcRegisteredClientRepository registeredClientRepository = new JdbcRegisteredClientRepository(jdbcTemplate);\n\t\tregisteredClientRepository.save(registeredClient);\n\n\t\treturn registeredClientRepository;\n\t}\n\n\t@Bean\n\tpublic OAuth2AuthorizationService authorizationService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {\n\t\treturn new JdbcOAuth2AuthorizationService(jdbcTemplate, registeredClientRepository);\n\t}\n\n\t@Bean\n\tpublic OAuth2AuthorizationConsentService authorizationConsentService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {\n\t\treturn new JdbcOAuth2AuthorizationConsentService(jdbcTemplate, registeredClientRepository);\n\t}\n\n\t@Bean\n\tpublic JWKSource<SecurityContext> jwkSource() {\n\t\tRSAKey rsaKey = Jwks.generateRsa();\n\t\tJWKSet jwkSet = new JWKSet(rsaKey);\n\t\treturn (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);\n\t}\n\n\t@Bean\n\tpublic JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {\n\t\treturn OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);\n\t}\n\n\t@Bean\n\tpublic AuthorizationServerSettings authorizationServerSettings() {\n\t\treturn AuthorizationServerSettings.builder().build();\n\t}\n\n\t@Bean\n\tpublic EmbeddedDatabase embeddedDatabase() {\n\t\treturn new EmbeddedDatabaseBuilder()\n\t\t\t\t.generateUniqueName(true)\n\t\t\t\t.setType(EmbeddedDatabaseType.H2)\n\t\t\t\t.setScriptEncoding(\"UTF-8\")\n\t\t\t\t.addScript(\"org/springframework/security/oauth2/server/authorization/oauth2-authorization-schema.sql\")\n\t\t\t\t.addScript(\"org/springframework/security/oauth2/server/authorization/oauth2-authorization-consent-schema.sql\")\n\t\t\t\t.addScript(\"org/springframework/security/oauth2/server/authorization/client/oauth2-registered-client-schema.sql\")\n\t\t\t\t.build();\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-authorization-server/src/main/resources/application.yml",
    "content": "spring:\n  datasource:\n    username: sa\n    url: jdbc:h2:./data/keycloak;DB_CLOSE_ON_EXIT=FALSE\n    hikari:\n      maximum-pool-size: 25\n      minimum-idle: 1\n\nserver:\n  forward-headers-strategy: native\n  port: 8083\nlogging:\n  level:\n    root: INFO\n    org.springframework.web: INFO\n    org.springframework.security: INFO\n    org.springframework.security.oauth2: INFO\n    org.springframework.boot.autoconfigure: INFO\nspringdoc:\n  show-oauth2-endpoints: true"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-oauth2</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>oauth-resource-server-webflux</artifactId>\n\t<dependencies>\n\t\t<!-- web -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-webflux</artifactId>\n\t\t</dependency>\n\t\t<!-- security -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n\t\t</dependency>\n\t\t<!-- persistence -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t</dependency>\n\t\t<!-- OpenAPI 3 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/ResourceServerApp.java",
    "content": "package org.springdoc.demo.resource;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class ResourceServerApp {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tSpringApplication.run(ResourceServerApp.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components())\n\t\t\t\t.info(new Info().title(\"Foo API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/config/OpenApiConfig.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.resource.config;\n\nimport io.swagger.v3.oas.annotations.OpenAPIDefinition;\nimport io.swagger.v3.oas.annotations.enums.SecuritySchemeType;\nimport io.swagger.v3.oas.annotations.info.Info;\nimport io.swagger.v3.oas.annotations.security.OAuthFlow;\nimport io.swagger.v3.oas.annotations.security.OAuthFlows;\nimport io.swagger.v3.oas.annotations.security.OAuthScope;\nimport io.swagger.v3.oas.annotations.security.SecurityScheme;\n\n@OpenAPIDefinition(info = @Info(title = \"My App\",\n\t\tdescription = \"Some long and useful description\", version = \"v1\"))\n@SecurityScheme(name = \"security_auth\", type = SecuritySchemeType.OAUTH2,\n\t\tflows = @OAuthFlows(authorizationCode = @OAuthFlow(\n\t\t\t\tauthorizationUrl = \"${springdoc.oAuthFlow.authorizationUrl}\"\n\t\t\t\t, tokenUrl = \"${springdoc.oAuthFlow.tokenUrl}\", scopes = {\n\t\t\t\t@OAuthScope(name = \"springdoc.read\", description = \"read scope\"),\n\t\t\t\t@OAuthScope(name = \"springdoc.write\", description = \"write scope\") })))\npublic class OpenApiConfig {}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/config/SecurityConfig.java",
    "content": "package org.springdoc.demo.resource.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.security.config.web.server.ServerHttpSecurity;\nimport org.springframework.security.web.server.SecurityWebFilterChain;\n\n@Configuration\npublic class SecurityConfig {\n\n\t@Bean\n\tpublic SecurityWebFilterChain configure(ServerHttpSecurity http) {\n\n\t\thttp\n\t\t\t\t.authorizeExchange().pathMatchers(\"/v3/api-docs/**\", \"/swagger-ui/**\", \"/webjars/**\", \"/swagger-ui.html\").permitAll()\n\t\t\t\t.pathMatchers(HttpMethod.GET, \"/user/info\", \"/api/foos/**\")\n\t\t\t\t.hasAuthority(\"SCOPE_springdoc.read\")\n\t\t\t\t.pathMatchers(HttpMethod.POST, \"/api/foos\")\n\t\t\t\t.hasAuthority(\"SCOPE_springdoc.write\")\n\t\t\t\t.anyExchange().authenticated().and().oauth2ResourceServer().jwt();\n\n\n\t\treturn http.build();\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/model/Foo.java",
    "content": "package org.springdoc.demo.resource.model;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class Foo {\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Long id;\n\n\tprivate String name;\n\n\tprotected Foo() {\n\t}\n\n\tpublic Foo(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result;\n\t\tresult = prime * result + ((id == null) ? 0 : id.hashCode());\n\t\tresult = prime * result + ((name == null) ? 0 : name.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tFoo other = (Foo) obj;\n\t\tif (id == null) {\n\t\t\tif (other.id != null)\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!id.equals(other.id))\n\t\t\treturn false;\n\t\tif (name == null) {\n\t\t\tif (other.name != null)\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!name.equals(other.name))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Foo [id=\" + id + \", name=\" + name + \"]\";\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/repository/IFooRepository.java",
    "content": "package org.springdoc.demo.resource.repository;\n\nimport org.springdoc.demo.resource.model.Foo;\n\nimport org.springframework.data.repository.CrudRepository;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\npublic interface IFooRepository extends PagingAndSortingRepository<Foo, Long>, CrudRepository<Foo, Long> {\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/service/IFooService.java",
    "content": "package org.springdoc.demo.resource.service;\n\nimport java.util.Optional;\n\nimport org.springdoc.demo.resource.model.Foo;\n\n\npublic interface IFooService {\n\tOptional<Foo> findById(Long id);\n\n\tFoo save(Foo foo);\n\n\tIterable<Foo> findAll();\n\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/service/impl/FooServiceImpl.java",
    "content": "package org.springdoc.demo.resource.service.impl;\n\nimport java.util.Optional;\n\nimport org.springdoc.demo.resource.model.Foo;\nimport org.springdoc.demo.resource.repository.IFooRepository;\nimport org.springdoc.demo.resource.service.IFooService;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class FooServiceImpl implements IFooService {\n\n\tprivate IFooRepository fooRepository;\n\n\tpublic FooServiceImpl(IFooRepository fooRepository) {\n\t\tthis.fooRepository = fooRepository;\n\t}\n\n\t@Override\n\tpublic Optional<Foo> findById(Long id) {\n\t\treturn fooRepository.findById(id);\n\t}\n\n\t@Override\n\tpublic Foo save(Foo foo) {\n\t\treturn fooRepository.save(foo);\n\t}\n\n\t@Override\n\tpublic Iterable<Foo> findAll() {\n\t\treturn fooRepository.findAll();\n\t}\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/web/controller/FooController.java",
    "content": "package org.springdoc.demo.resource.web.controller;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.demo.resource.model.Foo;\nimport org.springdoc.demo.resource.service.IFooService;\nimport org.springdoc.demo.resource.web.dto.FooDTO;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.server.ResponseStatusException;\n\n@RestController\n@RequestMapping(value = \"/api/foos\")\n@SecurityRequirement(name = \"security_auth\")\npublic class FooController {\n\n\tprivate IFooService fooService;\n\n\tpublic FooController(IFooService fooService) {\n\t\tthis.fooService = fooService;\n\t}\n\n\t@GetMapping(value = \"/{id}\")\n\tpublic FooDTO findOne(@PathVariable Long id) {\n\t\tFoo entity = fooService.findById(id)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t\treturn convertToDto(entity);\n\t}\n\n\t@ResponseStatus(HttpStatus.CREATED)\n\t@PostMapping\n\tpublic void create(@RequestBody FooDTO newFoo) {\n\t\tFoo entity = convertToEntity(newFoo);\n\t\tthis.fooService.save(entity);\n\t}\n\n\t@GetMapping\n\tpublic Collection<FooDTO> findAll() {\n\t\tIterable<Foo> foos = this.fooService.findAll();\n\t\tList<FooDTO> fooDtos = new ArrayList<>();\n\t\tfoos.forEach(p -> fooDtos.add(convertToDto(p)));\n\t\treturn fooDtos;\n\t}\n\n\t@PutMapping(\"/{id}\")\n\tpublic FooDTO updateFoo(@PathVariable(\"id\") Long id, @RequestBody FooDTO updatedFoo) {\n\t\tFoo fooEntity = convertToEntity(updatedFoo);\n\t\treturn this.convertToDto(this.fooService.save(fooEntity));\n\t}\n\n\tprotected FooDTO convertToDto(Foo entity) {\n\t\tFooDTO dto = new FooDTO(entity.getId(), entity.getName());\n\n\t\treturn dto;\n\t}\n\n\tprotected Foo convertToEntity(FooDTO dto) {\n\t\tFoo foo = new Foo(dto.getName());\n\t\tif (!StringUtils.isEmpty(dto.getId())) {\n\t\t\tfoo.setId(dto.getId());\n\t\t}\n\t\treturn foo;\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/web/controller/UserInfoController.java",
    "content": "package org.springdoc.demo.resource.web.controller;\n\nimport java.util.Collections;\nimport java.util.Map;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\nimport org.springframework.security.oauth2.jwt.Jwt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class UserInfoController {\n\n\t@GetMapping(\"/user/info\")\n\t@SecurityRequirement(name = \"security_auth\")\n\tpublic Map<String, Object> getUserInfo(@AuthenticationPrincipal Jwt principal) {\n\t\treturn Collections.singletonMap(\"user_name\", principal.getClaimAsString(\"sub\"));\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/java/org/springdoc/demo/resource/web/dto/FooDTO.java",
    "content": "package org.springdoc.demo.resource.web.dto;\n\npublic class FooDTO {\n\tprivate long id;\n\n\tprivate String name;\n\n\tpublic FooDTO() {\n\t\tsuper();\n\t}\n\n\tpublic FooDTO(final long id, final String name) {\n\t\tsuper();\n\n\t\tthis.id = id;\n\t\tthis.name = name;\n\t}\n\n\t//\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(final long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(final String name) {\n\t\tthis.name = name;\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/resources/application.yml",
    "content": "server:\n  forward-headers-strategy: framework\n  port: 8082\n\n####### resource server configuration properties\nspring:\n  webflux:\n    base-path: /resource-server\n  jpa:\n    defer-datasource-initialization: true\n  security:\n    oauth2:\n      resourceserver:\n        jwt:\n          issuer-uri: ${OAUTH2_SERVER:http://127.0.0.1:8083}\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    oauth:\n      clientId: newClient\n      clientSecret: newClientSecret\n  oAuthFlow:\n    authorizationUrl: ${OAUTH2_SERVER:http://127.0.0.1:8083}/oauth2/authorize\n    tokenUrl: ${OAUTH2_SERVER:http://127.0.0.1:8083}/oauth2/token\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webflux/src/main/resources/data.sql",
    "content": "INSERT INTO Foo(id, name)\nVALUES (1, 'Foo 1');\nINSERT INTO Foo(id, name)\nVALUES (2, 'Foo 2');\nINSERT INTO Foo(id, name)\nVALUES (3, 'Foo 3');\n\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>demo-oauth2</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>oauth-resource-server-webmvc</artifactId>\n\t<dependencies>\n\t\t<!-- web -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<!-- security -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>\n\t\t</dependency>\n\t\t<!-- persistence -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t</dependency>\n\t\t<!-- OpenAPI 3 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\n</project>\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/ResourceServerApp.java",
    "content": "package org.springdoc.demo.resource;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class ResourceServerApp {\n\n\tpublic static void main(String[] args) throws Exception {\n\t\tSpringApplication.run(ResourceServerApp.class, args);\n\t}\n\t\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/config/OpenApiConfig.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.resource.config;\n\nimport io.swagger.v3.oas.annotations.OpenAPIDefinition;\nimport io.swagger.v3.oas.annotations.enums.SecuritySchemeType;\nimport io.swagger.v3.oas.annotations.info.Info;\nimport io.swagger.v3.oas.annotations.security.OAuthFlow;\nimport io.swagger.v3.oas.annotations.security.OAuthFlows;\nimport io.swagger.v3.oas.annotations.security.OAuthScope;\nimport io.swagger.v3.oas.annotations.security.SecurityScheme;\n\n@OpenAPIDefinition(info = @Info(title = \"Foo API\",\n\t\tdescription = \"Foo description\", version = \"v1\"))\n@SecurityScheme(name = \"security_auth\", type = SecuritySchemeType.OAUTH2,\n\t\tflows = @OAuthFlows(authorizationCode = @OAuthFlow(\n\t\t\t\tauthorizationUrl = \"${springdoc.oAuthFlow.authorizationUrl}\"\n\t\t\t\t, tokenUrl = \"${springdoc.oAuthFlow.tokenUrl}\", scopes = {\n\t\t\t\t@OAuthScope(name = \"springdoc.read\", description = \"read scope\"),\n\t\t\t\t@OAuthScope(name = \"springdoc.write\", description = \"write scope\") })))\npublic class OpenApiConfig {}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/config/SecurityConfig.java",
    "content": "package org.springdoc.demo.resource.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.HttpMethod;\nimport org.springframework.security.config.Customizer;\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity;\nimport org.springframework.security.web.SecurityFilterChain;\n\n@Configuration\npublic class SecurityConfig {\n\n\t@Bean\n\tpublic SecurityFilterChain filterChain1(HttpSecurity http) throws Exception {\n\t\thttp\n\t\t\t\t.authorizeHttpRequests(authz -> authz\n\t\t\t\t.requestMatchers(\"/v3/api-docs/**\", \"/swagger-ui/**\", \"/swagger-ui.html\").permitAll()\n\t\t\t\t.requestMatchers(HttpMethod.GET, \"/user/info\", \"/api/foos/**\")\n\t\t\t\t.hasAuthority(\"SCOPE_springdoc.read\")\n\t\t\t\t.requestMatchers(HttpMethod.POST, \"/api/foos\")\n\t\t\t\t.hasAuthority(\"SCOPE_springdoc.write\")\n\t\t\t\t.anyRequest()\n\t\t\t\t.authenticated())\n\t\t\t\t.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));\n\t\treturn http.build();\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/model/Foo.java",
    "content": "package org.springdoc.demo.resource.model;\n\nimport java.util.UUID;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\n\n@Entity\npublic class Foo {\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.UUID)\n\tprivate UUID id;\n\n\tprivate String name;\n\n\tprotected Foo() {\n\t}\n\n\tpublic Foo(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic UUID getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(UUID id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\tfinal int prime = 31;\n\t\tint result = 1;\n\t\tresult = prime * result;\n\t\tresult = prime * result + ((id == null) ? 0 : id.hashCode());\n\t\tresult = prime * result + ((name == null) ? 0 : name.hashCode());\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object obj) {\n\t\tif (this == obj)\n\t\t\treturn true;\n\t\tif (obj == null)\n\t\t\treturn false;\n\t\tif (getClass() != obj.getClass())\n\t\t\treturn false;\n\t\tFoo other = (Foo) obj;\n\t\tif (id == null) {\n\t\t\tif (other.id != null)\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!id.equals(other.id))\n\t\t\treturn false;\n\t\tif (name == null) {\n\t\t\tif (other.name != null)\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!name.equals(other.name))\n\t\t\treturn false;\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Foo [id=\" + id + \", name=\" + name + \"]\";\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/repository/IFooRepository.java",
    "content": "package org.springdoc.demo.resource.repository;\n\nimport org.springdoc.demo.resource.model.Foo;\n\nimport org.springframework.data.repository.CrudRepository;\nimport org.springframework.data.repository.PagingAndSortingRepository;\n\npublic interface IFooRepository extends PagingAndSortingRepository<Foo, Long>, CrudRepository<Foo, Long> {\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/service/IFooService.java",
    "content": "package org.springdoc.demo.resource.service;\n\nimport java.util.Optional;\n\nimport org.springdoc.demo.resource.model.Foo;\n\n\npublic interface IFooService {\n\tOptional<Foo> findById(Long id);\n\n\tFoo save(Foo foo);\n\n\tIterable<Foo> findAll();\n\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/service/impl/FooServiceImpl.java",
    "content": "package org.springdoc.demo.resource.service.impl;\n\nimport java.util.Optional;\n\nimport org.springdoc.demo.resource.model.Foo;\nimport org.springdoc.demo.resource.repository.IFooRepository;\nimport org.springdoc.demo.resource.service.IFooService;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class FooServiceImpl implements IFooService {\n\n\tprivate IFooRepository fooRepository;\n\n\tpublic FooServiceImpl(IFooRepository fooRepository) {\n\t\tthis.fooRepository = fooRepository;\n\t}\n\n\t@Override\n\tpublic Optional<Foo> findById(Long id) {\n\t\treturn fooRepository.findById(id);\n\t}\n\n\t@Override\n\tpublic Foo save(Foo foo) {\n\t\treturn fooRepository.save(foo);\n\t}\n\n\t@Override\n\tpublic Iterable<Foo> findAll() {\n\t\treturn fooRepository.findAll();\n\t}\n}\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/web/controller/FooController.java",
    "content": "package org.springdoc.demo.resource.web.controller;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.List;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport org.springdoc.demo.resource.model.Foo;\nimport org.springdoc.demo.resource.service.IFooService;\nimport org.springdoc.demo.resource.web.dto.FooDTO;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.server.ResponseStatusException;\n\n@RestController\n@RequestMapping(value = \"/api/foos\")\n@SecurityRequirement(name = \"security_auth\")\npublic class FooController {\n\n\tprivate IFooService fooService;\n\n\tpublic FooController(IFooService fooService) {\n\t\tthis.fooService = fooService;\n\t}\n\n\t@GetMapping(value = \"/{id}\")\n\tpublic FooDTO findOne(@PathVariable Long id) {\n\t\tFoo entity = fooService.findById(id)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t\treturn convertToDto(entity);\n\t}\n\n\t@ResponseStatus(HttpStatus.CREATED)\n\t@PostMapping\n\tpublic void create(@RequestBody FooDTO newFoo) {\n\t\tFoo entity = convertToEntity(newFoo);\n\t\tthis.fooService.save(entity);\n\t}\n\n\t@GetMapping\n\tpublic Collection<FooDTO> findAll() {\n\t\tIterable<Foo> foos = this.fooService.findAll();\n\t\tList<FooDTO> fooDtos = new ArrayList<>();\n\t\tfoos.forEach(p -> fooDtos.add(convertToDto(p)));\n\t\treturn fooDtos;\n\t}\n\n\t@PutMapping(\"/{id}\")\n\tpublic FooDTO updateFoo(@PathVariable(\"id\") Long id, @RequestBody FooDTO updatedFoo) {\n\t\tFoo fooEntity = convertToEntity(updatedFoo);\n\t\treturn this.convertToDto(this.fooService.save(fooEntity));\n\t}\n\n\tprotected FooDTO convertToDto(Foo entity) {\n\t\tFooDTO dto = new FooDTO(entity.getId(), entity.getName());\n\n\t\treturn dto;\n\t}\n\n\tprotected Foo convertToEntity(FooDTO dto) {\n\t\tFoo foo = new Foo(dto.getName());\n\t\tif (!StringUtils.isEmpty(dto.getId())) {\n\t\t\tfoo.setId(dto.getId());\n\t\t}\n\t\treturn foo;\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/web/controller/UserInfoController.java",
    "content": "package org.springdoc.demo.resource.web.controller;\n\nimport java.util.Collections;\nimport java.util.Map;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n\nimport org.springframework.security.core.annotation.AuthenticationPrincipal;\nimport org.springframework.security.oauth2.jwt.Jwt;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class UserInfoController {\n\n\t@GetMapping(\"/user/info\")\n\t@SecurityRequirement(name = \"security_auth\")\n\tpublic Map<String, Object> getUserInfo(@AuthenticationPrincipal Jwt principal) {\n\t\treturn Collections.singletonMap(\"user_name\", principal.getClaimAsString(\"sub\"));\n\t}\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/java/org/springdoc/demo/resource/web/dto/FooDTO.java",
    "content": "package org.springdoc.demo.resource.web.dto;\n\nimport java.util.UUID;\n\npublic class FooDTO {\n\tprivate UUID id;\n\n\tprivate String name;\n\n\tpublic FooDTO() {\n\t\tsuper();\n\t}\n\n\tpublic FooDTO(final UUID id, final String name) {\n\t\tsuper();\n\n\t\tthis.id = id;\n\t\tthis.name = name;\n\t}\n\n\tpublic UUID getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(UUID id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(final String name) {\n\t\tthis.name = name;\n\t}\n\n}"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/resources/application.yml",
    "content": "server:\n  port: 8081\n  forward-headers-strategy: framework\n  servlet:\n    context-path: /resource-server\n\n####### resource server configuration properties\nspring:\n  jpa:\n    defer-datasource-initialization: true\n  security:\n    oauth2:\n      resourceserver:\n        jwt:\n          issuer-uri: ${OAUTH2_SERVER:http://127.0.0.1:8083}\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    oauth:\n      clientId: newClient\n      clientSecret: newClientSecret\n  oAuthFlow:\n    authorizationUrl: ${OAUTH2_SERVER:http://127.0.0.1:8083}/oauth2/authorize\n    tokenUrl: ${OAUTH2_SERVER:http://127.0.0.1:8083}/oauth2/token\n"
  },
  {
    "path": "demo-oauth2/oauth-resource-server-webmvc/src/main/resources/data.sql",
    "content": "INSERT INTO Foo(id, name)\nVALUES ('dc58c780-a571-437e-85e2-9be232c5cd80', 'Foo 1');\nINSERT INTO Foo(id, name)\nVALUES ('dc58c780-a571-437e-85e2-9be232c5cd84', 'Foo 2');\nINSERT INTO Foo(id, name)\nVALUES ('dc58c780-a571-437e-85e2-9be232c5cd83', 'Foo 3');\n\n"
  },
  {
    "path": "demo-oauth2/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<packaging>pom</packaging>\n\t<artifactId>demo-oauth2</artifactId>\n\n\t<modules>\n\t\t<module>oauth-authorization-server</module>\n\t\t<module>oauth-resource-server-webflux</module>\n\t\t<module>oauth-resource-server-webmvc</module>\n\t</modules>\n\t\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-surefire-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<excludes>\n\t\t\t\t\t\t<exclude>**/*LiveTest.java</exclude>\n\t\t\t\t\t</excludes>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-person-service/.gitattributes",
    "content": "#\n# https://help.github.com/articles/dealing-with-line-endings/\n#\n# These are explicitly windows files and should use crlf\n*.bat           text eol=crlf\n\n"
  },
  {
    "path": "demo-person-service/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-person-service/README.md",
    "content": "### Relevant Articles:\n\n- [DZone Part1](https://dzone.com/articles/openapi-3-documentation-with-spring-boot)\n- [DZone Part2](https://dzone.com/articles/doing-more-with-springdoc-openapi)\n\n\n### Building native image with GraalVM\n\nTo create a `native image`, Run the following command\n\n```sh\nmvn -Pnative clean native:compile \n```\n"
  },
  {
    "path": "demo-person-service/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<description>Demo project for Spring Boot with openapi 3 documentation</description>\n\t<artifactId>demo-person-service</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<!-- OpenAPI 3 -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.javamoney.moneta</groupId>\n\t\t\t<artifactId>moneta-core</artifactId>\n\t\t\t<version>1.3</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.zalando</groupId>\n\t\t\t<artifactId>jackson-datatype-money</artifactId>\n\t\t\t<version>1.1.1</version>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/SampleApplication.java",
    "content": "package org.springdoc.demo.services.person;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport io.swagger.v3.oas.models.security.SecurityScheme;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication()\npublic class SampleApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SampleApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components().addSecuritySchemes(\"basicScheme\",\n\t\t\t\t\t\tnew SecurityScheme().type(SecurityScheme.Type.HTTP).scheme(\"basic\")))\n\t\t\t\t.info(new Info().title(\"Person API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n\n}"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/config/SampleConfig.java",
    "content": "package org.springdoc.demo.services.person.config;\n\nimport javax.money.MonetaryAmount;\n\nimport jakarta.annotation.PostConstruct;\nimport org.javamoney.moneta.Money;\nimport org.zalando.jackson.datatype.money.MoneyModule;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport static org.springdoc.core.utils.SpringDocUtils.getConfig;\n\n@Configuration\npublic class SampleConfig {\n\n\t@PostConstruct\n\tpublic void initConfig() {\n\t\tgetConfig().replaceWithClass(MonetaryAmount.class,\n\t\t\t\torg.springdoc.core.converters.models.MonetaryAmount.class);\n\t}\n\n\t@Bean\n\tpublic MoneyModule moneyModule() {\n\t\treturn new MoneyModule().withMonetaryAmount(Money::of);\n\t}\n}\n"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/controller/PersonController.java",
    "content": "package org.springdoc.demo.services.person.controller;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\n\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\nimport org.springdoc.demo.services.person.model.Person;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class PersonController {\n\n\tprivate Random ran = new Random();\n\n\t@PostMapping(\"/persons\")\n\tpublic Person person(@Valid @RequestBody Person person) {\n\t\tint nxt = ran.nextInt(10);\n\t\tif (nxt >= 5) {\n\t\t\tthrow new RuntimeException(\"Breaking logic\");\n\t\t}\n\t\treturn person;\n\t}\n\n\t@GetMapping(path = \"/persons\")\n\tpublic List<Person> findByLastName(@RequestParam @NotBlank @Size(max = 10) String lastName) {\n\t\tList<Person> hardCoded = new ArrayList<>();\n\t\tPerson person = new Person();\n\t\tperson.setAge(20);\n\t\tperson.setEmail1(\"abc1@abc.com\");\n\t\tperson.setEmail2(\"abc@abc.com\");\n\t\tperson.setFirstName(\"Somefirstname\");\n\t\tperson.setLastName(lastName);\n\t\tperson.setId(1);\n\t\thardCoded.add(person);\n\t\treturn hardCoded;\n\n\t}\n}\n"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/exceptions/ErrorMessage.java",
    "content": "package org.springdoc.demo.services.person.exceptions;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n\npublic class ErrorMessage {\n\n\tprivate List<String> errors;\n\n\tpublic ErrorMessage() {\n\t}\n\n\tpublic ErrorMessage(List<String> errors) {\n\t\tthis.errors = errors;\n\t}\n\n\tpublic ErrorMessage(String error) {\n\t\tthis(Collections.singletonList(error));\n\t}\n\n\tpublic ErrorMessage(String... errors) {\n\t\tthis(Arrays.asList(errors));\n\t}\n\n\tpublic List<String> getErrors() {\n\t\treturn errors;\n\t}\n\n\tpublic void setErrors(List<String> errors) {\n\t\tthis.errors = errors;\n\t}\n}"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/exceptions/GlobalControllerAdvice.java",
    "content": "package org.springdoc.demo.services.person.exceptions;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Set;\nimport java.util.UUID;\n\nimport jakarta.validation.ConstraintViolation;\nimport jakarta.validation.ConstraintViolationException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport org.springdoc.demo.services.person.controller.PersonController;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.http.converter.HttpMessageNotReadableException;\nimport org.springframework.validation.FieldError;\nimport org.springframework.validation.ObjectError;\nimport org.springframework.web.HttpMediaTypeNotSupportedException;\nimport org.springframework.web.bind.MethodArgumentNotValidException;\nimport org.springframework.web.bind.MissingServletRequestParameterException;\nimport org.springframework.web.bind.annotation.ControllerAdvice;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\n\n\n@ControllerAdvice(assignableTypes = PersonController.class)\npublic class GlobalControllerAdvice {\n\t/**\n\t * Note use base class if you wish to leverage its handling.\n\t * Some code will need changing.\n\t */\n\tprivate static final Logger logger = LoggerFactory.getLogger(GlobalControllerAdvice.class);\n\n\t@ExceptionHandler(Throwable.class)\n\t@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)\n\tpublic ResponseEntity<Problem> problem(final Throwable e) {\n\t\tString message = e.getMessage();\n\t\t//might actually prefer to use a geeric mesasge\n\n\t\tmessage = \"Problem occured\";\n\t\tUUID uuid = UUID.randomUUID();\n\t\tString logRef = uuid.toString();\n\t\tlogger.error(\"logRef=\" + logRef, message, e);\n\t\treturn new ResponseEntity<Problem>(new Problem(logRef, message), HttpStatus.INTERNAL_SERVER_ERROR);\n\t}\n\n\n\t@ExceptionHandler(MethodArgumentNotValidException.class)\n\t@ResponseStatus(code = HttpStatus.BAD_REQUEST)\n\tpublic ResponseEntity<ErrorMessage> handleMethodArgumentNotValid(MethodArgumentNotValidException ex\n\t) {\n\t\tList<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();\n\t\tList<ObjectError> globalErrors = ex.getBindingResult().getGlobalErrors();\n\t\tList<String> errors = new ArrayList<>(fieldErrors.size() + globalErrors.size());\n\t\tString error;\n\t\tfor (FieldError fieldError : fieldErrors) {\n\t\t\terror = fieldError.getField() + \", \" + fieldError.getDefaultMessage();\n\t\t\terrors.add(error);\n\t\t}\n\t\tfor (ObjectError objectError : globalErrors) {\n\t\t\terror = objectError.getObjectName() + \", \" + objectError.getDefaultMessage();\n\t\t\terrors.add(error);\n\t\t}\n\t\tErrorMessage errorMessage = new ErrorMessage(errors);\n\n\t\t//Object result=ex.getBindingResult();//instead of above can allso pass the more detailed bindingResult\n\t\treturn new ResponseEntity(errorMessage, HttpStatus.BAD_REQUEST);\n\t}\n\n\t@ExceptionHandler(ConstraintViolationException.class)\n\t@ResponseStatus(code = HttpStatus.BAD_REQUEST)\n\tpublic ResponseEntity<ErrorMessage> handleConstraintViolatedException(ConstraintViolationException ex\n\t) {\n\t\tSet<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();\n\n\n\t\tList<String> errors = new ArrayList<>(constraintViolations.size());\n\t\tString error;\n\t\tfor (ConstraintViolation constraintViolation : constraintViolations) {\n\n\t\t\terror = constraintViolation.getMessage();\n\t\t\terrors.add(error);\n\t\t}\n\n\t\tErrorMessage errorMessage = new ErrorMessage(errors);\n\t\treturn new ResponseEntity(errorMessage, HttpStatus.BAD_REQUEST);\n\t}\n\n\t@ExceptionHandler(MissingServletRequestParameterException.class)\n\t@ResponseStatus(code = HttpStatus.BAD_REQUEST)\n\tpublic ResponseEntity<ErrorMessage> handleMissingServletRequestParameterException(MissingServletRequestParameterException ex\n\t) {\n\n\t\tList<String> errors = new ArrayList<>();\n\t\tString error = ex.getParameterName() + \", \" + ex.getMessage();\n\t\terrors.add(error);\n\t\tErrorMessage errorMessage = new ErrorMessage(errors);\n\t\treturn new ResponseEntity(errorMessage, HttpStatus.BAD_REQUEST);\n\t}\n\n\n\t@ExceptionHandler(HttpMediaTypeNotSupportedException.class)\n\t@ResponseStatus(code = HttpStatus.UNSUPPORTED_MEDIA_TYPE)\n\tpublic ResponseEntity<ErrorMessage> handleHttpMediaTypeNotSupported(HttpMediaTypeNotSupportedException ex\n\t) {\n\t\tString unsupported = \"Unsupported content type: \" + ex.getContentType();\n\t\tString supported = \"Supported content types: \" + MediaType.toString(ex.getSupportedMediaTypes());\n\t\tErrorMessage errorMessage = new ErrorMessage(unsupported, supported);\n\t\treturn new ResponseEntity(errorMessage, HttpStatus.UNSUPPORTED_MEDIA_TYPE);\n\t}\n\n\t@ExceptionHandler(HttpMessageNotReadableException.class)\n\t@ResponseStatus(code = HttpStatus.BAD_REQUEST)\n\tpublic ResponseEntity<ErrorMessage> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {\n\t\tErrorMessage errorMessage = new ErrorMessage(ex.getMessage());\n\t\treturn new ResponseEntity(errorMessage, HttpStatus.BAD_REQUEST);\n\t}\n\n}"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/exceptions/Problem.java",
    "content": "package org.springdoc.demo.services.person.exceptions;\n\npublic class Problem {\n\n\tprivate String logRef;\n\n\tprivate String message;\n\n\tpublic Problem(String logRef, String message) {\n\t\tsuper();\n\t\tthis.logRef = logRef;\n\t\tthis.message = message;\n\t}\n\n\tpublic Problem() {\n\t\tsuper();\n\n\t}\n\n\tpublic String getLogRef() {\n\t\treturn logRef;\n\t}\n\n\tpublic void setLogRef(String logRef) {\n\t\tthis.logRef = logRef;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n}\n"
  },
  {
    "path": "demo-person-service/src/main/java/org/springdoc/demo/services/person/model/Person.java",
    "content": "package org.springdoc.demo.services.person.model;\n\nimport javax.money.MonetaryAmount;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport jakarta.validation.constraints.Email;\nimport jakarta.validation.constraints.Max;\nimport jakarta.validation.constraints.Min;\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Pattern;\nimport jakarta.validation.constraints.Size;\n\npublic class Person {\n\n\tprivate long id;\n\n\t@Size(min = 2, max = 50)\n\t@NotBlank\n\tprivate String firstName;\n\n\t@Size(min = 2, max = 50)\n\t@NotBlank\n\tprivate String lastName;\n\n\t@Pattern(regexp = \".+@.+\\\\..+\", message = \"Please provide a valid email address\")\n\tprivate String email1;\n\n\t@Email\n\tprivate String email2;\n\n\t@Min(18)\n\t@Max(30)\n\tprivate int age;\n\n\t@JsonProperty\n\tprivate MonetaryAmount worth;\n\n\tpublic MonetaryAmount getWorth() {\n\t\treturn worth;\n\t}\n\n\tpublic void setWorth(MonetaryAmount worth) {\n\t\tthis.worth = worth;\n\t}\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getEmail1() {\n\t\treturn email1;\n\t}\n\n\tpublic void setEmail1(String email1) {\n\t\tthis.email1 = email1;\n\t}\n\n\tpublic String getEmail2() {\n\t\treturn email2;\n\t}\n\n\tpublic void setEmail2(String email2) {\n\t\tthis.email2 = email2;\n\t}\n\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\n\tpublic void setFirstName(String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\n\tpublic void setLastName(String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n}"
  },
  {
    "path": "demo-person-service/src/main/resources/application.properties",
    "content": "springdoc.version=@springdoc.version@\nspringdoc.swagger-ui.use-root-path=true\nserver.forward-headers-strategy=framework\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-spring-boot-3-webflux/.java-version",
    "content": "graalvm64-17.0.5\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/README.md",
    "content": "# springdoc-openapi demo with spring-boot-2 web-flux\n\n## Building application\n\n### Pre-requisites\n\n- JDK 8+\n- maven 3\n- docker CLI\n\n### Option 1: Building Executable JAR\n\nTo create an `executable jar`, simply run:\n\n```sh\n mvn clean package\n```\n\n### Option 2: Building a non-native OCI Images\n\nTo create a non-native OCI docker image, simply run:\n\n```sh\nmvn clean spring-boot:build-image\n```\n\n### Option 3: Building native image with GraalVM\n\nTo create a `native image`, Run the following command\n\n```sh\nmvn -Pnative clean native:compile \n```\n\n## Running the native application\n\nTo run the demo using docker, invoke the following:\n\n```sh\ndocker run --rm -p 8080:8082 springdoc-openapi-spring-boot-2-webflux:3.1.6-SNAPSHOT\n```\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-boot-3-webflux</artifactId>\n\n\t<dependencies>\n\t\t<!-- springdoc ui -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>\n\t\t</dependency>\n\t\t<!-- webflux -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-webflux</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.projectreactor</groupId>\n\t\t\t<artifactId>reactor-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<apiDocsUrl>http://localhost:8080/v3/api-docs.yaml</apiDocsUrl>\n\t\t\t\t\t<outputFileName>openapi.yaml</outputFileName>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<id>integration-test</id>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>generate</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t\t<configuration>\n\t\t\t\t\t<jvmArguments>-Dspring.application.admin.enabled=true</jvmArguments>\n\t\t\t\t</configuration>\n\t\t\t\t<executions>\n\t\t\t\t\t<execution>\n\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t<goal>start</goal>\n\t\t\t\t\t\t\t<goal>stop</goal>\n\t\t\t\t\t\t</goals>\n\t\t\t\t\t</execution>\n\t\t\t\t</executions>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/WebfluxDemoApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport io.swagger.v3.oas.models.security.SecurityScheme;\nimport org.springdoc.core.models.GroupedOpenApi;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;\n\n@SpringBootApplication\n@EnableReactiveMongoRepositories\npublic class WebfluxDemoApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebfluxDemoApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components().addSecuritySchemes(\"basicScheme\",\n\t\t\t\t\t\tnew SecurityScheme().type(SecurityScheme.Type.HTTP).scheme(\"basic\")))\n\t\t\t\t.info(new Info().title(\"Tweet API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n\n\n\t@Bean\n\tpublic GroupedOpenApi storeOpenApi() {\n\t\tString[] paths = { \"/tweets/**\" };\n\t\treturn GroupedOpenApi.builder().group(\"tweets\").pathsToMatch(paths)\n\t\t\t\t.build();\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi userOpenApi() {\n\t\tString[] paths = { \"/stream/**\" };\n\t\tString[] packagedToMatch = { \"org.springdoc.demo.app3\" };\n\t\treturn GroupedOpenApi.builder().group(\"x-stream\").pathsToMatch(paths).packagesToScan(packagedToMatch)\n\t\t\t\t.build();\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/controller/ExceptionTranslator.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport org.springdoc.demo.app3.exception.TweetNotFoundException;\nimport org.springdoc.demo.app3.payload.ErrorResponse;\n\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\n@RestControllerAdvice\npublic class ExceptionTranslator {\n\n\n\t@SuppressWarnings(\"rawtypes\")\n\t@ExceptionHandler(DuplicateKeyException.class)\n\t@ResponseStatus(HttpStatus.CONFLICT)\n\tpublic ResponseEntity handleDuplicateKeyException(DuplicateKeyException ex) {\n\t\treturn ResponseEntity.status(HttpStatus.CONFLICT)\n\t\t\t\t.body(new ErrorResponse(\"A Tweet with the same text already exists\"));\n\t}\n\n\t@SuppressWarnings(\"rawtypes\")\n\t@ExceptionHandler(TweetNotFoundException.class)\n\t@ResponseStatus(HttpStatus.NOT_FOUND)\n\tpublic ResponseEntity handleTweetNotFoundException(TweetNotFoundException ex) {\n\t\treturn ResponseEntity.notFound().build();\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/controller/TweetController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.responses.ApiResponses;\nimport jakarta.validation.Valid;\nimport org.springdoc.demo.app3.dto.TweetDTO;\nimport org.springdoc.demo.app3.model.Tweet;\nimport org.springdoc.demo.app3.repository.TweetRepository;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * Created by bnasslahsen\n */\n@RestController\npublic class TweetController {\n\n\tprivate final TweetRepository tweetRepository;\n\n\tprivate final TweetMapper tweetMapper;\n\n\tpublic TweetController(TweetRepository tweetRepository, TweetMapper tweetMapper) {\n\t\tthis.tweetRepository = tweetRepository;\n\t\tthis.tweetMapper = tweetMapper;\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"get All Tweets\") })\n\t@GetMapping(\"/tweets\")\n\tpublic Flux<TweetDTO> getAllTweets() {\n\t\tFlux<Tweet> tweet = tweetRepository.findAll();\n\t\treturn tweetMapper.toDTO(tweet);\n\t}\n\n\t@PostMapping(\"/tweets\")\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"create Tweets\") })\n\tpublic Mono<TweetDTO> createTweets(@Valid @RequestBody TweetDTO tweetDTO) {\n\t\treturn tweetRepository.save(tweetMapper.toEntity(tweetDTO)).map(tweetMapper::toDTO);\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"get Tweet By Id\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@GetMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<TweetDTO>> getTweetById(@PathVariable(value = \"id\") String tweetId) {\n\t\treturn tweetRepository.findById(tweetId).map(savedTweet -> ResponseEntity.ok(tweetMapper.toDTO(savedTweet)))\n\t\t\t\t.defaultIfEmpty(ResponseEntity.notFound().build());\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"update Tweet\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@PutMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<TweetDTO>> updateTweet(@PathVariable(value = \"id\") String tweetId,\n\t\t\t@Valid @RequestBody TweetDTO tweetDTO) {\n\t\treturn tweetRepository.findById(tweetId).flatMap(existingTweet -> {\n\t\t\texistingTweet.setText(tweetMapper.toEntity(tweetDTO).getText());\n\t\t\treturn tweetRepository.save(existingTweet);\n\t\t}).map(updateTweet -> new ResponseEntity<>(tweetMapper.toDTO(updateTweet), HttpStatus.OK))\n\t\t\t\t.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"delete Tweet\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@DeleteMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<Void>> deleteTweet(@PathVariable(value = \"id\") String tweetId) {\n\t\treturn tweetRepository.findById(tweetId)\n\t\t\t\t.flatMap(existingTweet -> tweetRepository.delete(existingTweet)\n\t\t\t\t\t\t.then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK))))\n\t\t\t\t.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));\n\t}\n\n\t@Operation(description = \"Tweets are Sent to the client as Server Sent Events\", responses = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"stream All Tweets\") })\n\t@GetMapping(value = \"/stream/tweets\", produces = MediaType.TEXT_EVENT_STREAM_VALUE)\n\tpublic Flux<TweetDTO> streamAllTweets() {\n\t\treturn tweetMapper.toDTO(tweetRepository.findAll());\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/controller/TweetMapper.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport org.springdoc.demo.app3.dto.TweetDTO;\nimport org.springdoc.demo.app3.model.Tweet;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class TweetMapper {\n\n\tFlux<TweetDTO> toDTO(Flux<Tweet> tweet) {\n\t\treturn tweet.map(this::toDTO);\n\t}\n\n\tFlux<Tweet> toEntity(Flux<TweetDTO> tweetDTO) {\n\t\treturn tweetDTO.map(this::toEntity);\n\t}\n\n\tMono<TweetDTO> toDTO(Mono<Tweet> tweet) {\n\t\treturn tweet.map(this::toDTO);\n\t}\n\n\tMono<Tweet> toEntity(Mono<TweetDTO> tweetDTO) {\n\t\treturn tweetDTO.map(this::toEntity);\n\t}\n\n\tTweetDTO toDTO(Tweet tweet) {\n\t\tTweetDTO teTweetDTO = new TweetDTO();\n\t\tBeanUtils.copyProperties(tweet,teTweetDTO);\n\t\treturn teTweetDTO;\n\t}\n\n\tTweet toEntity(TweetDTO tweetDTO) {\n\t\tTweet teTweet = new Tweet();\n\t\tBeanUtils.copyProperties(tweetDTO, teTweet);\n\t\treturn teTweet;\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/dto/TweetDTO.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.dto;\n\nimport java.util.Date;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.validation.constraints.Size;\n\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\npublic class TweetDTO {\n\tprivate String id;\n\n\t@NotBlank\n\t@Size(max = 140)\n\tprivate String text;\n\n\t@NotNull\n\tprivate Date createdAt = new Date();\n\n\tpublic TweetDTO() {\n\n\t}\n\n\tpublic TweetDTO(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getText() {\n\t\treturn text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic Date getCreatedAt() {\n\t\treturn createdAt;\n\t}\n\n\tpublic void setCreatedAt(Date createdAt) {\n\t\tthis.createdAt = createdAt;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/exception/TweetNotFoundException.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.exception;\n\n/**\n * Created by bnasslahsen\n */\npublic class TweetNotFoundException extends RuntimeException {\n\n\t/**\n\t *\n\t */\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic TweetNotFoundException(String tweetId) {\n\t\tsuper(\"Tweet not found with id \" + tweetId);\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/model/Tweet.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.model;\n\nimport java.util.Date;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.validation.constraints.Size;\n\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.mongodb.core.mapping.Document;\n\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\n@Document(collection = \"tweets\")\npublic class Tweet {\n\t@Id\n\tprivate String id;\n\n\t@NotBlank\n\t@Size(max = 140)\n\tprivate String text;\n\n\t@NotNull\n\tprivate Date createdAt = new Date();\n\n\tpublic Tweet() {\n\n\t}\n\n\tpublic Tweet(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getText() {\n\t\treturn text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic Date getCreatedAt() {\n\t\treturn createdAt;\n\t}\n\n\tpublic void setCreatedAt(Date createdAt) {\n\t\tthis.createdAt = createdAt;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/payload/ErrorResponse.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.payload;\n\n/**\n * Created by bnasslahsen\n */\npublic class ErrorResponse {\n\tprivate String message;\n\n\tpublic ErrorResponse(String message) {\n\t\tthis.message = message;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/java/org/springdoc/demo/app3/repository/TweetRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.repository;\n\nimport org.springdoc.demo.app3.model.Tweet;\n\nimport org.springframework.data.mongodb.repository.ReactiveMongoRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\n@Repository\npublic interface TweetRepository extends ReactiveMongoRepository<Tweet, String> {\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/resources/META-INF/native-image/reflect-config.json",
    "content": "[\n  {\n    \"name\": \"org.springdoc.demo.app3.dto.TweetDTO[]\"\n  }\n]\n"
  },
  {
    "path": "demo-spring-boot-3-webflux/src/main/resources/application.yml",
    "content": "server:\n  port: 8082\n  forward-headers-strategy: framework\n\nspring:\n  data:\n    mongodb:\n      uri: ${SPRING_DATA_MONGODB_URI:mongodb://localhost:27017/tweetsdb}\n\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-boot-3-webflux-functional</artifactId>\n\n\t<dependencies>\n\t\t<!-- springdoc ui -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>\n\t\t</dependency>\n\t\t<!-- webflux -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-webflux</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.projectreactor</groupId>\n\t\t\t<artifactId>reactor-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-r2dbc</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.projectlombok</groupId>\n\t\t\t<artifactId>lombok</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.r2dbc</groupId>\n\t\t\t<artifactId>r2dbc-h2</artifactId>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/AppNativeConfiguration.java",
    "content": "package org.springdoc.demo.app4;\n\nimport java.util.Arrays;\n\nimport org.springdoc.demo.app4.AppNativeConfiguration.AppNativeRuntimeHints;\nimport org.springdoc.demo.app4.coffee.CoffeeService;\nimport org.springdoc.demo.app4.employee.EmployeeRepository;\n\nimport org.springframework.aot.hint.MemberCategory;\nimport org.springframework.aot.hint.RuntimeHints;\nimport org.springframework.aot.hint.RuntimeHintsRegistrar;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.context.annotation.ImportRuntimeHints;\n\n/**\n * @author bnasslahsen\n */\n@Configuration\n@ImportRuntimeHints(AppNativeRuntimeHints.class)\npublic class AppNativeConfiguration {\n\n\tstatic Class[] applicationClasses = { org.springdoc.demo.app4.user.User[].class,\n\t\t\torg.springdoc.demo.app4.employee.Employee[].class,\n\t\t\torg.springdoc.demo.app4.coffee.Coffee[].class,\n\t\t\torg.springdoc.demo.app4.coffee.CoffeeOrder[].class,\n\t\t\tEmployeeRepository.class,\n\t\t\tCoffeeService.class\n\t};\n\n\tstatic class AppNativeRuntimeHints implements RuntimeHintsRegistrar {\n\n\t\t@Override\n\t\tpublic void registerHints(RuntimeHints hints, ClassLoader classLoader) {\n\t\t\tArrays.stream(applicationClasses).forEach(applicationClass ->\n\t\t\t\t\thints.reflection().registerType(applicationClass,\n\t\t\t\t\t\t\t(hint) -> hint.withMembers(MemberCategory.DECLARED_FIELDS,\n\t\t\t\t\t\t\t\t\tMemberCategory.INVOKE_DECLARED_CONSTRUCTORS,\n\t\t\t\t\t\t\t\t\tMemberCategory.INVOKE_DECLARED_METHODS)));\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/WebfluxFunctionalDemoApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app4;\n\nimport io.swagger.v3.oas.models.info.Info;\nimport org.springdoc.core.models.GroupedOpenApi;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class WebfluxFunctionalDemoApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebfluxFunctionalDemoApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi employeesOpenApi(@Value(\"${springdoc.version}\") String appVersion) {\n\t\tString[] paths = { \"/employees/**\" };\n\t\treturn GroupedOpenApi.builder().group(\"employees\")\n\t\t\t\t.addOpenApiCustomizer(openApi -> openApi.info(new Info().title(\"Employees API\").version(appVersion)))\n\t\t\t\t.pathsToMatch(paths)\n\t\t\t\t.build();\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi userOpenApi(@Value(\"${springdoc.version}\") String appVersion) {\n\t\tString[] paths = { \"/api/user/**\" };\n\t\treturn GroupedOpenApi.builder().group(\"users\")\n\t\t\t\t.addOpenApiCustomizer(openApi -> openApi.info(new Info().title(\"Users API\").version(appVersion)))\n\t\t\t\t.pathsToMatch(paths)\n\t\t\t\t.build();\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi coffeeOpenApi(@Value(\"${springdoc.version}\") String appVersion) {\n\t\tString[] paths = { \"/coffees/**\" };\n\t\treturn GroupedOpenApi.builder().group(\"coffees\")\n\t\t\t\t.addOpenApiCustomizer(openApi -> openApi.info(new Info().title(\"Coffees API\").version(appVersion)))\n\t\t\t\t.pathsToMatch(paths)\n\t\t\t\t.build();\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/coffee/Coffee.java",
    "content": "package org.springdoc.demo.app4.coffee;\n\nimport java.util.Objects;\n\nimport org.springframework.data.annotation.Id;\n\npublic class Coffee {\n\t@Id\n\tprivate String id;\n\n\tprivate String name;\n\n\tpublic Coffee() {\n\t}\n\n\tpublic Coffee(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic Coffee(String id, String name) {\n\t\tthis.id = id;\n\t\tthis.name = name;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) return true;\n\t\tif (o == null || getClass() != o.getClass()) return false;\n\t\tCoffee coffee = (Coffee) o;\n\t\treturn Objects.equals(id, coffee.id) &&\n\t\t\t\tObjects.equals(name, coffee.name);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, name);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"Coffee{\" +\n\t\t\t\t\"id='\" + id + '\\'' +\n\t\t\t\t\", name='\" + name + '\\'' +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/coffee/CoffeeOrder.java",
    "content": "package org.springdoc.demo.app4.coffee;\n\nimport java.time.Instant;\nimport java.util.Objects;\n\npublic class CoffeeOrder {\n\tprivate String coffeeId;\n\n\tprivate Instant whenOrdered;\n\n\tpublic CoffeeOrder() {\n\t}\n\n\tpublic CoffeeOrder(String coffeeId, Instant whenOrdered) {\n\t\tthis.coffeeId = coffeeId;\n\t\tthis.whenOrdered = whenOrdered;\n\t}\n\n\tpublic String getCoffeeId() {\n\t\treturn coffeeId;\n\t}\n\n\tpublic Instant getWhenOrdered() {\n\t\treturn whenOrdered;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) return true;\n\t\tif (o == null || getClass() != o.getClass()) return false;\n\t\tCoffeeOrder that = (CoffeeOrder) o;\n\t\treturn Objects.equals(coffeeId, that.coffeeId) &&\n\t\t\t\tObjects.equals(whenOrdered, that.whenOrdered);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(coffeeId, whenOrdered);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\treturn \"CoffeeOrder{\" +\n\t\t\t\t\"coffeeId='\" + coffeeId + '\\'' +\n\t\t\t\t\", whenOrdered=\" + whenOrdered +\n\t\t\t\t'}';\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/coffee/CoffeeRepository.java",
    "content": "package org.springdoc.demo.app4.coffee;\n\nimport org.springframework.data.repository.reactive.ReactiveCrudRepository;\n\npublic interface CoffeeRepository extends ReactiveCrudRepository<Coffee, String> {\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/coffee/CoffeeService.java",
    "content": "package org.springdoc.demo.app4.coffee;\n\nimport java.time.Duration;\nimport java.time.Instant;\n\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.stereotype.Service;\n\n@Service\npublic class CoffeeService {\n\tprivate final CoffeeRepository repo;\n\n\tpublic CoffeeService(CoffeeRepository repo) {\n\t\tthis.repo = repo;\n\t}\n\n\tFlux<Coffee> getAllCoffees() {\n\t\treturn repo.findAll();\n\t}\n\n\tMono<Coffee> getCoffeeById(@Parameter(in = ParameterIn.PATH) String id) {\n\t\treturn repo.findById(id);\n\t}\n\n\tFlux<CoffeeOrder> getOrdersForCoffeeById(@Parameter(in = ParameterIn.PATH) String coffeeId) {\n\t\treturn Flux.interval(Duration.ofSeconds(1))\n\t\t\t\t.onBackpressureDrop()\n\t\t\t\t.map(i -> new CoffeeOrder(coffeeId, Instant.now()));\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/coffee/RouteConfig.java",
    "content": "package org.springdoc.demo.app4.coffee;\n\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.reactive.function.server.RouterFunction;\nimport org.springframework.web.reactive.function.server.ServerRequest;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport static org.springdoc.webflux.core.fn.SpringdocRouteBuilder.route;\n\n@Configuration\npublic class RouteConfig {\n\tprivate final CoffeeService service;\n\n\tpublic RouteConfig(CoffeeService service) {\n\t\tthis.service = service;\n\t}\n\n\t@Bean\n\tRouterFunction<ServerResponse> routerFunction() {\n\t\treturn route().GET(\"/coffees\", this::all, ops -> ops.beanClass(CoffeeService.class).beanMethod(\"getAllCoffees\")).build()\n\t\t\t\t.and(route().GET(\"/coffees/{id}\", this::byId, ops -> ops.beanClass(CoffeeService.class).beanMethod(\"getCoffeeById\")).build())\n\t\t\t\t.and(route().GET(\"/coffees/{id}/orders\", this::orders, ops -> ops.beanClass(CoffeeService.class).beanMethod(\"getOrdersForCoffeeById\")).build());\n\t}\n\n\tprivate Mono<ServerResponse> all(ServerRequest req) {\n\t\treturn ServerResponse.ok()\n\t\t\t\t.body(service.getAllCoffees(), Coffee.class);\n\t}\n\n\tprivate Mono<ServerResponse> byId(ServerRequest req) {\n\t\treturn ServerResponse.ok()\n\t\t\t\t.body(service.getCoffeeById(req.pathVariable(\"id\")), Coffee.class);\n\t}\n\n\tprivate Mono<ServerResponse> orders(ServerRequest req) {\n\t\treturn ServerResponse.ok()\n\t\t\t\t.contentType(MediaType.TEXT_EVENT_STREAM)\n\t\t\t\t.body(service.getOrdersForCoffeeById(req.pathVariable(\"id\")), CoffeeOrder.class);\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/employee/Employee.java",
    "content": "package org.springdoc.demo.app4.employee;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n@Data\n@AllArgsConstructor\n@NoArgsConstructor\npublic class Employee {\n\n\tprivate String id;\n\n\tprivate String name;\n\n\t// standard getters and setters\n\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/employee/EmployeeFunctionalConfig.java",
    "content": "package org.springdoc.demo.app4.employee;\n\n\nimport java.util.function.Consumer;\n\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport org.springdoc.core.fn.builders.operation.Builder;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.MediaType;\nimport org.springframework.web.reactive.function.BodyExtractors;\nimport org.springframework.web.reactive.function.server.HandlerFunction;\nimport org.springframework.web.reactive.function.server.RouterFunction;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport static org.springdoc.core.fn.builders.apiresponse.Builder.responseBuilder;\nimport static org.springdoc.core.fn.builders.parameter.Builder.parameterBuilder;\nimport static org.springdoc.webflux.core.fn.SpringdocRouteBuilder.route;\nimport static org.springframework.web.reactive.function.server.RequestPredicates.accept;\nimport static org.springframework.web.reactive.function.server.ServerResponse.ok;\n\n@Configuration\npublic class EmployeeFunctionalConfig {\n\n\n\t@Bean\n\tEmployeeRepository employeeRepository() {\n\t\treturn new EmployeeRepository();\n\t}\n\n\t@Bean\n\tRouterFunction<ServerResponse> getAllEmployeesRoute() {\n\t\treturn route()\n\t\t\t\t.GET(\"/employees\", accept(MediaType.APPLICATION_JSON),\n\t\t\t\t\t\tfindAllEmployeesFunction(), getOpenAPI(\"findAllEmployees\")).build();\n\t}\n\n\n\t@Bean\n\tRouterFunction<ServerResponse> getEmployeeByIdRoute() {\n\t\treturn route().GET(\"/employees/{id}\", findEmployeeByIdFunction(), findEmployeeByIdOpenAPI()).build();\n\t}\n\n\n\t@Bean\n\tRouterFunction<ServerResponse> updateEmployeeRoute() {\n\t\treturn route().POST(\"/employees/update\", accept(MediaType.APPLICATION_XML),\n\t\t\t\tupdateEmployeeFunction(), getOpenAPI(\"updateEmployee\")).build();\n\t}\n\n\tRouterFunction<ServerResponse> composedRoutes() {\n\t\treturn route().GET(\"/employees-composed\", findAllEmployeesFunction(), getOpenAPI(\"findAllEmployees\")).build()\n\t\t\t\t.and(route().GET(\"/employees-composed/{id}\", findEmployeeByIdFunction(), findEmployeeByIdOpenAPI()).build())\n\t\t\t\t.and(route().POST(\"/employees-composed/update\", updateEmployeeFunction(), getOpenAPI(\"updateEmployee\")).build());\n\t}\n\n\tprivate HandlerFunction<ServerResponse> findAllEmployeesFunction() {\n\t\treturn req -> ok().body(\n\t\t\t\temployeeRepository().findAllEmployees(), Employee.class);\n\t}\n\n\tprivate HandlerFunction<ServerResponse> updateEmployeeFunction() {\n\t\treturn req -> req.body(BodyExtractors.toMono(Employee.class))\n\t\t\t\t.doOnNext(employeeRepository()::updateEmployee)\n\t\t\t\t.then(ok().build());\n\t}\n\n\tprivate HandlerFunction<ServerResponse> findEmployeeByIdFunction() {\n\t\treturn req -> ok().body(\n\t\t\t\temployeeRepository().findEmployeeById(req.pathVariable(\"id\")), Employee.class);\n\t}\n\n\tprivate Consumer<Builder> getOpenAPI(String findAllEmployees) {\n\t\treturn ops -> ops.beanClass(EmployeeRepository.class).beanMethod(findAllEmployees);\n\t}\n\n\tprivate Consumer<Builder> findEmployeeByIdOpenAPI() {\n\t\treturn ops -> ops.tag(\"employee\")\n\t\t\t\t.operationId(\"findEmployeeById\").summary(\"Find purchase order by ID\").tags(new String[] { \"MyEmployee\" })\n\t\t\t\t.parameter(parameterBuilder().in(ParameterIn.PATH).name(\"id\").description(\"Employee Id\"))\n\t\t\t\t.response(responseBuilder().responseCode(\"200\").description(\"successful operation\").implementation(Employee.class))\n\t\t\t\t.response(responseBuilder().responseCode(\"400\").description(\"Invalid Employee ID supplied\"))\n\t\t\t\t.response(responseBuilder().responseCode(\"404\").description(\"Employee not found\"));\n\t}\n\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/employee/EmployeeRepository.java",
    "content": "package org.springdoc.demo.app4.employee;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\n@Tag(name = \"Employees\")\npublic class EmployeeRepository {\n\n\tstatic Map<String, Employee> employeeData;\n\n\tstatic Map<String, String> employeeAccessData;\n\n\tstatic {\n\t\temployeeData = new HashMap<>();\n\t\temployeeData.put(\"1\", new Employee(\"1\", \"Employee 1\"));\n\t\temployeeData.put(\"2\", new Employee(\"2\", \"Employee 2\"));\n\t\temployeeData.put(\"3\", new Employee(\"3\", \"Employee 3\"));\n\t\temployeeData.put(\"4\", new Employee(\"4\", \"Employee 4\"));\n\t\temployeeData.put(\"5\", new Employee(\"5\", \"Employee 5\"));\n\t\temployeeData.put(\"6\", new Employee(\"6\", \"Employee 6\"));\n\t\temployeeData.put(\"7\", new Employee(\"7\", \"Employee 7\"));\n\t\temployeeData.put(\"8\", new Employee(\"8\", \"Employee 8\"));\n\t\temployeeData.put(\"9\", new Employee(\"9\", \"Employee 9\"));\n\t\temployeeData.put(\"10\", new Employee(\"10\", \"Employee 10\"));\n\n\t\temployeeAccessData = new HashMap<>();\n\t\temployeeAccessData.put(\"1\", \"Employee 1 Access Key\");\n\t\temployeeAccessData.put(\"2\", \"Employee 2 Access Key\");\n\t\temployeeAccessData.put(\"3\", \"Employee 3 Access Key\");\n\t\temployeeAccessData.put(\"4\", \"Employee 4 Access Key\");\n\t\temployeeAccessData.put(\"5\", \"Employee 5 Access Key\");\n\t\temployeeAccessData.put(\"6\", \"Employee 6 Access Key\");\n\t\temployeeAccessData.put(\"7\", \"Employee 7 Access Key\");\n\t\temployeeAccessData.put(\"8\", \"Employee 8 Access Key\");\n\t\temployeeAccessData.put(\"9\", \"Employee 9 Access Key\");\n\t\temployeeAccessData.put(\"10\", \"Employee 10 Access Key\");\n\t}\n\n\tpublic Mono<Employee> findEmployeeById(@Parameter(in = ParameterIn.PATH) String id) {\n\t\treturn Mono.just(employeeData.get(id));\n\t}\n\n\tpublic Flux<Employee> findAllEmployees() {\n\t\treturn Flux.fromIterable(employeeData.values());\n\t}\n\n\tpublic Mono<Employee> updateEmployee(Employee employee) {\n\t\tEmployee existingEmployee = employeeData.get(employee.getId());\n\t\tif (existingEmployee != null) {\n\t\t\texistingEmployee.setName(employee.getName());\n\t\t}\n\t\treturn Mono.just(existingEmployee);\n\t}\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/user/RoutingConfiguration.java",
    "content": "package org.springdoc.demo.app4.user;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.web.reactive.function.server.RouterFunction;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport static org.springdoc.webflux.core.fn.SpringdocRouteBuilder.route;\nimport static org.springframework.http.MediaType.APPLICATION_JSON;\nimport static org.springframework.web.reactive.function.server.RequestPredicates.accept;\n\n\n@Configuration\npublic class RoutingConfiguration {\n\n\t@Bean\n\tpublic RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {\n\t\treturn route().GET(\"/api/user/index\", accept(APPLICATION_JSON), userHandler::getAll, ops -> ops.beanClass(UserRepository.class).beanMethod(\"getAllUsers\")).build()\n\t\t\t\t.and(route().GET(\"/api/user/{id}\", accept(APPLICATION_JSON), userHandler::getUser, ops -> ops.beanClass(UserRepository.class).beanMethod(\"getUserById\")).build()\n\t\t\t\t\t\t.and(route().POST(\"/api/user/post\", accept(APPLICATION_JSON), userHandler::postUser, ops -> ops.beanClass(UserRepository.class).beanMethod(\"saveUser\")).build())\n\t\t\t\t\t\t.and(route().PUT(\"/api/user/put/{id}\", accept(APPLICATION_JSON), userHandler::putUser, ops -> ops.beanClass(UserRepository.class).beanMethod(\"putUser\")).build())\n\t\t\t\t\t\t.and(route().DELETE(\"/api/user/delete/{id}\", accept(APPLICATION_JSON), userHandler::deleteUser, ops -> ops.beanClass(UserRepository.class).beanMethod(\"deleteUser\")).build()));\n\t}\n\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/user/User.java",
    "content": "package org.springdoc.demo.app4.user;\n\npublic class User {\n\tprivate long id;\n\n\tprivate String firstname;\n\n\tprivate String lastname;\n\n\tprivate int age;\n\n\tpublic User() {\n\t}\n\n\tpublic User(long id, String firstname, String lastname, int age) {\n\t\tthis.id = id;\n\t\tthis.firstname = firstname;\n\t\tthis.lastname = lastname;\n\t\tthis.age = age;\n\t}\n\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getFirstname() {\n\t\treturn firstname;\n\t}\n\n\tpublic void setFirstname(String firstname) {\n\t\tthis.firstname = firstname;\n\t}\n\n\tpublic String getLastname() {\n\t\treturn lastname;\n\t}\n\n\tpublic void setLastname(String lastname) {\n\t\tthis.lastname = lastname;\n\t}\n\n\tpublic int getAge() {\n\t\treturn age;\n\t}\n\n\tpublic void setAge(int age) {\n\t\tthis.age = age;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tString info = String.format(\"id = %d, firstname = %s, lastname = %s, age = %d\", id, firstname, lastname, age);\n\t\treturn info;\n\t}\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/user/UserHandler.java",
    "content": "package org.springdoc.demo.app4.user;\n\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.http.MediaType;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.reactive.function.server.ServerRequest;\nimport org.springframework.web.reactive.function.server.ServerResponse;\n\nimport static org.springframework.web.reactive.function.BodyInserters.fromObject;\n\n@Component\npublic class UserHandler {\n\n\tprivate final UserRepository customerRepository;\n\n\tpublic UserHandler(UserRepository repository) {\n\t\tthis.customerRepository = repository;\n\t}\n\n\t/**\n\t * GET ALL Users\n\t */\n\tpublic Mono<ServerResponse> getAll(ServerRequest request) {\n\t\t// fetch all customers from repository\n\t\tFlux<User> customers = customerRepository.getAllUsers();\n\n\t\t// build response\n\t\treturn ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(customers, User.class);\n\t}\n\n\t/**\n\t * GET a User by ID\n\t */\n\tpublic Mono<ServerResponse> getUser(ServerRequest request) {\n\t\t// parse path-variable\n\t\tlong customerId = Long.valueOf(request.pathVariable(\"id\"));\n\n\t\t// build notFound response\n\t\tMono<ServerResponse> notFound = ServerResponse.notFound().build();\n\n\t\t// get customer from repository\n\t\tMono<User> customerMono = customerRepository.getUserById(customerId);\n\n\t\t// build response\n\t\treturn customerMono\n\t\t\t\t.flatMap(customer -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(customer)))\n\t\t\t\t.switchIfEmpty(notFound);\n\t}\n\n\t/**\n\t * POST a User\n\t */\n\tpublic Mono<ServerResponse> postUser(ServerRequest request) {\n\t\tMono<User> customer = request.bodyToMono(User.class);\n\t\treturn ServerResponse.ok().build(customerRepository.saveUser(customer));\n\t}\n\n\t/**\n\t * PUT a User\n\t */\n\tpublic Mono<ServerResponse> putUser(ServerRequest request) {\n\t\t// parse id from path-variable\n\t\tlong customerId = Long.valueOf(request.pathVariable(\"id\"));\n\n\t\t// get customer data from request object\n\t\tMono<User> customer = request.bodyToMono(User.class);\n\n\t\t// get customer from repository\n\t\tMono<User> responseMono = customerRepository.putUser(customerId, customer);\n\n\t\t// build response\n\t\treturn responseMono\n\t\t\t\t.flatMap(cust -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(fromObject(cust)));\n\t}\n\n\t/**\n\t * DELETE a User\n\t */\n\tpublic Mono<ServerResponse> deleteUser(ServerRequest request) {\n\t\t// parse id from path-variable\n\t\tlong customerId = Long.valueOf(request.pathVariable(\"id\"));\n\n\t\t// get customer from repository\n\t\tMono<String> responseMono = customerRepository.deleteUser(customerId);\n\n\t\t// build response\n\t\treturn responseMono\n\t\t\t\t.flatMap(strMono -> ServerResponse.ok().contentType(MediaType.TEXT_PLAIN).body(fromObject(strMono)));\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/user/UserRepository.java",
    "content": "package org.springdoc.demo.app4.user;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\n@Tag(name = \"Users\")\npublic interface UserRepository {\n\n\tpublic Mono<User> getUserById(@Parameter(in = ParameterIn.PATH, description = \"The user Id\") Long id);\n\n\t@Operation(description = \"get all the users\")\n\tpublic Flux<User> getAllUsers();\n\n\t@Operation(description = \"get all the users by firstname\")\n\tpublic Flux<User> getAllUsers(String firstname);\n\n\tpublic Mono<Void> saveUser(Mono<User> user);\n\n\tpublic Mono<User> putUser(@Parameter(in = ParameterIn.PATH) Long id, Mono<User> user);\n\n\tpublic Mono<String> deleteUser(@Parameter(in = ParameterIn.PATH) Long id);\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/java/org/springdoc/demo/app4/user/UserRepositoryImpl.java",
    "content": "package org.springdoc.demo.app4.user;\n\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\nimport jakarta.annotation.PostConstruct;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class UserRepositoryImpl implements UserRepository {\n\tprivate Map<Long, User> users = new HashMap<Long, User>();\n\n\t@PostConstruct\n\tpublic void init() throws Exception {\n\t\tusers.put(Long.valueOf(1), new User(1, \"Jack\", \"Smith\", 20));\n\t\tusers.put(Long.valueOf(2), new User(2, \"Peter\", \"Johnson\", 25));\n\t}\n\n\t@Override\n\tpublic Mono<User> getUserById(Long id) {\n\t\treturn Mono.just(users.get(id));\n\t}\n\n\t@Override\n\tpublic Flux<User> getAllUsers() {\n\t\treturn Flux.fromIterable(this.users.values());\n\t}\n\n\t@Override\n\tpublic Flux<User> getAllUsers(String firstname) {\n\t\treturn Flux.fromIterable(this.users.values().stream().filter(user -> user.getFirstname().equals(firstname)).collect(Collectors.toList()));\n\t}\n\n\t@Override\n\tpublic Mono<Void> saveUser(Mono<User> monoUser) {\n\t\tMono<User> userMono = monoUser.doOnNext(user -> {\n\t\t\t// do post\n\t\t\tusers.put(user.getId(), user);\n\n\t\t\t// log on console\n\t\t\tSystem.out.println(\"########### POST:\" + user);\n\t\t});\n\n\t\treturn userMono.then();\n\t}\n\n\t@Override\n\tpublic Mono<User> putUser(Long id, Mono<User> monoUser) {\n\t\tMono<User> userMono = monoUser.doOnNext(user -> {\n\t\t\t// reset user.Id\n\t\t\tuser.setId(id);\n\n\t\t\t// do put\n\t\t\tusers.put(id, user);\n\n\t\t\t// log on console\n\t\t\tSystem.out.println(\"########### PUT:\" + user);\n\t\t});\n\n\t\treturn userMono;\n\t}\n\n\t@Override\n\tpublic Mono<String> deleteUser(Long id) {\n\t\t// delete processing\n\t\tusers.remove(id);\n\t\treturn Mono.just(\"Delete Succesfully!\");\n\t}\n}"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/resources/application.yml",
    "content": "server:\n  servlet:\n    context-path: /\n  compression:\n    enabled: true\n    mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json\n    min-response-size: 1024\n  http2:\n    enabled: true\n  port: 8084\n  forward-headers-strategy: framework\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/resources/logback-spring.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE configuration>\n\n<configuration scan=\"true\">\n\n\t<appender name=\"STDOUT\"\n\t\t\t  class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %msg%n</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\"/>\n\t</root>\n\n\t<logger name=\"jakarta.activation\" level=\"WARN\"/>\n\t<logger name=\"jakarta.mail\" level=\"WARN\"/>\n\t<logger name=\"jakarta.management.remote\" level=\"WARN\"/>\n\t<logger name=\"jakarta.xml.bind\" level=\"WARN\"/>\n\t<logger name=\"ch.qos.logback\" level=\"WARN\"/>\n\n\t<logger name=\"com.ryantenney\" level=\"WARN\"/>\n\t<logger name=\"com.sun\" level=\"WARN\"/>\n\t<logger name=\"com.zaxxer\" level=\"WARN\"/>\n\t<logger name=\"io.undertow\" level=\"WARN\"/>\n\t<logger name=\"io.undertow.websockets.jsr\" level=\"ERROR\"/>\n\t<logger name=\"org.ehcache\" level=\"WARN\"/>\n\t<logger name=\"org.apache\" level=\"WARN\"/>\n\t<logger name=\"org.apache.catalina.startup.DigesterFactory\"\n\t\t\tlevel=\"OFF\"/>\n\t<logger name=\"org.bson\" level=\"WARN\"/>\n\t<logger name=\"org.hibernate.validator\" level=\"WARN\"/>\n\t<logger name=\"org.hibernate\" level=\"WARN\"/>\n\t<logger name=\"org.hibernate.ejb.HibernatePersistence\"\n\t\t\tlevel=\"OFF\"/>\n\t<logger name=\"org.springframework\" level=\"INFO\"/>\n\t<logger name=\"org.springframework.web\" level=\"INFO\"/>\n\t<logger name=\"org.springframework.security\" level=\"WARN\"/>\n\t<logger name=\"org.springframework.cache\" level=\"WARN\"/>\n\t<logger name=\"org.thymeleaf\" level=\"INFO\"/>\n\t<logger name=\"org.xnio\" level=\"WARN\"/>\n\t<logger name=\"springfox\" level=\"WARN\"/>\n\t<logger name=\"sun.rmi\" level=\"WARN\"/>\n\t<logger name=\"liquibase\" level=\"WARN\"/>\n\t<logger name=\"LiquibaseSchemaResolver\" level=\"INFO\"/>\n\t<logger name=\"springfox.documentation.schema.property\"\n\t\t\tlevel=\"ERROR\"/>\n\t<logger name=\"sun.rmi.transport\" level=\"WARN\"/>\n\n\t<!-- https://logback.qos.ch/manual/configuration.html#shutdownHook and https://jira.qos.ch/browse/LOGBACK-1090 -->\n\t<shutdownHook\n\t\t\tclass=\"ch.qos.logback.core.hook.DelayingShutdownHook\"/>\n\n\t<contextListener\n\t\t\tclass=\"ch.qos.logback.classic.jul.LevelChangePropagator\">\n\t\t<resetJUL>true</resetJUL>\n\t</contextListener>\n\n</configuration>"
  },
  {
    "path": "demo-spring-boot-3-webflux-functional/src/main/resources/schema.sql",
    "content": "CREATE TABLE COFFEE\n(\n    id   VARCHAR(255) PRIMARY KEY,\n    name VARCHAR(255)\n);"
  },
  {
    "path": "demo-spring-boot-3-webmvc/.gitignore",
    "content": "/target/\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/.java-version",
    "content": "graalvm64-17.0.5\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/README.md",
    "content": "# springdoc-openapi demo with spring-boot-2 web-mvc\n\n## Building application\n\n### Pre-requisites\n\n- JDK 8+\n- maven 3\n- docker CLI\n\n### Option 1: Building Executable JAR\n\nTo create an `executable jar`, simply run:\n\n```sh\n mvn clean package\n```\n\n### Option 2: Building a non-native OCI Images\n\nTo create a non-native OCI docker image, simply run:\n\n```sh\nmvn clean spring-boot:build-image\n```\n\n### Option 3: Building native image with GraalVM\n\nTo create a `native image`, Run the following command\n\n```sh\nmvn -Pnative clean native:compile \n```\n\n## Running the native application\n\nTo run the demo using docker, invoke the following:\n\n```sh\ndocker run --rm -p 8080:8081 springdoc-openapi-spring-boot-2-webmvc:3.1.6-SNAPSHOT\n```"
  },
  {
    "path": "demo-spring-boot-3-webmvc/pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-boot-3-webmvc</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.data</groupId>\n\t\t\t<artifactId>spring-data-commons</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-actuator</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.fasterxml.jackson.dataformat</groupId>\n\t\t\t<artifactId>jackson-dataformat-xml</artifactId>\n\t\t</dependency>\n\t\t<!-- springdoc ui -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/Application.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2;\n\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.security.SecurityRequirement;\nimport org.springdoc.core.customizers.OpenApiCustomizer;\nimport org.springdoc.core.customizers.OperationCustomizer;\nimport org.springdoc.core.models.GroupedOpenApi;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Profile;\n\nimport static org.springdoc.core.utils.Constants.ALL_PATTERN;\n\n\n@SpringBootApplication\npublic class Application {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(Application.class);\n\t}\n\n\t@Bean\n\t@Profile(\"!prod\")\n\tpublic GroupedOpenApi actuatorApi(OpenApiCustomizer actuatorOpenApiCustomizer,\n\t\t\tOperationCustomizer actuatorCustomizer,\n\t\t\tWebEndpointProperties endpointProperties,\n\t\t\t@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn GroupedOpenApi.builder()\n\t\t\t\t.group(\"Actuator\")\n\t\t\t\t.pathsToMatch(endpointProperties.getBasePath() + ALL_PATTERN)\n\t\t\t\t.addOpenApiCustomizer(actuatorOpenApiCustomizer)\n\t\t\t\t.addOpenApiCustomizer(openApi -> openApi.info(new Info().title(\"Actuator API\").version(appVersion)))\n\t\t\t\t.addOperationCustomizer(actuatorCustomizer)\n\t\t\t\t.pathsToExclude(\"/health/*\")\n\t\t\t\t.build();\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi usersGroup(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn GroupedOpenApi.builder().group(\"users\")\n\t\t\t\t.addOperationCustomizer((operation, handlerMethod) -> {\n\t\t\t\t\toperation.addSecurityItem(new SecurityRequirement().addList(\"basicScheme\"));\n\t\t\t\t\treturn operation;\n\t\t\t\t})\n\t\t\t\t.addOpenApiCustomizer(openApi -> openApi.info(new Info().title(\"Users API\").version(appVersion)))\n\t\t\t\t.packagesToScan(\"org.springdoc.demo.app2\")\n\t\t\t\t.pathsToMatch(\"/user/**\")\n\t\t\t\t.build();\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/ApiUtil.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.io.IOException;\n\nimport jakarta.servlet.http.HttpServletResponse;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.server.ResponseStatusException;\n\npublic class ApiUtil {\n\n\tpublic static void setExampleResponse(NativeWebRequest req, String contentType, String example) {\n\t\ttry {\n\t\t\treq.getNativeResponse(HttpServletResponse.class).addHeader(\"Content-Type\", contentType);\n\t\t\treq.getNativeResponse(HttpServletResponse.class).getOutputStream().print(example);\n\t\t}\n\t\tcatch (IOException e) {\n\t\t\tthrow new RuntimeException(e);\n\t\t}\n\t}\n\n\tpublic static void checkApiKey(NativeWebRequest req) {\n\t\tif (!\"1\".equals(System.getenv(\"DISABLE_API_KEY\")) && !\"special-key\".equals(req.getHeader(\"api_key\"))) {\n\t\t\tthrow new ResponseStatusException(HttpStatus.UNAUTHORIZED, \"Missing API key!\");\n\t\t}\n\t}\n}"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/ExceptionTranslator.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Map;\n\nimport jakarta.validation.ConstraintViolationException;\n\nimport org.springframework.boot.web.error.ErrorAttributeOptions;\nimport org.springframework.boot.web.servlet.error.ErrorAttributes;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.context.request.RequestAttributes;\nimport org.springframework.web.context.request.WebRequest;\n\n@RestControllerAdvice\npublic class ExceptionTranslator {\n\n\tprivate final ErrorAttributes errorAttributes;\n\n\tpublic ExceptionTranslator(ErrorAttributes errorAttributes) {\n\t\tthis.errorAttributes = errorAttributes;\n\t}\n\n\t@ExceptionHandler(ConstraintViolationException.class)\n\t@ResponseStatus(HttpStatus.BAD_REQUEST)\n\tpublic Map<String, Object> processConstraintViolationException(WebRequest request) {\n\t\trequest.setAttribute(\"jakarta.servlet.error.status_code\", HttpStatus.BAD_REQUEST.value(), RequestAttributes.SCOPE_REQUEST);\n\t\treturn errorAttributes.getErrorAttributes(request, ErrorAttributeOptions.defaults());\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/PetApi.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\n/**\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.0.0).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\npackage org.springdoc.demo.app2.api;\n\nimport java.util.List;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.enums.Explode;\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport io.swagger.v3.oas.annotations.enums.ParameterStyle;\nimport io.swagger.v3.oas.annotations.enums.SecuritySchemeType;\nimport io.swagger.v3.oas.annotations.media.ArraySchema;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.responses.ApiResponses;\nimport io.swagger.v3.oas.annotations.security.OAuthFlow;\nimport io.swagger.v3.oas.annotations.security.OAuthFlows;\nimport io.swagger.v3.oas.annotations.security.OAuthScope;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport io.swagger.v3.oas.annotations.security.SecurityScheme;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport org.springdoc.core.annotations.ParameterObject;\nimport org.springdoc.demo.app2.model.ModelApiResponse;\nimport org.springdoc.demo.app2.model.Pet;\n\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestHeader;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RequestPart;\nimport org.springframework.web.multipart.MultipartFile;\n\n@SecurityScheme(name = \"petstore_auth\", type = SecuritySchemeType.OAUTH2, flows = @OAuthFlows(implicit = @OAuthFlow(authorizationUrl = \"https://petstore3.swagger.io/oauth/authorize\", scopes = {\n\t\t@OAuthScope(name = \"write:pets\", description = \"modify pets in your account\"),\n\t\t@OAuthScope(name = \"read:pets\", description = \"read your pets\") })))\n@Tag(name = \"pet\", description = \"the pet API\")\npublic interface PetApi {\n\n\tdefault PetApiDelegate getDelegate() {\n\t\treturn new PetApiDelegate() {\n\t\t};\n\t}\n\n\t@Operation(summary = \"Add a new pet to the store\", description = \"Add a new pet to the store\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"Successful operation\", content = { @Content(mediaType = \"application/xml\", schema = @Schema(implementation = Pet.class)), @Content(mediaType = \"application/json\", schema = @Schema(implementation = Pet.class)) }),\n\t\t\t@ApiResponse(responseCode = \"405\", description = \"Invalid input\")\n\t})\n\t@PostMapping(value = \"/pet\", consumes = { \"application/json\", \"application/xml\", \"application/x-www-form-urlencoded\" })\n\tdefault void addPet(\n\t\t\t@Parameter(description = \"Create a new pet in the store\", required = true) @Valid @RequestBody Pet pet) {\n\t\t// return getDelegate().addPet(pet);\n\t}\n\n\t@Operation(summary = \"Deletes a pet\", description = \"\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"400\", description = \"Invalid pet value\") })\n\t@DeleteMapping(value = \"/pet/{petId}\")\n\tdefault ResponseEntity<Void> deletePet(\n\t\t\t@Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") Long petId,\n\t\t\t@Parameter(description = \"\") @RequestHeader(value = \"api_key\", required = false) String apiKey) {\n\t\treturn getDelegate().deletePet(petId, apiKey);\n\t}\n\n\t@Operation(summary = \"Finds Pets by status\", description = \"Multiple status values can be provided with comma separated strings\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Pet.class)))),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid status value\") })\n\t@GetMapping(value = \"/pet/findByStatus\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<List<Pet>> findPetsByStatus(@Parameter(explode = Explode.TRUE, name = \"status\", in = ParameterIn.QUERY, description = \"Status values that need to be considered for filter\", style = ParameterStyle.FORM, schema = @Schema(type = \"string\", defaultValue = \"available\", allowableValues = { \"available\", \"pending\", \"sold\" })) @Valid @RequestParam(value = \"status\", required = false) List<String> status) {\n\t\treturn getDelegate().findPetsByStatus(status);\n\t}\n\n\t@Operation(summary = \"Finds Pets by tags\", description = \"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Pet.class)))),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid tag value\", content = @Content) })\n\t@GetMapping(value = \"/pet/findByTags\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<List<Pet>> findPetsByTags(\n\t\t\t@Parameter(description = \"Tags to filter by\", explode = Explode.TRUE, in = ParameterIn.QUERY, name = \"tags\", style = ParameterStyle.FORM) @Valid @RequestParam(value = \"tags\", required = false) List<String> tags) {\n\t\treturn getDelegate().findPetsByTags(tags);\n\t}\n\n\t@Operation(summary = \"Find pet by ID\", description = \"Returns a single pet\", security = {\n\t\t\t@SecurityRequirement(name = \"api_key\"),\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" })\n\t}, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(schema = @Schema(implementation = Pet.class))),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid ID supplied\", content = @Content),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"Pet not found\", content = @Content) })\n\t@GetMapping(value = \"/pet/{petId}\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<Pet> getPetById(\n\t\t\t@Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") Long petId) {\n\t\treturn getDelegate().getPetById(petId);\n\t}\n\n\t@Operation(summary = \"Update an existing pet\", description = \"Update an existing pet by Id\", operationId = \"updatePet\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"Successful operation\",\n\t\t\t\t\tcontent =\n\t\t\t\t\t\t\t{ @Content(mediaType = \"application/xml\", schema = @Schema(implementation = Pet.class)), @Content(mediaType = \"application/json\", schema = @Schema(implementation = Pet.class)) }\n\t\t\t),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid ID supplied\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"Pet not found\"),\n\t\t\t@ApiResponse(responseCode = \"405\", description = \"Validation exception\") })\n\t@PutMapping(value = \"/pet\", consumes = { \"application/json\", \"application/xml\", \"application/x-www-form-urlencoded\" })\n\tdefault ResponseEntity<Void> updatePet(\n\t\t\t@Parameter(description = \"Update an existent pet in the store\", required = true) @Valid @RequestBody Pet pet) {\n\t\treturn getDelegate().updatePet(pet);\n\t}\n\n\t@Operation(summary = \"Updates a pet in the store with form data\", description = \"\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"405\", description = \"Invalid input\") })\n\t@PostMapping(value = \"/pet/{petId}\", consumes = { \"application/x-www-form-urlencoded\" })\n\tdefault ResponseEntity<Void> updatePetWithForm(\n\t\t\t@Parameter(description = \"ID of pet that needs to be updated\", required = true) @PathVariable(\"petId\") Long petId,\n\t\t\t@Parameter(description = \"Name of pet that needs to be updated\") @RequestParam(value = \"name\", required = false) String name,\n\t\t\t@Parameter(description = \"Status of pet that needs to be updated\") @RequestParam(value = \"status\", required = false) String status) {\n\t\treturn getDelegate().updatePetWithForm(petId, name, status);\n\t}\n\n\t@Operation(summary = \"uploads an image\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(schema = @Schema(implementation = ModelApiResponse.class))) })\n\t@PostMapping(value = \"/pet/{petId}/uploadImage\", produces = { \"application/json\" }, consumes = {\n\t\t\t\"multipart/form-data\" })\n\tdefault ResponseEntity<ModelApiResponse> uploadFile(\n\t\t\t@Parameter(description = \"ID of pet to update\", required = true) @PathVariable(\"petId\") Long petId,\n\t\t\t@Parameter(description = \"Additional Metadata\") @RequestParam(value = \"additionalMetadata\", required = false) String additionalMetadata,\n\t\t\t@Parameter(content = @Content(mediaType = \"multipart/form-data\", schema = @Schema(type = \"string\", format = \"binary\"))) @Valid @RequestPart(\"file\") MultipartFile file) {\n\t\treturn getDelegate().uploadFile(petId, additionalMetadata, file);\n\t}\n\n\t@Operation(summary = \"Get all Pets paged\", description = \"Get all Pets paged\", security = {\n\t\t\t@SecurityRequirement(name = \"petstore_auth\", scopes = { \"write:pets\", \"read:pets\" }) }, tags = { \"pet\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Pet.class))))\n\t})\n\t@GetMapping(value = \"/pet\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<List<Pet>> getAllPets(@NotNull @ParameterObject Pageable pageable) {\n\t\treturn getDelegate().getAllPets(pageable);\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/PetApiController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Optional;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@RequestMapping(\"${openapi.openAPIPetstore.base-path:/}\")\npublic class PetApiController implements PetApi {\n\n\tprivate final PetApiDelegate delegate;\n\n\tpublic PetApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) PetApiDelegate delegate) {\n\t\tthis.delegate = Optional.ofNullable(delegate).orElse(new PetApiDelegate() {\n\t\t});\n\t}\n\n\t@Override\n\tpublic PetApiDelegate getDelegate() {\n\t\treturn delegate;\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/PetApiDelegate.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.List;\nimport java.util.Optional;\n\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport org.springdoc.demo.app2.model.ModelApiResponse;\nimport org.springdoc.demo.app2.model.Pet;\n\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.multipart.MultipartFile;\n\n/**\n * A delegate to be called by the {@link PetApiController}}.\n * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class.\n */\n\npublic interface PetApiDelegate {\n\n\tdefault Optional<NativeWebRequest> getRequest() {\n\t\treturn Optional.empty();\n\t}\n\n\t/**\n\t * @see PetApi#addPet\n\t */\n\tdefault void addPet(Pet pet) {\n\n\t}\n\n\t/**\n\t * @see PetApi#deletePet\n\t */\n\tdefault ResponseEntity<Void> deletePet(Long petId,\n\t\t\tString apiKey) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see PetApi#findPetsByStatus\n\t */\n\tdefault ResponseEntity<List<Pet>> findPetsByStatus(List<String> status) {\n\t\textract();\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\tdefault void extract() {\n\t\tgetRequest().ifPresent(request -> {\n\t\t\tfor (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader(\"Accept\"))) {\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/json\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/json\", \"{  \\\"photoUrls\\\" : [ \\\"photoUrls\\\", \\\"photoUrls\\\" ],  \\\"name\\\" : \\\"doggie\\\",  \\\"id\\\" : 0,  \\\"category\\\" : {    \\\"name\\\" : \\\"name\\\",    \\\"id\\\" : 6  },  \\\"tags\\\" : [ {    \\\"name\\\" : \\\"name\\\",    \\\"id\\\" : 1  }, {    \\\"name\\\" : \\\"name\\\",    \\\"id\\\" : 1  } ],  \\\"status\\\" : \\\"available\\\"}\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/xml\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/xml\", \"<Pet>  <id>123456789</id>  <name>doggie</name>  <photoUrls>    <photoUrls>aeiou</photoUrls>  </photoUrls>  <tags>  </tags>  <status>aeiou</status></Pet>\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @see PetApi#findPetsByTags\n\t */\n\tdefault ResponseEntity<List<Pet>> findPetsByTags(List<String> tags) {\n\t\textract();\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see PetApi#getPetById\n\t */\n\tdefault ResponseEntity<Pet> getPetById(Long petId) {\n\t\textract();\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see PetApi#updatePet\n\t */\n\tdefault ResponseEntity<Void> updatePet(Pet pet) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see PetApi#updatePetWithForm\n\t */\n\tdefault ResponseEntity<Void> updatePetWithForm(Long petId,\n\t\t\tString name,\n\t\t\tString status) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see PetApi#uploadFile\n\t */\n\tdefault ResponseEntity<ModelApiResponse> uploadFile(Long petId,\n\t\t\tString additionalMetadata,\n\t\t\t@Valid MultipartFile file) {\n\t\tgetRequest().ifPresent(request -> {\n\t\t\tfor (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader(\"Accept\"))) {\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/json\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/json\", \"{  \\\"code\\\" : 0,  \\\"type\\\" : \\\"type\\\",  \\\"message\\\" : \\\"message\\\"}\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\tdefault ResponseEntity<List<Pet>> getAllPets(@NotNull Pageable pageable) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/PetApiDelegateImpl.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.concurrent.atomic.AtomicLong;\nimport java.util.stream.Collectors;\n\nimport jakarta.annotation.PostConstruct;\nimport jakarta.validation.constraints.NotNull;\nimport org.apache.tomcat.util.http.fileupload.IOUtils;\nimport org.springdoc.demo.app2.model.Category;\nimport org.springdoc.demo.app2.model.ModelApiResponse;\nimport org.springdoc.demo.app2.model.Pet;\nimport org.springdoc.demo.app2.model.Tag;\nimport org.springdoc.demo.app2.repository.PetRepository;\n\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.multipart.MultipartFile;\nimport org.springframework.web.server.ResponseStatusException;\n\n@Service\npublic class PetApiDelegateImpl implements PetApiDelegate {\n\n\tprivate final PetRepository petRepository;\n\n\tprivate final NativeWebRequest request;\n\n\tpublic PetApiDelegateImpl(PetRepository petRepository, NativeWebRequest request) {\n\t\tthis.petRepository = petRepository;\n\t\tthis.request = request;\n\t}\n\n\tprivate static Pet createPet(long id, Category category, String name, String[] urls, String[] tags,\n\t\t\tPet.StatusEnum status) {\n\t\tPet pet = new Pet().id(id).category(category).name(name).status(status);\n\n\t\tif (null != urls) {\n\t\t\tpet.setPhotoUrls(Arrays.asList(urls));\n\t\t}\n\n\t\tfinal AtomicLong i = new AtomicLong(0);\n\t\tif (null != tags && tags.length > 0) {\n\t\t\tArrays.stream(tags).map(tag -> new Tag().name(tag).id(i.incrementAndGet())).forEach(pet::addTagsItem);\n\t\t}\n\t\treturn pet;\n\t}\n\n\t@PostConstruct\n\tpublic void initPets() {\n\t\tCategory dogs = new Category().id(1L).name(\"Dogs\");\n\t\tCategory cats = new Category().id(2L).name(\"Cats\");\n\t\tCategory rabbits = new Category().id(3L).name(\"Rabbits\");\n\t\tCategory lions = new Category().id(4L).name(\"Lions\");\n\n\t\tpetRepository.save(createPet(1, cats, \"Cat 1\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag1\", \"tag2\" },\n\t\t\t\tPet.StatusEnum.AVAILABLE));\n\t\tpetRepository.save(createPet(2, cats, \"Cat 2\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag2\", \"tag3\" },\n\t\t\t\tPet.StatusEnum.AVAILABLE));\n\t\tpetRepository.save(createPet(3, cats, \"Cat 3\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag3\", \"tag4\" },\n\t\t\t\tPet.StatusEnum.PENDING));\n\n\t\tpetRepository.save(createPet(4, dogs, \"Dog 1\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag1\", \"tag2\" },\n\t\t\t\tPet.StatusEnum.AVAILABLE));\n\t\tpetRepository.save(createPet(5, dogs, \"Dog 2\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag2\", \"tag3\" },\n\t\t\t\tPet.StatusEnum.SOLD));\n\t\tpetRepository.save(createPet(6, dogs, \"Dog 3\", new String[] { \"url1\", \"url2\" }, new String[] { \"tag3\", \"tag4\" },\n\t\t\t\tPet.StatusEnum.PENDING));\n\n\t\tpetRepository.save(createPet(7, lions, \"Lion 1\", new String[] { \"url1\", \"url2\" },\n\t\t\t\tnew String[] { \"tag1\", \"tag2\" }, Pet.StatusEnum.AVAILABLE));\n\t\tpetRepository.save(createPet(8, lions, \"Lion 2\", new String[] { \"url1\", \"url2\" },\n\t\t\t\tnew String[] { \"tag2\", \"tag3\" }, Pet.StatusEnum.AVAILABLE));\n\t\tpetRepository.save(createPet(9, lions, \"Lion 3\", new String[] { \"url1\", \"url2\" },\n\t\t\t\tnew String[] { \"tag3\", \"tag4\" }, Pet.StatusEnum.AVAILABLE));\n\n\t\tpetRepository.save(createPet(10, rabbits, \"Rabbit 1\", new String[] { \"url1\", \"url2\" },\n\t\t\t\tnew String[] { \"tag3\", \"tag4\" }, Pet.StatusEnum.AVAILABLE));\n\t}\n\n\t@Override\n\tpublic void addPet(Pet pet) {\n\t\tpetRepository.save(pet);\n\t\t// return ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> deletePet(Long petId, String apiKey) {\n\t\tpetRepository.deleteById(petId);\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<List<Pet>> findPetsByStatus(List<String> statusList) {\n\t\tList<Pet.StatusEnum> statusEnums = statusList.stream()\n\t\t\t\t.map(s -> Optional.ofNullable(Pet.StatusEnum.fromValue(s))\n\t\t\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.BAD_REQUEST, \"Invalid status: \" + s)))\n\t\t\t\t.collect(Collectors.toList());\n\t\treturn ResponseEntity.ok(petRepository.findPetsByStatus(statusEnums));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<List<Pet>> findPetsByTags(List<String> tags) {\n\t\treturn ResponseEntity.ok(petRepository.findPetsByTags(tags));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Pet> getPetById(Long petId) {\n\t\tApiUtil.checkApiKey(request);\n\t\treturn petRepository.findById(petId).map(ResponseEntity::ok)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> updatePet(Pet pet) {\n\t\treturn null;\n\t\t// return addPet(pet);\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> updatePetWithForm(Long petId, String name, String status) {\n\t\tPet pet = petRepository.findById(petId).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t\tif (!StringUtils.isEmpty(name))\n\t\t\tpet.name(name);\n\t\tif (!StringUtils.isEmpty(name))\n\t\t\tpet.setStatus(Pet.StatusEnum.fromValue(status));\n\t\t// return addPet(pet);\n\t\treturn null;\n\t}\n\n\t@Override\n\tpublic ResponseEntity<ModelApiResponse> uploadFile(Long petId, String additionalMetadata, MultipartFile file) {\n\t\ttry {\n\t\t\tString uploadedFileLocation = \"./\" + file.getName();\n\t\t\tSystem.out.println(\"uploading to \" + uploadedFileLocation);\n\t\t\tIOUtils.copy(file.getInputStream(), new FileOutputStream(uploadedFileLocation));\n\t\t\tString msg = String.format(\"additionalMetadata: %s\\nFile uploaded to %s, %d bytes\", additionalMetadata,\n\t\t\t\t\tuploadedFileLocation, (new File(uploadedFileLocation)).length());\n\t\t\tModelApiResponse output = new ModelApiResponse().code(200).message(msg);\n\t\t\treturn ResponseEntity.ok(output);\n\t\t}\n\t\tcatch (Exception e) {\n\t\t\tthrow new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, \"Couldn't upload file\", e);\n\t\t}\n\t}\n\n\tpublic ResponseEntity<List<Pet>> getAllPets(@NotNull Pageable pageable) {\n\t\tApiUtil.checkApiKey(request);\n\t\treturn new ResponseEntity<List<Pet>>(petRepository.findAll(pageable), HttpStatus.OK);\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/StoreApi.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\n/**\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.0.0).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Map;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.responses.ApiResponses;\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.Max;\nimport jakarta.validation.constraints.Min;\nimport org.springdoc.demo.app2.model.Order;\n\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\n\n@Tag(name = \"store\", description = \"the store API\")\npublic interface StoreApi {\n\n\tdefault StoreApiDelegate getDelegate() {\n\t\treturn new StoreApiDelegate() {\n\t\t};\n\t}\n\n\t@Operation(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\", tags = { \"store\" })\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"400\", description = \"Invalid ID supplied\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"Order not found\") })\n\t@DeleteMapping(value = \"/store/order/{orderId}\")\n\tdefault ResponseEntity<Void> deleteOrder(\n\t\t\t@Parameter(description = \"ID of the order that needs to be deleted\", required = true, schema = @Schema(type = \"integer\", format = \"int64\")) @PathVariable(\"orderId\") Long orderId) {\n\t\treturn getDelegate().deleteOrder(orderId);\n\t}\n\n\t@Operation(summary = \"Returns pet inventories by status\", description = \"Returns a map of status codes to quantities\", security = {\n\t\t\t@SecurityRequirement(name = \"api_key\") }, tags = { \"store\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(schema = @Schema(type = \"object\"))) })\n\t@GetMapping(value = \"/store/inventory\", produces = { \"application/json\" })\n\tdefault ResponseEntity<Map<String, Integer>> getInventory() {\n\t\treturn getDelegate().getInventory();\n\t}\n\n\t@Operation(summary = \"Find purchase order by ID\", description = \"For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions\", tags = { \"store\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(schema = @Schema(implementation = Order.class))),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid ID supplied\", content = @Content),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"Order not found\", content = @Content)\n\t})\n\t@GetMapping(value = \"/store/order/{orderId}\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<Order> getOrderById(\n\t\t\t@Min(1L) @Max(5L) @Parameter(description = \"ID of order that needs to be fetched\", required = true) @PathVariable(\"orderId\") Long orderId) {\n\t\treturn getDelegate().getOrderById(orderId);\n\t}\n\n\t@Operation(summary = \"Place an order for a pet\", description = \"Place a new order in the store\", tags = { \"store\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = @Content(schema = @Schema(implementation = Order.class))),\n\t\t\t@ApiResponse(responseCode = \"405\", description = \"Invalid input\", content = @Content)\n\t})\n\t@PostMapping(value = \"/store/order\", produces = { \"application/json\" }, consumes = { \"application/xml\", \"application/json\", \"application/x-www-form-urlencoded\" })\n\tdefault ResponseEntity<Order> placeOrder(\n\t\t\t@io.swagger.v3.oas.annotations.parameters.RequestBody(description = \"\") @Valid @RequestBody Order order) {\n\t\treturn getDelegate().placeOrder(order);\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/StoreApiController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Optional;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@RequestMapping(\"${openapi.openAPIPetstore.base-path:/}\")\npublic class StoreApiController implements StoreApi {\n\n\tprivate final StoreApiDelegate delegate;\n\n\tpublic StoreApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) StoreApiDelegate delegate) {\n\t\tthis.delegate = Optional.ofNullable(delegate).orElse(new StoreApiDelegate() {\n\t\t});\n\t}\n\n\t@Override\n\tpublic StoreApiDelegate getDelegate() {\n\t\treturn delegate;\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/StoreApiDelegate.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Map;\nimport java.util.Optional;\n\nimport org.springdoc.demo.app2.model.Order;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.context.request.NativeWebRequest;\n\n/**\n * A delegate to be called by the {@link StoreApiController}}.\n * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class.\n */\npublic interface StoreApiDelegate {\n\n\tdefault Optional<NativeWebRequest> getRequest() {\n\t\treturn Optional.empty();\n\t}\n\n\t/**\n\t * @see StoreApi#deleteOrder\n\t */\n\tdefault ResponseEntity<Void> deleteOrder(Long orderId) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see StoreApi#getInventory\n\t */\n\tdefault ResponseEntity<Map<String, Integer>> getInventory() {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see StoreApi#getOrderById\n\t */\n\tdefault ResponseEntity<Order> getOrderById(Long orderId) {\n\t\textract();\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\tdefault void extract() {\n\t\tgetRequest().ifPresent(request -> {\n\t\t\tfor (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader(\"Accept\"))) {\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/json\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/json\", \"{  \\\"petId\\\" : 6,  \\\"quantity\\\" : 1,  \\\"id\\\" : 0,  \\\"shipDate\\\" : \\\"2000-01-23T04:56:07.000+00:00\\\",  \\\"complete\\\" : false,  \\\"status\\\" : \\\"placed\\\"}\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/xml\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/xml\", \"<Order>  <id>123456789</id>  <petId>123456789</petId>  <quantity>123</quantity>  <shipDate>2000-01-23T04:56:07.000Z</shipDate>  <status>aeiou</status>  <complete>true</complete></Order>\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * @see StoreApi#placeOrder\n\t */\n\tdefault ResponseEntity<Order> placeOrder(Order order) {\n\t\textract();\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/StoreApiDelegateImpl.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Date;\nimport java.util.Map;\n\nimport jakarta.annotation.PostConstruct;\nimport org.springdoc.demo.app2.model.Order;\nimport org.springdoc.demo.app2.repository.OrderRepository;\nimport org.springdoc.demo.app2.repository.PetRepository;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.context.request.NativeWebRequest;\nimport org.springframework.web.server.ResponseStatusException;\n\n@Service\npublic class StoreApiDelegateImpl implements StoreApiDelegate {\n\n\tprivate final OrderRepository orderRepository;\n\n\t@SuppressWarnings(\"unused\")\n\tprivate final PetRepository petRepository;\n\n\tprivate final NativeWebRequest request;\n\n\tpublic StoreApiDelegateImpl(OrderRepository orderRepository, PetRepository petRepository, NativeWebRequest request) {\n\t\tthis.orderRepository = orderRepository;\n\t\tthis.petRepository = petRepository;\n\t\tthis.request = request;\n\t}\n\n\tprivate static Order createOrder(long id, long petId, Order.StatusEnum status) {\n\t\treturn new Order()\n\t\t\t\t.id(id)\n\t\t\t\t.petId(petId)\n\t\t\t\t.quantity(2)\n\t\t\t\t.shipDate(new Date())\n\t\t\t\t.status(status);\n\t}\n\n\t@PostConstruct\n\tpublic void initOrders() {\n\t\torderRepository.save(createOrder(1, 1, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(2, 1, Order.StatusEnum.DELIVERED));\n\t\torderRepository.save(createOrder(3, 2, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(4, 2, Order.StatusEnum.DELIVERED));\n\t\torderRepository.save(createOrder(5, 3, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(6, 3, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(7, 3, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(8, 3, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(9, 3, Order.StatusEnum.PLACED));\n\t\torderRepository.save(createOrder(10, 3, Order.StatusEnum.PLACED));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> deleteOrder(Long orderId) {\n\t\tOrder order = orderRepository.findById(orderId)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t\torderRepository.delete(order);\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Map<String, Integer>> getInventory() {\n\t\tApiUtil.checkApiKey(request);\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Order> getOrderById(Long orderId) {\n\t\treturn orderRepository.findById(orderId)\n\t\t\t\t.map(ResponseEntity::ok)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, \"Order not found\"));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Order> placeOrder(Order order) {\n\t\treturn ResponseEntity.ok(orderRepository.save(order));\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/UserApi.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\n/**\n * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (3.0.0).\n * https://openapi-generator.tech\n * Do not edit the class manually.\n */\npackage org.springdoc.demo.app2.api;\n\nimport java.util.List;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.Parameter;\nimport io.swagger.v3.oas.annotations.enums.Explode;\nimport io.swagger.v3.oas.annotations.enums.ParameterIn;\nimport io.swagger.v3.oas.annotations.enums.ParameterStyle;\nimport io.swagger.v3.oas.annotations.headers.Header;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.responses.ApiResponses;\nimport io.swagger.v3.oas.annotations.tags.Tag;\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport org.springdoc.demo.app2.model.User;\n\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestParam;\n\n@Tag(name = \"user\", description = \"the user API\")\npublic interface UserApi {\n\n\tdefault UserApiDelegate getDelegate() {\n\t\treturn new UserApiDelegate() {\n\t\t};\n\t}\n\n\t@Operation(summary = \"Create user\", description = \"This can only be done by the logged in user.\", tags = { \"user\" })\n\t@ApiResponses(value = { @ApiResponse(description = \"successful operation\", content = { @Content(mediaType = \"application/json\", schema = @Schema(implementation = User.class)), @Content(mediaType = \"application/xml\", schema = @Schema(implementation = User.class)) }) })\n\t@PostMapping(value = \"/user\", consumes = { \"application/json\", \"application/xml\", \"application/x-www-form-urlencoded\" })\n\tdefault ResponseEntity<Void> createUser(\n\t\t\t@Parameter(description = \"Created user object\") @Valid @RequestBody User user) {\n\t\treturn getDelegate().createUser(user);\n\t}\n\n\t@Operation(summary = \"Creates list of users with given input array\", tags = { \"user\" })\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"successful operation\") })\n\n\t@PostMapping(value = \"/user/createWithArray\", consumes = { \"application/json\" })\n\tdefault ResponseEntity<Void> createUsersWithArrayInput(\n\t\t\t@Parameter(description = \"List of user object\", required = true) @Valid @RequestBody List<User> user) {\n\t\treturn getDelegate().createUsersWithArrayInput(user);\n\t}\n\n\t@Operation(summary = \"Creates list of users with given input array\", description = \"Creates list of users with given input array\", tags = { \"user\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"Successful operation\", content = { @Content(mediaType = \"application/json\", schema = @Schema(implementation = User.class)), @Content(mediaType = \"application/xml\", schema = @Schema(implementation = User.class)) }),\n\t\t\t@ApiResponse(description = \"successful operation\")\n\n\t})\n\t@PostMapping(value = \"/user/createWithList\", consumes = { \"application/json\" })\n\tdefault ResponseEntity<Void> createUsersWithListInput(\n\t\t\t@Parameter @Valid @RequestBody List<User> user) {\n\t\treturn getDelegate().createUsersWithListInput(user);\n\t}\n\n\t@Operation(summary = \"Delete user\", description = \"This can only be done by the logged in user.\", tags = { \"user\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"204\", description = \"User deleted\"),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid username supplied\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"User not found\")\n\t})\n\t@DeleteMapping(value = \"/user/{username}\")\n\tdefault ResponseEntity<Void> deleteUser(\n\t\t\t@Parameter(description = \"The name that needs to be deleted\", required = true) @PathVariable(\"username\") String username) {\n\t\treturn getDelegate().deleteUser(username);\n\t}\n\n\t@Operation(summary = \"Get user by user name\", tags = { \"user\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"successful operation\", content = { @Content(mediaType = \"application/json\", schema = @Schema(implementation = User.class)), @Content(mediaType = \"application/xml\", schema = @Schema(implementation = User.class)) }),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid username supplied\", content = @Content),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"User not found\", content = @Content) })\n\n\t@GetMapping(value = \"/user/{username}\")\n\tdefault ResponseEntity<User> getUserByName(\n\t\t\t@Parameter(description = \"The name that needs to be fetched. Use user1 for testing. \", required = true) @PathVariable(\"username\") String username) {\n\t\treturn getDelegate().getUserByName(username);\n\t}\n\n\t@Operation(summary = \"Logs user into the system\", tags = { \"user\" })\n\t@ApiResponses(value = {\n\t\t\t@ApiResponse(responseCode = \"200\", headers = {\n\t\t\t\t\t@Header(name = \"X-Rate-Limit\", description = \"calls per hour allowed by the user\", schema = @Schema(type = \"integer\", format = \"int32\")),\n\t\t\t\t\t@Header(name = \"X-Expires-After\", description = \"date in UTC when toekn expires\", schema = @Schema(type = \"string\", format = \"date-time\")) },\n\t\t\t\t\tdescription = \"successful operation\", content = @Content(schema = @Schema(implementation = String.class))),\n\t\t\t@ApiResponse(responseCode = \"400\", description = \"Invalid username/password supplied\", content = @Content) })\n\t@GetMapping(value = \"/user/login\", produces = { \"application/xml\", \"application/json\" })\n\tdefault ResponseEntity<String> loginUser(\n\t\t\t@NotNull @Parameter(description = \"The user name for login\", required = false) @Valid @RequestParam(value = \"username\", required = false) String username,\n\t\t\t@NotNull @Parameter(description = \"The password for login in clear text\", required = false) @Valid @RequestParam(value = \"password\", required = false) String password) {\n\t\treturn getDelegate().loginUser(username, password);\n\t}\n\n\t@Operation(summary = \"Logs out current logged in user session\", tags = { \"user\" })\n\t@ApiResponses(value = { @ApiResponse(description = \"successful operation\") })\n\t@GetMapping(value = \"/user/logout\")\n\tdefault ResponseEntity<Void> logoutUser() {\n\t\treturn getDelegate().logoutUser();\n\t}\n\n\t@Operation(summary = \"Update user\", description = \"This can only be done by the logged in user.\", tags = { \"user\" })\n\t@ApiResponses(value = @ApiResponse(description = \"successful operation\"))\n\t@PutMapping(value = \"/user/{username}\", consumes = { \"application/json\", \"application/xml\", \"application/x-www-form-urlencoded\" })\n\tdefault ResponseEntity<Void> updateUser(\n\t\t\t@Parameter(description = \"name that need to be deleted\", required = true, explode = Explode.FALSE, in = ParameterIn.PATH, name = \"username\", style = ParameterStyle.SIMPLE, schema = @Schema(type = \"string\")) @PathVariable(\"username\") String username,\n\t\t\t@Parameter(description = \"Update an existent user in the store\") @Valid @RequestBody User user) {\n\t\treturn getDelegate().updateUser(username, user);\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/UserApiController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.Optional;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\n@RequestMapping(\"${openapi.openAPIPetstore.base-path:/}\")\npublic class UserApiController implements UserApi {\n\n\tprivate final UserApiDelegate delegate;\n\n\tpublic UserApiController(@org.springframework.beans.factory.annotation.Autowired(required = false) UserApiDelegate delegate) {\n\t\tthis.delegate = Optional.ofNullable(delegate).orElse(new UserApiDelegate() {\n\t\t});\n\t}\n\n\t@Override\n\tpublic UserApiDelegate getDelegate() {\n\t\treturn delegate;\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/UserApiDelegate.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.util.List;\nimport java.util.Optional;\n\nimport org.springdoc.demo.app2.model.User;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.context.request.NativeWebRequest;\n\n/**\n * A delegate to be called by the {@link UserApiController}}.\n * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class.\n */\n\npublic interface UserApiDelegate {\n\n\tdefault Optional<NativeWebRequest> getRequest() {\n\t\treturn Optional.empty();\n\t}\n\n\t/**\n\t * @see UserApi#createUser\n\t */\n\tdefault ResponseEntity<Void> createUser(User user) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#createUsersWithArrayInput\n\t */\n\tdefault ResponseEntity<Void> createUsersWithArrayInput(List<User> user) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#createUsersWithListInput\n\t */\n\tdefault ResponseEntity<Void> createUsersWithListInput(List<User> user) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#deleteUser\n\t */\n\tdefault ResponseEntity<Void> deleteUser(String username) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#getUserByName\n\t */\n\tdefault ResponseEntity<User> getUserByName(String username) {\n\t\tgetRequest().ifPresent(request -> {\n\t\t\tfor (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader(\"Accept\"))) {\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/json\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/json\", \"{  \\\"firstName\\\" : \\\"firstName\\\",  \\\"lastName\\\" : \\\"lastName\\\",  \\\"password\\\" : \\\"password\\\",  \\\"userStatus\\\" : 6,  \\\"phone\\\" : \\\"phone\\\",  \\\"id\\\" : 0,  \\\"email\\\" : \\\"email\\\",  \\\"username\\\" : \\\"username\\\"}\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (mediaType.isCompatibleWith(MediaType.valueOf(\"application/xml\"))) {\n\t\t\t\t\tApiUtil.setExampleResponse(request, \"application/xml\", \"<User>  <id>123456789</id>  <username>aeiou</username>  <firstName>aeiou</firstName>  <lastName>aeiou</lastName>  <email>aeiou</email>  <password>aeiou</password>  <phone>aeiou</phone>  <userStatus>123</userStatus></User>\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#loginUser\n\t */\n\tdefault ResponseEntity<String> loginUser(String username,\n\t\t\tString password) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#logoutUser\n\t */\n\tdefault ResponseEntity<Void> logoutUser() {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n\t/**\n\t * @see UserApi#updateUser\n\t */\n\tdefault ResponseEntity<Void> updateUser(String username,\n\t\t\tUser user) {\n\t\treturn new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\n\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/api/UserApiDelegateImpl.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.api;\n\nimport java.time.Instant;\nimport java.time.temporal.ChronoUnit;\nimport java.util.Date;\nimport java.util.List;\n\nimport jakarta.annotation.PostConstruct;\nimport org.springdoc.demo.app2.model.User;\nimport org.springdoc.demo.app2.repository.UserRepository;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.server.ResponseStatusException;\n\n@Service\npublic class UserApiDelegateImpl implements UserApiDelegate {\n\n\tprivate final UserRepository userRepository;\n\n\tpublic UserApiDelegateImpl(UserRepository userRepository) {\n\t\tthis.userRepository = userRepository;\n\t}\n\n\tprivate static User createUser(long id, String username, String firstName, String lastName, String email, int userStatus) {\n\t\treturn new User()\n\t\t\t\t.id(id)\n\t\t\t\t.username(username)\n\t\t\t\t.firstName(firstName)\n\t\t\t\t.lastName(lastName)\n\t\t\t\t.email(email)\n\t\t\t\t.password(\"XXXXXXXXXXX\")\n\t\t\t\t.phone(\"123-456-7890\")\n\t\t\t\t.userStatus(userStatus);\n\t}\n\n\t@PostConstruct\n\tpublic void initUsers() {\n\t\tuserRepository.save(createUser(1, \"user1\", \"first name 1\", \"last name 1\",\n\t\t\t\t\"email1@test.com\", 1));\n\t\tuserRepository.save(createUser(2, \"user2\", \"first name 2\", \"last name 2\",\n\t\t\t\t\"email2@test.com\", 2));\n\t\tuserRepository.save(createUser(3, \"user3\", \"first name 3\", \"last name 3\",\n\t\t\t\t\"email3@test.com\", 3));\n\t\tuserRepository.save(createUser(4, \"user4\", \"first name 4\", \"last name 4\",\n\t\t\t\t\"email4@test.com\", 1));\n\t\tuserRepository.save(createUser(5, \"user5\", \"first name 5\", \"last name 5\",\n\t\t\t\t\"email5@test.com\", 2));\n\t\tuserRepository.save(createUser(6, \"user6\", \"first name 6\", \"last name 6\",\n\t\t\t\t\"email6@test.com\", 3));\n\t\tuserRepository.save(createUser(7, \"user7\", \"first name 7\", \"last name 7\",\n\t\t\t\t\"email7@test.com\", 1));\n\t\tuserRepository.save(createUser(8, \"user8\", \"first name 8\", \"last name 8\",\n\t\t\t\t\"email8@test.com\", 2));\n\t\tuserRepository.save(createUser(9, \"user9\", \"first name 9\", \"last name 9\",\n\t\t\t\t\"email9@test.com\", 3));\n\t\tuserRepository.save(createUser(10, \"user10\", \"first name 10\", \"last name 10\",\n\t\t\t\t\"email10@test.com\", 1));\n\t\tuserRepository.save(createUser(11, \"user?10\", \"first name ?10\", \"last name ?10\",\n\t\t\t\t\"email101@test.com\", 1));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> createUser(User user) {\n\t\tuserRepository.save(user);\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> createUsersWithArrayInput(List<User> users) {\n\t\tuserRepository.saveAll(users);\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> createUsersWithListInput(List<User> users) {\n\t\treturn createUsersWithArrayInput(users);\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> deleteUser(String username) {\n\t\tUser user = userRepository.findById(username)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t\tuserRepository.delete(user);\n\t\treturn ResponseEntity.noContent().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<User> getUserByName(String username) {\n\t\treturn userRepository.findById(username)\n\t\t\t\t.map(ResponseEntity::ok)\n\t\t\t\t.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));\n\t}\n\n\t@Override\n\tpublic ResponseEntity<String> loginUser(String username, String password) {\n\t\tInstant now = Instant.now().plus(1, ChronoUnit.HOURS);\n\t\treturn ResponseEntity.ok()\n\t\t\t\t.header(\"X-Expires-After\", new Date(now.toEpochMilli()).toString())\n\t\t\t\t.header(\"X-Rate-Limit\", \"5000\")\n\t\t\t\t.body(\"logged in user session:\" + now.toEpochMilli());\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> logoutUser() {\n\t\treturn ResponseEntity.ok().build();\n\t}\n\n\t@Override\n\tpublic ResponseEntity<Void> updateUser(String username, User user) {\n\t\tuser.setUsername(username);\n\t\treturn createUser(user);\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Body.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\npublic class Body {\n\n\t@Schema(description = \"Updated name of the pet\")\n\t/**\n\t * Updated name of the pet\n\t **/\n\tprivate String name = null;\n\n\t@Schema(description = \"Updated status of the pet\")\n\t/**\n\t * Updated status of the pet\n\t **/\n\tprivate String status = null;\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate static String toIndentedString(java.lang.Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n\n\t/**\n\t * Updated name of the pet\n\t *\n\t * @return name\n\t **/\n\t@JsonProperty(\"name\")\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic Body name(String name) {\n\t\tthis.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Updated status of the pet\n\t *\n\t * @return status\n\t **/\n\t@JsonProperty(\"status\")\n\tpublic String getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(String status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic Body status(String status) {\n\t\tthis.status = status;\n\t\treturn this;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Body {\\n\");\n\n\t\tsb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n\t\tsb.append(\"    status: \").append(toIndentedString(status)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Body1.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.io.File;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport io.swagger.v3.oas.annotations.media.Schema;\n\npublic class Body1 {\n\n\t@Schema(description = \"Additional data to pass to server\")\n\t/**\n\t * Additional data to pass to server\n\t **/\n\tprivate String additionalMetadata = null;\n\n\t@Schema(description = \"file to upload\")\n\t/**\n\t * file to upload\n\t **/\n\tprivate File file = null;\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate static String toIndentedString(java.lang.Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n\n\t/**\n\t * Additional data to pass to server\n\t *\n\t * @return additionalMetadata\n\t **/\n\t@JsonProperty(\"additionalMetadata\")\n\tpublic String getAdditionalMetadata() {\n\t\treturn additionalMetadata;\n\t}\n\n\tpublic void setAdditionalMetadata(String additionalMetadata) {\n\t\tthis.additionalMetadata = additionalMetadata;\n\t}\n\n\tpublic Body1 additionalMetadata(String additionalMetadata) {\n\t\tthis.additionalMetadata = additionalMetadata;\n\t\treturn this;\n\t}\n\n\t/**\n\t * file to upload\n\t *\n\t * @return file\n\t **/\n\t@JsonProperty(\"file\")\n\tpublic File getFile() {\n\t\treturn file;\n\t}\n\n\tpublic void setFile(File file) {\n\t\tthis.file = file;\n\t}\n\n\tpublic Body1 file(File file) {\n\t\tthis.file = file;\n\t\treturn this;\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Body1 {\\n\");\n\n\t\tsb.append(\"    additionalMetadata: \").append(toIndentedString(additionalMetadata)).append(\"\\n\");\n\t\tsb.append(\"    file: \").append(toIndentedString(file)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Category.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * Category\n */\n\n@JacksonXmlRootElement(localName = \"category\")\n@XmlRootElement(name = \"category\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class Category {\n\n\t@JsonProperty(\"id\")\n\t@JacksonXmlProperty(localName = \"id\")\n\n\tprivate Long id;\n\n\n\t@JsonProperty(\"name\")\n\t@JacksonXmlProperty(localName = \"name\")\n\n\tprivate String name;\n\n\n\tpublic Category id(Long id) {\n\t\tthis.id = id;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get id\n\t *\n\t * @return id\n\t */\n\t@Schema(example = \"1\", description = \"\")\n\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\n\tpublic Category name(String name) {\n\t\tthis.name = name;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get name\n\t *\n\t * @return name\n\t */\n\t@Schema(example = \"Dogs\", description = \"\")\n\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tCategory category = (Category) o;\n\t\treturn Objects.equals(this.id, category.id) &&\n\t\t\t\tObjects.equals(this.name, category.name);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, name);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Category {\\n\");\n\n\t\tsb.append(\"    id: \").append(toIndentedString(id)).append(\"\\n\");\n\t\tsb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/ModelApiResponse.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * ModelApiResponse\n */\n\n@JacksonXmlRootElement(localName = \"##default\")\n@XmlRootElement(name = \"##default\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class ModelApiResponse {\n\n\t@JsonProperty(\"code\")\n\t@JacksonXmlProperty(localName = \"code\")\n\n\tprivate Integer code;\n\n\n\t@JsonProperty(\"type\")\n\t@JacksonXmlProperty(localName = \"type\")\n\n\tprivate String type;\n\n\n\t@JsonProperty(\"message\")\n\t@JacksonXmlProperty(localName = \"message\")\n\n\tprivate String message;\n\n\n\tpublic ModelApiResponse code(Integer code) {\n\t\tthis.code = code;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get code\n\t *\n\t * @return code\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic Integer getCode() {\n\t\treturn code;\n\t}\n\n\tpublic void setCode(Integer code) {\n\t\tthis.code = code;\n\t}\n\n\n\tpublic ModelApiResponse type(String type) {\n\t\tthis.type = type;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get type\n\t *\n\t * @return type\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic String getType() {\n\t\treturn type;\n\t}\n\n\tpublic void setType(String type) {\n\t\tthis.type = type;\n\t}\n\n\n\tpublic ModelApiResponse message(String message) {\n\t\tthis.message = message;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get message\n\t *\n\t * @return message\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tModelApiResponse modelApiResponse = (ModelApiResponse) o;\n\t\treturn Objects.equals(this.code, modelApiResponse.code) &&\n\t\t\t\tObjects.equals(this.type, modelApiResponse.type) &&\n\t\t\t\tObjects.equals(this.message, modelApiResponse.message);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(code, type, message);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class ModelApiResponse {\\n\");\n\n\t\tsb.append(\"    code: \").append(toIndentedString(code)).append(\"\\n\");\n\t\tsb.append(\"    type: \").append(toIndentedString(type)).append(\"\\n\");\n\t\tsb.append(\"    message: \").append(toIndentedString(message)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Order.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.Date;\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonCreator;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.annotation.JsonValue;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validation.Valid;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * Order\n */\n\n@JacksonXmlRootElement(localName = \"order\")\n@XmlRootElement(name = \"order\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class Order {\n\n\t@JsonProperty(\"id\")\n\t@JacksonXmlProperty(localName = \"id\")\n\n\tprivate Long id;\n\n\n\t@JsonProperty(\"petId\")\n\t@JacksonXmlProperty(localName = \"petId\")\n\n\tprivate Long petId;\n\n\n\t@JsonProperty(\"quantity\")\n\t@JacksonXmlProperty(localName = \"quantity\")\n\n\tprivate Integer quantity;\n\n\n\t@JsonProperty(\"shipDate\")\n\t@JacksonXmlProperty(localName = \"shipDate\")\n\n\tprivate Date shipDate;\n\n\t@JsonProperty(\"status\")\n\t@JacksonXmlProperty(localName = \"status\")\n\n\tprivate StatusEnum status;\n\n\t@JsonProperty(\"complete\")\n\t@JacksonXmlProperty(localName = \"complete\")\n\n\tprivate Boolean complete;\n\n\tpublic Order id(Long id) {\n\t\tthis.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get id\n\t *\n\t * @return id\n\t */\n\t@Schema(example = \"10\", description = \"\")\n\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Order petId(Long petId) {\n\t\tthis.petId = petId;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get petId\n\t *\n\t * @return petId\n\t */\n\t@Schema(example = \"198772\", description = \"\")\n\n\n\tpublic Long getPetId() {\n\t\treturn petId;\n\t}\n\n\tpublic void setPetId(Long petId) {\n\t\tthis.petId = petId;\n\t}\n\n\tpublic Order quantity(Integer quantity) {\n\t\tthis.quantity = quantity;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get quantity\n\t *\n\t * @return quantity\n\t */\n\t@Schema(example = \"7\", description = \"\")\n\n\n\tpublic Integer getQuantity() {\n\t\treturn quantity;\n\t}\n\n\tpublic void setQuantity(Integer quantity) {\n\t\tthis.quantity = quantity;\n\t}\n\n\tpublic Order shipDate(Date shipDate) {\n\t\tthis.shipDate = shipDate;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get shipDate\n\t *\n\t * @return shipDate\n\t */\n\t@Schema(description = \"\")\n\n\t@Valid\n\n\tpublic Date getShipDate() {\n\t\treturn shipDate;\n\t}\n\n\tpublic void setShipDate(Date shipDate) {\n\t\tthis.shipDate = shipDate;\n\t}\n\n\tpublic Order status(StatusEnum status) {\n\t\tthis.status = status;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Order Status\n\t *\n\t * @return status\n\t */\n\t@Schema(example = \"approved\", description = \"Order Status\")\n\n\n\tpublic StatusEnum getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(StatusEnum status) {\n\t\tthis.status = status;\n\t}\n\n\tpublic Order complete(Boolean complete) {\n\t\tthis.complete = complete;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get complete\n\t *\n\t * @return complete\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic Boolean getComplete() {\n\t\treturn complete;\n\t}\n\n\tpublic void setComplete(Boolean complete) {\n\t\tthis.complete = complete;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tOrder order = (Order) o;\n\t\treturn Objects.equals(this.id, order.id) &&\n\t\t\t\tObjects.equals(this.petId, order.petId) &&\n\t\t\t\tObjects.equals(this.quantity, order.quantity) &&\n\t\t\t\tObjects.equals(this.shipDate, order.shipDate) &&\n\t\t\t\tObjects.equals(this.status, order.status) &&\n\t\t\t\tObjects.equals(this.complete, order.complete);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, petId, quantity, shipDate, status, complete);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Order {\\n\");\n\n\t\tsb.append(\"    id: \").append(toIndentedString(id)).append(\"\\n\");\n\t\tsb.append(\"    petId: \").append(toIndentedString(petId)).append(\"\\n\");\n\t\tsb.append(\"    quantity: \").append(toIndentedString(quantity)).append(\"\\n\");\n\t\tsb.append(\"    shipDate: \").append(toIndentedString(shipDate)).append(\"\\n\");\n\t\tsb.append(\"    status: \").append(toIndentedString(status)).append(\"\\n\");\n\t\tsb.append(\"    complete: \").append(toIndentedString(complete)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n\n\t/**\n\t * Order Status\n\t */\n\tpublic enum StatusEnum {\n\t\tPLACED(\"placed\"),\n\n\t\tAPPROVED(\"approved\"),\n\n\t\tDELIVERED(\"delivered\");\n\n\t\tprivate String value;\n\n\t\tStatusEnum(String value) {\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t@JsonCreator\n\t\tpublic static StatusEnum fromValue(String value) {\n\t\t\tfor (StatusEnum b : StatusEnum.values()) {\n\t\t\t\tif (b.value.equals(value)) {\n\t\t\t\t\treturn b;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new IllegalArgumentException(\"Unexpected value '\" + value + \"'\");\n\t\t}\n\n\t\t@Override\n\t\t@JsonValue\n\t\tpublic String toString() {\n\t\t\treturn String.valueOf(value);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Pet.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonCreator;\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.annotation.JsonValue;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * Pet\n */\n\n@JacksonXmlRootElement(localName = \"pet\")\n@XmlRootElement(name = \"pet\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class Pet {\n\n\t@JsonProperty(\"id\")\n\t@JacksonXmlProperty(localName = \"id\")\n\n\tprivate Long id;\n\n\n\t@JsonProperty(\"name\")\n\t@JacksonXmlProperty(localName = \"name\")\n\n\tprivate String name;\n\n\n\t@JsonProperty(\"category\")\n\t@JacksonXmlProperty(localName = \"category\")\n\n\tprivate Category category;\n\n\n\t@JsonProperty(\"photoUrls\")\n\t@JacksonXmlProperty(localName = \"photoUrls\")\n\n\t@Valid\n\tprivate List<String> photoUrls = new ArrayList<String>();\n\n\n\t@JsonProperty(\"tags\")\n\t@JacksonXmlProperty(localName = \"tags\")\n\n\t@Valid\n\tprivate List<Tag> tags = null;\n\n\t@JsonProperty(\"status\")\n\t@JacksonXmlProperty(localName = \"status\")\n\n\tprivate StatusEnum status;\n\n\tpublic Pet id(Long id) {\n\t\tthis.id = id;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get id\n\t *\n\t * @return id\n\t */\n\t@Schema(example = \"10\", description = \"\")\n\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic Pet name(String name) {\n\t\tthis.name = name;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get name\n\t *\n\t * @return name\n\t */\n\t@Schema(example = \"doggie\", required = true, description = \"\")\n\t@NotNull\n\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\tpublic Pet category(Category category) {\n\t\tthis.category = category;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get category\n\t *\n\t * @return category\n\t */\n\t@Schema(description = \"\")\n\n\t@Valid\n\n\tpublic Category getCategory() {\n\t\treturn category;\n\t}\n\n\tpublic void setCategory(Category category) {\n\t\tthis.category = category;\n\t}\n\n\tpublic Pet photoUrls(List<String> photoUrls) {\n\t\tthis.photoUrls = photoUrls;\n\t\treturn this;\n\t}\n\n\tpublic Pet addPhotoUrlsItem(String photoUrlsItem) {\n\t\tthis.photoUrls.add(photoUrlsItem);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get photoUrls\n\t *\n\t * @return photoUrls\n\t */\n\t@Schema(required = true, description = \"\")\n\t@NotNull\n\n\n\tpublic List<String> getPhotoUrls() {\n\t\treturn photoUrls;\n\t}\n\n\tpublic void setPhotoUrls(List<String> photoUrls) {\n\t\tthis.photoUrls = photoUrls;\n\t}\n\n\tpublic Pet tags(List<Tag> tags) {\n\t\tthis.tags = tags;\n\t\treturn this;\n\t}\n\n\tpublic Pet addTagsItem(Tag tagsItem) {\n\t\tif (this.tags == null) {\n\t\t\tthis.tags = new ArrayList<>();\n\t\t}\n\t\tthis.tags.add(tagsItem);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get tags\n\t *\n\t * @return tags\n\t */\n\t@Schema(description = \"\")\n\n\t@Valid\n\n\tpublic List<Tag> getTags() {\n\t\treturn tags;\n\t}\n\n\tpublic void setTags(List<Tag> tags) {\n\t\tthis.tags = tags;\n\t}\n\n\tpublic Pet status(StatusEnum status) {\n\t\tthis.status = status;\n\t\treturn this;\n\t}\n\n\t/**\n\t * pet status in the store\n\t *\n\t * @return status\n\t */\n\t@Schema(description = \"pet status in the store\")\n\n\n\tpublic StatusEnum getStatus() {\n\t\treturn status;\n\t}\n\n\tpublic void setStatus(StatusEnum status) {\n\t\tthis.status = status;\n\t}\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tPet pet = (Pet) o;\n\t\treturn Objects.equals(this.id, pet.id) &&\n\t\t\t\tObjects.equals(this.name, pet.name) &&\n\t\t\t\tObjects.equals(this.category, pet.category) &&\n\t\t\t\tObjects.equals(this.photoUrls, pet.photoUrls) &&\n\t\t\t\tObjects.equals(this.tags, pet.tags) &&\n\t\t\t\tObjects.equals(this.status, pet.status);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, name, category, photoUrls, tags, status);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Pet {\\n\");\n\n\t\tsb.append(\"    id: \").append(toIndentedString(id)).append(\"\\n\");\n\t\tsb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n\t\tsb.append(\"    category: \").append(toIndentedString(category)).append(\"\\n\");\n\t\tsb.append(\"    photoUrls: \").append(toIndentedString(photoUrls)).append(\"\\n\");\n\t\tsb.append(\"    tags: \").append(toIndentedString(tags)).append(\"\\n\");\n\t\tsb.append(\"    status: \").append(toIndentedString(status)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n\n\t/**\n\t * pet status in the store\n\t */\n\tpublic enum StatusEnum {\n\t\tAVAILABLE(\"available\"),\n\n\t\tPENDING(\"pending\"),\n\n\t\tSOLD(\"sold\");\n\n\t\tprivate String value;\n\n\t\tStatusEnum(String value) {\n\t\t\tthis.value = value;\n\t\t}\n\n\t\t@JsonCreator\n\t\tpublic static StatusEnum fromValue(String value) {\n\t\t\tfor (StatusEnum b : StatusEnum.values()) {\n\t\t\t\tif (b.value.equals(value)) {\n\t\t\t\t\treturn b;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new IllegalArgumentException(\"Unexpected value '\" + value + \"'\");\n\t\t}\n\n\t\t@Override\n\t\t@JsonValue\n\t\tpublic String toString() {\n\t\t\treturn String.valueOf(value);\n\t\t}\n\t}\n}"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/Tag.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * Tag\n */\n\n@JacksonXmlRootElement(localName = \"tag\")\n@XmlRootElement(name = \"tag\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class Tag {\n\n\t@JsonProperty(\"id\")\n\t@JacksonXmlProperty(localName = \"id\")\n\n\tprivate Long id;\n\n\n\t@JsonProperty(\"name\")\n\t@JacksonXmlProperty(localName = \"name\")\n\n\tprivate String name;\n\n\n\tpublic Tag id(Long id) {\n\t\tthis.id = id;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get id\n\t *\n\t * @return id\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\n\tpublic Tag name(String name) {\n\t\tthis.name = name;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get name\n\t *\n\t * @return name\n\t */\n\t@Schema(description = \"\")\n\n\n\tpublic String getName() {\n\t\treturn name;\n\t}\n\n\tpublic void setName(String name) {\n\t\tthis.name = name;\n\t}\n\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tTag tag = (Tag) o;\n\t\treturn Objects.equals(this.id, tag.id) &&\n\t\t\t\tObjects.equals(this.name, tag.name);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, name);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class Tag {\\n\");\n\n\t\tsb.append(\"    id: \").append(toIndentedString(id)).append(\"\\n\");\n\t\tsb.append(\"    name: \").append(toIndentedString(name)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/model/User.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.model;\n\nimport java.util.Objects;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.xml.bind.annotation.XmlAccessType;\nimport jakarta.xml.bind.annotation.XmlAccessorType;\nimport jakarta.xml.bind.annotation.XmlRootElement;\n\n/**\n * User\n */\n\n@JacksonXmlRootElement(localName = \"user\")\n@XmlRootElement(name = \"user\")\n@XmlAccessorType(XmlAccessType.FIELD)\n\npublic class User {\n\n\t@JsonProperty(\"id\")\n\t@JacksonXmlProperty(localName = \"id\")\n\n\tprivate Long id;\n\n\n\t@JsonProperty(\"username\")\n\t@JacksonXmlProperty(localName = \"username\")\n\n\tprivate String username;\n\n\n\t@JsonProperty(\"firstName\")\n\t@JacksonXmlProperty(localName = \"firstName\")\n\n\tprivate String firstName;\n\n\n\t@JsonProperty(\"lastName\")\n\t@JacksonXmlProperty(localName = \"lastName\")\n\n\tprivate String lastName;\n\n\n\t@JsonProperty(\"email\")\n\t@JacksonXmlProperty(localName = \"email\")\n\n\tprivate String email;\n\n\n\t@JsonProperty(\"password\")\n\t@JacksonXmlProperty(localName = \"password\")\n\n\tprivate String password;\n\n\n\t@JsonProperty(\"phone\")\n\t@JacksonXmlProperty(localName = \"phone\")\n\n\tprivate String phone;\n\n\n\t@JsonProperty(\"userStatus\")\n\t@JacksonXmlProperty(localName = \"userStatus\")\n\n\tprivate Integer userStatus;\n\n\n\tpublic User id(Long id) {\n\t\tthis.id = id;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get id\n\t *\n\t * @return id\n\t */\n\t@Schema(example = \"10\", description = \"\")\n\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(Long id) {\n\t\tthis.id = id;\n\t}\n\n\n\tpublic User username(String username) {\n\t\tthis.username = username;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get username\n\t *\n\t * @return username\n\t */\n\t@Schema(example = \"theUser\", description = \"\")\n\n\n\tpublic String getUsername() {\n\t\treturn username;\n\t}\n\n\tpublic void setUsername(String username) {\n\t\tthis.username = username;\n\t}\n\n\n\tpublic User firstName(String firstName) {\n\t\tthis.firstName = firstName;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get firstName\n\t *\n\t * @return firstName\n\t */\n\t@Schema(example = \"John\", description = \"\")\n\n\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\n\tpublic void setFirstName(String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\n\n\tpublic User lastName(String lastName) {\n\t\tthis.lastName = lastName;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get lastName\n\t *\n\t * @return lastName\n\t */\n\t@Schema(example = \"James\", description = \"\")\n\n\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\n\tpublic void setLastName(String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n\n\n\tpublic User email(String email) {\n\t\tthis.email = email;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get email\n\t *\n\t * @return email\n\t */\n\t@Schema(example = \"john@email.com\", description = \"\")\n\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(String email) {\n\t\tthis.email = email;\n\t}\n\n\n\tpublic User password(String password) {\n\t\tthis.password = password;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get password\n\t *\n\t * @return password\n\t */\n\t@Schema(example = \"12345\", description = \"\")\n\n\n\tpublic String getPassword() {\n\t\treturn password;\n\t}\n\n\tpublic void setPassword(String password) {\n\t\tthis.password = password;\n\t}\n\n\n\tpublic User phone(String phone) {\n\t\tthis.phone = phone;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Get phone\n\t *\n\t * @return phone\n\t */\n\t@Schema(example = \"12345\", description = \"\")\n\n\n\tpublic String getPhone() {\n\t\treturn phone;\n\t}\n\n\tpublic void setPhone(String phone) {\n\t\tthis.phone = phone;\n\t}\n\n\n\tpublic User userStatus(Integer userStatus) {\n\t\tthis.userStatus = userStatus;\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * User Status\n\t *\n\t * @return userStatus\n\t */\n\t@Schema(example = \"1\", description = \"User Status\")\n\n\n\tpublic Integer getUserStatus() {\n\t\treturn userStatus;\n\t}\n\n\tpublic void setUserStatus(Integer userStatus) {\n\t\tthis.userStatus = userStatus;\n\t}\n\n\n\t@Override\n\tpublic boolean equals(Object o) {\n\t\tif (this == o) {\n\t\t\treturn true;\n\t\t}\n\t\tif (o == null || getClass() != o.getClass()) {\n\t\t\treturn false;\n\t\t}\n\t\tUser user = (User) o;\n\t\treturn Objects.equals(this.id, user.id) &&\n\t\t\t\tObjects.equals(this.username, user.username) &&\n\t\t\t\tObjects.equals(this.firstName, user.firstName) &&\n\t\t\t\tObjects.equals(this.lastName, user.lastName) &&\n\t\t\t\tObjects.equals(this.email, user.email) &&\n\t\t\t\tObjects.equals(this.password, user.password) &&\n\t\t\t\tObjects.equals(this.phone, user.phone) &&\n\t\t\t\tObjects.equals(this.userStatus, user.userStatus);\n\t}\n\n\t@Override\n\tpublic int hashCode() {\n\t\treturn Objects.hash(id, username, firstName, lastName, email, password, phone, userStatus);\n\t}\n\n\t@Override\n\tpublic String toString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"class User {\\n\");\n\n\t\tsb.append(\"    id: \").append(toIndentedString(id)).append(\"\\n\");\n\t\tsb.append(\"    username: \").append(toIndentedString(username)).append(\"\\n\");\n\t\tsb.append(\"    firstName: \").append(toIndentedString(firstName)).append(\"\\n\");\n\t\tsb.append(\"    lastName: \").append(toIndentedString(lastName)).append(\"\\n\");\n\t\tsb.append(\"    email: \").append(toIndentedString(email)).append(\"\\n\");\n\t\tsb.append(\"    password: \").append(toIndentedString(password)).append(\"\\n\");\n\t\tsb.append(\"    phone: \").append(toIndentedString(phone)).append(\"\\n\");\n\t\tsb.append(\"    userStatus: \").append(toIndentedString(userStatus)).append(\"\\n\");\n\t\tsb.append(\"}\");\n\t\treturn sb.toString();\n\t}\n\n\t/**\n\t * Convert the given object to string with each line indented by 4 spaces\n\t * (except the first line).\n\t */\n\tprivate String toIndentedString(Object o) {\n\t\tif (o == null) {\n\t\t\treturn \"null\";\n\t\t}\n\t\treturn o.toString().replace(\"\\n\", \"\\n    \");\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/repository/HashMapRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.repository;\n\nimport java.beans.PropertyDescriptor;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.Comparator;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.Optional;\nimport java.util.Set;\nimport java.util.TreeSet;\n\nimport org.springframework.beans.BeanWrapper;\nimport org.springframework.beans.BeanWrapperImpl;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.domain.Sort;\nimport org.springframework.data.repository.CrudRepository;\nimport org.springframework.data.repository.NoRepositoryBean;\nimport org.springframework.util.Assert;\n\n@NoRepositoryBean\npublic abstract class HashMapRepository<T, ID> implements CrudRepository<T, ID> {\n\n\tprivate final BeanWrapper entityBeanInfo;\n\n\tMap<ID, T> entities = new HashMap<>();\n\n\tprotected HashMapRepository(Class<T> clazz) {\n\t\tentityBeanInfo = new BeanWrapperImpl(clazz);\n\t}\n\n\tabstract <S extends T> ID getEntityId(S entity);\n\n\t@Override\n\tpublic <S extends T> S save(S entity) {\n\t\tAssert.notNull(entity, \"entity cannot be null\");\n\t\tAssert.notNull(getEntityId(entity), \"entity ID cannot be null\");\n\t\tentities.put(getEntityId(entity), entity);\n\t\treturn entity;\n\t}\n\n\t@Override\n\tpublic <S extends T> List<S> saveAll(Iterable<S> entities) {\n\t\tAssert.notNull(entities, \"entities cannot be null\");\n\t\tList<S> result = new ArrayList<>();\n\t\tentities.forEach(entity -> result.add(save(entity)));\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic Collection<T> findAll() {\n\t\treturn entities.values();\n\t}\n\n\tpublic List<T> findAll(Pageable pageable) {\n\t\tfinal List<T> result;\n\t\tfinal Sort sort = pageable.getSort();\n\t\tComparator<T> comp = new Comparator<T>() {\n\t\t\t@Override\n\t\t\tpublic int compare(T t1, T t2) {\n\t\t\t\tint result = 0;\n\t\t\t\tfor (Sort.Order o : sort) {\n\t\t\t\t\tfinal String prop = o.getProperty();\n\t\t\t\t\tPropertyDescriptor propDesc = entityBeanInfo.getPropertyDescriptor(prop);\n\t\t\t\t\tresult = ((Comparable<T>) propDesc.createPropertyEditor(t1).getValue())\n\t\t\t\t\t\t\t.compareTo((T) propDesc.createPropertyEditor(t2).getValue());\n\t\t\t\t\tif (o.isDescending()) {\n\t\t\t\t\t\tresult = -result;\n\t\t\t\t\t}\n\t\t\t\t\tif (result != 0) break;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t};\n\t\tfinal Set<T> set = new TreeSet<>(comp);\n\t\tset.addAll(entities.values());\n\t\tresult = getPageSlice(pageable, set);\n\t\treturn result;\n\t}\n\n\tprivate List<T> getPageSlice(Pageable pageable, Collection<T> col) {\n\t\tfinal ArrayList<T> all = new ArrayList<>(col);\n\t\tfinal int size = all.size();\n\t\tfinal int psize = pageable.getPageSize();\n\t\tfinal int pnum = pageable.getPageNumber();\n\t\tif (pnum < 1) {\n\t\t\tthrow new IllegalArgumentException(\"page number must be 1 or more\");\n\t\t}\n\t\tif (psize < 1) {\n\t\t\tthrow new IllegalArgumentException(\"page size must be 1 or more\");\n\t\t}\n\t\t// inclusive\n\t\tfinal int begin = (pnum - 1) * psize;\n\t\t// exclusive\n\t\tfinal int end = Math.min(begin + psize, size);\n\t\tif (size < begin) {\n\t\t\treturn new ArrayList<>();\n\t\t}\n\t\t// return of slice is valid because all is local to this method\n\t\treturn all.subList(begin, end);\n\t}\n\n\t@Override\n\tpublic long count() {\n\t\treturn entities.keySet().size();\n\t}\n\n\t@Override\n\tpublic void delete(T entity) {\n\t\tAssert.notNull(entity, \"entity cannot be null\");\n\t\tdeleteById(getEntityId(entity));\n\t}\n\n\t@Override\n\tpublic void deleteAll(Iterable<? extends T> entitiesToDelete) {\n\t\tAssert.notNull(entitiesToDelete, \"entities cannot be null\");\n\t\tentitiesToDelete.forEach(entity -> entities.remove(getEntityId(entity)));\n\t}\n\n\t@Override\n\tpublic void deleteAll() {\n\t\tentities.clear();\n\t}\n\n\t@Override\n\tpublic void deleteById(ID id) {\n\t\tAssert.notNull(id, \"Id cannot be null\");\n\t\tentities.remove(id);\n\t}\n\n\t@Override\n\tpublic List<T> findAllById(Iterable<ID> ids) {\n\t\tAssert.notNull(ids, \"Ids cannot be null\");\n\t\tList<T> result = new ArrayList<>();\n\t\tids.forEach(id -> findById(id).ifPresent(result::add));\n\t\treturn result;\n\t}\n\n\t@Override\n\tpublic boolean existsById(ID id) {\n\t\tAssert.notNull(id, \"Id cannot be null\");\n\t\treturn entities.containsKey(id);\n\t}\n\n\tpublic T findOne(ID id) {\n\t\tAssert.notNull(id, \"Id cannot be null\");\n\t\treturn entities.get(id);\n\t}\n\n\t@Override\n\tpublic Optional<T> findById(ID id) {\n\t\treturn Optional.ofNullable(findOne(id));\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/repository/OrderRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.repository;\n\nimport org.springdoc.demo.app2.model.Order;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class OrderRepository extends HashMapRepository<Order, Long> {\n\n\tpublic OrderRepository() {\n\t\tsuper(Order.class);\n\t}\n\n\t@Override\n\t<S extends Order> Long getEntityId(S order) {\n\t\treturn order.getId();\n\t}\n\n\n\t@Override\n\tpublic void deleteAllById(Iterable<? extends Long> iterable) {\n\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/repository/PetRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.repository;\n\nimport java.util.List;\nimport java.util.stream.Collectors;\n\nimport org.springdoc.demo.app2.model.Pet;\nimport org.springdoc.demo.app2.model.Tag;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class PetRepository extends HashMapRepository<Pet, Long> {\n\n\tprivate Long sequenceId = 1L;\n\n\tpublic PetRepository() {\n\t\tsuper(Pet.class);\n\t}\n\n\t@Override\n\t<S extends Pet> Long getEntityId(S pet) {\n\t\treturn pet.getId();\n\t}\n\n\t@Override\n\tpublic <S extends Pet> S save(S pet) {\n\t\tif (pet.getId() != null && pet.getId() > sequenceId) {\n\t\t\tsequenceId = pet.getId() + 1;\n\t\t}\n\t\tif (pet.getId() == null) {\n\t\t\tpet.setId(sequenceId);\n\t\t\tsequenceId += 1;\n\t\t}\n\t\treturn super.save(pet);\n\t}\n\n\t@Override\n\tpublic void deleteAllById(Iterable<? extends Long> iterable) {\n\n\t}\n\n\tpublic List<Pet> findPetsByStatus(List<Pet.StatusEnum> statusList) {\n\t\treturn entities.values().stream()\n\t\t\t\t.filter(entity -> entity.getStatus() != null)\n\t\t\t\t.filter(entity -> statusList.contains(entity.getStatus()))\n\t\t\t\t.collect(Collectors.toList());\n\t}\n\n\tpublic List<Pet> findPetsByTags(List<String> tags) {\n\t\treturn entities.values().stream()\n\t\t\t\t.filter(entity -> entity.getTags() != null)\n\t\t\t\t.filter(entity -> entity.getTags().stream()\n\t\t\t\t\t\t.map(Tag::getName)\n\t\t\t\t\t\t.anyMatch(tags::contains)\n\t\t\t\t)\n\t\t\t\t.collect(Collectors.toList());\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/java/org/springdoc/demo/app2/repository/UserRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app2.repository;\n\nimport org.springdoc.demo.app2.model.User;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class UserRepository extends HashMapRepository<User, String> {\n\n\tpublic UserRepository() {\n\t\tsuper(User.class);\n\t}\n\n\t@Override\n\t<S extends User> String getEntityId(S user) {\n\t\treturn user.getUsername();\n\t}\n\n\t@Override\n\tpublic void deleteAllById(Iterable<? extends String> iterable) {\n\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/resources/application.yml",
    "content": "management:\n  endpoints:\n    web:\n      base-path: /rest/actuator\n      exposure:\n        include: '*'\n\nspringdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    display-request-duration: true\n    groups-order: DESC\n    operationsSorter: method\n    disable-swagger-default-url: true\n    use-root-path: true\n  show-actuator: true\n  group-configs:\n    - group: stores\n      paths-to-match: /store/**\n  cache:\n    disabled: true\nserver:\n  port: 8081\n  forward-headers-strategy: framework"
  },
  {
    "path": "demo-spring-boot-3-webmvc/src/main/resources/petstore.yml",
    "content": "openapi: 3.0.2\ninfo:\n  title: Swagger Petstore - OpenAPI 3.0\n  description: |-\n    This is a sample Pet Store Server based on the OpenAPI 3.0 specification.  You can find out more about\n    Swagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\n    You can now help us improve the API whether it's by making changes to the definition itself or to the code.\n    That way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\n    Some useful links:\n    - [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n    - [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)\n  termsOfService: 'http://swagger.io/terms/'\n  contact:\n    email: apiteam@swagger.io\n  license:\n    name: Apache 2.0\n    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'\n  version: 1.0.4\nexternalDocs:\n  description: Find out more about Swagger\n  url: 'http://swagger.io'\nservers:\n  - url: /api/v3\ntags:\n  - name: pet\n    description: Everything about your Pets\n    externalDocs:\n      description: Find out more\n      url: 'http://swagger.io'\n  - name: store\n    description: Operations about user\n  - name: user\n    description: Access to Petstore orders\n    externalDocs:\n      description: Find out more about our store\n      url: 'http://swagger.io'\npaths:\n  /pet:\n    put:\n      tags:\n        - pet\n      summary: Update an existing pet\n      description: Update an existing pet by Id\n      operationId: updatePet\n      requestBody:\n        description: Update an existent pet in the store\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/Pet'\n          application/xml:\n            schema:\n              $ref: '#/components/schemas/Pet'\n          application/x-www-form-urlencoded:\n            schema:\n              $ref: '#/components/schemas/Pet'\n        required: true\n      responses:\n        '200':\n          description: Successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/Pet'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Pet'\n        '400':\n          description: Invalid ID supplied\n        '404':\n          description: Pet not found\n        '405':\n          description: Validation exception\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n    post:\n      tags:\n        - pet\n      summary: Add a new pet to the store\n      description: Add a new pet to the store\n      operationId: addPet\n      requestBody:\n        description: Create a new pet in the store\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/Pet'\n          application/xml:\n            schema:\n              $ref: '#/components/schemas/Pet'\n          application/x-www-form-urlencoded:\n            schema:\n              $ref: '#/components/schemas/Pet'\n        required: true\n      responses:\n        '200':\n          description: Successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/Pet'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Pet'\n        '405':\n          description: Invalid input\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n  /pet/findByStatus:\n    get:\n      tags:\n        - pet\n      summary: Finds Pets by status\n      description: Multiple status values can be provided with comma separated strings\n      operationId: findPetsByStatus\n      parameters:\n        - name: status\n          in: query\n          description: Status values that need to be considered for filter\n          required: false\n          explode: true\n          schema:\n            type: string\n            default: available\n            enum:\n              - available\n              - pending\n              - sold\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/xml:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/Pet'\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/Pet'\n        '400':\n          description: Invalid status value\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n  /pet/findByTags:\n    get:\n      tags:\n        - pet\n      summary: Finds Pets by tags\n      description: 'Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.'\n      operationId: findPetsByTags\n      parameters:\n        - name: tags\n          in: query\n          description: Tags to filter by\n          required: false\n          explode: true\n          schema:\n            type: array\n            items:\n              type: string\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/xml:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/Pet'\n            application/json:\n              schema:\n                type: array\n                items:\n                  $ref: '#/components/schemas/Pet'\n        '400':\n          description: Invalid tag value\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n  '/pet/{petId}':\n    get:\n      tags:\n        - pet\n      summary: Find pet by ID\n      description: Returns a single pet\n      operationId: getPetById\n      parameters:\n        - name: petId\n          in: path\n          description: ID of pet to return\n          required: true\n          schema:\n            type: integer\n            format: int64\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/Pet'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Pet'\n        '400':\n          description: Invalid ID supplied\n        '404':\n          description: Pet not found\n      security:\n        - api_key: [ ]\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n    post:\n      tags:\n        - pet\n      summary: Updates a pet in the store with form data\n      description: ''\n      operationId: updatePetWithForm\n      parameters:\n        - name: petId\n          in: path\n          description: ID of pet that needs to be updated\n          required: true\n          schema:\n            type: integer\n            format: int64\n        - name: name\n          in: query\n          description: Name of pet that needs to be updated\n          schema:\n            type: string\n        - name: status\n          in: query\n          description: Status of pet that needs to be updated\n          schema:\n            type: string\n      responses:\n        '405':\n          description: Invalid input\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n    delete:\n      tags:\n        - pet\n      summary: Deletes a pet\n      description: ''\n      operationId: deletePet\n      parameters:\n        - name: api_key\n          in: header\n          description: ''\n          required: false\n          schema:\n            type: string\n        - name: petId\n          in: path\n          description: Pet id to delete\n          required: true\n          schema:\n            type: integer\n            format: int64\n      responses:\n        '400':\n          description: Invalid pet value\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n  '/pet/{petId}/uploadImage':\n    post:\n      tags:\n        - pet\n      summary: uploads an image\n      description: ''\n      operationId: uploadFile\n      parameters:\n        - name: petId\n          in: path\n          description: ID of pet to update\n          required: true\n          schema:\n            type: integer\n            format: int64\n        - name: additionalMetadata\n          in: query\n          description: Additional Metadata\n          required: false\n          schema:\n            type: string\n      requestBody:\n        content:\n          application/octet-stream:\n            schema:\n              type: string\n              format: binary\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/ModelApiResponse'\n      security:\n        - petstore_auth:\n            - 'write:pets'\n            - 'read:pets'\n  /store/inventory:\n    get:\n      tags:\n        - store\n      summary: Returns pet inventories by status\n      description: Returns a map of status codes to quantities\n      operationId: getInventory\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/json:\n              schema:\n                type: object\n                additionalProperties:\n                  type: integer\n                  format: int32\n      security:\n        - api_key: [ ]\n  /store/order:\n    post:\n      tags:\n        - store\n      summary: Place an order for a pet\n      description: Place a new order in the store\n      operationId: placeOrder\n      requestBody:\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/Order'\n          application/xml:\n            schema:\n              $ref: '#/components/schemas/Order'\n          application/x-www-form-urlencoded:\n            schema:\n              $ref: '#/components/schemas/Order'\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Order'\n        '405':\n          description: Invalid input\n  '/store/order/{orderId}':\n    get:\n      tags:\n        - store\n      summary: Find purchase order by ID\n      description: For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions\n      operationId: getOrderById\n      parameters:\n        - name: orderId\n          in: path\n          description: ID of order that needs to be fetched\n          required: true\n          schema:\n            type: integer\n            format: int64\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/Order'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/Order'\n        '400':\n          description: Invalid ID supplied\n        '404':\n          description: Order not found\n    delete:\n      tags:\n        - store\n      summary: Delete purchase order by ID\n      description: For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors\n      operationId: deleteOrder\n      parameters:\n        - name: orderId\n          in: path\n          description: ID of the order that needs to be deleted\n          required: true\n          schema:\n            type: integer\n            format: int64\n      responses:\n        '400':\n          description: Invalid ID supplied\n        '404':\n          description: Order not found\n  /user:\n    post:\n      tags:\n        - user\n      summary: Create user\n      description: This can only be done by the logged in user.\n      operationId: createUser\n      requestBody:\n        description: Created user object\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/User'\n          application/xml:\n            schema:\n              $ref: '#/components/schemas/User'\n          application/x-www-form-urlencoded:\n            schema:\n              $ref: '#/components/schemas/User'\n      responses:\n        default:\n          description: successful operation\n          content:\n            application/json:\n              schema:\n                $ref: '#/components/schemas/User'\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/User'\n  /user/createWithList:\n    post:\n      tags:\n        - user\n      summary: Creates list of users with given input array\n      description: Creates list of users with given input array\n      operationId: createUsersWithListInput\n      requestBody:\n        content:\n          application/json:\n            schema:\n              type: array\n              items:\n                $ref: '#/components/schemas/User'\n      responses:\n        '200':\n          description: Successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/User'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/User'\n        default:\n          description: successful operation\n  /user/login:\n    get:\n      tags:\n        - user\n      summary: Logs user into the system\n      description: ''\n      operationId: loginUser\n      parameters:\n        - name: username\n          in: query\n          description: The user name for login\n          required: false\n          schema:\n            type: string\n        - name: password\n          in: query\n          description: The password for login in clear text\n          required: false\n          schema:\n            type: string\n      responses:\n        '200':\n          description: successful operation\n          headers:\n            X-Rate-Limit:\n              description: calls per hour allowed by the user\n              schema:\n                type: integer\n                format: int32\n            X-Expires-After:\n              description: date in UTC when toekn expires\n              schema:\n                type: string\n                format: date-time\n          content:\n            application/xml:\n              schema:\n                type: string\n            application/json:\n              schema:\n                type: string\n        '400':\n          description: Invalid username/password supplied\n  /user/logout:\n    get:\n      tags:\n        - user\n      summary: Logs out current logged in user session\n      description: ''\n      operationId: logoutUser\n      parameters: [ ]\n      responses:\n        default:\n          description: successful operation\n  '/user/{username}':\n    get:\n      tags:\n        - user\n      summary: Get user by user name\n      description: ''\n      operationId: getUserByName\n      parameters:\n        - name: username\n          in: path\n          description: 'The name that needs to be fetched. Use user1 for testing. '\n          required: true\n          schema:\n            type: string\n      responses:\n        '200':\n          description: successful operation\n          content:\n            application/xml:\n              schema:\n                $ref: '#/components/schemas/User'\n            application/json:\n              schema:\n                $ref: '#/components/schemas/User'\n        '400':\n          description: Invalid username supplied\n        '404':\n          description: User not found\n    put:\n      tags:\n        - user\n      summary: Update user\n      description: This can only be done by the logged in user.\n      operationId: updateUser\n      parameters:\n        - name: username\n          in: path\n          description: name that need to be deleted\n          required: true\n          schema:\n            type: string\n      requestBody:\n        description: Update an existent user in the store\n        content:\n          application/json:\n            schema:\n              $ref: '#/components/schemas/User'\n          application/xml:\n            schema:\n              $ref: '#/components/schemas/User'\n          application/x-www-form-urlencoded:\n            schema:\n              $ref: '#/components/schemas/User'\n      responses:\n        default:\n          description: successful operation\n    delete:\n      tags:\n        - user\n      summary: Delete user\n      description: This can only be done by the logged in user.\n      operationId: deleteUser\n      parameters:\n        - name: username\n          in: path\n          description: The name that needs to be deleted\n          required: true\n          schema:\n            type: string\n      responses:\n        '400':\n          description: Invalid username supplied\n        '404':\n          description: User not found\ncomponents:\n  schemas:\n    Order:\n      type: object\n      properties:\n        id:\n          type: integer\n          format: int64\n          example: 10\n        petId:\n          type: integer\n          format: int64\n          example: 198772\n        quantity:\n          type: integer\n          format: int32\n          example: 7\n        shipDate:\n          type: string\n          format: date-time\n        status:\n          type: string\n          description: Order Status\n          example: approved\n          enum:\n            - placed\n            - approved\n            - delivered\n        complete:\n          type: boolean\n      xml:\n        name: order\n    Category:\n      type: object\n      properties:\n        id:\n          type: integer\n          format: int64\n          example: 1\n        name:\n          type: string\n          example: Dogs\n      xml:\n        name: category\n    User:\n      type: object\n      properties:\n        id:\n          type: integer\n          format: int64\n          example: 10\n        username:\n          type: string\n          example: theUser\n        firstName:\n          type: string\n          example: John\n        lastName:\n          type: string\n          example: James\n        email:\n          type: string\n          example: john@email.com\n        password:\n          type: string\n          example: '12345'\n        phone:\n          type: string\n          example: '12345'\n        userStatus:\n          type: integer\n          description: User Status\n          format: int32\n          example: 1\n      xml:\n        name: user\n    Tag:\n      type: object\n      properties:\n        id:\n          type: integer\n          format: int64\n        name:\n          type: string\n      xml:\n        name: tag\n    Pet:\n      required:\n        - name\n        - photoUrls\n      type: object\n      properties:\n        id:\n          type: integer\n          format: int64\n          example: 10\n        name:\n          type: string\n          example: doggie\n        category:\n          $ref: '#/components/schemas/Category'\n        photoUrls:\n          type: array\n          xml:\n            wrapped: true\n          items:\n            type: string\n            xml:\n              name: photoUrl\n        tags:\n          type: array\n          xml:\n            wrapped: true\n          items:\n            $ref: '#/components/schemas/Tag'\n        status:\n          type: string\n          description: pet status in the store\n          enum:\n            - available\n            - pending\n            - sold\n      xml:\n        name: pet\n    ModelApiResponse:\n      type: object\n      properties:\n        code:\n          type: integer\n          format: int32\n        type:\n          type: string\n        message:\n          type: string\n      xml:\n        name: '##default'\n  requestBodies:\n    Pet:\n      description: Pet object that needs to be added to the store\n      content:\n        application/json:\n          schema:\n            $ref: '#/components/schemas/Pet'\n        application/xml:\n          schema:\n            $ref: '#/components/schemas/Pet'\n    UserArray:\n      description: List of user object\n      content:\n        application/json:\n          schema:\n            type: array\n            items:\n              $ref: '#/components/schemas/User'\n  securitySchemes:\n    petstore_auth:\n      type: oauth2\n      flows:\n        implicit:\n          authorizationUrl: 'https://petstore3.swagger.io/oauth/authorize'\n          scopes:\n            'write:pets': modify pets in your account\n            'read:pets': read your pets\n    api_key:\n      type: apiKey\n      name: api_key\n      in: header\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-boot-webflux-scalar</artifactId>\n\t<name>Demo Spring-boot Webflux Scalar</name>\n\n\t<dependencies>\n\t\t<!-- springdoc ui -->\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-scalar</artifactId>\n\t\t</dependency>\n\t\t<!-- webflux -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-webflux</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>io.projectreactor</groupId>\n\t\t\t<artifactId>reactor-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-configuration-processor</artifactId>\n\t\t\t<optional>true</optional>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/WebfluxDemoApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport io.swagger.v3.oas.models.security.SecurityScheme;\nimport org.springdoc.core.models.GroupedOpenApi;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;\n\n@SpringBootApplication\n@EnableReactiveMongoRepositories\npublic class WebfluxDemoApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(WebfluxDemoApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components().addSecuritySchemes(\"basicScheme\",\n\t\t\t\t\t\tnew SecurityScheme().type(SecurityScheme.Type.HTTP).scheme(\"basic\")))\n\t\t\t\t.info(new Info().title(\"Tweet API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n\n\n\t@Bean\n\tpublic GroupedOpenApi storeOpenApi() {\n\t\tString[] paths = { \"/tweets/**\" };\n\t\treturn GroupedOpenApi.builder().group(\"tweets\").pathsToMatch(paths)\n\t\t\t\t.build();\n\t}\n\n\t@Bean\n\tpublic GroupedOpenApi userOpenApi() {\n\t\tString[] paths = { \"/stream/**\" };\n\t\tString[] packagedToMatch = { \"org.springdoc.demo.app3\" };\n\t\treturn GroupedOpenApi.builder().group(\"x-stream\").pathsToMatch(paths).packagesToScan(packagedToMatch)\n\t\t\t\t.build();\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/ExceptionTranslator.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport org.springdoc.demo.app3.exception.TweetNotFoundException;\nimport org.springdoc.demo.app3.payload.ErrorResponse;\n\nimport org.springframework.dao.DuplicateKeyException;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\n\n@RestControllerAdvice\npublic class ExceptionTranslator {\n\n\n\t@SuppressWarnings(\"rawtypes\")\n\t@ExceptionHandler(DuplicateKeyException.class)\n\t@ResponseStatus(HttpStatus.CONFLICT)\n\tpublic ResponseEntity handleDuplicateKeyException(DuplicateKeyException ex) {\n\t\treturn ResponseEntity.status(HttpStatus.CONFLICT)\n\t\t\t\t.body(new ErrorResponse(\"A Tweet with the same text already exists\"));\n\t}\n\n\t@SuppressWarnings(\"rawtypes\")\n\t@ExceptionHandler(TweetNotFoundException.class)\n\t@ResponseStatus(HttpStatus.NOT_FOUND)\n\tpublic ResponseEntity handleTweetNotFoundException(TweetNotFoundException ex) {\n\t\treturn ResponseEntity.notFound().build();\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/TweetController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.annotations.responses.ApiResponses;\nimport jakarta.validation.Valid;\nimport org.springdoc.demo.app3.dto.TweetDTO;\nimport org.springdoc.demo.app3.model.Tweet;\nimport org.springdoc.demo.app3.repository.TweetRepository;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * Created by bnasslahsen\n */\n@RestController\npublic class TweetController {\n\n\tprivate final TweetRepository tweetRepository;\n\n\tprivate final TweetMapper tweetMapper;\n\n\tpublic TweetController(TweetRepository tweetRepository, TweetMapper tweetMapper) {\n\t\tthis.tweetRepository = tweetRepository;\n\t\tthis.tweetMapper = tweetMapper;\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"get All Tweets\") })\n\t@GetMapping(\"/tweets\")\n\tpublic Flux<TweetDTO> getAllTweets() {\n\t\tFlux<Tweet> tweet = tweetRepository.findAll();\n\t\treturn tweetMapper.toDTO(tweet);\n\t}\n\n\t@PostMapping(\"/tweets\")\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"create Tweets\") })\n\tpublic Mono<TweetDTO> createTweets(@Valid @RequestBody TweetDTO tweetDTO) {\n\t\treturn tweetRepository.save(tweetMapper.toEntity(tweetDTO)).map(tweetMapper::toDTO);\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"get Tweet By Id\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@GetMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<TweetDTO>> getTweetById(@PathVariable(value = \"id\") String tweetId) {\n\t\treturn tweetRepository.findById(tweetId).map(savedTweet -> ResponseEntity.ok(tweetMapper.toDTO(savedTweet)))\n\t\t\t\t.defaultIfEmpty(ResponseEntity.notFound().build());\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"update Tweet\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@PutMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<TweetDTO>> updateTweet(@PathVariable(value = \"id\") String tweetId,\n\t\t\t@Valid @RequestBody TweetDTO tweetDTO) {\n\t\treturn tweetRepository.findById(tweetId).flatMap(existingTweet -> {\n\t\t\texistingTweet.setText(tweetMapper.toEntity(tweetDTO).getText());\n\t\t\treturn tweetRepository.save(existingTweet);\n\t\t}).map(updateTweet -> new ResponseEntity<>(tweetMapper.toDTO(updateTweet), HttpStatus.OK))\n\t\t\t\t.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));\n\t}\n\n\t@ApiResponses(value = { @ApiResponse(responseCode = \"200\", description = \"delete Tweet\"),\n\t\t\t@ApiResponse(responseCode = \"404\", description = \"tweet not found\") })\n\t@DeleteMapping(\"/tweets/{id}\")\n\tpublic Mono<ResponseEntity<Void>> deleteTweet(@PathVariable(value = \"id\") String tweetId) {\n\t\treturn tweetRepository.findById(tweetId)\n\t\t\t\t.flatMap(existingTweet -> tweetRepository.delete(existingTweet)\n\t\t\t\t\t\t.then(Mono.just(new ResponseEntity<Void>(HttpStatus.OK))))\n\t\t\t\t.defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));\n\t}\n\n\t@Operation(description = \"Tweets are Sent to the client as Server Sent Events\", responses = {\n\t\t\t@ApiResponse(responseCode = \"200\", description = \"stream All Tweets\") })\n\t@GetMapping(value = \"/stream/tweets\", produces = MediaType.TEXT_EVENT_STREAM_VALUE)\n\tpublic Flux<TweetDTO> streamAllTweets() {\n\t\treturn tweetMapper.toDTO(tweetRepository.findAll());\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/TweetMapper.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.controller;\n\nimport org.springdoc.demo.app3.dto.TweetDTO;\nimport org.springdoc.demo.app3.model.Tweet;\nimport reactor.core.publisher.Flux;\nimport reactor.core.publisher.Mono;\n\nimport org.springframework.beans.BeanUtils;\nimport org.springframework.stereotype.Component;\n\n@Component\npublic class TweetMapper {\n\n\tFlux<TweetDTO> toDTO(Flux<Tweet> tweet) {\n\t\treturn tweet.map(this::toDTO);\n\t}\n\n\tFlux<Tweet> toEntity(Flux<TweetDTO> tweetDTO) {\n\t\treturn tweetDTO.map(this::toEntity);\n\t}\n\n\tMono<TweetDTO> toDTO(Mono<Tweet> tweet) {\n\t\treturn tweet.map(this::toDTO);\n\t}\n\n\tMono<Tweet> toEntity(Mono<TweetDTO> tweetDTO) {\n\t\treturn tweetDTO.map(this::toEntity);\n\t}\n\n\tTweetDTO toDTO(Tweet tweet) {\n\t\tTweetDTO teTweetDTO = new TweetDTO();\n\t\tBeanUtils.copyProperties(tweet,teTweetDTO);\n\t\treturn teTweetDTO;\n\t}\n\n\tTweet toEntity(TweetDTO tweetDTO) {\n\t\tTweet teTweet = new Tweet();\n\t\tBeanUtils.copyProperties(tweetDTO, teTweet);\n\t\treturn teTweet;\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/dto/TweetDTO.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.dto;\n\nimport java.util.Date;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.validation.constraints.Size;\n\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\npublic class TweetDTO {\n\tprivate String id;\n\n\t@NotBlank\n\t@Size(max = 140)\n\tprivate String text;\n\n\t@NotNull\n\tprivate Date createdAt = new Date();\n\n\tpublic TweetDTO() {\n\n\t}\n\n\tpublic TweetDTO(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getText() {\n\t\treturn text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic Date getCreatedAt() {\n\t\treturn createdAt;\n\t}\n\n\tpublic void setCreatedAt(Date createdAt) {\n\t\tthis.createdAt = createdAt;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/exception/TweetNotFoundException.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.exception;\n\n/**\n * Created by bnasslahsen\n */\npublic class TweetNotFoundException extends RuntimeException {\n\n\t/**\n\t *\n\t */\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic TweetNotFoundException(String tweetId) {\n\t\tsuper(\"Tweet not found with id \" + tweetId);\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/model/Tweet.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.model;\n\nimport java.util.Date;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.NotNull;\nimport jakarta.validation.constraints.Size;\n\nimport org.springframework.data.annotation.Id;\nimport org.springframework.data.mongodb.core.mapping.Document;\n\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\n@Document(collection = \"tweets\")\npublic class Tweet {\n\t@Id\n\tprivate String id;\n\n\t@NotBlank\n\t@Size(max = 140)\n\tprivate String text;\n\n\t@NotNull\n\tprivate Date createdAt = new Date();\n\n\tpublic Tweet() {\n\n\t}\n\n\tpublic Tweet(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic String getId() {\n\t\treturn id;\n\t}\n\n\tpublic void setId(String id) {\n\t\tthis.id = id;\n\t}\n\n\tpublic String getText() {\n\t\treturn text;\n\t}\n\n\tpublic void setText(String text) {\n\t\tthis.text = text;\n\t}\n\n\tpublic Date getCreatedAt() {\n\t\treturn createdAt;\n\t}\n\n\tpublic void setCreatedAt(Date createdAt) {\n\t\tthis.createdAt = createdAt;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/payload/ErrorResponse.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.payload;\n\n/**\n * Created by bnasslahsen\n */\npublic class ErrorResponse {\n\tprivate String message;\n\n\tpublic ErrorResponse(String message) {\n\t\tthis.message = message;\n\t}\n\n\tpublic String getMessage() {\n\t\treturn message;\n\t}\n\n\tpublic void setMessage(String message) {\n\t\tthis.message = message;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/repository/TweetRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.app3.repository;\n\nimport org.springdoc.demo.app3.model.Tweet;\n\nimport org.springframework.data.mongodb.repository.ReactiveMongoRepository;\nimport org.springframework.stereotype.Repository;\n\n/**\n * Created by bnasslahsen on 08/09/17.\n */\n@Repository\npublic interface TweetRepository extends ReactiveMongoRepository<Tweet, String> {\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/src/main/resources/application.yml",
    "content": "server:\n  port: 8082\n  forward-headers-strategy: framework\n\nspring:\n  data:\n    mongodb:\n      uri: ${SPRING_DATA_MONGODB_URI:mongodb://localhost:27017/tweetsdb}\n\nspringdoc:\n  version: '@springdoc.version@'"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst",
    "content": "org/springdoc/demo/app3/dto/TweetDTO.class\norg/springdoc/demo/app3/controller/ExceptionTranslator.class\norg/springdoc/demo/app3/exception/TweetNotFoundException.class\norg/springdoc/demo/app3/model/Tweet.class\norg/springdoc/demo/app3/WebfluxDemoApplication.class\norg/springdoc/demo/app3/repository/TweetRepository.class\norg/springdoc/demo/app3/payload/ErrorResponse.class\norg/springdoc/demo/app3/controller/TweetMapper.class\norg/springdoc/demo/app3/controller/TweetController.class\n"
  },
  {
    "path": "demo-spring-boot-webflux-scalar/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst",
    "content": "/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/WebfluxDemoApplication.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/ExceptionTranslator.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/TweetController.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/controller/TweetMapper.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/dto/TweetDTO.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/exception/TweetNotFoundException.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/model/Tweet.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/payload/ErrorResponse.java\n/Users/Badr.NassLahsen/Documents/workspace/main/springdoc-openapi-demos/demo-spring-boot-webflux-scalar/src/main/java/org/springdoc/demo/app3/repository/TweetRepository.java\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-boot-webmvc-scalar</artifactId>\n\t<name>Demo Spring-boot Webmvc Scalar</name>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-scalar</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/SpringdocApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SpringdocApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringdocApplication.class, args);\n\t}\n\n\n}\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/controller/BookController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.controller;\n\nimport java.util.Collection;\n\nimport jakarta.validation.Valid;\nimport jakarta.validation.constraints.NotNull;\nimport org.springdoc.demo.services.book.exception.BookNotFoundException;\nimport org.springdoc.demo.services.book.model.Book;\nimport org.springdoc.demo.services.book.repository.BookRepository;\n\nimport org.springframework.http.HttpStatus;\nimport org.springframework.web.bind.annotation.DeleteMapping;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PatchMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\n\n/**\n * The type Book controller.\n */\n@RestController\n@RequestMapping(\"/api/book\")\npublic class BookController {\n\n\t/**\n\t * The Repository.\n\t */\n\tprivate final BookRepository repository;\n\n\t/**\n\t * Instantiates a new Book controller.\n\t *\n\t * @param repository the repository\n\t */\n\tpublic BookController(BookRepository repository) {\n\t\tthis.repository = repository;\n\t}\n\n\t/**\n\t * Find by id book.\n\t *\n\t * @param id the id\n\t * @return the book\n\t */\n\t@GetMapping(\"/{id}\")\n\tpublic Book findById(@PathVariable long id) {\n\t\treturn repository.findById(id)\n\t\t\t\t.orElseThrow(() -> new BookNotFoundException());\n\t}\n\n\t/**\n\t * Find books collection.\n\t *\n\t * @return the collection\n\t */\n\t@GetMapping(\"/\")\n\tpublic Collection<Book> findBooks() {\n\t\treturn repository.getBooks();\n\t}\n\n\t/**\n\t * Update book book.\n\t *\n\t * @param id   the id\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PutMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book updateBook(@PathVariable(\"id\") final String id, @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Patch book book.\n\t *\n\t * @param id   the id\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PatchMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book patchBook(@PathVariable(\"id\") final String id, @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Post book book.\n\t *\n\t * @param book the book\n\t * @return the book\n\t */\n\t@PostMapping(\"/\")\n\t@ResponseStatus(HttpStatus.CREATED)\n\tpublic Book postBook(@NotNull @Valid @RequestBody final Book book) {\n\t\treturn book;\n\t}\n\n\t/**\n\t * Head book book.\n\t *\n\t * @return the book\n\t */\n\t@RequestMapping(method = RequestMethod.HEAD, value = \"/\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic Book headBook() {\n\t\treturn new Book();\n\t}\n\n\t/**\n\t * Delete book long.\n\t *\n\t * @param id the id\n\t * @return the long\n\t */\n\t@DeleteMapping(\"/{id}\")\n\t@ResponseStatus(HttpStatus.OK)\n\tpublic long deleteBook(@PathVariable final long id) {\n\t\treturn id;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/exception/BookNotFoundException.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.exception;\n\n@SuppressWarnings(\"serial\")\npublic class BookNotFoundException extends RuntimeException {\n\n\tpublic BookNotFoundException() {\n\n\t}\n\n}"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/exception/GlobalControllerExceptionHandler.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.exception;\n\nimport java.time.Instant;\n\nimport org.springframework.core.convert.ConversionFailedException;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ProblemDetail;\nimport org.springframework.web.bind.annotation.ExceptionHandler;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestControllerAdvice;\nimport org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;\n\n@RestControllerAdvice\npublic class GlobalControllerExceptionHandler extends ResponseEntityExceptionHandler {\n\n\t@ExceptionHandler(ConversionFailedException.class)\n\t@ResponseStatus(HttpStatus.BAD_REQUEST)\n\tpublic ProblemDetail handleConnversion(RuntimeException e) {\n\t\tProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getMessage());\n\t\tproblemDetail.setTitle(\"Bookmark is Not Found\");\n\t\tproblemDetail.setProperty(\"errorCategory\", \"Generic Exception\");\n\t\tproblemDetail.setProperty(\"timestamp\", Instant.now());\n\t\treturn problemDetail;\n\t}\n\n\t@ExceptionHandler(BookNotFoundException.class)\n\t@ResponseStatus(HttpStatus.NOT_FOUND)\n\tpublic ProblemDetail handleBookNotFound(RuntimeException e) {\n\t\tProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, e.getMessage());\n\t\tproblemDetail.setTitle(\"Book Not Found\");\n\t\tproblemDetail.setProperty(\"errorCategory\", \"Generic Exception\");\n\t\tproblemDetail.setProperty(\"timestamp\", Instant.now());\n\t\treturn problemDetail;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/model/Book.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.model;\n\nimport jakarta.validation.constraints.NotBlank;\nimport jakarta.validation.constraints.Size;\n\n/**\n * The type Book.\n */\npublic class Book {\n\n\t/**\n\t * The Id.\n\t */\n\tprivate long id;\n\n\t/**\n\t * The Title.\n\t */\n\t@NotBlank\n\t@Size(min = 0, max = 20)\n\tprivate String title;\n\n\t/**\n\t * The Author.\n\t */\n\t@NotBlank\n\t@Size(min = 0, max = 30)\n\tprivate String author;\n\n\t/**\n\t * Gets id.\n\t *\n\t * @return the id\n\t */\n\tpublic long getId() {\n\t\treturn id;\n\t}\n\n\t/**\n\t * Sets id.\n\t *\n\t * @param id the id\n\t */\n\tpublic void setId(long id) {\n\t\tthis.id = id;\n\t}\n\n\t/**\n\t * Gets title.\n\t *\n\t * @return the title\n\t */\n\tpublic String getTitle() {\n\t\treturn title;\n\t}\n\n\t/**\n\t * Sets title.\n\t *\n\t * @param title the title\n\t */\n\tpublic void setTitle(String title) {\n\t\tthis.title = title;\n\t}\n\n\t/**\n\t * Gets author.\n\t *\n\t * @return the author\n\t */\n\tpublic String getAuthor() {\n\t\treturn author;\n\t}\n\n\t/**\n\t * Sets author.\n\t *\n\t * @param author the author\n\t */\n\tpublic void setAuthor(String author) {\n\t\tthis.author = author;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/java/org/springdoc/demo/services/book/repository/BookRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.book.repository;\n\nimport java.util.Collection;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Optional;\n\nimport org.springdoc.demo.services.book.model.Book;\n\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic class BookRepository {\n\n\tprivate Map<Long, Book> books = new HashMap<>();\n\n\tpublic Optional<Book> findById(long id) {\n\t\treturn Optional.ofNullable(books.get(id));\n\t}\n\n\tpublic void add(Book book) {\n\t\tbooks.put(book.getId(), book);\n\t}\n\n\tpublic Collection<Book> getBooks() {\n\t\treturn books.values();\n\t}\n}\n"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/resources/application.yml",
    "content": "server:\n  forward-headers-strategy: framework\n\nspringdoc:\n  version: '@springdoc.version@'"
  },
  {
    "path": "demo-spring-boot-webmvc-scalar/src/main/resources/logback.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration>\n\t<appender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\">\n\t\t<encoder>\n\t\t\t<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\n\t\t\t</pattern>\n\t\t</encoder>\n\t</appender>\n\n\t<logger name=\"org.springframework\" level=\"INFO\"/>\n\t<logger name=\"org.springframework.transaction\" level=\"WARN\"/>\n\n\t<root level=\"INFO\">\n\t\t<appender-ref ref=\"STDOUT\"/>\n\t</root>\n</configuration>"
  },
  {
    "path": "demo-spring-cloud-function/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache\n# Ignore Gradle project-specific cache directory\n.gradle\n\n# Ignore Gradle build output directory\nbuild\n"
  },
  {
    "path": "demo-spring-cloud-function/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>demo-spring-cloud-function</artifactId>\n\t<packaging>pom</packaging>\n\n\t<modules>\n\t\t<module>spring-cloud-function-webmvc</module>\n\t\t<module>spring-cloud-function-webflux</module>\n\t</modules>\n\n</project>"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webflux/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache\n# Ignore Gradle project-specific cache directory\n.gradle\n\n# Ignore Gradle build output directory\nbuild\n"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webflux/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<artifactId>demo-spring-cloud-function</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>spring-cloud-function-webflux</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-function-webflux</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webflux/src/main/java/org/springdoc/demo/services/functions/PersonDTO.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.functions;\n\npublic class PersonDTO {\n\tprivate String email;\n\n\tprivate String firstName;\n\n\tprivate String lastName;\n\n\tpublic PersonDTO() {\n\t}\n\n\tpublic PersonDTO(final String email, final String firstName, final String lastName) {\n\t\tthis.email = email;\n\t\tthis.firstName = firstName;\n\t\tthis.lastName = lastName;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(final String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\n\tpublic void setFirstName(final String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\n\tpublic void setLastName(final String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webflux/src/main/java/org/springdoc/demo/services/functions/SampleApplication.java",
    "content": "package org.springdoc.demo.services.functions;\n\nimport java.util.function.Function;\nimport java.util.function.Supplier;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport reactor.core.publisher.Flux;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication()\npublic class SampleApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SampleApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components())\n\t\t\t\t.info(new Info().title(\"spring-cloud-function-webflux OpenAPI Demo\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n\n\t@Bean\n\tpublic Function<String, String> reverseString() {\n\t\treturn value -> new StringBuilder(value).reverse().toString();\n\t}\n\n\t@Bean\n\tpublic Function<String, String> uppercase() {\n\t\treturn String::toUpperCase;\n\t}\n\n\t@Bean\n\tpublic Function<Flux<String>, Flux<String>> lowercase() {\n\t\treturn flux -> flux.map(String::toLowerCase);\n\t}\n\n\t@Bean\n\tpublic Supplier<PersonDTO> hello() {\n\t\treturn PersonDTO::new;\n\t}\n\n\t@Bean\n\tpublic Supplier<Flux<String>> words() {\n\t\treturn () -> Flux.fromArray(new String[] { \"foo\", \"bar\" });\n\t}\n}"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webflux/src/main/resources/application.yml",
    "content": "springdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true\nserver:\n  forward-headers-strategy: framework"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webmvc/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache\n# Ignore Gradle project-specific cache directory\n.gradle\n\n# Ignore Gradle build output directory\nbuild\n"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webmvc/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<parent>\n\t\t<artifactId>demo-spring-cloud-function</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<modelVersion>4.0.0</modelVersion>\n\n\t<artifactId>spring-cloud-function-webmvc</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t<artifactId>spring-cloud-starter-function-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webmvc/src/main/java/org/springdoc/demo/services/functions/PersonDTO.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.functions;\n\npublic class PersonDTO {\n\tprivate String email;\n\n\tprivate String firstName;\n\n\tprivate String lastName;\n\n\tpublic PersonDTO() {\n\t}\n\n\tpublic PersonDTO(final String email, final String firstName, final String lastName) {\n\t\tthis.email = email;\n\t\tthis.firstName = firstName;\n\t\tthis.lastName = lastName;\n\t}\n\n\tpublic String getEmail() {\n\t\treturn email;\n\t}\n\n\tpublic void setEmail(final String email) {\n\t\tthis.email = email;\n\t}\n\n\tpublic String getFirstName() {\n\t\treturn firstName;\n\t}\n\n\tpublic void setFirstName(final String firstName) {\n\t\tthis.firstName = firstName;\n\t}\n\n\tpublic String getLastName() {\n\t\treturn lastName;\n\t}\n\n\tpublic void setLastName(final String lastName) {\n\t\tthis.lastName = lastName;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webmvc/src/main/java/org/springdoc/demo/services/functions/SampleApplication.java",
    "content": "package org.springdoc.demo.services.functions;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.function.Consumer;\nimport java.util.function.Function;\nimport java.util.function.Supplier;\nimport java.util.stream.Collectors;\n\nimport io.swagger.v3.oas.annotations.Operation;\nimport io.swagger.v3.oas.annotations.media.ArraySchema;\nimport io.swagger.v3.oas.annotations.media.Content;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport io.swagger.v3.oas.annotations.responses.ApiResponse;\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\nimport org.springdoc.core.annotations.RouterOperation;\nimport org.springdoc.core.annotations.RouterOperations;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.web.bind.annotation.RequestMethod;\n\n@SpringBootApplication()\npublic class SampleApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SampleApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components())\n\t\t\t\t.info(new Info().title(\"spring-cloud-function-webmvc OpenAPI Demo\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n\n\t@Bean\n\tpublic Function<String, String> reverseString() {\n\t\treturn value -> new StringBuilder(value).reverse().toString();\n\t}\n\n\t@Bean\n\tpublic Function<String, String> uppercase() {\n\t\treturn String::toUpperCase;\n\t}\n\n\t@Bean\n\t@RouterOperations({\n\t\t\t@RouterOperation(method = RequestMethod.GET, operation = @Operation(description = \"Say hello GET\", operationId = \"lowercaseGET\", tags = \"positions\",\n\t\t\t\t\tresponses = @ApiResponse(responseCode = \"200\", content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))))),\n\t\t\t@RouterOperation(method = RequestMethod.POST, operation = @Operation(description = \"Say hello POST\", operationId = \"lowercasePOST\", tags = \"positions\",\n\t\t\t\t\tresponses = @ApiResponse(responseCode = \"200\", description = \"new desc\", content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class))))))\n\t})\n\tpublic Function<List<String>, List<String>> lowercase() {\n\t\treturn list -> list.stream().map(String::toLowerCase).collect(Collectors.toList());\n\t}\n\n\t@Bean\n\t@RouterOperation(operation = @Operation(description = \"Say hello By Id\", operationId = \"hellome\", tags = \"persons\",\n\t\t\tresponses = @ApiResponse(responseCode = \"200\", content = @Content(schema = @Schema(implementation = PersonDTO.class)))))\n\tpublic Supplier<PersonDTO> helloSupplier() {\n\t\treturn PersonDTO::new;\n\t}\n\n\t@Bean\n\tpublic Consumer<PersonDTO> helloConsumer() {\n\t\treturn PersonDTO::getFirstName;\n\t}\n\n\t@Bean\n\tpublic Supplier<List<String>> words() {\n\t\treturn () -> Arrays.asList(\"foo\", \"bar\");\n\t}\n}"
  },
  {
    "path": "demo-spring-cloud-function/spring-cloud-function-webmvc/src/main/resources/application.yml",
    "content": "springdoc:\n  version: '@springdoc.version@'\n  swagger-ui:\n    use-root-path: true\nserver:\n  forward-headers-strategy: framework"
  },
  {
    "path": "demo-spring-data-rest/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-spring-data-rest/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-data-rest</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-rest</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.projectlombok</groupId>\n\t\t\t<artifactId>lombok</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-data-rest/src/main/java/org/springdoc/demo/data/rest/Account.java",
    "content": "/*\n *\n *  *\n *  *  *\n *  *  *  * Copyright 2019-2020 the original author or authors.\n *  *  *  *\n *  *  *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  *  *  * you may not use this file except in compliance with the License.\n *  *  *  * You may obtain a copy of the License at\n *  *  *  *\n *  *  *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *  *  *\n *  *  *  * Unless required by applicable law or agreed to in writing, software\n *  *  *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  *  *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  *  *  * See the License for the specific language governing permissions and\n *  *  *  * limitations under the License.\n *  *  *\n *  *\n *\n *\n */\n\npackage org.springdoc.demo.data.rest;\n\nimport java.util.Date;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\nimport jakarta.persistence.ManyToOne;\nimport jakarta.persistence.Temporal;\nimport jakarta.persistence.TemporalType;\n\n@Entity\npublic class Account {\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.AUTO)\n\tprivate Long id;\n\n\t@ManyToOne\n\tprivate Customer customer;\n\n\t@Temporal(TemporalType.DATE)\n\tprivate Date expiryDate;\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic Customer getCustomer() {\n\t\treturn customer;\n\t}\n\n\tpublic Date getExpiryDate() {\n\t\treturn expiryDate;\n\t}\n}"
  },
  {
    "path": "demo-spring-data-rest/src/main/java/org/springdoc/demo/data/rest/AccountRepository.java",
    "content": "/*\n *\n *  *\n *  *  *\n *  *  *  * Copyright 2019-2020 the original author or authors.\n *  *  *  *\n *  *  *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  *  *  * you may not use this file except in compliance with the License.\n *  *  *  * You may obtain a copy of the License at\n *  *  *  *\n *  *  *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *  *  *\n *  *  *  * Unless required by applicable law or agreed to in writing, software\n *  *  *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  *  *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  *  *  * See the License for the specific language governing permissions and\n *  *  *  * limitations under the License.\n *  *  *\n *  *\n *\n *\n */\n\npackage org.springdoc.demo.data.rest;\n\n\nimport java.util.List;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n\nimport org.springframework.data.repository.CrudRepository;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.data.rest.core.annotation.RepositoryRestResource;\n\n/**\n * Repository to manage {@link Account} instances.\n *\n */\n@RepositoryRestResource\n@SecurityRequirement(name = \"bearer\")\npublic interface AccountRepository extends CrudRepository<Account, Long> {\n\n\t/**\n\t * Returns all accounts belonging to the given {@link Customer}.\n\t *\n\t * @param customer\n\t * @return\n\t */\n\tList<Account> findByCustomer(@Param(\"customer\") Customer customer);\n}"
  },
  {
    "path": "demo-spring-data-rest/src/main/java/org/springdoc/demo/data/rest/Customer.java",
    "content": "package org.springdoc.demo.data.rest;\n\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.GenerationType;\nimport jakarta.persistence.Id;\n\n/**\n * @author Oliver Gierke\n */\n@Entity\npublic class Customer {\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.AUTO)\n\tprivate Long id;\n\n\tprivate String firstname;\n\n\tprivate String lastname;\n\n\tpublic Long getId() {\n\t\treturn id;\n\t}\n\n\tpublic String getFirstname() {\n\t\treturn firstname;\n\t}\n\n\tpublic String getLastname() {\n\t\treturn lastname;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-data-rest/src/main/java/org/springdoc/demo/data/rest/CustomerRepository.java",
    "content": "/*\n *\n *  *\n *  *  *\n *  *  *  * Copyright 2019-2020 the original author or authors.\n *  *  *  *\n *  *  *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  *  *  * you may not use this file except in compliance with the License.\n *  *  *  * You may obtain a copy of the License at\n *  *  *  *\n *  *  *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *  *  *\n *  *  *  * Unless required by applicable law or agreed to in writing, software\n *  *  *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  *  *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  *  *  * See the License for the specific language governing permissions and\n *  *  *  * limitations under the License.\n *  *  *\n *  *\n *\n *\n */\n\npackage org.springdoc.demo.data.rest;\n\nimport io.swagger.v3.oas.annotations.security.SecurityRequirement;\n\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.Pageable;\nimport org.springframework.data.jpa.repository.JpaSpecificationExecutor;\nimport org.springframework.data.repository.CrudRepository;\nimport org.springframework.data.repository.query.Param;\nimport org.springframework.data.rest.core.annotation.RepositoryRestResource;\nimport org.springframework.data.rest.core.annotation.RestResource;\n\n/**\n * Repository to manage {@link Customer} instances.\n *\n * @author Oliver Gierke\n */\n@RepositoryRestResource\n@SecurityRequirement(name = \"bearer\")\npublic interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {\n\n\t/**\n\t * Returns a page of {@link Customer}s with the given lastname.\n\t *\n\t * @param lastname\n\t * @param pageable\n\t * @return\n\t */\n\tPage<Customer> findByLastname(@Param(\"lastname\") String lastname, Pageable pageable);\n\n\t@Override\n\t@RestResource(exported = false)\n\tvoid deleteById(Long id);\n\n\t@Override\n\t@RestResource(exported = false)\n\tvoid delete(Customer entity);\n}"
  },
  {
    "path": "demo-spring-data-rest/src/main/java/org/springdoc/demo/data/rest/SpringdocApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.data.rest;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class SpringdocApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringdocApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components())\n\t\t\t\t.info(new Info().title(\"Customer accounts API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n}\n"
  },
  {
    "path": "demo-spring-data-rest/src/main/resources/application.properties",
    "content": "springdoc.version=@springdoc.version@\nspringdoc.swagger-ui.use-root-path=true\nserver.forward-headers-strategy=framework\nspringdoc.cache.disabled=true"
  },
  {
    "path": "demo-spring-hateoas/.gitignore",
    "content": "######################\n# Project Specific\n######################\n/target/www/**\n/src/test/javascript/coverage/\n\n######################\n# Node\n######################\n/node/\nnode_tmp/\nnode_modules/\nnpm-debug.log.*\n/.awcache/*\n/.cache-loader/*\n\n######################\n# SASS\n######################\n.sass-cache/\n\n######################\n# Eclipse\n######################\n*.pydevproject\n.project\n.metadata\ntmp/\ntmp/**/*\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.classpath\n.settings/\n.loadpath\n.factorypath\n/src/main/resources/rebel.xml\n\n# External tool builders\n.externalToolBuilders/**\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# PDT-specific\n.buildpath\n\n######################\n# Intellij\n######################\n.idea/\n*.iml\n*.iws\n*.ipr\n*.ids\n*.orig\nclasses/\nout/\n\n######################\n# Visual Studio Code\n######################\n.vscode/\n\n######################\n# Maven\n######################\n/log/\n/target/\n\n######################\n# Gradle\n######################\n.gradle/\n/build/\n\n######################\n# Package Files\n######################\n*.jar\n*.war\n*.ear\n*.db\n\n######################\n# Windows\n######################\n# Windows image file caches\nThumbs.db\n\n# Folder config file\nDesktop.ini\n\n######################\n# Mac OSX\n######################\n.DS_Store\n.svn\n\n# Thumbnails\n._*\n\n# Files that might appear on external disk\n.Spotlight-V100\n.Trashes\n\n######################\n# Directories\n######################\n/bin/\n/deploy/\n\n######################\n# Logs\n######################\n*.log*\n\n######################\n# Others\n######################\n*.class\n*.*~\n*~\n.merge_file*\n\n######################\n# Gradle Wrapper\n######################\n!gradle/wrapper/gradle-wrapper.jar\n\n######################\n# Maven Wrapper\n######################\n!.mvn/wrapper/maven-wrapper.jar\n\n######################\n# ESLint\n######################\n.eslintcache"
  },
  {
    "path": "demo-spring-hateoas/README.md",
    "content": "# springdoc-openapi demo with spring-boot-2 hateoas\n\n## Building application\n\n### Pre-requisites\n\n- JDK 8+\n- maven 3\n- docker CLI\n\n### Option 1: Building Executable JAR\n\nTo create an `executable jar`, simply run:\n\n```sh\n mvn clean package\n```\n\n### Option 2: Building a non-native OCI Images\n\nTo create a non-native OCI docker image, simply run:\n\n```sh\nmvn clean spring-boot:build-image\n```\n\n## Running the native application\n\nTo run the demo using docker, invoke the following:\n\n```sh\ndocker pull springdocdemos/springdoc-openapi-hateoas-service:latest\ndocker run --rm -p 8080:8080 springdocdemos/springdoc-openapi-hateoas-service:latest\n```"
  },
  {
    "path": "demo-spring-hateoas/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<parent>\n\t\t<artifactId>springdoc-openapi-demos</artifactId>\n\t\t<groupId>org.springdoc</groupId>\n\t\t<version>3.1.7-SNAPSHOT</version>\n\t</parent>\n\t<artifactId>demo-spring-hateoas</artifactId>\n\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-web</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-hateoas</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-data-jpa</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.h2database</groupId>\n\t\t\t<artifactId>h2</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.projectlombok</groupId>\n\t\t\t<artifactId>lombok</artifactId>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>\n\t\t</dependency>\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>"
  },
  {
    "path": "demo-spring-hateoas/src/main/java/org/springdoc/demo/services/hateoas/DatabaseLoader.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\npackage org.springdoc.demo.services.hateoas;\n\nimport org.springframework.boot.CommandLineRunner;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.stereotype.Component;\n\n/**\n * Pre-load some data using a Spring Boot {@link CommandLineRunner}.\n *\n * @author Greg Turnquist\n */\n@Component\nclass DatabaseLoader {\n\n\t/**\n\t * Use Spring to inject a {@link EmployeeRepository} that can then load data. Since this will run only after the app\n\t * is operational, the database will be up.\n\t *\n\t * @param repository\n\t */\n\t@Bean\n\tCommandLineRunner init(EmployeeRepository repository) {\n\n\t\treturn args -> {\n\t\t\trepository.save(new Employee(\"Frodo\", \"Baggins\", \"ring bearer\"));\n\t\t\trepository.save(new Employee(\"Bilbo\", \"Baggins\", \"burglar\"));\n\t\t};\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-hateoas/src/main/java/org/springdoc/demo/services/hateoas/Employee.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\npackage org.springdoc.demo.services.hateoas;\n\nimport jakarta.persistence.Entity;\nimport jakarta.persistence.GeneratedValue;\nimport jakarta.persistence.Id;\nimport lombok.AccessLevel;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\n\n/**\n * Domain object representing a company employee. Project Lombok keeps actual code at a minimum. {@code @Data} -\n * Generates getters, setters, toString, hash, and equals functions {@code @Entity} - JPA annotation to flag this class\n * for DB persistence {@code @NoArgsConstructor} - Create a constructor with no args to support JPA\n * {@code @AllArgsConstructor} - Create a constructor with all args to support testing\n * {@code @JsonIgnoreProperties(ignoreUnknow=true)} When converting JSON to Java, ignore any unrecognized attributes.\n * This is critical for REST because it encourages adding new fields in later versions that won't break. It also allows\n * things like _links to be ignore as well, meaning HAL documents can be fetched and later posted to the server without\n * adjustment.\n *\n * @author Greg Turnquist\n */\n@Data\n@Entity\n@NoArgsConstructor(access = AccessLevel.PRIVATE)\n@AllArgsConstructor\nclass Employee {\n\n\t@Id\n\t@GeneratedValue\n\tprivate Long id;\n\n\tprivate String firstName;\n\n\tprivate String lastName;\n\n\tprivate String role;\n\n\t/**\n\t * Useful constructor when id is not yet known.\n\t *\n\t * @param firstName\n\t * @param lastName\n\t * @param role\n\t */\n\tEmployee(String firstName, String lastName, String role) {\n\n\t\tthis.firstName = firstName;\n\t\tthis.lastName = lastName;\n\t\tthis.role = role;\n\t}\n}\n"
  },
  {
    "path": "demo-spring-hateoas/src/main/java/org/springdoc/demo/services/hateoas/EmployeeController.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\npackage org.springdoc.demo.services.hateoas;\n\nimport java.net.URI;\nimport java.net.URISyntaxException;\nimport java.util.List;\nimport java.util.stream.Collectors;\nimport java.util.stream.StreamSupport;\n\nimport org.springframework.hateoas.CollectionModel;\nimport org.springframework.hateoas.EntityModel;\nimport org.springframework.hateoas.IanaLinkRelations;\nimport org.springframework.hateoas.Link;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.MediaType;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.PutMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.ResponseStatus;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;\nimport static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;\n\n/**\n * Spring Web {@link RestController} used to generate a REST API.\n *\n * @author Greg Turnquist\n */\n@RestController\nclass EmployeeController {\n\n\tprivate final EmployeeRepository repository;\n\n\tEmployeeController(EmployeeRepository repository) {\n\t\tthis.repository = repository;\n\t}\n\n\t/**\n\t * Look up all employees, and transform them into a REST collection resource. Then return them through Spring Web's\n\t * {@link ResponseEntity} fluent API.\n\t */\n\t@GetMapping(path = \"/employees\", produces = MediaType.APPLICATION_JSON_VALUE)\n\tResponseEntity<CollectionModel<EntityModel<Employee>>> findAll() {\n\n\t\tList<EntityModel<Employee>> employees = StreamSupport.stream(repository.findAll().spliterator(), false)\n\t\t\t\t.map(employee -> EntityModel.of(employee, //\n\t\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel(), //\n\t\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findAll()).withRel(\"employees\"))) //\n\t\t\t\t.collect(Collectors.toList());\n\n\t\treturn ResponseEntity.ok( //\n\t\t\t\tCollectionModel.of(employees, //\n\t\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findAll()).withSelfRel()));\n\t}\n\n\t@PostMapping(path = \"/employees\", produces = MediaType.APPLICATION_JSON_VALUE)\n\t@ResponseStatus(HttpStatus.CREATED)\n\tResponseEntity<EntityModel<Employee>> newEmployee(@RequestBody Employee employee) {\n\n\t\ttry {\n\t\t\tEmployee savedEmployee = repository.save(employee);\n\n\t\t\tEntityModel<Employee> employeeResource = EntityModel.of(savedEmployee, //\n\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findOne(savedEmployee.getId())).withSelfRel());\n\n\t\t\treturn ResponseEntity //\n\t\t\t\t\t.created(new URI(employeeResource.getRequiredLink(IanaLinkRelations.SELF).getHref())) //\n\t\t\t\t\t.body(employeeResource);\n\t\t}\n\t\tcatch (URISyntaxException e) {\n\t\t\treturn ResponseEntity.badRequest().body(null);\n\t\t}\n\t}\n\n\t/**\n\t * Look up a single {@link Employee} and transform it into a REST resource. Then return it through Spring Web's\n\t * {@link ResponseEntity} fluent API.\n\t *\n\t * @param id\n\t */\n\t@GetMapping(path = \"/employees/{id}\", produces = MediaType.APPLICATION_JSON_VALUE)\n\tResponseEntity<EntityModel<Employee>> findOne(@PathVariable long id) {\n\n\t\treturn repository.findById(id) //\n\t\t\t\t.map(employee -> EntityModel.of(employee, //\n\t\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findOne(employee.getId())).withSelfRel(), //\n\t\t\t\t\t\tlinkTo(methodOn(EmployeeController.class).findAll()).withRel(\"employees\"))) //\n\t\t\t\t.map(ResponseEntity::ok) //\n\t\t\t\t.orElse(ResponseEntity.notFound().build());\n\t}\n\n\t/**\n\t * Update existing employee then return a Location header.\n\t *\n\t * @param employee\n\t * @param id\n\t * @return\n\t */\n\t@PutMapping(path = \"/employees/{id}\", produces = MediaType.APPLICATION_JSON_VALUE)\n\t@ResponseStatus(HttpStatus.NO_CONTENT)\n\tResponseEntity<Void> updateEmployee(@RequestBody Employee employee, @PathVariable long id) throws URISyntaxException {\n\n\t\tEmployee employeeToUpdate = employee;\n\t\temployeeToUpdate.setId(id);\n\t\trepository.save(employeeToUpdate);\n\n\t\tLink newlyCreatedLink = linkTo(methodOn(EmployeeController.class).findOne(id)).withSelfRel();\n\n\t\treturn ResponseEntity.noContent().location(new URI(newlyCreatedLink.getHref())).build();\n\n\t}\n\n}\n"
  },
  {
    "path": "demo-spring-hateoas/src/main/java/org/springdoc/demo/services/hateoas/EmployeeRepository.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\npackage org.springdoc.demo.services.hateoas;\n\nimport org.springframework.data.repository.CrudRepository;\n\n/**\n * A simple Spring Data {@link CrudRepository} for storing {@link Employee}s.\n *\n * @author Greg Turnquist\n */\ninterface EmployeeRepository extends CrudRepository<Employee, Long> {\n}\n"
  },
  {
    "path": "demo-spring-hateoas/src/main/java/org/springdoc/demo/services/hateoas/SpringdocApplication.java",
    "content": "/*\n *\n *  * Copyright 2019-2020 the original author or authors.\n *  *\n *  * Licensed under the Apache License, Version 2.0 (the \"License\");\n *  * you may not use this file except in compliance with the License.\n *  * You may obtain a copy of the License at\n *  *\n *  *      https://www.apache.org/licenses/LICENSE-2.0\n *  *\n *  * Unless required by applicable law or agreed to in writing, software\n *  * distributed under the License is distributed on an \"AS IS\" BASIS,\n *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  * See the License for the specific language governing permissions and\n *  * limitations under the License.\n *\n */\n\npackage org.springdoc.demo.services.hateoas;\n\nimport io.swagger.v3.oas.models.Components;\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.info.Info;\nimport io.swagger.v3.oas.models.info.License;\n\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.context.annotation.Bean;\n\n@SpringBootApplication\npublic class SpringdocApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(SpringdocApplication.class, args);\n\t}\n\n\t@Bean\n\tpublic OpenAPI customOpenAPI(@Value(\"${springdoc.version}\") String appVersion) {\n\t\treturn new OpenAPI()\n\t\t\t\t.components(new Components())\n\t\t\t\t.info(new Info().title(\"Employee API\").version(appVersion)\n\t\t\t\t\t\t.license(new License().name(\"Apache 2.0\").url(\"http://springdoc.org\")));\n\t}\n}\n"
  },
  {
    "path": "demo-spring-hateoas/src/main/resources/application.properties",
    "content": "server.port=8085\nspring.hateoas.use-hal-as-default-json-media-type=false\nspringdoc.swagger-ui.operationsSorter=method\nspringdoc.version=@springdoc.version@\nspringdoc.swagger-ui.use-root-path=true\nserver.forward-headers-strategy=framework\n"
  },
  {
    "path": "pom.xml",
    "content": "<project xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t xmlns=\"http://maven.apache.org/POM/4.0.0\"\n\t\t xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>org.springdoc</groupId>\n\t<artifactId>springdoc-openapi-demos</artifactId>\n\t<version>3.1.7-SNAPSHOT</version>\n\t<packaging>pom</packaging>\n\t<name>Spring-openapi demos</name>\n\t<description>Spring-openapi demos</description>\n\t<url>https://springdoc.org/</url>\n\n\t<parent>\n\t\t<groupId>org.springframework.boot</groupId>\n\t\t<artifactId>spring-boot-starter-parent</artifactId>\n\t\t<version>3.5.11</version>\n\t\t<relativePath/> <!-- lookup parent from repository -->\n\t</parent>\n\n\t<licenses>\n\t\t<license>\n\t\t\t<name>The Apache License, Version 2.0</name>\n\t\t\t<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>\n\t\t</license>\n\t</licenses>\n\n\t<developers>\n\t\t<developer>\n\t\t\t<name>Badr NASS</name>\n\t\t\t<email>support@springdoc.org</email>\n\t\t\t<organization>BADR</organization>\n\t\t\t<organizationUrl>https://springdoc.org/</organizationUrl>\n\t\t</developer>\n\t</developers>\n\n\t<scm>\n\t\t<url>git@github.com:springdoc/springdoc-openapi-demos.git</url>\n\t\t<connection>scm:git:git@github.com:springdoc/springdoc-openapi-demos.git\n\t\t</connection>\n\t\t<developerConnection>\n\t\t\tscm:git:git@github.com:springdoc/springdoc-openapi-demos.git\n\t\t</developerConnection>\n\t\t<tag>HEAD</tag>\n\t</scm>\n\n\t<repositories>\n\t\t<repository>\n\t\t\t<name>Central Portal Snapshots</name>\n\t\t\t<id>central-portal-snapshots</id>\n\t\t\t<url>https://central.sonatype.com/repository/maven-snapshots/</url>\n\t\t\t<releases>\n\t\t\t\t<enabled>false</enabled>\n\t\t\t</releases>\n\t\t\t<snapshots>\n\t\t\t\t<enabled>true</enabled>\n\t\t\t</snapshots>\n\t\t</repository>\n\t</repositories>\n\n\t<modules>\n\t\t<module>demo-book-service</module>\n\t\t<module>demo-microservices</module>\n\t\t<module>demo-spring-boot-3-webflux-functional</module>\n\t\t<module>demo-spring-boot-3-webflux</module>\n\t\t<module>demo-spring-boot-3-webmvc</module>\n\t\t<module>demo-oauth2</module>\n\t\t<module>demo-person-service</module>\n\t\t<module>demo-spring-hateoas</module>\n\t\t<module>demo-spring-data-rest</module>\n\t\t<module>demo-spring-cloud-function</module>\n\t\t<module>demo-spring-boot-webflux-scalar</module>\n\t\t<module>demo-spring-boot-webmvc-scalar</module>\n\t</modules>\n\n\t<properties>\n\t\t<java.version>17</java.version>\n\t\t<resource.delimiter>@</resource.delimiter>\n\t\t<maven.compiler.source>${java.version}</maven.compiler.source>\n\t\t<maven.compiler.target>${java.version}</maven.compiler.target>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n\t\t<springdoc.version>2.8.17-SNAPSHOT</springdoc.version>\n\t\t<maven-source-plugin.version>3.0.1</maven-source-plugin.version>\n\t\t<maven-javadoc-plugin.version>3.0.1</maven-javadoc-plugin.version>\n\t\t<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>\n\t\t<maven-release-plugin.version>2.5.3</maven-release-plugin.version>\n\t\t<jib-maven-plugin.version>3.4.6</jib-maven-plugin.version>\n\t\t<springdoc-openapi-maven-plugin.version>1.5\n\t\t</springdoc-openapi-maven-plugin.version>\n\t\t<jib.from.image>eclipse-temurin:17-jre-ubi9-minimal</jib.from.image>\n\t\t<spring-cloud.version>2025.0.0</spring-cloud.version>\n\t\t<spring-security-oauth2-authorization-server.version>1.4.3\n\t\t</spring-security-oauth2-authorization-server.version>\n\t\t<embed.mongo.version>4.18.1</embed.mongo.version>\n\t\t<embed.mongo.spring3x.version>4.18.0</embed.mongo.spring3x.version>\n\t</properties>\n\n\t<dependencyManagement>\n\t\t<dependencies>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework.security</groupId>\n\t\t\t\t<artifactId>spring-security-oauth2-authorization-server</artifactId>\n\t\t\t\t<version>${spring-security-oauth2-authorization-server.version}</version>\n\t\t\t</dependency>\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springframework.cloud</groupId>\n\t\t\t\t<artifactId>spring-cloud-dependencies</artifactId>\n\t\t\t\t<version>${spring-cloud.version}</version>\n\t\t\t\t<type>pom</type>\n\t\t\t\t<scope>import</scope>\n\t\t\t</dependency>\n\t\t\t<!-- OpenAPI 3 -->\n\t\t\t<dependency>\n\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t<artifactId>springdoc-openapi-bom</artifactId>\n\t\t\t\t<version>${springdoc.version}</version>\n\t\t\t\t<type>pom</type>\n\t\t\t\t<scope>import</scope>\n\t\t\t</dependency>\n\t\t</dependencies>\n\t</dependencyManagement>\n\t<dependencies>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t<artifactId>spring-boot-starter-test</artifactId>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\t</dependencies>\n\n\t<build>\n\t\t<resources>\n\t\t\t<resource>\n\t\t\t\t<directory>src/main/resources</directory>\n\t\t\t\t<filtering>true</filtering>\n\t\t\t</resource>\n\t\t</resources>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-failsafe-plugin</artifactId>\n\t\t\t\t<version>2.22.2</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<classesDirectory>${project.build.outputDirectory}\n\t\t\t\t\t</classesDirectory>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.graalvm.buildtools</groupId>\n\t\t\t\t<artifactId>native-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.springframework.boot</groupId>\n\t\t\t\t<artifactId>spring-boot-maven-plugin</artifactId>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n\n\t<profiles>\n\t\t<profile>\n\t\t\t<id>jib</id>\n\t\t\t<activation>\n\t\t\t\t<activeByDefault>true</activeByDefault>\n\t\t\t</activation>\n\t\t\t<build>\n\t\t\t\t<pluginManagement>\n\t\t\t\t\t<plugins>\n\t\t\t\t\t\t<plugin>\n\t\t\t\t\t\t\t<groupId>org.springdoc</groupId>\n\t\t\t\t\t\t\t<artifactId>springdoc-openapi-maven-plugin</artifactId>\n\t\t\t\t\t\t\t<version>${springdoc-openapi-maven-plugin.version}</version>\n\t\t\t\t\t\t</plugin>\n\t\t\t\t\t</plugins>\n\t\t\t\t</pluginManagement>\n\t\t\t\t<plugins>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<groupId>com.google.cloud.tools</groupId>\n\t\t\t\t\t\t<artifactId>jib-maven-plugin</artifactId>\n\t\t\t\t\t\t<version>${jib-maven-plugin.version}</version>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<from>\n\t\t\t\t\t\t\t\t<image>${jib.from.image}</image>\n\t\t\t\t\t\t\t\t<platforms>\n\t\t\t\t\t\t\t\t\t<platform>\n\t\t\t\t\t\t\t\t\t\t<architecture>amd64</architecture>\n\t\t\t\t\t\t\t\t\t\t<os>linux</os>\n\t\t\t\t\t\t\t\t\t</platform>\n\t\t\t\t\t\t\t\t\t<platform>\n\t\t\t\t\t\t\t\t\t\t<architecture>arm64</architecture>\n\t\t\t\t\t\t\t\t\t\t<os>linux</os>\n\t\t\t\t\t\t\t\t\t</platform>\n\t\t\t\t\t\t\t\t</platforms>\n\t\t\t\t\t\t\t</from>\n\t\t\t\t\t\t\t<to>\n\t\t\t\t\t\t\t\t<image>\n\t\t\t\t\t\t\t\t\tregistry.hub.docker.com/springdocdemos/${project.artifactId}:${project.version}\n\t\t\t\t\t\t\t\t</image>\n\t\t\t\t\t\t\t</to>\n\t\t\t\t\t\t\t<container>\n\t\t\t\t\t\t\t\t<jvmFlags>\n\t\t\t\t\t\t\t\t\t<jvmFlag>-XshowSettings:vm</jvmFlag>\n\t\t\t\t\t\t\t\t\t<jvmFlag>-Dspring.main.lazy-initialization=true\n\t\t\t\t\t\t\t\t\t</jvmFlag>\n\t\t\t\t\t\t\t\t\t<jvmFlag>-XX:TieredStopAtLevel=1</jvmFlag>\n\t\t\t\t\t\t\t\t\t<jvmFlag>-XX:+UseSerialGC</jvmFlag>\n\t\t\t\t\t\t\t\t</jvmFlags>\n\t\t\t\t\t\t\t</container>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</plugin>\n\t\t\t\t</plugins>\n\t\t\t</build>\n\t\t</profile>\n\t\t<profile>\n\t\t\t<id>gpg</id>\n\t\t\t<build>\n\t\t\t\t<plugins>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<artifactId>maven-source-plugin</artifactId>\n\t\t\t\t\t\t<version>${maven-source-plugin.version}</version>\n\t\t\t\t\t\t<executions>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>attach-sources</id>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>jar</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t</executions>\n\t\t\t\t\t</plugin>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<artifactId>maven-javadoc-plugin</artifactId>\n\t\t\t\t\t\t<version>${maven-javadoc-plugin.version}</version>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<doclint>all,-missing</doclint>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t\t<executions>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>attach-javadocs</id>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>jar</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t</executions>\n\t\t\t\t\t</plugin>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<artifactId>maven-gpg-plugin</artifactId>\n\t\t\t\t\t\t<version>${maven-gpg-plugin.version}</version>\n\t\t\t\t\t\t<executions>\n\t\t\t\t\t\t\t<execution>\n\t\t\t\t\t\t\t\t<id>sign-artifacts</id>\n\t\t\t\t\t\t\t\t<phase>verify</phase>\n\t\t\t\t\t\t\t\t<goals>\n\t\t\t\t\t\t\t\t\t<goal>sign</goal>\n\t\t\t\t\t\t\t\t</goals>\n\t\t\t\t\t\t\t</execution>\n\t\t\t\t\t\t</executions>\n\t\t\t\t\t</plugin>\n\t\t\t\t\t<plugin>\n\t\t\t\t\t\t<artifactId>maven-release-plugin</artifactId>\n\t\t\t\t\t\t<version>${maven-release-plugin.version}</version>\n\t\t\t\t\t\t<configuration>\n\t\t\t\t\t\t\t<tagNameFormat>v@{project.version}</tagNameFormat>\n\t\t\t\t\t\t\t<autoVersionSubmodules>true</autoVersionSubmodules>\n\t\t\t\t\t\t\t<useReleaseProfile>false</useReleaseProfile>\n\t\t\t\t\t\t\t<releaseProfiles>gpg</releaseProfiles>\n\t\t\t\t\t\t\t<goals>deploy</goals>\n\t\t\t\t\t\t</configuration>\n\t\t\t\t\t</plugin>\n\t\t\t\t</plugins>\n\t\t\t</build>\n\t\t</profile>\n\t</profiles>\n\n</project>\n"
  },
  {
    "path": "settings.xml",
    "content": "<settings xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\t\t  xmlns=\"http://maven.apache.org/SETTINGS/1.0.0\"\n\t\t  xsi:schemaLocation=\"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd\">\n\t<servers>\n\t\t<server>\n\t\t\t<id>ossrh</id>\n\t\t\t<username>${env.OSSRH_USER}</username>\n\t\t\t<password>${env.OSSRH_PASS}</password>\n\t\t</server>\n\t</servers>\n</settings>\n"
  }
]