blob: 4d84ad7347d790999bdb448b5a144363188f7f84 [file] [log] [blame]
<!--
/***************************************************************************************************************************
* 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.
***************************************************************************************************************************/
-->
ConfigResource
<p>
The {@link oaj.microservice.resources.ConfigResource} class is a predefined reusable resource.
It provides a REST interface for reading and altering the microservice config file.
</p>
<p>
Pointing a browser to the resource shows the following:
</p>
<p class='bpcode w800'>
http://localhost:10000/config
</p>
<img class='bordered w800' src='doc-files/juneau-examples-rest.ConfigResource.1.png'>
<p>
An edit page is provided for altering the raw config file:
</p>
<p class='bpcode w800'>
http://localhost:10000/config/edit
</p>
<img class='bordered w800' src='doc-files/juneau-examples-rest.ConfigResource.2.png'>
<p>
The {@link oaj.config.Config} class is a serializable POJO, which makes the resource
relatively straightforward to implement.
</p>
<h5 class='figure'>ConfigResource.java</h5>
<p class='bpcode w800'>
<jd>/**
* Shows contents of the microservice configuration file.
*/</jd>
<ja>@Rest</ja>(
path=<js>"/config"</js>,
title=<js>"Configuration"</js>,
description=<js>"Contents of configuration file."</js>,
htmldoc=<ja>@HtmlDoc</ja>(
navlinks={
<js>"up: request:/.."</js>,
<js>"options: servlet:/?method=OPTIONS"</js>,
<js>"edit: servlet:/edit"</js>
}
)
)
<jk>public class</jk> ConfigResource <jk>extends</jk> BasicRestServlet {
<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, description=<js>"Show contents of config file."</js>)
<jk>public</jk> ObjectMap getConfig() <jk>throws</jk> Exception {
<jk>return</jk> getServletConfig().getConfig().asMap();
}
<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/edit"</js>, description=<js>"Edit config file."</js>)
<jk>public</jk> Form getConfigEditForm(RestRequest req) <jk>throws</jk> Exception {
<jk>return</jk> <jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/"</js>).method(<js>"POST"</js>).enctype(<js>"application/x-www-form-urlencoded"</js>).children(
<jsm>div</jsm>()._class(<js>"data"</js>).children(
<jsm>table</jsm>(
<jsm>tr</jsm>(<jsm>td</jsm>().style(<js>"text-align:right"</js>).children(<jsm>button</jsm>(<js>"submit"</js>,<js>"Submit"</js>),<jsm>button</jsm>(<js>"reset"</js>,<js>"Reset"</js>))),
<jsm>tr</jsm>(<jsm>th</jsm>().child(<js>"Contents"</js>)),
<jsm>tr</jsm>(<jsm>th</jsm>().child(
<jsm>textarea</jsm>().name(<js>"contents"</js>).rows(40).cols(120).style(<js>"white-space:pre;word-wrap:normal;overflow-x:scroll;font-family:monospace;"</js>)
.text(getServletConfig().getConfig().toString()))
)
)
)
);
}
<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}"</js>,
description=<js>"Show config file section."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> ObjectMap getConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section) <jk>throws</jk> Exception {
<jk>return</jk> getSection(section);
}
<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}/{key}"</js>,
description=<js>"Show config file entry."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{name:'section',in:'path',description:'Section name.'},"</js>,
<js>"{name:'key',in:'path',description:'Entry name.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> String getConfigEntry(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Path</ja>(<js>"key"</js>) String key) <jk>throws</jk> Exception {
<jk>return</jk> getSection(section).getString(key);
}
<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>,
description=<js>"Sets contents of config file from a FORM post."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{name:'contents',in:'formData',description:'New contents in INI file format.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> Config setConfigContentsFormPost(<ja>@FormData</ja>(<js>"contents"</js>) String contents) <jk>throws</jk> Exception {
<jk>return</jk> setConfigContents(<jk>new</jk> StringReader(contents));
}
<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>,
description=<js>"Sets contents of config file."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{in:'body',description:'New contents in INI file format.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> Config setConfigContents(<ja>@Body</ja> Reader contents) <jk>throws</jk> Exception {
<jk>return</jk> getServletConfig().getConfig().load(contents, <jk>true</jk>).asMap();
}
<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}"</js>,
description=<js>"Add or overwrite a config file section."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
<js>"{in:'body',description:'New contents for section as a simple map with string keys and values.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> ObjectMap setConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Body</ja> Map&lt;String,String&gt; contents) <jk>throws</jk> Exception {
getServletConfig().getConfig().setSection(section, contents);
<jk>return</jk> getSection(section);
}
<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}/{key}"</js>,
description=<js>"Add or overwrite a config file entry."</js>,
swagger={
<js>"parameters:["</js>,
<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
<js>"{name:'key',in:'path',description:'Entry name.'}"</js>,
<js>"{in:'body',description:'New value as a string.'}"</js>,
<js>"]"</js>
}
)
<jk>public</jk> String setConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Path</ja>(<js>"key"</js>) String key, <ja>@Body</ja> String value) <jk>throws</jk> Exception {
getServletConfig().getConfig().put(section, key, value, <jk>false</jk>);
<jk>return</jk> getSection(section).getString(key);
}
<jk>private</jk> ObjectMap getSection(String name) {
ObjectMap m = getServletConfig().getConfig().getSectionMap(name);
<jk>if</jk> (m == <jk>null</jk>)
<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Section not found."</js>);
<jk>return</jk> m;
}
}
</p>