enable merge sdc client part into Distribution release image
[multicloud/framework.git] / artifactbroker / main / src / main / java / org / onap / policy / distribution / main / startstop / DistributionActivator.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Ericsson. All rights reserved.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.distribution.main.startstop;
22
23 import java.util.HashMap;
24 import java.util.Map;
25 import java.util.Map.Entry;
26
27 import org.onap.policy.common.logging.flexlogger.FlexLogger;
28 import org.onap.policy.common.logging.flexlogger.Logger;
29 import org.onap.policy.common.parameters.ParameterService;
30 import org.onap.policy.distribution.main.PolicyDistributionException;
31 import org.onap.policy.distribution.main.parameters.DistributionParameterGroup;
32 import org.onap.policy.distribution.main.parameters.ArtifactForwarderConfigurationParameterGroup;
33 import org.onap.policy.distribution.main.rest.DistributionRestServer;
34 import org.onap.policy.distribution.reception.decoding.PluginInitializationException;
35 import org.onap.policy.distribution.reception.handling.AbstractReceptionHandler;
36 import org.onap.policy.distribution.reception.parameters.ReceptionHandlerConfigurationParameterGroup;
37 import org.onap.policy.distribution.reception.parameters.ReceptionHandlerParameters;
38
39 /**
40  * This class wraps a distributor so that it can be activated as a complete service together with all its distribution
41  * and forwarding handlers.
42  */
43 public class DistributionActivator {
44     // The logger for this class
45     private static final Logger LOGGER = FlexLogger.getLogger(DistributionActivator.class);
46
47     // The parameters of this policy distribution activator
48     private final DistributionParameterGroup distributionParameterGroup;
49
50     // The map of reception handlers initialized by this distribution activator
51     private final Map<String, AbstractReceptionHandler> receptionHandlersMap = new HashMap<>();
52
53     private static boolean alive = false;
54
55     private DistributionRestServer restServer;
56
57     /**
58      * Instantiate the activator for policy distribution as a complete service.
59      *
60      * @param distributionParameterGroup the parameters for the distribution service
61      */
62     public DistributionActivator(final DistributionParameterGroup distributionParameterGroup) {
63         this.distributionParameterGroup = distributionParameterGroup;
64     }
65
66     /**
67      * Initialize distribution as a complete service.
68      *
69      * @throws PolicyDistributionException on errors in initializing the service
70      */
71     @SuppressWarnings("unchecked")
72     public void initialize() throws PolicyDistributionException {
73         LOGGER.debug("Policy distribution starting as a service . . .");
74         startDistributionRestServer();
75         registerToParameterService(distributionParameterGroup);
76         for (final ReceptionHandlerParameters receptionHandlerParameters : distributionParameterGroup
77                 .getReceptionHandlerParameters().values()) {
78             try {
79                 final Class<AbstractReceptionHandler> receptionHandlerClass = (Class<AbstractReceptionHandler>) Class
80                         .forName(receptionHandlerParameters.getReceptionHandlerClassName());
81                 final AbstractReceptionHandler receptionHandler = receptionHandlerClass.newInstance();
82                 receptionHandler.initialize(receptionHandlerParameters.getName());
83                 LOGGER.debug("Policy distribution , name = " + receptionHandlerParameters.getName());
84                 receptionHandlersMap.put(receptionHandlerParameters.getName(), receptionHandler);
85                 DistributionActivator.setAlive(true);
86             } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException
87                     | PluginInitializationException exp) {
88                 throw new PolicyDistributionException(exp.getMessage(), exp);
89             }
90         }
91         LOGGER.debug("Policy distribution started as a service");
92     }
93
94     /**
95      * Starts the distribution rest server using configuration parameters.
96      *
97      * @throws PolicyDistributionException if server start fails
98      */
99     private void startDistributionRestServer() throws PolicyDistributionException {
100         distributionParameterGroup.getRestServerParameters().setName(distributionParameterGroup.getName());
101         restServer = new DistributionRestServer(distributionParameterGroup.getRestServerParameters());
102         if (!restServer.start()) {
103             throw new PolicyDistributionException(
104                     "Failed to start distribution rest server. Check log for more details...");
105         }
106     }
107
108     /**
109      * Terminate policy distribution.
110      *
111      * @throws PolicyDistributionException on termination errors
112      */
113     public void terminate() throws PolicyDistributionException {
114         try {
115             for (final AbstractReceptionHandler handler : receptionHandlersMap.values()) {
116                 handler.destroy();
117             }
118             receptionHandlersMap.clear();
119             deregisterToParameterService(distributionParameterGroup);
120             DistributionActivator.setAlive(false);
121
122             // Stop the distribution rest server
123             restServer.stop();
124         } catch (final Exception exp) {
125             LOGGER.error("Policy distribution service termination failed", exp);
126             throw new PolicyDistributionException(exp.getMessage(), exp);
127         }
128     }
129
130     /**
131      * Get the parameters used by the activator.
132      *
133      * @return the parameters of the activator
134      */
135     public DistributionParameterGroup getParameterGroup() {
136         return distributionParameterGroup;
137     }
138
139     /**
140      * Method to register the parameters to Common Parameter Service.
141      *
142      * @param distributionParameterGroup the distribution parameter group
143      */
144     public void registerToParameterService(final DistributionParameterGroup distributionParameterGroup) {
145         ParameterService.register(distributionParameterGroup);
146         for (final ReceptionHandlerParameters params : distributionParameterGroup.getReceptionHandlerParameters()
147                 .values()) {
148             params.setName(distributionParameterGroup.getName());
149             params.getPluginHandlerParameters().setName(distributionParameterGroup.getName());
150             ParameterService.register(params);
151             ParameterService.register(params.getPluginHandlerParameters());
152         }
153         //@formatter:off
154         for (final Entry<String, ArtifactForwarderConfigurationParameterGroup> forwarderConfiguration
155                 : distributionParameterGroup.getArtifactForwarderConfigurationParameters().entrySet()) {
156             forwarderConfiguration.getValue().setName(forwarderConfiguration.getKey());
157             ParameterService.register(forwarderConfiguration.getValue());
158         }
159         for (final Entry<String, ReceptionHandlerConfigurationParameterGroup> receptionHandlerConfiguration
160                 : distributionParameterGroup.getReceptionHandlerConfigurationParameters().entrySet()) {
161             receptionHandlerConfiguration.getValue().setName(receptionHandlerConfiguration.getKey());
162             ParameterService.register(receptionHandlerConfiguration.getValue());
163         }
164         //@formatter:off
165     }
166
167     /**
168      * Method to deregister the parameters from Common Parameter Service.
169      *
170      * @param distributionParameterGroup the distribution parameter group
171      */
172     public void deregisterToParameterService(final DistributionParameterGroup distributionParameterGroup) {
173         ParameterService.deregister(distributionParameterGroup.getName());
174         for (final ReceptionHandlerParameters params : distributionParameterGroup.getReceptionHandlerParameters()
175                 .values()) {
176             ParameterService.deregister((params.getName()));
177             ParameterService.deregister((params.getPluginHandlerParameters().getName()));
178         }
179         //@formatter:off
180         for (final Entry<String, ArtifactForwarderConfigurationParameterGroup> forwarderConfiguration
181                 : distributionParameterGroup.getArtifactForwarderConfigurationParameters().entrySet()) {
182             forwarderConfiguration.getValue().setName(forwarderConfiguration.getKey());
183             ParameterService.deregister(forwarderConfiguration.getKey());
184         }
185         for (final Entry<String, ReceptionHandlerConfigurationParameterGroup> receptionHandlerConfiguration
186                 : distributionParameterGroup.getReceptionHandlerConfigurationParameters().entrySet()) {
187             receptionHandlerConfiguration.getValue().setName(receptionHandlerConfiguration.getKey());
188             ParameterService.deregister(receptionHandlerConfiguration.getKey());
189         }
190         //@formatter:on
191     }
192
193     /**
194      * Returns the alive status of distribution service.
195      *
196      * @return the alive
197      */
198     public static boolean isAlive() {
199         return alive;
200     }
201
202     /**
203      * Change the alive status of distribution service.
204      *
205      * @param status the status
206      */
207     public static void setAlive(final boolean status) {
208         alive = status;
209     }
210 }