Java tutorial
/** * Copyright 2013 - 2017 WaveMaker, Inc. * * 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.wavemaker.tools.apidocs.tools.spring; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.ClassUtils; import org.junit.Assert; import org.junit.Test; import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.wavemaker.tools.apidocs.tools.core.model.Info; import com.wavemaker.tools.apidocs.tools.core.model.Swagger; import com.wavemaker.tools.apidocs.tools.core.model.Tag; import com.wavemaker.tools.apidocs.tools.parser.config.SwaggerConfiguration; import com.wavemaker.tools.apidocs.tools.parser.exception.SwaggerParserException; import com.wavemaker.tools.apidocs.tools.parser.runner.SwaggerParser; import com.wavemaker.tools.apidocs.tools.parser.scanner.FilterableClassScanner; import com.wavemaker.tools.apidocs.tools.parser.scanner.FilterableModelScanner; import com.wavemaker.tools.apidocs.tools.spring.controller.DepartmentController; import com.wavemaker.tools.apidocs.tools.spring.controller.UserController; import com.wavemaker.tools.apidocs.tools.spring.controller.VacationController; import com.wavemaker.tools.apidocs.tools.spring.resolver.MultiPartFileResolver; import com.wavemaker.tools.apidocs.tools.spring.resolver.MultiPartRequestResolver; import com.wavemaker.tools.apidocs.tools.spring.resolver.PageParameterResolver; import com.wavemaker.tools.apidocs.tools.spring.resolver.ServletMetaTypesResolver; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public class SpringSwaggerParserTest { public static final int NO_OF_CONTROLLERS = 5; @Test public void testGenerate() throws Exception { FilterableClassScanner classScanner = new FilterableClassScanner(); final String packageName = "com.wavemaker.tools.apidocs.tools"; classScanner.includePackage(packageName); Info info = new Info(); info.description("hrdb database service apis"); info.setTitle("HRDB service"); SwaggerConfiguration.Builder builder = new SwaggerConfiguration.Builder("/test", classScanner); builder.setInfo(info); builder.setClassLoader(this.getClass().getClassLoader()); SwaggerParser runner = new SpringSwaggerParser(builder.build()); Swagger swagger = runner.generate(); assertNotNull(swagger); assertFalse(swagger.getTags().isEmpty()); assertEquals(NO_OF_CONTROLLERS, swagger.getTags().size()); for (final Tag tag : swagger.getTags()) { final String fullyQualifiedName = tag.getFullyQualifiedName(); final String classPackage = ClassUtils.getPackageName(fullyQualifiedName); assertTrue(classPackage.startsWith(packageName + ".")); } writeToFile(swagger, "swagger.json"); } @Test public void testGenerateWithPackagePrefix() throws Exception { FilterableClassScanner classScanner = new FilterableClassScanner(); final String packageName = "com.wavemaker.tools.apidocs.tools.spring.controller"; classScanner.includePackage(packageName); Info info = new Info(); info.description("hrdb database service apis"); info.setTitle("HRDB service"); SwaggerConfiguration.Builder builder = new SwaggerConfiguration.Builder("/test", classScanner); builder.setInfo(info); builder.setClassLoader(this.getClass().getClassLoader()); SwaggerParser runner = new SpringSwaggerParser(builder.build()); Swagger swagger = runner.generate(); assertFalse(swagger.getTags().isEmpty()); for (final Tag tag : swagger.getTags()) { final String fullyQualifiedName = tag.getFullyQualifiedName(); final String classPackage = ClassUtils.getPackageName(fullyQualifiedName); assertEquals(packageName, classPackage); } } @Test public void testGenerateWithResolvers() throws Exception { FilterableClassScanner classScanner = new FilterableClassScanner(); classScanner.includePackage("com.wavemaker.tools.apidocs.tools"); SwaggerConfiguration.Builder builder = new SwaggerConfiguration.Builder("/test", classScanner); builder.setClassLoader(this.getClass().getClassLoader()); addDefaultParameterResolvers(builder); SwaggerParser runner = new SpringSwaggerParser(builder.build()); Swagger swagger = runner.generate(); writeToFile(swagger, "swagger_with_resolvers.json"); } @Test public void testModelScanner() throws Exception { FilterableModelScanner modelScanner = new FilterableModelScanner(); modelScanner.excludePackage("java"); FilterableClassScanner classScanner = new FilterableClassScanner(); classScanner.includePackage("com.wavemaker.tools.apidocs.tools"); SwaggerConfiguration.Builder builder = new SwaggerConfiguration.Builder("/test", classScanner); builder.setClassLoader(this.getClass().getClassLoader()); builder.setModelScanner(modelScanner); addDefaultParameterResolvers(builder); SwaggerParser runner = new SpringSwaggerParser(builder.build()); Swagger swagger = runner.generate(); writeToFile(swagger, "swagger_with_model_scanner.json"); } @Test public void testSingleClass() throws Exception { Swagger swagger = runForSingleClass(VacationController.class); writeToFile(swagger, "swagger_for_single_class.json"); } @Test public void testSingleClassDepartment() throws Exception { Swagger swagger = runForSingleClass(DepartmentController.class); writeToFile(swagger, "swagger_for_department.json"); } @Test public void testMultiThread() throws InterruptedException { ExecutorService service = Executors.newFixedThreadPool(4); List<Class<?>> controllerClasses = new ArrayList<>(); controllerClasses.add(VacationController.class); controllerClasses.add(UserController.class); controllerClasses.add(DepartmentController.class); for (final Class<?> controllerClass : controllerClasses) { service.execute(new Runnable() { public void run() { Swagger swagger; try { swagger = runForSingleClass(controllerClass); } catch (SwaggerParserException e) { throw new RuntimeException("Exception while parsing class:" + controllerClass.getName(), e); } Assert.assertNotNull(swagger); assertEquals(1, swagger.getTags().size()); assertEquals(controllerClass.getName(), swagger.getTags().get(0).getFullyQualifiedName()); try { writeToFile(swagger, "class_" + controllerClass.getSimpleName() + ".json"); } catch (IOException e) { throw new RuntimeException("Error while writing to file", e); } } }); } service.shutdown(); service.awaitTermination(10, TimeUnit.SECONDS); } @Test public void testMultiThread2() throws InterruptedException { ExecutorService service = Executors.newFixedThreadPool(4); final Class<VacationController> controllerClass = VacationController.class; for (int i = 0; i < 10; i++) { final int finalI = i; service.execute(new Runnable() { public void run() { Swagger swagger; try { swagger = runForSingleClass(controllerClass); } catch (SwaggerParserException e) { throw new RuntimeException("Exception while parsing class:" + controllerClass.getName(), e); } Assert.assertNotNull(swagger); assertEquals(1, swagger.getTags().size()); assertEquals(controllerClass.getName(), swagger.getTags().get(0).getFullyQualifiedName()); try { writeToFile(swagger, "mul_class" + controllerClass.getSimpleName() + "_" + finalI + ".json"); } catch (IOException e) { throw new RuntimeException("Error while writing to file", e); } } }); } service.shutdown(); service.awaitTermination(10, TimeUnit.SECONDS); } @Test public void testMultiThread3() throws InterruptedException { ExecutorService service = Executors.newFixedThreadPool(4); List<Class<?>> controllerClasses = new ArrayList<>(); controllerClasses.add(VacationController.class); controllerClasses.add(com.wavemaker.tools.apidocs.tools.spring.controller2.VacationController.class); final Pattern namePattern = Pattern.compile("(\\w)*.(\\w*)$"); for (int i = 0; i < 5; i++) { for (final Class<?> controllerClass : controllerClasses) { final int finalI = i; service.execute(new Runnable() { public void run() { Swagger swagger; try { swagger = runForSingleClass(controllerClass); } catch (SwaggerParserException e) { throw new RuntimeException("Exception while parsing class:" + controllerClass.getName(), e); } Assert.assertNotNull(swagger); assertEquals(1, swagger.getTags().size()); assertEquals(controllerClass.getName(), swagger.getTags().get(0).getFullyQualifiedName()); try { String name = controllerClass.getName(); Matcher nameMatcher = namePattern.matcher(name); if (nameMatcher.find()) { name = nameMatcher.group(0); } name = name.replace('.', '_'); writeToFile(swagger, "mul_package_class_" + name + "_" + finalI + "" + ".json"); } catch (IOException e) { throw new RuntimeException("Error while writing to file", e); } } }); } } service.shutdown(); service.awaitTermination(10, TimeUnit.SECONDS); } private Swagger runForSingleClass(final Class<?> controllerClass) throws SwaggerParserException { FilterableModelScanner modelScanner = new FilterableModelScanner(); modelScanner.excludePackage("java"); FilterableClassScanner classScanner = new FilterableClassScanner(); classScanner.includeType(controllerClass); SwaggerConfiguration.Builder builder = new SwaggerConfiguration.Builder("/", classScanner); builder.setClassLoader(this.getClass().getClassLoader()); builder.setModelScanner(modelScanner); addDefaultParameterResolvers(builder); SwaggerParser runner = new SpringSwaggerParser(builder.build()); return runner.generate(); } private void addDefaultParameterResolvers(final SwaggerConfiguration.Builder builder) { builder.addParameterResolver(Pageable.class, new PageParameterResolver()); builder.addParameterResolver(MultipartFile.class, new MultiPartFileResolver()); builder.addParameterResolver(MultipartHttpServletRequest.class, new MultiPartRequestResolver()); builder.addParameterResolver(HttpServletRequest.class, new ServletMetaTypesResolver()); builder.addParameterResolver(HttpServletResponse.class, new ServletMetaTypesResolver()); } private void writeToFile(final Swagger swagger, final String fileName) throws IOException { Assert.assertNotNull(swagger); File targetDir = new File("target"); File outputDir = new File(targetDir, "apidocs"); if (!outputDir.exists()) { outputDir.mkdir(); } ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(SerializationFeature.INDENT_OUTPUT); objectMapper.writeValue(new File(outputDir, fileName), swagger); } }