/******************************************************************************* * Copyright (c) 2007-2014 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.test.util; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.jboss.tools.test.util.xpl.DisplayDelayHelper; /** * @author eskimo * */ public class JobUtils { private static final long MAX_IDLE = 20 * 60 * 1000L; private static final long DEFAULT_DELAY = 500; public static void waitForIdle() { waitForIdle(DEFAULT_DELAY); } public static void waitForIdle(long delay) { waitForIdle(delay, MAX_IDLE); } public static void waitForIdle(long delay, long maxIdle) { long start = System.currentTimeMillis(); while (!isIdle()) { delay(delay); if ((System.currentTimeMillis() - start) > maxIdle) { Job[] jobs = Job.getJobManager().find(null); StringBuffer str = new StringBuffer(); for (Job job : jobs) { if (job.getThread() != null && !shouldIgnoreJob(job)) { str.append("\n").append(job.getName()).append(" (") .append(job.getClass()).append(")"); } } if (str.length() > 0) throw new RuntimeException( "Long running tasks detected:" + str.toString()); //$NON-NLS-1$ } } } private static boolean isIdle() { boolean isIdle = Job.getJobManager().isIdle(); if (!isIdle) { Job[] jobs = Job.getJobManager().find(null); for (Job job : jobs) { if (job.getState() == Job.SLEEPING) { continue; } if (!shouldIgnoreJob(job)) { return false; } } } return true; } // The list of non-build related long running jobs private static final String[] IGNORE_JOBS_NAMES = new String[] { "workbench auto-save job" }; /** * A workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=405456 in Eclipse 4.3.0M7 * (since -Dorg.eclipse.ui.testsDisableWorkbenchAutoSave=true option is not yet implemented in M7) * * @param job * @return */ private static boolean shouldIgnoreJob(Job job) { for (String name : IGNORE_JOBS_NAMES) { if (name != null && job != null && job.getName() != null && name.equalsIgnoreCase(job.getName().trim())) { System.out.println("Ignoring the non-build long running job: " + job.getName()); return true; } } return false; } public static void delay(long waitTimeMillis) { Display display = Display.getCurrent(); if(PlatformUI.isWorkbenchRunning() && display!= null) { DisplayDelayHelper delay = new DisplayDelayHelper(waitTimeMillis); delay.waitForCondition(display, waitTimeMillis); } else { // Otherwise, perform a simple sleep. try { Thread.sleep(waitTimeMillis); } catch (InterruptedException e) { // Ignored. } } } public static void runDeferredEvents() { while( Display.getCurrent().readAndDispatch()); } }