/*******************************************************************************
 * Copyright (c) 2011, 2018 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
package org.eclipse.ocl.xtext.oclinecore.validation;

import java.util.Map;

import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.ocl.pivot.internal.delegate.OCLDelegateValidator;

/**
 * A OCLinEcoreEObjectValidator enhances the standard EObjectValidator to allow validation failures
 * to obtain a corresponding diagnostic from the validation delegate rather using the default
 * delegate exception message.
 * 
 * This class may go obsolete once Bug 337792 resolved.
 */
public class OCLinEcoreEObjectValidator extends OCLDelegateValidator
{
	public OCLinEcoreEObjectValidator() {
		super(null);
	}
	
	// Overridden to invoke OCLDelegateValidator
	@Override
	public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
		if (eObject.eIsProxy()) {
			if (context != null && context.get(ROOT_OBJECT) != null) {
				if (diagnostics != null) {
					diagnostics.add(createDiagnostic(Diagnostic.ERROR, DIAGNOSTIC_SOURCE,
							EOBJECT__EVERY_PROXY_RESOLVES, "_UI_UnresolvedProxy_diagnostic",
							new Object[] {
								getFeatureLabel(eObject.eContainmentFeature(), context),
								getObjectLabel(eObject.eContainer(), context),
								getObjectLabel(eObject, context) },
							new Object[] {
								eObject.eContainer(),
								eObject.eContainmentFeature(),
								eObject },
							context));
				}
				return false;
			} else {
				return true;
			}
		}
		else if (eClass.eContainer() == getEPackage()) {
			return validate(eClass.getClassifierID(), eObject, diagnostics, context);
		}
		else {
			return new OCLDelegateValidator(this) {
				// Ensure that the class loader for this class will be used downstream.
			}.validate(eClass, eObject, diagnostics, context);
		}
	}
}
