package dials.filter.impl;
import dials.dial.DialHelper;
import dials.dial.Dialable;
import dials.filter.FeatureFilter;
import dials.filter.FilterDataException;
import dials.filter.FilterDataHelper;
import dials.filter.StaticDataFilter;
import dials.messages.ContextualMessage;
import dials.messages.DataFilterApplicationMessage;
import dials.model.FeatureModel;
import dials.model.FilterModel;
import java.util.Random;
public class PercentageFeatureFilter extends FeatureFilter implements StaticDataFilter, Dialable {
public static final String PERCENTAGE = "Percentage";
private static final int MAX_PERCENTAGE = 100;
private static final int MIN_PERCENTAGE = 0;
private Integer percentage;
@Override
public boolean filter() {
Random random = getRandom();
int randomValue = random.nextInt(MAX_PERCENTAGE);
if (randomValue < percentage) {
return true;
}
return false;
}
protected Random getRandom() {
return new Random();
}
@Override
public void applyStaticData(DataFilterApplicationMessage message) {
FilterDataHelper helper = new FilterDataHelper(message.getFilterData());
applyRequiredData(message, helper);
}
private void applyRequiredData(ContextualMessage message, FilterDataHelper helper) {
try {
percentage = helper.getData(PERCENTAGE, Integer.class);
if (percentage > MAX_PERCENTAGE) {
percentage = MAX_PERCENTAGE;
} else if (percentage < MIN_PERCENTAGE) {
percentage = MIN_PERCENTAGE;
}
recordSuccessfulDataApply(message, PERCENTAGE);
} catch (FilterDataException e) {
recordUnsuccessfulDataApply(message, PERCENTAGE, true, e.getMessage());
}
}
@Override
public void dial(ContextualMessage message, String filterName) {
FeatureModel feature = message.getFeature();
FilterModel filter = feature.getFilter(filterName);
DialHelper helper = new DialHelper(filter.getDial());
String dialPattern = helper.getDialPattern(message);
if (dialPattern.equals(DialHelper.ATTEMPTED)) {
message.performDialAdjustment(feature.getFeatureName(), filterName, PERCENTAGE, percentage.toString());
return;
}
Integer dialAmount = consumeDialPattern(dialPattern);
if (dialAmount != null) {
message.getExecutionContext().addExecutionStep("Dial with pattern "
+ dialPattern + " performed on " + getClass().getSimpleName());
adjustPercentage(dialAmount);
message.performDialAdjustment(feature.getFeatureName(), filterName, PERCENTAGE, percentage.toString());
message.getExecutionContext().addExecutionStep("Dial successfully executed. New percentage is " + percentage);
if (percentage == MIN_PERCENTAGE) {
message.disableFeature(feature.getFeatureName());
message.getExecutionContext().addExecutionStep("Percentage has reached 0, disabling feature.");
}
}
}
protected void adjustPercentage(Integer dialAmount) {
if (percentage + dialAmount >= MAX_PERCENTAGE) {
percentage = MAX_PERCENTAGE;
} else if (percentage + dialAmount <= MIN_PERCENTAGE) {
percentage = MIN_PERCENTAGE;
} else {
percentage += dialAmount;
}
}
protected int getPercentage() {
return percentage;
}
/**
* Dial pattern for PercentageFeatureFilter is (Integer).
* <p/>
* Examples:
* 1 (Increase Pattern) - Increase percentage by 1
* 5 (Increase Pattern) - Increase percentage by 5
* -2 (Decrease Pattern) - Decrease percentage by 2
* <p/>
* Unit is implied as a percentage.
*/
@Override
public Integer consumeDialPattern(String pattern) {
try {
return Integer.parseInt(pattern);
} catch (NumberFormatException e) {
return null;
}
}
}