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 java.lang.reflect.InvocationTargetException;
12 import java.util.HashMap;
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
18 * FIXME: this is simple registry service, except it also loads classes.
20 public final class EntityOwnerSelectionStrategyConfig {
21 private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerSelectionStrategyConfig.class);
22 private final Map<String, StrategyInfo> entityTypeToStrategyInfo = new HashMap<>();
23 private final Map<String, EntityOwnerSelectionStrategy> entityTypeToOwnerSelectionStrategy = new HashMap<>();
25 private EntityOwnerSelectionStrategyConfig() {
29 public boolean isStrategyConfigured(final String entityType) {
30 return entityTypeToStrategyInfo.get(entityType) != null;
33 public EntityOwnerSelectionStrategy createStrategy(final String entityType) {
34 final EntityOwnerSelectionStrategy strategy;
35 final EntityOwnerSelectionStrategy existingStrategy = entityTypeToOwnerSelectionStrategy.get(entityType);
36 if(existingStrategy != null){
37 strategy = existingStrategy;
39 EntityOwnerSelectionStrategyConfig.StrategyInfo strategyInfo = entityTypeToStrategyInfo.get(entityType);
40 if(strategyInfo == null){
41 strategy = FirstCandidateSelectionStrategy.INSTANCE;
43 strategy = strategyInfo.createStrategy();
45 entityTypeToOwnerSelectionStrategy.put(entityType, strategy);
51 * @deprecated FIXME: THIS IS CONFIGURATION FOR A CUSTOM-LOADED CLASS CONSTRUCTOR
53 * This class should not exist. It contains a single long, which is passed to the constructor (via reflection).
54 * We are getting that information from a BundleContext. We are running in OSGi environment, hence this class
55 * needs to be deployed in its own bundle, with its own configuration.
57 * If this is used internally, it needs to be relocated into a separate package along with the implementation
61 private static final class StrategyInfo {
62 private final Class<? extends EntityOwnerSelectionStrategy> strategyClass;
63 private final long delay;
65 private StrategyInfo(final Class<? extends EntityOwnerSelectionStrategy> strategyClass, final long delay) {
66 this.strategyClass = strategyClass;
70 public EntityOwnerSelectionStrategy createStrategy() {
72 return strategyClass.getDeclaredConstructor(long.class).newInstance(delay);
73 } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
74 LOG.warn("could not create custom strategy", e);
76 return FirstCandidateSelectionStrategy.INSTANCE;
80 public static Builder newBuilder() {
81 return new Builder(new EntityOwnerSelectionStrategyConfig());
84 public static class Builder {
85 private final EntityOwnerSelectionStrategyConfig config;
87 private Builder(final EntityOwnerSelectionStrategyConfig config){
91 public Builder addStrategy(final String entityType, final Class<? extends EntityOwnerSelectionStrategy> strategy, final long delay){
92 config.entityTypeToStrategyInfo.put(entityType, new StrategyInfo(strategy, delay));
96 public EntityOwnerSelectionStrategyConfig build(){