/* * * * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com) * * * * 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. * * * * For more information: http://www.orientechnologies.com * */ package com.orientechnologies.common.comparator; import java.util.Comparator; /** * Comparator that calls {@link Comparable#compareTo(Object)} methods for getting results for all {@link Comparable} types. * Otherwise result of {@link Comparator} that returned from {@link OComparatorFactory} will be used. * * The special case is null values. Null is treated as smallest value against other values. If both arguments are null they are * treated as equal. * * @author Andrey Lomakin * @since 03.07.12 */ public class ODefaultComparator implements Comparator<Object> { public static final ODefaultComparator INSTANCE = new ODefaultComparator(); @SuppressWarnings("unchecked") public int compare(final Object objectOne, final Object objectTwo) { if (objectOne == null) { if (objectTwo == null) return 0; else return -1; } else if (objectTwo == null) return 1; if (objectOne == objectTwo) // FAST COMPARISON return 0; if (objectOne instanceof Comparable) return ((Comparable<Object>) objectOne).compareTo(objectTwo); final Comparator<?> comparator = OComparatorFactory.INSTANCE.getComparator(objectOne.getClass()); if (comparator != null) return ((Comparator<Object>) comparator).compare(objectOne, objectTwo); throw new IllegalStateException("Object of class '" + objectOne.getClass().getName() + "' cannot be compared"); } }