1 /*
2 * jDTAUS Banking SPI
3 * Copyright (C) 2005 Christian Schulte
4 * <cs@schulte.it>
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 */
21 package org.jdtaus.banking.dtaus.spi;
22
23 import java.io.Serializable;
24 import java.util.Currency;
25 import java.util.HashMap;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.Map;
29 import java.util.Set;
30
31 /**
32 * Utility class for maintaining a mapping of currencies to corresponding counters.
33 *
34 * <p><b>Note:</b><br/>This class is not synchronized and must not be used concurrently without external
35 * synchronization.</p>
36 *
37 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
38 * @version $JDTAUS: CurrencyCounter.java 8661 2012-09-27 11:29:58Z schulte $
39 */
40 public class CurrencyCounter implements Serializable
41 {
42
43 /** Serial version UID for backwards compatibility with 1.1.x classes. */
44 private static final long serialVersionUID = -2765988202184349786L;
45
46 /**
47 * Maps ISO currency codes to counters.
48 * @serial
49 */
50 private Map currencyMap;
51
52 /**
53 * Gets the currencies for which the instance holds counters.
54 *
55 * @return The currencies for which the instance holds counters.
56 */
57 public Currency[] getCurrencies()
58 {
59 final Set currencies = new HashSet( this.getCurrencyMap().size() );
60 for ( Iterator it = this.getCurrencyMap().entrySet().iterator(); it.hasNext(); )
61 {
62 final Map.Entry entry = (Map.Entry) it.next();
63 currencies.add( Currency.getInstance( (String) entry.getKey() ) );
64 }
65
66 return (Currency[]) currencies.toArray( new Currency[ currencies.size() ] );
67 }
68
69 /**
70 * Gets the value of the counter for a given {@code Currency}.
71 *
72 * @param currency The currency to return the value of the counter for.
73 *
74 * @return The value of the counter of {@code currency}.
75 *
76 * @throws NullPointerException if {@code currency} is {@code null}.
77 */
78 public long getValue( final Currency currency )
79 {
80 if ( currency == null )
81 {
82 throw new NullPointerException( "currency" );
83 }
84
85 final Long value = (Long) this.getCurrencyMap().get( currency.getCurrencyCode() );
86 return value != null ? value.longValue() : 0L;
87 }
88
89 /**
90 * Adds to the counter of a currency.
91 *
92 * @param currency The currency to add to.
93 *
94 * @throws NullPointerException if {@code currency} is {@code null}.
95 * @throws IndexOutOfBoundsException if the value of the counter of {@code currency} is equal to
96 * {@link Long#MAX_VALUE}.
97 */
98 public void add( final Currency currency )
99 {
100 if ( currency == null )
101 {
102 throw new NullPointerException( "currency" );
103 }
104
105 final long value = this.getValue( currency );
106
107 if ( value == Long.MAX_VALUE )
108 {
109 throw new IndexOutOfBoundsException();
110 }
111
112 this.getCurrencyMap().put( currency.getCurrencyCode(), new Long( value + 1L ) );
113 }
114
115 /**
116 * Substracts from the counter of a currency.
117 *
118 * @param currency The currency to substract from.
119 *
120 * @throws NullPointerException if {@code currency} is {@code null}.
121 * @throws IndexOutOfBoundsException if the value of the counter of {@code currency} is equal to zero.
122 */
123 public void substract( final Currency currency )
124 {
125 if ( currency == null )
126 {
127 throw new NullPointerException( "currency" );
128 }
129
130 final long value = this.getValue( currency );
131
132 if ( value == 0L )
133 {
134 throw new IndexOutOfBoundsException();
135 }
136
137 this.getCurrencyMap().put( currency.getCurrencyCode(), new Long( value - 1L ) );
138 }
139
140 /**
141 * Gets the {@code Map} backing the instance.
142 *
143 * @return The {@code Map} backing the instance.
144 */
145 private Map getCurrencyMap()
146 {
147 if ( this.currencyMap == null )
148 {
149 this.currencyMap = new HashMap( 10 );
150 }
151
152 return this.currencyMap;
153 }
154
155 }