bc39460d513beab6de51c8d27784baaf76e79ec2
[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  * @deprecated FIXME: Service injection class. This class needs to be eliminated in favor of proper service injection,
25  *             which can be any of OSGi (which this class uses internally), java.util.ServiceLoader, or config
26  *             subsystem.
27  */
28 @Deprecated
29 public final class EntityOwnerSelectionStrategyConfigReader {
30     public static final String CONFIG_ID = "org.opendaylight.controller.cluster.entity.owner.selection.strategies";
31
32     private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerSelectionStrategyConfigReader.class);
33     private static final String ENTITY_TYPE_PREFIX = "entity.type.";
34
35     private EntityOwnerSelectionStrategyConfigReader() {
36         // Hidden on purpose
37     }
38
39     public static EntityOwnerSelectionStrategyConfig loadStrategyWithConfig(final BundleContext bundleContext) {
40         final EntityOwnerSelectionStrategyConfig.Builder builder = EntityOwnerSelectionStrategyConfig.newBuilder();
41
42         final ServiceReference<ConfigurationAdmin> configAdminServiceReference =
43                 bundleContext.getServiceReference(ConfigurationAdmin.class);
44         if (configAdminServiceReference == null) {
45             LOG.warn("No ConfigurationAdmin service found");
46             return builder.build();
47         }
48
49         final ConfigurationAdmin configAdmin = bundleContext.getService(configAdminServiceReference);
50         if (configAdmin == null) {
51             LOG.warn("Failed to get ConfigurationAdmin service");
52             return builder.build();
53         }
54
55         final Configuration config;
56         try {
57             config = configAdmin.getConfiguration(CONFIG_ID);
58             if (config != null) {
59                 return parseConfiguration(builder, config);
60             }
61
62             LOG.debug("Could not read strategy configuration file, will use default configuration");
63         } catch (IOException e1) {
64             LOG.warn("Failed to get configuration for {}, starting up empty", CONFIG_ID);
65             return builder.build();
66         } finally {
67             try {
68                 bundleContext.ungetService(configAdminServiceReference);
69             } catch (Exception e) {
70                 LOG.debug("Error from ungetService", e);
71             }
72         }
73
74         return builder.build();
75     }
76
77     private static EntityOwnerSelectionStrategyConfig parseConfiguration(final Builder builder, final Configuration config) {
78         // Historic note: java.util.Dictionary since introduction of java.util.Map in Java 1.2
79         final Dictionary<String, Object> properties = config.getProperties();
80         if (properties == null) {
81             LOG.debug("Empty strategy configuration {}, using defaults", config);
82             return builder.build();
83         }
84
85         // No java.util.Iterable: Wheeey, pre-Java 5 world!!!
86         final Enumeration<String> keys = properties.keys();
87         while (keys.hasMoreElements()) {
88             final String key = keys.nextElement();
89             if (!key.startsWith(ENTITY_TYPE_PREFIX)) {
90                 LOG.debug("Ignoring non-conforming property key : {}");
91                 continue;
92             }
93
94             final String[] strategyClassAndDelay = ((String) properties.get(key)).split(",");
95             final Class<? extends EntityOwnerSelectionStrategy> aClass;
96             try {
97                 aClass = loadClass(strategyClassAndDelay[0]);
98             } catch (ClassNotFoundException e) {
99                 LOG.error("Failed to load class {}, ignoring it", strategyClassAndDelay[0], e);
100                 continue;
101             }
102
103             final long delay;
104             if (strategyClassAndDelay.length > 1) {
105                 delay = Long.parseLong(strategyClassAndDelay[1]);
106             } else {
107                 delay = 0;
108             }
109
110             String entityType = key.substring(key.lastIndexOf(".") + 1);
111             builder.addStrategy(entityType, aClass, delay);
112             LOG.debug("Entity Type '{}' using strategy {} delay {}", entityType, aClass, delay);
113         }
114
115         return builder.build();
116     }
117
118     @Deprecated
119     @SuppressWarnings("unchecked")
120     private static Class<? extends EntityOwnerSelectionStrategy> loadClass(final String strategyClassAndDelay)
121             throws ClassNotFoundException {
122         final Class<?> clazz;
123         try {
124            clazz = EntityOwnerSelectionStrategyConfigReader.class.getClassLoader().loadClass(strategyClassAndDelay);
125         } catch (ClassNotFoundException e) {
126             throw new IllegalArgumentException("Failed to load strategy " + strategyClassAndDelay);
127         }
128
129         Preconditions.checkArgument(EntityOwnerSelectionStrategy.class.isAssignableFrom(clazz),
130             "Selected implementation %s must implement EntityOwnerSelectionStrategy, clazz");
131
132         return (Class<? extends EntityOwnerSelectionStrategy>) clazz;
133     }
134 }