/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Florian Pirchner - Initial implementation
 * 
 */
package org.eclipse.osbp.ecview.extension.presentation.vaadin.converter;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

import org.apache.commons.lang.StringEscapeUtils;
import org.eclipse.osbp.ecview.core.common.services.IServiceRegistry;
import org.eclipse.osbp.ecview.extension.model.converter.YSimpleDecimalConverter;
import org.eclipse.osbp.runtime.web.vaadin.components.converter.DecimalConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The Class SimpleDecimalConverter.
 */
@SuppressWarnings("serial")
public class SimpleDecimalConverter extends DecimalConverter {

	/** The Constant LOGGER. */
	private static final Logger LOGGER = LoggerFactory
			.getLogger(SimpleDecimalConverter.class);

	/** The registry. */
	private IServiceRegistry registry;

	/** The y converter. */
	private YSimpleDecimalConverter yConverter;

	/**
	 * Instantiates a new simple decimal converter.
	 *
	 * @param registry
	 *            the registry
	 * @param yConverter
	 *            the y converter
	 */
	public SimpleDecimalConverter(IServiceRegistry registry,
			YSimpleDecimalConverter yConverter) {
		this.registry = registry;
		this.yConverter = yConverter;
	}

	/**
	 * Instantiates a new simple decimal converter.
	 */
	public SimpleDecimalConverter() {
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.eclipse.osbp.runtime.web.vaadin.components.converter.DecimalConverter
	 * #getFormat(java.util.Locale)
	 */
	@Override
	protected NumberFormat getFormat(Locale locale) {
		if (locale == null) {
			locale = Locale.getDefault();
		}
		DecimalFormat result;
		try {
			result = new DecimalFormat(StringEscapeUtils.unescapeHtml(yConverter.getNumberFormatPattern()),
					DecimalFormatSymbols.getInstance(locale));
		} catch (IllegalArgumentException e) {
			String msg = String.format(
					"formatter %s is invalid for decimal numbers: %s",
					yConverter.getNumberFormatPattern(), e.getLocalizedMessage());
			throw new ConversionException(msg);
		}
		return result;
	}
}
