Update traversal from AJSC 2 to Spring Boot
[aai/traversal.git] / aai-traversal / src / main / java / org / onap / aai / web / JerseyConfiguration.java
1 package org.onap.aai.web;
2
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;
16
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;
22 import java.util.Set;
23 import java.util.logging.Logger;
24 import java.util.stream.Collectors;
25
26 @Component
27 @ApplicationPath("/aai")
28 public class JerseyConfiguration extends ResourceConfig {
29
30     private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName());
31
32     private Environment env;
33
34     @Autowired
35     public JerseyConfiguration(Environment env) {
36
37         this.env = env;
38
39         register(SearchProvider.class);
40         register(ModelAndNamedQueryRestProvider.class);
41         register(QueryConsumer.class);
42
43         register(V3ThroughV7Consumer.class);
44         register(EchoResponse.class);
45
46         //Request Filters
47         registerFiltersForRequests();
48         // Response Filters
49         registerFiltersForResponses();
50
51         property(ServletProperties.FILTER_FORWARD_ON_404, true);
52
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));
57         }
58     }
59
60     public void registerFiltersForRequests() {
61
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);
66
67
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");
72             }
73         }
74
75         // Turn the set back into a list
76         List<Class<? extends ContainerRequestFilter>> filtersList = filters
77                 .stream()
78                 .filter(f -> {
79                     if (f.isAnnotationPresent(Profile.class)
80                             && !env.acceptsProfiles(f.getAnnotation(Profile.class).value())) {
81                         return false;
82                     }
83                     return true;
84                 })
85                 .collect(Collectors.toList());
86
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()));
89
90         // Then register this to the jersey application
91         filtersList.forEach(this::register);
92     }
93
94     public void registerFiltersForResponses() {
95
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);
100
101
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");
106             }
107         }
108
109         // Turn the set back into a list
110         List<Class<? extends ContainerResponseFilter>> filtersList = filters.stream()
111                 .filter(f -> {
112                     if (f.isAnnotationPresent(Profile.class)
113                             && !env.acceptsProfiles(f.getAnnotation(Profile.class).value())) {
114                         return false;
115                     }
116                     return true;
117                 })
118                 .collect(Collectors.toList());
119
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()));
122
123         // Then register this to the jersey application
124         filtersList.forEach(this::register);
125     }
126
127 }