/**
 * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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.core.common.editpart.emf.validation;

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

import javax.validation.ValidatorFactory;

import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.osbp.ecview.core.common.context.ILocaleChangedService;
import org.eclipse.osbp.ecview.core.common.context.ILocaleChangedService.LocaleListener;
import org.eclipse.osbp.ecview.core.common.context.IViewContext;
import org.eclipse.osbp.ecview.core.common.editpart.emf.validation.validator.BeanValidationValidator;
import org.eclipse.osbp.ecview.core.common.editpart.validation.IBeanValidationValidatorEditpart;
import org.eclipse.osbp.ecview.core.common.model.core.YField;
import org.eclipse.osbp.ecview.core.common.model.validation.ValidationPackage;
import org.eclipse.osbp.ecview.core.common.model.validation.YBeanValidationValidator;
import org.eclipse.osbp.ecview.core.common.model.validation.YBeanValidationValidatorConfig;
import org.eclipse.osbp.ecview.core.common.validation.IValidationConfig;
import org.eclipse.osbp.ecview.core.common.validation.IValidator;
import org.eclipse.osbp.runtime.common.i18n.II18nService;
import org.eclipse.osbp.runtime.common.types.ITypeProviderService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BeanValidationValidatorEditpart extends ValidatorEditpart<YBeanValidationValidator>
		implements IBeanValidationValidatorEditpart, LocaleListener {

	private static final Logger LOGGER = LoggerFactory.getLogger(BeanValidationValidatorEditpart.class);

	private ValidationConfigToValidatorBridge bridgeObserver;

	private BeanValidationValidator validator;

	public BeanValidationValidatorEditpart() {
		super(ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS,
				ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS_FULLY_QUALIFIED_NAME,
				ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_PROPERTY);
	}

	@Override
	protected IValidator createValidator() {
		YBeanValidationValidator yModel = getModel();

		ValidatorFactory jsr303ValidatorFactory = (ValidatorFactory) getViewContext(yModel)
				.getService(ValidatorFactory.class.getName());
		if (jsr303ValidatorFactory == null) {
			LOGGER.error("JSR303ValidatorFactory not available.");
			return null;
		}

		Class<?> beanClass = yModel.getBvalClass();
		if (beanClass == null) {
			ITypeProviderService service = getViewContext(getModel()).getService(ITypeProviderService.class.getName());
			beanClass = service.forName(null, getModel().getBvalClassFullyQualifiedName());
		}

		IViewContext context = getViewContext(getModel());
		YField yField = (YField) yModel.eContainer();
		validator = new BeanValidationValidator(beanClass, yModel.getBvalProperty(), jsr303ValidatorFactory,
				yField.getId(), yField.getLabelI18nKey(), context.getLocale());
		validator.setI18nService((II18nService) context.getService(II18nService.class.getName()));

		ILocaleChangedService localeChangedService = context.getService(ILocaleChangedService.ID);
		localeChangedService.addLocaleListener(this);

		return validator;
	}

	@Override
	public void setConfig(IValidationConfig config) {
		YBeanValidationValidatorConfig validatable = (YBeanValidationValidatorConfig) config.getValidationSettings();
		// create an observer that transfers the changes at the validatable to
		// the validator
		Map<EStructuralFeature, EStructuralFeature> mapping = new HashMap<EStructuralFeature, EStructuralFeature>();
		mapping.put(ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS,
				ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS);
		mapping.put(ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS_FULLY_QUALIFIED_NAME,
				ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_CLASS_FULLY_QUALIFIED_NAME);
		mapping.put(ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_PROPERTY,
				ValidationPackage.Literals.YBEAN_VALIDATION_VALIDATOR_CONFIG__BVAL_PROPERTY);

		bridgeObserver = new ValidationConfigToValidatorBridge(validatable, getModel(), mapping);
	}

	@Override
	protected void internalDispose() {
		try {
			ILocaleChangedService localeChangedService = getContext().getService(ILocaleChangedService.ID);
			localeChangedService.removeLocaleListener(this);

			if (bridgeObserver != null) {
				bridgeObserver.dispose();
				bridgeObserver = null;
			}
		} finally {
			super.internalDispose();
		}
	}

	@Override
	public void localeChanged(Locale locale) {
		validator.setLocale(locale);
	}

}
