/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.config; import java.util.Comparator; import java.util.Iterator; /** * Selects a preferred object from a collection of instances of the same type based on the weight of the {@link Preferred} * annotation. If there is no preferred instances, then it just returns the first object in the collection. */ public class PreferredObjectSelector<T> { private final Comparator<T> comparator; public PreferredObjectSelector() { comparator = new Comparator<T>() { private PreferredComparator preferredComparator = new PreferredComparator(); public int compare(T candidate1, T candidate2) { final Preferred preferred = candidate1.getClass().getAnnotation(Preferred.class); final Preferred preferred1 = candidate2.getClass().getAnnotation(Preferred.class); return preferredComparator.compare(preferred, preferred1); } }; } /** * Selects a preferred object from instances returned by an {@link Iterator}. * <p/> * The preferred instance will be the instance annotated with {@link Preferred} annotation with the highest weight attribute if * there is any, or a non annotated class otherwise. * * @param iterator contains the objects to select from * @return the preferred instance */ public T select(Iterator<T> iterator) { T preferred = null; if (iterator.hasNext()) { preferred = iterator.next(); while (iterator.hasNext()) { T current = iterator.next(); if (comparator.compare(preferred, current) == -1) { preferred = current; } } } return preferred; } }