JUNEAU-145 @RestResource(staticFiles) should handle multiple mappings.
diff --git a/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
new file mode 100644
index 0000000..8955e9b
--- /dev/null
+++ b/juneau-core/juneau-core-utest/src/test/java/org/apache/juneau/svl/vars/SystemPropertiesVarTest.java
@@ -0,0 +1,39 @@
+// ***************************************************************************************************************************
+// * 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. *
+// ***************************************************************************************************************************
+package org.apache.juneau.svl.vars;
+
+import static org.junit.Assert.*;
+
+import org.apache.juneau.svl.*;
+import org.junit.*;
+
+public class SystemPropertiesVarTest {
+
+ //====================================================================================================
+ // test - Basic tests
+ //====================================================================================================
+ @Test
+ public void test() throws Exception {
+ VarResolver vr = new VarResolverBuilder().vars(SystemPropertiesVar.class).build();
+
+ System.setProperty("SystemPropertiesVar.x", "foo");
+ assertEquals("foo", vr.resolve("$S{SystemPropertiesVar.x}"));
+ assertEquals("foo", vr.resolve("$S{SystemPropertiesVar.x,bar}"));
+ assertEquals("", vr.resolve("$S{SystemPropertiesVar.y}"));
+ assertEquals("bar", vr.resolve("$S{SystemPropertiesVar.y,bar}"));
+ assertEquals("bar,bar", vr.resolve("$S{SystemPropertiesVar.y,bar,bar}"));
+ assertEquals(" bar ", vr.resolve("$S{ SystemPropertiesVar.y , bar }"));
+ assertEquals(" bar,bar ", vr.resolve("$S{ SystemPropertiesVar.y , bar,bar }"));
+ assertEquals("", vr.resolve("$S{SystemPropertiesVar.y,}"));
+ }
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
index 9e102ae..6feba07 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/CollectionUtils.java
@@ -100,6 +100,16 @@
}
/**
+ * Returns a reverse iterable over the specified list.
+ *
+ * @param c The collection to iterate over.
+ * @return An iterable over the collection.
+ */
+ public static <T> Iterable<T> reverseIterable(final List<T> c) {
+ return iterable(c, true);
+ }
+
+ /**
* Returns an iterable over the specified array.
*
* @param c The collection to iterate over.
@@ -113,6 +123,16 @@
}
/**
+ * Returns a reverse iterable over the specified array.
+ *
+ * @param c The collection to iterate over.
+ * @return An iterable over the collection.
+ */
+ public static <T> Iterable<T> reverseIterable(T[] c) {
+ return iterable(c, true);
+ }
+
+ /**
* Returns an iterable over the specified enumeration.
*
* @param e The collection to iterate over.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
index cc24e01..534f51e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/DefaultingVar.java
@@ -12,8 +12,6 @@
// ***************************************************************************************************************************
package org.apache.juneau.svl;
-import static org.apache.juneau.internal.StringUtils.*;
-
/**
* Interface for the resolution of vars with a default value if the <c>resolve()</c> method returns <jk>null</jk>.
*
@@ -47,10 +45,11 @@
int i = s.indexOf(',');
if (i == -1)
return resolve(session, s.trim());
- String[] s2 = split(s);
- String v = resolve(session, s2[0]);
+ String s1 = s.substring(0, i);
+ String s2 = s.length() == i ? null : s.substring(i+1);
+ String v = resolve(session, s1);
if (v == null)
- v = s2[1];
+ v = s2;
return v;
}
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
index f8cb05a..dafbd92 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverContext.java
@@ -50,7 +50,7 @@
for (Class<?> c : vars) {
ClassInfo ci = ClassInfo.of(c);
if (! ci.isChildOf(Var.class))
- throw new VarResolverException("Invalid variable class. Must extend from Var");
+ throw new VarResolverException("Invalid variable class ''{0}''. Must extend from Var.", ci);
Var v = castOrCreate(Var.class, c);
m.put(v.getName(), v);
}
diff --git a/juneau-doc/docs/ReleaseNotes/8.1.1.html b/juneau-doc/docs/ReleaseNotes/8.1.1.html
index ca60e8f..4567ae7 100644
--- a/juneau-doc/docs/ReleaseNotes/8.1.1.html
+++ b/juneau-doc/docs/ReleaseNotes/8.1.1.html
@@ -35,6 +35,9 @@
<li class='jp'>{@link oaj.http.remote}
</ul>
These replace the <c>org.apache.juneau.rest.response</c>, <c>org.apache.juneau.rest.exception</c>, and <c>org.apache.juneau.rest.client.remote</c> packages.
+ <li>
+ Defaulting SVL variables now won't ignore additional parameters.
+ <br><js>"$S{Foo,bar,baz}"</js> used to default to <js>"bar"</js> but now will default to <js>"bar,baz"</js>.
</ul>
<h5 class='topic w800'>juneau-rest-server</h5>
@@ -75,10 +78,10 @@
</ul>
</ul>
<li>
- The <c>@RestResource(staticFiles)</c> annotation now supports absolute path locations:
+ The <c>@RestResource(staticFiles)</c> annotation now supports absolute path locations and multiple mappings:
<p class='bpcode w800'>
- <jc>// Resolves static files in root package "htdocs" or working directory "htdocs".
- <ja>@RestResource</ja>(staticFiles=<js>"htdocs:/htdocs"</js>)
+ <jc>// Resolves static files in root package "htdocs" or working directory "htdocs", and then relative package "htdocs".</jc>
+ <ja>@RestResource</ja>(staticFiles=<js>"htdocs:/htdocsfolder,htdocs:htdocs.package"</js>)
</p>
<li>
Fixed a bug in <c>@RestResource(staticFiles)</c> where the order of lookup between parent and child resources
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css b/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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. *
- ***************************************************************************************************************************/
-
-/** DevOps look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #3B4B54;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #B3B3B3;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #26343F;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #34534B;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #34534B;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #26343F;
-}
-
-article div.data {
- padding: 10px;
- background-color: white;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
- color: #26343F;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #D9DCDE;
- padding: 4px 8px;
- font-weight: bold;
- text-align: center;
- background-color: #F4F6F9;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #116998;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #26343F;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #f4f6f9;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index b55ffc6..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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. *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
- margin-bottom: 15px;
- width: 95%;
- border: none;
-}
-
-.swagger-ui table.header * {
- vertical-align: middle;
-}
-
-.swagger-ui table.header th {
- font-weight: bold;
- padding: 5px 10px;
- text-align: left;
- white-space: nowrap;
- border: none;
- border-radius: 3px;
-}
-
-.swagger-ui table.header td {
- padding: 5px 10px;
- text-align: left;
- vertical-align: middle;
- border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
- display: inline-block;
- font-weight: bold;
- min-width: 60px;
- padding: 6px 15px;
- text-align: center;
- border-radius: 3px;
- text-shadow: 0 1px 0 rgba(0,0,0,.1);
- color: #fff;
-}
-.get .method-button { background: rgb(97,175,254); }
-.put .method-button { background: rgb(252,161,48); }
-.post .method-button { background: rgb(73,204,144); }
-.delete .method-button { background: rgb(249,62,62); }
-.options .method-button { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
- min-width: 800px;
-}
-
-.tag-block-summary {
- margin: 10px 0px;
- padding: 5px 0px;
- align-items: center;
- cursor: pointer;
- border-bottom: 1px solid rgba(59,65,81,.2);
- user-select: none;
- transition: all .2s;
-}
-.tag-block-summary:hover {
- background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
- font-size: 18px;
- padding: 0px 20px;
-}
-.tag-block-summary .description {
- font-size: 14px;
- padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
- float: right;
- font-size: 14px;
- padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
- margin-bottom: 10px;
- align-items: center;
- border-radius: 4px;
-}
-
-.op-block.get { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {
- padding: 5px;
- cursor: pointer;
- user-select: none;
-}
-
-.op-block-summary .path {
- font-size: 14px;
- word-break: break-all;
- font-family: monospace;
- font-weight: bold;
- padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
- font-size: 14px;
- padding: 10px;
-}
-
-.op-block-description {
- font-size: 14px;
- padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
- padding: 8px 15px;
- background: hsla(0,0%,100%,.3);
- box-shadow: 1px 2px 3px rgba(0,0,0,.3);
- margin: 10px;
- border-radius: 4px;
-}
-
-.op-block-section-header .title {
- font-size: 14px;
- margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
- border-collapse: collapse;
- margin: 20px;
- width: 95%;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
- font-size: 12px;
- font-weight: bold;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
- font-size: 12px;
- padding: 10px;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
- padding: 10px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
- font-size: 12px;
- font-family: monospace;
- font-weight: bold;
- font-style: italic;
- color: gray;
-}
-
-.parameter-key .name {
- font-size: 14px;
-}
-
-.parameter-key .name.required {
- font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
- font-size: 10px;
- color: rgba(255,0,0,.6);
- font-weight: bold;
-}
-
-.parameter-key .type {
- font-size: 12px;
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-contents .example-select {
- margin: 10px 0 5px 0;
- border-width: 1px;
- font-weight:bold;
- padding: 5px 40px 5px 10px;
- border: 1px solid #41444e;
- border-radius: 4px;
- box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
- background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
- color: rgba(0,0,0,.50);
- border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
- margin: 0;
- padding: 5px 20px;
- white-space: pre-wrap;
- word-wrap: break-word;
- hyphens: auto;
- border-radius: 4px;
- background: #41444e;
- overflow-wrap: break-word;
- font-family: monospace;
- font-weight: 400;
- color: limegreen;
- display: none;
- max-width: 800px;
- max-height: 800px;
- text-overflow: auto;
- overflow: auto;
-}
-
-.op-block-contents .example.active {
- display:block;
-}
-
-.op-block-contents .model {
- display: none;
-}
-
-.op-block-contents .model.active {
- display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.headers .name {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-div.headers {
- margin: 20px 0px;
-}
-
-.headers .type {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-.section-name {
- display: inline-block;
- vertical-align: top;
- margin-right: 20px;
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.section-table {
-/* display: inline-block;*/
-}
-
-.responses .section-table td {
- padding: 5px 20px 5px 0px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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. *
- ***************************************************************************************************************************/
-
-/** Dark look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #212121 ;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #EEE;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #373a3c;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #000000;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #EEE;
-}
-
-article textarea, article input, article button {
- color: #111;
-}
-
-article textarea, article input {
- background-color: #EEE;
-}
-
-article div.data {
- padding: 10px;
- background-color: #373a3c;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- font-weight: normal;
- text-align: center;
- background-color: #0275d8;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #000000;
- border-right: 1px solid #000000;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #3d8bb5;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #DDD;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
- color: black;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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. *
- ***************************************************************************************************************************/
-
-/** DevOps look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #3B4B54;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #B3B3B3;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #26343F;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #34534B;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #34534B;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #26343F;
-}
-
-article div.data {
- padding: 10px;
- background-color: white;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
- color: #26343F;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #D9DCDE;
- padding: 4px 8px;
- font-weight: bold;
- text-align: center;
- background-color: #F4F6F9;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #116998;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #26343F;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #f4f6f9;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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. *
- ***************************************************************************************************************************/
-
-/** Light look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- margin: 0px;
- font-size: 10px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #2c4557;
- height: 100%;
-}
-
-body * {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #e8ebef;
- padding: 10px 20px;
- box-shadow: 5px 5px 2px #999999;
- text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;
- white-space: nowrap;
-}
-
-header * {
- color: #af2222;;
- font-weight: lighter;
-}
-
-header h1 {
- font-size: 18px;
- margin: 0px;
- padding: 2px;
-}
-
-header h2 {
- font-size: 14px;
- margin: 0px;
- padding: 2px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px;
- padding: 5px;
- box-shadow: 5px 5px 2px #999999;
- background-color: #eef3f7;
-}
-
-nav * {
- font-size: 12px;
- font-weight: lighter;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #2c4557;
- text-decoration: none;
- margin: 0px 10px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- text-decoration: none;
- color: #94a3ab;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-article * {
- font-size: 9pt;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- text-align: center;
- background-color: #eef3f7;
- box-shadow: 1px 1px 2px #999999;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #416e8e;
- text-decoration: none;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #e8ebef;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: #2c4557;
- font-size: 10pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css b/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-examples/juneau-examples-rest-springboot/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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. *
- ***************************************************************************************************************************/
-
-/** Original look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-attachment: fixed;
- font-family: Sans-Serif;
- color: #2c4557;
- height: 100%;
- margin: 0px;
-}
-
-body * {
- font-size: 12px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- padding: 10px 20px;
-}
-
-header h1 {
- font-size: 16px;
- margin-bottom: 10px;
- margin-right: 40px;
- padding: 5px 30px;
- border-radius: 15px;
- text-decoration: none;
- font-weight: normal;
- background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
- background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));
-}
-
-header h2 {
- font-weight: normal;
- margin-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 0px 25px;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- text-decoration: underline;
- cursor: pointer;
- color: -webkit-link;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border:1px solid #CCCC99;
- border-collapse: collapse;
- margin: 5px 0px;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #CCCC99;
- padding: 3px 5px;
- color: #666666;
- text-align: center;
- background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
- background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
-}
-
-article td {
- border: 1px solid #E9EACB;
- padding: 2px 5px;
- color: #005C87;
- vertical-align: top;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- display: none;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- font-size: 9pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg b/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
index dbf37f3..5cabc07 100644
--- a/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
+++ b/juneau-microservice/juneau-microservice-ftest/juneau-microservice-test.cfg
@@ -43,9 +43,9 @@
[Test]
int1 = 1
int2 = [1,2,3]
-int3 = $C{Test/int1, -1}
-int4 = $C{Test/int3, -1}
-int5 = $C{XXX, -1}
+int3 = $C{Test/int1,-1}
+int4 = $C{Test/int3,-1}
+int5 = $C{XXX,-1}
boolean1 = true
boolean2 = [true,true]
testManifestEntry = $MF{Test-Entry}
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt
new file mode 100644
index 0000000..880c2aa
--- /dev/null
+++ b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/about.txt
@@ -0,0 +1,14 @@
+ ***************************************************************************************************************************
+ * 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. *
+ ***************************************************************************************************************************
+
+This directory can be used to hold static files served up under the <servlet-path>/htdocs URI.
\ No newline at end of file
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index e1c8a21..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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. *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
- margin-bottom: 15px;
- width: 95%;
- border: none;
-}
-
-.swagger-ui table.header * {
- vertical-align: middle;
-}
-
-.swagger-ui table.header th {
- font-weight: bold;
- padding: 5px 10px;
- text-align: left;
- white-space: nowrap;
- border: none;
- border-radius: 3px;
-}
-
-.swagger-ui table.header td {
- padding: 5px 10px;
- text-align: left;
- vertical-align: middle;
- border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
- display: inline-block;
- font-weight: bold;
- min-width: 60px;
- padding: 6px 15px;
- text-align: center;
- border-radius: 3px;
- text-shadow: 0 1px 0 rgba(0,0,0,.1);
- color: #fff;
-}
-.get .method-button { background: rgb(97,175,254); }
-.put .method-button { background: rgb(252,161,48); }
-.post .method-button { background: rgb(73,204,144); }
-.delete .method-button { background: rgb(249,62,62); }
-.options .method-button { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
- min-width: 800px;
-}
-
-.tag-block-summary {
- margin: 10px 0px;
- padding: 5px 0px;
- align-items: center;
- cursor: pointer;
- border-bottom: 1px solid rgba(59,65,81,.2);
- user-select: none;
- transition: all .2s;
-}
-.tag-block-summary:hover {
- background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
- font-size: 18px;
- padding: 0px 20px;
-}
-.tag-block-summary .description {
- font-size: 14px;
- padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
- float: right;
- font-size: 14px;
- padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
- margin-bottom: 10px;
- align-items: center;
- border-radius: 4px;
-}
-
-.op-block.get { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {
- padding: 5px;
- cursor: pointer;
- user-select: none;
-}
-
-.op-block-summary .path {
- font-size: 14px;
- word-break: break-all;
- font-family: monospace;
- font-weight: bold;
- padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
- font-size: 14px;
- padding: 10px;
-}
-
-.op-block-description {
- font-size: 14px;
- padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
- padding: 8px 15px;
- background: hsla(0,0%,100%,.3);
- box-shadow: 1px 2px 3px rgba(0,0,0,.3);
- margin: 10px;
- border-radius: 4px;
-}
-
-.op-block-section-header .title {
- font-size: 14px;
- margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
- border-collapse: collapse;
- margin: 20px;
- width: 95%;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
- font-size: 12px;
- font-weight: bold;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
- font-size: 12px;
- padding: 10px;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
- padding: 10px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
- font-size: 12px;
- font-family: monospace;
- font-weight: bold;
- font-style: italic;
- color: gray;
-}
-
-.parameter-key .name {
- font-size: 14px;
-}
-
-.parameter-key .name.required {
- font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
- font-size: 10px;
- color: rgba(255,0,0,.6);
- font-weight: bold;
-}
-
-.parameter-key .type {
- font-size: 12px;
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-contents .example-select {
- margin: 10px 0 5px 0;
- border-width: 1px;
- font-weight:bold;
- padding: 5px 40px 5px 10px;
- border: 1px solid #41444e;
- border-radius: 4px;
- box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
- background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
- color: rgba(0,0,0,.50);
- border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
- margin: 0;
- padding: 5px 20px;
- white-space: pre-wrap;
- word-wrap: break-word;
- hyphens: auto;
- border-radius: 4px;
- background: #41444e;
- overflow-wrap: break-word;
- font-family: monospace;
- font-weight: 400;
- color: #fff;
- display: none;
- max-width: 800px;
- max-height: 800px;
- text-overflow: auto;
- overflow: auto;
-}
-
-.op-block-contents .example.active {
- display:block;
-}
-
-.op-block-contents .model {
- display: none;
-}
-
-.op-block-contents .model.active {
- display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.headers .name {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-div.headers {
- margin: 20px 0px;
-}
-
-.headers .type {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-.section-name {
- display: inline-block;
- vertical-align: top;
- margin-right: 20px;
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.section-table {
-/* display: inline-block;*/
-}
-
-.responses .section-table td {
- padding: 5px 20px 5px 0px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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. *
- ***************************************************************************************************************************/
-
-/** Dark look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #212121 ;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #EEE;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #373a3c;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #000000;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #EEE;
-}
-
-article textarea, article input, article button {
- color: #111;
-}
-
-article textarea, article input {
- background-color: #EEE;
-}
-
-article div.data {
- padding: 10px;
- background-color: #373a3c;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- font-weight: normal;
- text-align: center;
- background-color: #0275d8;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #000000;
- border-right: 1px solid #000000;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #3d8bb5;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #DDD;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
- color: black;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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. *
- ***************************************************************************************************************************/
-
-/** DevOps look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #3B4B54;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #B3B3B3;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #26343F;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #34534B;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #34534B;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #26343F;
-}
-
-article div.data {
- padding: 10px;
- background-color: white;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
- color: #26343F;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #D9DCDE;
- padding: 4px 8px;
- font-weight: bold;
- text-align: center;
- background-color: #F4F6F9;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #116998;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #26343F;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #f4f6f9;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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. *
- ***************************************************************************************************************************/
-
-/** Light look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- margin: 0px;
- font-size: 10px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #2c4557;
- height: 100%;
-}
-
-body * {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #e8ebef;
- padding: 10px 20px;
- box-shadow: 5px 5px 2px #999999;
- text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;
- white-space: nowrap;
-}
-
-header * {
- color: #af2222;;
- font-weight: lighter;
-}
-
-header h1 {
- font-size: 18px;
- margin: 0px;
- padding: 2px;
-}
-
-header h2 {
- font-size: 14px;
- margin: 0px;
- padding: 2px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px;
- padding: 5px;
- box-shadow: 5px 5px 2px #999999;
- background-color: #eef3f7;
-}
-
-nav * {
- font-size: 12px;
- font-weight: lighter;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #2c4557;
- text-decoration: none;
- margin: 0px 10px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- text-decoration: none;
- color: #94a3ab;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-article * {
- font-size: 9pt;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- text-align: center;
- background-color: #eef3f7;
- box-shadow: 1px 1px 2px #999999;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #416e8e;
- text-decoration: none;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #e8ebef;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: #2c4557;
- font-size: 10pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css b/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-microservice/juneau-my-jetty-microservice/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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. *
- ***************************************************************************************************************************/
-
-/** Original look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-attachment: fixed;
- font-family: Sans-Serif;
- color: #2c4557;
- height: 100%;
- margin: 0px;
-}
-
-body * {
- font-size: 12px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- padding: 10px 20px;
-}
-
-header h1 {
- font-size: 16px;
- margin-bottom: 10px;
- margin-right: 40px;
- padding: 5px 30px;
- border-radius: 15px;
- text-decoration: none;
- font-weight: normal;
- background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
- background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));
-}
-
-header h2 {
- font-weight: normal;
- margin-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 0px 25px;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- text-decoration: underline;
- cursor: pointer;
- color: -webkit-link;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border:1px solid #CCCC99;
- border-collapse: collapse;
- margin: 5px 0px;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #CCCC99;
- padding: 3px 5px;
- color: #666666;
- text-align: center;
- background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
- background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
-}
-
-article td {
- border: 1px solid #E9EACB;
- padding: 2px 5px;
- color: #005C87;
- vertical-align: top;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- display: none;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- font-size: 9pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt
new file mode 100644
index 0000000..880c2aa
--- /dev/null
+++ b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/about.txt
@@ -0,0 +1,14 @@
+ ***************************************************************************************************************************
+ * 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. *
+ ***************************************************************************************************************************
+
+This directory can be used to hold static files served up under the <servlet-path>/htdocs URI.
\ No newline at end of file
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png
deleted file mode 100644
index ce28113..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/asf.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png
deleted file mode 100644
index 42a1656..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/images/juneau.png
+++ /dev/null
Binary files differ
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
deleted file mode 100644
index e1c8a21..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/styles/SwaggerUI.css
+++ /dev/null
@@ -1,342 +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. *
- ***************************************************************************************************************************
-*/
-
-.swagger-ui {
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Header key-value pairs
- ----------------------------------------------------------------------------------------------------------*/
-
-.swagger-ui table.header {
- margin-bottom: 15px;
- width: 95%;
- border: none;
-}
-
-.swagger-ui table.header * {
- vertical-align: middle;
-}
-
-.swagger-ui table.header th {
- font-weight: bold;
- padding: 5px 10px;
- text-align: left;
- white-space: nowrap;
- border: none;
- border-radius: 3px;
-}
-
-.swagger-ui table.header td {
- padding: 5px 10px;
- text-align: left;
- vertical-align: middle;
- border: none;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Method buttons (e.g GET/PUT/... buttons)
- ----------------------------------------------------------------------------------------------------------*/
-.method-button {
- display: inline-block;
- font-weight: bold;
- min-width: 60px;
- padding: 6px 15px;
- text-align: center;
- border-radius: 3px;
- text-shadow: 0 1px 0 rgba(0,0,0,.1);
- color: #fff;
-}
-.get .method-button { background: rgb(97,175,254); }
-.put .method-button { background: rgb(252,161,48); }
-.post .method-button { background: rgb(73,204,144); }
-.delete .method-button { background: rgb(249,62,62); }
-.options .method-button { background: rgb(153,102,255); }
-.deprecated .method-button { background: rgb(170,170,170); }
-.model .method-button { background: rgb(150,150,150); min-width: 120px;}
-.other .method-button { background: rgb(230,230,0); }
-
-
-/*-----------------------------------------------------------------------------------------------------------
- - Tag block -
- - Encapsulates one or more op-blocks.
- ----------------------------------------------------------------------------------------------------------*/
-
-.tag-block {
- min-width: 800px;
-}
-
-.tag-block-summary {
- margin: 10px 0px;
- padding: 5px 0px;
- align-items: center;
- cursor: pointer;
- border-bottom: 1px solid rgba(59,65,81,.2);
- user-select: none;
- transition: all .2s;
-}
-.tag-block-summary:hover {
- background-color: rgba(59,65,81,.1);
-}
-
-.tag-block-summary .name {
- font-size: 18px;
- padding: 0px 20px;
-}
-.tag-block-summary .description {
- font-size: 14px;
- padding: 0px 20px;
-}
-.tag-block-summary .extdocs {
- float: right;
- font-size: 14px;
- padding: 0px 20px;
-}
-
-.tag-block-open .tag-block-contents { display: block; }
-.tag-block-closed .tag-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block
- - Encapsulates a single http-method + http-path
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block {
- margin-bottom: 10px;
- align-items: center;
- border-radius: 4px;
-}
-
-.op-block.get { background: rgba(97,175,254,.1); border: 1px solid rgb(97,175,254); }
-.op-block.put { background: rgba(252,161,48,.1); border: 1px solid rgb(252,161,48); }
-.op-block.post { background: rgba(73,204,144,.1); border: 1px solid rgb(73,204,144); }
-.op-block.options { background: rgba(153,102,255,.1); border: 1px solid rgb(153,102,255); }
-.op-block.delete { background: rgba(249,62,62,.1); border: 1px solid rgb(249,62,62); }
-.op-block.deprecated { background: rgba(170,170,170,.1); border: 1px solid rgb(170,170,170); }
-.op-block.model { background: rgba(0,0,0,.05); border: 1px solid rgb(170,170,170); }
-.op-block.other { background: rgba(230,230,0,0.1); border: 1px solid rgb(230,230,0); }
-
-.op-block-summary {
- padding: 5px;
- cursor: pointer;
- user-select: none;
-}
-
-.op-block-summary .path {
- font-size: 14px;
- word-break: break-all;
- font-family: monospace;
- font-weight: bold;
- padding:10px;
-}
-
-.op-block.deprecated .op-block-summary .path { color: #8f9199; text-decoration: line-through;}
-.op-block.deprecated .op-block-summary .description { color: #8f9199 }
-
-.op-block-summary .summary {
- font-size: 14px;
- padding: 10px;
-}
-
-.op-block-description {
- font-size: 14px;
- padding: 10px;
-}
-
-
-.op-block-open .op-block-contents { display: block; }
-.op-block-closed .op-block-contents { display: none; }
-
-/*-----------------------------------------------------------------------------------------------------------
- - Op block section header -
- - 'Parameters' and 'Responses' subsections in an op-block
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-section-header {
- padding: 8px 15px;
- background: hsla(0,0%,100%,.3);
- box-shadow: 1px 2px 3px rgba(0,0,0,.3);
- margin: 10px;
- border-radius: 4px;
-}
-
-.op-block-section-header .title {
- font-size: 14px;
- margin: 0px;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameters and Responses sections
- ----------------------------------------------------------------------------------------------------------*/
-
-table.parameters, table.responses {
- border-collapse: collapse;
- margin: 20px;
- width: 95%;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-th.parameter-key, th.response-key {
- font-size: 12px;
- font-weight: bold;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-key, td.response-key {
- font-size: 12px;
- padding: 10px;
- text-align: left;
- border: none;
- border-bottom: 1px solid rgba(59,65,81,.2);
- background-color: inherit;
-}
-
-td.parameter-value, td.response-value {
- padding: 10px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Parameter name
- ----------------------------------------------------------------------------------------------------------*/
-
-.parameter-key .in {
- font-size: 12px;
- font-family: monospace;
- font-weight: bold;
- font-style: italic;
- color: gray;
-}
-
-.parameter-key .name {
- font-size: 14px;
-}
-
-.parameter-key .name.required {
- font-weight: bold;
-}
-
-.parameter-key .requiredlabel {
- font-size: 10px;
- color: rgba(255,0,0,.6);
- font-weight: bold;
-}
-
-.parameter-key .type {
- font-size: 12px;
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Examples
- ----------------------------------------------------------------------------------------------------------*/
-
-.op-block-contents .example-select {
- margin: 10px 0 5px 0;
- border-width: 1px;
- font-weight:bold;
- padding: 5px 40px 5px 10px;
- border: 1px solid #41444e;
- border-radius: 4px;
- box-shadow: 0 1px 2px 0 rgba(0,0,0,.25);
- background: hsla(0,0%,100%,.3);
-}
-
-.op-block-contents .example-select:disabled {
- color: rgba(0,0,0,.50);
- border: 1px solid rgba(0,0,0,.50);
-}
-
-.op-block-contents .example {
- margin: 0;
- padding: 5px 20px;
- white-space: pre-wrap;
- word-wrap: break-word;
- hyphens: auto;
- border-radius: 4px;
- background: #41444e;
- overflow-wrap: break-word;
- font-family: monospace;
- font-weight: 400;
- color: #fff;
- display: none;
- max-width: 800px;
- max-height: 800px;
- text-overflow: auto;
- overflow: auto;
-}
-
-.op-block-contents .example.active {
- display:block;
-}
-
-.op-block-contents .model {
- display: none;
-}
-
-.op-block-contents .model.active {
- display:block;
-}
-
-/*-----------------------------------------------------------------------------------------------------------
- - Headers
- ----------------------------------------------------------------------------------------------------------*/
-
-.section {
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.headers .name {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-div.headers {
- margin: 20px 0px;
-}
-
-.headers .type {
- padding: 5px 0;
- font-family: monospace;
- font-weight: bold;
-}
-
-.section-name {
- display: inline-block;
- vertical-align: top;
- margin-right: 20px;
- font-weight: bold;
- padding: 5px 0;
- text-align: left;
-}
-
-.section-table {
-/* display: inline-block;*/
-}
-
-.responses .section-table td {
- padding: 5px 20px 5px 0px;
- text-align: left;
- border-bottom: 1px solid rgba(59,65,81,.2);
-}
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css
deleted file mode 100644
index c81702d..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/dark.css
+++ /dev/null
@@ -1,285 +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. *
- ***************************************************************************************************************************/
-
-/** Dark look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #212121 ;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #EEE;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #373a3c;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #000000;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #000000;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #EEE;
-}
-
-article textarea, article input, article button {
- color: #111;
-}
-
-article textarea, article input {
- background-color: #EEE;
-}
-
-article div.data {
- padding: 10px;
- background-color: #373a3c;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- font-weight: normal;
- text-align: center;
- background-color: #0275d8;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #000000;
- border-right: 1px solid #000000;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #3d8bb5;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #373a3c;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #DDD;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip .tooltiptext * {
- color: black;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css
deleted file mode 100644
index ad7188a..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/devops.css
+++ /dev/null
@@ -1,276 +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. *
- ***************************************************************************************************************************/
-
-/** DevOps look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-color: #3B4B54;
- margin: 0px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #B3B3B3;
- height: 100%;
-}
-
-body {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #26343F;
-}
-
-header * {
- font-size: 14px;
- color: #B3B3B3;
- margin: 0px;
- text-decoration: none;
- font-weight: normal;
-}
-
-header h1 {
- padding: 10px 20px;
- font-size: 16px;
- border-bottom: 2px solid #34534B;
- color: white;
-}
-
-header h2 {
- padding: 10px 20px;
- font-size: 14px;
- border-bottom: 2px solid #34534B;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px 20px 10px 20px;
- color: #94A3AB;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #94A3AB;
- text-decoration: none;
- margin: 0px 15px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- color: white;
- text-decoration: underline;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin-bottom: 50px;
-}
-
-article {
- display: table-cell;
-}
-
-article * {
- font-size: 9pt;
- color: #26343F;
-}
-
-article div.data {
- padding: 10px;
- background-color: white;
- border-radius: 4px;
- margin: 20px;
- display: inline-block;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- font-family: sans-serif;
- color: #26343F;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #D9DCDE;
- padding: 4px 8px;
- font-weight: bold;
- text-align: center;
- background-color: #F4F6F9;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #116998;
- text-decoration: none;
-}
-
-article a:hover {
- text-decoration: underline;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #26343F;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #f4f6f9;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: black;
- font-size: 11px;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display:block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css
deleted file mode 100644
index aa91f98..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/light.css
+++ /dev/null
@@ -1,273 +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. *
- ***************************************************************************************************************************/
-
-/** Light look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- margin: 0px;
- font-size: 10px;
- font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;
- color: #2c4557;
- height: 100%;
-}
-
-body * {
- font-size: 14px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- background-color: #e8ebef;
- padding: 10px 20px;
- box-shadow: 5px 5px 2px #999999;
- text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px;
- white-space: nowrap;
-}
-
-header * {
- color: #af2222;;
- font-weight: lighter;
-}
-
-header h1 {
- font-size: 18px;
- margin: 0px;
- padding: 2px;
-}
-
-header h2 {
- font-size: 14px;
- margin: 0px;
- padding: 2px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 10px;
- padding: 5px;
- box-shadow: 5px 5px 2px #999999;
- background-color: #eef3f7;
-}
-
-nav * {
- font-size: 12px;
- font-weight: lighter;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- font-size: 10pt;
- color: #2c4557;
- text-decoration: none;
- margin: 0px 10px;
- text-transform: uppercase;
- cursor: pointer;
-}
-
-nav a:active, nav a:hover {
- text-decoration: none;
- color: #94a3ab;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-article * {
- font-size: 9pt;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border: none;
- width: 100%;
-}
-
-article td {
- vertical-align: top;
- border-bottom: 1px solid #d9dcde;
- border-right: 1px solid #d9dcde;
- padding: 2px 5px;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article th {
- padding: 4px 8px;
- text-align: center;
- background-color: #eef3f7;
- box-shadow: 1px 1px 2px #999999;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-article a {
- color: #416e8e;
- text-decoration: none;
-}
-
-article iframe {
- background-color: #F6F7F9;
- border: 1px solid gray;
- padding: 0px;
- overflow: hidden;
- width: 100%;
- min-height: 400px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- padding: 10px;
- width: 100%;
- bottom: 0;
- position: fixed;
- background-color: #e8ebef;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- color: #2c4557;
- font-size: 10pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
diff --git a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css b/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css
deleted file mode 100644
index 2052281..0000000
--- a/juneau-microservice/juneau-my-springboot-microservice/src/main/resources/htdocs/themes/original.css
+++ /dev/null
@@ -1,237 +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. *
- ***************************************************************************************************************************/
-
-/** Original look-and-feel */
-
-/**********************************************************************************************************************/
-/** Body **/
-/**********************************************************************************************************************/
-
-body {
- background-image: linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-image: -webkit-linear-gradient(top, #CDDDDF 0, #EAEDED 20px, #FFFFFF 70px);
- background-attachment: fixed;
- font-family: Sans-Serif;
- color: #2c4557;
- height: 100%;
- margin: 0px;
-}
-
-body * {
- font-size: 12px;
-}
-
-body textarea, body pre {
- -moz-tab-size: 3;
- -o-tab-size: 3;
- -webkit-tab-size: 3;
- tab-size: 3;
-}
-
-/**********************************************************************************************************************/
-/** Header **/
-/**********************************************************************************************************************/
-
-header {
- padding: 10px 20px;
-}
-
-header h1 {
- font-size: 16px;
- margin-bottom: 10px;
- margin-right: 40px;
- padding: 5px 30px;
- border-radius: 15px;
- text-decoration: none;
- font-weight: normal;
- background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
- background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9));
-}
-
-header h2 {
- font-weight: normal;
- margin-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Nav **/
-/**********************************************************************************************************************/
-
-nav {
- margin: 0px 25px;
-}
-
-nav>ol {
- list-style-type: none;
- margin: 0px 10px;
- padding: 0px;
-}
-
-nav>ol>li {
- display: inline;
-}
-
-nav li:not(:first-child):before {
- content: " - ";
-}
-
-nav a {
- text-decoration: underline;
- cursor: pointer;
- color: -webkit-link;
-}
-
-/**********************************************************************************************************************/
-/** Content **/
-/**********************************************************************************************************************/
-
-section {
- display: table;
- width: 100%;
- margin: 0px 0px 50px 0px;
-}
-
-article {
- display: table-cell;
- padding: 20px 40px;
-}
-
-aside {
- display: table-cell;
- vertical-align: top;
- padding: 20px 20px;
-}
-
-article div.data {
- padding: 0px;
- margin: 0px;
- display: inline-block;
- font-family: sans-serif;
-}
-
-article table {
- border:1px solid #CCCC99;
- border-collapse: collapse;
- margin: 5px 0px;
- width: 100%;
-}
-
-article th {
- border-top: 1px solid #CCCC99;
- padding: 3px 5px;
- color: #666666;
- text-align: center;
- background-image: linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
- background-image: -webkit-linear-gradient(top, #FBF9E4 0%, #F3F2C2 100%);
-}
-
-article td {
- border: 1px solid #E9EACB;
- padding: 2px 5px;
- color: #005C87;
- vertical-align: top;
-}
-
-article td:last-child {
- width: 100%;
-}
-
-article ul {
- margin: 0px;
- padding-left: 20px;
-}
-
-/**********************************************************************************************************************/
-/** Footer **/
-/**********************************************************************************************************************/
-
-footer {
- display: none;
-}
-
-/**********************************************************************************************************************/
-/** Popup windows **/
-/**********************************************************************************************************************/
-
-.popup-content {
- display: none;
- position: absolute;
- background-color: #eef3f7;
- white-space: nowrap;
- padding: 5px;
- box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
- z-index: 1;
- margin-top: 10px;
- border-radius: 4px;
-}
-
-.popup-content * {
- font-size: 9pt;
-}
-
-.popup-content a:hover {
- color: #94A3AB;
-}
-
-.popup-show {
- display: block;
-}
-
-/**********************************************************************************************************************/
-/** Tooltips **/
-/**********************************************************************************************************************/
-
-.tooltip {
- position: relative;
- display: inline-block;
-}
-
-.tooltip .tooltiptext {
- visibility: hidden;
- background-color: #FEF9E7;
- color: black;
- padding: 5px;
- border-radius: 6px;
- position: absolute;
- z-index: 1;
- top: 0;
- left: 0;
- margin-left: 30px;
- box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5);
- opacity: 0;
- transition: opacity 0.5s;
- font-weight: normal;
-}
-
-.tooltip:hover .tooltiptext {
- visibility: visible;
- opacity: 1;
-}
-
-.tooltiptext {
- white-space: nowrap;
- float: left;
- border: 1px solid black;
-}
-
-/**********************************************************************************************************************/
-/** Other classes **/
-/**********************************************************************************************************************/
-
-.table {display:table;}
-.row {display:table-row;}
-.cell {display:table-cell;}
-.monospace {font-family:monospace;}
-.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
-.link:hover { text-decoration: underline; }
-
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java
new file mode 100644
index 0000000..d7b8489
--- /dev/null
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/StaticFilesMappingTest.java
@@ -0,0 +1,246 @@
+// ***************************************************************************************************************************
+// * 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. *
+// ***************************************************************************************************************************
+package org.apache.juneau.rest;
+
+import static org.apache.juneau.testutils.TestUtils.*;
+import static org.junit.Assert.*;
+
+import java.util.*;
+
+import org.apache.juneau.parser.*;
+import org.junit.*;
+import org.junit.runners.*;
+
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class StaticFilesMappingTest {
+
+ private static Collection<StaticFileMapping> parse(String input) throws ParseException {
+ return StaticFileMapping.parse(null, input);
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Empty input.
+ //------------------------------------------------------------------------------------------------------------------
+
+ @Test
+ public void a01_null() throws Exception {
+ assertObjectEquals("[]", parse(null));
+ }
+
+ @Test
+ public void a02_emptySpaces() throws Exception {
+ assertObjectEquals("[]", parse(" "));
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Basic tests.
+ //------------------------------------------------------------------------------------------------------------------
+
+ @Test
+ public void b01_basic2Part() throws Exception {
+ assertObjectEquals("[{path:'foo',location:'bar'}]", parse("foo:bar"));
+ }
+
+ @Test
+ public void b02_basic2Part_withSpaces() throws Exception {
+ assertObjectEquals("[{path:'foo',location:'bar'}]", parse(" foo : bar "));
+ }
+
+ @Test
+ public void b03_basic3Part() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{baz:'qux'}}]",
+ parse("foo:bar:{baz:'qux'}")
+ );
+ }
+
+ @Test
+ public void b04_basic3Part_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{baz:'qux'}}]",
+ parse(" foo : bar : { baz : 'qux' } ")
+ );
+ }
+
+ @Test
+ public void b05_multipleHeaders() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{baz:'qux',qux:'quux'}}]",
+ parse("foo:bar:{baz:'qux',qux:'quux'}")
+ );
+ }
+
+ @Test
+ public void b06_multipleHeaders_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{baz:'qux',qux:'quux'}}]",
+ parse(" foo : bar : { baz : 'qux' , qux: 'quux' } ")
+ );
+ }
+
+ @Test
+ public void b07_nestedHeaders() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:{b:'c'}}}]",
+ parse("foo:bar:{a:{b:'c'}}")
+ );
+ }
+
+ @Test
+ public void b08_nestedHeaders_complex() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}}]",
+ parse("foo:bar:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}")
+ );
+ }
+
+ @Test
+ public void b09_nestedHeaders_complex_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:{b:'c',d:'e'},f:{g:'h',i:'j'}}}]",
+ parse(" foo : bar : { a : { b : 'c' , d : 'e' } , f : { g : 'h' , i : 'j' } } ")
+ );
+ }
+
+ @Test
+ public void b10_emptyHeaders() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar'}]",
+ parse("foo:bar:{}")
+ );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Multiple mappings
+ //------------------------------------------------------------------------------------------------------------------
+
+ @Test
+ public void c01_multipleMappings_basic2Part() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar'},{path:'baz',location:'qux'}]",
+ parse("foo:bar,baz:qux")
+ );
+ }
+
+ @Test
+ public void c02_multipleMappings_basic2Part_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar'},{path:'baz',location:'qux'}]",
+ parse(" foo : bar , baz : qux ")
+ );
+ }
+
+ @Test
+ public void c03_multipleMappings_basic3Part() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:'b'}},{path:'baz',location:'qux',responseHeaders:{c:'d'}}]",
+ parse("foo:bar:{a:'b'},baz:qux:{c:'d'}")
+ );
+ }
+
+ @Test
+ public void c04_multipleMappings_basic3Part_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:'b'}},{path:'baz',location:'qux',responseHeaders:{c:'d'}}]",
+ parse(" foo : bar : { a : 'b' } , baz : qux : { c : 'd' } ")
+ );
+ }
+
+ @Test
+ public void c05_multipleMappings_multipleHeaders() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:'b',c:'d'}},{path:'baz',location:'qux',responseHeaders:{e:'f',g:'h'}}]",
+ parse("foo:bar:{a:'b',c:'d'},baz:qux:{e:'f',g:'h'}")
+ );
+ }
+
+ @Test
+ public void c06_multipleMappings_multipleHeaders_withSpaces() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:'b',c:'d'}},{path:'baz',location:'qux',responseHeaders:{e:'f',g:'h'}}]",
+ parse(" foo : bar : { a : 'b' , c : 'd' } , baz : qux : { e : 'f' , g : 'h' } ")
+ );
+ }
+
+ @Test
+ public void c07_multipleMappings_nestedHeaders() throws Exception {
+ assertObjectEquals(
+ "[{path:'foo',location:'bar',responseHeaders:{a:{b:'c'}}},{path:'baz',location:'qux',responseHeaders:{d:{e:'f'}}}]",
+ parse("foo:bar:{a:{b:'c'}},baz:qux:{d:{e:'f'}}")
+ );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Error conditions
+ //------------------------------------------------------------------------------------------------------------------
+
+ @Test
+ public void d01_error_malformedJson() {
+ try {
+ parse("foo:bar:xxx");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Expected { at beginning of headers.");
+ }
+ }
+
+ @Test
+ public void d02_error_textFollowingJson() {
+ try {
+ parse("foo:bar:{a:'b'}x");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Invalid text following headers.");
+ }
+ }
+
+ @Test
+ public void d03_error_missingLocation() {
+ try {
+ parse("foo");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Couldn't find ':' following path.");
+ }
+ }
+
+ @Test
+ public void d04_error_danglingColonAfterLocation() {
+ try {
+ parse("foo:bar:");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Found extra ':' following location.");
+ }
+ }
+
+ @Test
+ public void d05_error_malformedHeaders_openEnded() {
+ try {
+ parse("foo:bar:{");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Malformed headers.");
+ }
+ }
+
+ @Test
+ public void d06_error_malformedHeaders_mismatchedBrackets() {
+ try {
+ parse("foo:bar:{{}");
+ fail("Exception expected.");
+ } catch (ParseException e) {
+ assertContains(e, "Malformed headers.");
+ }
+ }
+}
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
index f9817b3..0e66f65 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/annotation/RestResourceStaticFilesTest.java
@@ -28,30 +28,50 @@
//------------------------------------------------------------------------------------------------------------------
@RestResource(staticFiles={"xdocs:xdocs","xdocs2:xdocs2:{Foo:'Bar'}"})
- public static class A {
+ public static class A1 {
@RestMethod
public String a01() {
return null;
}
}
- static MockRest a = MockRest.build(A.class);
+ static MockRest a1 = MockRest.build(A1.class);
@Test
- public void a01() throws Exception {
- a.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");
- a.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");
+ public void a01a() throws Exception {
+ a1.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");
+ a1.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");
}
@Test
- public void a02_preventPathTraversals() throws Exception {
- a.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);
- a.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);
+ public void a01b_preventPathTraversals() throws Exception {
+ a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);
+ a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);
+ }
+
+ @RestResource(staticFiles={"xdocs2:xdocs2:{Foo:'Bar',Baz:'Qux'},xdocs:xdocs"})
+ public static class A2 {
+ @RestMethod
+ public String a02() {
+ return null;
+ }
+ }
+ static MockRest a2 = MockRest.build(A1.class);
+
+ @Test
+ public void a02a() throws Exception {
+ a1.get("/xdocs/test.txt").execute().assertBodyContains("OK-1");
+ a1.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-2");
+ }
+ @Test
+ public void a02b_preventPathTraversals() throws Exception {
+ a1.get("/xdocs/xsubdocs/../test.txt?noTrace=true").execute().assertStatus(404);
+ a1.get("/xdocs/xsubdocs/%2E%2E/test.txt?noTrace=true").execute().assertStatus(404);
}
//------------------------------------------------------------------------------------------------------------------
// Static files with response headers.
//------------------------------------------------------------------------------------------------------------------
- @RestResource(staticFiles={"xdocs:xdocs:{Foo:'Bar'}"})
+ @RestResource(staticFiles={"xdocs:xdocs:{Foo:'Bar',Baz:'Qux'}"})
public static class B {
@RestMethod
public String b01() {
@@ -62,7 +82,7 @@
@Test
public void b01() throws Exception {
- b.get("/xdocs/test.txt").execute().assertHeader("Foo","Bar").assertBodyContains("OK-1");
+ b.get("/xdocs/test.txt").execute().assertHeader("Foo","Bar").assertHeader("Baz","Qux").assertBodyContains("OK-1");
}
//------------------------------------------------------------------------------------------------------------------
@@ -104,4 +124,30 @@
c1.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");
c2.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");
}
+
+ //------------------------------------------------------------------------------------------------------------------
+ // Overridden patterns
+ //------------------------------------------------------------------------------------------------------------------
+
+ @RestResource(staticFiles={"xdocs:/xdocs,xdocs:xdocs"})
+ public static class D {
+ @RestMethod
+ public String d01() {
+ return null;
+ }
+ }
+
+ static MockRest d = MockRest.build(D.class);
+
+ @Test
+ public void d01() throws Exception {
+ // Should be overridden to absolute xdocs folder.
+ d.get("/xdocs/test.txt").execute().assertBodyContains("OK-3");
+ d.get("/xdocs/xsubdocs/test.txt").execute().assertBodyContains("OK-4");
+
+ // Should pick up from file system.
+ d.get("/xdocs/test2.txt").execute().assertBodyContains("OK-5");
+ d.get("/xdocs/xsubdocs/test2.txt").execute().assertBodyContains("OK-6");
+ }
+
}
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
similarity index 97%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
index 278a0e2..709a3f1 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/ReaderResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/ReaderResourceTest.java
@@ -10,7 +10,7 @@
// * "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. *
// ***************************************************************************************************************************
-package org.apache.jueau.rest.helper;
+package org.apache.juneau.rest.helper;
import static org.junit.Assert.*;
@@ -20,7 +20,6 @@
import org.apache.juneau.http.ReaderResource;
import org.apache.juneau.rest.*;
import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.helper.*;
import org.apache.juneau.rest.mock2.*;
import org.junit.*;
import org.junit.runners.*;
diff --git a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
similarity index 98%
rename from juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
rename to juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
index d49348d..a5f7e9b 100644
--- a/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/jueau/rest/helper/StreamResourceTest.java
+++ b/juneau-rest/juneau-rest-server-utest/src/test/java/org/apache/juneau/rest/helper/StreamResourceTest.java
@@ -10,7 +10,7 @@
// * "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. *
// ***************************************************************************************************************************
-package org.apache.jueau.rest.helper;
+package org.apache.juneau.rest.helper;
import static org.junit.Assert.*;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
index f321774..78aa3e8 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestConfig.java
@@ -78,7 +78,7 @@
// These are static files that are served up by the servlet under the specified sub-paths.
// For example, "/servletPath/htdocs/javadoc.css" resolves to the file "[servlet-package]/htdocs/javadoc.css"
// By default, we define static files through the external configuration file.
- staticFiles="$C{REST/staticFiles,htdocs:htdocs}",
+ staticFiles="$C{REST/staticFiles,htdocs:/htdocs,htdocs:htdocs}",
logging=@Logging(
level="INFO",
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 15b3fd7..7956795 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -2860,6 +2860,17 @@
* )
* </p>
*
+ * <p>
+ * The same path can map to multiple locations. Files are searched in the order
+ * <p class='bcode w800'>
+ * <ja>@RestResource</ja>(
+ * staticFiles={
+ * <jc>// Search in absolute location '/htdocs/folder' before location 'htdocs.package' relative to servlet package.</jc>
+ * <js>"htdocs:/htdocs/folder,htdocs:htdocs.package"</js>
+ * }
+ * )
+ * </p>
+ *
* <ul class='seealso'>
* <li class='jf'>{@link #REST_classpathResourceFinder} for configuring how classpath resources are located and retrieved.
* <li class='jf'>{@link #REST_mimeTypes} for configuring the media types based on file extension.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
index 2174dc3..d10bd91 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContextBuilder.java
@@ -17,6 +17,7 @@
import static org.apache.juneau.rest.RestContext.*;
import static org.apache.juneau.rest.HttpRuntimeException.*;
import static org.apache.juneau.serializer.Serializer.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
import java.nio.charset.*;
import java.util.*;
@@ -1860,10 +1861,13 @@
* </ul>
*
* @param mappingString The static file mapping string.
+ * @throws ParseException If mapping string is malformed.
* @return This object (for method chaining).
*/
- public RestContextBuilder staticFiles(String mappingString) {
- return staticFiles(new StaticFileMapping(resourceClass, mappingString));
+ public RestContextBuilder staticFiles(String mappingString) throws ParseException{
+ for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(resourceClass, mappingString)))
+ staticFiles(sfm);
+ return this;
}
/**
@@ -1888,10 +1892,11 @@
* <br>If <jk>null<jk>, uses the REST resource class.
* @param mappingString The static file mapping string.
* @return This object (for method chaining).
+ * @throws ParseException If mapping string is malformed.
*/
- public RestContextBuilder staticFiles(Class<?> baseClass, String mappingString) {
- if (isNotEmpty(mappingString))
- staticFiles(new StaticFileMapping(baseClass, mappingString));
+ public RestContextBuilder staticFiles(Class<?> baseClass, String mappingString) throws ParseException {
+ for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(baseClass, mappingString)))
+ staticFiles(sfm);
return this;
}
@@ -1914,7 +1919,7 @@
* @return This object (for method chaining).
*/
public RestContextBuilder staticFiles(String path, String location) {
- return staticFiles(new StaticFileMapping(null, path, location, null));
+ return staticFiles(new StaticFileMapping(resourceClass, path, location, null));
}
/**
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
index 3fa0424..8b5f177 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/StaticFileMapping.java
@@ -14,10 +14,13 @@
import static org.apache.juneau.internal.CollectionUtils.*;
import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.internal.StateMachineState.*;
+import static java.lang.Character.*;
import java.util.*;
import org.apache.juneau.*;
+import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.rest.annotation.*;
@@ -93,7 +96,7 @@
}
/**
- * Constructor using a mapping string to represent a path/location pairing.
+ * Create one or more <c>StaticFileMappings</c> from the specified comma-delimited list of mappings.
*
* <p>
* Mapping string must be one of these formats:
@@ -104,26 +107,101 @@
*
* @param resourceClass
* The resource/servlet class which serves as the base location of the location below.
- * @param mappingString
+ * @param mapping
* The mapping string that represents the path/location mapping.
* <br>Leading and trailing slashes and whitespace are trimmed from path and location.
+ * @return A list of parsed mappings. Never <jk>null</jk>.
+ * @throws ParseException If mapping was malformed.
*/
- public StaticFileMapping(Class<?> resourceClass, String mappingString) {
- this.resourceClass = resourceClass;
- String[] parts = split(mappingString, ':', 3);
- if (parts == null || parts.length <= 1)
- throw new FormattedRuntimeException("Invalid mapping string format: ''{0}'' on resource class ''{1}''", mappingString, resourceClass.getName());
- this.path = trimSlashes(parts[0]);
- this.location = trimTrailingSlashes(parts[1]);
- if (parts.length == 3) {
- try {
- responseHeaders = unmodifiableMap(new ObjectMap(parts[2]));
- } catch (ParseException e) {
- throw new FormattedRuntimeException(e, "Invalid mapping string format: ''{0}'' on resource class ''{1}''", mappingString, resourceClass.getName());
+ public static List<StaticFileMapping> parse(Class<?> resourceClass, String mapping) throws ParseException {
+
+ mapping = trim(mapping);
+ if (isEmpty(mapping))
+ return Collections.emptyList();
+
+ // States:
+ // S01 = In path, looking for :
+ // S02 = Found path:, looking for : or , or end
+ // S03 = Found path:location:, looking for {
+ // S04 = Found path:location:{, looking for }
+ // S05 = Found path:location:{headers}, looking for , or end
+ // S06 = Found path:location:{headers} , looking for start of path
+
+ StateMachineState state = S01;
+ int mark = 0;
+
+ String path = null, location = null;
+ List<StaticFileMapping> l = new ArrayList<>();
+ String s = mapping;
+ int jsonDepth = 0;
+ for (int i = 0; i < s.length(); i++) {
+ char c = s.charAt(i);
+ if (state == S01) {
+ if (c == ':') {
+ path = trim(s.substring(mark, i));
+ mark = i+1;
+ state = S02;
+ }
+ } else if (state == S02) {
+ if (c == ':') {
+ location = trim(s.substring(mark, i));
+ mark = i+1;
+ state = S03;
+ } else if (c == ',') {
+ location = trim(s.substring(mark, i));
+ l.add(new StaticFileMapping(resourceClass, path, location, null));
+ mark = i+1;
+ state = S01;
+ path = null;
+ location = null;
+ }
+ } else if (state == S03) {
+ if (c == '{') {
+ mark = i;
+ state = S04;
+ } else if (! isWhitespace(c)) {
+ throw new ParseException("Invalid staticFiles mapping. Expected '{' at beginning of headers. mapping=[{0}]", mapping);
+ }
+ } else if (state == S04) {
+ if (c == '{') {
+ jsonDepth++;
+ } else if (c == '}') {
+ if (jsonDepth > 0) {
+ jsonDepth--;
+ } else {
+ String json = s.substring(mark, i+1);
+ l.add(new StaticFileMapping(resourceClass, path, location, new ObjectMap(json)));
+ state = S05;
+ path = null;
+ location = null;
+ }
+ }
+ } else if (state == S05) {
+ if (c == ',') {
+ state = S06;
+ } else if (! isWhitespace(c)) {
+ throw new ParseException("Invalid staticFiles mapping. Invalid text following headers. mapping=[{0}]", mapping);
+ }
+ } else /* state == S06 */ {
+ if (! isWhitespace(c)) {
+ mark = i;
+ state = S01;
+ }
}
- } else {
- responseHeaders = null;
}
+
+ if (state == S01) {
+ throw new ParseException("Invalid staticFiles mapping. Couldn''t find '':'' following path. mapping=[{0}]", mapping);
+ } else if (state == S02) {
+ location = trim(s.substring(mark, s.length()));
+ l.add(new StaticFileMapping(resourceClass, path, location, null));
+ } else if (state == S03) {
+ throw new ParseException("Invalid staticFiles mapping. Found extra '':'' following location. mapping=[{0}]", mapping);
+ } else if (state == S04) {
+ throw new ParseException("Invalid staticFiles mapping. Malformed headers. mapping=[{0}]", mapping);
+ }
+
+ return l;
}
//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
index b55346e..ce9608c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
@@ -1156,6 +1156,17 @@
* )
* </p>
*
+ * <p>
+ * The same path can map to multiple locations. Files are searched in the order
+ * <p class='bcode w800'>
+ * <ja>@RestResource</ja>(
+ * staticFiles={
+ * <jc>// Search in absolute location '/htdocs/folder' before location 'htdocs.package' relative to servlet package.</jc>
+ * <js>"htdocs:/htdocs/folder,htdocs:htdocs.package"</js>
+ * }
+ * )
+ * </p>
+ *
* <ul class='notes'>
* <li>
* Mappings are cumulative from super classes.
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
index 77cfad3..1eadabb 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResourceConfigApply.java
@@ -14,6 +14,7 @@
import static org.apache.juneau.rest.RestContext.*;
import static org.apache.juneau.rest.util.RestUtils.*;
+import static org.apache.juneau.internal.CollectionUtils.*;
import java.util.logging.*;
@@ -162,9 +163,14 @@
if (isNotEmpty(s))
psb.set(REST_uriResolution, s);
- for (String mapping : a.staticFiles())
- if (isNotEmpty(mapping))
- psb.addTo(REST_staticFiles, new StaticFileMapping(c.inner(), string(mapping)));
+ for (String mapping : a.staticFiles()) {
+ try {
+ for (StaticFileMapping sfm : reverseIterable(StaticFileMapping.parse(c.inner(), string(mapping))))
+ psb.addTo(REST_staticFiles, sfm);
+ } catch (ParseException e) {
+ throw new ConfigException(e, "Invalid @Resource(staticFiles) value on class ''{0}''", c);
+ }
+ }
if (! a.messages().isEmpty())
psb.addTo(REST_messages, new MessageBundleLocation(c.inner(), string(a.messages())));
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/asf.png b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/asf.png
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/asf.png
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/asf.png
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/juneau.png b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/juneau.png
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/images/juneau.png
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/images/juneau.png
Binary files differ
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/styles/SwaggerUI.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/styles/SwaggerUI.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/styles/SwaggerUI.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/styles/SwaggerUI.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/dark.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/dark.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/dark.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/dark.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/light.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/light.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/light.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/light.css
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/original.css b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/original.css
similarity index 100%
rename from juneau-examples/juneau-examples-rest-jetty/src/main/resources/htdocs/themes/original.css
rename to juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/htdocs/themes/original.css