You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by bb...@apache.org on 2022/01/26 14:03:43 UTC

[nifi] branch main updated: NIFI-9630 Migrated Registry REST API docs to swagger-codegen (#5715)

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

bbende pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 5022a5e  NIFI-9630 Migrated Registry REST API docs to swagger-codegen (#5715)
5022a5e is described below

commit 5022a5ee07e61614e585b3fd86c410ac9e04e750
Author: exceptionfactory <ex...@apache.org>
AuthorDate: Wed Jan 26 08:03:26 2022 -0600

    NIFI-9630 Migrated Registry REST API docs to swagger-codegen (#5715)
    
    - Added swagger-codegen-maven-plugin configuration
    - Removed swagger2markup-maven-plugin and asciidoctor-maven-plugin configurations
    - Removed generation of legacy REST API documentation and associated templates
---
 .../nifi-registry-core/nifi-registry-docs/pom.xml  |  16 +-
 .../src/main/asciidoc/user-guide.adoc              |   2 +-
 .../nifi-registry-web-api/pom.xml                  |  80 +--
 .../src/main/resources/templates/endpoint.hbs      |  61 ---
 .../src/main/resources/templates/example.hbs       |  18 -
 .../src/main/resources/templates/index.html.hbs    | 550 ---------------------
 .../src/main/resources/templates/operation.hbs     | 110 -----
 .../main/resources/templates/style.css.mustache    | 138 ++++++
 .../src/main/resources/templates/type.hbs          |  57 ---
 .../src/main/webapp/WEB-INF/jsp/documentation.jsp  |   2 +-
 10 files changed, 167 insertions(+), 867 deletions(-)

diff --git a/nifi-registry/nifi-registry-core/nifi-registry-docs/pom.xml b/nifi-registry/nifi-registry-core/nifi-registry-docs/pom.xml
index c507811..2dfdc24 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-docs/pom.xml
+++ b/nifi-registry/nifi-registry-core/nifi-registry-docs/pom.xml
@@ -85,7 +85,7 @@
                     </attributes>
                 </configuration>
             </plugin>
-            <!-- Unpack rest-api.html that was generated from nifi-registry-web-api and place it into a temp folder in the target dir -->
+            <!-- Unpack rest-api/index.html that was generated from nifi-registry-web-api and place it into a temp folder in the target dir -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
@@ -100,15 +100,15 @@
                         <configuration>
                             <includeGroupIds>org.apache.nifi.registry</includeGroupIds>
                             <includeArtifactIds>nifi-registry-web-api</includeArtifactIds>
-                            <outputDirectory>${project.build.directory}/nifi-registry-web-api/</outputDirectory>
-                            <includes>**/rest-api.html</includes>
+                            <outputDirectory>${project.build.directory}/nifi-registry-web-api</outputDirectory>
+                            <includes>docs/rest-api/index.html</includes>
                             <overWriteReleases>false</overWriteReleases>
                             <overWriteSnapshots>false</overWriteSnapshots>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
-            <!-- Copy rest-api.html from the tmp dir to the generated-docs dir where the other html docs are, this is done
+            <!-- Copy rest-api/index.html from the tmp dir to the generated-docs dir where the other html docs are, this is done
                     in two steps to eliminate the nested path that was created in the temp dir when running unpack-dependencies
              -->
             <plugin>
@@ -125,10 +125,10 @@
                         <configuration>
                             <target>
                                 <sequential>
-                                    <echo>Copy unpacked rest-api.html to generated-docs dir</echo>
-                                    <copy todir="${project.build.directory}/generated-docs">
-                                        <fileset dir="${project.build.directory}/nifi-registry-web-api/docs/rest-api/">
-                                            <include name="**" />
+                                    <echo>Copy unpacked rest-api/index.html to generated-docs dir</echo>
+                                    <copy tofile="${project.build.directory}/generated-docs/rest-api.html">
+                                        <fileset dir="${project.build.directory}/nifi-registry-web-api/docs/rest-api">
+                                            <include name="index.html" />
                                         </fileset>
                                     </copy>
                                 </sequential>
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-docs/src/main/asciidoc/user-guide.adoc b/nifi-registry/nifi-registry-core/nifi-registry-docs/src/main/asciidoc/user-guide.adoc
index 67fe5a4..b501e54 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-docs/src/main/asciidoc/user-guide.adoc
+++ b/nifi-registry/nifi-registry-core/nifi-registry-docs/src/main/asciidoc/user-guide.adoc
@@ -483,4 +483,4 @@ An example of using `curl` to download `my-processors-1.0.0.nar` by id and versi
 
 === Additional Actions
 
-For additional actions that can be performed related to bundles, please consult the link:rest-api.html[REST API documentation].
+For additional actions that can be performed related to bundles, please consult the link:../rest-api/index.html[REST API documentation].
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/pom.xml b/nifi-registry/nifi-registry-core/nifi-registry-web-api/pom.xml
index e0ba88f..d6b032e 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/pom.xml
+++ b/nifi-registry/nifi-registry-core/nifi-registry-web-api/pom.xml
@@ -94,8 +94,6 @@
                                             <jsonPath>${swagger.source.dir}/security-definitions.json</jsonPath>
                                         </securityDefinition>
                                     </securityDefinitions>
-                                    <templatePath>classpath:/templates/index.html.hbs</templatePath>
-                                    <outputPath>${docs.dir}/rest-api/index.html</outputPath>
                                     <swaggerDirectory>${swagger.generated.dir}</swaggerDirectory>
                                 </apiSource>
                             </apiSources>
@@ -124,6 +122,25 @@
                 </executions>
             </plugin>
             <plugin>
+                <groupId>io.swagger.codegen.v3</groupId>
+                <artifactId>swagger-codegen-maven-plugin</artifactId>
+                <version>3.0.31</version>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <inputSpec>${swagger.generated.dir}/swagger.json</inputSpec>
+                            <output>${docs.dir}/rest-api</output>
+                            <language>html</language>
+                            <templateDirectory>src/main/resources/templates</templateDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
                 <groupId>com.googlecode.maven-download-plugin</groupId>
                 <artifactId>download-maven-plugin</artifactId>
                 <version>1.2.1</version>
@@ -188,65 +205,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <!-- Generates asciidoc files from swagger.json -->
-            <plugin>
-                <groupId>io.github.swagger2markup</groupId>
-                <artifactId>swagger2markup-maven-plugin</artifactId>
-                <version>1.3.3</version>
-                <executions>
-                    <execution>
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>convertSwagger2markup</goal>
-                        </goals>
-                        <configuration>
-                            <swaggerInput>${swagger.generated.dir}/swagger.json</swaggerInput>
-                            <outputDir>${asciidoc.generated.dir}</outputDir>
-                            <config>
-                                <swagger2markup.markupLanguage>ASCIIDOC</swagger2markup.markupLanguage>
-                                <swagger2markup.pathsGroupedBy>TAGS</swagger2markup.pathsGroupedBy>
-                                <swagger2markup.generatedExamplesEnabled>true</swagger2markup.generatedExamplesEnabled>
-                            </config>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Generates rest-api.html from rest-api.adoc and places it in docs dir within WAR -->
-            <plugin>
-                <groupId>org.asciidoctor</groupId>
-                <artifactId>asciidoctor-maven-plugin</artifactId>
-                <version>1.5.8</version>
-                <configuration>
-                    <sourceDirectory>${asciidoc.source.dir}</sourceDirectory>
-                    <sourceDocumentName>rest-api.adoc</sourceDocumentName>
-                    <attributes>
-                        <doctype>article</doctype>
-                        <toc />
-                        <toclevels>3</toclevels>
-                        <numbered />
-                        <hardbreaks />
-                        <sectlinks />
-                        <sectanchors />
-                        <revnumber>${project.version}</revnumber>
-                        <organization>Apache NiFi</organization>
-                        <generated>${asciidoc.generated.dir}</generated>
-                    </attributes>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>output-html</id>
-                        <phase>compile</phase>
-                        <goals>
-                            <goal>process-asciidoc</goal>
-                        </goals>
-                        <configuration>
-                            <backend>html5</backend>
-                            <outputDirectory>${docs.dir}/rest-api</outputDirectory>
-                            <outputFile>rest-api.html</outputFile>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
             <plugin>
                 <groupId>org.apache.rat</groupId>
                 <artifactId>apache-rat-plugin</artifactId>
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/endpoint.hbs b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/endpoint.hbs
deleted file mode 100644
index 1394136..0000000
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/endpoint.hbs
+++ /dev/null
@@ -1,61 +0,0 @@
-{{!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
---}}
-<div class="endpoints">
-    <span class="path hidden">{{@key}}</span>
-    {{#post}}
-        <div class="endpoint post">
-            <div class="operation-handle">
-                <div class="method">POST</div>
-                <div class="path mono"></div>
-                <div class="summary" title="{{summary}}">{{summary}}</div>
-                <div class="clear"></div>
-            </div>
-            {{> operation}}
-        </div>
-    {{/post}}
-    {{#get}}
-        <div class="endpoint get">
-            <div class="operation-handle">
-                <div class="method">GET</div>
-                <div class="path mono"></div>
-                <div class="summary" title="{{summary}}">{{summary}}</div>
-                <div class="clear"></div>
-            </div>
-            {{> operation}}
-        </div>
-    {{/get}}
-    {{#put}}
-        <div class="endpoint put">
-            <div class="operation-handle">
-                <div class="method">PUT</div>
-                <div class="path mono"></div>
-                <div class="summary" title="{{summary}}">{{summary}}</div>
-                <div class="clear"></div>
-            </div>
-            {{> operation}}
-        </div>
-    {{/put}}
-    {{#delete}}
-        <div class="endpoint delete">
-            <div class="operation-handle">
-                <div class="method">DELETE</div>
-                <div class="path mono"></div>
-                <div class="summary" title="{{summary}}">{{summary}}</div>
-                <div class="clear"></div>
-            </div>
-            {{> operation}}
-        </div>
-    {{/delete}}
-</div>
\ No newline at end of file
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/example.hbs b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/example.hbs
deleted file mode 100644
index 26a4283..0000000
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/example.hbs
+++ /dev/null
@@ -1,18 +0,0 @@
-{{!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
---}}{{!-- formatting here matters... in whitespace: pre. this is not comprehensive but sufficent for our examples --}}
-{{#each properties}}    {{#ifeq type "string"}}"{{@key}}": "value"{{/ifeq}}{{#ifeq type "boolean"}}"{{@key}}": true{{/ifeq}}{{#ifeq type "integer"}}"{{@key}}": 0{{/ifeq}}{{#ifeq type "number"}}"{{@key}}": 0.0{{/ifeq}}{{#if $ref}}"{{@key}}": <span class="nested collapsed"><span class="nested-id hidden">{{basename $ref}}</span><span class="nested-example"><span class="open-object">&#123;&#8230;&#125;</span></span></span>{{/if}}{{#ifeq type "array"}}"{{@key}}": [{{#if items.$ref}}<span clas [...]
-        "name": {{#if additionalProperties.$ref}}<span class="nested collapsed"><span class="nested-id hidden">{{basename additionalProperties.$ref}}</span><span class="nested-example"><span class="open-object">&#123;&#8230;&#125;</span></span></span>{{else}}{{#ifeq additionalProperties.type "integer"}}0{{else}}"value"{{/ifeq}}{{/if}}
-    &#125;</span>{{/ifeq}}<span class="comma">,</span>
-{{/each}}
\ No newline at end of file
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/index.html.hbs b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/index.html.hbs
deleted file mode 100644
index aca97fe..0000000
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/index.html.hbs
+++ /dev/null
@@ -1,550 +0,0 @@
-<!DOCTYPE html>
-<!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
--->
-<html>
-    <head>
-        <title>{{info.title}}-{{info.version}}</title>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-        <link rel="shortcut icon" href="images/nifi16.ico"/>
-        <script type="text/javascript" src="../../nifi/assets/jquery/dist/jquery.min.js"></script>
-        <script type="text/javascript">
-            if (typeof window.jQuery === 'undefined') {
-                document.write(unescape('%3Cscript src="https://code.jquery.com/jquery-3.1.1.min.js" type="text/javascript" %3E%3C/script%3E'));
-            }
-        </script>
-        <style>
-            @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic|Noto+Serif:400,400italic,700,700italic|Droid+Sans+Mono:400";
-
-            html {
-                overflow-y: scroll;
-            }
-            
-            html, html a {
-                -webkit-font-smoothing: antialiased;
-                text-shadow: 1px 1px 1px rgba(0,0,0,0.004);
-            }
-
-            body {
-                width: 62.5em;
-                margin: 0 auto;
-                display: block;
-                font-family: "Open Sans", "DejaVu Sans", sans-serif;
-            }
-            
-            div.header {
-                margin-top: 10px;
-            }
-            
-            img.logo {
-                float: left;
-                margin-right: 10px;
-            }
-            
-            div.header > div.title {
-                font-size: 30px;
-                height: 50px;
-                line-height: 50px;
-            }
-            
-            .sub-title {
-                font-style: italic;
-                color: #aaa;
-            }
-            
-            div.overview {
-                margin-top: 10px;
-                margin-bottom: 15px;
-            }
-            
-            div.endpoint {
-                margin-bottom: 10px;
-            }
-
-            /* get */
-            
-            div.endpoint.get {
-                border: 1px solid #174961;
-            }
-            
-            div.get div.operation-handle {
-                background-color: rgba(23, 73, 97, .15);
-            }
-            
-            div.get div.method {
-                background-color: #174961;
-            }
-            
-            div.get div.operation {
-                border-top: 1px solid #174961;
-            }
-            
-            /* post */
-            
-            div.endpoint.post {
-                border: 1px solid #7298AC;
-            }
-            
-            div.post div.operation-handle {
-                background-color: rgba(114, 152, 172, .15);
-            }
-            
-            div.post div.method {
-                background-color: #7298AC;
-            }
-            
-            div.post div.operation {
-                border-top: 1px solid #7298AC;
-            }
-            
-            /* put */
-            
-            div.endpoint.put {
-                border: 1px solid #063046;
-            }
-            
-            div.put div.operation-handle {
-                background-color: rgba(6, 48, 70, .15);
-            }
-            
-            div.put div.method {
-                background-color: #063046;
-            }
-            
-            div.put div.operation {
-                border-top: 1px solid #063046;
-            }
-            
-            /* delete */
-            
-            div.endpoint.delete {
-                border: 1px solid #47758E;
-            }
-            
-            div.delete div.operation-handle {
-                background-color: rgba(71, 117, 142, .15);
-            }
-            
-            div.delete div.method {
-                background-color: #47758E;
-            }
-            
-            div.delete div.operation {
-                border-top: 1px solid #47758E;
-            }
-            
-            /* operations */
-            
-            div.operation-handle {
-                cursor: pointer;
-                padding-right: 5px;
-                height: 22px;
-            }
-            
-            div.method {
-                float: left;
-                width: 75px;
-                color: #fff;
-                text-align: center;
-                background-color: #7098ad;
-                margin-right: 10px;
-                font-weight: bold;
-            }
-
-            div.endpoint div.path {
-                float: left;
-                line-height: 22px;
-                overflow: hidden;
-                text-overflow: ellipsis;
-            }
-
-            div.summary {
-                float: right;
-                font-size: 12px;
-                line-height: 22px;
-                white-space: nowrap;
-                overflow: hidden;
-                text-overflow: ellipsis;
-                width: 40%;
-                text-align: right;
-            }
-
-            div.operation {
-                padding: 5px;
-                font-size: 12px;
-            }
-
-            div.operation > div.title {
-                font-weight: bold;
-                color: #000;
-            }
-            
-            div.operation > table {
-                margin-left: 5px;
-                margin-right: 5px;
-            }
-            
-            div.operation div.details {
-                margin-left: 5px;
-                margin-bottom: 5px;
-                color: #333;
-            }
-            
-            div.operation div.description {
-                margin-bottom: 10px;
-            }
-
-            div.mediatype {
-                line-height: 16px;
-            }
-
-            div.mediatype > div.title {
-                float: left;
-                width: 70px;
-            }
-            
-            div.mediatype div.title {
-                float: left;
-            }
-            
-            div.type {
-                position: fixed;
-                width: 800px;
-                height: 500px;
-                left: 50%;
-                top: 50%;
-                margin-left: -400px;
-                margin-top: -250px;
-                border: 3px solid #365C6A;
-                box-shadow: 4px 4px 6px rgba(0, 0, 0, 0.9);
-                padding: 10px;
-                background-color: #eee;
-                font-size: 12px;
-            }
-            
-            div.type-container {
-                overflow-y: auto;
-                height: 415px;
-                border-bottom: 1px solid #ccc;
-            }
-            
-            div.close {
-                border: 1px solid #aaa;
-                background-color: #ddd;
-                float: right;
-                margin-top: 10px;
-                font-weight: bold;
-                height: 25px;
-                line-height: 25px;
-                padding: 0 10px;
-                cursor: pointer;
-            }
-            
-            div.close:hover {
-                background-color: #d1d1d1;
-            }
-            
-            div.section-header > div.title {
-                font-size: 24px;
-                float: left;
-            }
-            
-            div.section-description {
-                float: right;
-                margin-top: 10px;
-            }
-            
-            div.section-endpoints {
-                margin-top: 10px;
-            }
-            
-            /* tables */
-
-            table {
-                background-color: #fefefe;
-                border: 1px solid #ccc;
-                border-left: 6px solid #ccc;
-                color: #555;
-                display: block;
-                margin-bottom: 12px;
-                padding: 5px 8px;
-            }
-            
-            table th {
-                font-weight: bold;
-                vertical-align:top;
-                text-align:left;
-                padding: 4px 15px;
-                border-width: 0;
-                white-space: nowrap;
-            }
-            
-            table td {
-                vertical-align:top;
-                text-align:left;
-                padding: 2px 15px;
-                border-width: 0;
-                white-space: nowrap;
-            }
-            
-            table td:last-child {
-                width: 99%;
-                white-space: normal;
-            }
-            
-            code.example {
-                background-color: #fefefe;
-                border: 1px solid #ccc;
-                border-left: 6px solid #ccc;
-                color: #555;
-                margin-bottom: 10px;
-                padding: 5px 8px;
-                white-space: pre;
-                display: block;
-                tab-size: 4;
-                -moz-tab-size: 4;
-                -o-tab-size: 4;
-                line-height: 20px
-            }
-            
-            span.nested.collapsed {
-                cursor: pointer;
-                border: 1px solid #7298AC;
-                background-color: rgba(114, 152, 172, .15);
-                padding: 1px;
-            }
-            
-            /* general */
-            
-            .mono {
-                font-family: monospace;
-            }
-            
-            div.clear {
-                clear: both;
-            }
-
-            .hidden {
-                display: none;
-            }
-            
-            a, .link {
-                cursor: pointer;
-                color: #1e373f;
-                font-weight: normal;
-            }
-            
-            a:hover, .link:hover {
-                color: #264c58;
-                text-decoration: underline;
-            }
-        </style>
-        <script type="text/javascript">
-            $(document).ready(function () {
-                // hide any open type dialogs
-                $('html').on('click', function() {
-                    $('div.type').hide();
-                }).on('keydown', function(e) {
-                    if (e.which === 27) {
-                        $('div.type').hide();
-                    }
-                });
-                
-                // populate all paths - this is necessary because the @key
-                // doesn't seem to reset after iterating through a nested 
-                // array or object
-                $('span.path').each(function() {
-                    var path = $(this);
-                    var endpoint = path.parent();
-                    endpoint.find('div.path').text(path.text());
-                });
-                
-                // toggles the visibility of a given operation
-                $('div.operation-handle').on('click', function () {
-                    $(this).next('div.operation').slideToggle();
-                });
-                
-                // add support for clicking to view the definition of a type
-                $('a.type-link').on('click', function(e) {
-                    // hide any previously shown dialogs
-                    $('div.type').hide();
-
-                    // show the type selected
-                    var link = $(this);
-                    var typeId = link.text();
-                    $('#' + typeId).show();
-                    e.stopPropagation();
-                });
-                
-                // prevent hiding when clicking on the type dialog
-                $('div.type').on('click', function(e) {
-                    e.stopPropagation();
-                });
-                
-                // due to lack of support for @last when iterating objects in 
-                // handlebars we need to remove the last comma from each example
-                $('code.example').find('span.comma:last').remove();
-                
-                // populate nested examples
-                $('code.example').on('click', 'span.nested', function(e) {
-                    var nested = $(this).removeClass('collapsed');
-                    var nestedId = nested.find('span.nested-id');
-                    var nestedExample = nested.find('span.nested-example');
-                    
-                    // get the id of the nested example
-                    var typeId = nestedId.text();
-                    var example = $('#' + typeId + ' code.example').html();
-                    var depth = nestedId.parents('span.open-object').length;
-                    
-                    // tab over as appropriate
-                    example = example.replace(/(\r\n|\r|\n)/g, function(match) {
-                        var tab = '\t';
-                        for (var i = 0; i < depth - 1; i++) {
-                            tab += '\t';
-                        }
-                        return match + tab;
-                    });
-                    
-                    // copy over the example
-                    nestedExample.html(example);
-                    e.stopPropagation();
-                });
-                
-                // handle close button
-                $('div.close').on('click', function() {
-                    $(this).closest('div.type').hide();
-                });
-                
-                // function for organizing the endpoints
-                var organizeEndpoints = function(term, container) {
-                    $('div.unorganized > div.endpoints').each(function() {
-                        var endpoints = $(this);
-                        var path = endpoints.find('div.path').text();
-                        
-                        if (term === null || path.indexOf(term) === 0) {
-                            endpoints.detach().appendTo(container);
-                        }
-                    });
-                };
-                
-                // organize the endpoints
-                organizeEndpoints('/buckets', $('#bucket-endpoints'));
-                organizeEndpoints('/items', $('#item-endpoints'));
-                organizeEndpoints('/flows', $('#flow-endpoints'));
-                organizeEndpoints('/bundles', $('#bundle-endpoints'));
-                organizeEndpoints('/extensions', $('#extension-endpoints'));
-                organizeEndpoints('/extension-repository', $('#extension-repository-endpoints'));
-                organizeEndpoints('/tenants', $('#tenant-endpoints'));
-                organizeEndpoints('/policies', $('#policy-endpoints'));
-                organizeEndpoints('/access', $('#access-endpoints'));
-
-                // handle expanding/collapsing the sections
-                $('div.section-header > div.title').on('click', function() {
-                    $(this).parent('div.section-header').next('div.section-endpoints').slideToggle();
-                });
-            });
-        </script>
-    </head>
-    <body>
-        <div class="header">
-            <img class="logo" src="images/bgNifiLogo.png" alt="NiFi Logo"/>
-            <div class="title">{{basePath}}</div>
-            <div class="sub-title">{{info.title}} {{info.version}}</div>
-            <div class="clear"></div>
-        </div>
-        <div class="clear"></div>
-        <div class="overview">{{info.description}}</div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Buckets</div>
-                <div class="sub-title section-description">Bucket endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="bucket-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Items</div>
-                <div class="sub-title section-description">Item endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="item-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Flows</div>
-                <div class="sub-title section-description">Flow endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="flow-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Bundles</div>
-                <div class="sub-title section-description">Bundle endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="bundle-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Extensions</div>
-                <div class="sub-title section-description">Extension endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="extension-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Extension Repository</div>
-                <div class="sub-title section-description">Extension Repository endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="extension-repository-endpoints" class="section-endpoints hidden"></div>
-        </div>
-        <div class="section">
-            <div class="section-header">
-                <div class="title link">Tenants</div>
-                <div class="sub-title section-description">Tenant endpoints</div>
-                <div class="clear"></div>
-            </div>
-            <div id="tenant-endpoints" class="section-endpoints hidden"></div>
-        </div>
-         <div class="section">
-              <div class="section-header">
-                  <div class="title link">Policies</div>
-                  <div class="sub-title section-description">Policy endpoints</div>
-                  <div class="clear"></div>
-              </div>
-              <div id="policy-endpoints" class="section-endpoints hidden"></div>
-          </div>
-          <div class="section">
-              <div class="section-header">
-                  <div class="title link">Access</div>
-                  <div class="sub-title section-description">Access endpoints</div>
-                  <div class="clear"></div>
-              </div>
-              <div id="access-endpoints" class="section-endpoints hidden"></div>
-          </div>
-
-        <div class="unorganized hidden">
-            {{#each paths}}
-                {{> endpoint}}
-            {{/each}}
-        </div>
-        {{#each definitions}}
-            {{> type}}
-        {{/each}}
-    </body>
-</html>
\ No newline at end of file
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/operation.hbs b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/operation.hbs
deleted file mode 100644
index 64bd582..0000000
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/operation.hbs
+++ /dev/null
@@ -1,110 +0,0 @@
-{{!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
---}}
-<div class="operation hidden">
-    {{#if description}}
-    <div class="description">
-        {{description}}
-    </div>
-    {{/if}}
-    <div class="title">Request</div>
-    <div class="mediatypes details">
-        {{#if consumes}}
-        <div class="mediatype"><div class="title">consumes:</div><div class="mono">{{join consumes ", "}}</div><div class="clear"></div></div>
-        {{/if}}
-    </div>
-    {{#if parameters}}
-    <table>
-        <thead>
-            <tr>
-                <th>Name</th>
-                <th>Location</th>
-                <th>Type</th>
-                <th>Description</th>
-            </tr>
-        </thead>
-        <tbody>
-    {{/if}}
-    {{#each parameters}}
-        <tr>
-            <td>{{#ifeq in "body"}}{{else}}{{name}}{{/ifeq}}</td>
-            <td>{{in}}</td>
-            {{#ifeq in "body"}}
-                <td>
-                {{#ifeq schema.type "array"}}Array[<a class="type-link" href="javascript:void(0);">{{basename schema.items.$ref}}</a>]{{/ifeq}}
-                {{#schema.$ref}}<a class="type-link" href="javascript:void(0);">{{basename schema.$ref}}</a> {{/schema.$ref}}
-                </td>
-            {{else}}
-                {{#ifeq type "array"}}
-                        <td>Array[{{items.type}}] ({{collectionFormat}})</td>
-                {{else}}
-                    {{#ifeq type "ref"}}
-                        <td>string</td>
-                    {{else}}
-                        <td>{{type}} {{#format}}({{format}}){{/format}}</td>
-                    {{/ifeq}}
-                {{/ifeq}}
-            {{/ifeq}}
-            <td>{{description}}</td>
-        </tr>
-    {{/each}}
-    {{#if parameters}}
-        </tbody>
-    </table>
-    {{/if}}
-    <div class="title">Response</div>
-    <div class="mediatypes details">
-        {{#if produces}}
-        <div class="mediatype"><div class="title">produces:</div><div class="mono">{{join produces ", "}}</div><div class="clear"></div></div>
-        {{/if}}
-    </div>
-    <table>
-        <thead>
-            <tr>
-                <th>Status Code</th>
-                <th>Type</th>
-                <th>Description</th>
-            </tr>
-        </thead>
-        <tbody>
-            {{#each responses}}
-            <tr>
-                <td>{{@key}}</td>
-                <td>
-                    {{#if schema}}
-                        {{#ifeq schema.type "array"}}
-                            {{#if schema.items.$ref}}
-                                array[<a class="type-link" href="javascript:void(0);">{{basename schema.items.$ref}}</a>]
-                            {{else}}
-                                array[{{schema.items.type}}]
-                            {{/if}}
-                        {{else}}
-                            {{#schema.$ref}}<a class="type-link" href="javascript:void(0);">{{basename schema.$ref}}</a>{{/schema.$ref}}
-                        {{/ifeq}}
-                    {{else}}
-                        string
-                    {{/if}}
-                </td>
-                <td>{{description}}</td>
-            </tr>
-            {{/each}}
-        </tbody>
-    </table>
-    {{#if vendorExtensions.x-access-policy}}
-        <div class="title">Authorization</div>
-        <div class="authorization details">
-            Requires access policy: {{vendorExtensions.x-access-policy.action}}:{{vendorExtensions.x-access-policy.resource}}
-        </div>
-    {{/if}}
-</div>
\ No newline at end of file
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/style.css.mustache b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/style.css.mustache
new file mode 100644
index 0000000..4dc8b82
--- /dev/null
+++ b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/style.css.mustache
@@ -0,0 +1,138 @@
+{{!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+        http://www.apache.org/licenses/LICENSE-2.0
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+--}}
+@font-face {
+  font-family: 'Open Sans';
+  font-style: normal;
+  font-weight: 300;
+  font-stretch: normal;
+  src: url(https://fonts.gstatic.com/s/opensans/v27/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsiH0B4gaVI.woff2) format('woff2');
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+body {
+  font-family: "Open Sans","DejaVu Sans",sans-serif;
+  margin: 0 auto;
+  width: 100%;
+  max-width: 62.5em;
+}
+
+h1 {
+  font-size: 2.75em;
+  color: rgba(0,0,0,0.85);
+  font-weight: 300;
+  font-style: normal;
+  line-height: 1.2;
+  word-spacing: -.05em;
+}
+
+h2 {
+  font-size: 2em;
+}
+
+h3 {
+  font-size: 1.5em;
+}
+
+h4 {
+  font-size: 1.25em;
+}
+
+h2, h3, h4, h5, h6 {
+  font-weight: 300;
+  font-style: normal;
+  color: #7a2518;
+  line-height: 1.2;
+  word-spacing: -.05em;
+}
+
+a {
+  color: #2156a5;
+  text-decoration: none;
+}
+
+h1 > a {
+  color: #7a2518;
+}
+
+h2 > a {
+  color: #7a2518;
+}
+
+h3 > a {
+  color: #7a2518;
+}
+
+h4 > a {
+  color: #7a2518;
+}
+
+h5 > a {
+  color: #7a2518;
+}
+
+h6 > a {
+  color: #7a2518;
+}
+
+pre {
+  background: #f7f7f8;
+  line-height: 1.45;
+  padding: 1em;
+  border-radius: 4px;
+}
+
+.app-desc {
+  margin-bottom: 10px;
+}
+
+.license-info {
+  margin-bottom: 10px;
+}
+
+.license-url {
+  margin-bottom: 10px;
+}
+
+.http-method {
+  text-transform: uppercase;
+}
+
+code {
+  white-space: pre;
+}
+
+code.huge {
+  font-size: 1.5em;
+}
+
+.up {
+  display: none;
+}
+
+.field-items {
+  margin-left: 10px;
+}
+
+.param-desc {
+  margin-bottom: 10px;
+}
+
+.param-type {
+  font-style: italic;
+}
+
+.param-header {
+  font-weight: bold;
+}
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/type.hbs b/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/type.hbs
deleted file mode 100644
index f6f117b..0000000
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-api/src/main/resources/templates/type.hbs
+++ /dev/null
@@ -1,57 +0,0 @@
-{{!--
-    Licensed to the Apache Software Foundation (ASF) under one or more
-    contributor license agreements.  See the NOTICE file distributed with
-    this work for additional information regarding copyright ownership.
-    The ASF licenses this file to You under the Apache License, Version 2.0
-    (the "License"); you may not use this file except in compliance with
-    the License.  You may obtain a copy of the License at
-        http://www.apache.org/licenses/LICENSE-2.0
-    Unless required by applicable law or agreed to in writing, software
-    distributed under the License is distributed on an "AS IS" BASIS,
-    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-    See the License for the specific language governing permissions and
-    limitations under the License.
---}}
-<div id="{{@key}}" class="type hidden">
-    <h3>{{@key}}</h3>
-    <div class="type-container">
-        <table>
-            <tr>
-                <th>Name</th>
-                <th>Type</th>
-                <th>Required</th>
-                <th>Description</th>
-            </tr>
-            {{#each properties}}
-                <tr>
-                    <td>{{@key}}</td>
-                    <td>
-                        {{#ifeq type "array"}}
-                            {{#items.$ref}}
-                                {{type}}[<a class="type-link" href="javascript:void(0);">{{basename items.$ref}}</a>]
-                            {{/items.$ref}}
-                            {{^items.$ref}}
-                                {{type}}[{{items.type}}]
-                            {{/items.$ref}}
-                        {{else}}
-                            {{#$ref}}
-                                <a class="type-link" href="javascript:void(0);">{{basename $ref}}</a>
-                            {{/$ref}}
-                            {{^$ref}}
-                                {{type}}{{#format}} ({{format}}){{/format}}
-                            {{/$ref}}
-                        {{/ifeq}}
-                    </td>
-                    <td>{{#required}}required{{/required}}{{^required}}optional{{/required}}</td>
-                    <td>{{#description}}{{{description}}}{{/description}}
-                        {{#if enum}} Allowable values: {{join enum ", "}}{{/if}}
-                        {{#if readOnly}} This property is read only.{{/if}}</td>
-                </tr>
-            {{/each}}
-        </table>
-        <h4>Example JSON</h4>
-        <code class="example"><span class="open-object">&#123;{{> example}}&#125;</span></code>
-    </div>
-    <div class="close">Close</div>
-    <div class="clear"></div>
-</div>
\ No newline at end of file
diff --git a/nifi-registry/nifi-registry-core/nifi-registry-web-docs/src/main/webapp/WEB-INF/jsp/documentation.jsp b/nifi-registry/nifi-registry-core/nifi-registry-web-docs/src/main/webapp/WEB-INF/jsp/documentation.jsp
index 0db7c41..c29fca2 100644
--- a/nifi-registry/nifi-registry-core/nifi-registry-web-docs/src/main/webapp/WEB-INF/jsp/documentation.jsp
+++ b/nifi-registry/nifi-registry-core/nifi-registry-web-docs/src/main/webapp/WEB-INF/jsp/documentation.jsp
@@ -68,7 +68,7 @@
                         <div class="header">Developer</div>
                         <div id="developer-links" class="component-links">
                             <ul>
-                                <li class="component-item"><a class="document-link rest-api" href="rest-api/rest-api.html" target="component-usage">REST API</a></li>
+                                <li class="component-item"><a class="document-link rest-api" href="rest-api/index.html" target="component-usage">REST API</a></li>
                             </ul>
                             <span class="no-matching no-components hidden">No matching developer guides</span>
                         </div>