blob: c75ee17beb1afef41390ecb30fa3369b9a5b3c6e [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.List;
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.template.TemplateModelFileHelper;
import org.eclipse.egf.model.pattern.template.TemplateModelFileHelper.FilenameFormatException;
import org.eclipse.egf.pattern.EGFPatternPlugin;
import org.eclipse.egf.pattern.engine.PatternHelper;
import org.eclipse.egf.pattern.engine.TranslationHelper;
import org.eclipse.egf.pattern.l10n.EGFPatternMessages;
import org.eclipse.egf.pattern.utils.ParameterTypeHelper;
/**
* 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 {
class PatternVisitor implements IResourceDeltaVisitor {
private final Set<String> patternId2translate = new HashSet<String>();
public PatternVisitor() {
// Nothing to do
}
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (resource.getType() == IResource.FILE) {
if (delta.getKind() != IResourceDelta.REMOVED && TemplateModelFileHelper.PATTERN_UNIT_FILE_EXTENSION.equals(resource.getFileExtension())) {
if (delta.getFlags() != IResourceDelta.MARKERS) {
try {
patternId2translate.add(TemplateModelFileHelper.extractPatternId(resource.getProjectRelativePath()));
} catch (FilenameFormatException e) {
EGFPatternPlugin.getDefault().logError(e);
}
}
}
return false;
}
return true;
}
public Set<String> getPatternId2translate() {
return patternId2translate;
}
}
@Override
@SuppressWarnings("rawtypes")
protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
IProject project = getProject();
if (project == null || project.isAccessible() == false) {
return new IProject[0];
}
PatternHelper helper = null;
List<Pattern> patterns = null;
try {
// Visitor
Set<String> patternIds = null;
IResourceDelta delta = getDelta(project);
// Analyse delta
if (delta != null && delta.getKind() != IResourceDelta.NO_CHANGE) {
PatternVisitor patternVisitor = new PatternVisitor();
delta.accept(patternVisitor);
patternIds = patternVisitor.getPatternId2translate();
// Nothing to do
if (patternIds.isEmpty()) {
return null;
}
}
// Check
if (monitor.isCanceled()) {
throw new OperationCanceledException();
}
// At this stage, either delta is null or patternIds are not empty
// Collect patterns
helper = PatternHelper.createCollector();
patterns = helper.getPatterns(project, patternIds);
// if (patternIds != null && patterns.size() != patternIds.size())
// Activator.getDefault().logWarning(Messages.PatternBuilding_warning);
// Translate
ParameterTypeHelper.INSTANCE.clearProxies();
if (delta != null) {
TranslationHelper.translate(monitor, patterns);
} else {
TranslationHelper.translate(monitor, new HashSet<Pattern>(patterns));
}
} catch (OperationCanceledException oce) {
throw oce;
} catch (Throwable t) {
// log the error instead of throwing a CoreException
EGFPatternPlugin.getDefault().logError(EGFPatternMessages.PatternBuilding_Failed, t);
} finally {
monitor.done();
if (helper != null) {
helper.clear();
}
if (patterns != null) {
patterns.clear();
}
ParameterTypeHelper.INSTANCE.clearProxies();
}
return null;
}
}