/*******************************************************************************
 * Copyright (c) 2010, 2017 SAP AG 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:
 *     Lazar Kirchev, SAP AG - initial API and implementation  
 *******************************************************************************/

package org.eclipse.equinox.console.common;

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

/**
 * This class represents a generic handler of content, read from some input stream. It reads from the
 * stream, and passes what is read to a processor, which performs some actions on the content,
 * eventually writing to an output stream. This handler should be customized with a concrete content processor.
 */
public abstract class InputHandler extends Thread {

	protected Scanner inputScanner;
	protected OutputStream out;
	protected ConsoleInputStream in;
	protected InputStream input;
	protected byte[] buffer;
	protected static final int MAX_SIZE = 2048;

	public InputHandler(InputStream input, ConsoleInputStream in, OutputStream out) {
		this.input = input;
		this.in = in;
		this.out = out;
		buffer = new byte[MAX_SIZE];
	}

	@Override
	public void run() {
		int count;
		try {
			while ((count = input.read(buffer)) > -1) {
				for (int i = 0; i < count; i++) {
					inputScanner.scan(buffer[i]);
				}
			}
		} catch (IOException e) {
			// Printing stack trace is not needed since the streams are closed immediately
			// do nothing
		} finally {
			try {
				in.close();
			} catch (IOException e1) {
				// do nothing
			}
			try {
				out.close();
			} catch (IOException e1) {
				// do nothing
			}
		}
	}
	
	public Scanner getScanner() {
		return inputScanner;
	}

}
