package org.projectusus.core.internal; import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD; import static org.eclipse.core.resources.IncrementalProjectBuilder.INCREMENTAL_BUILD; import static org.eclipse.core.resources.ResourcesPlugin.FAMILY_AUTO_BUILD; import static org.eclipse.core.resources.ResourcesPlugin.FAMILY_AUTO_REFRESH; import static org.eclipse.core.resources.ResourcesPlugin.FAMILY_MANUAL_BUILD; import static org.eclipse.core.resources.ResourcesPlugin.getWorkspace; import static org.eclipse.core.runtime.jobs.Job.getJobManager; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.junit.rules.ExternalResource; import org.projectusus.adapter.UsusAdapterPlugin; import org.projectusus.core.statistics.UsusModelProvider; public class Workspace extends ExternalResource { @Override protected void before() throws Throwable { UsusAdapterPlugin.getDefault(); // to load bundle with ResourceChangeListener } @Override protected void after() { UsusModelProvider.clear(); } public void buildFullyAndWait() throws CoreException { buildAndWait( FULL_BUILD, "full" ); } public void buildIncrementallyAndWait() throws CoreException { buildAndWait( INCREMENTAL_BUILD, "incremental" ); } private void buildAndWait( int kind, String description ) throws CoreException { getWorkspace().build( kind, new NullProgressMonitor() ); print( " Waiting for " + description + " build to complete ..." ); waitForBuild(); } private void waitForBuild() { boolean retry = true; while( retry ) { try { getJobManager().join( FAMILY_AUTO_REFRESH, new NullProgressMonitor() ); getJobManager().join( FAMILY_AUTO_BUILD, new NullProgressMonitor() ); getJobManager().join( FAMILY_MANUAL_BUILD, new NullProgressMonitor() ); retry = false; } catch( Exception exc ) { // ignore and retry } } println( " OK." ); } private void print( String message ) { System.out.print( message ); System.out.flush(); } private void println( String message ) { System.out.println( message ); } }