diff --git a/apidocs/allclasses-index.html b/apidocs/allclasses-index.html
index 4462f056..f56d1744 100644
--- a/apidocs/allclasses-index.html
+++ b/apidocs/allclasses-index.html
@@ -1,7 +1,7 @@
-
+
All Classes and Interfaces (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/allpackages-index.html b/apidocs/allpackages-index.html
index 1a8e67a5..8a846c10 100644
--- a/apidocs/allpackages-index.html
+++ b/apidocs/allpackages-index.html
@@ -1,7 +1,7 @@
-
+
All Packages (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/BinderFactory.html b/apidocs/com/qubitpi/ws/jersey/template/application/BinderFactory.html
index 4d70e220..95916509 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/BinderFactory.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/BinderFactory.html
@@ -1,7 +1,7 @@
-
+
BinderFactory (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/ResourceConfig.html b/apidocs/com/qubitpi/ws/jersey/template/application/ResourceConfig.html
index 01b0ecfc..2cd4b72e 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/ResourceConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/ResourceConfig.html
@@ -1,7 +1,7 @@
-
+
ResourceConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/class-use/BinderFactory.html b/apidocs/com/qubitpi/ws/jersey/template/application/class-use/BinderFactory.html
index ad86ad04..1a741a5f 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/class-use/BinderFactory.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/class-use/BinderFactory.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.application.BinderFactory (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/class-use/ResourceConfig.html b/apidocs/com/qubitpi/ws/jersey/template/application/class-use/ResourceConfig.html
index 6191c6a0..39434db8 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/class-use/ResourceConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/class-use/ResourceConfig.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.application.ResourceConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/application/package-summary.html
index 8ab25767..da7cf050 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.application (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/application/package-tree.html
index 798c8d5a..e7248dde 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.application Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/application/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/application/package-use.html
index 04c1cfbc..7dee5656 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/application/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/application/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.application (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/cache/LruCache.html b/apidocs/com/qubitpi/ws/jersey/template/cache/LruCache.html
index 9ba671a9..668d85be 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/cache/LruCache.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/cache/LruCache.html
@@ -1,7 +1,7 @@
-
+
LruCache (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/cache/class-use/LruCache.html b/apidocs/com/qubitpi/ws/jersey/template/cache/class-use/LruCache.html
index 5a7aeb68..5a9d92d8 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/cache/class-use/LruCache.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/cache/class-use/LruCache.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.cache.LruCache (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/cache/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/cache/package-summary.html
index 6ef41e0f..7d02c592 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/cache/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/cache/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.cache (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/cache/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/cache/package-tree.html
index 0d0abd7f..196c5739 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/cache/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/cache/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.cache Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/cache/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/cache/package-use.html
index 07c8a1f0..d62ad254 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/cache/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/cache/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.cache (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/ApplicationConfig.html b/apidocs/com/qubitpi/ws/jersey/template/config/ApplicationConfig.html
index 29d6e27b..7c7376a2 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/ApplicationConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/ApplicationConfig.html
@@ -1,7 +1,7 @@
-
+
ApplicationConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/OAuthConfig.html b/apidocs/com/qubitpi/ws/jersey/template/config/OAuthConfig.html
index 1d3aa6dd..7da02877 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/OAuthConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/OAuthConfig.html
@@ -1,7 +1,7 @@
-
+
OAuthConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/class-use/ApplicationConfig.html b/apidocs/com/qubitpi/ws/jersey/template/config/class-use/ApplicationConfig.html
index c18ee7a0..ec04dddb 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/class-use/ApplicationConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/class-use/ApplicationConfig.html
@@ -1,7 +1,7 @@
-
+
Uses of Interface com.qubitpi.ws.jersey.template.config.ApplicationConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/class-use/OAuthConfig.html b/apidocs/com/qubitpi/ws/jersey/template/config/class-use/OAuthConfig.html
index 1c003568..ed0381c5 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/class-use/OAuthConfig.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/class-use/OAuthConfig.html
@@ -1,7 +1,7 @@
-
+
Uses of Interface com.qubitpi.ws.jersey.template.config.OAuthConfig (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/config/package-summary.html
index 23b4cfbe..f878e95e 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.config (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/config/package-tree.html
index 7b486709..caf96baf 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.config Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/config/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/config/package-use.html
index 2e4a3ce9..e7ee655c 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/config/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/config/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.config (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/DataServlet.html b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/DataServlet.html
index b8ddf6bd..761e03e5 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/DataServlet.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/DataServlet.html
@@ -1,7 +1,7 @@
-
+
DataServlet (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/class-use/DataServlet.html b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/class-use/DataServlet.html
index ced525ac..051fcd35 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/class-use/DataServlet.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/class-use/DataServlet.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.web.endpoints.DataServlet (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-summary.html
index 21f0eb44..67deb3c1 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.endpoints (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-tree.html
index 5f9384d5..17b8f406 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.endpoints Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-use.html
index 58e73d09..80224925 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/endpoints/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.web.endpoints (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/CorsFilter.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/CorsFilter.html
index d8295df0..b7c0bd96 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/CorsFilter.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/CorsFilter.html
@@ -1,7 +1,7 @@
-
+
CorsFilter (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/OAuthFilter.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/OAuthFilter.html
index cc2649aa..6e92b42c 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/OAuthFilter.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/OAuthFilter.html
@@ -1,7 +1,7 @@
-
+
OAuthFilter (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/CorsFilter.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/CorsFilter.html
index 748a340a..b93f880d 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/CorsFilter.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/CorsFilter.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.web.filters.CorsFilter (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/OAuthFilter.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/OAuthFilter.html
index 9bf96074..ea34d476 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/OAuthFilter.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/class-use/OAuthFilter.html
@@ -1,7 +1,7 @@
-
+
Uses of Class com.qubitpi.ws.jersey.template.web.filters.OAuthFilter (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/AccessTokenValidator.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/AccessTokenValidator.html
index 635afbed..8f5b75a6 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/AccessTokenValidator.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/AccessTokenValidator.html
@@ -1,7 +1,7 @@
-
+
AccessTokenValidator (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/class-use/AccessTokenValidator.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/class-use/AccessTokenValidator.html
index 1cb1ea7c..47550ed7 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/class-use/AccessTokenValidator.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/class-use/AccessTokenValidator.html
@@ -1,7 +1,7 @@
-
+
Uses of Interface com.qubitpi.ws.jersey.template.web.filters.oauth.AccessTokenValidator (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-summary.html
index 62d5e895..ca4b1ad0 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.filters.oauth (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-tree.html
index 6cbcac61..39ebceb6 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.filters.oauth Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-use.html
index f23c0972..057a25ad 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/oauth/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.web.filters.oauth (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-summary.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-summary.html
index cf45ede4..57e47d8b 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-summary.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-summary.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.filters (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-tree.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-tree.html
index d8a53227..61e2c8f2 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-tree.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-tree.html
@@ -1,7 +1,7 @@
-
+
com.qubitpi.ws.jersey.template.web.filters Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-use.html b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-use.html
index df9b941c..6d65cc1c 100644
--- a/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-use.html
+++ b/apidocs/com/qubitpi/ws/jersey/template/web/filters/package-use.html
@@ -1,7 +1,7 @@
-
+
Uses of Package com.qubitpi.ws.jersey.template.web.filters (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/constant-values.html b/apidocs/constant-values.html
index 3567a907..1e583e29 100644
--- a/apidocs/constant-values.html
+++ b/apidocs/constant-values.html
@@ -1,7 +1,7 @@
-
+
Constant Field Values (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/help-doc.html b/apidocs/help-doc.html
index 561fc049..02df7c99 100644
--- a/apidocs/help-doc.html
+++ b/apidocs/help-doc.html
@@ -1,7 +1,7 @@
-
+
API Help (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index bed8031d..212ffb0a 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -1,7 +1,7 @@
-
+
Index (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/index.html b/apidocs/index.html
index 40472b2d..ea11d114 100644
--- a/apidocs/index.html
+++ b/apidocs/index.html
@@ -1,7 +1,7 @@
-
+
Overview (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/overview-summary.html b/apidocs/overview-summary.html
index c1d54ed0..357f31c5 100644
--- a/apidocs/overview-summary.html
+++ b/apidocs/overview-summary.html
@@ -1,7 +1,7 @@
-
+
Jersey Webservice Template 1.0-SNAPSHOT API
diff --git a/apidocs/overview-tree.html b/apidocs/overview-tree.html
index 7ad4e304..0a68f6b2 100644
--- a/apidocs/overview-tree.html
+++ b/apidocs/overview-tree.html
@@ -1,7 +1,7 @@
-
+
Class Hierarchy (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/apidocs/serialized-form.html b/apidocs/serialized-form.html
index 2ec56404..d3a3180b 100644
--- a/apidocs/serialized-form.html
+++ b/apidocs/serialized-form.html
@@ -1,7 +1,7 @@
-
+
Serialized Form (Jersey Webservice Template 1.0-SNAPSHOT API)
diff --git a/assets/js/524b9b73.94fb2ff7.js b/assets/js/524b9b73.94fb2ff7.js
new file mode 100644
index 00000000..173ca61e
--- /dev/null
+++ b/assets/js/524b9b73.94fb2ff7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1746],{8955:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var i=s(5893),n=s(1151);const r={sidebar_position:9,title:"Configuration",description:"Configurations specific to JPA through yahoo/elide"},o=void 0,a={id:"elide/configuration",title:"Configuration",description:"Configurations specific to JPA through yahoo/elide",source:"@site/docs/elide/configuration.md",sourceDirName:"elide",slug:"/elide/configuration",permalink:"/jersey-webservice-template/docs/elide/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/QubitPi/jersey-webservice-template/tree/master/docs/docs/elide/configuration.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"Configuration",description:"Configurations specific to JPA through yahoo/elide"},sidebar:"tutorialSidebar",previous:{title:"OpenAPI",permalink:"/jersey-webservice-template/docs/elide/openapi"},next:{title:"Performance",permalink:"/jersey-webservice-template/docs/elide/performance"}},c={},d=[{value:"Core Properties",id:"core-properties",level:2},{value:"JPA DataStore",id:"jpa-datastore",level:2},{value:"CI/CD",id:"cicd",level:2},{value:"CI/CD Chain",id:"cicd-chain",level:3}];function l(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,n.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.p,{children:"The configurations in this page can be set from several sources in the following order:"}),"\n",(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["the ",(0,i.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/essential/environment/env.html",children:"operating system's environment variables"}),"; for instance, an environment variable can be set with\n",(0,i.jsx)(t.code,{children:'export OAUTH_ENABLED="true"'})]}),"\n",(0,i.jsxs)(t.li,{children:["the ",(0,i.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html",children:"Java system properties"}),"; for example, a Java system property can be set using\n",(0,i.jsx)(t.code,{children:'System.setProperty("OAUTH_ENABLED", "true")'})]}),"\n",(0,i.jsxs)(t.li,{children:["a ",(0,i.jsx)(t.strong,{children:".properties"})," file placed under CLASSPATH. This file can be put under ",(0,i.jsx)(t.code,{children:"src/main/resources"})," source directory with\ncontents, for example, ",(0,i.jsx)(t.code,{children:"OAUTH_ENABLED=true"})]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"core-properties",children:"Core Properties"}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["The following configurations can be placed in the properties file called ",(0,i.jsx)(t.strong,{children:"application.properties"})]})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"MODEL_PACKAGE_NAME"}),": The fully qualified package name that contains a set of Elide JPA models"]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"jpa-datastore",children:"JPA DataStore"}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["The following configurations can be placed in the properties file called ",(0,i.jsx)(t.strong,{children:"jpadatastore.properties"})]})}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"DB_USER"}),": Persistence DB username (needs have both Read and Write permissions)."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"DB_PASSWORD"}),": The persistence DB user password."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"DB_URL"}),': The persistence DB URL, such as "jdbc:mysql://localhost/elide?serverTimezone=UTC".']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"DB_DRIVER"}),': The SQL DB driver class name, such as "com.mysql.jdbc.Driver".']}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.strong,{children:"DB_DIALECT"}),': The SQL DB dialect name, such as "org.hibernate.dialect.MySQLDialect".']}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"cicd",children:"CI/CD"}),"\n",(0,i.jsxs)(t.p,{children:["In addition to the ones mentioned in ",(0,i.jsx)(t.a,{href:"../configuration#cicd",children:"general CI/CD configs"}),", these\n",(0,i.jsx)(t.a,{href:"https://docs.github.com/en/actions/security-guides/encrypted-secrets",children:"GitHub Action Secrets"})," needs to be setup:"]}),"\n",(0,i.jsxs)(t.table,{children:[(0,i.jsx)(t.thead,{children:(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.th,{children:"Secret Name"}),(0,i.jsx)(t.th,{children:"Definition"}),(0,i.jsx)(t.th,{children:"How to Get"})]})}),(0,i.jsxs)(t.tbody,{children:[(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"APPLICATION_PROPERTIES"}),(0,i.jsxs)(t.td,{children:["The contents of the ",(0,i.jsx)(t.code,{children:"src/main/resources/application.properties"})," mentioned above"]}),(0,i.jsxs)(t.td,{children:["See ",(0,i.jsx)(t.a,{href:"#core-properties",children:"Core Properties"})," section above"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"JPADATASTORE_PROPERTIES"}),(0,i.jsxs)(t.td,{children:["The contents of the ",(0,i.jsx)(t.code,{children:"src/main/resources/jpadatastore.properties"})," mentioned above"]}),(0,i.jsxs)(t.td,{children:["See ",(0,i.jsx)(t.a,{href:"#jpa-datastore",children:"JPA DataStore"})," section above"]})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_TOKEN"}),(0,i.jsx)(t.td,{children:'The GitHub Fine-grained token with at least "Read access to code and metadata" repository permissions to the Elide data models repo'}),(0,i.jsx)(t.td,{children:(0,i.jsx)(t.a,{href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token",children:"Creating a fine-grained personal access token"})})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_ORG"}),(0,i.jsx)(t.td,{children:"The org/user name of the GitHub repo for Elide data models"}),(0,i.jsxs)(t.td,{children:["For ",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"this example"}),', DATA_MODELS_PRIVATE_REPO_ORG is "QubitPi"']})]}),(0,i.jsxs)(t.tr,{children:[(0,i.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_NAME"}),(0,i.jsx)(t.td,{children:"The name of the GitHub repo for Elide data models"}),(0,i.jsxs)(t.td,{children:["For ",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"this example"}),', DATA_MODELS_PRIVATE_REPO_NAME is "jersey-webservice-template"']})]})]})]}),"\n",(0,i.jsx)(t.h3,{id:"cicd-chain",children:"CI/CD Chain"}),"\n",(0,i.jsxs)(t.p,{children:["Jersey Webservice Templates adopts the best CI/CD strategies by incorporating its sister projects, ",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"jersey-webservice-template-jpa-data-models"})," and\n",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models-acceptance-tests",children:"jersey-webservice-template-jpa-data-models-acceptance-tests"}),", into its CI/CD pipeline. Any PR merge into ",(0,i.jsx)(t.code,{children:"jpa-elide"})," branch will trigger the\n",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models/actions",children:"CI/CD of its data model"}),", which then triggers\n",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models-acceptance-tests/actions",children:"CI/CD of data model's acceptance tests"}),"."]}),"\n",(0,i.jsxs)(t.p,{children:["The triggering of its direct downstream project is done through GitHub Actions. See the ",(0,i.jsx)(t.strong,{children:"triggering"})," job in ",(0,i.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template/blob/jpa-elide/.github/workflows/ci-cd.yml",children:"CI/CD definition file"}),". Basically, the triggering is proxied to\n",(0,i.jsx)(t.a,{href:"https://github.com/peter-evans/repository-dispatch",children:"peter-evans/repository-dispatch"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:" triggering:\n name: Triggering data model CI/CD\n runs-on: ubuntu-latest\n steps:\n - name: Trigger data model CI/CD\n uses: peter-evans/repository-dispatch@v2\n with:\n token: ${{ secrets.MY_DATA_MODEL_CICD_TRIGGER }}\n repository: my-org/my-data-model-repo\n event-type: my-webservice-repo-changes\n"})}),"\n",(0,i.jsxs)(t.p,{children:["For ",(0,i.jsx)(t.strong,{children:"MY_DATA_MODEL_CICD_TRIGGER"})," token, it is recommended to use a\n",(0,i.jsx)(t.a,{href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token",children:"fine-grained personal access token"}),"\nwith the following permissions on the target repository (i.e. ",(0,i.jsx)(t.em,{children:"my-data-model-repo"}),"):"]}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsx)(t.li,{children:"contents: read & write"}),"\n",(0,i.jsx)(t.li,{children:"metadata: read only (automatically selected when selecting the contents permission)"}),"\n"]}),"\n",(0,i.jsxs)(t.p,{children:["In downstream project CI/CD workflow, add the following to the\n",(0,i.jsx)(t.a,{href:"https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on",children:"on-clause"}),":"]}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-yaml",children:'"on":\n repository_dispatch:\n types: [my-webservice-repo-changes]\n'})}),"\n",(0,i.jsxs)(t.p,{children:["Note that how ",(0,i.jsx)(t.code,{children:"my-webservice-repo-changes"})," is used to bridge the event dispatcher (Jersey Webservice Template) and event subscriber (data model project)."]})]})}function h(e={}){const{wrapper:t}={...(0,n.a)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>o});var i=s(7294);const n={},r=i.createContext(n);function o(e){const t=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/524b9b73.dee88825.js b/assets/js/524b9b73.dee88825.js
deleted file mode 100644
index 9684dde3..00000000
--- a/assets/js/524b9b73.dee88825.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1746],{8955:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=s(5893),i=s(1151);const r={sidebar_position:9,title:"Configuration"},o=void 0,a={id:"elide/configuration",title:"Configuration",description:"[//]: # (Copyright Jiaqi Liu)",source:"@site/docs/elide/configuration.md",sourceDirName:"elide",slug:"/elide/configuration",permalink:"/jersey-webservice-template/docs/elide/configuration",draft:!1,unlisted:!1,editUrl:"https://github.com/QubitPi/jersey-webservice-template/tree/master/docs/docs/elide/configuration.md",tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"Configuration"},sidebar:"tutorialSidebar",previous:{title:"OpenAPI",permalink:"/jersey-webservice-template/docs/elide/openapi"},next:{title:"Performance",permalink:"/jersey-webservice-template/docs/elide/performance"}},c={},d=[{value:"Core Properties",id:"core-properties",level:2},{value:"JPA DataStore",id:"jpa-datastore",level:2},{value:"CI/CD",id:"cicd",level:2},{value:"CI/CD Chain",id:"cicd-chain",level:3}];function l(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"The configurations in this page can be set from several sources in the following order:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsxs)(t.li,{children:["the ",(0,n.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/essential/environment/env.html",children:"operating system's environment variables"}),"; for instance, an environment variable can be set with\n",(0,n.jsx)(t.code,{children:'export OAUTH_ENABLED="true"'})]}),"\n",(0,n.jsxs)(t.li,{children:["the ",(0,n.jsx)(t.a,{href:"https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html",children:"Java system properties"}),"; for example, a Java system property can be set using\n",(0,n.jsx)(t.code,{children:'System.setProperty("OAUTH_ENABLED", "true")'})]}),"\n",(0,n.jsxs)(t.li,{children:["a ",(0,n.jsx)(t.strong,{children:".properties"})," file placed under CLASSPATH. This file can be put under ",(0,n.jsx)(t.code,{children:"src/main/resources"})," source directory with\ncontents, for example, ",(0,n.jsx)(t.code,{children:"OAUTH_ENABLED=true"})]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"core-properties",children:"Core Properties"}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["The following configurations can be placed in the properties file called ",(0,n.jsx)(t.strong,{children:"application.properties"})]})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"MODEL_PACKAGE_NAME"}),": The fully qualified package name that contains a set of Elide JPA models"]}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"jpa-datastore",children:"JPA DataStore"}),"\n",(0,n.jsx)(t.admonition,{type:"note",children:(0,n.jsxs)(t.p,{children:["The following configurations can be placed in the properties file called ",(0,n.jsx)(t.strong,{children:"jpadatastore.properties"})]})}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"DB_USER"}),": Persistence DB username (needs have both Read and Write permissions)."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"DB_PASSWORD"}),": The persistence DB user password."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"DB_URL"}),': The persistence DB URL, such as "jdbc:mysql://localhost/elide?serverTimezone=UTC".']}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"DB_DRIVER"}),': The SQL DB driver class name, such as "com.mysql.jdbc.Driver".']}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"DB_DIALECT"}),': The SQL DB dialect name, such as "org.hibernate.dialect.MySQLDialect".']}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"cicd",children:"CI/CD"}),"\n",(0,n.jsxs)(t.p,{children:["In addition to the ones mentioned in ",(0,n.jsx)(t.a,{href:"../configuration#cicd",children:"general CI/CD configs"}),", these\n",(0,n.jsx)(t.a,{href:"https://docs.github.com/en/actions/security-guides/encrypted-secrets",children:"GitHub Action Secrets"})," needs to be setup:"]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Secret Name"}),(0,n.jsx)(t.th,{children:"Definition"}),(0,n.jsx)(t.th,{children:"How to Get"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"APPLICATION_PROPERTIES"}),(0,n.jsxs)(t.td,{children:["The contents of the ",(0,n.jsx)(t.code,{children:"src/main/resources/application.properties"})," mentioned above"]}),(0,n.jsxs)(t.td,{children:["See ",(0,n.jsx)(t.a,{href:"#core-properties",children:"Core Properties"})," section above"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"JPADATASTORE_PROPERTIES"}),(0,n.jsxs)(t.td,{children:["The contents of the ",(0,n.jsx)(t.code,{children:"src/main/resources/jpadatastore.properties"})," mentioned above"]}),(0,n.jsxs)(t.td,{children:["See ",(0,n.jsx)(t.a,{href:"#jpa-datastore",children:"JPA DataStore"})," section above"]})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_TOKEN"}),(0,n.jsx)(t.td,{children:'The GitHub Fine-grained token with at least "Read access to code and metadata" repository permissions to the Elide data models repo'}),(0,n.jsx)(t.td,{children:(0,n.jsx)(t.a,{href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token",children:"Creating a fine-grained personal access token"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_ORG"}),(0,n.jsx)(t.td,{children:"The org/user name of the GitHub repo for Elide data models"}),(0,n.jsxs)(t.td,{children:["For ",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"this example"}),', DATA_MODELS_PRIVATE_REPO_ORG is "QubitPi"']})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"DATA_MODELS_PRIVATE_REPO_NAME"}),(0,n.jsx)(t.td,{children:"The name of the GitHub repo for Elide data models"}),(0,n.jsxs)(t.td,{children:["For ",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"this example"}),', DATA_MODELS_PRIVATE_REPO_NAME is "jersey-webservice-template"']})]})]})]}),"\n",(0,n.jsx)(t.h3,{id:"cicd-chain",children:"CI/CD Chain"}),"\n",(0,n.jsxs)(t.p,{children:["Jersey Webservice Templates adopts the best CI/CD strategies by incorporating its sister projects, ",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models",children:"jersey-webservice-template-jpa-data-models"})," and\n",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models-acceptance-tests",children:"jersey-webservice-template-jpa-data-models-acceptance-tests"}),", into its CI/CD pipeline. Any PR merge into ",(0,n.jsx)(t.code,{children:"jpa-elide"})," branch will trigger the\n",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models/actions",children:"CI/CD of its data model"}),", which then triggers\n",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template-jpa-data-models-acceptance-tests/actions",children:"CI/CD of data model's acceptance tests"}),"."]}),"\n",(0,n.jsxs)(t.p,{children:["The triggering of its direct downstream project is done through GitHub Actions. See the ",(0,n.jsx)(t.strong,{children:"triggering"})," job in ",(0,n.jsx)(t.a,{href:"https://github.com/QubitPi/jersey-webservice-template/blob/jpa-elide/.github/workflows/ci-cd.yml",children:"CI/CD definition file"}),". Basically, the triggering is proxied to\n",(0,n.jsx)(t.a,{href:"https://github.com/peter-evans/repository-dispatch",children:"peter-evans/repository-dispatch"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:" triggering:\n name: Triggering data model CI/CD\n runs-on: ubuntu-latest\n steps:\n - name: Trigger data model CI/CD\n uses: peter-evans/repository-dispatch@v2\n with:\n token: ${{ secrets.MY_DATA_MODEL_CICD_TRIGGER }}\n repository: my-org/my-data-model-repo\n event-type: my-webservice-repo-changes\n"})}),"\n",(0,n.jsxs)(t.p,{children:["For ",(0,n.jsx)(t.strong,{children:"MY_DATA_MODEL_CICD_TRIGGER"})," token, it is recommended to use a\n",(0,n.jsx)(t.a,{href:"https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token",children:"fine-grained personal access token"}),"\nwith the following permissions on the target repository (i.e. ",(0,n.jsx)(t.em,{children:"my-data-model-repo"}),"):"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"contents: read & write"}),"\n",(0,n.jsx)(t.li,{children:"metadata: read only (automatically selected when selecting the contents permission)"}),"\n"]}),"\n",(0,n.jsxs)(t.p,{children:["In downstream project CI/CD workflow, add the following to the\n",(0,n.jsx)(t.a,{href:"https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on",children:"on-clause"}),":"]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-yaml",children:'"on":\n repository_dispatch:\n types: [my-webservice-repo-changes]\n'})}),"\n",(0,n.jsxs)(t.p,{children:["Note that how ",(0,n.jsx)(t.code,{children:"my-webservice-repo-changes"})," is used to bridge the event dispatcher (Jersey Webservice Template) and event subscriber (data model project)."]})]})}function h(e={}){const{wrapper:t}={...(0,i.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},1151:(e,t,s)=>{s.d(t,{Z:()=>a,a:()=>o});var n=s(7294);const i={},r=n.createContext(i);function o(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/935f2afb.f986b212.js b/assets/js/935f2afb.1387216e.js
similarity index 72%
rename from assets/js/935f2afb.f986b212.js
rename to assets/js/935f2afb.1387216e.js
index b21c4c37..0f26c4d7 100644
--- a/assets/js/935f2afb.f986b212.js
+++ b/assets/js/935f2afb.1387216e.js
@@ -1 +1 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/jersey-webservice-template/docs/intro","docId":"intro","unlisted":false},{"type":"link","label":"Setup","href":"/jersey-webservice-template/docs/setup","docId":"setup","unlisted":false},{"type":"link","label":"Development","href":"/jersey-webservice-template/docs/development","docId":"development","unlisted":false},{"type":"category","label":"JPA through yahoo/elide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Getting Started","href":"/jersey-webservice-template/docs/elide/intro","docId":"elide/intro","unlisted":false},{"type":"link","label":"Features","href":"/jersey-webservice-template/docs/elide/features","docId":"elide/features","unlisted":false},{"type":"link","label":"Data Models","href":"/jersey-webservice-template/docs/elide/data-model","docId":"elide/data-model","unlisted":false},{"type":"link","label":"Security","href":"/jersey-webservice-template/docs/elide/security","docId":"elide/security","unlisted":false},{"type":"link","label":"Data Stores","href":"/jersey-webservice-template/docs/elide/datastores","docId":"elide/datastores","unlisted":false},{"type":"category","label":"Client APIs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Client APIs","href":"/jersey-webservice-template/docs/elide/clientapis/","docId":"elide/clientapis/index","unlisted":false},{"type":"link","label":"JSON API","href":"/jersey-webservice-template/docs/elide/clientapis/jsonapi","docId":"elide/clientapis/jsonapi","unlisted":false},{"type":"link","label":"GraphQL Queries & Mutations","href":"/jersey-webservice-template/docs/elide/clientapis/graphql","docId":"elide/clientapis/graphql","unlisted":false},{"type":"link","label":"GraphQL Federation","href":"/jersey-webservice-template/docs/elide/clientapis/graphql-federation","docId":"elide/clientapis/graphql-federation","unlisted":false},{"type":"link","label":"Async API","href":"/jersey-webservice-template/docs/elide/clientapis/asyncapi","docId":"elide/clientapis/asyncapi","unlisted":false}],"href":"/jersey-webservice-template/docs/category/client-apis"},{"type":"link","label":"Logging & Audit","href":"/jersey-webservice-template/docs/elide/audit","docId":"elide/audit","unlisted":false},{"type":"link","label":"OpenAPI","href":"/jersey-webservice-template/docs/elide/openapi","docId":"elide/openapi","unlisted":false},{"type":"link","label":"Configuration","href":"/jersey-webservice-template/docs/elide/configuration","docId":"elide/configuration","unlisted":false},{"type":"link","label":"Performance","href":"/jersey-webservice-template/docs/elide/performance","docId":"elide/performance","unlisted":false},{"type":"link","label":"Development","href":"/jersey-webservice-template/docs/elide/development","docId":"elide/development","unlisted":false}],"href":"/jersey-webservice-template/docs/category/jpa-through-yahooelide"},{"type":"link","label":"Security","href":"/jersey-webservice-template/docs/security","docId":"security","unlisted":false},{"type":"link","label":"Configuration","href":"/jersey-webservice-template/docs/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Setting Up Sentry.io","href":"/jersey-webservice-template/docs/sentry","docId":"sentry","unlisted":false}]},"docs":{"configuration":{"id":"configuration","title":"Configuration","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"development":{"id":"development","title":"Development","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"elide/audit":{"id":"elide/audit","title":"Logging & Audit","description":"Configuring logging & audit","sidebar":"tutorialSidebar"},"elide/clientapis/asyncapi":{"id":"elide/clientapis/asyncapi","title":"Async API","description":"Async support for both JSON API and GraphQL","sidebar":"tutorialSidebar"},"elide/clientapis/graphql":{"id":"elide/clientapis/graphql","title":"GraphQL Queries & Mutations","description":"Querying webservice using GraphQL","sidebar":"tutorialSidebar"},"elide/clientapis/graphql-federation":{"id":"elide/clientapis/graphql-federation","title":"GraphQL Federation","description":"Beta support for GraphQL Federation","sidebar":"tutorialSidebar"},"elide/clientapis/index":{"id":"elide/clientapis/index","title":"Client APIs","description":"JSON API and GraphQL Client APIs","sidebar":"tutorialSidebar"},"elide/clientapis/jsonapi":{"id":"elide/clientapis/jsonapi","title":"JSON API","description":"Querying webservice using JSON API","sidebar":"tutorialSidebar"},"elide/configuration":{"id":"elide/configuration","title":"Configuration","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"elide/data-model":{"id":"elide/data-model","title":"Data Models","description":"Creating CRUD data models (create, read, update, and delete) in the backend using Elide","sidebar":"tutorialSidebar"},"elide/datastores":{"id":"elide/datastores","title":"Data Stores","description":"A boundary between Webservice and Database","sidebar":"tutorialSidebar"},"elide/development":{"id":"elide/development","title":"Development","description":"For developers who maintain or want to make changes to the Jersey Webservice Template","sidebar":"tutorialSidebar"},"elide/features":{"id":"elide/features","title":"Features","description":"An overview of Elide features and links to their respective documentations.","sidebar":"tutorialSidebar"},"elide/intro":{"id":"elide/intro","title":"Getting Started","description":"Standing up a CRUD webservice in a minute","sidebar":"tutorialSidebar"},"elide/openapi":{"id":"elide/openapi","title":"OpenAPI","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"elide/performance":{"id":"elide/performance","title":"Performance","description":"Tips on improving webservice performance","sidebar":"tutorialSidebar"},"elide/security":{"id":"elide/security","title":"Security","description":"Authorization support","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"security":{"id":"security","title":"Security","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"sentry":{"id":"sentry","title":"Setting Up Sentry.io","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"setup":{"id":"setup","title":"Setup","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Introduction","href":"/jersey-webservice-template/docs/intro","docId":"intro","unlisted":false},{"type":"link","label":"Setup","href":"/jersey-webservice-template/docs/setup","docId":"setup","unlisted":false},{"type":"link","label":"Development","href":"/jersey-webservice-template/docs/development","docId":"development","unlisted":false},{"type":"category","label":"JPA through yahoo/elide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Getting Started","href":"/jersey-webservice-template/docs/elide/intro","docId":"elide/intro","unlisted":false},{"type":"link","label":"Features","href":"/jersey-webservice-template/docs/elide/features","docId":"elide/features","unlisted":false},{"type":"link","label":"Data Models","href":"/jersey-webservice-template/docs/elide/data-model","docId":"elide/data-model","unlisted":false},{"type":"link","label":"Security","href":"/jersey-webservice-template/docs/elide/security","docId":"elide/security","unlisted":false},{"type":"link","label":"Data Stores","href":"/jersey-webservice-template/docs/elide/datastores","docId":"elide/datastores","unlisted":false},{"type":"category","label":"Client APIs","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Client APIs","href":"/jersey-webservice-template/docs/elide/clientapis/","docId":"elide/clientapis/index","unlisted":false},{"type":"link","label":"JSON API","href":"/jersey-webservice-template/docs/elide/clientapis/jsonapi","docId":"elide/clientapis/jsonapi","unlisted":false},{"type":"link","label":"GraphQL Queries & Mutations","href":"/jersey-webservice-template/docs/elide/clientapis/graphql","docId":"elide/clientapis/graphql","unlisted":false},{"type":"link","label":"GraphQL Federation","href":"/jersey-webservice-template/docs/elide/clientapis/graphql-federation","docId":"elide/clientapis/graphql-federation","unlisted":false},{"type":"link","label":"Async API","href":"/jersey-webservice-template/docs/elide/clientapis/asyncapi","docId":"elide/clientapis/asyncapi","unlisted":false}],"href":"/jersey-webservice-template/docs/category/client-apis"},{"type":"link","label":"Logging & Audit","href":"/jersey-webservice-template/docs/elide/audit","docId":"elide/audit","unlisted":false},{"type":"link","label":"OpenAPI","href":"/jersey-webservice-template/docs/elide/openapi","docId":"elide/openapi","unlisted":false},{"type":"link","label":"Configuration","href":"/jersey-webservice-template/docs/elide/configuration","docId":"elide/configuration","unlisted":false},{"type":"link","label":"Performance","href":"/jersey-webservice-template/docs/elide/performance","docId":"elide/performance","unlisted":false},{"type":"link","label":"Development","href":"/jersey-webservice-template/docs/elide/development","docId":"elide/development","unlisted":false}],"href":"/jersey-webservice-template/docs/category/jpa-through-yahooelide"},{"type":"link","label":"Security","href":"/jersey-webservice-template/docs/security","docId":"security","unlisted":false},{"type":"link","label":"Configuration","href":"/jersey-webservice-template/docs/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Setting Up Sentry.io","href":"/jersey-webservice-template/docs/sentry","docId":"sentry","unlisted":false}]},"docs":{"configuration":{"id":"configuration","title":"Configuration","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"development":{"id":"development","title":"Development","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"elide/audit":{"id":"elide/audit","title":"Logging & Audit","description":"Configuring logging & audit","sidebar":"tutorialSidebar"},"elide/clientapis/asyncapi":{"id":"elide/clientapis/asyncapi","title":"Async API","description":"Async support for both JSON API and GraphQL","sidebar":"tutorialSidebar"},"elide/clientapis/graphql":{"id":"elide/clientapis/graphql","title":"GraphQL Queries & Mutations","description":"Querying webservice using GraphQL","sidebar":"tutorialSidebar"},"elide/clientapis/graphql-federation":{"id":"elide/clientapis/graphql-federation","title":"GraphQL Federation","description":"Beta support for GraphQL Federation","sidebar":"tutorialSidebar"},"elide/clientapis/index":{"id":"elide/clientapis/index","title":"Client APIs","description":"JSON API and GraphQL Client APIs","sidebar":"tutorialSidebar"},"elide/clientapis/jsonapi":{"id":"elide/clientapis/jsonapi","title":"JSON API","description":"Querying webservice using JSON API","sidebar":"tutorialSidebar"},"elide/configuration":{"id":"elide/configuration","title":"Configuration","description":"Configurations specific to JPA through yahoo/elide","sidebar":"tutorialSidebar"},"elide/data-model":{"id":"elide/data-model","title":"Data Models","description":"Creating CRUD data models (create, read, update, and delete) in the backend using Elide","sidebar":"tutorialSidebar"},"elide/datastores":{"id":"elide/datastores","title":"Data Stores","description":"A boundary between Webservice and Database","sidebar":"tutorialSidebar"},"elide/development":{"id":"elide/development","title":"Development","description":"For developers who maintain or want to make changes to the Jersey Webservice Template","sidebar":"tutorialSidebar"},"elide/features":{"id":"elide/features","title":"Features","description":"An overview of Elide features and links to their respective documentations.","sidebar":"tutorialSidebar"},"elide/intro":{"id":"elide/intro","title":"Getting Started","description":"Standing up a CRUD webservice in a minute","sidebar":"tutorialSidebar"},"elide/openapi":{"id":"elide/openapi","title":"OpenAPI","description":"JSON API documentations","sidebar":"tutorialSidebar"},"elide/performance":{"id":"elide/performance","title":"Performance","description":"Tips on improving webservice performance","sidebar":"tutorialSidebar"},"elide/security":{"id":"elide/security","title":"Security","description":"Authorization support","sidebar":"tutorialSidebar"},"intro":{"id":"intro","title":"Introduction","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"security":{"id":"security","title":"Security","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"sentry":{"id":"sentry","title":"Setting Up Sentry.io","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"},"setup":{"id":"setup","title":"Setup","description":"[//]: # (Copyright Jiaqi Liu)","sidebar":"tutorialSidebar"}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/ca7b880a.66651a6c.js b/assets/js/ca7b880a.66651a6c.js
deleted file mode 100644
index 200e9825..00000000
--- a/assets/js/ca7b880a.66651a6c.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4762],{9196:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=i(5893),t=i(1151);const s={sidebar_position:8,title:"OpenAPI"},o=void 0,a={id:"elide/openapi",title:"OpenAPI",description:"[//]: # (Copyright Jiaqi Liu)",source:"@site/docs/elide/openapi.md",sourceDirName:"elide",slug:"/elide/openapi",permalink:"/jersey-webservice-template/docs/elide/openapi",draft:!1,unlisted:!1,editUrl:"https://github.com/QubitPi/jersey-webservice-template/tree/master/docs/docs/elide/openapi.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,title:"OpenAPI"},sidebar:"tutorialSidebar",previous:{title:"Logging & Audit",permalink:"/jersey-webservice-template/docs/elide/audit"},next:{title:"Configuration",permalink:"/jersey-webservice-template/docs/elide/configuration"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Features Supported",id:"features-supported",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Converting OpenAPI to JSON or YAML",id:"converting-openapi-to-json-or-yaml",level:3},{value:"Configure JAX-RS Endpoint",id:"configure-jax-rs-endpoint",level:3},{value:"Supporting OAuth",id:"supporting-oauth",level:3},{value:"Adding a global parameter",id:"adding-a-global-parameter",level:3},{value:"Adding a global response code",id:"adding-a-global-response-code",level:3},{value:"Performance",id:"performance",level:2},{value:"Path Generation",id:"path-generation",level:3},{value:"Document Size",id:"document-size",level:3},{value:"Model Properties",id:"model-properties",level:3},{value:"Attribute Properties",id:"attribute-properties",level:3},{value:"API Versions",id:"api-versions",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(n.p,{children:["Elide supports the generation of ",(0,r.jsx)(n.a,{href:"https://www.openapis.org/",children:"OpenAPI"})," documentation from Elide annotated beans.\nSpecifically, it generates a JSON or YAML document conforming to the OpenAPI specification that can be used by tools\nlike ",(0,r.jsx)(n.a,{href:"http://swagger.io/",children:"Swagger UI"})," (among others) to explore, understand, and compose queries against our Elide API."]}),"\n",(0,r.jsxs)(n.p,{children:["Only JSON-API endpoints are documented. The GraphQL API schema can be explored directly with tools like\n",(0,r.jsx)(n.a,{href:"https://github.com/graphql/graphiql",children:"Graphiql"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"features-supported",children:"Features Supported"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"JaxRS Endpoint"})," - Elide ships with a customizable JaxRS endpoints that can publish one or more OpenAPI documents\nin both JSON or YAML."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Path Discovery"})," - Given a set of entities to explore, Elide will generate the minimum, cycle-free, de-duplicated\nset of URL paths in the OpenAPI document."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Filter by Primitive Attributes"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests on entity collections include filter parameters for each\nprimitive attribute."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Prune Fields"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support JSON-API sparse fields query parameter."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Include Top Level Relationships"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support the ability to include direct relationships."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Sort by Attribute"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support sort query parameters."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pagination"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support pagination query parameters."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Permission Exposition"})," - Elide permissions are exported as documentation for entity schemas."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Model & Attribute Properties"})," - The ",(0,r.jsx)(n.em,{children:"required"}),", ",(0,r.jsx)(n.em,{children:"readOnly"}),", ",(0,r.jsx)(n.em,{children:"example"}),", ",(0,r.jsx)(n.em,{children:"value"}),", ",(0,r.jsx)(n.em,{children:"description"}),", ",(0,r.jsx)(n.em,{children:"title"}),",\n",(0,r.jsx)(n.em,{children:"accessMode"}),", ",(0,r.jsx)(n.em,{children:"requiredMode"})," fields are extracted from ",(0,r.jsx)(n.code,{children:"Schema"})," annotations."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API Version Support"})," - Elide can create separate documents for different API versions."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.p,{children:"Create and initialize an entity dictionary."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"EntityDictionary dictionary = EntityDictionary.builder().build();\n\ndictionary.bindEntity(Book.class);\ndictionary.bindEntity(Author.class);\ndictionary.bindEntity(Publisher.class);\n"})}),"\n",(0,r.jsx)(n.p,{children:"Create a Info object."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Info info = new Info().title("My Service").version("1");\n'})}),"\n",(0,r.jsx)(n.p,{children:"Initialize a OpenAPI builder."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenApiBuilder builder = new OpenApiBuilder(dictionary);\n"})}),"\n",(0,r.jsx)(n.p,{children:"Build the OpenAPI document"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenAPI document = builder.build().info(info);\n"})}),"\n",(0,r.jsx)(n.h3,{id:"converting-openapi-to-json-or-yaml",children:"Converting OpenAPI to JSON or YAML"}),"\n",(0,r.jsx)(n.p,{children:"We can directly convert to JSON:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiDocument openApiDocument = new OpenApiDocument(document, OpenApiDocument.Version.from("3.0"));\nString jsonOutput = openApiDocument.of(OpenApiDocument.MediaType.APPLICATION_JSON);\n'})}),"\n",(0,r.jsx)(n.p,{children:"We can directly convert to YAML as well:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiDocument openApiDocument = new OpenApiDocument(document, OpenApiDocument.Version.from("3.0"));\nString jsonOutput = openApiDocument.of(OpenApiDocument.MediaType.APPLICATION_YAML);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"configure-jax-rs-endpoint",children:"Configure JAX-RS Endpoint"}),"\n",(0,r.jsxs)(n.p,{children:["Or we can use the OpenAPI document directly to configure the ",(0,r.jsx)(n.a,{href:"https://github.com/yahoo/elide/blob/master/elide-swagger/src/main/java/com/yahoo/elide/swagger/resources/ApiDocsEndpoint.java",children:"provided JAX-RS Endpoint"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'List apiDocs = new ArrayList<>();\nOpenAPI openApi = new OpenAPI();\napiDocs.add(new ApiDocsEndpoint.ApiDocsRegistration("test", () -> openApi, "3.0", ""));\n\n//Dependency Inject the ApiDocsEndpoint JAX-RS resource\nbind(apiDocs).named("apiDocs").to(new TypeLiteral>() { });\n'})}),"\n",(0,r.jsx)(n.h3,{id:"supporting-oauth",children:"Supporting OAuth"}),"\n",(0,r.jsx)(n.p,{children:"If we want Swagger UI to acquire & use a bearer token from an OAuth identity provider, we can configure\nthe OpenAPI document similar to:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'SecurityScheme oauthDef = new SecurityScheme()\n .name("bearerAuth")\n .type(SecurityScheme.Type.HTTP)\n .bearerFormat("JWT")\n .scheme("bearer");\nSecurityRequirement oauthReq = new SecurityRequirement().addList("bearerAuth");\n\nOpenApiBuilder builder = new OpenApiBuilder(entityDictionary);\nOpenAPI document = builder.build();\ndocument.addSecurityItem(oauthReq);\ndocument.getComponents().addSecuritySchemes("bearerAuth", oauthDef);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"adding-a-global-parameter",children:"Adding a global parameter"}),"\n",(0,r.jsx)(n.p,{children:"A query or header parameter can be added globally to all Elide API endpoints:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Parameter oauthParam = new Parameter()\n .in("Header")\n .name("Authorization")\n .schema(new StringSchema())\n .description("OAuth bearer token")\n .required(false);\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).globalParameter(oauthParam);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"adding-a-global-response-code",children:"Adding a global response code"}),"\n",(0,r.jsx)(n.p,{children:"An HTTP response can be added globally to all Elide API endpoints:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ApiResponse rateLimitedResponse = new ApiResponse().description("Too Many Requests");\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).globalResponse(429, rateLimitedResponse);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"performance",children:"Performance"}),"\n",(0,r.jsx)(n.h3,{id:"path-generation",children:"Path Generation"}),"\n",(0,r.jsx)(n.p,{children:"The Swagger UI is very slow when the number of generated URL paths exceeds a few dozen. For large, complex data models,\nit is recommended to generate separate OpenAPI documents for subgraphs of the model."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Set> entities = Set.of(\n ClassType.of(Book.class),\n ClassType.of(Author.class),\n ClassType.of(Publisher.class)\n);\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).managedClasses(entities);\n"})}),"\n",(0,r.jsxs)(n.p,{children:["In the example above, the ",(0,r.jsx)(n.code,{children:"OpenApiBuilder"})," will only generate paths that exclusively traverse the provided set of\nentities."]}),"\n",(0,r.jsx)(n.h3,{id:"document-size",children:"Document Size"}),"\n",(0,r.jsx)(n.p,{children:"The size of the OpenAPI document can be reduced significantly by limiting the number of filter operators that are used\nto generate query parameter documentation."}),"\n",(0,r.jsxs)(n.p,{children:["In this example, filter query parameters are only generated for the ",(0,r.jsx)(n.em,{children:"IN"})," operator."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenApiBuilder builder = new OpenApiBuilder(dictionary).filterOperators(Set.of(Operator.IN));\n"})}),"\n",(0,r.jsx)(n.h3,{id:"model-properties",children:"Model Properties"}),"\n",(0,r.jsxs)(n.p,{children:["Elide extracts the model description and title from the ",(0,r.jsx)(n.code,{children:"Schema"})," and ",(0,r.jsx)(n.code,{children:"Include"})," annotations and adds them to the OpenAPI\ndocumentation. ",(0,r.jsx)(n.code,{children:"Schema"})," has precedence over ",(0,r.jsx)(n.code,{children:"Include"})," if both are present."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Schema(description = "A book model description", title = "Book")\nclass Book {\n\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.code,{children:"Schema"})," only the ",(0,r.jsx)(n.em,{children:"description"})," and ",(0,r.jsx)(n.em,{children:"title"})," property is extracted. For the ",(0,r.jsx)(n.code,{children:"Include"})," annotation, the ",(0,r.jsx)(n.em,{children:"friendlyName"}),"\nis used as the ",(0,r.jsx)(n.em,{children:"title"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"attribute-properties",children:"Attribute Properties"}),"\n",(0,r.jsxs)(n.p,{children:["Elide extracts properties from the ",(0,r.jsx)(n.code,{children:"Schema"})," annotation and adds them to the OpenAPI documentation."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"class Book {\n\n @Schema(requiredMode = RequiredMode.REQUIRED)\n public String title;\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Only the ",(0,r.jsx)(n.em,{children:"required"}),", ",(0,r.jsx)(n.em,{children:"value"}),", ",(0,r.jsx)(n.em,{children:"example"}),", ",(0,r.jsx)(n.em,{children:"readOnly"}),", ",(0,r.jsx)(n.em,{children:"writeOnly"}),", ",(0,r.jsx)(n.em,{children:"requiredProperties"}),", ",(0,r.jsx)(n.em,{children:"requiredMode"})," and ",(0,r.jsx)(n.em,{children:"accessMode"}),"\nproperties are extracted. This is currently only supported for attributes on Elide models."]}),"\n",(0,r.jsx)(n.h2,{id:"api-versions",children:"API Versions"}),"\n",(0,r.jsx)(n.p,{children:"OpenAPI documents are tied to an explicit API version. When constructing a OpenAPI document, the API version must be set\nto match the API version of the models it will describe:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiBuilder builder = new OpenApiBuilder(dictionary).apiVersion("1");\nOpenAPI openApi = builder.build();\n'})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>o});var r=i(7294);const t={},s=r.createContext(t);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/ca7b880a.878b4208.js b/assets/js/ca7b880a.878b4208.js
new file mode 100644
index 00000000..fe8748b8
--- /dev/null
+++ b/assets/js/ca7b880a.878b4208.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4762],{9196:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>p,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=i(5893),t=i(1151);const s={sidebar_position:8,title:"OpenAPI",description:"JSON API documentations"},o=void 0,a={id:"elide/openapi",title:"OpenAPI",description:"JSON API documentations",source:"@site/docs/elide/openapi.md",sourceDirName:"elide",slug:"/elide/openapi",permalink:"/jersey-webservice-template/docs/elide/openapi",draft:!1,unlisted:!1,editUrl:"https://github.com/QubitPi/jersey-webservice-template/tree/master/docs/docs/elide/openapi.md",tags:[],version:"current",sidebarPosition:8,frontMatter:{sidebar_position:8,title:"OpenAPI",description:"JSON API documentations"},sidebar:"tutorialSidebar",previous:{title:"Logging & Audit",permalink:"/jersey-webservice-template/docs/elide/audit"},next:{title:"Configuration",permalink:"/jersey-webservice-template/docs/elide/configuration"}},d={},l=[{value:"Overview",id:"overview",level:2},{value:"Features Supported",id:"features-supported",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Converting OpenAPI to JSON or YAML",id:"converting-openapi-to-json-or-yaml",level:3},{value:"Configure JAX-RS Endpoint",id:"configure-jax-rs-endpoint",level:3},{value:"Supporting OAuth",id:"supporting-oauth",level:3},{value:"Adding a global parameter",id:"adding-a-global-parameter",level:3},{value:"Adding a global response code",id:"adding-a-global-response-code",level:3},{value:"Performance",id:"performance",level:2},{value:"Path Generation",id:"path-generation",level:3},{value:"Document Size",id:"document-size",level:3},{value:"Model Properties",id:"model-properties",level:3},{value:"Attribute Properties",id:"attribute-properties",level:3},{value:"API Versions",id:"api-versions",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(n.p,{children:["Elide supports the generation of ",(0,r.jsx)(n.a,{href:"https://www.openapis.org/",children:"OpenAPI"})," documentation from Elide annotated beans.\nSpecifically, it generates a JSON or YAML document conforming to the OpenAPI specification that can be used by tools\nlike ",(0,r.jsx)(n.a,{href:"http://swagger.io/",children:"Swagger UI"})," (among others) to explore, understand, and compose queries against our Elide API."]}),"\n",(0,r.jsxs)(n.p,{children:["Only JSON-API endpoints are documented. The GraphQL API schema can be explored directly with tools like\n",(0,r.jsx)(n.a,{href:"https://github.com/graphql/graphiql",children:"Graphiql"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"features-supported",children:"Features Supported"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"JaxRS Endpoint"})," - Elide ships with a customizable JaxRS endpoints that can publish one or more OpenAPI documents\nin both JSON or YAML."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Path Discovery"})," - Given a set of entities to explore, Elide will generate the minimum, cycle-free, de-duplicated\nset of URL paths in the OpenAPI document."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Filter by Primitive Attributes"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests on entity collections include filter parameters for each\nprimitive attribute."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Prune Fields"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support JSON-API sparse fields query parameter."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Include Top Level Relationships"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support the ability to include direct relationships."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Sort by Attribute"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support sort query parameters."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Pagination"})," - All ",(0,r.jsx)(n.em,{children:"GET"})," requests support pagination query parameters."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Permission Exposition"})," - Elide permissions are exported as documentation for entity schemas."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Model & Attribute Properties"})," - The ",(0,r.jsx)(n.em,{children:"required"}),", ",(0,r.jsx)(n.em,{children:"readOnly"}),", ",(0,r.jsx)(n.em,{children:"example"}),", ",(0,r.jsx)(n.em,{children:"value"}),", ",(0,r.jsx)(n.em,{children:"description"}),", ",(0,r.jsx)(n.em,{children:"title"}),",\n",(0,r.jsx)(n.em,{children:"accessMode"}),", ",(0,r.jsx)(n.em,{children:"requiredMode"})," fields are extracted from ",(0,r.jsx)(n.code,{children:"Schema"})," annotations."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API Version Support"})," - Elide can create separate documents for different API versions."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"getting-started",children:"Getting Started"}),"\n",(0,r.jsx)(n.p,{children:"Create and initialize an entity dictionary."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"EntityDictionary dictionary = EntityDictionary.builder().build();\n\ndictionary.bindEntity(Book.class);\ndictionary.bindEntity(Author.class);\ndictionary.bindEntity(Publisher.class);\n"})}),"\n",(0,r.jsx)(n.p,{children:"Create a Info object."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Info info = new Info().title("My Service").version("1");\n'})}),"\n",(0,r.jsx)(n.p,{children:"Initialize a OpenAPI builder."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenApiBuilder builder = new OpenApiBuilder(dictionary);\n"})}),"\n",(0,r.jsx)(n.p,{children:"Build the OpenAPI document"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenAPI document = builder.build().info(info);\n"})}),"\n",(0,r.jsx)(n.h3,{id:"converting-openapi-to-json-or-yaml",children:"Converting OpenAPI to JSON or YAML"}),"\n",(0,r.jsx)(n.p,{children:"We can directly convert to JSON:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiDocument openApiDocument = new OpenApiDocument(document, OpenApiDocument.Version.from("3.0"));\nString jsonOutput = openApiDocument.of(OpenApiDocument.MediaType.APPLICATION_JSON);\n'})}),"\n",(0,r.jsx)(n.p,{children:"We can directly convert to YAML as well:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiDocument openApiDocument = new OpenApiDocument(document, OpenApiDocument.Version.from("3.0"));\nString jsonOutput = openApiDocument.of(OpenApiDocument.MediaType.APPLICATION_YAML);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"configure-jax-rs-endpoint",children:"Configure JAX-RS Endpoint"}),"\n",(0,r.jsxs)(n.p,{children:["Or we can use the OpenAPI document directly to configure the ",(0,r.jsx)(n.a,{href:"https://github.com/yahoo/elide/blob/master/elide-swagger/src/main/java/com/yahoo/elide/swagger/resources/ApiDocsEndpoint.java",children:"provided JAX-RS Endpoint"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'List apiDocs = new ArrayList<>();\nOpenAPI openApi = new OpenAPI();\napiDocs.add(new ApiDocsEndpoint.ApiDocsRegistration("test", () -> openApi, "3.0", ""));\n\n//Dependency Inject the ApiDocsEndpoint JAX-RS resource\nbind(apiDocs).named("apiDocs").to(new TypeLiteral>() { });\n'})}),"\n",(0,r.jsx)(n.h3,{id:"supporting-oauth",children:"Supporting OAuth"}),"\n",(0,r.jsx)(n.p,{children:"If we want Swagger UI to acquire & use a bearer token from an OAuth identity provider, we can configure\nthe OpenAPI document similar to:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'SecurityScheme oauthDef = new SecurityScheme()\n .name("bearerAuth")\n .type(SecurityScheme.Type.HTTP)\n .bearerFormat("JWT")\n .scheme("bearer");\nSecurityRequirement oauthReq = new SecurityRequirement().addList("bearerAuth");\n\nOpenApiBuilder builder = new OpenApiBuilder(entityDictionary);\nOpenAPI document = builder.build();\ndocument.addSecurityItem(oauthReq);\ndocument.getComponents().addSecuritySchemes("bearerAuth", oauthDef);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"adding-a-global-parameter",children:"Adding a global parameter"}),"\n",(0,r.jsx)(n.p,{children:"A query or header parameter can be added globally to all Elide API endpoints:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'Parameter oauthParam = new Parameter()\n .in("Header")\n .name("Authorization")\n .schema(new StringSchema())\n .description("OAuth bearer token")\n .required(false);\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).globalParameter(oauthParam);\n'})}),"\n",(0,r.jsx)(n.h3,{id:"adding-a-global-response-code",children:"Adding a global response code"}),"\n",(0,r.jsx)(n.p,{children:"An HTTP response can be added globally to all Elide API endpoints:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'ApiResponse rateLimitedResponse = new ApiResponse().description("Too Many Requests");\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).globalResponse(429, rateLimitedResponse);\n'})}),"\n",(0,r.jsx)(n.h2,{id:"performance",children:"Performance"}),"\n",(0,r.jsx)(n.h3,{id:"path-generation",children:"Path Generation"}),"\n",(0,r.jsx)(n.p,{children:"The Swagger UI is very slow when the number of generated URL paths exceeds a few dozen. For large, complex data models,\nit is recommended to generate separate OpenAPI documents for subgraphs of the model."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"Set> entities = Set.of(\n ClassType.of(Book.class),\n ClassType.of(Author.class),\n ClassType.of(Publisher.class)\n);\n\nOpenApiBuilder builder = new OpenApiBuilder(dictionary).managedClasses(entities);\n"})}),"\n",(0,r.jsxs)(n.p,{children:["In the example above, the ",(0,r.jsx)(n.code,{children:"OpenApiBuilder"})," will only generate paths that exclusively traverse the provided set of\nentities."]}),"\n",(0,r.jsx)(n.h3,{id:"document-size",children:"Document Size"}),"\n",(0,r.jsx)(n.p,{children:"The size of the OpenAPI document can be reduced significantly by limiting the number of filter operators that are used\nto generate query parameter documentation."}),"\n",(0,r.jsxs)(n.p,{children:["In this example, filter query parameters are only generated for the ",(0,r.jsx)(n.em,{children:"IN"})," operator."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"OpenApiBuilder builder = new OpenApiBuilder(dictionary).filterOperators(Set.of(Operator.IN));\n"})}),"\n",(0,r.jsx)(n.h3,{id:"model-properties",children:"Model Properties"}),"\n",(0,r.jsxs)(n.p,{children:["Elide extracts the model description and title from the ",(0,r.jsx)(n.code,{children:"Schema"})," and ",(0,r.jsx)(n.code,{children:"Include"})," annotations and adds them to the OpenAPI\ndocumentation. ",(0,r.jsx)(n.code,{children:"Schema"})," has precedence over ",(0,r.jsx)(n.code,{children:"Include"})," if both are present."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'@Schema(description = "A book model description", title = "Book")\nclass Book {\n\n}\n'})}),"\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.code,{children:"Schema"})," only the ",(0,r.jsx)(n.em,{children:"description"})," and ",(0,r.jsx)(n.em,{children:"title"})," property is extracted. For the ",(0,r.jsx)(n.code,{children:"Include"})," annotation, the ",(0,r.jsx)(n.em,{children:"friendlyName"}),"\nis used as the ",(0,r.jsx)(n.em,{children:"title"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"attribute-properties",children:"Attribute Properties"}),"\n",(0,r.jsxs)(n.p,{children:["Elide extracts properties from the ",(0,r.jsx)(n.code,{children:"Schema"})," annotation and adds them to the OpenAPI documentation."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:"class Book {\n\n @Schema(requiredMode = RequiredMode.REQUIRED)\n public String title;\n}\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Only the ",(0,r.jsx)(n.em,{children:"required"}),", ",(0,r.jsx)(n.em,{children:"value"}),", ",(0,r.jsx)(n.em,{children:"example"}),", ",(0,r.jsx)(n.em,{children:"readOnly"}),", ",(0,r.jsx)(n.em,{children:"writeOnly"}),", ",(0,r.jsx)(n.em,{children:"requiredProperties"}),", ",(0,r.jsx)(n.em,{children:"requiredMode"})," and ",(0,r.jsx)(n.em,{children:"accessMode"}),"\nproperties are extracted. This is currently only supported for attributes on Elide models."]}),"\n",(0,r.jsx)(n.h2,{id:"api-versions",children:"API Versions"}),"\n",(0,r.jsx)(n.p,{children:"OpenAPI documents are tied to an explicit API version. When constructing a OpenAPI document, the API version must be set\nto match the API version of the models it will describe:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-java",children:'OpenApiBuilder builder = new OpenApiBuilder(dictionary).apiVersion("1");\nOpenAPI openApi = builder.build();\n'})})]})}function p(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>a,a:()=>o});var r=i(7294);const t={},s=r.createContext(t);function o(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.622a2887.js b/assets/js/runtime~main.3fcbf991.js
similarity index 97%
rename from assets/js/runtime~main.622a2887.js
rename to assets/js/runtime~main.3fcbf991.js
index 32a75a53..aee664d9 100644
--- a/assets/js/runtime~main.622a2887.js
+++ b/assets/js/runtime~main.3fcbf991.js
@@ -1 +1 @@
-(()=>{"use strict";var e,d,a,f,c,b={},t={};function r(e){var d=t[e];if(void 0!==d)return d.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(d,a,f,c)=>{if(!a){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,f,c]},r.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return r.d(d,{a:d}),d},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};d=d||[null,a({}),a([]),a(a)];for(var t=2&f&&e;"object"==typeof t&&!~d.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((d=>b[d]=()=>e[d]));return b.default=()=>e,r.d(c,b),c},r.d=(e,d)=>{for(var a in d)r.o(d,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:d[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((d,a)=>(r.f[a](e,d),d)),[])),r.u=e=>"assets/js/"+({7:"14801c25",53:"935f2afb",158:"69ec54b8",299:"61d14240",355:"a8fe10c8",480:"7dfce774",611:"0ed972dc",618:"8f030830",881:"33df8b1e",1121:"af66285c",1354:"ccdd54c8",1574:"c32cfe41",1635:"59ea296f",1746:"524b9b73",1838:"8986ab40",2327:"ce6992b1",2366:"be06bf6d",2397:"bddc7183",2447:"2fb8fd14",2453:"0a2d206c",2535:"814f3328",2539:"dcb320db",2623:"65998a66",2835:"55c88f21",2992:"f4ccecdb",3021:"a8f74324",3031:"95fef0bb",3085:"1f391b9e",3089:"a6aa9e1f",3237:"1df93b7f",3266:"ab9f284a",3275:"d3a5e8e1",3441:"90acd7ea",3462:"58b2d929",3484:"01705bcb",3545:"db261029",3608:"9e4087bc",3799:"7503a204",3974:"33f5a029",4013:"01a85c17",4167:"67e1a4a6",4229:"c62a11e2",4282:"7e881839",4287:"0fe8a094",4341:"dd3399a6",4368:"a94703ab",4482:"8202ecb4",4762:"ca7b880a",4825:"b0c4e38f",4859:"5bda9bd8",4883:"03751d98",4905:"dc718134",4992:"4bb8f0b4",5001:"a07d0309",5204:"4693ed8c",5214:"dfd458d2",5310:"9e490c8c",5311:"0d8d076a",5581:"3847b3ea",5584:"100e7c33",5671:"8d9c266b",5681:"e63c8e4f",5717:"77ce8965",5742:"5a0dfef8",5751:"3adf0bec",5765:"afef3b27",5791:"348887ec",5856:"d56b0789",5987:"bbe2f409",6103:"ccc49370",6143:"3c618eb2",6160:"3be6df1b",6319:"95a7d8e6",6378:"c07525d3",6427:"f01bad79",6499:"53d9e20a",6567:"069c4011",6653:"db32d859",6757:"7cffda2c",6903:"b1a04edd",7120:"88b9697e",7338:"7f8f5eb1",7362:"9f4f599f",7414:"393be207",7545:"dfd0adcf",7752:"7f9b406a",7759:"dfdcf51a",7896:"8477c7d5",7918:"17896441",7920:"1a4e3797",8049:"1412db6a",8092:"84462809",8164:"9c9866af",8197:"9ce18c27",8361:"41fee3ee",8373:"4cb94163",8501:"cf780f3f",8518:"a7bd4aaa",8537:"7adf6cbf",8548:"4366c484",8558:"2f4b3249",8610:"6875c492",8726:"23a15255",9e3:"92cd3f2f",9004:"9ed00105",9158:"a25f9825",9189:"4696b8cd",9323:"5532a01d",9577:"9e15c67d",9661:"5e95c892",9671:"0e384e19",9817:"14eb3368",9984:"f3e840dc"}[e]||e)+"."+{7:"c62b32f8",53:"f986b212",158:"d099a204",299:"72402f42",355:"da073f7a",480:"dcffb946",611:"efe7bf42",618:"45fab44b",881:"a644f67b",1121:"eda96f66",1354:"ce680269",1426:"a9316fc0",1574:"46f5d42a",1635:"a141bde6",1746:"dee88825",1772:"064fa15d",1838:"d4e08ce6",2327:"f4212a64",2366:"97e6d1fb",2397:"7440c9ba",2447:"6b5f5e35",2453:"1668d962",2459:"05f27f0f",2535:"6421532e",2539:"a5af25cd",2623:"964b7372",2835:"f7eb96b6",2992:"f1aa69cd",3021:"67ae96ab",3031:"96ee959a",3085:"7370a231",3089:"de3be6cb",3237:"ce63a233",3266:"3891eac5",3275:"13409ec6",3441:"9b7973f1",3462:"0710202a",3484:"29090c5b",3545:"59542aa9",3608:"ce5f8463",3799:"f2033dec",3974:"64b4b595",4013:"7052e2cc",4167:"ce1d78d7",4229:"70462dfe",4282:"e6d545eb",4287:"70ecf626",4341:"1364199f",4368:"0d11e284",4482:"c49f9431",4762:"66651a6c",4825:"c1499821",4859:"4a96c460",4883:"d25f0ed2",4905:"e0d74ecd",4992:"72101790",5001:"5b0a8a74",5204:"38df1805",5214:"223b5984",5310:"857e97a2",5311:"f7d92b32",5581:"07d62c0b",5584:"87981098",5671:"01de06d3",5681:"04891bf3",5717:"84a6056a",5742:"655f417d",5751:"cb573923",5765:"c065d805",5791:"5085bd2d",5856:"7d6b4f76",5987:"e11d0519",6103:"6d85ac1e",6143:"75810742",6160:"e8aa1b75",6319:"68496373",6378:"0a3e891d",6427:"12c0dd6b",6499:"ee53658b",6567:"3e64f3b7",6653:"f502b0f1",6757:"2a03814a",6903:"ae66a937",6945:"e6ca558a",7120:"1e2bd629",7338:"d8b3b3f3",7362:"55b246aa",7414:"b4fdb880",7545:"aa61dcc3",7752:"ff0b8406",7759:"b2e74fef",7896:"2e31b1aa",7918:"76b1d975",7920:"cde26130",8049:"c6fcbbb2",8092:"f264d731",8164:"289ca89d",8197:"3018393f",8361:"69c992c1",8373:"3894021a",8501:"cbbceafa",8518:"d34dd8d0",8537:"d8230a90",8548:"8849a374",8558:"0320a9fc",8610:"70de5505",8726:"0de55ce4",8894:"547a1c8d",9e3:"93c2a192",9004:"9dbc113e",9158:"477c8acc",9189:"564f2d2e",9323:"357703c5",9577:"20a01c8a",9661:"98428f0c",9671:"751fb6fc",9677:"faf0bd3a",9817:"09afd2f4",9984:"3f370004"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),f={},c="docs:",r.l=(e,d,a,b)=>{if(f[e])f[e].push(d);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(a))),d)return d(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/jersey-webservice-template/",r.gca=function(e){return e={17896441:"7918",84462809:"8092","14801c25":"7","935f2afb":"53","69ec54b8":"158","61d14240":"299",a8fe10c8:"355","7dfce774":"480","0ed972dc":"611","8f030830":"618","33df8b1e":"881",af66285c:"1121",ccdd54c8:"1354",c32cfe41:"1574","59ea296f":"1635","524b9b73":"1746","8986ab40":"1838",ce6992b1:"2327",be06bf6d:"2366",bddc7183:"2397","2fb8fd14":"2447","0a2d206c":"2453","814f3328":"2535",dcb320db:"2539","65998a66":"2623","55c88f21":"2835",f4ccecdb:"2992",a8f74324:"3021","95fef0bb":"3031","1f391b9e":"3085",a6aa9e1f:"3089","1df93b7f":"3237",ab9f284a:"3266",d3a5e8e1:"3275","90acd7ea":"3441","58b2d929":"3462","01705bcb":"3484",db261029:"3545","9e4087bc":"3608","7503a204":"3799","33f5a029":"3974","01a85c17":"4013","67e1a4a6":"4167",c62a11e2:"4229","7e881839":"4282","0fe8a094":"4287",dd3399a6:"4341",a94703ab:"4368","8202ecb4":"4482",ca7b880a:"4762",b0c4e38f:"4825","5bda9bd8":"4859","03751d98":"4883",dc718134:"4905","4bb8f0b4":"4992",a07d0309:"5001","4693ed8c":"5204",dfd458d2:"5214","9e490c8c":"5310","0d8d076a":"5311","3847b3ea":"5581","100e7c33":"5584","8d9c266b":"5671",e63c8e4f:"5681","77ce8965":"5717","5a0dfef8":"5742","3adf0bec":"5751",afef3b27:"5765","348887ec":"5791",d56b0789:"5856",bbe2f409:"5987",ccc49370:"6103","3c618eb2":"6143","3be6df1b":"6160","95a7d8e6":"6319",c07525d3:"6378",f01bad79:"6427","53d9e20a":"6499","069c4011":"6567",db32d859:"6653","7cffda2c":"6757",b1a04edd:"6903","88b9697e":"7120","7f8f5eb1":"7338","9f4f599f":"7362","393be207":"7414",dfd0adcf:"7545","7f9b406a":"7752",dfdcf51a:"7759","8477c7d5":"7896","1a4e3797":"7920","1412db6a":"8049","9c9866af":"8164","9ce18c27":"8197","41fee3ee":"8361","4cb94163":"8373",cf780f3f:"8501",a7bd4aaa:"8518","7adf6cbf":"8537","4366c484":"8548","2f4b3249":"8558","6875c492":"8610","23a15255":"8726","92cd3f2f":"9000","9ed00105":"9004",a25f9825:"9158","4696b8cd":"9189","5532a01d":"9323","9e15c67d":"9577","5e95c892":"9661","0e384e19":"9671","14eb3368":"9817",f3e840dc:"9984"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(d,a)=>{var f=r.o(e,d)?e[d]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1303|532)$/.test(d))e[d]=0;else{var c=new Promise(((a,c)=>f=e[d]=[a,c]));a.push(f[2]=c);var b=r.p+r.u(d),t=new Error;r.l(b,(a=>{if(r.o(e,d)&&(0!==(f=e[d])&&(e[d]=void 0),f)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+d+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+d,d)}},r.O.j=d=>0===e[d];var d=(d,a)=>{var f,c,b=a[0],t=a[1],o=a[2],n=0;if(b.some((d=>0!==e[d]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(d&&d(a);n{"use strict";var e,d,a,f,c,b={},t={};function r(e){var d=t[e];if(void 0!==d)return d.exports;var a=t[e]={exports:{}};return b[e].call(a.exports,a,a.exports,r),a.exports}r.m=b,e=[],r.O=(d,a,f,c)=>{if(!a){var b=1/0;for(i=0;i=c)&&Object.keys(r.O).every((e=>r.O[e](a[o])))?a.splice(o--,1):(t=!1,c0&&e[i-1][2]>c;i--)e[i]=e[i-1];e[i]=[a,f,c]},r.n=e=>{var d=e&&e.__esModule?()=>e.default:()=>e;return r.d(d,{a:d}),d},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var c=Object.create(null);r.r(c);var b={};d=d||[null,a({}),a([]),a(a)];for(var t=2&f&&e;"object"==typeof t&&!~d.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach((d=>b[d]=()=>e[d]));return b.default=()=>e,r.d(c,b),c},r.d=(e,d)=>{for(var a in d)r.o(d,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:d[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((d,a)=>(r.f[a](e,d),d)),[])),r.u=e=>"assets/js/"+({7:"14801c25",53:"935f2afb",158:"69ec54b8",299:"61d14240",355:"a8fe10c8",480:"7dfce774",611:"0ed972dc",618:"8f030830",881:"33df8b1e",1121:"af66285c",1354:"ccdd54c8",1574:"c32cfe41",1635:"59ea296f",1746:"524b9b73",1838:"8986ab40",2327:"ce6992b1",2366:"be06bf6d",2397:"bddc7183",2447:"2fb8fd14",2453:"0a2d206c",2535:"814f3328",2539:"dcb320db",2623:"65998a66",2835:"55c88f21",2992:"f4ccecdb",3021:"a8f74324",3031:"95fef0bb",3085:"1f391b9e",3089:"a6aa9e1f",3237:"1df93b7f",3266:"ab9f284a",3275:"d3a5e8e1",3441:"90acd7ea",3462:"58b2d929",3484:"01705bcb",3545:"db261029",3608:"9e4087bc",3799:"7503a204",3974:"33f5a029",4013:"01a85c17",4167:"67e1a4a6",4229:"c62a11e2",4282:"7e881839",4287:"0fe8a094",4341:"dd3399a6",4368:"a94703ab",4482:"8202ecb4",4762:"ca7b880a",4825:"b0c4e38f",4859:"5bda9bd8",4883:"03751d98",4905:"dc718134",4992:"4bb8f0b4",5001:"a07d0309",5204:"4693ed8c",5214:"dfd458d2",5310:"9e490c8c",5311:"0d8d076a",5581:"3847b3ea",5584:"100e7c33",5671:"8d9c266b",5681:"e63c8e4f",5717:"77ce8965",5742:"5a0dfef8",5751:"3adf0bec",5765:"afef3b27",5791:"348887ec",5856:"d56b0789",5987:"bbe2f409",6103:"ccc49370",6143:"3c618eb2",6160:"3be6df1b",6319:"95a7d8e6",6378:"c07525d3",6427:"f01bad79",6499:"53d9e20a",6567:"069c4011",6653:"db32d859",6757:"7cffda2c",6903:"b1a04edd",7120:"88b9697e",7338:"7f8f5eb1",7362:"9f4f599f",7414:"393be207",7545:"dfd0adcf",7752:"7f9b406a",7759:"dfdcf51a",7896:"8477c7d5",7918:"17896441",7920:"1a4e3797",8049:"1412db6a",8092:"84462809",8164:"9c9866af",8197:"9ce18c27",8361:"41fee3ee",8373:"4cb94163",8501:"cf780f3f",8518:"a7bd4aaa",8537:"7adf6cbf",8548:"4366c484",8558:"2f4b3249",8610:"6875c492",8726:"23a15255",9e3:"92cd3f2f",9004:"9ed00105",9158:"a25f9825",9189:"4696b8cd",9323:"5532a01d",9577:"9e15c67d",9661:"5e95c892",9671:"0e384e19",9817:"14eb3368",9984:"f3e840dc"}[e]||e)+"."+{7:"c62b32f8",53:"1387216e",158:"d099a204",299:"72402f42",355:"da073f7a",480:"dcffb946",611:"efe7bf42",618:"45fab44b",881:"a644f67b",1121:"eda96f66",1354:"ce680269",1426:"a9316fc0",1574:"46f5d42a",1635:"a141bde6",1746:"94fb2ff7",1772:"064fa15d",1838:"d4e08ce6",2327:"f4212a64",2366:"97e6d1fb",2397:"7440c9ba",2447:"6b5f5e35",2453:"1668d962",2459:"05f27f0f",2535:"6421532e",2539:"a5af25cd",2623:"964b7372",2835:"f7eb96b6",2992:"f1aa69cd",3021:"67ae96ab",3031:"96ee959a",3085:"7370a231",3089:"de3be6cb",3237:"ce63a233",3266:"3891eac5",3275:"13409ec6",3441:"9b7973f1",3462:"0710202a",3484:"29090c5b",3545:"59542aa9",3608:"ce5f8463",3799:"f2033dec",3974:"64b4b595",4013:"7052e2cc",4167:"ce1d78d7",4229:"70462dfe",4282:"e6d545eb",4287:"70ecf626",4341:"1364199f",4368:"0d11e284",4482:"c49f9431",4762:"878b4208",4825:"c1499821",4859:"4a96c460",4883:"d25f0ed2",4905:"e0d74ecd",4992:"72101790",5001:"5b0a8a74",5204:"38df1805",5214:"223b5984",5310:"857e97a2",5311:"f7d92b32",5581:"07d62c0b",5584:"87981098",5671:"01de06d3",5681:"04891bf3",5717:"84a6056a",5742:"655f417d",5751:"cb573923",5765:"c065d805",5791:"5085bd2d",5856:"7d6b4f76",5987:"e11d0519",6103:"6d85ac1e",6143:"75810742",6160:"e8aa1b75",6319:"68496373",6378:"0a3e891d",6427:"12c0dd6b",6499:"ee53658b",6567:"3e64f3b7",6653:"f502b0f1",6757:"2a03814a",6903:"ae66a937",6945:"e6ca558a",7120:"1e2bd629",7338:"d8b3b3f3",7362:"55b246aa",7414:"b4fdb880",7545:"aa61dcc3",7752:"ff0b8406",7759:"b2e74fef",7896:"2e31b1aa",7918:"76b1d975",7920:"cde26130",8049:"c6fcbbb2",8092:"f264d731",8164:"289ca89d",8197:"3018393f",8361:"69c992c1",8373:"3894021a",8501:"cbbceafa",8518:"d34dd8d0",8537:"d8230a90",8548:"8849a374",8558:"0320a9fc",8610:"70de5505",8726:"0de55ce4",8894:"547a1c8d",9e3:"93c2a192",9004:"9dbc113e",9158:"477c8acc",9189:"564f2d2e",9323:"357703c5",9577:"20a01c8a",9661:"98428f0c",9671:"751fb6fc",9677:"faf0bd3a",9817:"09afd2f4",9984:"3f370004"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,d)=>Object.prototype.hasOwnProperty.call(e,d),f={},c="docs:",r.l=(e,d,a,b)=>{if(f[e])f[e].push(d);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var c=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),c&&c.forEach((e=>e(a))),d)return d(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/jersey-webservice-template/",r.gca=function(e){return e={17896441:"7918",84462809:"8092","14801c25":"7","935f2afb":"53","69ec54b8":"158","61d14240":"299",a8fe10c8:"355","7dfce774":"480","0ed972dc":"611","8f030830":"618","33df8b1e":"881",af66285c:"1121",ccdd54c8:"1354",c32cfe41:"1574","59ea296f":"1635","524b9b73":"1746","8986ab40":"1838",ce6992b1:"2327",be06bf6d:"2366",bddc7183:"2397","2fb8fd14":"2447","0a2d206c":"2453","814f3328":"2535",dcb320db:"2539","65998a66":"2623","55c88f21":"2835",f4ccecdb:"2992",a8f74324:"3021","95fef0bb":"3031","1f391b9e":"3085",a6aa9e1f:"3089","1df93b7f":"3237",ab9f284a:"3266",d3a5e8e1:"3275","90acd7ea":"3441","58b2d929":"3462","01705bcb":"3484",db261029:"3545","9e4087bc":"3608","7503a204":"3799","33f5a029":"3974","01a85c17":"4013","67e1a4a6":"4167",c62a11e2:"4229","7e881839":"4282","0fe8a094":"4287",dd3399a6:"4341",a94703ab:"4368","8202ecb4":"4482",ca7b880a:"4762",b0c4e38f:"4825","5bda9bd8":"4859","03751d98":"4883",dc718134:"4905","4bb8f0b4":"4992",a07d0309:"5001","4693ed8c":"5204",dfd458d2:"5214","9e490c8c":"5310","0d8d076a":"5311","3847b3ea":"5581","100e7c33":"5584","8d9c266b":"5671",e63c8e4f:"5681","77ce8965":"5717","5a0dfef8":"5742","3adf0bec":"5751",afef3b27:"5765","348887ec":"5791",d56b0789:"5856",bbe2f409:"5987",ccc49370:"6103","3c618eb2":"6143","3be6df1b":"6160","95a7d8e6":"6319",c07525d3:"6378",f01bad79:"6427","53d9e20a":"6499","069c4011":"6567",db32d859:"6653","7cffda2c":"6757",b1a04edd:"6903","88b9697e":"7120","7f8f5eb1":"7338","9f4f599f":"7362","393be207":"7414",dfd0adcf:"7545","7f9b406a":"7752",dfdcf51a:"7759","8477c7d5":"7896","1a4e3797":"7920","1412db6a":"8049","9c9866af":"8164","9ce18c27":"8197","41fee3ee":"8361","4cb94163":"8373",cf780f3f:"8501",a7bd4aaa:"8518","7adf6cbf":"8537","4366c484":"8548","2f4b3249":"8558","6875c492":"8610","23a15255":"8726","92cd3f2f":"9000","9ed00105":"9004",a25f9825:"9158","4696b8cd":"9189","5532a01d":"9323","9e15c67d":"9577","5e95c892":"9661","0e384e19":"9671","14eb3368":"9817",f3e840dc:"9984"}[e]||e,r.p+r.u(e)},(()=>{var e={1303:0,532:0};r.f.j=(d,a)=>{var f=r.o(e,d)?e[d]:void 0;if(0!==f)if(f)a.push(f[2]);else if(/^(1303|532)$/.test(d))e[d]=0;else{var c=new Promise(((a,c)=>f=e[d]=[a,c]));a.push(f[2]=c);var b=r.p+r.u(d),t=new Error;r.l(b,(a=>{if(r.o(e,d)&&(0!==(f=e[d])&&(e[d]=void 0),f)){var c=a&&("load"===a.type?"missing":a.type),b=a&&a.target&&a.target.src;t.message="Loading chunk "+d+" failed.\n("+c+": "+b+")",t.name="ChunkLoadError",t.type=c,t.request=b,f[1](t)}}),"chunk-"+d,d)}},r.O.j=d=>0===e[d];var d=(d,a)=>{var f,c,b=a[0],t=a[1],o=a[2],n=0;if(b.some((d=>0!==e[d]))){for(f in t)r.o(t,f)&&(r.m[f]=t[f]);if(o)var i=o(r)}for(d&&d(a);n
-
+
diff --git a/blog/bearer-authentication/index.html b/blog/bearer-authentication/index.html
index 70b69e85..07f85307 100644
--- a/blog/bearer-authentication/index.html
+++ b/blog/bearer-authentication/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/defensive-copy/index.html b/blog/defensive-copy/index.html
index c0d7b2f0..46307ca2 100644
--- a/blog/defensive-copy/index.html
+++ b/blog/defensive-copy/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/env-var-in-pom/index.html b/blog/env-var-in-pom/index.html
index 86eab44a..c2410c79 100644
--- a/blog/env-var-in-pom/index.html
+++ b/blog/env-var-in-pom/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/happy-path/index.html b/blog/happy-path/index.html
index 37fde58f..fa6aa52f 100644
--- a/blog/happy-path/index.html
+++ b/blog/happy-path/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/index.html b/blog/index.html
index f27f4717..6a06cbe7 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/java-ee/index.html b/blog/java-ee/index.html
index 1d7c2d27..443b607e 100644
--- a/blog/java-ee/index.html
+++ b/blog/java-ee/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/java-env-properties/index.html b/blog/java-env-properties/index.html
index 74d0a41b..4f485057 100644
--- a/blog/java-env-properties/index.html
+++ b/blog/java-env-properties/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/java-optional/index.html b/blog/java-optional/index.html
index 28d72e85..bf5765b6 100644
--- a/blog/java-optional/index.html
+++ b/blog/java-optional/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/java-stream/index.html b/blog/java-stream/index.html
index d4bb24a5..fa637f5b 100644
--- a/blog/java-stream/index.html
+++ b/blog/java-stream/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/jpql/index.html b/blog/jpql/index.html
index 95283f64..9abed3f0 100644
--- a/blog/jpql/index.html
+++ b/blog/jpql/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/mysql-polymorphism/index.html b/blog/mysql-polymorphism/index.html
index 7991e4e1..596ca0cd 100644
--- a/blog/mysql-polymorphism/index.html
+++ b/blog/mysql-polymorphism/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/mysql-programming/index.html b/blog/mysql-programming/index.html
index eabef018..4f4c5d19 100644
--- a/blog/mysql-programming/index.html
+++ b/blog/mysql-programming/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/mysql-security/index.html b/blog/mysql-security/index.html
index 99ef10ba..9c6248ee 100644
--- a/blog/mysql-security/index.html
+++ b/blog/mysql-security/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/mysql-troubleshooting/index.html b/blog/mysql-troubleshooting/index.html
index 3968a452..4dc30440 100644
--- a/blog/mysql-troubleshooting/index.html
+++ b/blog/mysql-troubleshooting/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/oracle-programming/index.html b/blog/oracle-programming/index.html
index a49f00e0..e74d856c 100644
--- a/blog/oracle-programming/index.html
+++ b/blog/oracle-programming/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/page/2/index.html b/blog/page/2/index.html
index 917684d9..78ccde3b 100644
--- a/blog/page/2/index.html
+++ b/blog/page/2/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/provider/index.html b/blog/provider/index.html
index 52e9d5d6..998f5060 100644
--- a/blog/provider/index.html
+++ b/blog/provider/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/put-vs-post/index.html b/blog/put-vs-post/index.html
index 5475f9ea..2279d06a 100644
--- a/blog/put-vs-post/index.html
+++ b/blog/put-vs-post/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/querydsl/index.html b/blog/querydsl/index.html
index ba061a16..1340a536 100644
--- a/blog/querydsl/index.html
+++ b/blog/querydsl/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/read-avro-command-line/index.html b/blog/read-avro-command-line/index.html
index f94b4a57..265c297c 100644
--- a/blog/read-avro-command-line/index.html
+++ b/blog/read-avro-command-line/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/restassured-json/index.html b/blog/restassured-json/index.html
index 61194f90..fd3fc628 100644
--- a/blog/restassured-json/index.html
+++ b/blog/restassured-json/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/apache-avro/index.html b/blog/tags/apache-avro/index.html
index 637dcb0c..3456f23e 100644
--- a/blog/tags/apache-avro/index.html
+++ b/blog/tags/apache-avro/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/database/index.html b/blog/tags/database/index.html
index 76a7ed57..5fcd1bc8 100644
--- a/blog/tags/database/index.html
+++ b/blog/tags/database/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/index.html b/blog/tags/index.html
index 4dc01abe..387abd26 100644
--- a/blog/tags/index.html
+++ b/blog/tags/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/java/index.html b/blog/tags/java/index.html
index b0d19358..4beb3c21 100644
--- a/blog/tags/java/index.html
+++ b/blog/tags/java/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/java/page/2/index.html b/blog/tags/java/page/2/index.html
index 62755cba..33c75adc 100644
--- a/blog/tags/java/page/2/index.html
+++ b/blog/tags/java/page/2/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/jpa/index.html b/blog/tags/jpa/index.html
index 30a4f011..0780765c 100644
--- a/blog/tags/jpa/index.html
+++ b/blog/tags/jpa/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/jqpl/index.html b/blog/tags/jqpl/index.html
index 9b5a5b95..fa8485e7 100644
--- a/blog/tags/jqpl/index.html
+++ b/blog/tags/jqpl/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/maven/index.html b/blog/tags/maven/index.html
index ea0a0cd4..6e670758 100644
--- a/blog/tags/maven/index.html
+++ b/blog/tags/maven/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/my-sql/index.html b/blog/tags/my-sql/index.html
index 80f7dc67..1798b912 100644
--- a/blog/tags/my-sql/index.html
+++ b/blog/tags/my-sql/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/oracle/index.html b/blog/tags/oracle/index.html
index 8e087c4f..cfd6e6f3 100644
--- a/blog/tags/oracle/index.html
+++ b/blog/tags/oracle/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/security/index.html b/blog/tags/security/index.html
index db65a603..719fe350 100644
--- a/blog/tags/security/index.html
+++ b/blog/tags/security/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/standard/index.html b/blog/tags/standard/index.html
index 8b77200d..d3388693 100644
--- a/blog/tags/standard/index.html
+++ b/blog/tags/standard/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/testing/index.html b/blog/tags/testing/index.html
index a8c6c805..0e3c4813 100644
--- a/blog/tags/testing/index.html
+++ b/blog/tags/testing/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/tags/webservice/index.html b/blog/tags/webservice/index.html
index f5a75ac0..2ffd4112 100644
--- a/blog/tags/webservice/index.html
+++ b/blog/tags/webservice/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/blog/weak-references/index.html b/blog/weak-references/index.html
index 1d840c31..f551c35a 100644
--- a/blog/weak-references/index.html
+++ b/blog/weak-references/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/category/client-apis/index.html b/docs/category/client-apis/index.html
index e4eb4c9b..da4a2b5d 100644
--- a/docs/category/client-apis/index.html
+++ b/docs/category/client-apis/index.html
@@ -9,7 +9,7 @@
-
+
diff --git a/docs/category/jpa-through-yahooelide/index.html b/docs/category/jpa-through-yahooelide/index.html
index 81be3b8e..9b7b3143 100644
--- a/docs/category/jpa-through-yahooelide/index.html
+++ b/docs/category/jpa-through-yahooelide/index.html
@@ -9,10 +9,10 @@
-
+
-