/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.lib.cvsclient; import org.netbeans.lib.cvsclient.connection.IConnection; import org.netbeans.lib.cvsclient.file.IReaderFactory; import org.netbeans.lib.cvsclient.file.IWriterFactory; import org.netbeans.lib.cvsclient.io.IStreamLogger; import org.netbeans.lib.cvsclient.util.BugLog; import java.io.*; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; import java.util.zip.InflaterInputStream; /** * @author Thomas Singer */ public final class ConnectionStreams implements IConnectionStreams, IReaderFactory, IWriterFactory { // Fields ================================================================= private final IConnection connection; private final IStreamLogger streamLogger; private InputStream loggedInputStream; private OutputStream loggedOutputStream; private Reader loggedReader; private Writer loggedWriter; private InputStream inputStream; private OutputStream outputStream; private DeflaterOutputStream deflaterOutputStream; private final String myCharset; // Setup ================================================================== public ConnectionStreams(IConnection connection, IStreamLogger streamLogger, String charset) { BugLog.getInstance().assertNotNull(connection); BugLog.getInstance().assertNotNull(streamLogger); this.connection = connection; this.streamLogger = streamLogger; this.myCharset = charset; setInputStream(connection.getInputStream()); setOutputStream(connection.getOutputStream()); } public Reader createReader(InputStream inputStream) { return new InputStreamReader(inputStream); } public Writer createWriter(OutputStream outputStream) { try { return new OutputStreamWriter(outputStream, myCharset); } catch (UnsupportedEncodingException e) { return null; } } // Accessing ============================================================== public IReaderFactory getReaderFactory() { return this; } public IWriterFactory getWriterFactory() { return this; } public InputStream getLoggedInputStream() { return loggedInputStream; } public OutputStream getLoggedOutputStream() { return loggedOutputStream; } public Reader getLoggedReader() { return loggedReader; } public Writer getLoggedWriter() { return loggedWriter; } public InputStream getInputStream() { return inputStream; } public OutputStream getOutputStream() { return outputStream; } public void flushForReading() throws IOException { loggedWriter.flush(); if (deflaterOutputStream != null) { deflaterOutputStream.finish(); } loggedOutputStream.flush(); } public void close() { try { if (loggedOutputStream != null) { try { loggedOutputStream.close(); } catch (IOException ex) { BugLog.getInstance().showException(ex); } } if (loggedInputStream != null) { try { loggedInputStream.close(); } catch (IOException ex) { BugLog.getInstance().showException(ex); } } } finally { try { connection.close(); } catch (IOException ex) { BugLog.getInstance().showException(ex); } } } // Actions ================================================================ // Actions ================================================================ public void setGzipped() throws IOException { loggedWriter.flush(); loggedOutputStream.flush(); deflaterOutputStream = new DeflaterOutputStream(connection.getOutputStream(), new Deflater(6)); setOutputStream(deflaterOutputStream); setInputStream(new InflaterInputStream(connection.getInputStream())); } // Utils ================================================================== private void setInputStream(InputStream inputStream) { this.inputStream = inputStream; this.loggedInputStream = streamLogger.createLoggingInputStream(inputStream); this.loggedReader = createReader(this.loggedInputStream); } private void setOutputStream(OutputStream outputStream) { this.outputStream = outputStream; this.loggedOutputStream = streamLogger.createLoggingOutputStream(outputStream); this.loggedWriter = createWriter(this.loggedOutputStream); } }