/*******************************************************************************
 * Copyright (c) 2000, 2020 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.debug.internal.core;

import java.io.IOException;
import java.io.InputStream;

import org.eclipse.debug.core.IBinaryStreamListener;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.model.IBinaryStreamMonitor;
import org.eclipse.debug.core.model.IBinaryStreamsProxy;
import org.eclipse.debug.core.model.IStreamMonitor;

public class NullStreamsProxy implements IBinaryStreamsProxy {
	private NullStreamMonitor outputStreamMonitor;
	private NullStreamMonitor errorStreamMonitor;

	@SuppressWarnings("resource")
	public NullStreamsProxy(Process process) {
		outputStreamMonitor = new NullStreamMonitor(process.getInputStream());
		errorStreamMonitor = new NullStreamMonitor(process.getErrorStream());
	}

	@Override
	public void closeInputStream() throws IOException {
	}

	@Override
	public IStreamMonitor getErrorStreamMonitor() {
		return errorStreamMonitor;
	}

	@Override
	public IStreamMonitor getOutputStreamMonitor() {
		return outputStreamMonitor;
	}

	@Override
	public void write(String input) throws IOException {
	}

	@Override
	public IBinaryStreamMonitor getBinaryErrorStreamMonitor() {
		return errorStreamMonitor;
	}

	@Override
	public IBinaryStreamMonitor getBinaryOutputStreamMonitor() {
		return outputStreamMonitor;
	}

	@Override
	public void write(byte[] data, int offset, int length) throws IOException {
	}

	private class NullStreamMonitor implements IBinaryStreamMonitor {
		private InputStream fStream;

		public NullStreamMonitor(InputStream stream) {
			fStream = stream;
			startReaderThread();
		}

		private void startReaderThread() {
			Thread thread = new Thread((Runnable) () -> {
				byte[] bytes = new byte[1024];
				try (InputStream stream = fStream) {
					while (stream.read(bytes) >= 0) {
						// do nothing
					}
				} catch (IOException e) {
				}
			}, DebugCoreMessages.NullStreamsProxy_0);
			thread.setDaemon(true);
			thread.start();

		}

		@Override
		public void addListener(IStreamListener listener) {
		}

		@Override
		public String getContents() {
			return ""; //$NON-NLS-1$
		}

		@Override
		public void flushContents() {
		}

		@Override
		public void setBuffered(boolean buffer) {
		}

		@Override
		public boolean isBuffered() {
			return false;
		}

		@Override
		public void removeListener(IStreamListener listener) {
		}

		@Override
		public void addBinaryListener(IBinaryStreamListener listener) {
		}

		@Override
		public byte[] getData() {
			return new byte[0];
		}

		@Override
		public void removeBinaryListener(IBinaryStreamListener listener) {
		}
	}
}
