<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->

RestInfoProvider

<p>
	The {@link oajr.RestInfoProvider} class is used to find the title
	and description for your resource and also generate the Swagger documentation.
	It can be overridden to provide your own custom Swagger documentation.
</p>
<p>
	The methods on this interface are:
</p>
<ul class='javatree'>
	<li class='jic'>{@link oajr.RestInfoProvider}
	<ul>
		<li class='jm'>{@link oajr.RestInfoProvider#getSwagger(RestRequest) getSwagger(RestRequest)}
		<li class='jm'>{@link oajr.RestInfoProvider#getSiteName(RestRequest) getSiteName(RestRequest)}
		<li class='jm'>{@link oajr.RestInfoProvider#getTitle(RestRequest) getTitle(RestRequest)}
		<li class='jm'>{@link oajr.RestInfoProvider#getDescription(RestRequest) getDescription(RestRequest)}
		<li class='jm'>{@link oajr.RestInfoProvider#getMethodSummary(Method,RestRequest) getMethodSummary(Method,RestRequest)}
		<li class='jm'>{@link oajr.RestInfoProvider#getMethodDescription(Method,RestRequest) getMethodDescription(Method,RestRequest)}
	</ul>
</ul>
<p>
	The info provider in turn supplies the information returned by the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link oajr.RestRequest}
	<ul>
		<li class='jm'>{@link oajr.RestRequest#getSwagger() getSwagger()}
		<li class='jm'>{@link oajr.RestRequest#getSiteName() getSiteName()}
		<li class='jm'>{@link oajr.RestRequest#getResourceTitle() getResourceTitle()}
		<li class='jm'>{@link oajr.RestRequest#getResourceDescription() getResourceDescription()}
		<li class='jm'>{@link oajr.RestRequest#getMethodSummary() getMethodSummary()}
		<li class='jm'>{@link oajr.RestRequest#getMethodDescription() getMethodDescription()}
	</ul>
</ul>
<p>
	Info providers are registered through the following property:
</p>
<ul class='javatree'>
	<li class='jf'>{@link oajr.RestContext#REST_infoProvider}
</ul>
<p>
	While you can implement this interface from scratch, you may want to instead consider extending
	from the <l>BasicRestInfoProvider</l> class described next.
</p>
