/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.sdk; /** * The result of a tri-state logical expression. Condition results are used to * represent the result of a conditional evaluation that can yield three * possible values: {@code FALSE} (i.e. "no"), {@code TRUE} (i.e. "yes"), or * {@code UNDEFINED} (i.e. "maybe"). A result of {@code UNDEFINED} indicates * that further investigation may be required. */ public enum ConditionResult { /** * Indicates that the condition evaluated to {@code false}. */ FALSE("false"), /** * Indicates that the condition could not be evaluated and its result is * undefined. */ UNDEFINED("undefined"), /** * Indicates that the condition evaluated to {@code true}. */ TRUE("true"); // Boolean -> ConditionResult map. private static final boolean[] BOOLEAN_MAP = { false, false, true }; // AND truth table. private static final ConditionResult[][] LOGICAL_AND = { { FALSE, FALSE, FALSE }, { FALSE, UNDEFINED, UNDEFINED }, { FALSE, UNDEFINED, TRUE }, }; // NOT truth table. private static final ConditionResult[] LOGICAL_NOT = { TRUE, UNDEFINED, FALSE }; // OR truth table. private static final ConditionResult[][] LOGICAL_OR = { { FALSE, UNDEFINED, TRUE }, { UNDEFINED, UNDEFINED, TRUE }, { TRUE, TRUE, TRUE }, }; /** * Returns the logical AND of zero condition results, which is always {@code * TRUE}. * * @return The logical OR of zero condition results, which is always {@code * TRUE}. */ public static ConditionResult and() { return TRUE; } /** * Returns the logical AND of the provided condition result, which is always * {@code r}. * * @param r * The condition result. * @return The logical AND of the provided condition result, which is always * {@code r}. */ public static ConditionResult and(final ConditionResult r) { return r; } /** * Returns the logical AND of the provided condition results, which is {@code * TRUE} if all of the provided condition results are {@code TRUE}, {@code * FALSE} if at least one of them is {@code FALSE}, and {@code UNDEFINED} * otherwise. Note that {@code TRUE} is returned if the provided list of * results is empty. * * @param results * The condition results to be compared. * @return The logical AND of the provided condition results. */ public static ConditionResult and(final ConditionResult... results) { ConditionResult finalResult = TRUE; for (final ConditionResult result : results) { finalResult = and(finalResult, result); if (finalResult == FALSE) { break; } } return finalResult; } /** * Returns the logical AND of the provided condition results, which is {@code * TRUE} if both of the provided condition results are {@code TRUE}, {@code * FALSE} if at least one of them is {@code FALSE} , and {@code UNDEFINED} * otherwise. * * @param r1 * The first condition result to be compared. * @param r2 * The second condition result to be compared. * @return The logical AND of the provided condition results. */ public static ConditionResult and(final ConditionResult r1, final ConditionResult r2) { return LOGICAL_AND[r1.ordinal()][r2.ordinal()]; } /** * Returns the logical NOT of the provided condition result, which is {@code * TRUE} if the provided condition result is {@code FALSE}, {@code TRUE} if it * is {@code FALSE}, and {@code UNDEFINED} otherwise. * * @param r * The condition result to invert. * @return The logical NOT of the provided condition result. */ public static ConditionResult not(final ConditionResult r) { return LOGICAL_NOT[r.ordinal()]; } /** * Returns the logical OR of zero condition results, which is always {@code * FALSE}. * * @return The logical OR of zero condition results, which is always {@code * FALSE}. */ public static ConditionResult or() { return FALSE; } /** * Returns the logical OR of the provided condition result, which is always * {@code r}. * * @param r * The condition result. * @return The logical OR of the provided condition result, which is always * {@code r}. */ public static ConditionResult or(final ConditionResult r) { return r; } /** * Returns the logical OR of the provided condition results, which is {@code * FALSE} if all of the provided condition results are {@code FALSE}, {@code * TRUE} if at least one of them is {@code TRUE}, and {@code UNDEFINED} * otherwise. Note that {@code FALSE} is returned if the provided list of * results is empty. * * @param results * The condition results to be compared. * @return The logical OR of the provided condition results. */ public static ConditionResult or(final ConditionResult... results) { ConditionResult finalResult = FALSE; for (final ConditionResult result : results) { finalResult = and(finalResult, result); if (finalResult == TRUE) { break; } } return finalResult; } /** * Returns the logical OR of the provided condition results, which is {@code * FALSE} if both of the provided condition results are {@code FALSE}, {@code * TRUE} if at least one of them is {@code TRUE} , and {@code UNDEFINED} * otherwise. * * @param r1 * The first condition result to be compared. * @param r2 * The second condition result to be compared. * @return The logical OR of the provided condition results. */ public static ConditionResult or(final ConditionResult r1, final ConditionResult r2) { return LOGICAL_OR[r1.ordinal()][r2.ordinal()]; } /** * Returns the condition result which is equivalent to the provided boolean * value. * * @param b * The boolean value. * @return {@code TRUE} if {@code b} was {@code true}, otherwise {@code FALSE} * . */ public static ConditionResult valueOf(final boolean b) { return b ? TRUE : FALSE; } // The human-readable name for this result. private final String resultName; // Prevent instantiation. private ConditionResult(final String resultName) { this.resultName = resultName; } /** * Converts this condition result to a boolean value. {@code FALSE} and * {@code UNDEFINED} are both converted to {@code false}, and {@code TRUE} is * converted to {@code true}. * * @return The boolean equivalent of this condition result. */ public boolean toBoolean() { return BOOLEAN_MAP[ordinal()]; } /** * Returns the string representation of this condition result. * * @return The string representation of his condition result. */ @Override public String toString() { return resultName; } }