/* * Copyright (C) 2004 The Concord Consortium, Inc., * 10 Concord Crossing, Concord, MA 01742 * * Web Site: http://www.concord.org * Email: info@concord.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * END LICENSE */ package org.concord.swing; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Vector; import org.concord.swing.RecordBuffer.RecordListener; public class StreamRecord { protected int bufferSize; protected HashMap streamTable = new HashMap(); protected HashMap bufferTable = new HashMap(); protected Vector listeners = new Vector(); public StreamRecord(int size) { bufferSize = size; } protected Object createStream(Object stream, RecordStream recordStream) { if ((stream instanceof InputStream) || (stream instanceof OutputStream)) { Class [] parameterTypes = new Class[1]; if (stream instanceof InputStream) parameterTypes[0] = InputStream.class; else parameterTypes[0] = OutputStream.class; Class streamClass = stream.getClass(); try { Object [] parameters = { recordStream }; Constructor constructor = streamClass.getConstructor(parameterTypes); Object resultStream = constructor.newInstance(parameters); if (resultStream != null) { streamTable.put(recordStream, stream); bufferTable.put(resultStream, recordStream); } return resultStream; } catch (Exception e) { } } return null; } protected RecordStream createRecordStream(Object stream, RecordBuffer buffer) { RecordStream recordStream = null; if (stream instanceof OutputStream) { recordStream = new RecordOutputStream((OutputStream) stream, buffer); } else if (stream instanceof InputStream) { recordStream = new RecordInputStream((InputStream) stream, buffer); } return recordStream; } protected RecordStream createRecordStream(Object stream, int bufferSize) { RecordStream recordStream = null; if (stream instanceof OutputStream) { recordStream = new RecordOutputStream((OutputStream) stream, bufferSize); } else if (stream instanceof InputStream) { recordStream = new RecordInputStream((InputStream) stream, bufferSize); } return recordStream; } public Object getStream(Object stream) { RecordStream recordStream = createRecordStream(stream, bufferSize); return createStream(stream, recordStream); } public Object getStream(Object stream, Object sharedStream) { if (sharedStream == null) return getStream(stream); RecordStream recordStream = (RecordStream) bufferTable.get(sharedStream); RecordBuffer buffer = recordStream.getRecordBuffer(); return createStream(stream, createRecordStream(stream, buffer)); } public String getText(Object stream) { if (stream instanceof OutputStream) { RecordOutputStream record = (RecordOutputStream) bufferTable.get(stream); return record.getText(); } else if (stream instanceof InputStream) { RecordInputStream record = (RecordInputStream) bufferTable.get(stream); return record.getText(); } return null; } public void addRecordListener(Object stream, RecordListener listener) { RecordStream recordStream = (RecordStream) bufferTable.get(stream); if ((listener != null) && (recordStream != null)) recordStream.getRecordBuffer().addRecordListener(listener); } public void removeRecordListener(Object stream, RecordListener listener) { RecordStream recordStream = (RecordStream) bufferTable.get(stream); if ((listener != null) && (recordStream != null)) recordStream.getRecordBuffer().removeRecordListener(listener); } public interface RecordStream { public String getText(); public RecordBuffer getRecordBuffer(); } public static class RecordInputStream extends InputStream implements RecordStream { protected RecordBuffer buffer; protected InputStream in; public RecordInputStream(InputStream inputStream, int size) { buffer = new RecordBuffer(size); in = inputStream; } public RecordInputStream(InputStream inputStream, RecordBuffer shareBuffer) { buffer = shareBuffer; in = inputStream; } public RecordBuffer getRecordBuffer() { return buffer; } public String getText() { return buffer.getText(); } public int read() throws IOException { int value = in.read(); buffer.put(value); return value; } } public static class RecordOutputStream extends OutputStream implements RecordStream { protected RecordBuffer buffer; protected OutputStream out; public RecordOutputStream(OutputStream outputStream, int size) { buffer = new RecordBuffer(size); out = outputStream; } public RecordOutputStream(OutputStream outputStream, RecordBuffer shareBuffer) { buffer = shareBuffer; out = outputStream; } public RecordBuffer getRecordBuffer() { return buffer; } public String getText() { return buffer.getText(); } public void write(int value) throws IOException { out.write(value); buffer.put(value); } } }