2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.controller.cluster.datastore.entityownership.selectionstrategy;
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;
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
29 public final class EntityOwnerSelectionStrategyConfigReader {
30 public static final String CONFIG_ID = "org.opendaylight.controller.cluster.entity.owner.selection.strategies";
32 private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerSelectionStrategyConfigReader.class);
33 private static final String ENTITY_TYPE_PREFIX = "entity.type.";
35 private EntityOwnerSelectionStrategyConfigReader() {
39 public static EntityOwnerSelectionStrategyConfig loadStrategyWithConfig(final BundleContext bundleContext) {
40 final EntityOwnerSelectionStrategyConfig.Builder builder = EntityOwnerSelectionStrategyConfig.newBuilder();
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();
49 final ConfigurationAdmin configAdmin = bundleContext.getService(configAdminServiceReference);
50 if (configAdmin == null) {
51 LOG.warn("Failed to get ConfigurationAdmin service");
52 return builder.build();
55 final Configuration config;
57 config = configAdmin.getConfiguration(CONFIG_ID);
59 return parseConfiguration(builder, config);
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();
68 bundleContext.ungetService(configAdminServiceReference);
69 } catch (Exception e) {
70 LOG.debug("Error from ungetService", e);
74 return builder.build();
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();
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 : {}");
94 final String[] strategyClassAndDelay = ((String) properties.get(key)).split(",");
95 final Class<? extends EntityOwnerSelectionStrategy> aClass;
97 aClass = loadClass(strategyClassAndDelay[0]);
98 } catch (ClassNotFoundException e) {
99 LOG.error("Failed to load class {}, ignoring it", strategyClassAndDelay[0], e);
104 if (strategyClassAndDelay.length > 1) {
105 delay = Long.parseLong(strategyClassAndDelay[1]);
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);
115 return builder.build();
119 @SuppressWarnings("unchecked")
120 private static Class<? extends EntityOwnerSelectionStrategy> loadClass(final String strategyClassAndDelay)
121 throws ClassNotFoundException {
122 final Class<?> clazz;
124 clazz = EntityOwnerSelectionStrategyConfigReader.class.getClassLoader().loadClass(strategyClassAndDelay);
125 } catch (ClassNotFoundException e) {
126 throw new IllegalArgumentException("Failed to load strategy " + strategyClassAndDelay);
129 Preconditions.checkArgument(EntityOwnerSelectionStrategy.class.isAssignableFrom(clazz),
130 "Selected implementation %s must implement EntityOwnerSelectionStrategy, clazz");
132 return (Class<? extends EntityOwnerSelectionStrategy>) clazz;