1af13cbea6a572510ed41ff02a01dfd3e267d3f5
[policy/apex-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2016-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.apex.context.impl.distribution;
22
23 import org.onap.policy.apex.context.ContextException;
24 import org.onap.policy.apex.context.Distributor;
25 import org.onap.policy.apex.context.parameters.DistributorParameters;
26 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
27 import org.onap.policy.apex.model.basicmodel.service.ParameterService;
28 import org.onap.policy.apex.model.utilities.Assertions;
29 import org.slf4j.ext.XLogger;
30 import org.slf4j.ext.XLoggerFactory;
31
32 /**
33  * This class returns a context distributor for the particular type of distribution mechanism configured for use.
34  *
35  * @author Liam Fallon (liam.fallon@ericsson.com)
36  */
37 public class DistributorFactory {
38     // Get a reference to the logger
39     private static final XLogger LOGGER = XLoggerFactory.getXLogger(DistributorFactory.class);
40
41     /**
42      * Get a context distributor for a given context set key.
43      *
44      * @param key The key for the distributor
45      * @return a context distributor
46      * @throws ContextException on context distributor creation errors
47      */
48     public Distributor getDistributor(final AxArtifactKey key) throws ContextException {
49         LOGGER.entry("Distributor factory, key=" + key);
50
51         Assertions.argumentNotNull(key, ContextException.class, "Parameter \"key\" may not be null");
52
53         // Get the class for the distributor using reflection
54         final DistributorParameters distributorParameters = ParameterService.getParameters(DistributorParameters.class);
55         final String pluginClass = distributorParameters.getPluginClass();
56         Object contextDistributorObject = null;
57         try {
58             contextDistributorObject = Class.forName(pluginClass).newInstance();
59         } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
60             LOGGER.error(
61                     "Apex context distributor class not found for context distributor plugin \"" + pluginClass + "\"",
62                     e);
63             throw new ContextException(
64                     "Apex context distributor class not found for context distributor plugin \"" + pluginClass + "\"",
65                     e);
66         }
67
68         // Check the class is a distributor
69         if (!(contextDistributorObject instanceof Distributor)) {
70             final String returnString = "Specified Apex context distributor plugin class \"" + pluginClass
71                     + "\" does not implement the ContextDistributor interface";
72             LOGGER.error(returnString);
73             throw new ContextException(returnString);
74         }
75
76         // The context Distributor to return
77         final Distributor contextDistributor = (Distributor) contextDistributorObject;
78
79         // Lock and load the context distributor
80         contextDistributor.init(key);
81
82         LOGGER.exit(
83                 "Distributor factory, key=" + key + ", selected distributor of class " + contextDistributor.getClass());
84         return contextDistributor;
85     }
86 }