blob: 61acb74fbe593f89308e7f0624364ddf5d7a83fe [file] [log] [blame]
/**
* <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;
}
}
}