package org.distributeme.core.interceptor.availabilitytesting; import org.configureme.ConfigurationManager; import org.configureme.annotations.AfterConfiguration; import org.configureme.annotations.ConfigureMe; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; /** * Utility to handle availabilitytesting configuration. * * @author lrosenberg * @version $Id: $Id */ public class ConfigurationInterceptorUtil { /** * Logger. */ private static Logger log = LoggerFactory.getLogger(ConfigurationInterceptorUtil.class); /** * Random for chance calculation. */ private static Random rnd = new Random(System.nanoTime()); /** * Config object. */ private static ConfigurationObject config; static{ try{ config = new ConfigurationObject(); ConfigurationManager.INSTANCE.configure(config); }catch(IllegalArgumentException noConfigFound){ log.warn("couldn't find configuration for "+ConfigurationInterceptorUtil.class.getSimpleName(), noConfigFound); } } /** * <p>getSlowDownTime.</p> * * @return a long. */ public static final long getSlowDownTime(){ return config.getSlowDownTimeInMillis(); } /** * Returns true if this call should be fliped. Fliping mean that an exceptional situation can occure but doesn't occure all the time. * * @return a boolean. */ public static final boolean flip(){ if (config.getFlipChanceInPercent()==0) return false; if (config.getFlipChanceInPercent()==100) return true; return rnd.nextInt(100)<config.getFlipChanceInPercent(); } /** * <p>isServiceIdConfiguredByProperty.</p> * * @param serviceId a {@link java.lang.String} object. * @return a boolean. */ public static boolean isServiceIdConfiguredByProperty(String serviceId){ List<String> serviceIds = config.getServiceIdsList(); return serviceIds.contains(serviceId) || serviceIds.contains("*"); } /** * Helper class that holds the config and is re/configured by distributeme. * @author lrosenberg * */ @ConfigureMe(name="availabilitytesting", allfields=true) public static class ConfigurationObject{ /** * Configured service ids array. This is an array, because json supports arrays natively. */ private String[] serviceIds = new String[0]; /** * Slow down time. */ private long slowDownTimeInMillis = Constants.DEFAULT_SLOW_DOWN_TIME; /** * Internal serviceIdsList. */ private List<String> serviceIdsList; /** * Flip chance in percent, values 0-100 are acceptable. */ private int flipChanceInPercent; public String[] getServiceIds() { return serviceIds; } public void setServiceIds(String[] serviceIds) { this.serviceIds = serviceIds; } public long getSlowDownTimeInMillis() { return slowDownTimeInMillis; } public void setSlowDownTimeInMillis(long slowDownTimeInMillis) { this.slowDownTimeInMillis = slowDownTimeInMillis; } @Override public String toString(){ return "service ids: "+getServiceIdsList()+", slowDownTime: "+slowDownTimeInMillis+", flipChance: "+flipChanceInPercent+"/100"; } @AfterConfiguration public void setHelper(){ if (serviceIds!=null) serviceIdsList=Collections.unmodifiableList(Arrays.asList(serviceIds)); else serviceIdsList = (List<String>)Collections.EMPTY_LIST; } @AfterConfiguration public void debugOut(){ System.out.println("availability testing interceptors reconfigured: "+this); log.debug("availability testing interceptors reconfigured: "+this); } public List<String> getServiceIdsList() { return serviceIdsList; } public int getFlipChanceInPercent() { return flipChanceInPercent; } public void setFlipChanceInPercent(int flipChanceInPercent) { if (flipChanceInPercent<0 || flipChanceInPercent>100) throw new IllegalArgumentException("flip chance must be between 0 and 100"); this.flipChanceInPercent = flipChanceInPercent; } } /** * <p>debugOutConfig.</p> */ public static void debugOutConfig() { System.out.println(config); } }