/*
|
* 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;
|
}
|
}
|