/******************************************************************************* * Copyright (c) 2009, 2015 Alena Laskavaia * 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: * Alena Laskavaia - initial API and implementation * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.codan.internal.core; import java.util.Map; import org.eclipse.cdt.codan.core.model.CheckerLaunchMode; import org.eclipse.cdt.codan.core.model.ICodanBuilder; 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; /** * Implementation of {@link ICodanBuilder} */ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBuilder { /** * Codan builder id */ public static final String BUILDER_ID = "org.eclipse.cdt.codan.core.codanBuilder"; //$NON-NLS-1$ private boolean enabled = true; { if (Boolean.valueOf(System.getProperty("codan.disabled"))) { //$NON-NLS-1$ enabled = false; } } private class CodanDeltaVisitor implements IResourceDeltaVisitor { private IProgressMonitor monitor; public CodanDeltaVisitor(IProgressMonitor monitor) { this.monitor = monitor; } @Override public boolean visit(IResourceDelta delta) throws CoreException { IResource resource = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.ADDED: // Handle added resource processResourceDelta(resource, monitor); break; case IResourceDelta.REMOVED: // Handle removed resource break; case IResourceDelta.CHANGED: // Handle changed resource processResourceDelta(resource, monitor); break; } // Return true to continue visiting children. return true; } } @SuppressWarnings("rawtypes") @Override protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { if (!enabled) return null; if (kind == FULL_BUILD) { fullBuild(monitor); } else { IResourceDelta delta = getDelta(getProject()); if (delta == null) { fullBuild(monitor); } else { incrementalBuild(delta, monitor); } } return null; } @Override public void processResource(IResource resource, IProgressMonitor monitor) { processResource(resource, monitor, CheckerLaunchMode.RUN_ON_FULL_BUILD); } /** * Run code analysis on given resource in a given mode * * @param resource - resource to process * @param monitor - progress monitor * @param mode - launch mode, @see {@link CheckerLaunchMode} * @since 2.0 */ @Override public void processResource(IResource resource, IProgressMonitor monitor, CheckerLaunchMode mode) { if (!enabled) return; CodanRunner.processResource(resource, mode, monitor); } private void processResourceDelta(IResource resource, IProgressMonitor monitor) { processResource(resource, monitor, CheckerLaunchMode.RUN_ON_INC_BUILD); } protected void fullBuild(final IProgressMonitor monitor) throws CoreException { processResource(getProject(), monitor); } protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { // The visitor does the work. delta.accept(new CodanDeltaVisitor(monitor)); } @Override public void processResource(IResource resource, IProgressMonitor monitor, CheckerLaunchMode mode, Object model) { if (!enabled) return; if (model != null) { if (mode == CheckerLaunchMode.RUN_AS_YOU_TYPE) CodanRunner.runInEditor(model, resource, monitor); else throw new IllegalArgumentException("This mode is not supported"); //$NON-NLS-1$ } else { processResource(resource, monitor, mode); } } /** * @return true if build is enable, i.e. running codan */ public boolean isEnabled() { return enabled; } /** * Globally disable/enable of running codan * @param enabled the enabled to set */ public void setEnabled(boolean enabled) { this.enabled = enabled; } }