All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.odysseus.el.misc.BooleanOperations Maven / Gradle / Ivy

There is a newer version: 2.2.7
Show newest version
/*
 * Copyright 2006-2009 Odysseus Software GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package de.odysseus.el.misc;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import javax.el.ELException;

public class BooleanOperations {
	private final static Set> SIMPLE_INTEGER_TYPES = new HashSet>();
	private final static Set> SIMPLE_FLOAT_TYPES = new HashSet>();
	
	static {
		SIMPLE_INTEGER_TYPES.add(Byte.class);
		SIMPLE_INTEGER_TYPES.add(Short.class);
		SIMPLE_INTEGER_TYPES.add(Integer.class);
		SIMPLE_INTEGER_TYPES.add(Long.class);
		SIMPLE_FLOAT_TYPES.add(Float.class);
		SIMPLE_FLOAT_TYPES.add(Double.class);
	}

	@SuppressWarnings("unchecked")
	private static final boolean lt0(TypeConverter converter, Object o1, Object o2) {
		Class t1 = o1.getClass();
		Class t2 = o2.getClass();
		if (BigDecimal.class.isAssignableFrom(t1) || BigDecimal.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigDecimal.class).compareTo(converter.convert(o2, BigDecimal.class)) < 0;
		}
		if (SIMPLE_FLOAT_TYPES.contains(t1) || SIMPLE_FLOAT_TYPES.contains(t2)) {
			return converter.convert(o1, Double.class) < converter.convert(o2, Double.class);
		}
		if (BigInteger.class.isAssignableFrom(t1) || BigInteger.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigInteger.class).compareTo(converter.convert(o2, BigInteger.class)) < 0;
		}
		if (SIMPLE_INTEGER_TYPES.contains(t1) || SIMPLE_INTEGER_TYPES.contains(t2)) {
			return converter.convert(o1, Long.class) < converter.convert(o2, Long.class);
		}
		if (t1 == String.class || t2 == String.class) {
			return converter.convert(o1, String.class).compareTo(converter.convert(o2, String.class)) < 0;
		}
		if (o1 instanceof Comparable) {
			return ((Comparable)o1).compareTo(o2) < 0;
		}
		if (o2 instanceof Comparable) {
			return ((Comparable)o2).compareTo(o1) > 0;
		}
		throw new ELException(LocalMessages.get("error.compare.types", o1.getClass(), o2.getClass()));
	}

	@SuppressWarnings("unchecked")
	private static final boolean gt0(TypeConverter converter, Object o1, Object o2) {		
		Class t1 = o1.getClass();
		Class t2 = o2.getClass();
		if (BigDecimal.class.isAssignableFrom(t1) || BigDecimal.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigDecimal.class).compareTo(converter.convert(o2, BigDecimal.class)) > 0;
		}
		if (SIMPLE_FLOAT_TYPES.contains(t1) || SIMPLE_FLOAT_TYPES.contains(t2)) {
			return converter.convert(o1, Double.class) > converter.convert(o2, Double.class);
		}
		if (BigInteger.class.isAssignableFrom(t1) || BigInteger.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigInteger.class).compareTo(converter.convert(o2, BigInteger.class)) > 0;
		}
		if (SIMPLE_INTEGER_TYPES.contains(t1) || SIMPLE_INTEGER_TYPES.contains(t2)) {
			return converter.convert(o1, Long.class) > converter.convert(o2, Long.class);
		}
		if (t1 == String.class || t2 == String.class) {
			return converter.convert(o1, String.class).compareTo(converter.convert(o2, String.class)) > 0;
		}
		if (o1 instanceof Comparable) {
			return ((Comparable)o1).compareTo(o2) > 0;
		}
		if (o2 instanceof Comparable) {
			return ((Comparable)o2).compareTo(o1) < 0;
		}
		throw new ELException(LocalMessages.get("error.compare.types", o1.getClass(), o2.getClass()));
	}

	public static final boolean lt(TypeConverter converter, Object o1, Object o2) {
		if (o1 == o2) {
			return false;
		}
		if (o1 == null || o2 == null) {
			return false;
		}
		return lt0(converter, o1, o2);
	}

	public static final boolean gt(TypeConverter converter, Object o1, Object o2) {
		if (o1 == o2) {
			return false;
		}
		if (o1 == null || o2 == null) {
			return false;
		}
		return gt0(converter, o1, o2);
	}

	public static final boolean ge(TypeConverter converter, Object o1, Object o2) {
		if (o1 == o2) {
			return true;
		}
		if (o1 == null || o2 == null) {
			return false;
		}
		return !lt0(converter, o1, o2);
	}

	public static final boolean le(TypeConverter converter, Object o1, Object o2) {
		if (o1 == o2) {
			return true;
		}
		if (o1 == null || o2 == null) {
			return false;
		}
		return !gt0(converter, o1, o2);
	}

	public static final boolean eq(TypeConverter converter, Object o1, Object o2) {
		if (o1 == o2) {
			return true;
		}
		if (o1 == null || o2 == null) {
			return false;
		}
		Class t1 = o1.getClass();
		Class t2 = o2.getClass();
		if (BigDecimal.class.isAssignableFrom(t1) || BigDecimal.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigDecimal.class).equals(converter.convert(o2, BigDecimal.class));
		}
		if (SIMPLE_FLOAT_TYPES.contains(t1) || SIMPLE_FLOAT_TYPES.contains(t2)) {
			return converter.convert(o1, Double.class).equals(converter.convert(o2, Double.class));
		}
		if (BigInteger.class.isAssignableFrom(t1) || BigInteger.class.isAssignableFrom(t2)) {
			return converter.convert(o1, BigInteger.class).equals(converter.convert(o2, BigInteger.class));
		}
		if (SIMPLE_INTEGER_TYPES.contains(t1) || SIMPLE_INTEGER_TYPES.contains(t2)) {
			return converter.convert(o1, Long.class).equals(converter.convert(o2, Long.class));
		}
		if (t1 == Boolean.class || t2 == Boolean.class) {
			return converter.convert(o1, Boolean.class).equals(converter.convert(o2, Boolean.class));
		}
		if (o1 instanceof Enum) {
			return o1 == converter.convert(o2, o1.getClass());
		}
		if (o2 instanceof Enum) {
			return converter.convert(o1, o2.getClass()) == o2;
		}
		if (t1 == String.class || t2 == String.class) {
			return converter.convert(o1, String.class).equals(converter.convert(o2, String.class));
		}
		return o1.equals(o2);
	}

	public static final boolean ne(TypeConverter converter, Object o1, Object o2) {
		return !eq(converter, o1, o2);
	}

	public static final boolean empty(TypeConverter converter, Object o) {
		if (o == null || "".equals(o)) {
			return true;
		}
		if (o instanceof Object[]) {
			return ((Object[])o).length == 0;
		}
		if (o instanceof Map) {
			return ((Map)o).isEmpty();
		}
		if (o instanceof Collection) {
			return ((Collection)o).isEmpty();
		}
		return false;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy