You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2015/02/26 11:42:20 UTC
[4/4] karaf git commit: [KARAF-2456] Shutdown is stuck after
wrapper:install
[KARAF-2456] Shutdown is stuck after wrapper:install
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/e2047825
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/e2047825
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/e2047825
Branch: refs/heads/karaf-2.x
Commit: e20478254ca153e7daf2f7bb144283ef71d95b6a
Parents: 4275e6d
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Thu Feb 26 08:44:04 2015 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Thu Feb 26 11:41:57 2015 +0100
----------------------------------------------------------------------
.../karaf/shell/wrapper/InstallCommand.java | 8 +-
.../karaf/shell/wrapper/PumpStreamHandler.java | 241 -------------------
.../karaf/shell/wrapper/StreamPumper.java | 191 ---------------
3 files changed, 1 insertion(+), 439 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/e2047825/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
----------------------------------------------------------------------
diff --git a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java b/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
index 99af6c9..94c2473 100644
--- a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
+++ b/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/InstallCommand.java
@@ -392,13 +392,7 @@ public class InstallCommand extends AbstractAction {
ProcessBuilder builder = new ProcessBuilder();
builder.command("chmod", mode, serviceFile.getCanonicalPath());
Process p = builder.start();
-
- PumpStreamHandler handler = new PumpStreamHandler(System.in, System.out, System.err);
- handler.attach(p);
- handler.start();
- int status = p.waitFor();
- handler.stop();
- return status;
+ return p.waitFor();
}
private void createJar(File outFile, String resource) throws Exception {
http://git-wip-us.apache.org/repos/asf/karaf/blob/e2047825/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
----------------------------------------------------------------------
diff --git a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java b/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
deleted file mode 100644
index 80e64e1..0000000
--- a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/PumpStreamHandler.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies standard output and error of children streams to standard output and error of the parent.
- */
-public class PumpStreamHandler {
-
- private final InputStream in;
-
- private final OutputStream out;
-
- private final OutputStream err;
-
- private final String name;
-
- private StreamPumper outputPump;
-
- private StreamPumper errorPump;
-
- private StreamPumper inputPump;
-
- //
- // NOTE: May want to use a ThreadPool here, 3 threads per/pair seems kinda expensive :-(
- //
-
- public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err, String name) {
- assert in != null;
- assert out != null;
- assert err != null;
- assert name != null;
-
- this.in = in;
- this.out = out;
- this.err = err;
- this.name = name;
- }
-
- public PumpStreamHandler(final InputStream in, final OutputStream out, final OutputStream err) {
- this(in, out, err, "<unknown>");
- }
-
- public PumpStreamHandler(final OutputStream out, final OutputStream err) {
- this(null, out, err);
- }
-
- public PumpStreamHandler(final OutputStream outAndErr) {
- this(outAndErr, outAndErr);
- }
-
- /**
- * Set the input stream from which to read the standard output of the child.
- */
- public void setChildOutputStream(final InputStream in) {
- assert in != null;
-
- createChildOutputPump(in, out);
- }
-
- /**
- * Set the input stream from which to read the standard error of the child.
- */
- public void setChildErrorStream(final InputStream in) {
- assert in != null;
-
- if (err != null) {
- createChildErrorPump(in, err);
- }
- }
-
- /**
- * Set the output stream by means of which input can be sent to the child.
- */
- public void setChildInputStream(final OutputStream out) {
- assert out != null;
-
- if (in != null) {
- inputPump = createInputPump(in, out, true);
- }
- else {
- try {
- out.close();
- } catch (IOException e) { }
- }
- }
-
- /**
- * Attach to a child streams from the given process.
- *
- * @param p The process to attach to.
- */
- public void attach(final Process p) {
- assert p != null;
-
- setChildInputStream(p.getOutputStream());
- setChildOutputStream(p.getInputStream());
- setChildErrorStream(p.getErrorStream());
- }
- /**
- * Start pumping the streams.
- */
- public void start() {
- if (outputPump != null) {
- Thread thread = new Thread(outputPump);
- thread.setDaemon(true);
- thread.setName("Output pump for " + this.name);
- thread.start();
- }
-
- if (errorPump != null) {
- Thread thread = new Thread(errorPump);
- thread.setDaemon(true);
- thread.setName("Error pump for " + this.name);
- thread.start();
- }
-
- if (inputPump != null) {
- Thread thread = new Thread(inputPump);
- thread.setDaemon(true);
- thread.setName("Input pump for " + this.name);
- thread.start();
- }
- }
-
- /**
- * Stop pumping the streams.
- */
- public void stop() {
- if (outputPump != null) {
- try {
- outputPump.stop();
- outputPump.waitFor();
- }
- catch (InterruptedException e) {
- // ignore
- }
- }
-
- if (errorPump != null) {
- try {
- errorPump.stop();
- errorPump.waitFor();
- }
- catch (InterruptedException e) {
- // ignore
- }
- }
-
- if (inputPump != null) {
- inputPump.stop();
- }
-
- try {
- err.flush();
- } catch (IOException e) { }
- try {
- out.flush();
- } catch (IOException e) { }
- }
-
- /**
- * Create the pump to handle child output.
- */
- protected void createChildOutputPump(final InputStream in, final OutputStream out) {
- assert in != null;
- assert out != null;
-
- outputPump = createPump(in, out);
- }
-
- /**
- * Create the pump to handle error output.
- */
- protected void createChildErrorPump(final InputStream in, final OutputStream out) {
- assert in != null;
- assert out != null;
-
- errorPump = createPump(in, out);
- }
-
- /**
- * Creates a stream pumper to copy the given input stream to the given output stream.
- */
- protected StreamPumper createPump(final InputStream in, final OutputStream out) {
- assert in != null;
- assert out != null;
-
- return createPump(in, out, false);
- }
-
- /**
- * Creates a stream pumper to copy the given input stream to the
- * given output stream.
- *
- * @param in The input stream to copy from.
- * @param out The output stream to copy to.
- * @param closeWhenExhausted If true close the inputstream.
- * @return A thread object that does the pumping.
- */
- protected StreamPumper createPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
- assert in != null;
- assert out != null;
-
- StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
- return pumper;
- }
-
- /**
- * Creates a stream pumper to copy the given input stream to the
- * given output stream. Used for standard input.
- */
- protected StreamPumper createInputPump(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
- assert in != null;
- assert out != null;
-
- StreamPumper pumper = new StreamPumper(in, out, closeWhenExhausted);
- pumper.setAutoflush(true);
- return pumper;
- }
-}
http://git-wip-us.apache.org/repos/asf/karaf/blob/e2047825/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
----------------------------------------------------------------------
diff --git a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java b/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
deleted file mode 100644
index e4e26a4..0000000
--- a/shell/wrapper/src/main/java/org/apache/karaf/shell/wrapper/StreamPumper.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.karaf.shell.wrapper;
-
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.IOException;
-
-/**
- * Copies all data from an input stream to an output stream.
- */
-public class StreamPumper implements Runnable {
-
- private InputStream in;
-
- private OutputStream out;
-
- private volatile boolean finish;
-
- private volatile boolean finished;
-
- private boolean closeWhenExhausted;
-
- private boolean autoflush;
-
- private Exception exception;
-
- private int bufferSize = 128;
-
- private boolean started;
-
- /**
- * Create a new stream pumper.
- *
- * @param in Input stream to read data from
- * @param out Output stream to write data to.
- * @param closeWhenExhausted If true, the output stream will be closed when
- * the input is exhausted.
- */
- public StreamPumper(final InputStream in, final OutputStream out, final boolean closeWhenExhausted) {
- assert in != null;
- assert out != null;
-
- this.in = in;
- this.out = out;
- this.closeWhenExhausted = closeWhenExhausted;
- }
-
- /**
- * Create a new stream pumper.
- *
- * @param in Input stream to read data from
- * @param out Output stream to write data to.
- */
- public StreamPumper(final InputStream in, final OutputStream out) {
- this(in, out, false);
- }
-
- /**
- * Set whether data should be flushed through to the output stream.
- *
- * @param autoflush If true, push through data; if false, let it be buffered
- */
- public void setAutoflush(boolean autoflush) {
- this.autoflush = autoflush;
- }
-
- /**
- * Copies data from the input stream to the output stream.
- *
- * Terminates as soon as the input stream is closed or an error occurs.
- */
- public void run() {
- synchronized (this) {
- started = true;
- }
- finished = false;
- finish = false;
-
- final byte[] buf = new byte[bufferSize];
-
- int length;
- try {
- while ((length = in.read(buf)) > 0 && !finish) {
- out.write(buf, 0, length);
- if (autoflush) {
- out.flush();
- }
- }
- out.flush();
- }
- catch (Exception e) {
- synchronized (this) {
- exception = e;
- }
- }
- finally {
- if (closeWhenExhausted) {
- try {
- out.close();
- } catch (IOException e) { }
- }
- finished = true;
-
- synchronized (this) {
- notifyAll();
- }
- }
- }
-
- /**
- * Tells whether the end of the stream has been reached.
- *
- * @return true If the stream has been exhausted.
- */
- public boolean isFinished() {
- return finished;
- }
-
- /**
- * This method blocks until the stream pumper finishes.
- *
- * @see #isFinished()
- */
- public synchronized void waitFor() throws InterruptedException {
- while (!isFinished()) {
- wait();
- }
- }
-
- /**
- * Set the size in bytes of the read buffer.
- *
- * @param bufferSize the buffer size to use.
- * @throws IllegalStateException if the StreamPumper is already running.
- */
- public synchronized void setBufferSize(final int bufferSize) {
- if (started) {
- throw new IllegalStateException("Cannot set buffer size on a running StreamPumper");
- }
-
- this.bufferSize = bufferSize;
- }
-
- /**
- * Get the size in bytes of the read buffer.
- *
- * @return The size of the read buffer.
- */
- public synchronized int getBufferSize() {
- return bufferSize;
- }
-
- /**
- * Get the exception encountered, if any.
- *
- * @return The Exception encountered; or null if there was none.
- */
- public synchronized Exception getException() {
- return exception;
- }
-
- /**
- * Stop the pumper as soon as possible.
- *
- * Note that it may continue to block on the input stream
- * but it will really stop the thread as soon as it gets EOF
- * or any byte, and it will be marked as finished.
- */
- public synchronized void stop() {
- finish = true;
-
- notifyAll();
- }
-}