/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.ow2.choreos.selectors;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
/**
* This selector will always use existing objects, it will never create a new
* object. The existing objects are selected in a round robin order.
*
* @author leonardo
*
* @param <T>
* @param <R>
*/
public class RoundRobinSelector<T, R> implements Selector<T, R> {
private ObjectRetriever<T> objectRetriever;
private ObjectFilter<T, R> objectFilter;
private AtomicInteger counter = new AtomicInteger();
public RoundRobinSelector(ObjectRetriever<T> objectRetriever) {
ObjectFilters<T, R> filters = new ObjectFilters<T, R>();
this.objectFilter = filters.getNoFilter();
this.objectRetriever = objectRetriever;
}
public RoundRobinSelector(ObjectRetriever<T> objectRetriever, ObjectFilter<T, R> objectFilter) {
this.objectRetriever = objectRetriever;
this.objectFilter = objectFilter;
}
@Override
public List<T> select(R requirements, int objectsQuantity) throws NotSelectedException {
List<T> objects = this.objectRetriever.retrieveObjects();
List<T> compatibleObjects = this.objectFilter.filter(objects, requirements);
if (compatibleObjects.size() < objectsQuantity) {
throw new NotSelectedException();
}
List<T> selectedObjects = new ArrayList<T>();
for (int i = 0; i < objectsQuantity; i++) {
int idx = counter.getAndIncrement();
idx = idx % compatibleObjects.size();
T selected = compatibleObjects.get(idx);
selectedObjects.add(selected);
}
return selectedObjects;
}
}