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