package com.venky.swf.plugins.background.core; import java.io.Serializable; import com.venky.cache.Cache; import com.venky.core.math.GCDFinder; public interface Task extends Serializable{ public void execute(); public static enum Priority { HIGH(-1), DEFAULT(0), LOW(1); private final int value; Priority(final int newValue) { value = newValue; } public int getValue() { return value; } } public static interface PriorityWeightScheme { //public int getWeight(Priority priority); default public int getWeight(Priority priority){ return 1 - (priority.getValue()); } } public static class NormalizedWeightScheme implements PriorityWeightScheme{ public NormalizedWeightScheme(PriorityWeightScheme scheme){ loadNormalizedWeights(scheme); } Cache<Priority,Integer> cache = new Cache<Task.Priority, Integer>(Priority.values().length,0) { private static final long serialVersionUID = 4722723656835020302L; @Override protected Integer getValue(Priority k) { return k.getValue(); } }; public int getWeight(Priority priority){ return cache.get(priority); } private void loadNormalizedWeights(PriorityWeightScheme pws){ int[] wts = new int[]{pws.getWeight(Priority.HIGH),pws.getWeight(Priority.DEFAULT), pws.getWeight(Priority.LOW)}; int gcd = GCDFinder.getInstance().gcd(wts); cache.put(Priority.HIGH,wts[0]/gcd); cache.put(Priority.DEFAULT,wts[1]/gcd); cache.put(Priority.LOW,wts[2]/gcd); } } }