package org.gbif.occurrence.download.service.conf;
import java.util.Iterator;
import javax.inject.Inject;
import com.google.common.base.Splitter;
import com.google.inject.name.Named;
public class DownloadLimits {
/**
* Amount of downloads that an user can execute simultaneously under certain amount of global downloads.
*/
public static class Limit {
private final int maxUserDownloads;
private final int globalExecutingDownloads;
public Limit(int maxUserDownloads, int globalExecutingDownloads) {
this.globalExecutingDownloads = globalExecutingDownloads;
this.maxUserDownloads = maxUserDownloads;
}
public int getMaxUserDownloads() {
return maxUserDownloads;
}
public int getGlobalExecutingDownloads() {
return globalExecutingDownloads;
}
public boolean violatesLimit(int userDownloads, int globalDownloads) {
return globalDownloads >= globalExecutingDownloads && userDownloads >= maxUserDownloads;
}
}
private static final Splitter COMMA_SPLITTER = Splitter.on(',');
private final int maxUserDownloads;
private final Limit softLimit;
private final Limit hardLimit;
public DownloadLimits(int maxUserDownloads, Limit softLimit, Limit hardLimit) {
this.maxUserDownloads = maxUserDownloads;
this.softLimit = softLimit;
this.hardLimit = hardLimit;
}
@Inject
public DownloadLimits(@Named("max_user_downloads") int maxUserDownloads,
@Named("downloads_soft_limit") String softLimit,
@Named("downloads_hard_limit") String hardLimit) {
Iterator<String> softLimits = COMMA_SPLITTER.split(softLimit).iterator();
Iterator<String> hardLimits = COMMA_SPLITTER.split(hardLimit).iterator();
this.maxUserDownloads = maxUserDownloads;
this.softLimit = new Limit(Integer.parseInt(softLimits.next()), Integer.parseInt(softLimits.next()));
this.hardLimit = new Limit(Integer.parseInt(hardLimits.next()), Integer.parseInt(hardLimits.next()));
}
public int getMaxUserDownloads() {
return maxUserDownloads;
}
public Limit getSoftLimit() {
return softLimit;
}
public Limit getHardLimit() {
return hardLimit;
}
public boolean violatesLimits(int userDownloads, int globalDownloads) {
return getSoftLimit().violatesLimit(userDownloads, globalDownloads)
&& getHardLimit().violatesLimit(userDownloads, globalDownloads);
}
}