package de.skuzzle.polly.tools.io; import java.io.IOException; import java.util.HashMap; import java.util.Map; public class WeightedIntervalAllocationStrategy implements AllocationStrategy { private final AllocationStrategy intervalStragy; private final Map<Object, Integer> priorityMap; private int prioritySum = 0; public WeightedIntervalAllocationStrategy(int maxBytesPerInterval, int interval) { this.intervalStragy = new IntervalAllocationStrategy(maxBytesPerInterval, interval); this.priorityMap = new HashMap<>(); } public void setPriority(Object consumer, int priority) { if (priority < 0) { throw new IllegalArgumentException("priority < 0: " + priority); } else if (!this.priorityMap.containsKey(consumer)) { throw new IllegalArgumentException("Unknown consumer: " + consumer); } final int lastPriority = this.priorityMap.put(consumer, priority); this.prioritySum = this.prioritySum - lastPriority + priority; } @Override public void registerConsumer(Object obj) { this.intervalStragy.registerConsumer(obj); final int priority = 1; if (this.priorityMap.put(obj, priority) == null) { this.prioritySum += priority; } } @Override public void consumerFinished(Object obj) { this.intervalStragy.consumerFinished(obj); final int priority = this.priorityMap.get(obj); this.prioritySum -= priority; this.priorityMap.remove(obj); } @Override public double getSpeed() { return this.intervalStragy.getSpeed(); } @Override public int allocate(Object source, int bytes) { final int priority = this.priorityMap.get(source); final double p = priority / this.prioritySum; bytes = (int) (bytes * p); return this.intervalStragy.allocate(source, bytes); } @Override public void close() throws IOException { this.intervalStragy.close(); } }