1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.rest.tools;
35
36 import info.magnolia.cms.util.CustomServletConfig;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.event.EventBus;
39 import info.magnolia.event.SystemEventBus;
40 import info.magnolia.objectfactory.ComponentProvider;
41 import info.magnolia.objectfactory.Components;
42 import info.magnolia.rest.RestDispatcherServlet;
43 import info.magnolia.rest.RestIntegrationModule;
44 import info.magnolia.rest.registry.ConfiguredEndpointDefinition;
45 import info.magnolia.rest.registry.EndpointDefinitionRegistry;
46 import info.magnolia.rest.registry.EndpointDefinitionRegistryEvent;
47
48 import java.io.IOException;
49 import java.util.HashMap;
50
51 import javax.inject.Inject;
52 import javax.inject.Named;
53 import javax.servlet.ServletConfig;
54 import javax.servlet.ServletException;
55 import javax.servlet.http.HttpServletRequest;
56 import javax.servlet.http.HttpServletResponse;
57
58 import io.swagger.jaxrs.config.DefaultJaxrsConfig;
59 import io.swagger.jaxrs.listing.ApiListingResource;
60
61
62
63
64
65
66
67 public class SwaggerRestDispatcherServlet extends RestDispatcherServlet {
68
69 private final static String PARAMETER_API_VERSION = "api.version";
70 private final static String PARAMETER_API_BASEPATH = "swagger.api.basepath";
71 private static final String ENDPOINT_NAME = "api-listing-resource-json";
72
73
74
75 static final String SWAGGER = "swagger";
76
77 private final RestToolsModule restToolsModule;
78 private DefaultJaxrsConfig config;
79
80
81
82
83
84
85 private boolean swaggerCacheIsStale = false;
86
87 @Inject
88 public SwaggerRestDispatcherServlet(final RestIntegrationModule restIntegrationModule, final EndpointDefinitionRegistry endpointDefinitionRegistry, @Named(SystemEventBus.NAME) EventBus systemEventBus, final RestToolsModule restToolsModule, ComponentProvider componentProvider) {
89 super(restIntegrationModule, endpointDefinitionRegistry, systemEventBus, componentProvider);
90 this.restToolsModule = restToolsModule;
91 }
92
93
94
95
96 @Deprecated
97 public SwaggerRestDispatcherServlet(final RestIntegrationModule restIntegrationModule, final EndpointDefinitionRegistry endpointDefinitionRegistry, @Named(SystemEventBus.NAME) EventBus systemEventBus, final RestToolsModule restToolsModule) {
98 this(restIntegrationModule, endpointDefinitionRegistry, systemEventBus, restToolsModule, Components.getComponentProvider());
99 }
100
101 @Override
102 public void init(ServletConfig servletConfig) throws ServletException {
103 super.init(servletConfig);
104
105 initApiListing();
106
107 config = new DefaultJaxrsConfig();
108 HashMap<String, String> initParameters = new HashMap<String, String>();
109 initParameters.put(PARAMETER_API_VERSION, restToolsModule.getApiVersion());
110 initParameters.put(PARAMETER_API_BASEPATH, restToolsModule.getApiBasepath());
111 config.init(new CustomServletConfig("DefaultJaxrsConfig", super.getServletContext(), initParameters));
112 }
113
114 private void initApiListing() {
115
116 ConfiguredEndpointDefinition endpointDefinition = new ConfiguredEndpointDefinition();
117 endpointDefinition.setImplementationClass(ApiListingResource.class);
118 endpointDefinition.setName(ENDPOINT_NAME);
119 super.registerEndpoint(endpointDefinition);
120 }
121
122
123
124
125
126
127 private void refreshApiListing() {
128 unregisterEndpoint(ENDPOINT_NAME);
129 initApiListing();
130 swaggerCacheIsStale = true;
131 }
132
133 @Override
134 protected void service(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
135
136 if (swaggerCacheIsStale) {
137 MgnlContext.getWebContext().getServletContext().removeAttribute(SWAGGER);
138 swaggerCacheIsStale = false;
139 }
140
141 super.service(httpServletRequest, httpServletResponse);
142 }
143
144 @Override
145 public void destroy() {
146 unregisterEndpoint(ENDPOINT_NAME);
147 super.destroy();
148 if (config != null) {
149 config.destroy();
150 }
151 }
152
153 @Override
154 public void onEndpointRegistered(EndpointDefinitionRegistryEvent event) {
155 super.onEndpointRegistered(event);
156 refreshApiListing();
157 }
158
159 @Override
160 public void onEndpointReregistered(EndpointDefinitionRegistryEvent event) {
161 super.onEndpointReregistered(event);
162 refreshApiListing();
163 }
164
165 @Override
166 public void onEndpointUnregistered(EndpointDefinitionRegistryEvent event) {
167 super.onEndpointUnregistered(event);
168 refreshApiListing();
169 }
170 }