Update DCAE SDK library
[dcaegen2/collectors/ves.git] / src / main / java / org / onap / dcae / VesApplication.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * PROJECT
4  * ================================================================================
5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright (C) 2020-2021 Nokia. All rights reserved.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.dcae;
23
24 import io.vavr.collection.Map;
25 import org.onap.dcae.common.EventSender;
26 import org.onap.dcae.common.validator.StndDefinedValidatorResolver;
27 import org.onap.dcae.common.publishing.DMaaPConfigurationParser;
28 import org.onap.dcae.common.publishing.DMaaPEventPublisher;
29 import org.onap.dcae.common.publishing.PublisherConfig;
30 import org.onap.dcae.configuration.ConfigurationHandler;
31 import org.onap.dcae.configuration.ConfigUpdater;
32 import org.onap.dcae.configuration.ConfigUpdaterFactory;
33 import org.onap.dcae.configuration.cbs.CbsClientConfigurationProvider;
34 import org.onap.dcaegen2.services.sdk.services.external.schema.manager.service.StndDefinedValidator;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.beans.factory.annotation.Qualifier;
38 import org.springframework.boot.SpringApplication;
39 import org.springframework.boot.autoconfigure.SpringBootApplication;
40 import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
41 import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
42 import org.springframework.context.ConfigurableApplicationContext;
43 import org.springframework.context.annotation.Bean;
44 import org.springframework.context.annotation.Lazy;
45
46 import java.nio.file.Paths;
47 import java.time.Duration;
48 import java.util.concurrent.ScheduledThreadPoolExecutor;
49 import java.util.concurrent.locks.ReentrantLock;
50
51 @SpringBootApplication(exclude = {GsonAutoConfiguration.class, SecurityAutoConfiguration.class})
52 public class VesApplication {
53
54     private static final int DEFAULT_CONFIGURATION_FETCH_PERIOD = 5;
55
56     private static final Logger incomingRequestsLogger = LoggerFactory.getLogger("org.onap.dcae.common.input");
57     private static final Logger errorLog = LoggerFactory.getLogger("org.onap.dcae.common.error");
58     private static ApplicationSettings applicationSettings;
59     private static ConfigurableApplicationContext context;
60     private static ConfigUpdater configUpdater;
61     private static DMaaPEventPublisher eventPublisher;
62     private static ApplicationConfigurationListener applicationConfigurationListener;
63     private static ReentrantLock applicationLock = new ReentrantLock();
64
65     public static void main(String[] args) {
66         applicationLock.lock();
67         try {
68             startApplication(args);
69             startListeningForApplicationConfiguration();
70         } finally {
71             applicationLock.unlock();
72         }
73     }
74
75     private static void startApplication(String[] args) {
76         SpringApplication app = new SpringApplication(VesApplication.class);
77         applicationSettings = new ApplicationSettings(args, CLIUtils::processCmdLine);
78         configUpdater = ConfigUpdaterFactory.create(
79                 applicationSettings.configurationFileLocation(),
80                 Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
81         eventPublisher = new DMaaPEventPublisher(getDmaapConfig());
82         app.setAddCommandLineProperties(true);
83         context = app.run();
84     }
85
86     public static void restartApplication() {
87         Thread thread = new Thread(() -> {
88             try {
89                 applicationLock.lock();
90                 reloadApplicationResources();
91                 reloadSpringContext();
92             } finally {
93                 applicationLock.unlock();
94             }
95         });
96         thread.setDaemon(false);
97         thread.start();
98     }
99
100     private static void reloadApplicationResources() {
101         applicationSettings.reload();
102         eventPublisher.reload(getDmaapConfig());
103         configUpdater.setPaths(applicationSettings.configurationFileLocation(),
104                 Paths.get(applicationSettings.dMaaPConfigurationFileLocation()));
105         applicationConfigurationListener.reload(Duration.ofMinutes(applicationSettings.configurationUpdateFrequency()));
106     }
107
108     private static void reloadSpringContext() {
109         context.close();
110         context = SpringApplication.run(VesApplication.class);
111     }
112
113     private static void startListeningForApplicationConfiguration() {
114         ConfigurationHandler cbsHandler = new ConfigurationHandler(new CbsClientConfigurationProvider(), configUpdater);
115         ApplicationConfigurationListener applicationConfigProvider = new ApplicationConfigurationListener(Duration.ofMinutes(DEFAULT_CONFIGURATION_FETCH_PERIOD), cbsHandler);
116
117         ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
118         scheduledThreadPoolExecutor.execute(applicationConfigProvider);
119         applicationConfigurationListener = applicationConfigProvider;
120     }
121
122     private static Map<String, PublisherConfig> getDmaapConfig() {
123         return DMaaPConfigurationParser
124                 .parseToDomainMapping(Paths.get(applicationSettings.dMaaPConfigurationFileLocation())).get();
125     }
126
127     @Bean
128     @Lazy
129     public ApplicationSettings applicationSettings() {
130         return applicationSettings;
131     }
132
133     @Bean
134     @Qualifier("incomingRequestsLogger")
135     public Logger incomingRequestsLogger() {
136         return incomingRequestsLogger;
137     }
138
139     @Bean
140     @Qualifier("errorLog")
141     public Logger errorLogger() {
142         return errorLog;
143     }
144
145     @Bean
146     @Qualifier("eventSender")
147     public EventSender eventSender() {
148         return new EventSender(eventPublisher, applicationSettings.getDmaapStreamIds());
149     }
150
151     @Bean
152     public StndDefinedValidator getStndDefinedValidator(StndDefinedValidatorResolver resolver) {
153         return resolver.resolve();
154     }
155 }