You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/01/09 00:56:37 UTC

[incubator-servicecomb-java-chassis] 01/02: [SCB-195] support @Api annotation to specify tag

This is an automated email from the ASF dual-hosted git repository.

wujimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 24f4cc2d01bbcd227fbeb5a0fc230639ca862400
Author: yaohaishi <ya...@huawei.com>
AuthorDate: Mon Jan 8 10:14:47 2018 +0800

    [SCB-195] support @Api annotation to specify tag
---
 .../core/AbstractSwaggerGeneratorContext.java      |  3 +
 .../swagger/generator/core/OperationGenerator.java | 18 +++++
 .../swagger/generator/core/SwaggerGenerator.java   | 27 ++++++++
 .../core/processor/annotation/ApiProcessor.java    | 43 ++++++++++++
 .../generator/core/TestOperationGenerator.java     | 67 ++++++++++++++++++-
 .../generator/core/TestSwaggerGenerator.java       | 17 +++++
 .../annotation/ApiOperationProcessorTest.java      | 76 ++++++++++++++++++++++
 .../processor/annotation/ApiProcessorTest.java     | 67 +++++++++++++++++++
 .../annotation/SwaggerDefinitionProcessorTest.java | 75 +++++++++++++++++++++
 9 files changed, 391 insertions(+), 2 deletions(-)

diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/AbstractSwaggerGeneratorContext.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/AbstractSwaggerGeneratorContext.java
index 922624c..ab5067c 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/AbstractSwaggerGeneratorContext.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/AbstractSwaggerGeneratorContext.java
@@ -33,6 +33,7 @@ import io.servicecomb.swagger.generator.core.processor.annotation.ApiImplicitPar
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiImplicitParamsClassProcessor;
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiImplicitParamsMethodProcessor;
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiOperationProcessor;
+import io.servicecomb.swagger.generator.core.processor.annotation.ApiProcessor;
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiResponseClassProcessor;
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiResponseMethodProcessor;
 import io.servicecomb.swagger.generator.core.processor.annotation.ApiResponsesClassProcessor;
@@ -42,6 +43,7 @@ import io.servicecomb.swagger.generator.core.processor.annotation.ResponseHeader
 import io.servicecomb.swagger.generator.core.processor.annotation.SwaggerDefinitionProcessor;
 import io.servicecomb.swagger.generator.core.processor.parametertype.RawJsonRequestBodyProcessor;
 import io.servicecomb.swagger.generator.core.processor.response.DefaultResponseTypeProcessor;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
@@ -104,6 +106,7 @@ public abstract class AbstractSwaggerGeneratorContext implements SwaggerGenerato
   }
 
   protected void initClassAnnotationMgr() {
+    classAnnotationMgr.register(Api.class, new ApiProcessor());
     classAnnotationMgr.register(SwaggerDefinition.class, new SwaggerDefinitionProcessor());
 
     classAnnotationMgr.register(ApiImplicitParams.class, new ApiImplicitParamsClassProcessor());
diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/OperationGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/OperationGenerator.java
index e0a8cc8..e961bb7 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/OperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/OperationGenerator.java
@@ -221,6 +221,24 @@ public class OperationGenerator {
       }
       processor.process(annotation, this);
     }
+
+    setDefaultTag();
+  }
+
+  private void setDefaultTag() {
+    // if tag has been defined, do nothing
+    if (null != operation.getTags()) {
+      for (String tag : operation.getTags()) {
+        if (!StringUtils.isEmpty(tag)) {
+          return;
+        }
+      }
+    }
+
+    // if there is no tag, set default tag
+    if (!swaggerGenerator.getDefaultTags().isEmpty()) {
+      operation.setTags(new ArrayList<>(swaggerGenerator.getDefaultTags()));
+    }
   }
 
   /**
diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/SwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/SwaggerGenerator.java
index aa4fa33..0956ec3 100644
--- a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/SwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/SwaggerGenerator.java
@@ -22,19 +22,23 @@ import java.lang.reflect.Method;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 import javax.ws.rs.core.MediaType;
 
 import org.springframework.util.StringUtils;
 
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.models.Info;
 import io.swagger.models.Operation;
 import io.swagger.models.Path;
 import io.swagger.models.Swagger;
+import io.swagger.models.Tag;
 import io.swagger.models.parameters.Parameter;
 
 /**
@@ -61,6 +65,13 @@ public class SwaggerGenerator {
 
   protected Swagger swagger;
 
+  /**
+   * According to the definition of swagger, the {@link Tag} defined in {@link Api#tags()} will be set
+   * to all of the operations in this swagger. And the {@link Tag} definde in {@link ApiOperation#tags()} will overwrite
+   * the {@link Api#tags()}.
+   */
+  protected Set<String> defaultTags = new LinkedHashSet<>();
+
   private Map<String, OperationGenerator> operationGeneratorMap = new HashMap<>();
 
   private String httpMethod;
