package com.google.jstestdriver.idea.server; import com.intellij.openapi.application.ApplicationManager; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.concurrency.AsyncPromise; import org.jetbrains.concurrency.Promise; public class JstdServerRegistry { private static final JstdServerRegistry INSTANCE = new JstdServerRegistry(); private JstdServer myServer; @Nullable public JstdServer getServer() { return myServer; } @NotNull public Promise<JstdServer> restartServer(@NotNull final JstdServerSettings settings) { JstdServer server = myServer; final AsyncPromise<JstdServer> promise = new AsyncPromise<>(); if (server != null && server.isProcessRunning()) { server.addLifeCycleListener(new JstdServerLifeCycleAdapter() { @Override public void onServerStopped() { myServer = null; doStart(settings, promise); } }, ApplicationManager.getApplication()); server.shutdownAsync(); return promise; } else { doStart(settings, promise); } return promise; } @NotNull private Promise<JstdServer> doStart(@NotNull final JstdServerSettings settings, @NotNull final AsyncPromise<JstdServer> promise) { ApplicationManager.getApplication().executeOnPooledThread(() -> { try { final JstdServer server = new JstdServer(settings); UIUtil.invokeLaterIfNeeded(() -> { myServer = server; promise.setResult(server); }); } catch (final Exception e) { UIUtil.invokeLaterIfNeeded(() -> promise.setError(e)); } }); return promise; } @NotNull public static JstdServerRegistry getInstance() { return INSTANCE; } }