126324fff04fe759e17af13e6c158da335e53d2a
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / entityownership / selectionstrategy / EntityOwnerSelectionStrategyConfigReader.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy;
10
11 import com.google.common.base.Preconditions;
12 import java.io.IOException;
13 import java.util.Dictionary;
14 import java.util.Enumeration;
15 import org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy.EntityOwnerSelectionStrategyConfig.Builder;
16 import org.osgi.framework.BundleContext;
17 import org.osgi.framework.ServiceReference;
18 import org.osgi.service.cm.Configuration;
19 import org.osgi.service.cm.ConfigurationAdmin;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 /**
24  * Reads the entity owner selection strategy config.
25  *
26  * @deprecated FIXME: Service injection class. This class needs to be eliminated in favor of proper service injection,
27  *             which can be any of OSGi (which this class uses internally), java.util.ServiceLoader, or config
28  *             subsystem.
29  */
30 @Deprecated
31 public final class EntityOwnerSelectionStrategyConfigReader {
32     public static final String CONFIG_ID = "org.opendaylight.controller.cluster.entity.owner.selection.strategies";
33
34     private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerSelectionStrategyConfigReader.class);
35     private static final String ENTITY_TYPE_PREFIX = "entity.type.";
36
37     private EntityOwnerSelectionStrategyConfigReader() {
38         // Hidden on purpose
39     }
40
41     @SuppressWarnings("checkstyle:IllegalCatch")
42     public static EntityOwnerSelectionStrategyConfig loadStrategyWithConfig(final BundleContext bundleContext) {
43         final EntityOwnerSelectionStrategyConfig.Builder builder = EntityOwnerSelectionStrategyConfig.newBuilder();
44
45         final ServiceReference<ConfigurationAdmin> configAdminServiceReference =
46                 bundleContext.getServiceReference(ConfigurationAdmin.class);
47         if (configAdminServiceReference == null) {
48             LOG.warn("No ConfigurationAdmin service found");
49             return builder.build();
50         }
51
52         final ConfigurationAdmin configAdmin = bundleContext.getService(configAdminServiceReference);
53         if (configAdmin == null) {
54             LOG.warn("Failed to get ConfigurationAdmin service");
55             return builder.build();
56         }
57
58         final Configuration config;
59         try {
60             config = configAdmin.getConfiguration(CONFIG_ID);
61             if (config != null) {
62                 return parseConfiguration(builder, config);
63             }
64
65             LOG.debug("Could not read strategy configuration file, will use default configuration");
66         } catch (IOException e1) {
67             LOG.warn("Failed to get configuration for {}, starting up empty", CONFIG_ID, e1);
68             return builder.build();
69         } finally {
70             try {
71                 bundleContext.ungetService(configAdminServiceReference);
72             } catch (Exception e) {
73                 LOG.debug("Error from ungetService", e);
74             }
75         }
76
77         return builder.build();
78     }
79
80     private static EntityOwnerSelectionStrategyConfig parseConfiguration(final Builder builder,
81             final Configuration config) {
82         // Historic note: java.util.Dictionary since introduction of java.util.Map in Java 1.2
83         final Dictionary<String, Object> properties = config.getProperties();
84         if (properties == null) {
85             LOG.debug("Empty strategy configuration {}, using defaults", config);
86             return builder.build();
87         }
88
89         // No java.util.Iterable: Wheeey, pre-Java 5 world!!!
90         final Enumeration<String> keys = properties.keys();
91         while (keys.hasMoreElements()) {
92             final String key = keys.nextElement();
93             if (!key.startsWith(ENTITY_TYPE_PREFIX)) {
94                 LOG.debug("Ignoring non-conforming property key : {}");
95                 continue;
96             }
97
98             final String[] strategyClassAndDelay = ((String) properties.get(key)).split(",");
99             final Class<? extends EntityOwnerSelectionStrategy> aClass;
100             try {
101                 aClass = loadClass(strategyClassAndDelay[0]);
102             } catch (ClassNotFoundException e) {
103                 LOG.error("Failed to load class {}, ignoring it", strategyClassAndDelay[0], e);
104                 continue;
105             }
106
107             final long delay;
108             if (strategyClassAndDelay.length > 1) {
109                 delay = Long.parseLong(strategyClassAndDelay[1]);
110             } else {
111                 delay = 0;
112             }
113
114             String entityType = key.substring(key.lastIndexOf(".") + 1);
115             builder.addStrategy(entityType, aClass, delay);
116             LOG.debug("Entity Type '{}' using strategy {} delay {}", entityType, aClass, delay);
117         }
118
119         return builder.build();
120     }
121
122     @Deprecated
123     @SuppressWarnings("unchecked")
124     private static Class<? extends EntityOwnerSelectionStrategy> loadClass(final String strategyClassAndDelay)
125             throws ClassNotFoundException {
126         final Class<?> clazz;
127         try {
128             clazz = EntityOwnerSelectionStrategyConfigReader.class.getClassLoader().loadClass(strategyClassAndDelay);
129         } catch (ClassNotFoundException e) {
130             throw new IllegalArgumentException("Failed to load strategy " + strategyClassAndDelay, e);
131         }
132
133         Preconditions.checkArgument(EntityOwnerSelectionStrategy.class.isAssignableFrom(clazz),
134             "Selected implementation %s must implement EntityOwnerSelectionStrategy, clazz");
135
136         return (Class<? extends EntityOwnerSelectionStrategy>) clazz;
137     }
138 }