001 /*
002 * Copyright 2002-2004 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005 * use this file except in compliance with the License. You may obtain a copy of
006 * the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013 * License for the specific language governing permissions and limitations under
014 * the License.
015 */
016 package org.springframework.rules.closure;
017
018 import org.springframework.util.comparator.ComparableComparator;
019 import org.springframework.util.comparator.NullSafeComparator;
020
021 /**
022 * Returns the maximum of two <code>Comparable</code> objects; with nulls regarded a
023 * being less than non null.
024 *
025 * @author Keith Donald
026 */
027 public class Minimum extends AbstractBinaryClosure {
028
029 private static final Minimum INSTANCE = new Minimum();
030
031 private static final NullSafeComparator COMPARATOR = new NullSafeComparator(new ComparableComparator(), true);
032
033 /**
034 * Returns the shared instance--this is possible as the default functor for
035 * this class is immutable and stateless.
036 *
037 * @return the shared instance
038 */
039 public static final BinaryClosure instance() {
040 return INSTANCE;
041 }
042
043 /**
044 * Return the minimum of two Comparable objects.
045 *
046 * @param comparable1
047 * the first comparable
048 * @param comparable2
049 * the second comparable
050 * @return the minimum
051 */
052 public Object call(Object comparable1, Object comparable2) {
053 int result = COMPARATOR.compare(comparable1,
054 comparable2);
055 if (result < 0) {
056 return comparable1;
057 }
058 else if (result > 0) {
059 return comparable2;
060 }
061 return comparable1;
062 }
063
064 public String toString() {
065 return "min(arg1, arg2)";
066 }
067
068 }