Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1bb340c

Browse files
committed
Added ApiListScannerPlugin to allow custom ApiDescriptions
fixes springfox#1335
1 parent 32e6469 commit 1bb340c

7 files changed

Lines changed: 70 additions & 3 deletions

File tree

docs/asciidoc/extensibility.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ To explicitly state the extensibility points that are available:
3030
|===
3131
|Name| Description
3232

33+
| `ApiListingScannerPlugin`
34+
| for adding custom api descriptions
35+
3336
| `ApiListingBuilderPlugin`
3437
| for enriching api listings
3538

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
*
3+
* Copyright 2016 the original author or authors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*
18+
*/
19+
package springfox.documentation.spi.service;
20+
21+
import org.springframework.plugin.core.Plugin;
22+
import springfox.documentation.service.ApiDescription;
23+
import springfox.documentation.spi.DocumentationType;
24+
import springfox.documentation.spi.service.contexts.DocumentationContext;
25+
26+
import java.util.List;
27+
28+
public interface ApiListingScannerPlugin extends Plugin<DocumentationType> {
29+
/**
30+
* Implement this method to manually add ApiDescriptions
31+
*
32+
* @param context - Documentatio ncontext that can be used infer documentation context
33+
* @see springfox.documentation.service.ApiDescription
34+
* @return List of {@link ApiDescription}
35+
*/
36+
List<ApiDescription> apply(DocumentationContext context);
37+
}

springfox-spring-web/src/main/java/springfox/documentation/spring/web/plugins/DocumentationPluginsManager.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,21 @@
2020
package springfox.documentation.spring.web.plugins;
2121

2222
import com.google.common.base.Function;
23+
import com.google.common.base.Optional;
24+
import com.google.common.collect.Lists;
2325
import org.springframework.beans.factory.annotation.Autowired;
2426
import org.springframework.beans.factory.annotation.Qualifier;
2527
import org.springframework.plugin.core.PluginRegistry;
2628
import org.springframework.stereotype.Component;
29+
import springfox.documentation.service.ApiDescription;
2730
import springfox.documentation.service.ApiListing;
2831
import springfox.documentation.service.Operation;
2932
import springfox.documentation.service.Parameter;
3033
import springfox.documentation.service.PathDecorator;
3134
import springfox.documentation.spi.DocumentationType;
3235
import springfox.documentation.spi.schema.contexts.ModelContext;
3336
import springfox.documentation.spi.service.ApiListingBuilderPlugin;
37+
import springfox.documentation.spi.service.ApiListingScannerPlugin;
3438
import springfox.documentation.spi.service.DefaultsProviderPlugin;
3539
import springfox.documentation.spi.service.DocumentationPlugin;
3640
import springfox.documentation.spi.service.ExpandedParameterBuilderPlugin;
@@ -47,7 +51,9 @@
4751
import springfox.documentation.spi.service.contexts.PathContext;
4852
import springfox.documentation.spi.service.contexts.RequestMappingContext;
4953
import springfox.documentation.spring.web.SpringGroupingStrategy;
54+
import springfox.documentation.spring.web.scanners.ApiListingScanningContext;
5055

56+
import java.util.Collection;
5157
import java.util.List;
5258
import java.util.Set;
5359

@@ -85,6 +91,10 @@ public class DocumentationPluginsManager {
8591
@Qualifier("pathDecoratorRegistry")
8692
private PluginRegistry<PathDecorator, DocumentationContext> pathDecorators;
8793

94+
@Autowired(required = false)
95+
@Qualifier("apiListingScannerPluginRegistry")
96+
private PluginRegistry<ApiListingScannerPlugin, DocumentationType> apiListingScanners;
97+
8898
public Iterable<DocumentationPlugin> documentationPlugins() throws IllegalStateException {
8999
List<DocumentationPlugin> plugins = documentationPlugins.getPlugins();
90100
ensureNoDuplicateGroups(plugins);
@@ -170,4 +180,20 @@ public Function<String, String> apply(PathDecorator input) {
170180
}
171181
};
172182
}
183+
184+
public Collection<ApiDescription> additionalListings(final ApiListingScanningContext context) {
185+
final DocumentationType documentationType = context.getDocumentationContext().getDocumentationType();
186+
return Optional.fromNullable(apiListingScanners)
187+
.transform(new Function<PluginRegistry<ApiListingScannerPlugin,DocumentationType>, List<ApiDescription>>() {
188+
@Override
189+
public List<ApiDescription> apply(PluginRegistry<ApiListingScannerPlugin, DocumentationType> input) {
190+
List<ApiDescription> additional = newArrayList();
191+
for(ApiListingScannerPlugin each : input.getPluginsFor(documentationType)) {
192+
additional.addAll(each.apply(context.getDocumentationContext()));
193+
}
194+
return additional;
195+
}
196+
})
197+
.or(Lists.<ApiDescription>newArrayList());
198+
}
173199
}

springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiDescriptionReader.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ public ApiDescriptionReader(
5555
}
5656

5757
public List<ApiDescription> read(RequestMappingContext outerContext) {
58-
// RequestMappingInfo requestMappingInfo = outerContext.getRequestMappingInfo();
59-
// HandlerMethod handlerMethod = outerContext.getHandlerMethod();
6058
PatternsRequestCondition patternsCondition = outerContext.getPatternsCondition();
6159
ApiSelector selector = outerContext.getDocumentationContext().getApiSelector();
6260

springfox-spring-web/src/main/java/springfox/documentation/spring/web/scanners/ApiListingScanner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public Multimap<String, ApiListing> scan(ApiListingScanningContext context) {
8888
models.putAll(apiModelReader.read(each.withKnownModels(models)));
8989
apiDescriptions.addAll(apiDescriptionReader.read(each));
9090
}
91-
91+
apiDescriptions.addAll(pluginsManager.additionalListings(context));
9292

9393
List<ApiDescription> sortedApis = newArrayList(apiDescriptions);
9494
Collections.sort(sortedApis, documentationContext.getApiDescriptionOrdering());

springfox-spring-web/src/test/groovy/springfox/documentation/spring/web/mixins/ServicePluginsSupport.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class ServicePluginsSupport {
4949
plugins.resourceGroupingStrategies = create([])
5050
plugins.operationModelsProviders = create([new OperationModelsProvider(resolver)])
5151
plugins.defaultsProviders = create([])
52+
plugins.apiListingScanners = create([])
5253
plugins.pathDecorators = create([
5354
new OperationPathDecorator(),
5455
new PathSanitizer(),
@@ -78,6 +79,7 @@ class ServicePluginsSupport {
7879
plugins.operationModelsProviders = create([new OperationModelsProvider(resolver)])
7980
plugins.defaultsProviders = create(defaultProviderPlugins)
8081
plugins.pathDecorators = create(pathDecorators)
82+
plugins.apiListingScanners = create([])
8183
return plugins
8284
}
8385

springfox-swagger-common/src/test/groovy/springfox/documentation/swagger/mixins/SwaggerPluginsSupport.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class SwaggerPluginsSupport {
6464
new ParameterNameReader()])
6565
plugins.operationBuilderPlugins = create([])
6666
plugins.resourceGroupingStrategies = create([new ClassOrApiAnnotationResourceGrouping()])
67+
plugins.apiListingScanners = create([])
6768
plugins.operationModelsProviders = create([
6869
new OperationModelsProvider(resolver),
6970
new SwaggerOperationModelsProvider(resolver)])

0 commit comments

Comments
 (0)