View Javadoc

1   /*
2    *  Copyright 2009-2013 Stephen Colebourne
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package org.joda.money;
17  
18  /**
19   * Utilities for working with monetary values that handle null.
20   * <p>
21   * This utility class contains thread-safe static methods.
22   */
23  public final class MoneyUtils {
24  
25      /**
26       * Validates that the object specified is not null.
27       *
28       * @param object  the object to check, not null
29       * @throws NullPointerException if the input value is null
30       */
31      static void checkNotNull(Object object, String message) {
32          if (object == null) {
33              throw new NullPointerException(message);
34          }
35      }
36  
37      //-----------------------------------------------------------------------
38      /**
39       * Private constructor.
40       */
41      private MoneyUtils() {
42      }
43  
44      //-----------------------------------------------------------------------
45      /**
46       * Checks if the monetary value is zero, treating null as zero.
47       * <p>
48       * This method accepts any implementation of {@code BigMoneyProvider}.
49       * 
50       * @param moneyProvider  the money to check, null returns zero
51       * @return true if the money is null or zero
52       */
53      public static boolean isZero(BigMoneyProvider moneyProvider) {
54          return (moneyProvider == null || moneyProvider.toBigMoney().isZero());
55      }
56  
57      /**
58       * Checks if the monetary value is positive and non-zero, treating null as zero.
59       * <p>
60       * This method accepts any implementation of {@code BigMoneyProvider}.
61       * 
62       * @param moneyProvider  the money to check, null returns false
63       * @return true if the money is non-null and positive
64       */
65      public static boolean isPositive(BigMoneyProvider moneyProvider) {
66          return (moneyProvider != null && moneyProvider.toBigMoney().isPositive());
67      }
68  
69      /**
70       * Checks if the monetary value is positive or zero, treating null as zero.
71       * <p>
72       * This method accepts any implementation of {@code BigMoneyProvider}.
73       * 
74       * @param moneyProvider  the money to check, null returns true
75       * @return true if the money is null, zero or positive
76       */
77      public static boolean isPositiveOrZero(BigMoneyProvider moneyProvider) {
78          return (moneyProvider == null || moneyProvider.toBigMoney().isPositiveOrZero());
79      }
80  
81      /**
82       * Checks if the monetary value is negative and non-zero, treating null as zero.
83       * <p>
84       * This method accepts any implementation of {@code BigMoneyProvider}.
85       * 
86       * @param moneyProvider  the money to check, null returns false
87       * @return true if the money is non-null and negative
88       */
89      public static boolean isNegative(BigMoneyProvider moneyProvider) {
90          return (moneyProvider != null && moneyProvider.toBigMoney().isNegative());
91      }
92  
93      /**
94       * Checks if the monetary value is negative or zero, treating null as zero.
95       * <p>
96       * This method accepts any implementation of {@code BigMoneyProvider}.
97       * 
98       * @param moneyProvider  the money to check, null returns true
99       * @return true if the money is null, zero or negative
100      */
101     public static boolean isNegativeOrZero(BigMoneyProvider moneyProvider) {
102         return (moneyProvider == null || moneyProvider.toBigMoney().isNegativeOrZero());
103     }
104 
105     //-----------------------------------------------------------------------
106     /**
107      * Finds the maximum {@code Money} value, handing null.
108      * <p>
109      * This returns the greater of money1 or money2 where null is ignored.
110      * If both input values are null, then null is returned.
111      * 
112      * @param money1  the first money instance, null returns money2
113      * @param money2  the first money instance, null returns money1
114      * @return the maximum value, null if both inputs are null
115      * @throws CurrencyMismatchException if the currencies differ
116      */
117     public static Money max(Money money1, Money money2) {
118         if (money1 == null) {
119             return money2;
120         }
121         if (money2 == null) {
122             return money1;
123         }
124         return money1.compareTo(money2) > 0 ? money1 : money2;
125     }
126 
127     /**
128      * Finds the minimum {@code Money} value, handing null.
129      * <p>
130      * This returns the greater of money1 or money2 where null is ignored.
131      * If both input values are null, then null is returned.
132      * 
133      * @param money1  the first money instance, null returns money2
134      * @param money2  the first money instance, null returns money1
135      * @return the minimum value, null if both inputs are null
136      * @throws CurrencyMismatchException if the currencies differ
137      */
138     public static Money min(Money money1, Money money2) {
139         if (money1 == null) {
140             return money2;
141         }
142         if (money2 == null) {
143             return money1;
144         }
145         return money1.compareTo(money2) < 0 ? money1 : money2;
146     }
147 
148     //-----------------------------------------------------------------------
149     /**
150      * Adds two {@code Money} objects, handling null.
151      * <p>
152      * This returns {@code money1 + money2} where null is ignored.
153      * If both input values are null, then null is returned.
154      * 
155      * @param money1  the first money instance, null returns money2
156      * @param money2  the first money instance, null returns money1
157      * @return the total, where null is ignored, null if both inputs are null
158      * @throws CurrencyMismatchException if the currencies differ
159      */
160     public static Money add(Money money1, Money money2) {
161         if (money1 == null) {
162             return money2;
163         }
164         if (money2 == null) {
165             return money1;
166         }
167         return money1.plus(money2);
168     }
169 
170     //-----------------------------------------------------------------------
171     /**
172      * Subtracts the second {@code Money} from the first, handling null.
173      * <p>
174      * This returns {@code money1 - money2} where null is ignored.
175      * If both input values are null, then null is returned.
176      * 
177      * @param money1  the first money instance, null treated as zero
178      * @param money2  the first money instance, null returns money1
179      * @return the total, where null is ignored, null if both inputs are null
180      * @throws CurrencyMismatchException if the currencies differ
181      */
182     public static Money subtract(Money money1, Money money2) {
183         if (money2 == null) {
184             return money1;
185         }
186         if (money1 == null) {
187             return money2.negated();
188         }
189         return money1.minus(money2);
190     }
191 
192     //-----------------------------------------------------------------------
193     /**
194      * Finds the maximum {@code BigMoney} value, handing null.
195      * <p>
196      * This returns the greater of money1 or money2 where null is ignored.
197      * If both input values are null, then null is returned.
198      * 
199      * @param money1  the first money instance, null returns money2
200      * @param money2  the first money instance, null returns money1
201      * @return the maximum value, null if both inputs are null
202      * @throws CurrencyMismatchException if the currencies differ
203      */
204     public static BigMoney max(BigMoney money1, BigMoney money2) {
205         if (money1 == null) {
206             return money2;
207         }
208         if (money2 == null) {
209             return money1;
210         }
211         return money1.compareTo(money2) > 0 ? money1 : money2;
212     }
213 
214     /**
215      * Finds the minimum {@code BigMoney} value, handing null.
216      * <p>
217      * This returns the greater of money1 or money2 where null is ignored.
218      * If both input values are null, then null is returned.
219      * 
220      * @param money1  the first money instance, null returns money2
221      * @param money2  the first money instance, null returns money1
222      * @return the minimum value, null if both inputs are null
223      * @throws CurrencyMismatchException if the currencies differ
224      */
225     public static BigMoney min(BigMoney money1, BigMoney money2) {
226         if (money1 == null) {
227             return money2;
228         }
229         if (money2 == null) {
230             return money1;
231         }
232         return money1.compareTo(money2) < 0 ? money1 : money2;
233     }
234 
235     //-----------------------------------------------------------------------
236     /**
237      * Adds two {@code BigMoney} objects, handling null.
238      * <p>
239      * This returns {@code money1 + money2} where null is ignored.
240      * If both input values are null, then null is returned.
241      * 
242      * @param money1  the first money instance, null returns money2
243      * @param money2  the first money instance, null returns money1
244      * @return the total, where null is ignored, null if both inputs are null
245      * @throws CurrencyMismatchException if the currencies differ
246      */
247     public static BigMoney add(BigMoney money1, BigMoney money2) {
248         if (money1 == null) {
249             return money2;
250         }
251         if (money2 == null) {
252             return money1;
253         }
254         return money1.plus(money2);
255     }
256 
257     //-----------------------------------------------------------------------
258     /**
259      * Subtracts the second {@code BigMoney} from the first, handling null.
260      * <p>
261      * This returns {@code money1 - money2} where null is ignored.
262      * If both input values are null, then null is returned.
263      * 
264      * @param money1  the first money instance, null treated as zero
265      * @param money2  the first money instance, null returns money1
266      * @return the total, where null is ignored, null if both inputs are null
267      * @throws CurrencyMismatchException if the currencies differ
268      */
269     public static BigMoney subtract(BigMoney money1, BigMoney money2) {
270         if (money2 == null) {
271             return money1;
272         }
273         if (money1 == null) {
274             return money2.negated();
275         }
276         return money1.minus(money2);
277     }
278 
279 }