/*******************************************************************************
* Copyright (c) 2007 Alphonse Van Assche.
* 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:
* Alphonse Van Assche - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpm.rpmlint.builder;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceDelta;
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.linuxtools.internal.rpm.rpmlint.Activator;
import org.eclipse.linuxtools.internal.rpm.rpmlint.parser.RpmlintItem;
import org.eclipse.linuxtools.internal.rpm.rpmlint.parser.RpmlintParser;
/**
* Project builder responsible for invoking rpmlint and processing it's
* response.
*/
public class RpmlintBuilder extends IncrementalProjectBuilder {
/**
* Total number of chunks to divede the work in.
*/
public static final int MAX_WORKS = 100;
/**
* ID for this builder.
*/
public static final String BUILDER_ID = Activator.PLUGIN_ID
+ ".rpmlintBuilder"; //$NON-NLS-1$
/**
* ID for rpmlint marker problems.
*/
public static final String MARKER_ID = Activator.PLUGIN_ID
+ ".rpmlintProblem"; //$NON-NLS-1$
@Override
protected IProject[] build(int kind, Map<String, String> args,
IProgressMonitor monitor) throws CoreException {
// TODO: handle the monitor in a more clean way.
monitor.beginTask(Messages.RpmlintBuilder_0, MAX_WORKS);
monitor.worked(20);
if (kind == FULL_BUILD) {
fullBuild(monitor);
} else {
IResourceDelta delta = getDelta(getProject());
if (delta == null) {
fullBuild(monitor);
} else {
incrementalBuild(delta, monitor);
}
}
return null;
}
private void fullBuild(IProgressMonitor monitor) throws CoreException {
RpmlintPreVisitor resourceVisitor = new RpmlintPreVisitor();
getProject().accept(resourceVisitor);
checkCancel(monitor);
monitor.worked(50);
monitor.setTaskName(Messages.RpmlintBuilder_1);
List<RpmlintItem> rpmlintItems = RpmlintParser
.parseVisisted(resourceVisitor.getVisitedPaths());
visitAndMarkRpmlintItems(monitor, rpmlintItems);
}
private void incrementalBuild(IResourceDelta delta,
IProgressMonitor monitor) throws CoreException {
RpmlintDeltaVisitor deltaVisitor = new RpmlintDeltaVisitor();
delta.accept(deltaVisitor);
monitor.worked(50);
monitor.setTaskName(Messages.RpmlintBuilder_1);
List<RpmlintItem> rpmlintItems = RpmlintParser
.parseVisisted(deltaVisitor.getVisitedPaths());
visitAndMarkRpmlintItems(monitor, rpmlintItems);
}
private void visitAndMarkRpmlintItems(IProgressMonitor monitor,
List<RpmlintItem> rpmlintItems) throws CoreException {
if (rpmlintItems.size() > 0) {
checkCancel(monitor);
monitor.worked(70);
monitor.setTaskName(Messages.RpmlintBuilder_2);
getProject().accept(new RpmlintMarkerVisitor(rpmlintItems));
monitor.worked(MAX_WORKS);
}
}
private static void checkCancel(IProgressMonitor monitor) {
if (monitor.isCanceled()) {
throw new OperationCanceledException();
}
}
}