Merge "Bug fixes, syncronization, and clean up daemon"
[music.git] / music-rest / src / main / java / org / onap / music / MusicApplication.java
1 /*
2  * ============LICENSE_START==========================================
3  * org.onap.music
4  * ===================================================================
5  *  Copyright (c) 2017 AT&T Intellectual Property
6  * ===================================================================
7  *  Licensed under the Apache License, Version 2.0 (the "License");
8  *  you may not use this file except in compliance with the License.
9  *  You may obtain a copy of the License at
10  * 
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  *  Unless required by applicable law or agreed to in writing, software
14  *  distributed under the License is distributed on an "AS IS" BASIS,
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  *  See the License for the specific language governing permissions and
17  *  limitations under the License.
18  * 
19  * ============LICENSE_END=============================================
20  * ====================================================================
21  */
22
23 package org.onap.music;
24
25 import javax.servlet.Filter;
26 import javax.servlet.FilterChain;
27 import javax.servlet.ServletException;
28 import javax.servlet.ServletRequest;
29 import javax.servlet.ServletResponse;
30
31 import org.onap.aaf.cadi.PropAccess;
32 import org.onap.music.authentication.CadiAuthFilter;
33 import org.onap.music.authentication.MusicAuthorizationFilter;
34 import org.onap.music.eelf.logging.EELFLoggerDelegate;
35 import org.onap.music.eelf.logging.MusicLoggingServletFilter;
36 import org.onap.music.lockingservice.cassandra.LockCleanUpDaemon;
37 import org.onap.music.main.MusicUtil;
38 import org.onap.music.main.PropertiesLoader;
39 import org.springframework.beans.factory.annotation.Autowired;
40 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
41 import org.springframework.boot.autoconfigure.SpringBootApplication;
42 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
43 import org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration;
44 import org.springframework.boot.builder.SpringApplicationBuilder;
45 import org.springframework.boot.web.servlet.FilterRegistrationBean;
46 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
47 import org.springframework.context.annotation.Bean;
48 import org.springframework.context.annotation.ComponentScan;
49 import org.springframework.context.annotation.DependsOn;
50 import org.springframework.scheduling.annotation.EnableScheduling;
51 import org.springframework.web.context.request.RequestContextListener;
52
53 @SpringBootApplication(scanBasePackages = { "org.onap.music.rest"})
54 @EnableAutoConfiguration(exclude = { CassandraDataAutoConfiguration.class })
55 @ComponentScan(value = { "org.onap.music" })
56 @EnableScheduling
57 public class MusicApplication extends SpringBootServletInitializer {
58
59     private static final String KEYSPACE_PATTERN = "/v2/keyspaces/*";
60     private static final String LOCKS_PATTERN = "/v2/locks/*";
61     private static final String Q_PATTERN = "/v2/priorityq/*";
62
63     @Autowired
64     private PropertiesLoader propertyLoader;
65     private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MusicApplication.class);
66
67
68     public static void main(String[] args) {
69         new MusicApplication().configure(new SpringApplicationBuilder(MusicApplication.class)).run(args);
70         
71         LockCleanUpDaemon daemon = new LockCleanUpDaemon();
72         daemon.setDaemon(true);
73         daemon.start();
74     }
75
76     @Override
77     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
78
79         return application.sources(MusicApplication.class);
80     }
81
82     @Bean("loadProperties")
83     public void loadProperties() {
84         propertyLoader.loadProperties();
85     }
86
87
88     @Bean
89     @DependsOn("loadProperties")
90     public PropAccess propAccess() {
91         if (MusicUtil.getIsCadi()) {
92             return new PropAccess(new String[] { 
93                 "cadi_prop_files=/opt/app/music/etc/cadi.properties" });
94         } else {
95             return null;
96         }
97     }
98
99     @Bean(name = "cadiFilter")
100     @DependsOn("loadProperties")
101     public Filter cadiFilter() throws ServletException {
102         propertyLoader.loadProperties();
103         if (MusicUtil.getIsCadi()) {
104             PropAccess propAccess = propAccess();
105             return new CadiAuthFilter(propAccess);
106         } else {
107             return (ServletRequest request, ServletResponse response, FilterChain chain) -> {
108                 // do nothing for now.
109             };
110         }
111     }
112     
113     /**
114      * Added for capturing custom header values from client.
115      * 
116      * order is set to 1 for this filter
117      * 
118      * sp931a
119      * 
120      * @return
121      * @throws ServletException
122      */
123     @Bean(name="logFilter")
124     @DependsOn("loadProperties")
125     public FilterRegistrationBean<Filter> loggingFilterRegistration() throws ServletException {
126         logger.info("loggingFilterRegistration called for log filter..");
127         propertyLoader.loadProperties();
128         FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
129         frb.setFilter(new MusicLoggingServletFilter());
130         frb.addUrlPatterns(
131             KEYSPACE_PATTERN,
132             LOCKS_PATTERN,
133             Q_PATTERN
134         );
135         frb.setName("logFilter");
136         frb.setOrder(1);
137         return frb;
138     }
139
140     @Bean
141     @DependsOn("loadProperties")
142     public FilterRegistrationBean<Filter> cadiFilterRegistration() throws ServletException {
143         logger.info("cadiFilterRegistration called for cadi filter..");
144         FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
145         frb.setFilter(cadiFilter());
146         if (MusicUtil.getIsCadi()) {
147             frb.addUrlPatterns(
148                 KEYSPACE_PATTERN,
149                 LOCKS_PATTERN,
150                 Q_PATTERN
151             );
152         } else {
153             frb.addUrlPatterns("/v0/test");
154         }
155         frb.setName("cadiFilter");
156         frb.setOrder(2);
157         return frb;
158     }
159
160     
161     /**
162      * Added for Authorization using CADI
163      * 
164      * sp931a
165      * 
166      * @return
167      * @throws ServletException
168      */
169     @Bean
170     @DependsOn("loadProperties")
171     public FilterRegistrationBean<Filter> cadiFilterRegistrationForAuth() throws ServletException {
172         logger.info("cadiFilterRegistrationForAuth called for cadi auth filter..");
173         FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
174         frb.setFilter(cadiMusicAuthFilter());
175
176         if (MusicUtil.getIsCadi()) {
177             frb.addUrlPatterns(
178                 KEYSPACE_PATTERN,
179                 LOCKS_PATTERN,
180                 Q_PATTERN
181                 );
182         } else {
183             frb.addUrlPatterns("/v0/test");
184         }
185         frb.setName("cadiMusicAuthFilter");
186         frb.setOrder(3);
187         return frb;
188     }
189
190     @Bean(name = "cadiMusicAuthFilter")
191     @DependsOn("loadProperties")
192     public Filter cadiMusicAuthFilter() throws ServletException {
193         propertyLoader.loadProperties();
194         if (MusicUtil.getIsCadi()) {
195             return new MusicAuthorizationFilter();
196         } else {
197             return (ServletRequest request, ServletResponse response, FilterChain chain) -> {
198                 // do nothing for now.
199             };
200         }
201     }
202
203     @Bean
204     @ConditionalOnMissingBean(RequestContextListener.class)
205     public RequestContextListener requestContextListener() {
206         return new RequestContextListener();
207     }
208 }