]> source.dussan.org Git - jgit.git/commitdiff
Expose an OutputStream from ReceivePack for sending client messages 70/5170/5
authorDave Borowitz <dborowitz@google.com>
Mon, 27 Feb 2012 19:54:19 +0000 (11:54 -0800)
committerShawn O. Pearce <spearce@spearce.org>
Thu, 1 Mar 2012 03:09:23 +0000 (19:09 -0800)
Callers may want to format and flush their own output, for example in a
PreReceiveHook that creates its own TextProgressMonitor. The actual
underlying msgOut can change over the lifetime of ReceivePack, so we
implement a small wrapper.

Change-Id: I57b6d6cad2542aaa93dcadc06cb3e933e81bcd3d

org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java

index 0bf84efd47f2b5ca071f57ff832243fad7049176..af42dee6e5fe6b7bcb311aee4591c95e09d3a93a 100644 (file)
@@ -157,6 +157,8 @@ public class ReceivePack {
 
        private OutputStream msgOut;
 
+       private final MessageOutputWrapper msgOutWrapper = new MessageOutputWrapper();
+
        private PacketLineIn pckIn;
 
        private PacketLineOut pckOut;
@@ -246,6 +248,52 @@ public class ReceivePack {
                }
        }
 
+       /**
+        * Output stream that wraps the current {@link #msgOut}.
+        * <p>
+        * We don't want to expose {@link #msgOut} directly because it can change
+        * several times over the course of a session.
+        */
+       private class MessageOutputWrapper extends OutputStream {
+               @Override
+               public void write(int ch) {
+                       if (msgOut != null) {
+                               try {
+                                       msgOut.write(ch);
+                               } catch (IOException e) {
+                                       // Ignore write failures.
+                               }
+                       }
+               }
+
+               @Override
+               public void write(byte[] b, int off, int len) {
+                       if (msgOut != null) {
+                               try {
+                                       msgOut.write(b, off, len);
+                               } catch (IOException e) {
+                                       // Ignore write failures.
+                               }
+                       }
+               }
+
+               @Override
+               public void write(byte[] b) {
+                       write(b, 0, b.length);
+               }
+
+               @Override
+               public void flush() {
+                       if (msgOut != null) {
+                               try {
+                                       msgOut.flush();
+                               } catch (IOException e) {
+                                       // Ignore write failures.
+                               }
+                       }
+               }
+       }
+
        /** @return the repository this receive completes into. */
        public final Repository getRepository() {
                return db;
@@ -542,12 +590,7 @@ public class ReceivePack {
                                advertiseError = new StringBuilder();
                        advertiseError.append(what).append('\n');
                } else {
-                       try {
-                               if (msgOut != null)
-                                       msgOut.write(Constants.encode("error: " + what + "\n"));
-                       } catch (IOException e) {
-                               // Ignore write failures.
-                       }
+                       msgOutWrapper.write(Constants.encode("error: " + what + "\n"));
                }
        }
 
@@ -562,12 +605,12 @@ public class ReceivePack {
         *            string must not end with an LF, and must not contain an LF.
         */
        public void sendMessage(final String what) {
-               try {
-                       if (msgOut != null)
-                               msgOut.write(Constants.encode(what + "\n"));
-               } catch (IOException e) {
-                       // Ignore write failures.
-               }
+               msgOutWrapper.write(Constants.encode(what + "\n"));
+       }
+
+       /** @return an underlying stream for sending messages to the client. */
+       public OutputStream getMessageOutputStream() {
+               return msgOutWrapper;
        }
 
        /**