/**
 * <copyright>
 *
 *  Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 *  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:
 *      Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.pattern.ui.builder;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.egf.model.pattern.Pattern;
import org.eclipse.egf.model.pattern.PatternException;
import org.eclipse.egf.pattern.Activator;
import org.eclipse.egf.pattern.Messages;
import org.eclipse.egf.pattern.PatternConstants;
import org.eclipse.egf.pattern.engine.PatternHelper;
import org.eclipse.egf.pattern.engine.TranslationHelper;
import org.eclipse.egf.pattern.engine.PatternHelper.FilenameFormatException;

/**
 * Performs pattern translation each time a pt file is changed.
 * 
 * TODO gérer le cas où le model est modifié/supprimé et quand la classe générée
 * est supprimée.
 * 
 * @author Thomas Guiu
 * 
 */
public class PatternBuilder extends IncrementalProjectBuilder {

    @SuppressWarnings("unchecked")
    @Override
    protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
        Set<String> patternIds = null;
        IResourceDelta delta = getDelta(getProject());
        if (delta != null && delta.getKind() != IResourceDelta.NO_CHANGE) {
            PatternVisitor patternVisitor = new PatternVisitor();
            delta.accept(patternVisitor);
            patternIds = patternVisitor.getPatternId2translate();
            if (patternIds.isEmpty())
                return null;
        }

        checkCancellation(monitor);

        PatternHelper helper = PatternHelper.createCollector();
        Set<Pattern> patterns = helper.getPatterns(getProject(), patternIds);
        // if (patternIds != null && patterns.size() != patternIds.size())
        // Activator.getDefault().logWarning(Messages.PatternBuilding_warning);
        try {
            new TranslationHelper().translate(patterns);
        } catch (PatternException e) {
            // log the error instead of throwing a CoreException
            Activator.getDefault().logError(Messages.PatternBuilding_Failed, e);
        } finally {
            helper.clear();
            patterns.clear();
        }
        return null;
    }

    private void checkCancellation(IProgressMonitor monitor) {
        if (monitor != null && monitor.isCanceled())
            throw new OperationCanceledException();
    }

    class PatternVisitor implements IResourceDeltaVisitor {

        private final Set<String> patternId2translate = new HashSet<String>();

        public PatternVisitor() {
        }

        public boolean visit(IResourceDelta delta) throws CoreException {

            IResource resource = delta.getResource();
            if (resource.getType() == IResource.FILE) {
                if (delta.getKind() != IResourceDelta.REMOVED && PatternConstants.PATTERN_UNIT_FILE_EXTENSION.equals(resource.getFileExtension())) {
                    try {
                        patternId2translate.add(PatternHelper.Filename.extractPatternId(resource.getProjectRelativePath()));
                    } catch (FilenameFormatException e) {
                        Activator.getDefault().logError(e);
                    }
                }
                return false;
            }
            return true;
        }

        public Set<String> getPatternId2translate() {
            return patternId2translate;
        }

    }

}
