/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 * 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.dsl.entity.xtext.tests.selfreference.dtos;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;
import java.util.Locale;
import org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.TestsSelfreferenceTranslator;
import org.eclipse.osbp.runtime.common.i18n.ITranslator;
import org.slf4j.Logger;

@SuppressWarnings("all")
public class SelfreferenceDtosTranslator implements ITranslator {
  private static Logger log = org.slf4j.LoggerFactory.getLogger("translations by translator");
  
  private static SelfreferenceDtosTranslator instance = null;
  
  private static Locale lastLocale = null;
  
  private static TestsSelfreferenceTranslator testsSelfreferenceTranslator = null;
  
  private PropertyChangeSupport pcs = new java.beans.PropertyChangeSupport(this);
  
  private HashMap<String, String> translations = new HashMap<String,String>() {{
    }};
  
  public static SelfreferenceDtosTranslator getInstance(final Locale locale) {
    if(instance == null) {
    	instance = new org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.dtos.SelfreferenceDtosTranslator();
    	if (lastLocale == null) {
    		instance.changeLocale(locale);
    	}
    }
    return instance;
  }
  
  public void addPropertyChangeListener(final PropertyChangeListener listener) {
    this.pcs.addPropertyChangeListener(listener);
  }
  
  public void removePropertyChangeListener(final PropertyChangeListener listener) {
    this.pcs.removePropertyChangeListener(listener);
  }
  
  public void mergeTranslations() {
    testsSelfreferenceTranslator.mergeTranslations();
    translations.putAll(testsSelfreferenceTranslator.getTranslations());
    if (log.isDebugEnabled()) log.debug("merge TestsSelfreferenceTranslator in org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.dtos");
    
  }
  
  public HashMap<String, String> getTranslations() {
    return translations;
  }
  
  public void changeLocale(final Locale locale) {
    // avoid unnecessary settings
    if (locale == null) {
    	if (log.isDebugEnabled()) log.debug("locale for org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.dtos is null.");
    	return;
    }
    if (locale.equals(lastLocale)) {
    	if (log.isDebugEnabled()) log.debug("locale for org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.dtos already set to "+locale.getDisplayLanguage());
    	return;
    }
    if (log.isDebugEnabled()) log.debug("locale for org.eclipse.osbp.dsl.entity.xtext.tests.selfreference.dtos set to "+locale.getDisplayLanguage());
    lastLocale = locale;
    // call the imported translators change locale method
    if (testsSelfreferenceTranslator == null) {
    	testsSelfreferenceTranslator = testsSelfreferenceTranslator.getInstance(locale);
    } else {
    	testsSelfreferenceTranslator.changeLocale(locale);
    }
    try {
    	java.util.ResourceBundle resource = java.util.ResourceBundle.getBundle("i18n.I18N", locale, getClass().getClassLoader());
    } catch (java.util.MissingResourceException mre) {
    	System.err.println(getClass().getCanonicalName()+" - "+mre.getLocalizedMessage());
    }
    
  }
}
