Skip to content

Commit 95182e3

Browse files
committed
Merge pull request #1268 from lugaru1234/issue977
Fixes #977: Tags have been filtered
2 parents 8a10e20 + f382a95 commit 95182e3

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

modules/swagger-core/src/main/java/io/swagger/core/filter/SpecFilter.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,33 @@
55
import io.swagger.models.Operation;
66
import io.swagger.models.Path;
77
import io.swagger.models.Swagger;
8+
import io.swagger.models.Tag;
89
import io.swagger.models.parameters.Parameter;
910
import io.swagger.models.properties.Property;
1011

1112
import java.util.ArrayList;
1213
import java.util.HashMap;
14+
import java.util.HashSet;
15+
import java.util.Iterator;
1316
import java.util.LinkedHashMap;
1417
import java.util.List;
1518
import java.util.Map;
19+
import java.util.Set;
1620

1721
public class SpecFilter {
1822
public Swagger filter(Swagger swagger, SwaggerSpecFilter filter, Map<String, List<String>> params, Map<String, String> cookies, Map<String, List<String>> headers) {
1923
Swagger clone = new Swagger();
2024
clone.info(swagger.getInfo())
21-
.tags(swagger.getTags())
25+
.tags(swagger.getTags() == null ? null : new ArrayList<Tag>(swagger.getTags()))
2226
.host(swagger.getHost())
2327
.basePath(swagger.getBasePath())
2428
.schemes(swagger.getSchemes())
2529
.consumes(swagger.getConsumes())
2630
.produces(swagger.getProduces())
2731
.externalDocs(swagger.getExternalDocs());
2832

33+
final Set<String> filteredTags = new HashSet<String>();
34+
final Set<String> allowedTags = new HashSet<String>();
2935
for (String resourcePath : swagger.getPaths().keySet()) {
3036
Path path = swagger.getPaths().get(resourcePath);
3137
Map<String, Operation> ops = new HashMap<String, Operation>();
@@ -41,15 +47,34 @@ public Swagger filter(Swagger swagger, SwaggerSpecFilter filter, Map<String, Lis
4147
Operation op = ops.get(key);
4248
if (op != null) {
4349
ApiDescription desc = new ApiDescription(resourcePath, key);
50+
final Set<String> tags;
4451
if (filter.isOperationAllowed(op, desc, params, cookies, headers)) {
4552
clonedPath.set(key, filterOperation(filter, op, desc, params, cookies, headers));
53+
tags = allowedTags;
54+
} else {
55+
tags = filteredTags;
56+
}
57+
if (op.getTags() != null) {
58+
tags.addAll(op.getTags());
4659
}
4760
}
4861
}
4962
if (!clonedPath.isEmpty()) {
5063
clone.path(resourcePath, clonedPath);
5164
}
5265
}
66+
final List<Tag> tags = clone.getTags();
67+
filteredTags.removeAll(allowedTags);
68+
if (tags != null && !filteredTags.isEmpty()) {
69+
for (Iterator<Tag> it = tags.iterator(); it.hasNext(); ) {
70+
if (filteredTags.contains(it.next().getName())) {
71+
it.remove();
72+
}
73+
}
74+
if (clone.getTags().isEmpty()) {
75+
clone.setTags(null);
76+
}
77+
}
5378

5479
Map<String, Model> definitions = filterDefinitions(filter, swagger.getDefinitions(), params, cookies, headers);
5580
clone.setSecurityDefinitions(swagger.getSecurityDefinitions());

modules/swagger-core/src/test/scala/filter/SpecFilterTest.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,24 @@ class SpecFilterTest extends FlatSpec with Matchers {
107107
if (filtered.size() != 1)
108108
fail("ModelImpl with no properties failed to filter")
109109
}
110+
111+
it should "contain all tags in the top level Swagger object" in {
112+
val json = Source.fromFile("src/test/scala/specFiles/petstore.json").mkString
113+
val swagger = Json.mapper().readValue(json, classOf[Swagger])
114+
val filter = new NoOpOperationsFilter()
115+
val filtered = new SpecFilter().filter(swagger, filter, null, null, null)
116+
getTagNames(filtered) should be(Set("pet", "user", "store"))
117+
}
118+
119+
it should "not contain user tags in the top level Swagger object" in {
120+
val json = Source.fromFile("src/test/scala/specFiles/petstore.json").mkString
121+
val swagger = Json.mapper().readValue(json, classOf[Swagger])
122+
val filter = new NoUserOperationsFilter
123+
val filtered = new SpecFilter().filter(swagger, filter, null, null, null)
124+
getTagNames(filtered) should be(Set("pet", "store"))
125+
}
126+
127+
def getTagNames(swagger: Swagger) = {
128+
(for (item <- swagger.getTags.asScala) yield item.getName).toSet
129+
}
110130
}

0 commit comments

Comments
 (0)