// Copyright (c) 2009-2010 by the projectusus.org contributors // This software is released under the terms and conditions // of the Eclipse Public License (EPL) 1.0. // See http://www.eclipse.org/legal/epl-v10.html for details. package org.projectusus.adapter; import static org.projectusus.adapter.TracingOption.SQI; import java.util.Collection; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.projectusus.core.ExtensionCollector; import org.projectusus.core.IUsusModelForAdapter; import org.projectusus.core.basis.YellowCountCache; import org.projectusus.core.metrics.MetricsCollector; import org.projectusus.core.proportions.rawdata.jdtdriver.JavaFileDriver; import org.projectusus.core.statistics.UsusModelProvider; import org.projectusus.core.util.FileSupport; public class JDTDriver { private final IUsusModelForAdapter model; private final ICodeProportionComputationTarget target; private Set<MetricsCollector> allExtensions; public JDTDriver( ICodeProportionComputationTarget target ) { model = UsusModelProvider.ususModelForAdapter(); this.target = target; } public void run( IProgressMonitor monitor ) throws CoreException { for( IProject removedProject : target.getRemovedProjects() ) { model.dropRawData( removedProject ); YellowCountCache.yellowCountCache().clear( removedProject ); } monitor.beginTask( null, countTicks( target.getProjects() ) ); for( IProject project : target.getProjects() ) { monitor.subTask( project.getName() ); for( IFile removedFile : target.getRemovedFiles( project ) ) { model.dropRawData( removedFile ); } YellowCountCache.yellowCountCache().add( project ); computeChangedFiles( allExtensions(), project, monitor ); } monitor.done(); } private Set<MetricsCollector> allExtensions() { if( allExtensions == null ) { allExtensions = new ExtensionCollector<MetricsCollector>( MetricsCollector.EXTENSION_POINT_ID ).allExtensions(); } return allExtensions; } private int countTicks( Collection<IProject> projects ) throws CoreException { int result = 0; for( IProject project : projects ) { result += target.getFiles( project ).size(); } return result; } private void computeChangedFiles( Set<MetricsCollector> metricsExtensions, IProject project, IProgressMonitor monitor ) throws CoreException { Collection<IFile> files = target.getFiles( project ); if( !files.isEmpty() ) { StatusCollector statusCollector = new StatusCollector(); runDriver( metricsExtensions, project, files, statusCollector, monitor ); statusCollector.finish(); } } private void runDriver( Set<MetricsCollector> metricsExtensions, IProject project, Collection<IFile> files, StatusCollector statusCollector, IProgressMonitor monitor ) { computationStarted( project ); for( IFile file : files ) { fileStarted( file ); runDriverOnFile( metricsExtensions, file, statusCollector, monitor ); } } private void runDriverOnFile( Set<MetricsCollector> metricsExtensions, IFile file, StatusCollector statusCollector, IProgressMonitor monitor ) { try { if( FileSupport.isJavaFile( file ) && file.exists() ) { new JavaFileDriver( file ).compute( metricsExtensions ); } } catch( Exception ex ) { statusCollector.add( ex ); } finally { monitor.worked( 1 ); } } private void computationStarted( IProject project ) { SQI.trace( "Computation started: " + project.toString() ); //$NON-NLS-1$ } private void fileStarted( IFile file ) { SQI.trace( "File started: " + file.getFullPath() ); //$NON-NLS-1$ model.dropRawData( file ); } }