/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.type;
import java.lang.ref.WeakReference;
import javax.annotation.Nullable;
import javax.validation.constraints.NotNull;
import org.obiba.magma.MagmaEngine;
import org.obiba.magma.Value;
import org.obiba.magma.support.ValueComparator;
public class BooleanType extends AbstractValueType {
private static final long serialVersionUID = -149385659514790222L;
@SuppressWarnings("StaticNonFinalField")
private static WeakReference<BooleanType> instance;
private final Value trueValue;
private final Value falseValue;
private BooleanType() {
trueValue = Factory.newValue(this, Boolean.TRUE);
falseValue = Factory.newValue(this, Boolean.FALSE);
}
@SuppressWarnings("ConstantConditions")
@edu.umd.cs.findbugs.annotations.SuppressWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE")
@NotNull
public static BooleanType get() {
if(instance == null || instance.get() == null) {
instance = MagmaEngine.get().registerInstance(new BooleanType());
}
return instance.get();
}
@Override
public boolean isDateTime() {
return false;
}
@Override
public boolean isNumeric() {
return false;
}
@Override
public Class<?> getJavaClass() {
return Boolean.class;
}
@NotNull
@Override
public String getName() {
return "boolean";
}
@Override
public boolean acceptsJavaClass(@NotNull Class<?> clazz) {
return Boolean.class.isAssignableFrom(clazz) || boolean.class.isAssignableFrom(clazz);
}
@NotNull
@Override
public Value valueOf(@Nullable String string) {
if(string == null) {
return nullValue();
}
if("true".equalsIgnoreCase(string) || "false".equalsIgnoreCase(string)) {
return valueOf(Boolean.valueOf(string).booleanValue());
}
throw new IllegalArgumentException(
"Cannot construct " + getClass().getSimpleName() + " from type String with value '" + string + "'");
}
@NotNull
@Override
public Value valueOf(@Nullable Object object) {
if(object == null) {
return nullValue();
}
if(object instanceof Boolean) {
return valueOf(((Boolean) object).booleanValue());
}
if(boolean.class.isAssignableFrom(object.getClass())) {
return valueOf(boolean.class.cast(object));
}
if(object instanceof Value) {
return convert((Value)object);
}
if(object instanceof Value && ((Value)object).isSequence()) {
return sequenceOf(((Value)object).asSequence().getValues());
}
return valueOf(object.toString());
}
public Value valueOf(Boolean object) {
if(object == null) {
return nullValue();
}
return valueOf(object.booleanValue());
}
public Value valueOf(boolean value) {
return value ? trueValue : falseValue;
}
public Value trueValue() {
return trueValue;
}
public Value falseValue() {
return falseValue;
}
public Value not(Value value) {
if(value.getValueType() != this) {
throw new IllegalArgumentException("value is not of BooleanType: " + value);
}
if(value.isNull()) {
return value;
}
if(trueValue.equals(value)) {
return falseValue;
}
if(falseValue.equals(value)) {
return trueValue;
}
// This really isn't possible
throw new IllegalArgumentException("value of BooleanType is neither true nor false: " + value);
}
@Override
public int compare(Value o1, Value o2) {
return ValueComparator.INSTANCE.compare(o1, o2);
}
}