Remove use of org.bouncycastle.util.io.TeeOutputStream
Bug: 559106
Change-Id: Ife06f21a00d258780a2030745738194098c631cf
Signed-off-by: Michael Dardis <git@md-5.net>
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java
new file mode 100644
index 0000000..bb1c974
--- /dev/null
+++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/util/io/TeeOutputStreamTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020, Michael Dardis. and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+package org.eclipse.jgit.util.io;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import org.eclipse.jgit.lib.Constants;
+import org.junit.Test;
+
+public class TeeOutputStreamTest {
+
+ @Test
+ public void test() throws IOException {
+ byte[] data = Constants.encode("Hello World");
+
+ TestOutput first = new TestOutput();
+ TestOutput second = new TestOutput();
+ try (TeeOutputStream tee = new TeeOutputStream(first, second)) {
+ tee.write(data);
+ assertArrayEquals("Stream output must match", first.toByteArray(),
+ second.toByteArray());
+
+ tee.write(1);
+ assertArrayEquals("Stream output must match", first.toByteArray(),
+ second.toByteArray());
+
+ tee.write(data, 1, 4); // Test partial write methods
+ assertArrayEquals("Stream output must match", first.toByteArray(),
+ second.toByteArray());
+ }
+ assertTrue("First stream should be closed", first.closed);
+ assertTrue("Second stream should be closed", second.closed);
+ }
+
+ @Test
+ public void testCloseException() {
+ TestOutput first = new TestOutput() {
+ @Override
+ public void close() throws IOException {
+ throw new IOException();
+ }
+
+ };
+ TestOutput second = new TestOutput();
+
+ @SuppressWarnings("resource")
+ TeeOutputStream tee = new TeeOutputStream(first, second);
+ try {
+ tee.close();
+ } catch (IOException ex) {
+ // Expected from first closed
+ }
+ assertFalse("First stream should not be closed", first.closed);
+ assertTrue("Second stream should still be closed if first close failed",
+ second.closed);
+ }
+
+ private static class TestOutput extends ByteArrayOutputStream {
+
+ private boolean closed;
+
+ @Override
+ public void close() throws IOException {
+ closed = true;
+ super.close();
+ }
+ }
+
+}
diff --git a/org.eclipse.jgit/META-INF/MANIFEST.MF b/org.eclipse.jgit/META-INF/MANIFEST.MF
index 1fd2578..dbf122e 100644
--- a/org.eclipse.jgit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jgit/META-INF/MANIFEST.MF
@@ -172,7 +172,6 @@
org.bouncycastle.openpgp.operator;version="[1.61.0,2.0.0)",
org.bouncycastle.openpgp.operator.jcajce;version="[1.61.0,2.0.0)",
org.bouncycastle.util.encoders;version="[1.61.0,2.0.0)",
- org.bouncycastle.util.io;version="[1.61.0,2.0.0)",
org.slf4j;version="[1.7.0,2.0.0)",
org.xml.sax,
org.xml.sax.helpers
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
index ed9c38a..4059b16 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/hooks/GitHook.java
@@ -17,11 +17,11 @@
import java.io.UnsupportedEncodingException;
import java.util.concurrent.Callable;
-import org.bouncycastle.util.io.TeeOutputStream;
import org.eclipse.jgit.api.errors.AbortedByHookException;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.ProcessResult;
+import org.eclipse.jgit.util.io.TeeOutputStream;
/**
* Git can fire off custom scripts when certain important actions occur. These
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java
new file mode 100644
index 0000000..e6fdd70
--- /dev/null
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/util/io/TeeOutputStream.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2020, Michael Dardis. and others
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Distribution License v. 1.0 which is available at
+ * https://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+package org.eclipse.jgit.util.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * An output stream that writes all data to two streams.
+ *
+ * @since 5.7
+ */
+public class TeeOutputStream extends OutputStream {
+
+ private final OutputStream stream1;
+ private final OutputStream stream2;
+
+ /**
+ * Initialize a tee output stream.
+ *
+ * @param stream1 first output stream
+ * @param stream2 second output stream
+ */
+ public TeeOutputStream(OutputStream stream1, OutputStream stream2) {
+ this.stream1 = stream1;
+ this.stream2 = stream2;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void write(byte[] buf) throws IOException {
+ this.stream1.write(buf);
+ this.stream2.write(buf);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void write(byte[] buf, int off, int len) throws IOException {
+ this.stream1.write(buf, off, len);
+ this.stream2.write(buf, off, len);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void write(int b) throws IOException {
+ this.stream1.write(b);
+ this.stream2.write(b);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void flush() throws IOException {
+ this.stream1.flush();
+ this.stream2.flush();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void close() throws IOException {
+ try {
+ this.stream1.close();
+ } finally {
+ this.stream2.close();
+ }
+ }
+}