]> source.dussan.org Git - sonarqube.git/blob
1583a726a3007de7e8abe97f2d653256eee7375c
[sonarqube.git] /
1 /*
2  * SonarQube
3  * Copyright (C) 2009-2017 SonarSource SA
4  * mailto:info AT sonarsource DOT com
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20 package org.sonar.application.process;
21
22 import java.io.Closeable;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.util.concurrent.TimeUnit;
26 import javax.annotation.Nullable;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29 import org.sonar.process.ProcessId;
30
31 abstract class AbstractProcessMonitor implements ProcessMonitor {
32
33   private static final Logger LOG = LoggerFactory.getLogger(AbstractProcessMonitor.class);
34   private static final int EXPECTED_EXIT_VALUE = 0;
35
36   protected final Process process;
37   private final ProcessId processId;
38
39   protected AbstractProcessMonitor(Process process, ProcessId processId) {
40     this.process = process;
41     this.processId = processId;
42   }
43
44   public InputStream getInputStream() {
45     return process.getInputStream();
46   }
47
48   public InputStream getErrorStream() {
49     return process.getErrorStream();
50   }
51
52   public void closeStreams() {
53     closeQuietly(process.getInputStream());
54     closeQuietly(process.getOutputStream());
55     closeQuietly(process.getErrorStream());
56   }
57
58   private static void closeQuietly(@Nullable Closeable closeable) {
59     try {
60       if (closeable != null) {
61         closeable.close();
62       }
63     } catch (IOException ignored) {
64       // ignore
65     }
66   }
67
68   public boolean isAlive() {
69     return process.isAlive();
70   }
71
72   public void destroyForcibly() {
73     process.destroyForcibly();
74   }
75
76   public void waitFor() throws InterruptedException {
77     int exitValue = process.waitFor();
78     if (exitValue != EXPECTED_EXIT_VALUE) {
79       LOG.warn("Process exited with exit value [{}]: {}", processId.getKey(), exitValue);
80     } else {
81       LOG.debug("Process exited with exit value [{}]: {}", processId.getKey(), exitValue);
82     }
83   }
84
85   public void waitFor(long timeout, TimeUnit unit) throws InterruptedException {
86     process.waitFor(timeout, unit);
87   }
88 }