RoundingStrategies.java

package sk.iway.iwcm.ebanking;

import java.util.Arrays;
import java.util.Currency;
import java.util.List;

/**
 *  RoundingStrategies.java
 *  
 *  Facade for access to rounding strategies.
 *
 *@Title        webjet7
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2010
 *@author       $Author: marosurbanec $
 *@version      $Revision: 1.3 $
 *@created      Date: 3.11.2010 14:44:09
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class RoundingStrategies
{
	//fill later
	private static final List<Currency> currenciesWithNoRounding = Arrays.asList(
		Currency.getInstance("EUR"), Currency.getInstance("USD")
	);
	
	/**
	 * Returns default rounding strategies required by law 
	 * for a given currency 
	 */
	public static RoundingStrategy getRoundingStrategy(Currency currency)
	{
		if(currenciesWithNoRounding.contains(currency))
			return new NoRounding();
		
		throw new IllegalArgumentException("Don't know how to round "+currency);
	}
	
	public static RoundingStrategy noRounding()
	{
		return new NoRounding();
	}
	
	public static RoundingStrategy toFiveCentsUpwards()
	{
		return upwardsTo(5);
	}
	
	public static RoundingStrategy toFiftyCentsUpwards()
	{
		return upwardsTo(50);
	}
	
	public static RoundingStrategy toFiveCentsDownwards()
	{
		return downwardsTo(5);
	}
	
	public static RoundingStrategy toFiftyCentsDownwards()
	{
		return downwardsTo(50);
	}

	public static RoundingStrategy downwardsTo(final int cents)
	{
		return new RoundingStrategy(){
			@Override
			public Money round(Money original){
				long newAmount = original.getAmount() - original.getAmount() % cents;
				return Money.fromCents(newAmount, original.getCurrency());
			}
		};
	}
	
	public static RoundingStrategy upwardsTo(final int cents)
	{
		return new RoundingStrategy(){
			@Override
			public Money round(Money original){
				long newAmount = original.getAmount() - original.getAmount() % cents;
				if (original.getAmount() % cents != 0)
					newAmount += cents;
				return Money.fromCents(newAmount, original.getCurrency());
			}
		};
	}
}