package de.otto.edison.togglz.controller;
import de.otto.edison.togglz.FeatureClassProvider;
import net.jcip.annotations.Immutable;
import org.togglz.core.Feature;
import org.togglz.core.annotation.Label;
import java.util.Map;
import static java.util.Arrays.stream;
import static java.util.stream.Collectors.toMap;
import static org.togglz.core.context.FeatureContext.getFeatureManager;
@Immutable
public class FeatureTogglesRepresentation {
public final Map<String, FeatureToggleRepresentation> features;
private FeatureTogglesRepresentation(final Class<? extends Feature> featureClass) {
this.features = buildTogglzState(featureClass);
}
public static FeatureTogglesRepresentation togglzRepresentation(final FeatureClassProvider featureClassProvider) {
return new FeatureTogglesRepresentation(featureClassProvider.getFeatureClass());
}
private Map<String, FeatureToggleRepresentation> buildTogglzState(final Class<? extends Feature> featureClass) {
final Feature[] features = featureClass.getEnumConstants();
return stream(features)
.collect(
toMap(Feature::name, this::toFeatureToggleRepresentation)
);
}
private FeatureToggleRepresentation toFeatureToggleRepresentation(final Feature feature) {
final Label label = getLabelAnnotation(feature);
return new FeatureToggleRepresentation(
label != null ? label.value() : feature.name(),
getFeatureManager().getFeatureState(feature).isEnabled(),
null);
}
public static Label getLabelAnnotation(Feature feature) {
try {
Class<? extends Feature> featureClass = feature.getClass();
Label fieldAnnotation = featureClass.getField(feature.name()).getAnnotation(Label.class);
Label classAnnotation = featureClass.getAnnotation(Label.class);
return fieldAnnotation != null ? fieldAnnotation : classAnnotation;
} catch (SecurityException e) {
// ignore
} catch (NoSuchFieldException e) {
// ignore
}
return null;
}
}