1 package org.onap.aai.web;
3 import org.glassfish.jersey.filter.LoggingFilter;
4 import org.glassfish.jersey.server.ResourceConfig;
5 import org.glassfish.jersey.servlet.ServletProperties;
6 import org.onap.aai.rest.QueryConsumer;
7 import org.onap.aai.rest.retired.V3ThroughV7Consumer;
8 import org.onap.aai.rest.search.ModelAndNamedQueryRestProvider;
9 import org.onap.aai.rest.search.SearchProvider;
10 import org.onap.aai.rest.util.EchoResponse;
11 import org.reflections.Reflections;
12 import org.springframework.beans.factory.annotation.Autowired;
13 import org.springframework.context.annotation.Profile;
14 import org.springframework.core.env.Environment;
15 import org.springframework.stereotype.Component;
17 import javax.annotation.Priority;
18 import javax.ws.rs.ApplicationPath;
19 import javax.ws.rs.container.ContainerRequestFilter;
20 import javax.ws.rs.container.ContainerResponseFilter;
21 import java.util.List;
23 import java.util.logging.Logger;
24 import java.util.stream.Collectors;
27 @ApplicationPath("/aai")
28 public class JerseyConfiguration extends ResourceConfig {
30 private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
32 private Environment env;
35 public JerseyConfiguration(Environment env) {
39 register(SearchProvider.class);
40 register(ModelAndNamedQueryRestProvider.class);
41 register(QueryConsumer.class);
43 register(V3ThroughV7Consumer.class);
44 register(EchoResponse.class);
47 registerFiltersForRequests();
49 registerFiltersForResponses();
51 property(ServletProperties.FILTER_FORWARD_ON_404, true);
53 // Following registers the request headers and response headers
54 // If the LoggingFilter second argument is set to true, it will print response value as well
55 if ("true".equalsIgnoreCase(env.getProperty("aai.request.logging.enabled"))) {
56 register(new LoggingFilter(log, false));
60 public void registerFiltersForRequests() {
62 // Find all the classes within the interceptors package
63 Reflections reflections = new Reflections("org.onap.aai.interceptors");
64 // Filter them based on the clazz that was passed in
65 Set<Class<? extends ContainerRequestFilter>> filters = reflections.getSubTypesOf(ContainerRequestFilter.class);
68 // Check to ensure that each of the filter has the @Priority annotation and if not throw exception
69 for (Class filterClass : filters) {
70 if (filterClass.getAnnotation(Priority.class) == null) {
71 throw new RuntimeException("Container filter " + filterClass.getName() + " does not have @Priority annotation");
75 // Turn the set back into a list
76 List<Class<? extends ContainerRequestFilter>> filtersList = filters
79 if (f.isAnnotationPresent(Profile.class)
80 && !env.acceptsProfiles(f.getAnnotation(Profile.class).value())) {
85 .collect(Collectors.toList());
87 // Sort them by their priority levels value
88 filtersList.sort((c1, c2) -> Integer.valueOf(c1.getAnnotation(Priority.class).value()).compareTo(c2.getAnnotation(Priority.class).value()));
90 // Then register this to the jersey application
91 filtersList.forEach(this::register);
94 public void registerFiltersForResponses() {
96 // Find all the classes within the interceptors package
97 Reflections reflections = new Reflections("org.onap.aai.interceptors");
98 // Filter them based on the clazz that was passed in
99 Set<Class<? extends ContainerResponseFilter>> filters = reflections.getSubTypesOf(ContainerResponseFilter.class);
102 // Check to ensure that each of the filter has the @Priority annotation and if not throw exception
103 for (Class filterClass : filters) {
104 if (filterClass.getAnnotation(Priority.class) == null) {
105 throw new RuntimeException("Container filter " + filterClass.getName() + " does not have @Priority annotation");
109 // Turn the set back into a list
110 List<Class<? extends ContainerResponseFilter>> filtersList = filters.stream()
112 if (f.isAnnotationPresent(Profile.class)
113 && !env.acceptsProfiles(f.getAnnotation(Profile.class).value())) {
118 .collect(Collectors.toList());
120 // Sort them by their priority levels value
121 filtersList.sort((c1, c2) -> Integer.valueOf(c1.getAnnotation(Priority.class).value()).compareTo(c2.getAnnotation(Priority.class).value()));
123 // Then register this to the jersey application
124 filtersList.forEach(this::register);