/******************************************************************************* * Copyright (c) 2015 Bruno Medeiros and other Contributors. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Bruno Medeiros - initial API and implementation *******************************************************************************/ package melnorme.utilbox.fields.validation; import melnorme.utilbox.core.fntypes.RunnableX; import melnorme.utilbox.status.IStatusMessage; import melnorme.utilbox.status.StatusException; public interface ValidationSource { /** * Provide a validation status. * @return the validation {@link IStatusMessage}, or null if none. */ public IStatusMessage getValidationStatus(); default void validate() throws StatusException { throwValidation(getValidationStatus()); } public static void throwValidation(IStatusMessage validationStatus) throws StatusException { if(validationStatus != null) { throw validationStatus.toStatusException(); } } /* ----------------- ----------------- */ public static ValidationSource fromRunnable(RunnableX<StatusException> validationRunnable) { return () -> validateFromRunnable(validationRunnable); } public static StatusException validateFromRunnable(RunnableX<StatusException> runnable) { try { runnable.run(); return null; } catch(StatusException e) { return e; } } /* ----------------- ----------------- */ public static IStatusMessage getValidationStatus(ValidationSource... sources) { for (ValidationSource validationSource : sources) { IStatusMessage validationStatus = validationSource.getValidationStatus(); if(validationSource != null) { return validationStatus; } } return null; } public static IStatusMessage getHighestStatus(Iterable<? extends ValidationSource> validationSources) { IStatusMessage highestSE = null; for(ValidationSource validationSource : validationSources) { IStatusMessage se = validationSource.getValidationStatus(); if(se != null) { if(highestSE == null || se.isHigherSeverity(highestSE)) { highestSE = se; } } } return highestSE; } }