2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2020 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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.dcae;
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;
46 import java.nio.file.Paths;
47 import java.time.Duration;
48 import java.util.concurrent.ScheduledThreadPoolExecutor;
49 import java.util.concurrent.locks.ReentrantLock;
51 @SpringBootApplication(exclude = {GsonAutoConfiguration.class, SecurityAutoConfiguration.class})
52 public class VesApplication {
54 private static final int DEFAULT_CONFIGURATION_FETCH_PERIOD = 5;
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();
65 public static void main(String[] args) {
66 applicationLock.lock();
68 startApplication(args);
69 startListeningForApplicationConfigurationStoredInConsul();
71 applicationLock.unlock();
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);
86 public static void restartApplication() {
87 Thread thread = new Thread(() -> {
89 applicationLock.lock();
90 reloadApplicationResources();
91 reloadSpringContext();
93 applicationLock.unlock();
96 thread.setDaemon(false);
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()));
108 private static void reloadSpringContext() {
110 context = SpringApplication.run(VesApplication.class);
113 private static void startListeningForApplicationConfigurationStoredInConsul() {
114 ConfigurationHandler cbsHandler = new ConfigurationHandler(new CbsClientConfigurationProvider(), configUpdater);
115 ApplicationConfigurationListener applicationConfigProvider = new ApplicationConfigurationListener(Duration.ofMinutes(DEFAULT_CONFIGURATION_FETCH_PERIOD), cbsHandler);
117 ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
118 scheduledThreadPoolExecutor.execute(applicationConfigProvider);
119 applicationConfigurationListener = applicationConfigProvider;
122 private static Map<String, PublisherConfig> getDmaapConfig() {
123 return DMaaPConfigurationParser
124 .parseToDomainMapping(Paths.get(applicationSettings.dMaaPConfigurationFileLocation())).get();
129 public ApplicationSettings applicationSettings() {
130 return applicationSettings;
134 @Qualifier("incomingRequestsLogger")
135 public Logger incomingRequestsLogger() {
136 return incomingRequestsLogger;
140 @Qualifier("errorLog")
141 public Logger errorLogger() {
146 @Qualifier("eventSender")
147 public EventSender eventSender() {
148 return new EventSender(eventPublisher, applicationSettings.getDmaapStreamIds());
152 public StndDefinedValidator getStndDefinedValidator(StndDefinedValidatorResolver resolver) {
153 return resolver.resolve();