Generate rest api using swagger (#107)

Fix https://github.com/streamnative/pulsar-manager/issues/105
Add support for swagger
Add support for swagger UI

Visit http://localhost:8000/swagger-ui.html
diff --git a/build.gradle b/build.gradle
index f57d37a..7e466bc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -72,5 +72,7 @@
     compile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion
     compile group: 'com.google.guava', name: 'guava', version: guavaVersion
     compile group: 'org.apache.pulsar', name: 'pulsar-client', version: pulsarVersion
+    compile group: 'io.springfox', name: 'springfox-swagger2', version: swagger2Version
+    compile group: 'io.springfox', name: 'springfox-swagger-ui', version: swaggeruiVersion
     compileOnly group: 'org.projectlombok', name: 'lombok', version: lombokVersion
 }
diff --git a/gradle.properties b/gradle.properties
index dd2301b..da5002b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -8,4 +8,6 @@
 pageHelperVersion=1.2.4
 mockitoVersion=1.10.19
 guavaVersion=21.0
-pulsarVersion=2.5.0-1b64a6e1f
\ No newline at end of file
+pulsarVersion=2.5.0-1b64a6e1f
+swagger2Version=2.9.2
+swaggeruiVersion=2.9.2
\ No newline at end of file
diff --git a/src/main/java/com/manager/pulsar/controller/TenantsController.java b/src/main/java/com/manager/pulsar/controller/TenantsController.java
index e3a1579..b33b76e 100644
--- a/src/main/java/com/manager/pulsar/controller/TenantsController.java
+++ b/src/main/java/com/manager/pulsar/controller/TenantsController.java
@@ -14,26 +14,58 @@
 package com.manager.pulsar.controller;
 
 import com.github.pagehelper.Page;
+import com.google.common.collect.Maps;
 import com.manager.pulsar.entity.TenantsEntity;
 import com.manager.pulsar.entity.TenantsRepository;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.hibernate.validator.constraints.Range;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.constraints.Min;
+import java.util.Map;
+
+/**
+ * Tenant Query class.
+ */
 @RestController
+@RequestMapping(value = "/pulsar-manager/admin/v2")
+@Api(description = "Support more flexible queries to tenants.")
+@Validated
 public class TenantsController {
 
   @Autowired
   private TenantsRepository tenantsRepository;
 
+  @ApiOperation(value = "Get the list of existing tenants, support paging, the default is 10 per page")
+  @ApiResponses({
+          @ApiResponse(code = 200, message = "ok"),
+          @ApiResponse(code = 404, message = "Not found"),
+          @ApiResponse(code = 500, message = "Internal server error")
+  })
   @RequestMapping(value = "/tenants", method =  RequestMethod.GET)
-  public Page<TenantsEntity> getTenants(
-          @RequestParam(name = "pageNum", defaultValue = "1")
+  public ResponseEntity<Map<String, Object>> getTenants(
+          @ApiParam(value = "page_num", defaultValue = "1", example = "1")
+          @RequestParam(name = "page_num", defaultValue = "1")
+          @Min(value = 1, message = "page_num is incorrect, should be greater than 0.")
           Integer pageNum,
-          @RequestParam(name="pageSize", defaultValue = "10")
+          @ApiParam(value = "page_size", defaultValue = "10", example = "10")
+          @RequestParam(name="page_size", defaultValue = "10")
+          @Range(min = 1, max = 1000, message = "page_size is incorrect, should be greater than 0 and less than 1000.")
           Integer pageSize) {
-      return tenantsRepository.getTenantsList(pageNum, pageSize);
+    Map<String, Object> result = Maps.newHashMap();
+    Page<TenantsEntity> tenantsEntities = tenantsRepository.getTenantsList(pageNum, pageSize);
+    result.put("total", tenantsEntities.getTotal());
+    result.put("data", tenantsEntities);
+    return ResponseEntity.ok(result);
   }
 }
diff --git a/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java b/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java
new file mode 100644
index 0000000..6dd74be
--- /dev/null
+++ b/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed 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 com.manager.pulsar.swagger;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Swagger config class.
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.manager.pulsar.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder().title("Pulsar manager custom rest api").version("0.1").build();
+    }
+}