package org.togglz.core.manager;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import org.togglz.core.Feature;
import org.togglz.core.metadata.FeatureMetaData;
import org.togglz.core.metadata.property.PropertyFeatureMetaData;
import org.togglz.core.spi.FeatureProvider;
import org.togglz.core.util.NamedFeature;
/**
* <p>
* Implementation of {@link FeatureProvider} that reads all the feature specification from a {@link Properties} instance. This
* provider is especially useful in distributed environments.
* </p>
*
* <p>
* The feature specification has the following format:
* </p>
*
* <pre>
* <feature>=<label>;<enabledByDefault>[;<group1>,<group2>,...]
* </pre>
*
* <p>
* The following example shows how a concrete specification could look like
* </p>
*
* <pre>
* FEATURE_ONE=A useful feature;true;Group 1,Group 3
* FEATURE_TWO=Some other feature;false;Group 2
* </pre>
*
* @author Mauro Talevi
* @author Christian Kaltepoth
*
*/
public class PropertyFeatureProvider implements FeatureProvider {
private final Set<Feature> features = new LinkedHashSet<Feature>();
private final Map<String, FeatureMetaData> metadata = new HashMap<String, FeatureMetaData>();
public PropertyFeatureProvider(Properties properties) {
for (Entry<Object, Object> entry : properties.entrySet()) {
String name = entry.getKey().toString();
String spec = entry.getValue().toString();
NamedFeature feature = new NamedFeature(name);
features.add(feature);
metadata.put(name, new PropertyFeatureMetaData(feature, spec));
}
}
@Override
public Set<Feature> getFeatures() {
return Collections.unmodifiableSet(features);
}
@Override
public FeatureMetaData getMetaData(Feature feature) {
return metadata.get(feature.name());
}
}