/*******************************************************************************
* Open Behavioral Health Information Technology Architecture (OBHITA.org)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
******************************************************************************/
package gov.samhsa.consent2share.common;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.springframework.util.StringUtils;
/**
* The Class UniqueValueGenerator.
*/
public class UniqueValueGenerator {
/**
* Generate unique value.
*
* @param <S>
* the generic type
* @param uniqueValueSupplier
* the unique value supplier (the supplier function that
* generates a random unique value)
* @param valueTest
* the value test function (tests if this value is unique or not;
* true if unique.)
* @param limit
* the limit (the maximum number of trials before forced
* termination)
* @return the s unique value or null if cannot be generated with given
* limited iterations
*/
public static <S> S generateUniqueValue(Supplier<S> uniqueValueSupplier,
Predicate<S> valueTest, short limit) {
S uniqueValue = null;
short iterationCounter = 0;
do {
final S tempValue = uniqueValueSupplier.get();
uniqueValue = valueTest.test(tempValue) ? tempValue : null;
iterationCounter++;
} while (uniqueValue == null && iterationCounter < limit);
if (uniqueValue == null
|| (uniqueValue instanceof String && !StringUtils
.hasText((String) uniqueValue))) {
StringBuilder errorBuilder = new StringBuilder();
errorBuilder.append("Unique value cannot be generated in ");
errorBuilder.append(iterationCounter);
errorBuilder.append(" trials.");
throw new UniqueValueGeneratorException(errorBuilder.toString());
}
return uniqueValue;
}
}