package org.ow2.choreos.ee.nodes.selector; import java.util.HashMap; import java.util.List; import java.util.Map; import org.ow2.choreos.ee.nodes.NPMFactory; import org.ow2.choreos.nodes.NodePoolManager; import org.ow2.choreos.nodes.datamodel.CloudNode; import org.ow2.choreos.selectors.NotSelectedException; import org.ow2.choreos.selectors.RoundRobinSelector; import org.ow2.choreos.services.datamodel.DeployableServiceSpec; public class RoundRobinNodeSelector implements NodeSelector { private Map<String, RoundRobinSelector<CloudNode, DeployableServiceSpec>> selectors = new HashMap<String, RoundRobinSelector<CloudNode, DeployableServiceSpec>>(); public RoundRobinNodeSelector() { } public RoundRobinSelector<CloudNode, DeployableServiceSpec> retrieveSelector(DeployableServiceSpec spec) { String cloudAccount = spec.getOwner(); synchronized (this) { if (!this.selectors.containsKey(cloudAccount)) { NodePoolManager npm = NPMFactory.getNewNPMInstance(cloudAccount); NodeRetriever retriever = new NodeRetriever(npm); NodeFilter filter = new NodeFilter(); this.selectors.put(cloudAccount, new RoundRobinSelector<CloudNode, DeployableServiceSpec>(retriever, filter)); } } return this.selectors.get(cloudAccount); } @Override public List<CloudNode> select(DeployableServiceSpec spec, int objectsQuantity) throws NotSelectedException { RoundRobinSelector<CloudNode, DeployableServiceSpec> selector = retrieveSelector(spec); return selector.select(spec, objectsQuantity); } }