From 8e7d3d36bbee35e07db9f98b8ff0ec92284b09f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Tue, 18 Jul 2017 16:23:42 +0200 Subject: [PATCH] SONAR-8798 rename ProcessMonitorImpl to ProcessCommandsProcessMonitor and extract abstract class AbstractProcessMonitor --- ...rImpl.java => AbstractProcessMonitor.java} | 61 ++++------------- .../ProcessCommandsProcessMonitor.java | 68 +++++++++++++++++++ .../process/ProcessLauncherImpl.java | 2 +- .../application/process/ProcessMonitor.java | 12 ++-- ...=> ProcessCommandsProcessMonitorTest.java} | 11 ++- 5 files changed, 95 insertions(+), 59 deletions(-) rename server/sonar-process-monitor/src/main/java/org/sonar/application/process/{ProcessMonitorImpl.java => AbstractProcessMonitor.java} (68%) create mode 100644 server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java rename server/sonar-process-monitor/src/test/java/org/sonar/application/process/{ProcessMonitorImplTest.java => ProcessCommandsProcessMonitorTest.java} (86%) diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitorImpl.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java similarity index 68% rename from server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitorImpl.java rename to server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java index 26b62f134ad..596db4939c5 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitorImpl.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/AbstractProcessMonitor.java @@ -24,80 +24,47 @@ import java.io.IOException; import java.io.InputStream; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; -import org.sonar.process.ProcessCommands; -import static java.util.Objects.requireNonNull; +abstract class AbstractProcessMonitor implements ProcessMonitor { + protected final Process process; -class ProcessMonitorImpl implements ProcessMonitor { - - private final Process process; - private final ProcessCommands commands; - - ProcessMonitorImpl(Process process, ProcessCommands commands) { - this.process = requireNonNull(process, "process can't be null"); - this.commands = requireNonNull(commands, "commands can't be null"); + protected AbstractProcessMonitor(Process process) { + this.process = process; } - @Override public InputStream getInputStream() { return process.getInputStream(); } - @Override public void closeStreams() { closeQuietly(process.getInputStream()); closeQuietly(process.getOutputStream()); closeQuietly(process.getErrorStream()); } - @Override + private static void closeQuietly(@Nullable Closeable closeable) { + try { + if (closeable != null) { + closeable.close(); + } + } catch (IOException ignored) { + // ignore + } + } + public boolean isAlive() { return process.isAlive(); } - @Override public void destroyForcibly() { process.destroyForcibly(); } - @Override public void waitFor() throws InterruptedException { process.waitFor(); } - @Override public void waitFor(long timeout, TimeUnit unit) throws InterruptedException { process.waitFor(timeout, unit); } - - @Override - public boolean isOperational() { - return commands.isOperational(); - } - - @Override - public void askForStop() { - commands.askForStop(); - } - - @Override - public boolean askedForRestart() { - return commands.askedForRestart(); - } - - @Override - public void acknowledgeAskForRestart() { - commands.acknowledgeAskForRestart(); - } - - private static void closeQuietly(@Nullable Closeable closeable) { - try { - if (closeable != null) { - closeable.close(); - } - } catch (IOException ignored) { - // ignore - } - } - } diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java new file mode 100644 index 00000000000..734ce60c681 --- /dev/null +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessCommandsProcessMonitor.java @@ -0,0 +1,68 @@ +/* + * SonarQube + * Copyright (C) 2009-2017 SonarSource SA + * mailto:info AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +package org.sonar.application.process; + +import org.sonar.process.ProcessCommands; + +import static java.util.Objects.requireNonNull; + +class ProcessCommandsProcessMonitor extends AbstractProcessMonitor { + + private final ProcessCommands commands; + + ProcessCommandsProcessMonitor(Process process, ProcessCommands commands) { + super(process); + this.commands = requireNonNull(commands, "commands can't be null"); + } + + /** + * Whether the process has set the operational flag (in ipc shared memory) + */ + @Override + public boolean isOperational() { + return commands.isOperational(); + } + + /** + * Send request to gracefully stop to the process (via ipc shared memory) + */ + @Override + public void askForStop() { + commands.askForStop(); + } + + /** + * Whether the process asked for a full restart (via ipc shared memory) + */ + @Override + public boolean askedForRestart() { + return commands.askedForRestart(); + } + + /** + * Removes the flag in ipc shared memory so that next call to {@link #askedForRestart()} + * returns {@code false}, except if meanwhile process asks again for restart. + */ + @Override + public void acknowledgeAskForRestart() { + commands.acknowledgeAskForRestart(); + } + +} diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java index c84bcfb5ad8..a952fae822a 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessLauncherImpl.java @@ -72,7 +72,7 @@ public class ProcessLauncherImpl implements ProcessLauncher { ProcessBuilder processBuilder = create(javaCommand); LOG.info("Launch process[{}]: {}", javaCommand.getProcessId().getKey(), String.join(" ", processBuilder.command())); process = processBuilder.start(); - return new ProcessMonitorImpl(process, commands); + return new ProcessCommandsProcessMonitor(process, commands); } catch (Exception e) { // just in case diff --git a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java index 299abfefe2e..81260cf5ec6 100644 --- a/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java +++ b/server/sonar-process-monitor/src/main/java/org/sonar/application/process/ProcessMonitor.java @@ -58,23 +58,25 @@ public interface ProcessMonitor { void waitFor(long timeout, TimeUnit timeoutUnit) throws InterruptedException; /** - * Whether the process has set the operational flag (in ipc shared memory) + * Whether the process has reach operational state after startup. */ boolean isOperational(); /** - * Send request to gracefully stop to the process (via ipc shared memory) + * Send request to gracefully stop to the process */ void askForStop(); /** - * Whether the process asked for a full restart (via ipc shared memory) + * Whether the process asked for a full restart */ boolean askedForRestart(); /** - * Removes the flag in ipc shared memory so that next call to {@link #askedForRestart()} - * returns {@code false}, except if meanwhile process asks again for restart. + * Sends a signal to the process to acknowledge that the parent process received the request to restart from the + * child process send via {@link #askedForRestart()}. + *
+ * Child process will typically stop sending the signal requesting restart from now on. */ void acknowledgeAskForRestart(); diff --git a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessMonitorImplTest.java b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java similarity index 86% rename from server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessMonitorImplTest.java rename to server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java index f1644b9c808..e8e5c63e47a 100644 --- a/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessMonitorImplTest.java +++ b/server/sonar-process-monitor/src/test/java/org/sonar/application/process/ProcessCommandsProcessMonitorTest.java @@ -24,7 +24,6 @@ import java.io.InputStream; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.mockito.Mockito; -import org.sonar.application.process.ProcessMonitorImpl; import org.sonar.process.ProcessCommands; import static org.assertj.core.api.Assertions.assertThat; @@ -35,14 +34,14 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -public class ProcessMonitorImplTest { +public class ProcessCommandsProcessMonitorTest { @Test public void ProcessMonitorImpl_is_a_proxy_of_Process() throws Exception { Process process = mock(Process.class, RETURNS_DEEP_STUBS); ProcessCommands commands = mock(ProcessCommands.class, RETURNS_DEEP_STUBS); - ProcessMonitorImpl underTest = new ProcessMonitorImpl(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); underTest.waitFor(); verify(process).waitFor(); @@ -69,7 +68,7 @@ public class ProcessMonitorImplTest { Process process = mock(Process.class, RETURNS_DEEP_STUBS); ProcessCommands commands = mock(ProcessCommands.class, RETURNS_DEEP_STUBS); - ProcessMonitorImpl underTest = new ProcessMonitorImpl(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); underTest.askForStop(); verify(commands).askForStop(); @@ -90,7 +89,7 @@ public class ProcessMonitorImplTest { Process process = mock(Process.class); when(process.getInputStream()).thenReturn(null); - ProcessMonitorImpl underTest = new ProcessMonitorImpl(process, commands); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, commands); // no failures underTest.closeStreams(); @@ -103,7 +102,7 @@ public class ProcessMonitorImplTest { Process process = mock(Process.class); when(process.getInputStream()).thenReturn(stream); - ProcessMonitorImpl underTest = new ProcessMonitorImpl(process, mock(ProcessCommands.class, Mockito.RETURNS_MOCKS)); + ProcessCommandsProcessMonitor underTest = new ProcessCommandsProcessMonitor(process, mock(ProcessCommands.class, Mockito.RETURNS_MOCKS)); // no failures underTest.closeStreams(); -- 2.39.5