/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.start.common; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import de.rcenvironment.core.utils.common.StringUtils; /** * Utilities class to govern the RCE platform. * * @author Christian Weiss * @author Robert Mischke * @author Doreen Seider * @author David Scholz (minor change: added shutdown requested flag) */ public class Instance { private static Boolean isHeadless; private static Boolean shutdownRequested = false; private static CountDownLatch shutdownLatch = new CountDownLatch(1); private static InstanceRunner instanceRunner; protected Instance() {} /** * Returns whether the RCE instance is started in headless mode. * * @return <code>true</code> if started in headless mode, otherwise <code>false</code> * @throws IllegalStateException if mode not yet set */ public static boolean isHeadless() throws IllegalStateException { if (isHeadless == null) { throw new IllegalStateException("Internal error: Headless mode not yet set"); } return isHeadless; } /** * * Returns whether the RCE instance should be shutdown. This is used to indicate shutdown requests before the {@link InstanceRunner} is * created. * * @return <code>true</code> if shutdown is requested, otherwise <code>false</code> * @throws IllegalStateException if shutdown is requested flag not yet set */ public static boolean isShutdownRequested() { return shutdownRequested; } /** * Sets whether this RCE instance is started in headless mode. * * @param isHeadlessOn <code>true</code> if started in headless mode, otherwise <code>false</code> * @throws IllegalStateException if method is called to change the mode already set */ public static void setHeadless(boolean isHeadlessOn) throws IllegalStateException { if (isHeadless != null && isHeadlessOn != isHeadless) { throw new IllegalStateException(StringUtils.format("Tried to set the headless mode of this instance to '%s'," + " but it was already set to '%s'", isHeadlessOn, isHeadless)); } isHeadless = isHeadlessOn; } /** * Injects the {@link InstanceRunner} to use for startup. Trying to call this method twice throws an exception (to detect invalid * setups). * * @param runner instance runner to inject * @throws IllegalStateException if this method is called twice (to detect invalid setups) */ public static synchronized void setInstanceRunner(InstanceRunner runner) throws IllegalStateException { if (instanceRunner != null) { throw new IllegalStateException(StringUtils.format("Tried to set instance runner '%s' when one is already configured: '%s'", runner, instanceRunner)); } instanceRunner = runner; } /** * Fetches the {@link InstanceRunner} to use for startup. * * @return the runner instance (guaranteed to be non-null) * @throws IllegalStateException if not instance runner not yet set */ public static synchronized InstanceRunner getInstanceRunner() throws IllegalStateException { if (instanceRunner == null) { throw new IllegalStateException("Internal error: No instance runner configured"); } return instanceRunner; } /** * Waits for the RCE instance to shut down. * * @throws InterruptedException if the current thread is interrupted while waiting */ public static void awaitShutdown() throws InterruptedException { shutdownLatch.await(); } /** * Waits for the RCE instance to shut down. * * @param timeout the amount of time to wait * @param unit the time unit of the timeout argument * @throws InterruptedException if the current thread is interrupted while waiting */ public static void awaitShutdown(final long timeout, final TimeUnit unit) throws InterruptedException { getInstanceRunner().beforeAwaitShutdown(); shutdownLatch.await(timeout, unit); } /** * Shuts down the RCE instance. */ public static void shutdown() { shutdownLatch.countDown(); if (instanceRunner == null) { shutdownRequested = true; } else { getInstanceRunner().triggerShutdown(); } } /** * Return whether or not the RCE instance has been shut down. * * @return <code>true</code> if the RCE instance has been shut down, otherwise <code>false</code> */ public static boolean isShutdown() { return shutdownLatch.getCount() == 0; } protected static void resetShutdown() { shutdownLatch = new CountDownLatch(1); } /** * Restarts the RCE instance. */ public static void restart() { getInstanceRunner().triggerRestart(); } }