@@ -281,4 +292,20 @@ public class SwaggerGenerator {
 
     throw new Error("method not found, name=" + methodName);
   }
+
+  /**
+   * Add a tag to {@link #defaultTags} if the corresponding tag not exists.
+   * @param tagName the name of the added tag
+   */
+  public void addDefaultTag(String tagName) {
+    if (StringUtils.isEmpty(tagName) || defaultTags.contains(tagName)) {
+      return;
+    }
+
+    defaultTags.add(tagName);
+  }
+
+  public Set<String> getDefaultTags() {
+    return defaultTags;
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessor.java b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessor.java
new file mode 100644
index 0000000..c024059
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/main/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessor.java
@@ -0,0 +1,43 @@
+/*
+ * 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 io.servicecomb.swagger.generator.core.processor.annotation;
+
+import org.springframework.util.StringUtils;
+
+import io.servicecomb.swagger.generator.core.ClassAnnotationProcessor;
+import io.servicecomb.swagger.generator.core.SwaggerGenerator;
+import io.swagger.annotations.Api;
+
+public class ApiProcessor implements ClassAnnotationProcessor {
+  @Override
+  public void process(Object annotation, SwaggerGenerator swaggerGenerator) {
+    Api api = (Api) annotation;
+
+    setTags(api, swaggerGenerator);
+  }
+
+  private void setTags(Api api, SwaggerGenerator swaggerGenerator) {
+    String[] tags = api.tags();
+    for (String tagName : tags) {
+      if (StringUtils.isEmpty(tagName)) {
+        continue;
+      }
+      swaggerGenerator.addDefaultTag(tagName);
+    }
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
index abbc528..b6ca7af 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestOperationGenerator.java
@@ -17,14 +17,18 @@
 
 package io.servicecomb.swagger.generator.core;
 
+import static org.junit.Assert.assertEquals;
+
+import java.lang.reflect.Method;
 import java.util.Collections;
+import java.util.List;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.util.StringValueResolver;
 
 import io.servicecomb.foundation.test.scaffolding.spring.SpringUtils;
 import io.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
+import io.swagger.annotations.ApiOperation;
 
 public class TestOperationGenerator {
   @Test
@@ -39,6 +43,65 @@ public class TestOperationGenerator {
     OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, null);
     operationGenerator.setPath("/a/${var}/b");
 
-    Assert.assertEquals("/a/varValue/b", operationGenerator.getPath());
+    assertEquals("/a/varValue/b", operationGenerator.getPath());
+  }
+
+  @Test
+  public void testConvertTags() throws NoSuchMethodException {
+    Method function = TestClass.class.getMethod("function");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+
+    operationGenerator.generate();
+
+    List<String> tagList = operationGenerator.getOperation().getTags();
+    assertEquals(2, tagList.size());
+    assertEquals("tag1", tagList.get(0));
+    assertEquals("tag2", tagList.get(1));
+  }
+
+  @Test
+  public void testConvertTagsOnMethodWithNoTag() throws NoSuchMethodException {
+    Method function = TestClass.class.getMethod("functionWithNoTag");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+    swaggerGenerator.addDefaultTag("default0");
+    swaggerGenerator.addDefaultTag("default1");
+
+    operationGenerator.generate();
+
+    List<String> tagList = operationGenerator.getOperation().getTags();
+    assertEquals(2, tagList.size());
+    assertEquals("default0", tagList.get(0));
+    assertEquals("default1", tagList.get(1));
+  }
+
+  @Test
+  public void testConvertTagsOnMethodWithNoAnnotation() throws NoSuchMethodException {
+    Method function = TestClass.class.getMethod("functionWithNoAnnotation");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+    swaggerGenerator.addDefaultTag("default0");
+    swaggerGenerator.addDefaultTag("default1");
+
+    operationGenerator.generate();
+
+    List<String> tagList = operationGenerator.getOperation().getTags();
+    assertEquals(2, tagList.size());
+    assertEquals("default0", tagList.get(0));
+    assertEquals("default1", tagList.get(1));
+  }
+
+  private static class TestClass {
+    @ApiOperation(value = "value1", tags = {"tag1", "tag2"})
+    public void function() {
+    }
+
+    @ApiOperation(value = "value2")
+    public void functionWithNoTag() {
+    }
+
+    public void functionWithNoAnnotation() {
+    }
   }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestSwaggerGenerator.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestSwaggerGenerator.java
index d30e1b4..708dc27 100644
--- a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestSwaggerGenerator.java
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/TestSwaggerGenerator.java
@@ -40,4 +40,21 @@ public class TestSwaggerGenerator {
 
     Assert.assertEquals("/a/varValue/b", swaggerGenerator.getSwagger().getBasePath());
   }
+
+  @Test
+  public void testAddDefaultTag() {
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), null);
+
+    swaggerGenerator.addDefaultTag("test1");
+    swaggerGenerator.addDefaultTag("");
+    swaggerGenerator.addDefaultTag(null);
+    swaggerGenerator.addDefaultTag("test2");
+
+    Assert.assertEquals(2, swaggerGenerator.getDefaultTags().size());
+    int index = 0;
+    for (String tagName : swaggerGenerator.getDefaultTags()) {
+      ++index;
+      Assert.assertEquals("test" + index, tagName);
+    }
+  }
 }
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java
new file mode 100644
index 0000000..2f706e2
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiOperationProcessorTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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 io.servicecomb.swagger.generator.core.processor.annotation;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.junit.Test;
+
+import io.servicecomb.swagger.generator.core.OperationGenerator;
+import io.servicecomb.swagger.generator.core.SwaggerGenerator;
+import io.servicecomb.swagger.generator.pojo.PojoSwaggerGeneratorContext;
+import io.swagger.annotations.ApiOperation;
+
+public class ApiOperationProcessorTest {
+
+  @Test
+  public void testConvertTags() throws NoSuchMethodException {
+    ApiOperationProcessor apiOperationProcessor = new ApiOperationProcessor();
+
+    Method function = TestClass.class.getMethod("function");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+
+    apiOperationProcessor.process(function.getAnnotation(ApiOperation.class),
+        operationGenerator);
+
+    List<String> tagList = operationGenerator.getOperation().getTags();
+    assertEquals(2, tagList.size());
+    assertEquals("tag1", tagList.get(0));
+    assertEquals("tag2", tagList.get(1));
+  }
+
+  @Test
+  public void testConvertTagsOnMethodWithNoTag() throws NoSuchMethodException {
+    ApiOperationProcessor apiOperationProcessor = new ApiOperationProcessor();
+
+    Method function = TestClass.class.getMethod("functionWithNoTag");
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(new PojoSwaggerGeneratorContext(), TestClass.class);
+    OperationGenerator operationGenerator = new OperationGenerator(swaggerGenerator, function);
+
+    apiOperationProcessor.process(function.getAnnotation(ApiOperation.class),
+        operationGenerator);
+
+    List<String> tagList = operationGenerator.getOperation().getTags();
+    assertNull(tagList);
+  }
+
+  private static class TestClass {
+    @ApiOperation(value = "value1", tags = {"tag1", "tag2"})
+    public void function() {
+    }
+
+    @ApiOperation(value = "value2")
+    public void functionWithNoTag() {
+    }
+  }
+}
\ No newline at end of file
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessorTest.java
new file mode 100644
index 0000000..9620f1a
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/ApiProcessorTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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 io.servicecomb.swagger.generator.core.processor.annotation;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Set;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.servicecomb.swagger.generator.core.SwaggerGenerator;
+import io.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
+import io.swagger.annotations.Api;
+
+public class ApiProcessorTest {
+  private ApiProcessor apiProcessor = new ApiProcessor();
+
+  @Test
+  public void process() {
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(Mockito.mock(SwaggerGeneratorContext.class),
+        null);
+    apiProcessor.process(SwaggerTestTarget.class.getAnnotation(Api.class),
+        swaggerGenerator);
+
+    Set<String> tags = swaggerGenerator.getDefaultTags();
+    assertEquals(2, tags.size());
+    int index = 0;
+    for (String tagName : tags) {
+      ++index;
+      assertEquals("tag" + index, tagName);
+    }
+  }
+
+  @Test
+  public void processOnNoTag() {
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(Mockito.mock(SwaggerGeneratorContext.class),
+        null);
+    apiProcessor.process(SwaggerTestTargetWithNoTag.class.getAnnotation(Api.class), swaggerGenerator);
+
+    Set<String> tags = swaggerGenerator.getDefaultTags();
+    assertEquals(0, tags.size());
+  }
+
+  @Api(tags = {"tag1", "tag2", "", "tag1"})
+  private class SwaggerTestTarget {
+  }
+
+  @Api
+  private class SwaggerTestTargetWithNoTag {
+  }
+}
diff --git a/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java
new file mode 100644
index 0000000..2a88a8a
--- /dev/null
+++ b/swagger/swagger-generator/generator-core/src/test/java/io/servicecomb/swagger/generator/core/processor/annotation/SwaggerDefinitionProcessorTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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 io.servicecomb.swagger.generator.core.processor.annotation;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.servicecomb.swagger.generator.core.SwaggerGenerator;
+import io.servicecomb.swagger.generator.core.SwaggerGeneratorContext;
+import io.swagger.annotations.Contact;
+import io.swagger.annotations.ExternalDocs;
+import io.swagger.annotations.Info;
+import io.swagger.annotations.License;
+import io.swagger.annotations.SwaggerDefinition;
+import io.swagger.annotations.SwaggerDefinition.Scheme;
+import io.swagger.annotations.Tag;
+import io.swagger.models.Swagger;
+
+public class SwaggerDefinitionProcessorTest {
+
+  private SwaggerDefinitionProcessor swaggerDefinitionProcessor = new SwaggerDefinitionProcessor();
+
+  @Test
+  public void testProcess() {
+    SwaggerGenerator swaggerGenerator = new SwaggerGenerator(Mockito.mock(SwaggerGeneratorContext.class),
+        null);
+    swaggerDefinitionProcessor.process(SwaggerTestTarget.class.getAnnotation(SwaggerDefinition.class),
+        swaggerGenerator);
+
+    Swagger swagger = swaggerGenerator.getSwagger();
+    assertEquals(1, swagger.getTags().size());
+    io.swagger.models.Tag tag = swagger.getTags().get(0);
+    assertEquals("testTag", tag.getName());
+    assertEquals("desc", tag.getDescription());
+    assertEquals("testValue", tag.getExternalDocs().getDescription());
+    assertEquals("testUrl", tag.getExternalDocs().getUrl());
+    assertEquals("127.0.0.1", swagger.getHost());
+    assertEquals(2, swagger.getSchemes().size());
+    assertEquals(io.swagger.models.Scheme.HTTP, swagger.getSchemes().get(0));
+    assertEquals(io.swagger.models.Scheme.HTTPS, swagger.getSchemes().get(1));
+    io.swagger.models.Info info = swagger.getInfo();
+    assertEquals("title", info.getTitle());
+    assertEquals("version", info.getVersion());
+    assertEquals("desc", info.getDescription());
+    assertEquals("contactName", info.getContact().getName());
+    assertEquals("licenseName", info.getLicense().getName());
+  }
+
+  @SwaggerDefinition(tags = {
+      @Tag(name = "testTag", description = "desc", externalDocs = @ExternalDocs(value = "testValue", url = "testUrl"))
+  },
+      host = "127.0.0.1",
+      schemes = {Scheme.HTTP, Scheme.HTTPS},
+      info = @Info(title = "title", version = "version", description = "desc", contact =
+      @Contact(name = "contactName"), license = @License(name = "licenseName")))
+  private class SwaggerTestTarget {
+  }
+}

-- 
To stop receiving notification emails like this one, please contact
"commits@servicecomb.apache.org" <co...@servicecomb.apache.org>.