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 * Reads the entity owner selection strategy config.
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
31 public final class EntityOwnerSelectionStrategyConfigReader {
32 public static final String CONFIG_ID = "org.opendaylight.controller.cluster.entity.owner.selection.strategies";
34 private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerSelectionStrategyConfigReader.class);
35 private static final String ENTITY_TYPE_PREFIX = "entity.type.";
37 private EntityOwnerSelectionStrategyConfigReader() {
41 @SuppressWarnings("checkstyle:IllegalCatch")
42 public static EntityOwnerSelectionStrategyConfig loadStrategyWithConfig(final BundleContext bundleContext) {
43 final EntityOwnerSelectionStrategyConfig.Builder builder = EntityOwnerSelectionStrategyConfig.newBuilder();
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();
52 final ConfigurationAdmin configAdmin = bundleContext.getService(configAdminServiceReference);
53 if (configAdmin == null) {
54 LOG.warn("Failed to get ConfigurationAdmin service");
55 return builder.build();
58 final Configuration config;
60 config = configAdmin.getConfiguration(CONFIG_ID);
62 return parseConfiguration(builder, config);
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);
68 return builder.build();
71 bundleContext.ungetService(configAdminServiceReference);
72 } catch (Exception e) {
73 LOG.debug("Error from ungetService", e);
77 return builder.build();
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();
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 : {}");
98 final String[] strategyClassAndDelay = ((String) properties.get(key)).split(",");
99 final Class<? extends EntityOwnerSelectionStrategy> aClass;
101 aClass = loadClass(strategyClassAndDelay[0]);
102 } catch (ClassNotFoundException e) {
103 LOG.error("Failed to load class {}, ignoring it", strategyClassAndDelay[0], e);
108 if (strategyClassAndDelay.length > 1) {
109 delay = Long.parseLong(strategyClassAndDelay[1]);
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);
119 return builder.build();
123 @SuppressWarnings("unchecked")
124 private static Class<? extends EntityOwnerSelectionStrategy> loadClass(final String strategyClassAndDelay)
125 throws ClassNotFoundException {
126 final Class<?> clazz;
128 clazz = EntityOwnerSelectionStrategyConfigReader.class.getClassLoader().loadClass(strategyClassAndDelay);
129 } catch (ClassNotFoundException e) {
130 throw new IllegalArgumentException("Failed to load strategy " + strategyClassAndDelay);
133 Preconditions.checkArgument(EntityOwnerSelectionStrategy.class.isAssignableFrom(clazz),
134 "Selected implementation %s must implement EntityOwnerSelectionStrategy, clazz");
136 return (Class<? extends EntityOwnerSelectionStrategy>) clazz;