/******************************************************************************* * Copyright (c) 2010 Eteration A.S. and others. * 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: * IBM Corporation - initial API and implementation * - This code is based on WTP SDK frameworks and Tomcat Server Adapters * org.eclipse.jst.server.core * org.eclipse.jst.server.ui * * Naci Dai and Murat Yener, Eteration A.S. *******************************************************************************/ package org.eclipse.libra.framework.core; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.model.IProcess; import org.eclipse.wst.server.core.IServer; /** * Thread used to ping server to test when it is started. */ public class PingThread { // delay before pinging starts private static final int PING_DELAY = 2000; // delay between pings private static final int PING_INTERVAL = 250; // maximum number of pings before giving up private int maxPings; private boolean stop = false; private IServer server; private ILaunch launch; private OSGIFrameworkInstanceBehaviorDelegate behaviour; /** * Create a new PingThread. * * @param server * @param url * @param maxPings * the maximum number of times to try pinging, or -1 to continue * forever * @param behaviour */ public PingThread(ILaunch launch, IServer server, String url, int maxPings, OSGIFrameworkInstanceBehaviorDelegate behaviour) { super(); this.server = server; this.maxPings = maxPings; this.behaviour = behaviour; this.launch = launch; Thread t = new Thread("OSGi Framework Launchers Ping Thread") { @Override public void run() { ping(); } }; t.setDaemon(true); t.start(); } /** * Ping the server until it is started. Then set the server state to * STATE_STARTED. */ protected void ping() { int count = 0; try { Thread.sleep(PING_DELAY); } catch (Exception e) { // ignore } while (!stop) { try { if (count == maxPings) { try { server.stop(false); } catch (Exception e) { Trace.trace(Trace.FINEST, "Ping: could not stop server"); } stop(); break; } count++; if (launch.isTerminated()) { behaviour.stop(true); server.stop(true); stop = true; break; } Trace.trace(Trace.FINEST, "Ping: pinging " + count); IProcess[] procs = launch.getProcesses(); if (procs != null && procs.length > 0) { if (!procs[0].isTerminated()) { behaviour.setServerStarted(); stop(); break; } } } catch (Exception e) { Trace.trace(Trace.FINEST, "Ping: failed"); // pinging failed if (!stop) { try { Thread.sleep(PING_INTERVAL); } catch (InterruptedException e2) { // need not be handled } } } } stop = true; } /** * Tell the pinging to stop. */ public void stop() { Trace.trace(Trace.FINEST, "Ping: stopping"); stop = true; } }