This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git

commit 167c3358564295ec3e28113bb9242d28500674ea
Author: Martin Stockhammer <[email protected]>
AuthorDate: Mon Jun 22 20:08:22 2020 +0200

    Moving from enunciate to OpenAPI documentation
---
 .../archiva-rest/archiva-rest-api/pom.xml          | 134 ++++++++++++-
 .../enunciate/{enunciate.xml => enunciate.xml.org} |   2 +
 .../api/services/ArchivaAdministrationService.java |  86 +++++----
 .../ArchivaRuntimeConfigurationService.java        |   2 +
 .../archiva/rest/api/services/BrowseService.java   |   2 +
 .../archiva/rest/api/services/CommonServices.java  |   2 +
 .../api/services/ManagedRepositoriesService.java   |   6 +
 .../api/services/MergeRepositoriesService.java     |   2 +
 .../rest/api/services/NetworkProxyService.java     |   2 +
 .../archiva/rest/api/services/PingService.java     |   2 +
 .../archiva/rest/api/services/PluginsService.java  |   2 +
 .../api/services/ProxyConnectorRuleService.java    |   2 +
 .../rest/api/services/ProxyConnectorService.java   |   2 +
 .../RedbackRuntimeConfigurationService.java        |   2 +
 .../api/services/RemoteRepositoriesService.java    |   6 +
 .../api/services/ReportRepositoriesService.java    |   2 +
 .../rest/api/services/RepositoriesService.java     |   2 +
 .../rest/api/services/RepositoryGroupService.java  |   2 +
 .../archiva/rest/api/services/SearchService.java   |   2 +
 .../rest/api/services/SystemStatusService.java     |   2 +
 .../src/main/resources/openapi-codegen-ignore      |   0
 .../src/main/resources/openapi-configuration.yaml  |  16 ++
 .../main/resources/templates/bodyParam.mustache    |   4 +
 .../main/resources/templates/formParam.mustache    |   3 +
 .../main/resources/templates/headerParam.mustache  |   3 +
 .../src/main/resources/templates/index.mustache    | 213 +++++++++++++++++++++
 .../main/resources/templates/pathParam.mustache    |   3 +
 .../main/resources/templates/queryParam.mustache   |   3 +
 .../main/resources/templates/style.css.mustache    | 172 +++++++++++++++++
 status-dep.txt                                     |  57 +++---
 30 files changed, 664 insertions(+), 74 deletions(-)

diff --git a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
index e50ff83..9a64d1d 100644
--- a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
+++ b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/pom.xml
@@ -31,50 +31,43 @@
   <properties>
     
<enunciate.docsDir>${project.build.outputDirectory}/rest-docs-archiva-rest-api</enunciate.docsDir>
     
<site.staging.base>${project.parent.parent.parent.basedir}</site.staging.base>
+    <swagger-maven-plugin-version>2.1.2</swagger-maven-plugin-version>
+    <io.swagger.version>2.1.2</io.swagger.version>
   </properties>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-security-common</artifactId>
-
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-repository-admin-api</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-policies</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>metadata-model</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva.maven</groupId>
       <artifactId>archiva-maven-model</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>archiva-repository-scanner</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>repository-statistics</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva</groupId>
       <artifactId>metadata-statistics-api</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.archiva.redback</groupId>
       <artifactId>redback-authorization-api</artifactId>
@@ -89,6 +82,42 @@
       <groupId>javax.ws.rs</groupId>
       <artifactId>javax.ws.rs-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-core</artifactId>
