package multimonster.resourcemanager.plugin; import java.util.HashSet; import java.util.Iterator; import multimonster.common.resource.Costs; import multimonster.common.resource.ResourceRequestIdentifier; import multimonster.common.setting.Setting; import multimonster.common.setting.SettingDomain; import multimonster.common.setting.SettingValue; import multimonster.exceptions.MultiMonsterException; import multimonster.resourcemanager.ManagementPlugIn; import multimonster.resourcemanager.ResourceRequest; import multimonster.resourcemanager.exceptions.ManagementException; import multimonster.resourcemanager.exceptions.NoResourcesAvailable; import multimonster.resourcemanager.exceptions.UnknownRequest; import multimonster.systemadministration.SettingProxy; import org.apache.log4j.Logger; /** * @author Holger Velke */ public class NRequestsOnly extends ManagementPlugIn { private static final String ALLOWED_REQUEST_SETTING = "allowed requests"; private static SettingProxy settingProxy = null; private static Logger log = null; static { log = Logger.getLogger(NRequestsOnly.class); try { settingProxy = SettingProxy.getInstance(NRequestsOnly.class); Setting allowedRequests = new Setting( ALLOWED_REQUEST_SETTING, new SettingValue(4), new SettingDomain(0, 1000), "the maximum number of parallel grantet resource requests"); settingProxy.registerSetting(allowedRequests); } catch (MultiMonsterException e) { log.error("unable to use settings", e); } } // the requests allowed to run private RequestVector granted = null; private int n_allowed = 40; public NRequestsOnly () { // initialize form Settings if (settingProxy != null) { SettingValue allowed = settingProxy.getValue(ALLOWED_REQUEST_SETTING); n_allowed = ((Integer)allowed.getValueCont()).intValue(); } else { this.n_allowed = 40; } granted = new RequestVector(n_allowed); } /** * @see multimonster.resourcemanager.ManagementPlugIn#reserve(multimonster.resourcemanager.ResourceRequest) */ public void reserve(ResourceRequest request) throws ManagementException { checkSettings(); if (granted.isFree()) { granted.add(request); } else { throw new NoResourcesAvailable(""); } } /** * @see multimonster.resourcemanager.ManagementPlugIn#free(multimonster.common.resource.ResourceRequestIdentifier) */ public Costs free(ResourceRequestIdentifier rrId) throws ManagementException { Costs realCosts = null; ResourceRequest request = null; request = granted.remove(rrId); if (null != request) { realCosts = request.getEstimatedCosts(); } else { // unknown Request throw new UnknownRequest( "no request for ResourceRequestIdentifier" + rrId); } checkSettings(); return realCosts; } private void checkSettings(){ int new_n_allowed; log.debug("Number of parallel requests = "+n_allowed); if (settingProxy != null) { SettingValue allowed = settingProxy.getValue(ALLOWED_REQUEST_SETTING); new_n_allowed = ((Integer)allowed.getValueCont()).intValue(); if (n_allowed != new_n_allowed) { n_allowed = new_n_allowed; granted.resize(n_allowed); log.debug("NEW - Number of parallel requests = "+n_allowed); } } } private class RequestVector { private HashSet requests; private int size; RequestVector(int size){ this.requests = new HashSet(); this.size = size; } public void add(ResourceRequest request){ requests.add(request); } public boolean isFree(){ log.debug("Free in Vector: "+free()); return 0 < free(); } public ResourceRequest remove(ResourceRequestIdentifier rrId){ Iterator i = requests.iterator(); while(i.hasNext()){ ResourceRequest request = (ResourceRequest) i.next(); if (rrId.equals(request.getRrId())){ requests.remove(request); return request; } } return null; } public void resize(int new_size) { this.size = new_size; } private int free(){ return (size - requests.size()); } } }