1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.openehealth.ipf.commons.ihe.fhir;
18
19 import ca.uhn.fhir.context.FhirContext;
20 import ca.uhn.fhir.context.FhirVersionEnum;
21 import ca.uhn.fhir.narrative.INarrativeGenerator;
22 import ca.uhn.fhir.parser.LenientErrorHandler;
23 import ca.uhn.fhir.parser.StrictErrorHandler;
24 import ca.uhn.fhir.rest.server.FifoMemoryPagingProvider;
25 import ca.uhn.fhir.rest.server.IPagingProvider;
26 import ca.uhn.fhir.rest.server.RestfulServer;
27 import ca.uhn.fhir.rest.server.interceptor.LoggingInterceptor;
28 import ca.uhn.fhir.rest.server.interceptor.ResponseHighlighterInterceptor;
29 import lombok.Getter;
30 import lombok.Setter;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import javax.servlet.ServletConfig;
35 import javax.servlet.ServletException;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class IpfFhirServlet extends RestfulServer {
52
53 private static final Logger LOG = LoggerFactory.getLogger(IpfFhirServlet.class);
54
55 private static final String SERVLET_FHIR_VERSION_PARAMETER_NAME = "fhirVersion";
56 private static final String SERVLET_LOGGING_PARAMETER_NAME = "logging";
57 private static final String SERVLET_RESPONSE_HIGHLIGHTING_PARAMETER_NAME = "highlight";
58 private static final String SERVLET_PRETTY_PRINT_PARAMETER_NAME = "pretty";
59 private static final String SERVLET_PAGING_PROVIDER_SIZE_PARAMETER_NAME = "pagingProviderSize";
60 private static final String SERVLET_DEFAULT_PAGE_SIZE_PARAMETER_NAME = "defaultPageSize";
61 private static final String SERVLET_MAX_PAGE_SIZE_PARAMETER_NAME = "maximumPageSize";
62 private static final String SERVLET_STRICT_PARSER_ERROR_HANDLER_PARAMETER_NAME = "strict";
63
64 public static final String DEFAULT_SERVLET_NAME = "FhirServlet";
65
66
67 @Getter @Setter
68 private String servletName = DEFAULT_SERVLET_NAME;
69 @Getter @Setter
70 private boolean logging;
71 @Getter @Setter
72 private FhirVersionEnum fhirVersion;
73 @Getter @Setter
74 private boolean responseHighlighting;
75 @Getter @Setter
76 private boolean prettyPrint;
77 @Getter @Setter
78 private int pagingProviderSize = 50;
79 @Getter @Setter
80 private int defaultPageSize = 25;
81 @Getter @Setter
82 private int maximumPageSize = 100;
83 @Getter @Setter
84 private boolean strictErrorHandler;
85 @Getter @Setter
86 private INarrativeGenerator narrativeGenerator = null;
87
88 public IpfFhirServlet() {
89 super();
90 }
91
92 public IpfFhirServlet(FhirVersionEnum fhirVersion) {
93 super();
94 this.fhirVersion = fhirVersion;
95 }
96
97
98
99
100
101
102
103 @Override
104 public void init(ServletConfig config) throws ServletException {
105 this.servletName = config.getServletName();
106
107 FhirRegistry fhirRegistry = DefaultFhirRegistry.getFhirRegistry(servletName);
108 if (fhirRegistry.hasServlet(servletName)) {
109 throw new ServletException(String.format("Duplicate FHIR Servlet name %s. Use unique names per Camel application", servletName));
110 }
111
112 try {
113 fhirRegistry.register(this);
114 } catch (Exception e) {
115 throw new ServletException(e);
116 }
117
118 LOG.debug("Initializing IpfFhirServlet " + servletName);
119
120 if (config.getInitParameter(SERVLET_FHIR_VERSION_PARAMETER_NAME) != null) {
121 fhirVersion = FhirVersionEnum.valueOf(config.getInitParameter(SERVLET_FHIR_VERSION_PARAMETER_NAME));
122 }
123 if (config.getInitParameter(SERVLET_LOGGING_PARAMETER_NAME) != null) {
124 logging = Boolean.parseBoolean(config.getInitParameter(SERVLET_LOGGING_PARAMETER_NAME));
125 }
126 if (config.getInitParameter(SERVLET_RESPONSE_HIGHLIGHTING_PARAMETER_NAME) != null) {
127 responseHighlighting = Boolean.parseBoolean(config.getInitParameter(SERVLET_RESPONSE_HIGHLIGHTING_PARAMETER_NAME));
128 }
129 if (config.getInitParameter(SERVLET_PRETTY_PRINT_PARAMETER_NAME) != null) {
130 prettyPrint = Boolean.parseBoolean(config.getInitParameter(SERVLET_PRETTY_PRINT_PARAMETER_NAME));
131 }
132 if (config.getInitParameter(SERVLET_STRICT_PARSER_ERROR_HANDLER_PARAMETER_NAME) != null) {
133 strictErrorHandler = Boolean.parseBoolean(config.getInitParameter(SERVLET_STRICT_PARSER_ERROR_HANDLER_PARAMETER_NAME));
134 }
135 String pagingProviderSizeParameter = config.getInitParameter(SERVLET_PAGING_PROVIDER_SIZE_PARAMETER_NAME);
136 if (pagingProviderSizeParameter != null && !pagingProviderSizeParameter.isEmpty()) {
137 pagingProviderSize = Integer.parseInt(pagingProviderSizeParameter);
138 }
139 String defaultPageSizeParameter = config.getInitParameter(SERVLET_DEFAULT_PAGE_SIZE_PARAMETER_NAME);
140 if (defaultPageSizeParameter != null && !defaultPageSizeParameter.isEmpty()) {
141 defaultPageSize = Integer.parseInt(defaultPageSizeParameter);
142 }
143 String maximumPageSizeParameter = config.getInitParameter(SERVLET_MAX_PAGE_SIZE_PARAMETER_NAME);
144 if (maximumPageSizeParameter != null && !maximumPageSizeParameter.isEmpty()) {
145 maximumPageSize = Integer.parseInt(maximumPageSizeParameter);
146 }
147
148
149
150 super.init(config);
151
152 }
153
154 @Override
155 public void destroy() {
156 FhirRegistry registry = DefaultFhirRegistry.removeFhirRegistry(getServletName());
157 if (registry != null) {
158 try {
159 registry.unregister(this);
160 } catch (Exception e) {
161 LOG.warn("Problem while unregistering servlet {}", getServletName(), e);
162 }
163 }
164 super.destroy();
165 LOG.info("Destroyed IpfFhirServlet [{}]", getServletName());
166 }
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 protected IPagingProvider getDefaultPagingProvider(int pagingProviderSize) {
188 FifoMemoryPagingProvider pagingProvider = new FifoMemoryPagingProvider(pagingProviderSize);
189 pagingProvider.setDefaultPageSize(getDefaultPageSize());
190 pagingProvider.setMaximumPageSize(getMaximumPageSize());
191 return pagingProvider;
192 }
193
194
195
196
197 protected INarrativeGenerator getDefaultNarrativeGenerator() {
198 return narrativeGenerator;
199 }
200
201
202
203
204
205
206
207 @Override
208 protected void initialize() throws ServletException {
209 setFhirContext(new FhirContext(fhirVersion));
210
211
212 registerInterceptor(new RequestDetailProvider());
213
214 if (logging) {
215 LoggingInterceptor loggingInterceptor = new LoggingInterceptor();
216 registerInterceptor(loggingInterceptor);
217 loggingInterceptor.setLoggerName(IpfFhirServlet.class.getName());
218
219
220
221
222 loggingInterceptor.setMessageFormat("Source[${remoteAddr}] Operation[${operationType} ${idOrResourceName}] User-Agent[${requestHeader.user-agent}] Params[${requestParameters}]");
223 }
224
225 if (responseHighlighting) {
226 ResponseHighlighterInterceptor interceptor = new ResponseHighlighterInterceptor();
227 registerInterceptor(interceptor);
228 }
229
230 getFhirContext().setParserErrorHandler(strictErrorHandler ? new StrictErrorHandler() : new LenientErrorHandler());
231
232 setPagingProvider(getDefaultPagingProvider(pagingProviderSize));
233 setDefaultPrettyPrint(prettyPrint);
234
235
236
237
238
239
240 getFhirContext().setNarrativeGenerator(getDefaultNarrativeGenerator());
241
242 }
243
244
245 }