/**************************************************************************************
* Copyright (c) Jonas Bon?r, Alexandre Vasseur. All rights reserved. *
* http://aspectwerkz.codehaus.org *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the LGPL license *
* a copy of which has been included with this distribution in the license.txt file. *
**************************************************************************************/
package org.codehaus.aspectwerkz.expression;
/**
* Helper class to have boolean operation on true / false and null, null is assumed to be undetermined, and "not null"="null"
* A "false && null" will stay false, but a "true && null" will become undetermined (null).
*
* <p/>
* This is used when the expression cannot be resolved entirely (early matching, cflow, runtime check residuals)
*
* @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a>
*/
public abstract class Undeterministic {
/**
* And operation
*
* @param lhs
* @param rhs
* @return
*/
public static Boolean and(Boolean lhs, Boolean rhs) {
if (lhs != null && rhs != null) {
// regular AND
if (lhs.equals(Boolean.TRUE) && rhs.equals(Boolean.TRUE)) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
} else if (lhs != null && lhs.equals(Boolean.FALSE)) {
// one is undetermined and the other is false, so result is false
return Boolean.FALSE;
} else if (rhs != null && rhs.equals(Boolean.FALSE)) {
// one is undetermined and the other is false, so result is false
return Boolean.FALSE;
} else {
// both are undetermined, or one is true and the other undetermined
return null;
}
}
/**
* Or operation
*
* @param lhs
* @param rhs
* @return
*/
public static Boolean or(Boolean lhs, Boolean rhs) {
if (lhs != null && rhs != null) {
// regular OR
if (lhs.equals(Boolean.TRUE) || rhs.equals(Boolean.TRUE)) {
return Boolean.TRUE;
} else {
return Boolean.FALSE;
}
} else {
// one or both is/are undetermined
// OR cannot be resolved
return null;
}
}
/**
* Not operation
*
* @param b
* @return
*/
public static Boolean not(Boolean b) {
if (b != null) {
// regular NOT
if (b.equals(Boolean.TRUE)) {
return Boolean.FALSE;
} else {
return Boolean.TRUE;
}
} else {
return null;
}
}
}