From 3b762c092ffd9adf0e1f620419e244da543b9b04 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 30 Aug 2023 14:14:57 +0200 Subject: [PATCH] Migrate documentation to Antora. Closes #2304 --- .gitignore | 4 ++ README.adoc | 4 +- spring-data-rest-distribution/pom.xml | 26 +++++++++-- src/main/antora/antora-playbook.yml | 37 +++++++++++++++ src/main/antora/antora.yml | 12 +++++ src/main/antora/modules/ROOT/examples/mongodb | 1 + .../antora/modules/ROOT/examples/security | 1 + src/main/antora/modules/ROOT/examples/support | 1 + .../modules/ROOT/images/hal-explorer-1.png | Bin 0 -> 44463 bytes .../modules/ROOT/images/hal-explorer-2.png | Bin 0 -> 14234 bytes .../modules/ROOT/images/hal-explorer-3.png | Bin 0 -> 15377 bytes src/main/antora/modules/ROOT/nav.adoc | 30 ++++++++++++ .../modules/ROOT/pages}/customizing-sdr.adoc | 12 ++--- .../adding-sdr-to-spring-mvc-app.adoc | 0 .../pages/customizing}/configuring-cors.adoc | 0 .../configuring-the-rest-url-path.adoc | 0 .../custom-jackson-deserialization.adoc | 0 .../customizing}/customizing-json-output.adoc | 0 .../overriding-sdr-response-handlers.adoc | 0 .../pages}/etags-and-other-conditionals.adoc | 5 +- .../modules/ROOT/pages}/events.adoc | 0 src/main/antora/modules/ROOT/pages/index.adoc | 27 +++++++++++ .../modules/ROOT/pages}/integration.adoc | 1 - .../modules/ROOT/pages}/intro.adoc | 1 + .../example-api-usage-with-curl.adoc | 2 + .../pages/introduction}/getting-started.adoc | 8 ++-- .../spring-data-rest-examples.adoc | 3 +- .../ROOT/pages/introduction/upgrade.adoc | 8 ++++ .../modules/ROOT/pages}/metadata.adoc | 6 +-- .../ROOT/pages}/paging-and-sorting.adoc | 0 .../ROOT/pages}/projections-excerpts.adoc | 4 +- .../ROOT/pages}/repository-resources.adoc | 44 +++++++++++------- .../modules/ROOT/pages}/representations.adoc | 0 .../modules/ROOT/pages}/security.adoc | 7 ++- .../modules/ROOT/pages}/tools.adoc | 3 +- .../modules/ROOT/pages}/validation.adoc | 0 .../resources/antora-resources/antora.yml | 19 ++++++++ src/main/asciidoc/index.adoc | 40 ---------------- src/main/asciidoc/preface.adoc | 13 ------ 39 files changed, 215 insertions(+), 104 deletions(-) create mode 100644 src/main/antora/antora-playbook.yml create mode 100644 src/main/antora/antora.yml create mode 120000 src/main/antora/modules/ROOT/examples/mongodb create mode 120000 src/main/antora/modules/ROOT/examples/security create mode 120000 src/main/antora/modules/ROOT/examples/support create mode 100644 src/main/antora/modules/ROOT/images/hal-explorer-1.png create mode 100644 src/main/antora/modules/ROOT/images/hal-explorer-2.png create mode 100644 src/main/antora/modules/ROOT/images/hal-explorer-3.png create mode 100644 src/main/antora/modules/ROOT/nav.adoc rename src/main/{asciidoc => antora/modules/ROOT/pages}/customizing-sdr.adoc (90%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/adding-sdr-to-spring-mvc-app.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/configuring-cors.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/configuring-the-rest-url-path.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/custom-jackson-deserialization.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/customizing-json-output.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages/customizing}/overriding-sdr-response-handlers.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/etags-and-other-conditionals.adoc (94%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/events.adoc (100%) create mode 100644 src/main/antora/modules/ROOT/pages/index.adoc rename src/main/{asciidoc => antora/modules/ROOT/pages}/integration.adoc (98%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/intro.adoc (96%) rename src/main/{asciidoc => antora/modules/ROOT/pages/introduction}/example-api-usage-with-curl.adoc (88%) rename src/main/{asciidoc => antora/modules/ROOT/pages/introduction}/getting-started.adoc (94%) rename src/main/{asciidoc => antora/modules/ROOT/pages/introduction}/spring-data-rest-examples.adoc (93%) create mode 100644 src/main/antora/modules/ROOT/pages/introduction/upgrade.adoc rename src/main/{asciidoc => antora/modules/ROOT/pages}/metadata.adoc (94%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/paging-and-sorting.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/projections-excerpts.adoc (94%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/repository-resources.adoc (84%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/representations.adoc (100%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/security.adoc (85%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/tools.adoc (94%) rename src/main/{asciidoc => antora/modules/ROOT/pages}/validation.adoc (100%) create mode 100644 src/main/antora/resources/antora-resources/antora.yml delete mode 100644 src/main/asciidoc/index.adoc delete mode 100644 src/main/asciidoc/preface.adoc diff --git a/.gitignore b/.gitignore index a19f09889..0b191ce31 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ target/ vf.gf.* out/ _site +node_modules +package-lock.json +package.json +node diff --git a/README.adoc b/README.adoc index 1c7019a5a..0e8882120 100644 --- a/README.adoc +++ b/README.adoc @@ -2,7 +2,7 @@ The goal of the project is to provide a flexible and configurable mechanism for writing simple services that can be exposed over HTTP. -The first exporter implemented is a JPA Repository exporter. This takes your JPA repositories and front-ends them with HTTP, allowing you full CRUD capability over your entities, to include managing associations. +This takes your Spring Data repositories and front-ends them with HTTP, allowing you full CRUD capability over your entities, to include managing associations. == Features @@ -15,7 +15,7 @@ The first exporter implemented is a JPA Repository exporter. This takes your JPA * https://docs.spring.io/spring-data/rest/docs/current/reference/html/#metadata[Exposes metadata] about the model discovered as ALPS and JSON Schema. * Allows to define client specific representations through https://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections-excerpts[projections]. * Ships the latest release of https://docs.spring.io/spring-data/rest/docs/current/reference/html/#tools.hal-explorer[HAL Explorer] to easily explore HAL and HAL-FORMS based HTTP responses. -* Currently supports JPA, MongoDB, Neo4j, Solr, Cassandra, Gemfire. +* Supports JPA, MongoDB, Neo4j, Solr, Cassandra, Gemfire. * Allows https://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr[advanced customizations] of the default resources exposed. == Code of Conduct diff --git a/spring-data-rest-distribution/pom.xml b/spring-data-rest-distribution/pom.xml index 853ea428a..874e7b061 100644 --- a/spring-data-rest-distribution/pom.xml +++ b/spring-data-rest-distribution/pom.xml @@ -19,18 +19,38 @@ ${basedir}/.. - SDREST + ${project.basedir}/../src/main/antora/antora-playbook.yml + + + ${project.basedir}/../src/main/antora/resources/antora-resources + true + + org.apache.maven.plugins maven-assembly-plugin + - org.asciidoctor - asciidoctor-maven-plugin + org.apache.maven.plugins + maven-resources-plugin + + + + resources + + + + + + + + io.spring.maven.antora + antora-maven-plugin diff --git a/src/main/antora/antora-playbook.yml b/src/main/antora/antora-playbook.yml new file mode 100644 index 000000000..4fa8c6053 --- /dev/null +++ b/src/main/antora/antora-playbook.yml @@ -0,0 +1,37 @@ +# PACKAGES antora@3.2.0-alpha.2 @antora/atlas-extension:1.0.0-alpha.1 @antora/collector-extension@1.0.0-alpha.3 @springio/antora-extensions@1.1.0-alpha.2 @asciidoctor/tabs@1.0.0-alpha.12 @opendevise/antora-release-line-extension@1.0.0-alpha.2 +# +# The purpose of this Antora playbook is to build the docs in the current branch. +antora: + extensions: + - '@antora/collector-extension' + - require: '@springio/antora-extensions/root-component-extension' + root_component_name: 'data-rest' +site: + title: Spring Data REST + url: https://docs.spring.io/spring-data-rest/reference/ +content: + sources: + - url: ./../../.. + branches: HEAD + start_path: src/main/antora + worktrees: true +asciidoc: + attributes: + page-pagination: '' + hide-uri-scheme: '@' + tabs-sync-option: '@' + chomp: 'all' + extensions: + - '@asciidoctor/tabs' + - '@springio/asciidoctor-extensions' + sourcemap: true +urls: + latest_version_segment: '' +runtime: + log: + failure_level: warn + format: pretty +ui: + bundle: + url: https://github.com/spring-io/antora-ui-spring/releases/download/v0.3.5/ui-bundle.zip + snapshot: true diff --git a/src/main/antora/antora.yml b/src/main/antora/antora.yml new file mode 100644 index 000000000..c7f815e22 --- /dev/null +++ b/src/main/antora/antora.yml @@ -0,0 +1,12 @@ +name: data-rest +version: true +title: Spring Data REST +nav: + - modules/ROOT/nav.adoc +ext: + collector: + - run: + command: ./mvnw validate process-resources -pl :spring-data-rest-distribution -am -Pantora-process-resources + local: true + scan: + dir: spring-data-rest-distribution/target/classes/ diff --git a/src/main/antora/modules/ROOT/examples/mongodb b/src/main/antora/modules/ROOT/examples/mongodb new file mode 120000 index 000000000..d9e836422 --- /dev/null +++ b/src/main/antora/modules/ROOT/examples/mongodb @@ -0,0 +1 @@ +../../../../../../spring-data-rest-tests/spring-data-rest-tests-mongodb/src/main/java/org/springframework/data/rest/tests/mongodb \ No newline at end of file diff --git a/src/main/antora/modules/ROOT/examples/security b/src/main/antora/modules/ROOT/examples/security new file mode 120000 index 000000000..a7aec3209 --- /dev/null +++ b/src/main/antora/modules/ROOT/examples/security @@ -0,0 +1 @@ +../../../../../../spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security \ No newline at end of file diff --git a/src/main/antora/modules/ROOT/examples/support b/src/main/antora/modules/ROOT/examples/support new file mode 120000 index 000000000..41699764a --- /dev/null +++ b/src/main/antora/modules/ROOT/examples/support @@ -0,0 +1 @@ +../../../../../../spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support \ No newline at end of file diff --git a/src/main/antora/modules/ROOT/images/hal-explorer-1.png b/src/main/antora/modules/ROOT/images/hal-explorer-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd634d543d334b316a892193d174c4e7b364af3 GIT binary patch literal 44463 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 literal 0 HcmV?d00001 diff --git a/src/main/antora/modules/ROOT/images/hal-explorer-2.png b/src/main/antora/modules/ROOT/images/hal-explorer-2.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3fcf756f2854a9cab926060903fb6b4139f3e0 GIT binary patch literal 14234 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 literal 0 HcmV?d00001 diff --git a/src/main/antora/modules/ROOT/nav.adoc b/src/main/antora/modules/ROOT/nav.adoc new file mode 100644 index 000000000..8d89de62c --- /dev/null +++ b/src/main/antora/modules/ROOT/nav.adoc @@ -0,0 +1,30 @@ +* xref:index.adoc[] + +* xref:intro.adoc[] +** xref:introduction/upgrade.adoc[] +** xref:introduction/getting-started.adoc[] +** xref:introduction/example-api-usage-with-curl.adoc[] +** xref:introduction/spring-data-rest-examples.adoc[] + +* xref:repository-resources.adoc[] +** xref:paging-and-sorting.adoc[] +** xref:projections-excerpts.adoc[] + +* xref:representations.adoc[Representations] +* xref:etags-and-other-conditionals.adoc[Conditional Operations] +* xref:validation.adoc[] +* xref:events.adoc[] +* xref:integration.adoc[] +* xref:metadata.adoc[] +* xref:security.adoc[] +* xref:tools.adoc[] + +* xref:customizing-sdr.adoc[] +** xref:customizing/configuring-the-rest-url-path.adoc[] +** xref:customizing/adding-sdr-to-spring-mvc-app.adoc[] +** xref:customizing/overriding-sdr-response-handlers.adoc[] +** xref:customizing/customizing-json-output.adoc[] +** xref:customizing/custom-jackson-deserialization.adoc[] +** xref:customizing/configuring-cors.adoc[] + +* https://github.com/spring-projects/spring-data-commons/wiki[Wiki] diff --git a/src/main/asciidoc/customizing-sdr.adoc b/src/main/antora/modules/ROOT/pages/customizing-sdr.adoc similarity index 90% rename from src/main/asciidoc/customizing-sdr.adoc rename to src/main/antora/modules/ROOT/pages/customizing-sdr.adoc index afa372b3e..810710ef7 100644 --- a/src/main/asciidoc/customizing-sdr.adoc +++ b/src/main/antora/modules/ROOT/pages/customizing-sdr.adoc @@ -68,7 +68,7 @@ Notice how `getResourceIdentifier(…)` returns the username to be used by the U [[customizing-sdr.repository-exposure]] == Customizing repository exposure -By default, all public Spring Data repositories are used to expose HTTP resources as described in <>. +By default, all public Spring Data repositories are used to expose HTTP resources as described in xref:repository-resources.adoc[Repository resources]. Package protected repository interfaces are excluded from this list, as you express its functionality is only visible to the package internally. This can be customized by explicitly setting a `RepositoryDetectionStrategy` (usually through the enum `RepositoryDetectionStrategies`) on `RepositoryRestConfiguration`. The following values can be configured: @@ -86,12 +86,12 @@ If you need custom rules to apply, simply implement `RepositoryDetectionStrategy [[customizing-sdr.http-methods.default-exposure]] === Customizing default exposure -By default, Spring Data REST exposes HTTP resources and methods as described in <> based on which CRUD methods the repository exposes. +By default, Spring Data REST exposes HTTP resources and methods as described in xref:repository-resources.adoc[Repository resources] based on which CRUD methods the repository exposes. The repositories don't need to extend `CrudRepository` but can also selectively declare methods described in aforementioned section and the resource exposure will follow. E.g. if a repository does not expose a `delete(…)` method, an HTTP `DELETE` will not be supported for item resources. If you need to declare a method for internal use but don't want it to trigger the HTTP method exposure, the repository method can be annotated with `@RestResource(exported = false)`. -Which methods to annotate like that to remove support for which HTTP method is described in <>. +Which methods to annotate like that to remove support for which HTTP method is described in xref:repository-resources.adoc[Repository resources]. Sometimes managing the exposure on the method level is not fine-grained enough. E.g. the `save(…)` method is used to back `POST` on collection resources, as well as `PUT` and `PATCH` on item resources. @@ -110,9 +110,3 @@ config.withItemExposure((metadata, httpMethods) -> httpMethods.disable(HttpMetho <2> Disables the support for HTTP `PATCH` on all item resources. -include::configuring-the-rest-url-path.adoc[leveloffset=+1] -include::adding-sdr-to-spring-mvc-app.adoc[leveloffset=+1] -include::overriding-sdr-response-handlers.adoc[leveloffset=+1] -include::customizing-json-output.adoc[leveloffset=+1] -include::custom-jackson-deserialization.adoc[leveloffset=+1] -include::configuring-cors.adoc[leveloffset=+1] diff --git a/src/main/asciidoc/adding-sdr-to-spring-mvc-app.adoc b/src/main/antora/modules/ROOT/pages/customizing/adding-sdr-to-spring-mvc-app.adoc similarity index 100% rename from src/main/asciidoc/adding-sdr-to-spring-mvc-app.adoc rename to src/main/antora/modules/ROOT/pages/customizing/adding-sdr-to-spring-mvc-app.adoc diff --git a/src/main/asciidoc/configuring-cors.adoc b/src/main/antora/modules/ROOT/pages/customizing/configuring-cors.adoc similarity index 100% rename from src/main/asciidoc/configuring-cors.adoc rename to src/main/antora/modules/ROOT/pages/customizing/configuring-cors.adoc diff --git a/src/main/asciidoc/configuring-the-rest-url-path.adoc b/src/main/antora/modules/ROOT/pages/customizing/configuring-the-rest-url-path.adoc similarity index 100% rename from src/main/asciidoc/configuring-the-rest-url-path.adoc rename to src/main/antora/modules/ROOT/pages/customizing/configuring-the-rest-url-path.adoc diff --git a/src/main/asciidoc/custom-jackson-deserialization.adoc b/src/main/antora/modules/ROOT/pages/customizing/custom-jackson-deserialization.adoc similarity index 100% rename from src/main/asciidoc/custom-jackson-deserialization.adoc rename to src/main/antora/modules/ROOT/pages/customizing/custom-jackson-deserialization.adoc diff --git a/src/main/asciidoc/customizing-json-output.adoc b/src/main/antora/modules/ROOT/pages/customizing/customizing-json-output.adoc similarity index 100% rename from src/main/asciidoc/customizing-json-output.adoc rename to src/main/antora/modules/ROOT/pages/customizing/customizing-json-output.adoc diff --git a/src/main/asciidoc/overriding-sdr-response-handlers.adoc b/src/main/antora/modules/ROOT/pages/customizing/overriding-sdr-response-handlers.adoc similarity index 100% rename from src/main/asciidoc/overriding-sdr-response-handlers.adoc rename to src/main/antora/modules/ROOT/pages/customizing/overriding-sdr-response-handlers.adoc diff --git a/src/main/asciidoc/etags-and-other-conditionals.adoc b/src/main/antora/modules/ROOT/pages/etags-and-other-conditionals.adoc similarity index 94% rename from src/main/asciidoc/etags-and-other-conditionals.adoc rename to src/main/antora/modules/ROOT/pages/etags-and-other-conditionals.adoc index 8d66b8436..9f92076d4 100644 --- a/src/main/asciidoc/etags-and-other-conditionals.adoc +++ b/src/main/antora/modules/ROOT/pages/etags-and-other-conditionals.adoc @@ -1,6 +1,5 @@ [[conditional]] = Conditional Operations with Headers -:spring-data-rest-root: ../../.. This section shows how Spring Data REST uses standard HTTP headers to enhance performance, conditionalize operations, and contribute to a more sophisticated frontend. @@ -15,7 +14,7 @@ Consider the following example: ==== [source,java,indent=0] ---- -include::{spring-data-rest-root}/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/support/ETagUnitTests.java[tag=versioned-sample] +include::example$support/ETagUnitTests.java[tag=versioned-sample] ---- <1> The `@Version` annotation (the JPA one in case you're using Spring Data JPA, the Spring Data `org.springframework.data.annotation.Version` one for all other modules) flags this field as a version marker. @@ -56,7 +55,7 @@ The https://tools.ietf.org/html/rfc7232#section-3.3[`If-Modified-Since` header] ==== [source,java] ---- -include::{spring-data-rest-root}/spring-data-rest-tests/spring-data-rest-tests-mongodb/src/main/java/org/springframework/data/rest/tests/mongodb/Receipt.java[tag=code] +include::example$mongodb/Receipt.java[tag=code] ---- <1> Spring Data Commons's `@LastModifiedDate` annotation allows capturing this information in multiple formats (JodaTime's `DateTime`, legacy Java `Date` and `Calendar`, JDK8 date/time types, and `long`/`Long`). diff --git a/src/main/asciidoc/events.adoc b/src/main/antora/modules/ROOT/pages/events.adoc similarity index 100% rename from src/main/asciidoc/events.adoc rename to src/main/antora/modules/ROOT/pages/events.adoc diff --git a/src/main/antora/modules/ROOT/pages/index.adoc b/src/main/antora/modules/ROOT/pages/index.adoc new file mode 100644 index 000000000..7f6200b7d --- /dev/null +++ b/src/main/antora/modules/ROOT/pages/index.adoc @@ -0,0 +1,27 @@ +[[spring-data-rest-reference-documentation]] += Spring Data REST +:feature-scroll: true + +_Spring Data REST exports Spring Data repositories as REST resources through WebMVC. +It eases development of applications with a consistent programming model backed by Spring Data modules sources._ + +[horizontal] +xref:intro.adoc[Introduction] :: Introduction to Spring Data REST and Examples +xref:repository-resources.adoc[Repository Resources] :: Exporting Repositories as REST Resources +xref:representations.adoc[Representations] :: Domain Object Representations (Object Mapping) +xref:etags-and-other-conditionals.adoc[Conditionals] :: Conditional Operations with ETag and other Headers +xref:validation.adoc[Validation] :: Validator Integration +xref:events.adoc[Events] :: Listening to REST Events +xref:integration.adoc[Integration] :: Integration with Spring Data REST components +xref:metadata.adoc[Metadata] :: ALPS and JSON Schema +xref:security.adoc[Security] :: Spring Security Integration +xref:tools.adoc[Tools] :: HAL Explorer +xref:customizing-sdr.adoc[Customizing] :: Tutorials and Recipes to customize Spring Data REST +https://github.com/spring-projects/spring-data-commons/wiki[Wiki] :: What's New, +Upgrade Notes, Supported Versions, additional cross-version information. + +Jon Brisbin, Oliver Drotbohm, Greg Turnquist, Jay Bryant + +(C) 2008-2023 VMware, Inc. + +Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. diff --git a/src/main/asciidoc/integration.adoc b/src/main/antora/modules/ROOT/pages/integration.adoc similarity index 98% rename from src/main/asciidoc/integration.adoc rename to src/main/antora/modules/ROOT/pages/integration.adoc index a9f63557a..ac04cb33c 100644 --- a/src/main/asciidoc/integration.adoc +++ b/src/main/antora/modules/ROOT/pages/integration.adoc @@ -1,6 +1,5 @@ [[integration]] = Integration -:spring-data-rest-root: ../../../.. This section details various ways to integrate with Spring Data REST components, whether from a Spring application that is using Spring Data REST or from other means. diff --git a/src/main/asciidoc/intro.adoc b/src/main/antora/modules/ROOT/pages/intro.adoc similarity index 96% rename from src/main/asciidoc/intro.adoc rename to src/main/antora/modules/ROOT/pages/intro.adoc index b41cee7f5..8e5c61f4f 100644 --- a/src/main/asciidoc/intro.adoc +++ b/src/main/antora/modules/ROOT/pages/intro.adoc @@ -1,5 +1,6 @@ [[intro-chapter]] = Introduction +:page-section-summary-toc: 1 REST web services have become the number one means for application integration on the web. In its core, REST defines that a system that consists of resources with which clients interact. These resources are implemented in a hypermedia-driven way. link:{springDocsUrl}/web.html#spring-web[Spring MVC] and link:{springDocsUrl}/web-reactive.html#spring-webflux[Spring WebFlux] each offer a solid foundation to build theses kinds of services. However, implementing even the simplest tenet of REST web services for a multi-domain object system can be quite tedious and result in a lot of boilerplate code. diff --git a/src/main/asciidoc/example-api-usage-with-curl.adoc b/src/main/antora/modules/ROOT/pages/introduction/example-api-usage-with-curl.adoc similarity index 88% rename from src/main/asciidoc/example-api-usage-with-curl.adoc rename to src/main/antora/modules/ROOT/pages/introduction/example-api-usage-with-curl.adoc index 74585f57f..69f02aa2b 100644 --- a/src/main/asciidoc/example-api-usage-with-curl.adoc +++ b/src/main/antora/modules/ROOT/pages/introduction/example-api-usage-with-curl.adoc @@ -1,6 +1,8 @@ [[example-api-usage-with-curl]] [appendix] +[[using-curl-to-talk-to-spring-data-rest]] = Using cURL to talk to Spring Data REST +:page-section-summary-toc: 1 This appendix contains a list of guides that demonstrate interacting with a Spring Data REST service over cURL: diff --git a/src/main/asciidoc/getting-started.adoc b/src/main/antora/modules/ROOT/pages/introduction/getting-started.adoc similarity index 94% rename from src/main/asciidoc/getting-started.adoc rename to src/main/antora/modules/ROOT/pages/introduction/getting-started.adoc index 07d9b827c..2875cca41 100644 --- a/src/main/asciidoc/getting-started.adoc +++ b/src/main/antora/modules/ROOT/pages/introduction/getting-started.adoc @@ -89,9 +89,9 @@ Make sure you also configure Spring Data repositories for the store you use. For This section covers the basic settings that you can manipulate when you configure a Spring Data REST application, including: -* <> -* <> -* <> +* xref:introduction/getting-started.adoc#getting-started.setting-repository-detection-strategy[Setting the Repository Detection Strategy] +* xref:introduction/getting-started.adoc#getting-started.changing-base-uri[Changing the Base URI] +* xref:introduction/getting-started.adoc#getting-started.changing-other-properties[Changing Other Spring Data REST Properties] [[getting-started.setting-repository-detection-strategy]] === Setting the Repository Detection Strategy @@ -209,4 +209,4 @@ You can run your application as either a Spring Boot app (with the links shown e NOTE: In general, Spring Data REST does not add functionality to a given data store. This means that, by definition, it should work with any Spring Data project that supports the repository programming model. The data stores listed above are the ones for which we have written integration tests to verify that Spring Data REST works with them. -From this point, you can <> with various options. +From this point, you can xref:customizing-sdr.adoc[customize Spring Data REST] with various options. diff --git a/src/main/asciidoc/spring-data-rest-examples.adoc b/src/main/antora/modules/ROOT/pages/introduction/spring-data-rest-examples.adoc similarity index 93% rename from src/main/asciidoc/spring-data-rest-examples.adoc rename to src/main/antora/modules/ROOT/pages/introduction/spring-data-rest-examples.adoc index 81c441a09..ed500792f 100644 --- a/src/main/asciidoc/spring-data-rest-examples.adoc +++ b/src/main/antora/modules/ROOT/pages/introduction/spring-data-rest-examples.adoc @@ -1,5 +1,6 @@ [[spring-data-examples]] [appendix] +[[spring-data-rest-example-projects]] = Spring Data REST example projects This appendix contains a list of Spring Data REST sample applications. The exact version of each example is not guaranteed to match the version of this reference manual. @@ -14,7 +15,7 @@ https://github.com/spring-projects/spring-data-examples/tree/master/rest/multi-s [[spring-data-examples.projections]] == Projections -https://github.com/spring-projects/spring-data-examples/tree/master/rest/projections[This example] contains more detailed code you can use to explore <>. +https://github.com/spring-projects/spring-data-examples/tree/master/rest/projections[This example] contains more detailed code you can use to explore xref:projections-excerpts.adoc[projections]. [[spring-data-examples.spring-security]] == Spring Data REST with Spring Security diff --git a/src/main/antora/modules/ROOT/pages/introduction/upgrade.adoc b/src/main/antora/modules/ROOT/pages/introduction/upgrade.adoc new file mode 100644 index 000000000..c9f659a7c --- /dev/null +++ b/src/main/antora/modules/ROOT/pages/introduction/upgrade.adoc @@ -0,0 +1,8 @@ +[[new-features]] +[[upgrading]] += Upgrading Spring Data + +Instructions for how to upgrade from earlier versions of Spring Data are provided on the project https://github.com/spring-projects/spring-data-commons/wiki[wiki]. +Follow the links in the https://github.com/spring-projects/spring-data-commons/wiki#release-notes[release notes section] to find the version that you want to upgrade to. + +Upgrading instructions are always the first item in the release notes. If you are more than one release behind, please make sure that you also review the release notes of the versions that you jumped. diff --git a/src/main/asciidoc/metadata.adoc b/src/main/antora/modules/ROOT/pages/metadata.adoc similarity index 94% rename from src/main/asciidoc/metadata.adoc rename to src/main/antora/modules/ROOT/pages/metadata.adoc index 75c702c6d..111a0c696 100644 --- a/src/main/asciidoc/metadata.adoc +++ b/src/main/antora/modules/ROOT/pages/metadata.adoc @@ -178,7 +178,7 @@ shown in the preceding table. === ALPS with Projections If you define any projections, they are also listed in the ALPS metadata. Assuming we also defined `inlineAddress` and `noAddresses`, they -would appear inside the relevant operations. (See "`<>`" for the definitions and discussion of these two projections.) That is *GET* would appear in the operations for the whole collection, and *GET* would appear in the operations for a single resource. The following example shows +would appear inside the relevant operations. (See "`xref:projections-excerpts.adoc#projections-excerpts.projections[Projections]`" for the definitions and discussion of these two projections.) That is *GET* would appear in the operations for the whole collection, and *GET* would appear in the operations for a single resource. The following example shows the alternate version of the `get-persons` subsection: ==== @@ -319,7 +319,7 @@ https://json-schema.org/[JSON Schema] is another form of metadata supported by S * Clear, human- and machine-readable documentation * Complete structural validation, useful for automated testing and validating client-submitted data -As shown in the <>, you can reach this data by navigating from the root URI to the `profile` link. +As shown in the xref:metadata.adoc#metadata.alps[previous section], you can reach this data by navigating from the root URI to the `profile` link. ==== [source,javascript] @@ -417,7 +417,7 @@ You can also find a `profile` link in the collection of `_links` when you examin <2> It has a *profile* link to the same URI for metadata. ==== -Again, the `profile` link serves <> by default. If you supply it with an https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1[`Accept` header] of `application/schema+json`, it renders the JSON Schema representation. +Again, the `profile` link serves xref:metadata.adoc#metadata.alps[ALPS] by default. If you supply it with an https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1[`Accept` header] of `application/schema+json`, it renders the JSON Schema representation. //= JSON Patch diff --git a/src/main/asciidoc/paging-and-sorting.adoc b/src/main/antora/modules/ROOT/pages/paging-and-sorting.adoc similarity index 100% rename from src/main/asciidoc/paging-and-sorting.adoc rename to src/main/antora/modules/ROOT/pages/paging-and-sorting.adoc diff --git a/src/main/asciidoc/projections-excerpts.adoc b/src/main/antora/modules/ROOT/pages/projections-excerpts.adoc similarity index 94% rename from src/main/asciidoc/projections-excerpts.adoc rename to src/main/antora/modules/ROOT/pages/projections-excerpts.adoc index 64ee102ef..b687416d9 100644 --- a/src/main/asciidoc/projections-excerpts.adoc +++ b/src/main/antora/modules/ROOT/pages/projections-excerpts.adoc @@ -142,7 +142,7 @@ NOTE: The value supplied to the `projection` query parameter is the same as that You can have multiple projections. -NOTE: See <> to see an example project. We encourage you to experiment with it. +NOTE: See xref:introduction/spring-data-rest-examples.adoc#spring-data-examples.projections[Projections] to see an example project. We encourage you to experiment with it. Spring Data REST finds projection definitions as follows: @@ -154,7 +154,7 @@ In either case, the projection interface must have the `@Projection` annotation. [[projections-excerpts.finding-projections]] === Finding Existing Projections -Spring Data REST exposes <> documents, a micro metadata format. To view the ALPS metadata, follow the `profile` link exposed by the root resource. If you navigate down to the ALPS document for `Person` resources (which would be `/alps/persons`), you can find many details about `Person` resources. Projections are listed, along with the details about the `GET` REST transition, in blocks similar to the following example: +Spring Data REST exposes xref:metadata.adoc#metadata.alps[Application-Level Profile Semantics (ALPS)] documents, a micro metadata format. To view the ALPS metadata, follow the `profile` link exposed by the root resource. If you navigate down to the ALPS document for `Person` resources (which would be `/alps/persons`), you can find many details about `Person` resources. Projections are listed, along with the details about the `GET` REST transition, in blocks similar to the following example: ==== [source,javascript] diff --git a/src/main/asciidoc/repository-resources.adoc b/src/main/antora/modules/ROOT/pages/repository-resources.adoc similarity index 84% rename from src/main/asciidoc/repository-resources.adoc rename to src/main/antora/modules/ROOT/pages/repository-resources.adoc index f11663e87..142744330 100644 --- a/src/main/asciidoc/repository-resources.adoc +++ b/src/main/antora/modules/ROOT/pages/repository-resources.adoc @@ -13,9 +13,9 @@ public interface OrderRepository extends CrudRepository { } ---- ==== -For this repository, Spring Data REST exposes a collection resource at `/orders`. The path is derived from the uncapitalized, pluralized, simple class name of the domain class being managed. It also exposes an item resource for each of the items managed by the repository under the URI template `/orders/{id}`. +For this repository, Spring Data REST exposes a collection resource at `/orders`. The path is derived from the uncapitalized, pluralized, simple class name of the domain class being managed. It also exposes an item resource for each of the items managed by the repository under the URI template `/orders/\{id}`. -By default the HTTP methods to interact with these resources map to the according methods of `CrudRepository`. Read more on that in the sections on <> and <>. +By default, the HTTP methods to interact with these resources map to the according methods of `CrudRepository`. Read more on that in the sections on xref:repository-resources.adoc#repository-resources.collection-resource[collection resources] and xref:repository-resources.adoc#repository-resources.item-resource[item resources]. [[repository-resources.methods]] === Repository methods exposure @@ -26,7 +26,7 @@ If you extend `CrudRepository` you usually expose all methods required to expose Each of the resources listed below will define which of the methods need to be present so that a particular HTTP method can be exposed for each of the resources. That means, that repositories that are not exposing those methods -- either by not declaring them at all or explicitly using `@RestResource(exported = false)` -- won't expose those HTTP methods on those resources. -For details on how to tweak the default method exposure or dedicated HTTP methods individually see <>. +For details on how to tweak the default method exposure or dedicated HTTP methods individually see xref:customizing-sdr.adoc#customizing-sdr.http-methods[Customizing supported HTTP methods]. [[repository-resources.default-status-codes]] === Default Status Codes @@ -39,7 +39,7 @@ For the resources exposed, we use a set of default status codes: If the configuration value is set to include responses for `PUT`, `200 OK` is returned for updates, and `201 Created` is returned for resource created through `PUT`. If the configuration values (`RepositoryRestConfiguration.returnBodyOnUpdate(…)` and `RepositoryRestConfiguration.returnBodyCreate(…)`) are explicitly set to `null` -- which they are by default --, the presence of the HTTP Accept header is used to determine the response code. -Read more on this in the detailed description of <> and <>. +Read more on this in the detailed description of xref:repository-resources.adoc#repository-resources.collection-resource.supported-methods.post[collection] and xref:repository-resources.adoc#repository-resources.item-resource.supported-methods.put[item resources]. [[repository-resources.resource-discoverability]] === Resource Discoverability @@ -72,7 +72,7 @@ curl -v http://localhost:8080/ The property of the result document is an object that consists of keys representing the relation type, with nested link objects as specified in HAL. -NOTE: For more details about the `profile` link, see <>. +NOTE: For more details about the `profile` link, see xref:metadata.adoc#metadata.alps[Application-Level Profile Semantics (ALPS)]. [[repository-resources.collection-resource]] == The Collection Resource @@ -90,6 +90,7 @@ Collections resources support both `GET` and `POST`. All other HTTP methods caus Returns all entities the repository servers through its `findAll(…)` method. If the repository is a paging repository we include the pagination links if necessary and additional page metadata. + ===== Methods used for invocation The following methods are used if present (descending order): @@ -98,8 +99,9 @@ The following methods are used if present (descending order): - `findAll(Sort)` - `findAll()` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. +[[parameters]] ===== Parameters If the repository has pagination capabilities, the resource takes the following parameters: @@ -114,6 +116,7 @@ The `GET` method has only one custom status code: * `405 Method Not Allowed`: If the `findAll(…)` methods were not exported (through `@RestResource(exported = false)`) or are not present in the repository. +[[supported-media-types]] ===== Supported Media Types The `GET` method supports the following media types: @@ -121,11 +124,12 @@ The `GET` method supports the following media types: * `application/hal+json` * `application/json` +[[related-resources]] ===== Related Resources The `GET` method supports a single link for discovering related resources: -* `search`: A <> is exposed if the backing repository exposes query methods. +* `search`: A xref:repository-resources.adoc#repository-resources.search-resource[search resource] is exposed if the backing repository exposes query methods. [[repository-resources.collection-resource.supported-methods.head]] ==== `HEAD` @@ -140,7 +144,7 @@ The following methods are used if present (descending order): - `findAll(Sort)` - `findAll()` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. [[repository-resources.collection-resource.supported-methods.post]] ==== `POST` @@ -157,7 +161,7 @@ The following methods are used if present (descending order): - `save(…)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. ===== Custom Status Codes @@ -180,20 +184,21 @@ Spring Data REST exposes a resource for individual collection items as sub-resou [[repository-resources.item-resource.supported-methods]] === Supported HTTP Methods -Item resources generally support `GET`, `PUT`, `PATCH`, and `DELETE`, unless explicit configuration prevents that (see "`<>`" for details). +Item resources generally support `GET`, `PUT`, `PATCH`, and `DELETE`, unless explicit configuration prevents that (see "`xref:repository-resources.adoc#repository-resources.association-resource[The Association Resource]`" for details). [[repository-resources.item-resource.supported-methods.get]] ==== GET The `GET` method returns a single entity. + ===== Methods used for invocation The following methods are used if present (descending order): - `findById(…)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. ===== Custom Status Codes @@ -210,20 +215,21 @@ The `GET` method supports the following media types: ===== Related Resources -For every association of the domain type, we expose links named after the association property. You can customize this behavior by using `@RestResource` on the property. The related resources are of the <> type. +For every association of the domain type, we expose links named after the association property. You can customize this behavior by using `@RestResource` on the property. The related resources are of the xref:repository-resources.adoc#repository-resources.association-resource[association resource] type. [[repository-resources.item-resource.supported-methods.head]] ==== `HEAD` The `HEAD` method returns whether the item resource is available. It has no status codes, media types, or related resources. + ===== Methods used for invocation The following methods are used if present (descending order): - `findById(…)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. [[repository-resources.item-resource.supported-methods.put]] ==== `PUT` @@ -234,13 +240,14 @@ If the request header is present, a response body and a status code of `200 OK` If no header is present, the response body is empty and a successful request returns a status of `204 No Content`. This behavior can be overridden by configuring `RepositoryRestConfiguration.setReturnBodyOnUpdate(…)` accordingly. + ===== Methods used for invocation The following methods are used if present (descending order): - `save(…)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. ===== Custom Status Codes @@ -260,13 +267,14 @@ The `PUT` method supports the following media types: The `PATCH` method is similar to the `PUT` method but partially updates the resources state. + ===== Methods used for invocation The following methods are used if present (descending order): - `save(…)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. ===== Custom Status Codes @@ -292,6 +300,7 @@ If the request header is present, a response body and a status code of `200 OK` If no header is present, the response body is empty and a successful request returns a status of `204 No Content`. This behavior can be overridden by configuring `RepositoryRestConfiguration.setReturnBodyOnDelete(…)` accordingly. + ===== Methods used for invocation The following methods are used if present (descending order): @@ -300,7 +309,7 @@ The following methods are used if present (descending order): - `delete(ID)` - `delete(Iterable)` -For more information on the default exposure of methods, see <>. +For more information on the default exposure of methods, see xref:repository-resources.adoc#repository-resources.methods[Repository methods exposure]. ===== Custom Status Codes @@ -368,6 +377,7 @@ The `POST` method supports only one media type: The `DELETE` method unbinds the association. +[[custom-status-codes]] ===== Custom Status Codes The `POST` method has only one custom status code: @@ -398,7 +408,7 @@ The `GET` method supports the following media types: ===== Related Resources -For every query method declared in the repository, we expose a <>. If the resource supports pagination, the URI pointing to it is a URI template containing the pagination parameters. +For every query method declared in the repository, we expose a xref:repository-resources.adoc#repository-resources.query-method-resource[query method resource]. If the resource supports pagination, the URI pointing to it is a URI template containing the pagination parameters. [[repository-resources.search-resource.supported-methods.head]] ==== `HEAD` diff --git a/src/main/asciidoc/representations.adoc b/src/main/antora/modules/ROOT/pages/representations.adoc similarity index 100% rename from src/main/asciidoc/representations.adoc rename to src/main/antora/modules/ROOT/pages/representations.adoc diff --git a/src/main/asciidoc/security.adoc b/src/main/antora/modules/ROOT/pages/security.adoc similarity index 85% rename from src/main/asciidoc/security.adoc rename to src/main/antora/modules/ROOT/pages/security.adoc index ef9c3852f..21b052e82 100644 --- a/src/main/asciidoc/security.adoc +++ b/src/main/antora/modules/ROOT/pages/security.adoc @@ -1,6 +1,5 @@ [[security]] = Security -:spring-data-rest-root: ../../.. :spring-security-docs: https://docs.spring.io/spring-security/reference Spring Data REST works quite well with Spring Security. This section shows examples of how to secure your Spring Data REST services with method-level security. @@ -15,7 +14,7 @@ The following example from Spring Data REST's test suite shows Spring Security's [source,java] ---- -include::{spring-data-rest-root}/spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/PreAuthorizedOrderRepository.java[tag=code] +include::example$security/PreAuthorizedOrderRepository.java[tag=code] ---- <1> This Spring Security annotation secures the entire repository. The {spring-security-docs}/servlet/authorization/expression-based.html[Spring Security SpEL expression] indicates that the principal must have `ROLE_USER` in its collection of roles. @@ -38,7 +37,7 @@ The following example shows Spring Security's older `@Secured` annotation, which ==== [source,java] ---- -include::{spring-data-rest-root}/spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecuredPersonRepository.java[tag=code] +include::example$security/SecuredPersonRepository.java[tag=code] ---- <1> This results in the same security check as the previous example but has less flexibility. It allows only roles as the means to restrict access. @@ -56,7 +55,7 @@ To configure method-level security, here is a brief snippet from Spring Data RES ==== [source,java] ---- -include::{spring-data-rest-root}/spring-data-rest-tests/spring-data-rest-tests-security/src/test/java/org/springframework/data/rest/tests/security/SecurityConfiguration.java[tag=code] +include::example$security/SecurityConfiguration.java[tag=code] ... } ---- diff --git a/src/main/asciidoc/tools.adoc b/src/main/antora/modules/ROOT/pages/tools.adoc similarity index 94% rename from src/main/asciidoc/tools.adoc rename to src/main/antora/modules/ROOT/pages/tools.adoc index 0f638a4c4..fe3fff186 100644 --- a/src/main/asciidoc/tools.adoc +++ b/src/main/antora/modules/ROOT/pages/tools.adoc @@ -1,6 +1,5 @@ [[tools]] = Tools -:spring-data-rest-root: ../../../.. [[tools.hal-explorer]] == The HAL Explorer @@ -48,7 +47,7 @@ The HAL Explorer understands *URI Templates*. Whenever a link contains a URI tem image::hal-explorer-3.png[] -If you click *Go!* without entering anything, the variables are essentially ignored. For situations like <> or <>, this can be useful. +If you click *Go!* without entering anything, the variables are essentially ignored. For situations like xref:projections-excerpts.adoc[Projections and Excerpts] or xref:paging-and-sorting.adoc[Paging and Sorting], this can be useful. When you click on a *NON-GET* button with a `+` or a `>` sign on it, a modal dialog appears. It shows the HTTP method belonging to the clicked button. You can fill the body and submit the new JSON document. diff --git a/src/main/asciidoc/validation.adoc b/src/main/antora/modules/ROOT/pages/validation.adoc similarity index 100% rename from src/main/asciidoc/validation.adoc rename to src/main/antora/modules/ROOT/pages/validation.adoc diff --git a/src/main/antora/resources/antora-resources/antora.yml b/src/main/antora/resources/antora-resources/antora.yml new file mode 100644 index 000000000..e629aebf2 --- /dev/null +++ b/src/main/antora/resources/antora-resources/antora.yml @@ -0,0 +1,19 @@ +version: ${antora-component.version} +prerelease: ${antora-component.prerelease} + +asciidoc: + attributes: + version: ${project.version} + springversionshort: ${spring.short} + springversion: ${spring} + attribute-missing: 'warn' + commons: ${springdata.commons.docs} + include-xml-namespaces: false + spring-data-commons-docs-url: https://docs.spring.io/spring-data-commons/reference + spring-data-commons-javadoc-base: https://docs.spring.io/spring-data/commons/docs/${springdata.commons}/api/ + springdocsurl: https://docs.spring.io/spring-framework/reference/{springversionshort} + springjavadocurl: https://docs.spring.io/spring-framework/docs/${spring}/javadoc-api + spring-framework-docs: '{springdocsurl}' + spring-framework-javadoc: '{springjavadocurl}' + springhateoasversion: ${spring-hateoas} + releasetrainversion: ${releasetrain} diff --git a/src/main/asciidoc/index.adoc b/src/main/asciidoc/index.adoc deleted file mode 100644 index a0cab7ae5..000000000 --- a/src/main/asciidoc/index.adoc +++ /dev/null @@ -1,40 +0,0 @@ -[[spring-data-rest-reference]] -= Spring Data REST Reference Guide -Jon Brisbin, Oliver Drotbohm, Greg Turnquist, Jay Bryant -:revnumber: {version} -:revdate: {localdate} -ifdef::backend-epub3[:front-cover-image: image:epub-cover.png[Front Cover,1050,1600]] -:spring-data-commons-docs: ../../../../spring-data-commons/src/main/asciidoc - -(C) 2012-2022 Original authors - -NOTE: Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. - -include::preface.adoc[] -include::{spring-data-commons-docs}/upgrade.adoc[leveloffset=+1] -include::{spring-data-commons-docs}/dependencies.adoc[leveloffset=+1] - -[[reference]] -= Reference Documentation - -include::intro.adoc[leveloffset=+1] -include::getting-started.adoc[leveloffset=+1] -include::repository-resources.adoc[leveloffset=+1] -include::paging-and-sorting.adoc[leveloffset=+1] -include::representations.adoc[leveloffset=+1] -include::projections-excerpts.adoc[leveloffset=+1] -include::etags-and-other-conditionals.adoc[leveloffset=+1] -include::validation.adoc[leveloffset=+1] -include::events.adoc[leveloffset=+1] -include::integration.adoc[leveloffset=+1] -include::metadata.adoc[leveloffset=+1] -include::security.adoc[leveloffset=+1] -include::tools.adoc[leveloffset=+1] -include::customizing-sdr.adoc[leveloffset=+1] - -[[appendix]] -= Appendix - -:numbered!: -include::example-api-usage-with-curl.adoc[leveloffset=+1] -include::spring-data-rest-examples.adoc[leveloffset=+1] diff --git a/src/main/asciidoc/preface.adoc b/src/main/asciidoc/preface.adoc deleted file mode 100644 index e844b54c5..000000000 --- a/src/main/asciidoc/preface.adoc +++ /dev/null @@ -1,13 +0,0 @@ -[[preface]] -= Preface - -[[Project]] -[preface] -== Project Metadata - -* Version control: https://github.com/spring-projects/spring-data-rest -* Bugtracker: https://github.com/spring-projects/spring-data-rest/issues -* Project page: https://spring.io/projects/spring-data-rest -* Release repository: https://repo1.maven.org/maven2/ -* Milestone repository: https://repo.spring.io/milestone/ -* Snapshot repository: https://repo.spring.io/snapshot