package org.limewire.ui.swing.statusbar;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Class that keeps track of several ad messages and displays a single
* one based on their probability.
*/
class Banner {
private final List<Ad> ads;
/**
* @param source the encoded representation of the messages:
* <message1, url1, probability1, message2, url2, probability2...>
* the probabilites must add up to 1.0.
*/
public Banner(String... source) {
if (source.length % 3 != 0)
throw new IllegalArgumentException();
ads = new ArrayList<Ad>(source.length / 3);
for (int i = 0; i < source.length; i+=3) {
ads.add(new Ad(source[i], source[i+1], Float.valueOf(source[i+2])));
}
Collections.sort(ads);
float total = 0;
for (Ad ad : ads)
total += ad.getProbability();
if (total < 0.9999 || total > 1.0)
throw new IllegalArgumentException("wrong probabilities: "+total);
}
/**
* @return the next message that should be displayed.
*/
public Ad getAd() {
float dice = (float)Math.random();
float current = 0;
for (Ad ad : ads) {
current += ad.getProbability();
if (current >= dice)
return ad;
}
return ads.get(ads.size() - 1);
}
public Collection<Ad> getAllAds() {
return Collections.unmodifiableCollection(ads);
}
}