From c535f07c200ff4bc8c0044fcc743729a0bb20434 Mon Sep 17 00:00:00 2001 From: Michael Jacoby Date: Wed, 3 Apr 2024 11:10:18 +0200 Subject: [PATCH] Add initial documentation (#12) * add initial documentation --------- Co-authored-by: Tino Bischoff Co-authored-by: fvolz --- .readthedocs.yaml | 17 ++++ CONTRIBUTING.md | 24 +++++ README.md | 83 +++++++++++++++++- .../registry/core/AbstractAasRepository.java | 2 +- docs/Makefile | 20 +++++ docs/make.bat | 35 ++++++++ docs/requirements.txt | 3 + docs/source/_static/css/custom.css | 3 + docs/source/_templates/layout.html | 4 + docs/source/about/about.md | 16 ++++ docs/source/about/contributing.md | 35 ++++++++ docs/source/about/recommended.md | 6 ++ docs/source/api/api.md | 15 ++++ docs/source/changelog/changelog.md | 5 ++ docs/source/conf.py | 43 +++++++++ docs/source/gettingstarted/configuration.md | 5 ++ docs/source/gettingstarted/docker.md | 45 ++++++++++ docs/source/gettingstarted/gettingstarted.md | 57 ++++++++++++ docs/source/images/Fa3st-Registry_negativ.png | Bin 0 -> 27829 bytes docs/source/images/Fa3st-Registry_positiv.png | Bin 0 -> 27886 bytes docs/source/index.md | 58 ++++++++++++ .../persistences/inmemory_persistence.md | 21 +++++ docs/source/persistences/jpa_persistence.md | 30 +++++++ docs/source/persistences/persistence.md | 6 ++ .../src/main/resources/application.properties | 1 + 25 files changed, 532 insertions(+), 2 deletions(-) create mode 100644 .readthedocs.yaml create mode 100644 CONTRIBUTING.md create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/source/_static/css/custom.css create mode 100644 docs/source/_templates/layout.html create mode 100644 docs/source/about/about.md create mode 100644 docs/source/about/contributing.md create mode 100644 docs/source/about/recommended.md create mode 100644 docs/source/api/api.md create mode 100644 docs/source/changelog/changelog.md create mode 100644 docs/source/conf.py create mode 100644 docs/source/gettingstarted/configuration.md create mode 100644 docs/source/gettingstarted/docker.md create mode 100644 docs/source/gettingstarted/gettingstarted.md create mode 100644 docs/source/images/Fa3st-Registry_negativ.png create mode 100644 docs/source/images/Fa3st-Registry_positiv.png create mode 100644 docs/source/index.md create mode 100644 docs/source/persistences/inmemory_persistence.md create mode 100644 docs/source/persistences/jpa_persistence.md create mode 100644 docs/source/persistences/persistence.md diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..5f8974f --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,17 @@ +version: 2 +build: + os: ubuntu-22.04 + tools: + python: '3.11' + +sphinx: + configuration: docs/source/conf.py + #fail_on_warning: true + +formats: + - pdf + - epub + +python: + install: + - requirements: docs/requirements.txt diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..b3f5a35 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,24 @@ +Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions are **greatly appreciated**. + +If you have a suggestion for improvements, please fork the repo and create a pull request. You can also simply open an issue. +Don't forget to rate the project! Thanks again! + +1. Fork the Project +2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) +3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the Branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +### Code Formatting +The project uses *spotless:check* in the build cycle, which means the project only compiles if all code, *.pom and *.xml files are formatted according to the project's codestyle definitions (see details on [spotless](https://github.com/diffplug/spotless)). +You can automatically format your code by running + +> mvn spotless:apply + +Additionally, you can import the eclipse formatting rules defined in */codestyle* into our IDE. + +### Third Party License +If you use additional dependencies please be sure that the licenses of these dependencies are compliant with our [License](#license). If you are not sure which license your dependencies have, you can run +> mvn license:aggregate-third-party-report + +and check the generated report in the directory `documentation/third_party_licenses_report.html`. diff --git a/README.md b/README.md index 818b5ed..04cfd50 100644 --- a/README.md +++ b/README.md @@ -1 +1,82 @@ -# FAAAST-Registry +# FA³ST Registry [![Build Status](https://github.com/FraunhoferIOSB/FAAAST-Registry/workflows/Maven%20Build/badge.svg)](https://github.com/FraunhoferIOSB/FAAAST-Registry/actions) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/c6851106e76e4df782db1d30fe5d846f)](https://www.codacy.com/gh/FraunhoferIOSB/FAAAST-Registry/dashboard?utm_source=github.com&utm_medium=referral&utm_content=FraunhoferIOSB/FAAAST-Registry&utm_campaign=Badge_Grade) [![Documentation Status](https://readthedocs.org/projects/faaast-registry/badge/?version=latest)](https://faaast-registry.readthedocs.io/en/latest/?badge=latest) SonarCloud badge + +![FA³ST Registry Logo Light](./docs/source/images/Fa3st-Registry_positiv.png/#gh-light-mode-only "FA³ST Registry Logo") +![FA³ST Registry Logo Dark](./docs/source/images/Fa3st-Registry_negativ.png/#gh-dark-mode-only "FA³ST Registry Logo") + +The **F**raunhofer **A**dvanced **A**sset **A**dministration **S**hell **T**ools (**FA³ST**) Registry. + +For more details on FA³ST Registry see the full documenation :blue_book: [here](https://faaast-registry.readthedocs.io/). + +| FA³ST Registry is still under development. Contributions in form of issues and pull requests are highly welcome. | +|-----------------------------| + +## Prerequisites + +- Java 17+ + +## Getting Started + +You can find a detailed documentation :blue_book: [here](https://faaast-registry.readthedocs.io/) + +## Usage + +### Download pre-compiled JAR + + +[Download latest SNAPSHOT version (0.1.0-SNAPSHOT)](https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=de.fraunhofer.iosb.ilt.faaast.registry&a=service&v=0.1.0-SNAPSHOT) + +### As Maven Dependency + +```xml + + de.fraunhofer.iosb.ilt.faaast.registry + service + 0.1.0-SNAPSHOT + +``` + +### As Gradle Dependency + +```text +implementation 'de.fraunhofer.iosb.ilt.faaast.registry:service:0.1.0-SNAPSHOT' +``` + +## Building from Source + +### Prerequisites + +- Maven + +```sh +git clone https://github.com/FraunhoferIOSB/FAAAST-Registry +cd FAAAST-Registry +mvn clean install +``` + +## Changelog + +You can find the detailed changelog [here](docs/source/changelog/changelog.md). + +## Contributing + +Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions are **greatly appreciated**. +You can find our contribution guidelines [here](CONTRIBUTING.md) + +## Contributors + +| Name | Github Account | +|:--| -- | +| Michael Jacoby | [mjacoby](https://github.com/mjacoby) | +| Tino Bischoff | [tbischoff2](https://github.com/tbischoff2) | + +## Contact + +faaast@iosb.fraunhofer.de + +## License + +Distributed under the Apache 2.0 License. See `LICENSE` for more information. + +Copyright (C) 2022 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131 Karlsruhe, Germany. + +You should have received a copy of the Apache 2.0 License along with this program. If not, see https://www.apache.org/licenses/LICENSE-2.0.html. diff --git a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/registry/core/AbstractAasRepository.java b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/registry/core/AbstractAasRepository.java index 53626d6..e34e06a 100644 --- a/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/registry/core/AbstractAasRepository.java +++ b/core/src/main/java/de/fraunhofer/iosb/ilt/faaast/registry/core/AbstractAasRepository.java @@ -25,7 +25,7 @@ /** - * Abstratc base class for implementing {@link AasRepository} interface providing helper methods for validation. + * Abstract base class for implementing {@link AasRepository} interface providing helper methods for validation. */ public abstract class AbstractAasRepository implements AasRepository { diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..45754a2 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,3 @@ +myst_parser +sphinx-markdown-tables +sphinx-rtd-theme \ No newline at end of file diff --git a/docs/source/_static/css/custom.css b/docs/source/_static/css/custom.css new file mode 100644 index 0000000..69f85e3 --- /dev/null +++ b/docs/source/_static/css/custom.css @@ -0,0 +1,3 @@ +.wy-nav-content { + max-width: 75%; +} \ No newline at end of file diff --git a/docs/source/_templates/layout.html b/docs/source/_templates/layout.html new file mode 100644 index 0000000..49e65d6 --- /dev/null +++ b/docs/source/_templates/layout.html @@ -0,0 +1,4 @@ +{% extends "!layout.html" %} +{% block extrahead %} + +{% endblock %} \ No newline at end of file diff --git a/docs/source/about/about.md b/docs/source/about/about.md new file mode 100644 index 0000000..40fdbbe --- /dev/null +++ b/docs/source/about/about.md @@ -0,0 +1,16 @@ +# About the Project + +This project provides an implemetation of the Registry for the [Asset Administration Shell (AAS)](https://www.plattform-i40.de/SiteGlobals/IP/Forms/Listen/Downloads/EN/Downloads_Formular.html?cl2Categories_TechnologieAnwendungsbereich_name=Verwaltungsschale). +The Registry provides information about registered AASs, including the endpoint of the AASs. + +## Contact + +faaast@iosb.fraunhofer.de + +## License + +Distributed under the Apache 2.0 License. See `LICENSE` for more information. + +Copyright (C) 2023 Fraunhofer Institut IOSB, Fraunhoferstr. 1, D 76131 Karlsruhe, Germany. + +You should have received a copy of the Apache 2.0 License along with this program. If not, see [https://www.apache.org/licenses/LICENSE-2.0.html](https://www.apache.org/licenses/LICENSE-2.0.html). diff --git a/docs/source/about/contributing.md b/docs/source/about/contributing.md new file mode 100644 index 0000000..a7a02e6 --- /dev/null +++ b/docs/source/about/contributing.md @@ -0,0 +1,35 @@ +# Contributing + +Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions are **greatly appreciated**. + +If you have a suggestion for improvements, please fork the repo and create a pull request. You can also simply open an issue. +Don't forget to rate the project! Thanks again! + +1. Fork the Project +2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) +3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the Branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +## Code Formatting + +The project uses _spotless:check_ in the build cycle, which means the project only compiles if all code, *.pom and *.xml files are formatted according to the project's codestyle definitions (see details on [spotless](https://github.com/diffplug/spotless)). +You can automatically format your code by running + +> mvn spotless:apply + +Additionally, you can import the eclipse formatting rules defined in _/codestyle_ into our IDE. + +## Third Party License + +If you use additional dependencies please be sure that the licenses of these dependencies are compliant with our License. If you are not sure which license your dependencies have, you can run +> mvn license:aggregate-third-party-report + +and check the generated report in the directory `docs/third_party_licenses_report.html`. + +## Contributors + +| Name | Github Account | +|:--| -- | +| Michael Jacoby | [mjacoby](https://github.com/mjacoby) | +| Tino Bischoff | [tbischoff2](https://github.com/tbischoff2) | diff --git a/docs/source/about/recommended.md b/docs/source/about/recommended.md new file mode 100644 index 0000000..deb86ae --- /dev/null +++ b/docs/source/about/recommended.md @@ -0,0 +1,6 @@ +# Recommended Documents/Links + +- [Asset Administration Shell Specifications](https://industrialdigitaltwin.org/en/content-hub) +Quicklinks To Different Versions & Reading Guide +- [Details of the Asset Administration Shell - Part 2](https://www.plattform-i40.de/IP/Redaktion/EN/Downloads/Publikation/Details_of_the_Asset_Administration_Shell_Part2_V1.html), Nov 2021 +This part of the AAS specification provides information about the Registry, the descriptors and the available APIs. diff --git a/docs/source/api/api.md b/docs/source/api/api.md new file mode 100644 index 0000000..591b8bd --- /dev/null +++ b/docs/source/api/api.md @@ -0,0 +1,15 @@ +## API + +The Registry allows accessing the data via REST-API. + +### Supported API calls + +- Asset Administration Shell Registry Interface + - /registry/shell-descriptors ![GET](https://img.shields.io/badge/GET-blue) ![POST](https://img.shields.io/badge/POST-brightgreen) + - /registry/shell-descriptors/{aasIdentifier} ![GET](https://img.shields.io/badge/GET-blue) ![PUT](https://img.shields.io/badge/PUT-orange) ![DELETE](https://img.shields.io/badge/DELETE-red) + - /registry/shell-descriptors/{aasIdentifier}/submodel-descriptors ![GET](https://img.shields.io/badge/GET-blue) ![POST](https://img.shields.io/badge/POST-brightgreen) + - /registry/shell-descriptors/{aasIdentifier}/submodel-descriptors/{submodelIdentifier} ![GET](https://img.shields.io/badge/GET-blue) ![PUT](https://img.shields.io/badge/PUT-orange) ![DELETE](https://img.shields.io/badge/DELETE-red) + +- Submodel Registry Interface + - registry/submodel-descriptors ![GET](https://img.shields.io/badge/GET-blue) ![POST](https://img.shields.io/badge/POST-brightgreen) + - registry/submodel-descriptors/{submodelIdentifier} ![GET](https://img.shields.io/badge/GET-blue) ![PUT](https://img.shields.io/badge/PUT-orange) ![DELETE](https://img.shields.io/badge/DELETE-red) diff --git a/docs/source/changelog/changelog.md b/docs/source/changelog/changelog.md new file mode 100644 index 0000000..b3642f5 --- /dev/null +++ b/docs/source/changelog/changelog.md @@ -0,0 +1,5 @@ +# Changelog + +## Current development version (0.1.0-SNAPSHOT) + +Initial development diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..10b47b0 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,43 @@ +# Configuration file for the Sphinx documentation builder. + +# -- Project information + +project = 'FA³ST Registry' +copyright = '2023, Fraunhofer IOSB' +author = 'Fraunhofer IOSB' + +# -- General configuration + +extensions = [ + 'sphinx.ext.duration', + 'sphinx.ext.doctest', + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'myst_parser', + 'sphinx_markdown_tables' +] + +intersphinx_mapping = { + 'python': ('https://docs.python.org/3/', None), + 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), +} +intersphinx_disabled_domains = ['std'] + +templates_path = ['_templates'] + +# -- Options for HTML output + +html_theme = 'sphinx_rtd_theme' + +# -- Options for EPUB output +epub_show_urls = 'footnote' + +# These folders are copied to the documentation's HTML output +html_static_path = ['_static'] + +# These paths are either relative to html_static_path +# or fully qualified paths (eg. https://...) +html_css_files = [ + 'css/custom.css', +] diff --git a/docs/source/gettingstarted/configuration.md b/docs/source/gettingstarted/configuration.md new file mode 100644 index 0000000..3a1e46f --- /dev/null +++ b/docs/source/gettingstarted/configuration.md @@ -0,0 +1,5 @@ +# Configuration + +## Persistence: In-Memory vs. Database + +The default configuration starts the Registry with in-memory persistence. To use relational database persistence with a PostgreSQL database, please refer to the `JPA Persistence` section for details. diff --git a/docs/source/gettingstarted/docker.md b/docs/source/gettingstarted/docker.md new file mode 100644 index 0000000..3151c0c --- /dev/null +++ b/docs/source/gettingstarted/docker.md @@ -0,0 +1,45 @@ +# Usage with Docker + +This section describes the usage with docker and docker compose. + +## Docker-Compose + +Clone this repository, navigate to `/misc/docker/` and run this command inside it. + +```sh +cd misc/docker +docker-compose up +``` + +To modify the configuration edit the file `/misc/docker/docker-compose.yml`. +You can change the following values using environment variables: + + +### Configuration + +| Name | Example Value | Description | +|:----------------------------------------|---------------------------------------------------------------------------|--------------------------------------------------------------| +| spring.profiles.active | default / external | in-memory or external database connection | +| spring.jpa.properties.hibernate.dialect | org.hibernate.dialect.H2Dialect / org.hibernate.dialect.PostgreSQLDialect | the hibernate dialect to be used for the database connection | +| spring.datasource.driver | org.h2.Driver / org.postgresql.Driver | the JDBC driver to be used for the database connection | +| spring.datasource.url | jdbc:postgresql://db:5432/postgres | url of the internal or external database | +| spring.datasource.username | postgres | username for the database | +| spring.datasource.password | admin | password for the database | +| server.port | 8090 | port of the Registry | + +## Docker CLI + +To start the FA³ST Registry with default values execute this command. +A FA³ST Registry with in-memory database on port 8090 will be started. + +```sh +docker run --rm -P fraunhoferiosb/faaast-registry +``` + +To start the FA³ST Registry with your own configuration, override the environment variables. + +```sh +docker run --rm -P -e "server.port=8091" fraunhoferiosb/faaast-registry +``` + +Similarly to the above examples you can pass more arguments to the FA³ST Registry by using the CLI or an environment file diff --git a/docs/source/gettingstarted/gettingstarted.md b/docs/source/gettingstarted/gettingstarted.md new file mode 100644 index 0000000..d6bee8b --- /dev/null +++ b/docs/source/gettingstarted/gettingstarted.md @@ -0,0 +1,57 @@ +# Getting Started + +## Prerequisites + +- Java 17+ + +## Usage + +### From precompiled JAR + + +Download latest SNAPSHOT version (0.1.0-SNAPSHOT) + + +### As Maven Dependency + +```xml + + de.fraunhofer.iosb.ilt.faaast.registry + service + 0.1.0-SNAPSHOT + +``` + +### As Gradle Dependency + +```text +implementation 'de.fraunhofer.iosb.ilt.faaast.registry:service:0.1.0-SNAPSHOT' +``` + +## Building from Source + +### Prerequisites + +- Maven + +```sh +git clone https://github.com/FraunhoferIOSB/FAAAST-Registry +cd FAAAST-Registry +mvn clean install +``` + +## Example + +This example shows how to start a FA³ST Registry with in-memory persistence. + +### Via Command-line Interface (CLI) + +```sh +java -jar service-0.1.0-SNAPSHOT.jar +``` + +or + +```sh +mvn spring-boot:run +``` diff --git a/docs/source/images/Fa3st-Registry_negativ.png b/docs/source/images/Fa3st-Registry_negativ.png new file mode 100644 index 0000000000000000000000000000000000000000..f1127ab1709215066cf7b727310aaff93fb1deb2 GIT binary patch literal 27829 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 at Runtime – Exchanging Information via Application Programming Interfaces | Version 1.0RC02
([specification](https://www.plattform-i40.de/IP/Redaktion/EN/Downloads/Publikation/Details_of_the_Asset_Administration_Shell_Part2_V1.pdf))
([swagger](https://app.swaggerhub.com/apis/Plattform_i40/Entire-API-Collection/V1.0RC02)) | + +## Features + +- supports several persistence implementations: `memory, jpa` +- supports separated Registries + - AAS Registry + - Submodel Registry + +```{toctree} +:hidden: +:caption: Getting Started +:maxdepth: 3 +gettingstarted/gettingstarted.md +gettingstarted/configuration.md +``` + +```{toctree} +:hidden: +:caption: API +:maxdepth: 2 +api/api.md +``` + +```{toctree} +:hidden: +:caption: Persistence +:maxdepth: 3 +General +In-Memory +JPA +``` + +```{toctree} +:hidden: +:caption: About +:maxdepth: 2 +about/about.md +about/contributing.md +about/recommended.md +``` + +```{toctree} +:hidden: +:caption: Changelog +:maxdepth: 2 +changelog/changelog.md +``` diff --git a/docs/source/persistences/inmemory_persistence.md b/docs/source/persistences/inmemory_persistence.md new file mode 100644 index 0000000..db74575 --- /dev/null +++ b/docs/source/persistences/inmemory_persistence.md @@ -0,0 +1,21 @@ +# In-Memory Persistence + +## Introduction + +The In-Memory Persistence keeps the AAS and Submodel Registry in the local memory. At startup, the Registry always starts empty. All registered AASs or Submodels will be stored in the local memory. When the application is stopped, all registered AASs and Submodels will be lost. + +## Configuration + +The In-Memory Persistence requires some settings in the `application.properties` (service\src\main\resources\application.properties) file: + +```properties +##### RDBS via JPA (in-memory H2) ##### +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect +spring.datasource.driver=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.username=sa +spring.datasource.password= +####################################### +``` + +The property `spring.profiles.active` must be empty or not set, as the default profile is In-Memory Persistence. diff --git a/docs/source/persistences/jpa_persistence.md b/docs/source/persistences/jpa_persistence.md new file mode 100644 index 0000000..9677004 --- /dev/null +++ b/docs/source/persistences/jpa_persistence.md @@ -0,0 +1,30 @@ +# JPA (Java Persistenc API) Persistence + +## Introduction + +The JPA Persistence keeps the AAS and Submodel Registry in a relational database. When the Registry is restarted, all registered AASs and Submodels will still be availabe. So, when an AAS or Submodel is not available anymore, it's important to delete it from the Registry. + +Currently, the JPA Persistence is configured and tested with PostgreSQL. But other relational databases supported by JPA should also work. +In that case, you must make sure, that the corresponding database driver dependency is included in the `pom.xml` of the service. + +## Configuration + +The JPA Persistence requires some settings in the `application.properties` (`service\src\main\resources\application.properties`) file: + +```properties +##### RDBS via JPA (external PostgresDB) ##### +spring.profiles.active=external +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect +spring.datasource.driver=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/Fa3stRegistry +spring.datasource.username=postgres +spring.datasource.password= +``` + +An example of these settings is already prepared in comments in the `application.properties`. Please make sure that the corresponding In-Memory settings are removed from the `application.properties`. + +The property `spring.profiles.active` must be set to `external`. + +Please make sure, that the database, referenced by `spring.datasource.url`, exists in your PostgreSQL database (in this example `Fa3stRegistry`). + +Please make sure, that you add username and password of your PostgreSQL database in this section (properties `spring.datasource.username` and `spring.datasource.password`). diff --git a/docs/source/persistences/persistence.md b/docs/source/persistences/persistence.md new file mode 100644 index 0000000..a377658 --- /dev/null +++ b/docs/source/persistences/persistence.md @@ -0,0 +1,6 @@ +# Persistence + +The FA³ST Registry currently supports two different persistence implementations. + +- In-Memory persistence +- JPA-based persistence (relational database) diff --git a/service/src/main/resources/application.properties b/service/src/main/resources/application.properties index ea6c73a..dc05d09 100644 --- a/service/src/main/resources/application.properties +++ b/service/src/main/resources/application.properties @@ -16,6 +16,7 @@ spring.datasource.password= ####################################### ###### RDBS via JPA (external PostgresDB) ##### +#spring.profiles.active=external #spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect #spring.datasource.driver=org.postgresql.Driver #spring.datasource.url=jdbc:postgresql://localhost:5432/Fa3stRegistry