package org.ff4j.strategy;
import java.io.Serializable;
/*
* #%L
* ff4j-core
* %%
* Copyright (C) 2013 Ff4J
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.util.Map;
import org.ff4j.core.FeatureStore;
import org.ff4j.core.FlippingExecutionContext;
/**
* This strategy will flip feature as soon as the release date is reached.
*
* @author Cedrick Lunven (@clunven)
*/
public class PonderationStrategy extends AbstractFlipStrategy implements Serializable {
/** Serial number. */
private static final long serialVersionUID = -2353911851539414159L;
/** Return equiprobability as 50%. */
private static final double HALF = 0.5;
/** Threshold. */
private static final String PARAM_WEIGHT = "weight";
/** Change threshold. */
private double weight = HALF;
/**
* Default Constructor.
*/
public PonderationStrategy() {}
/**
* Parameterized constructor.
*
* @param threshold
* threshold
*/
public PonderationStrategy(double threshold) {
this.weight = threshold;
checkWeight();
getInitParams().put(PARAM_WEIGHT, String.valueOf(threshold));
}
/** {@inheritDoc} */
@Override
public void init(String featureName, Map<String, String> initParams) {
super.init(featureName, initParams);
if (initParams != null && initParams.containsKey(PARAM_WEIGHT)) {
this.weight = Double.parseDouble(initParams.get(PARAM_WEIGHT));
}
checkWeight();
}
/** {@inheritDoc} */
@Override
public boolean evaluate(String featureName, FeatureStore currentStore, FlippingExecutionContext executionContext) {
return Math.random() <= weight;
}
/**
* Check that the threshold is a value proportion (0 < P < 1).
*/
private void checkWeight() {
if (weight < 0 || weight > 1) {
throw new IllegalArgumentException("The ponderation value is a percentage and should be set between 0 and 1");
}
}
/**
* Setter accessor for attribute 'weight'.
*
* @param weight
* new value for 'weight '
*/
public void setWeight(double weight) {
this.weight = weight;
}
/** {@inheritDoc} */
@Override
public Map<String, String> getInitParams() {
this.initParams.put(PARAM_WEIGHT, String.valueOf(weight));
return initParams;
}
}