package de.otto.edison.togglz.configuration;
import de.otto.edison.togglz.DefaultTogglzConfig;
import de.otto.edison.togglz.FeatureClassProvider;
import de.otto.edison.togglz.authentication.Credentials;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.togglz.core.Feature;
import org.togglz.core.context.StaticFeatureManagerProvider;
import org.togglz.core.manager.FeatureManager;
import org.togglz.core.manager.TogglzConfig;
import org.togglz.core.repository.StateRepository;
import org.togglz.core.user.SimpleFeatureUser;
import org.togglz.core.user.UserProvider;
import org.togglz.servlet.TogglzFilter;
import org.togglz.servlet.util.HttpServletRequestHolder;
import org.togglz.spring.manager.FeatureManagerFactory;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@Configuration
@EnableConfigurationProperties(TogglzProperties.class)
public class TogglzConfiguration {
@Bean
@ConditionalOnMissingBean(name = "togglzFilter")
public FilterRegistrationBean togglzFilter() {
final FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
filterRegistration.setFilter(new TogglzFilter());
filterRegistration.addUrlPatterns("/*");
return filterRegistration;
}
@Bean
@ConditionalOnMissingBean(FeatureClassProvider.class)
public FeatureClassProvider featureClassProvider() {
return () -> Features.class;
}
@Bean
@ConditionalOnMissingBean(UserProvider.class)
public UserProvider userProvider() {
return () -> {
HttpServletRequest request = HttpServletRequestHolder.get();
Optional<Credentials> credentials = Credentials.readFrom(request);
boolean isAdmin = true; // "admin".equals(username);
return new SimpleFeatureUser((credentials.isPresent() ? credentials.get().getUsername() : null), isAdmin);
};
}
@Bean
@Autowired
public TogglzConfig togglzConfig(final StateRepository stateRepository,
final FeatureClassProvider featureClassProvider,
final TogglzProperties togglzProperties) {
return new DefaultTogglzConfig(togglzProperties, stateRepository, userProvider(), featureClassProvider);
}
@Bean
public FeatureManager featureManager(final TogglzConfig togglzConfig) throws Exception {
FeatureManagerFactory featureManagerFactory = new FeatureManagerFactory();
featureManagerFactory.setTogglzConfig(togglzConfig);
FeatureManager featureManager = featureManagerFactory.getObject();
StaticFeatureManagerProvider.setFeatureManager(featureManager); // this workaround should be fixed with togglz version 2.2
return featureManager;
}
private enum Features implements Feature {
/* no features */
}
}