CurrencyTools.java

package eu.javaexperience.locales;

import java.util.HashMap;
import java.util.Map;

import eu.javaexperience.reflect.Mirror;
import eu.javaexperience.semantic.references.MayNotNull;

public class CurrencyTools
{
	public static Currency NULL_CURRENCY = new Currency()
	{
		@Override
		public String getIso4217Name()
		{
			return "NULL";
		}
	};
	
	protected static final Map<String, AvailableCurrency> WELL_KNOWN_CURRENCIES = new HashMap<>();
	static
	{
		for(AvailableCurrency ac: AvailableCurrency.values())
		{
			WELL_KNOWN_CURRENCIES.put(ac.getIso4217Name(), ac);
		}
	}
	
	public static @MayNotNull Currency getOrCreateCurrency(String name)
	{
		if(null == name)
		{
			return NULL_CURRENCY;
		}
		
		final String n = name.trim().toUpperCase();
		
		AvailableCurrency ret = WELL_KNOWN_CURRENCIES.get(n);
		if(null != ret)
		{
			return ret;
		}
		
		return new Currency()
		{
			@Override
			public String getIso4217Name()
			{
				return n;
			}
			
			@Override
			public boolean equals(Object obj)
			{
				return equalsByCurrencyIso4217(this, obj);
			}
			
			@Override
			public int hashCode()
			{
				return n.hashCode();
			}
		};
	}
	
	public static boolean equalsByCurrencyIso4217(Object o1, Object o2)
	{
		//shortcut for AvailableCurrency'es
		if(o1 == o2)
		{
			return true;
		}
		
		if(!(o1 instanceof Currency) || !(o2 instanceof Currency))
		{
			return false;
		}
		
		Currency c1 = (Currency) o1;
		Currency c2 = (Currency) o2;
		
		return Mirror.equals(c1.getIso4217Name(), c2.getIso4217Name());
	}
}