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

org.activiti.engine.impl.juel.BooleanOperations Maven / Gradle / Ivy

There is a newer version: 7.1.0.M6
Show newest version
/*
 * Based on JUEL 2.2.1 code, 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 org.activiti.engine.impl.juel;

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 org.activiti.engine.impl.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 - 2025 Weber Informatics LLC | Privacy Policy