package org.togglz.core.manager; import java.util.UUID; import org.togglz.core.Feature; import org.togglz.core.activation.ActivationStrategyProvider; import org.togglz.core.activation.DefaultActivationStrategyProvider; import org.togglz.core.repository.StateRepository; import org.togglz.core.repository.mem.InMemoryStateRepository; import org.togglz.core.spi.ActivationStrategy; import org.togglz.core.spi.FeatureProvider; import org.togglz.core.user.NoOpUserProvider; import org.togglz.core.user.UserProvider; import org.togglz.core.util.Validate; /** * Builder of {@link DefaultFeatureManager}. * * @author Christian Kaltepoth */ public class FeatureManagerBuilder { private String name = UUID.randomUUID().toString(); private FeatureProvider featureProvider = null; private StateRepository stateRepository = new InMemoryStateRepository(); private UserProvider userProvider = new NoOpUserProvider(); private ActivationStrategyProvider strategyProvider = new DefaultActivationStrategyProvider(); /** * Create a new builder */ public static FeatureManagerBuilder begin() { return new FeatureManagerBuilder(); } /** * Use the supplied state repository for the feature manager. */ public FeatureManagerBuilder stateRepository(StateRepository stateRepository) { this.stateRepository = stateRepository; return this; } /** * Use {@link #featureEnum(Class)} instead. */ @Deprecated public FeatureManagerBuilder featureClass(Class<? extends Feature> featureClass) { return this.featureEnum(featureClass); } /** * Use the supplied feature enum class for the feature manager. Same as calling {@link #featureProvider(FeatureProvider)} * with {@link EnumBasedFeatureProvider}. Please note calling this method also set the name of the feature manager to the * simple name of the feature enum's type. */ public FeatureManagerBuilder featureEnum(Class<? extends Feature> featureEnum) { return featureEnums(featureEnum); } /** * Use the supplied feature enum classes for the feature manager. Same as calling {@link #featureProvider(FeatureProvider)} * with {@link EnumBasedFeatureProvider}. Please note calling this method also set the name of the feature manager to the * simple name of the first feature enum's type. */ public FeatureManagerBuilder featureEnums(Class<? extends Feature>... featureEnum) { this.featureProvider = new EnumBasedFeatureProvider(featureEnum); this.name = "FeatureManager[" + featureEnum[0].getSimpleName() + "]"; return this; } /** * Sets the name of the feature manager. This name will then be available thought {@link FeatureManager#getName()}. */ public FeatureManagerBuilder name(String name) { this.name = name; return this; } /** * Sets a {@link FeatureProvider} for the feature manager. Only useful if you don't use enums to declare your features. */ public FeatureManagerBuilder featureProvider(FeatureProvider featureProvider) { this.featureProvider = featureProvider; return this; } /** * Use the supplied {@link UserProvider} for the feature manager. */ public FeatureManagerBuilder userProvider(UserProvider userProvider) { this.userProvider = userProvider; return this; } /** * Use the supplied {@link ActivationStrategyProvider} for the activation strategies; */ public FeatureManagerBuilder activationStrategyProvider(ActivationStrategyProvider strategyProvider) { this.strategyProvider = strategyProvider; return this; } /** * Adds an additional {@link ActivationStrategy} to the current {@link ActivationStrategyProvider}. This currently only * works if you are using the {@link DefaultActivationStrategyProvider}. */ public FeatureManagerBuilder activationStrategy(ActivationStrategy strategy) { if (strategyProvider instanceof DefaultActivationStrategyProvider) { ((DefaultActivationStrategyProvider) strategyProvider).addActivationStrategy(strategy); return this; } throw new IllegalStateException("Adding ActivationStrategies is only allowed when using " + DefaultActivationStrategyProvider.class.getSimpleName()); } /** * Initialize the builder with the configuration from the supplied {@link TogglzConfig} instance. */ public FeatureManagerBuilder togglzConfig(TogglzConfig config) { stateRepository(config.getStateRepository()); featureEnum(config.getFeatureClass()); userProvider(config.getUserProvider()); return this; } /** * Create the {@link FeatureManager} using the current configuration of the builder */ public FeatureManager build() { Validate.notBlank(name, "No name specified"); Validate.notNull(featureProvider, "No feature provider specified"); Validate.notNull(stateRepository, "No state repository specified"); Validate.notNull(userProvider, "No user provider specified"); Validate.notNull(strategyProvider, "No activation strategy provider specified"); return new DefaultFeatureManager(name, featureProvider, stateRepository, userProvider, strategyProvider); } }