+      <scope>compile</scope>
+      <version>${io.swagger.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.ws.rs</groupId>
+          <artifactId>jsr311-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-jaxrs2</artifactId>
+      <version>${io.swagger.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.ws.rs</groupId>
+          <artifactId>jsr311-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-annotations</artifactId>
+      <version>${io.swagger.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.ws.rs</groupId>
+          <artifactId>jsr311-api</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+
     <!-- normally not needed but here for wadl feature currently in cxf -->
     <dependency>
       <groupId>org.apache.cxf</groupId>
@@ -105,6 +134,17 @@
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.rat</groupId>
+        <artifactId>apache-rat-plugin</artifactId>
+        <configuration>
+          <excludes>
+            <exclude>target/generated</exclude>
+            <exclude>src/main/resources/templates/*</exclude>
+            <exclude>src/main/resources/openapi-codegen-ignore</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-source-plugin</artifactId>
         <executions>
@@ -116,7 +156,83 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>io.swagger.core.v3</groupId>
+        <artifactId>swagger-maven-plugin</artifactId>
+        <version>${swagger-maven-plugin-version}</version>
+        <configuration>
+          <outputFileName>openapi</outputFileName>
+          <outputPath>${project.build.directory}/generated</outputPath>
+          <outputFormat>JSONANDYAML</outputFormat>
+          <resourcePackages>
+            <package>org.apache.archiva.rest.api</package>
+          </resourcePackages>
+          <prettyPrint>TRUE</prettyPrint>
+          
<configurationFilePath>${project.basedir}/src/main/resources/openapi-configuration.yaml</configurationFilePath>
+        </configuration>
+        <executions>
+          <execution>
+            <phase>compile</phase>
+            <goals>
+              <goal>resolve</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>io.swagger.codegen.v3</groupId>
+        <artifactId>swagger-codegen-maven-plugin</artifactId>
+        <version>3.0.20</version>
+        <executions>
+          <execution>
+            <phase>compile</phase>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              
<inputSpec>${project.build.directory}/generated/openapi.yaml</inputSpec>
+              <language>html</language>
+              <output>${project.build.directory}/generated-sources</output>
+              
<ignoreFileOverride>${project.basedir}/src/main/resources/openapi-codegen-ignore</ignoreFileOverride>
+              
<templateDirectory>${project.basedir}/src/main/resources/templates</templateDirectory>
+              
<supportingFilesToGenerate>index.html,index2.html</supportingFilesToGenerate>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
 
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>3.1.0</version>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>site</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              
<outputDirectory>${basedir}/target/site/openapi/</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>${project.build.directory}/generated</directory>  
       <!-- source directory -->
+                  <filtering>false</filtering>
+                  <include>openapi.json</include>
+                  <include>openapi.yaml</include>
+                </resource>
+                <resource>
+                  
<directory>${project.build.directory}/generated-sources/</directory>
+                  <filtering>false</filtering>
+                  <include>**/*</include>
+                  <exclude>.swagger-codegen/**</exclude>
+                  <exclude>.swagger-codegen-ignore</exclude>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org
similarity index 94%
rename from 
archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml
rename to 
archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org
index c0f27aa..3e1fe06 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/enunciate/enunciate.xml.org
@@ -23,6 +23,8 @@
   <title>Apache Archiva REST API</title>
   <modules>
 
+    <obj-c-xml-client disabled="true" />
+    <csharp-xml-client disabled="true" />
     <cxf disabled="false"/>
     <jersey disabled="true" />
     <c disabled="true"/>
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaAdministrationService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaAdministrationService.java
index 612ed0a..77544cc 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaAdministrationService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaAdministrationService.java
@@ -18,6 +18,9 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.FileType;
 import org.apache.archiva.admin.model.beans.LegacyArtifactPath;
 import org.apache.archiva.admin.model.beans.NetworkConfiguration;
@@ -42,32 +45,33 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path( "/archivaAdministrationService/" )
+@Tag( name = "Administration", description = "Admin Service" )
 public interface ArchivaAdministrationService
 {
     @Path( "getLegacyArtifactPaths" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<LegacyArtifactPath> getLegacyArtifactPaths()
+    List<LegacyArtifactPath> getLegacyArtifactPaths( )
         throws ArchivaRestServiceException;
 
     @Path( "deleteLegacyArtifactPath" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean deleteLegacyArtifactPath( @QueryParam( "path" ) String path )
         throws ArchivaRestServiceException;
 
     @Path( "addFileTypePattern" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean addFileTypePattern( @QueryParam( "fileTypeId" ) String fileTypeId, 
@QueryParam( "pattern" ) String pattern )
         throws ArchivaRestServiceException;
 
     @Path( "removeFileTypePattern" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean removeFileTypePattern( @QueryParam( "fileTypeId" ) String 
fileTypeId,
                                    @QueryParam( "pattern" ) String pattern )
@@ -75,35 +79,43 @@ public interface ArchivaAdministrationService
 
     @Path( "getFileType" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    FileType getFileType( @QueryParam( "fileTypeId" ) String fileTypeId )
+    @Operation(
+        summary = "Return the file type and its patterns",
+        description = "Returns a object that contains the file type and the 
configured patterns for this type"
+
+    )
+    FileType getFileType(
+        @Parameter( name = "fileTypeId", description = "The identifier of the 
file type",
+            allowEmptyValue = false, required = true )
+        @QueryParam( "fileTypeId" ) String fileTypeId )
         throws ArchivaRestServiceException;
 
     @Path( "addFileType" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void addFileType( FileType fileType )
         throws ArchivaRestServiceException;
 
     @Path( "removeFileType" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean removeFileType( @QueryParam( "fileTypeId" ) String fileTypeId )
         throws ArchivaRestServiceException;
 
     @Path( "enabledKnownContentConsumer/{knownContentConsumer}" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean enabledKnownContentConsumer( @PathParam( "knownContentConsumer" ) 
String knownContentConsumer )
         throws ArchivaRestServiceException;
 
     @Path( "enabledKnownContentConsumers" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void enabledKnownContentConsumers( List<String> knownContentConsumers )
         throws ArchivaRestServiceException;
@@ -111,44 +123,44 @@ public interface ArchivaAdministrationService
 
     @Path( "disabledKnownContentConsumer/{knownContentConsumer}" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean disabledKnownContentConsumer( @PathParam( "knownContentConsumer" ) 
String knownContentConsumer )
         throws ArchivaRestServiceException;
 
     @Path( "enabledInvalidContentConsumer/{invalidContentConsumer}" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean enabledInvalidContentConsumer( @PathParam( 
"invalidContentConsumer" ) String invalidContentConsumer )
         throws ArchivaRestServiceException;
 
     @Path( "enabledInvalidContentConsumers" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void enabledInvalidContentConsumers( List<String> invalidContentConsumers )
         throws ArchivaRestServiceException;
 
     @Path( "disabledInvalidContentConsumer/{invalidContentConsumer}" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     Boolean disabledInvalidContentConsumer( @PathParam( 
"invalidContentConsumer" ) String invalidContentConsumer )
         throws ArchivaRestServiceException;
 
     @Path( "getFileTypes" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<FileType> getFileTypes()
+    List<FileType> getFileTypes( )
         throws ArchivaRestServiceException;
 
     @Path( "getKnownContentConsumers" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<String> getKnownContentConsumers()
+    List<String> getKnownContentConsumers( )
         throws ArchivaRestServiceException;
 
     /**
@@ -156,9 +168,9 @@ public interface ArchivaAdministrationService
      */
     @Path( "getKnownContentAdminRepositoryConsumers" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<AdminRepositoryConsumer> getKnownContentAdminRepositoryConsumers()
+    List<AdminRepositoryConsumer> getKnownContentAdminRepositoryConsumers( )
         throws ArchivaRestServiceException;
 
     /**
@@ -166,49 +178,49 @@ public interface ArchivaAdministrationService
      */
     @Path( "getInvalidContentAdminRepositoryConsumers" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<AdminRepositoryConsumer> getInvalidContentAdminRepositoryConsumers()
+    List<AdminRepositoryConsumer> getInvalidContentAdminRepositoryConsumers( )
         throws ArchivaRestServiceException;
 
     @Path( "getInvalidContentConsumers" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    List<String> getInvalidContentConsumers()
+    List<String> getInvalidContentConsumers( )
         throws ArchivaRestServiceException;
 
     @Path( "getOrganisationInformation" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, 
MediaType.TEXT_PLAIN} )
     @RedbackAuthorization( noPermission = true, noRestriction = true )
-    OrganisationInformation getOrganisationInformation()
+    OrganisationInformation getOrganisationInformation( )
         throws ArchivaRestServiceException;
 
     @Path( "setOrganisationInformation" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void setOrganisationInformation( OrganisationInformation 
organisationInformation )
         throws ArchivaRestServiceException;
 
     @Path( "getUiConfiguration" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    UiConfiguration getUiConfiguration()
+    UiConfiguration getUiConfiguration( )
         throws ArchivaRestServiceException;
 
     @Path( "registrationDisabled" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    Boolean registrationDisabled()
+    Boolean registrationDisabled( )
         throws ArchivaRestServiceException;
 
     @Path( "setUiConfiguration" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void setUiConfiguration( UiConfiguration uiConfiguration )
         throws ArchivaRestServiceException;
@@ -220,20 +232,20 @@ public interface ArchivaAdministrationService
     @GET
     @Produces( MediaType.TEXT_PLAIN )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    String getApplicationUrl()
+    String getApplicationUrl( )
         throws ArchivaRestServiceException;
 
 
     @Path( "getNetworkConfiguration" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Produces( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
-    NetworkConfiguration getNetworkConfiguration()
+    NetworkConfiguration getNetworkConfiguration( )
         throws ArchivaRestServiceException;
 
     @Path( "setNetworkConfiguration" )
     @POST
-    @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+    @Consumes( {MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML} )
     @RedbackAuthorization( permissions = 
ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION )
     void setNetworkConfiguration( NetworkConfiguration networkConfiguration )
         throws ArchivaRestServiceException;
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRuntimeConfigurationService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRuntimeConfigurationService.java
index f3f6274..ba1f946 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRuntimeConfigurationService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ArchivaRuntimeConfigurationService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.ArchivaRuntimeConfiguration;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -34,6 +35,7 @@ import javax.ws.rs.core.MediaType;
  * @since 1.4-M4
  */
 @Path( "/archivaRuntimeConfigurationService/" )
+@Tag( name="Configuration" )
 public interface ArchivaRuntimeConfigurationService
 {
     @Path( "archivaRuntimeConfiguration" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
index cdb99eb..43d2d52 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/BrowseService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.maven2.model.Artifact;
 import org.apache.archiva.maven2.model.TreeEntry;
@@ -46,6 +47,7 @@ import java.util.List;
  * @since 1.4-M3
  */
 @Path("/browseService/")
+@Tag( name = "Browse", description = "Repository Browse Service")
 public interface BrowseService
 {
     @Path("rootGroups")
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/CommonServices.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/CommonServices.java
index 119f121..9589a10 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/CommonServices.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/CommonServices.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 
 import javax.ws.rs.GET;
@@ -33,6 +34,7 @@ import javax.ws.rs.core.MediaType;
  * @since 1.4-M3
  */
 @Path( "/commonServices/" )
+@Tag( name="ArchivaCommon" )
 public interface CommonServices
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ManagedRepositoriesService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ManagedRepositoriesService.java
index c5dc6c8..c2df283 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ManagedRepositoriesService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ManagedRepositoriesService.java
@@ -19,6 +19,8 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.tags.Tags;
 import org.apache.archiva.admin.model.beans.ManagedRepository;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.rest.api.model.ArchivaRepositoryStatistics;
@@ -39,6 +41,10 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path( "/managedRepositoriesService/" )
+@Tags( {
+    @Tag( name = "ManagedRepositories", description = "Administration for 
managed repositories" ),
+    @Tag( name = "Repositories" )
+})
 public interface ManagedRepositoriesService
 {
     @Path( "getManagedRepositories" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/MergeRepositoriesService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/MergeRepositoriesService.java
index d2f4bb0..0d38133 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/MergeRepositoriesService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/MergeRepositoriesService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.maven2.model.Artifact;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -36,6 +37,7 @@ import java.util.List;
  * @since 1.4-M3
  */
 @Path ("/mergeRepositoriesService/")
+@Tag(name="RepositoryMerge", description = "Merging repositories")
 public interface MergeRepositoriesService
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/NetworkProxyService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/NetworkProxyService.java
index b17c300..be5489e 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/NetworkProxyService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/NetworkProxyService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.NetworkProxy;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -36,6 +37,7 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path( "/networkProxyService/" )
+@Tag(name="Proxy", description = "Managing Network Proxies")
 public interface NetworkProxyService
 {
     @Path( "getNetworkProxies" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PingService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PingService.java
index ac36236..b1016b8 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PingService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PingService.java
@@ -19,6 +19,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 
 import javax.ws.rs.GET;
@@ -31,6 +32,7 @@ import javax.ws.rs.core.MediaType;
  * @since 1.4-M1
  */
 @Path( "/pingService/" )
+@Tag(name="Ping")
 public interface PingService
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PluginsService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PluginsService.java
index 8748ee6..7b105d0 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PluginsService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/PluginsService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 
 import javax.ws.rs.GET;
@@ -32,6 +33,7 @@ import javax.ws.rs.core.MediaType;
  * @since 1.4.0
  */
 @Path("/pluginsService/")
+@Tag( name="Plugins" )
 public interface PluginsService
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorRuleService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorRuleService.java
index 206525a..1399eff 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorRuleService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorRuleService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.ProxyConnectorRule;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -37,6 +38,7 @@ import java.util.List;
  * @since 1.4-M3
  */
 @Path ( "/proxyConnectorRuleService/" )
+@Tag(name="Proxy-Repository", description="Handling of proxy repositories that 
delegate to remote repositories")
 public interface ProxyConnectorRuleService
 {
     @Path ( "proxyConnectorRules" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorService.java
index 5f63fd0..b370d23 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ProxyConnectorService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.ProxyConnector;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.rest.api.model.PolicyInformation;
@@ -39,6 +40,7 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path( "/proxyConnectorService/" )
+@Tag(name="Proxy-Repository")
 public interface ProxyConnectorService
 {
     @Path( "getProxyConnectors" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RedbackRuntimeConfigurationService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RedbackRuntimeConfigurationService.java
index dff2430..67f44ee 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RedbackRuntimeConfigurationService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RedbackRuntimeConfigurationService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.LdapConfiguration;
 import org.apache.archiva.admin.model.beans.RedbackRuntimeConfiguration;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
@@ -40,6 +41,7 @@ import java.util.List;
  * @since 1.4-M4
  */
 @Path("/redbackRuntimeConfigurationService/")
+@Tag( name="Redback",description = "Configuration of Redback Backend")
 public interface RedbackRuntimeConfigurationService
 {
     @Path("redbackRuntimeConfiguration")
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RemoteRepositoriesService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RemoteRepositoriesService.java
index 97aa4b9..632c8ff 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RemoteRepositoriesService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RemoteRepositoriesService.java
@@ -19,6 +19,8 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.tags.Tags;
 import org.apache.archiva.admin.model.beans.RemoteRepository;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -37,6 +39,10 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path("/remoteRepositoriesService/")
+@Tags( {
+    @Tag( name = "RemoteRepositories", description = "Administration of remote 
repositories" ),
+    @Tag( name = "Repositories", description = "Administration of remote 
repositories" )
+})
 public interface RemoteRepositoriesService
 {
     @Path("getRemoteRepositories")
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ReportRepositoriesService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ReportRepositoriesService.java
index 5f3eccf..da60650 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ReportRepositoriesService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/ReportRepositoriesService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.metadata.model.facets.RepositoryProblemFacet;
 import org.apache.archiva.metadata.repository.stats.model.RepositoryStatistics;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
@@ -39,6 +40,7 @@ import java.util.List;
  * @since 1.4-M3
  */
 @Path( "/reportServices/" )
+@Tag( name="Statistics", description = "Statistics and Health reports")
 public interface ReportRepositoriesService
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
index 9d48a00..75e4670 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
@@ -19,6 +19,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.maven2.model.Artifact;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.repository.scanner.RepositoryScanStatistics;
@@ -41,6 +42,7 @@ import javax.ws.rs.core.MediaType;
  * @since 1.4-M1
  */
 @Path ("/repositoriesService/")
+@Tag( name="Repositories", description = "Managing repositories")
 public interface RepositoriesService
 {
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoryGroupService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoryGroupService.java
index f031d1c..2daedc1 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoryGroupService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoryGroupService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.admin.model.beans.RepositoryGroup;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.security.common.ArchivaRoleConstants;
@@ -37,6 +38,7 @@ import java.util.List;
  * @since 1.4-M1
  */
 @Path( "/repositoryGroupService/" )
+@Tag( name="Repository-Group", description = "Managing of groups of 
repositories")
 public interface RepositoryGroupService
 {
     @Path( "getRepositoriesGroups" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SearchService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SearchService.java
index 1b3fa08..4d56d25 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SearchService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SearchService.java
@@ -20,6 +20,7 @@ package org.apache.archiva.rest.api.services;
  */
 
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.maven2.model.Artifact;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.rest.api.model.ChecksumSearch;
@@ -37,6 +38,7 @@ import javax.ws.rs.core.Response;
 import java.util.List;
 
 @Path( "/searchService/" )
+@Tag( name="Search", description = "Searching repositories")
 public interface SearchService
 {
     /*
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SystemStatusService.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SystemStatusService.java
index ae1b02b..96fe1d8 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SystemStatusService.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/SystemStatusService.java
@@ -18,6 +18,7 @@ package org.apache.archiva.rest.api.services;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.rest.api.model.CacheEntry;
 import org.apache.archiva.rest.api.model.QueueEntry;
@@ -36,6 +37,7 @@ import java.util.List;
  * @since 1.4-M3
  */
 @Path( "/systemStatusService/" )
+@Tag( name="System", description = "System information")
 public interface SystemStatusService
 {
     @Path( "memoryStatus" )
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/openapi-codegen-ignore
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/openapi-codegen-ignore
new file mode 100644
index 0000000..e69de29
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/openapi-configuration.yaml
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/openapi-configuration.yaml
new file mode 100644
index 0000000..80917c9
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/openapi-configuration.yaml
@@ -0,0 +1,16 @@
+resourcePackages:
+  - org.apache.archiva.rest.api
+prettyPrint: true
+cacheTTL: 0
+openAPI:
+  info:
+    version: '3.0'
+    title: Apache Archiva REST API
+    description: 'This is the Apache Archiva REST API documentation'
+    termsOfService: https://archiva.apache.org
+    contact:
+      email: [email protected]
+      url: https://archiva.apache.org/index.html
+    license:
+      name: Apache 2.0
+      url: http://www.apache.org/licenses/LICENSE-2.0.html
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/bodyParam.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/bodyParam.mustache
new file mode 100644
index 0000000..4873e06
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/bodyParam.mustache
@@ -0,0 +1,4 @@
+{{#is this 'body-param'}}<div class="param">{{baseName}} {{#baseType}}<a 
href="#{{baseType}}">{{baseType}}</a>{{/baseType}} 
{{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
+
+      <div class="param-desc"><span class="param-type">Body Parameter</span> 
&mdash; {{unescapedDescription}} {{#defaultValue}}default: 
{{{defaultValue}}}{{/defaultValue}}</div>{{/is}}
+      {{#example}}<div class="param-desc"><span class="param-type">example: 
<code>{{example}}</code></span></div>{{/example}}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/formParam.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/formParam.mustache
new file mode 100644
index 0000000..6d23f93
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/formParam.mustache
@@ -0,0 +1,3 @@
+{{#is this 'form-param'}}<div class="param">{{baseName}} 
{{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
+
+      <div class="param-desc"><span class="param-type">Form Parameter</span> 
&mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} 
{{/defaultValue}}{{#dataFormat}}format: 
{{{dataFormat}}}{{/dataFormat}}</div>{{/is}}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/headerParam.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/headerParam.mustache
new file mode 100644
index 0000000..ad00e3c
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/headerParam.mustache
@@ -0,0 +1,3 @@
+{{#is this 'header-param'}}<div class="param">{{baseName}} 
{{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
+
+      <div class="param-desc"><span class="param-type">Header Parameter</span> 
&mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} 
{{/defaultValue}}{{#dataFormat}}format: 
{{{dataFormat}}}{{/dataFormat}}</div>{{/is}}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/index.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/index.mustache
new file mode 100644
index 0000000..59b27c8
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/index.mustache
@@ -0,0 +1,213 @@
+<!doctype html>
+<html>
+  <head>
+    <title>{{{appName}}}</title>
+    <style type="text/css">
+      {{>style.css}}
+    </style>
+  </head>
+  <body>
+  <h1>{{{appName}}}</h1>
+    <div class="app-desc">{{{appDescription}}}</div>
+    {{#infoUrl}}<div class="app-desc">More information: <a 
href="{{{infoUrl}}}">{{{infoUrl}}}</a></div>{{/infoUrl}}
+    {{#infoEmail}}<div class="app-desc">Contact Info: <a 
href="{{{infoEmail}}}">{{{infoEmail}}}</a></div>{{/infoEmail}}
+    {{#version}}<div class="app-desc">Version: {{{version}}}</div>{{/version}}
+    {{#basePathWithoutHost}}<div 
class="app-desc">BasePath:{{basePathWithoutHost}}</div>{{/basePathWithoutHost}}
+    <div class="license-info">{{{licenseInfo}}}</div>
+    <div class="license-url">{{{licenseUrl}}}</div>
+  <h2>Access</h2>
+  {{#hasAuthMethods}}
+    <ol>
+    {{#authMethods}}
+      <li>{{#is this 'basic'}}HTTP Basic Authentication{{/is}}{{#is this 
'oauth'}}OAuth 
AuthorizationUrl:{{authorizationUrl}}TokenUrl:{{tokenUrl}}{{/is}}{{#is this 
'api-key'}}APIKey KeyParamName:{{keyParamName}} KeyInQuery:{{isKeyInQuery}} 
KeyInHeader:{{isKeyInHeader}}{{/is}}</li>
+    {{/authMethods}}
+    </ol>
+  {{/hasAuthMethods}}
+
+  <h2><a name="__Methods">Methods</a></h2>
+  [ Jump to <a href="#__Models">Models</a> ]
+
+  {{! for the tables of content, I cheat and don't use CSS styles.... }}
+  <h3>Table of Contents </h3>
+  <div class="method-summary">{{access}}</div>
+  {{#apiInfo}}
+  {{#apis}}
+  {{#operations}}
+  <h4><a href="#{{baseName}}">{{baseName}}</a></h4>
+  <ul>
+  {{#operation}}
+  <li><a href="#{{nickname}}"><code><span 
class="http-method">{{httpMethod}}</span> {{path}}</code></a></li>
+  {{/operation}}
+  </ul>
+  {{/operations}}
+  {{/apis}}
+  {{/apiInfo}}
+
+  {{#apiInfo}}
+  {{#apis}}
+  {{#operations}}
+  <h1><a name="{{baseName}}">{{baseName}}</a></h1>
+  {{#operation}}
+  <div class="method"><a name="{{nickname}}"></a>
+    <div class="method-path">
+    <a class="up" href="#__Methods">Up</a>
+    <pre class="{{httpMethod}}"><code class="huge"><span 
class="http-method">{{httpMethod}}</span> {{path}}</code></pre></div>
+    <div class="method-summary">{{summary}} (<span 
class="nickname">{{nickname}}</span>)</div>
+    {{! notes is operation.description. So why rename it and make it super 
confusing???? }}
+    <div class="method-notes">{{notes}}</div>
+
+    {{#hasPathParams}}
+    <h3 class="field-label">Path parameters</h3>
+    <div class="field-items">
+      {{#pathParams}}{{>pathParam}}{{/pathParams}}
+    </div>  <!-- field-items -->
+    {{/hasPathParams}}
+
+    {{#has this 'consumes'}}
+    <h3 class="field-label">Consumes</h3>
+    This API call consumes the following media types via the <span 
class="header">Content-Type</span> request header:
+    <ul>
+    {{#consumes}}
+      <li><code>{{{mediaType}}}</code></li>
+    {{/consumes}}
+    </ul>
+    {{/has}}
+
+    {{#hasBodyParam}}
+    <h3 class="field-label">Request body</h3>
+    <div class="field-items">
+      {{#bodyParams}}{{>bodyParam}}{{/bodyParams}}
+    </div>  <!-- field-items -->
+    {{/hasBodyParam}}
+
+    {{#hasHeaderParams}}
+    <h3 class="field-label">Request headers</h3>
+    <div class="field-items">
+      {{#headerParam}}{{>headerParam}}{{/headerParam}}
+    </div>  <!-- field-items -->
+    {{/hasHeaderParams}}
+
+    {{#hasQueryParams}}
+    <h3 class="field-label">Query parameters</h3>
+    <div class="field-items">
+      {{#queryParams}}{{>queryParam}}{{/queryParams}}
+    </div>  <!-- field-items -->
+    {{/hasQueryParams}}
+
+    {{#hasFormParams}}
+    <h3 class="field-label">Form parameters</h3>
+    <div class="field-items">
+      {{#formParams}}{{>formParam}}{{/formParams}}
+    </div>  <!-- field-items -->
+    {{/hasFormParams}}
+
+    {{#returnType}}
+    <h3 class="field-label">Return type</h3>
+    <div class="return-type">
+      
{{#hasReference}}{{^returnSimpleType}}{{returnContainer}}[{{/returnSimpleType}}<a
 
href="#{{returnBaseType}}">{{returnBaseType}}</a>{{^returnSimpleType}}]{{/returnSimpleType}}{{/hasReference}}
+      {{^hasReference}}{{returnType}}{{/hasReference}}
+    </div>
+    {{/returnType}}
+
+    <!--Todo: process Response Object and its headers, schema, examples -->
+
+    {{#hasExamples}}
+    {{#examples}}
+    <h3 class="field-label">Example data</h3>
+    <div class="example-data-content-type">Content-Type: 
{{{contentType}}}</div>
+    <pre class="example"><code>{{{example}}}</code></pre>
+    {{/examples}}
+    {{/hasExamples}}
+
+    {{#has this 'produces'}}
+    <h3 class="field-label">Produces</h3>
+    This API call produces the following media types according to the <span 
class="header">Accept</span> request header;
+    the media type will be conveyed by the <span 
class="header">Content-Type</span> response header.
+    <ul>
+    {{#produces}}
+      <li><code>{{{mediaType}}}</code></li>
+    {{/produces}}
+    </ul>
+    {{/has}}
+
+    <h3 class="field-label">Responses</h3>
+    {{#responses}}
+    <h4 class="field-label">{{code}}</h4>
+    {{message}}
+        {{#simpleType}}<a href="#{{dataType}}">{{dataType}}</a>{{/simpleType}}
+    {{#examples}}
+    <h3 class="field-label">Example data</h3>
+    <div class="example-data-content-type">Content-Type: 
{{{contentType}}}</div>
+    <pre class="example"><code>{{example}}</code></pre>
+    {{/examples}}
+    {{/responses}}
+  </div> <!-- method -->
+  <hr/>
+  {{/operation}}
+  {{/operations}}
+  {{/apis}}
+  {{/apiInfo}}
+
+  <h2><a name="__Models">Models</a></h2>
+  [ Jump to <a href="#__Methods">Methods</a> ]
+
+  <h3>Table of Contents</h3>
+  <ol>
+  {{#models}}
+  {{#model}}
+    <li><a href="#{{name}}"><code>{{name}}</code>{{#title}} - 
{{title}}{{/title}}</a></li>
+  {{/model}}
+  {{/models}}
+  </ol>
+
+  {{#models}}
+  {{#model}}
+  <div class="model">
+    <h3><a name="{{name}}"><code>{{name}}</code>{{#title}} - 
{{title}}{{/title}}</a> <a class="up" href="#__Models">Up</a></h3>
+    {{#unescapedDescription}}<div 
class='model-description'>{{unescapedDescription}}</div>{{/unescapedDescription}}
+    <div class="field-items">
+      {{#vars}}<div class="param">{{name}} 
{{^required}}(optional){{/required}}</div><div class="param-desc"><span 
class="param-type">{{#isNot this 'primitive-type'}}<a 
href="#{{complexType}}">{{datatype}}</a>{{/isNot}}</span> 
{{unescapedDescription}} {{#dataFormat}}format: 
{{{dataFormat}}}{{/dataFormat}}</div>
+      {{#is this 'enum'}}
+        <div class="param-enum-header">Enum:</div>
+        {{#_enum}}<div class="param-enum">{{this}}</div>{{/_enum}}
+      {{/is}}
+      {{#example}}
+          <div class="param-desc"><span class="param-type">example: 
{{example}}</span></div>
+      {{/example}}
+      {{#vendorExtensions.oneOf-model}}
+      <div class="param-desc"><span class="param-type">oneOf:</span>
+          {{#vendorExtensions.x-model-names}}
+              <a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
+          {{/vendorExtensions.x-model-names}}
+      </div>
+      {{/vendorExtensions.oneOf-model}}
+      {{#vendorExtensions.anyOf-model}}
+      <div class="param-desc"><span class="param-type">anyOf:</span>
+          {{#vendorExtensions.x-model-names}}
+              <a href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
+          {{/vendorExtensions.x-model-names}}
+      </div>
+      {{/vendorExtensions.anyOf-model}}
+      {{#items}}
+          {{#vendorExtensions.oneOf-model}}
+              <div class="param-desc"><span class="param-type">items 
oneOf:</span>
+              {{#vendorExtensions.x-model-names}}
+                  <a 
href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
+              {{/vendorExtensions.x-model-names}}
+              </div>
+          {{/vendorExtensions.oneOf-model}}
+          {{#vendorExtensions.anyOf-model}}
+              <div class="param-desc"><span class="param-type">items 
anyOf:</span>
+              {{#vendorExtensions.x-model-names}}
+                  <a 
href="#{{this}}"><code>{{this}}</code></a>&nbsp;&nbsp;&nbsp;
+              {{/vendorExtensions.x-model-names}}
+              </div>
+          {{/vendorExtensions.anyOf-model}}
+      {{/items}}
+      {{/vars}}
+    </div>  <!-- field-items -->
+  </div>
+  {{/model}}
+  {{/models}}
+  </body>
+</html>
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/pathParam.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/pathParam.mustache
new file mode 100644
index 0000000..fa512bf
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/pathParam.mustache
@@ -0,0 +1,3 @@
+{{#is this 'path-param'}}<div class="param">{{baseName}} 
{{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
+
+      <div class="param-desc"><span class="param-type">Path Parameter</span> 
&mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} 
{{/defaultValue}}{{#dataFormat}}format: 
{{{dataFormat}}}{{/dataFormat}}</div>{{/is}}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/queryParam.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/queryParam.mustache
new file mode 100644
index 0000000..ee9f48a
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/queryParam.mustache
@@ -0,0 +1,3 @@
+{{#is this 'query-param'}}<div class="param">{{baseName}} 
{{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
+
+      <div class="param-desc"><span class="param-type">Query Parameter</span> 
&mdash; {{unescapedDescription}} {{#defaultValue}}default: {{{defaultValue}}} 
{{/defaultValue}}{{#dataFormat}}format: 
{{{dataFormat}}}{{/dataFormat}}</div>{{/is}}
\ No newline at end of file
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/style.css.mustache
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/style.css.mustache
new file mode 100644
index 0000000..04eccf6
--- /dev/null
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/resources/templates/style.css.mustache
@@ -0,0 +1,172 @@
+body {
+       font-family: Trebuchet MS, sans-serif;
+       font-size: 15px;
+       color: #444;
+       margin-right: 24px;
+}
+
+h1     {
+       font-size: 25px;
+}
+h2     {
+       font-size: 20px;
+}
+h3     {
+       font-size: 16px;
+       font-weight: bold;
+}
+hr     {
+       height: 1px;
+       border: 0;
+       color: #ddd;
+       background-color: #ddd;
+}
+
+.app-desc {
+  clear: both;
+  margin-left: 20px;
+}
+.param-name {
+  width: 100%;
+}
+.license-info {
+  margin-left: 20px;
+}
+
+.license-url {
+  margin-left: 20px;
+}
+
+.model {
+  margin: 0 0 0px 20px;
+}
+
+.method {
+  margin-left: 20px;
+}
+
+.method-notes  {
+       margin: 10px 0 20px 0;
+       font-size: 90%;
+       color: #555;
+}
+
+pre {
+  padding: 10px;
+  margin-bottom: 2px;
+}
+
+.http-method {
+ text-transform: uppercase;
+}
+
+pre.get {
+  background-color: #0f6ab4;
+}
+
+pre.post {
+  background-color: #10a54a;
+}
+
+pre.put {
+  background-color: #c5862b;
+}
+
+pre.delete {
+  background-color: #a41e22;
+}
+
+.huge  {
+       color: #fff;
+}
+
+pre.example {
+  background-color: #f3f3f3;
+  padding: 10px;
+  border: 1px solid #ddd;
+}
+
+code {
+  white-space: pre;
+}
+
+.nickname {
+  font-weight: bold;
+}
+
+.method-path {
+  font-size: 1.5em;
+  background-color: #0f6ab4;
+}
+
+.up {
+  float:right;
+}
+
+.parameter {
+  width: 500px;
+}
+
+.param {
+  width: 500px;
+  padding: 10px 0 0 20px;
+  font-weight: bold;
+}
+
+.param-desc {
+  width: 700px;
+  padding: 0 0 0 20px;
+  color: #777;
+}
+
+.param-type {
+  font-style: italic;
+}
+
+.param-enum-header {
+width: 700px;
+padding: 0 0 0 60px;
+color: #777;
+font-weight: bold;
+}
+
+.param-enum {
+width: 700px;
+padding: 0 0 0 80px;
+color: #777;
+font-style: italic;
+}
+
+.field-label {
+  padding: 0;
+  margin: 0;
+  clear: both;
+}
+
+.field-items   {
+       padding: 0 0 15px 0;
+       margin-bottom: 15px;
+}
+
+.return-type {
+  clear: both;
+  padding-bottom: 10px;
+}
+
+.param-header {
+  font-weight: bold;
+}
+
+.method-tags {
+  text-align: right;
+}
+
+.method-tag {
+  background: none repeat scroll 0% 0% #24A600;
+  border-radius: 3px;
+  padding: 2px 10px;
+  margin: 2px;
+  color: #FFF;
+  display: inline-block;
+  text-decoration: none;
+}
diff --git a/status-dep.txt b/status-dep.txt
index a806a43..1651bec 100644
--- a/status-dep.txt
+++ b/status-dep.txt
@@ -4,40 +4,31 @@
 
 archiva-modules
   archiva-base
-    archiva-common
-    archiva-storage-api
-    archiva-storage-fs
-    archiva-filelock
-    archiva-model
     archiva-checksum
-    archiva-policies
+    archiva-common
     archiva-configuration
-    archiva-repository-api
-    archiva-xml-tools
-    archiva-repository-layer
-    archiva-proxy-api
-    archiva-proxy
-    archiva-repository-scanner
-    archiva-security-common
     archiva-consumers
       archiva-consumers-api
+      archiva-consumer-archetype
       archiva-core-consumers
+      archiva-lucene-consumer
       archiva-metadata-consumer
       archiva-signature-consumer
-      archiva-lucene-consumer
-      archiva-consumer-archetype
+    archiva-filelock
+    archiva-model
+    archiva-policies
+    archiva-proxy
+    archiva-proxy-api
+    archiva-repository-api
     archiva-repository-admin
       archiva-repository-admin-api
       archiva-repository-admin-default
-  archiva-scheduler
-    archiva-scheduler-api
-    archiva-scheduler-repository-api
-    archiva-scheduler-repository
-    archiva-scheduler-indexer
-  metadata
-    metadata-statistics-api
-    metadata-repository-api
-    metadata-model
+    archiva-repository-layer
+    archiva-repository-scanner
+    archiva-security-common
+    archiva-storage-api
+    archiva-storage-fs
+    archiva-xml-tools
   archiva-maven
     archiva-maven-common
     archiva-maven-model
@@ -47,15 +38,25 @@ archiva-modules
     archiva-maven-indexer
     archiva-maven-repository
     archiva-maven-scheduler
+  archiva-scheduler
+    archiva-scheduler-api
+    archiva-scheduler-indexer
+    archiva-scheduler-repository-api
+    archiva-scheduler-repository
+  metadata
+    metadata-model
+    metadata-repository-api
+    metadata-statistics-api
+    test-repository
   plugins
+    audit
     generic-metadata-support
+    metadata-store-cassandra
+    metadata-store-file
     metadata-store-jcr
+    problem-reports
     repository-statistics
     stage-repository-merge
-    metadata-store-file
-    audit
-    problem-reports
-    metadata-store-cassandra
     
 
 

Reply via email to