/**
 * <copyright>
 *
 *  Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 *  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
 *  https://www.eclipse.org/legal/epl-v2.0
 *
 *  SPDX-License-Identifier: EPL-2.0
 * 
 *  Contributors:
 *      Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.pattern.ftask.tasks;

import java.util.List;

import org.eclipse.egf.core.producer.InvocationException;
import org.eclipse.egf.ftask.producer.context.ITaskProductionContext;
import org.eclipse.egf.model.ftask.task.ValidationInvocationException;
import org.eclipse.egf.model.pattern.PatternContext;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.DiagnosticChain;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.Diagnostician;

/**
 * @author Matthieu Helleboid
 * 
 */
public class DomainDrivenValidationStrategyTask extends DomainDrivenStrategyTask {

    private static final String DIAGNOSTIC = "diagnostic"; //$NON-NLS-1$

    @Override
    @SuppressWarnings("unchecked")
    protected void readContext(ITaskProductionContext context, PatternContext ctx) throws InvocationException {
        super.readContext(context, ctx);
        List<EObject> objects = (List<EObject>) ctx.getValue(PatternContext.DOMAIN_OBJECTS);

        Diagnostic diagnostic = null;
        Diagnostician diagnostician = new Diagnostician();
        for (EObject eObject : objects) {
            if (diagnostic == null)
                diagnostic = diagnostician.validate(eObject);
            else
                diagnostician.validate(eObject, (DiagnosticChain) diagnostic);
        }

        ctx.setValue(DIAGNOSTIC, diagnostic);
    }

    @Override
    protected void writeContext(ITaskProductionContext context, PatternContext ctx) throws InvocationException {
        super.writeContext(context, ctx);

        Diagnostic diagnostic = (Diagnostic) context.getOutputValue(DIAGNOSTIC, Object.class);
        if (diagnostic.getSeverity() >= Diagnostic.WARNING) {
        	ValidationInvocationException validationInvocationException = new ValidationInvocationException("Validation Error detected in " + context.getName());
        	validationInvocationException.setDiagnostic(diagnostic);
			throw validationInvocationException;
        }
    }

}
