/*******************************************************************************
 * Copyright (c) 2004, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - Initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.internet.monitor.core.internal;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.nio.channels.SocketChannel;
/**
 * A socket that is only used for resending requests. All input operations are
 * ignored.
 */
public class SocketWrapper extends Socket {
	private InputStream inputStream;
	private OutputStream outputStream;
	
	public SocketWrapper(InputStream inputStream) {
	  this.inputStream = inputStream;
	  this.outputStream = new DummyOutputStream();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#bind(java.net.SocketAddress)
	 */
	public void bind(SocketAddress arg0) throws IOException {
		// do nothing
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#close()
	 */
	public synchronized void close() throws IOException {
		// do nothing
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#connect(java.net.SocketAddress, int)
	 */
	public void connect(SocketAddress arg0, int arg1) throws IOException {
		// do nothing
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#connect(java.net.SocketAddress)
	 */
	public void connect(SocketAddress arg0) throws IOException {
		// do nothing
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getChannel()
	 */
	public SocketChannel getChannel() {
		return super.getChannel();
	}
	
	/* (non-Javadoc)
	 * @see java.net.Socket#getInetAddress()
	 */
	public InetAddress getInetAddress() {
		return super.getInetAddress();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getInputStream()
	 */
	public InputStream getInputStream() throws IOException {
		return inputStream;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getKeepAlive()
	 */
	public boolean getKeepAlive() throws SocketException {
		return false;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getLocalAddress()
	 */
	public InetAddress getLocalAddress() {
		return super.getLocalAddress();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getLocalPort()
	 */
	public int getLocalPort() {
		return super.getLocalPort();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getLocalSocketAddress()
	 */
	public SocketAddress getLocalSocketAddress() {
		return super.getLocalSocketAddress();
	}
	
	/* (non-Javadoc)
	 * @see java.net.Socket#getOOBInline()
	 */
	public boolean getOOBInline() throws SocketException {
		return super.getOOBInline();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getOutputStream()
	 */
	public OutputStream getOutputStream() throws IOException {
		return outputStream;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getPort()
	 */
	public int getPort() {
		return super.getPort();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getReceiveBufferSize()
	 */
	public synchronized int getReceiveBufferSize() throws SocketException {
		return super.getReceiveBufferSize();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getRemoteSocketAddress()
	 */
	public SocketAddress getRemoteSocketAddress() {
		return super.getRemoteSocketAddress();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getReuseAddress()
	 */
	public boolean getReuseAddress() throws SocketException {
		return super.getReuseAddress();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getSendBufferSize()
	 */
	public synchronized int getSendBufferSize() throws SocketException {
		return super.getSendBufferSize();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getSoLinger()
	 */
	public int getSoLinger() throws SocketException {
		return super.getSoLinger();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getSoTimeout()
	 */
	public synchronized int getSoTimeout() throws SocketException {
		return super.getSoTimeout();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getTcpNoDelay()
	 */
	public boolean getTcpNoDelay() throws SocketException {
		return super.getTcpNoDelay();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#getTrafficClass()
	 */
	public int getTrafficClass() throws SocketException {
		return super.getTrafficClass();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#isBound()
	 */
	public boolean isBound() {
		return super.isBound();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#isClosed()
	 */
	public boolean isClosed() {
		return false;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#isConnected()
	 */
	public boolean isConnected() {
		return true;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#isInputShutdown()
	 */
	public boolean isInputShutdown() {
		return false;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#isOutputShutdown()
	 */
	public boolean isOutputShutdown() {
		return false;
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#sendUrgentData(int)
	 */
	public void sendUrgentData(int arg0) throws IOException {
		super.sendUrgentData(arg0);
	}
	
	/* (non-Javadoc)
	 * @see java.net.Socket#setKeepAlive(boolean)
	 */
	public void setKeepAlive(boolean arg0) throws SocketException {
		super.setKeepAlive(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setOOBInline(boolean)
	 */
	public void setOOBInline(boolean arg0) throws SocketException {
		super.setOOBInline(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setReceiveBufferSize(int)
	 */
	public synchronized void setReceiveBufferSize(int arg0) throws SocketException {
		super.setReceiveBufferSize(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setReuseAddress(boolean)
	 */
	public void setReuseAddress(boolean arg0) throws SocketException {
		super.setReuseAddress(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setSendBufferSize(int)
	 */
	public synchronized void setSendBufferSize(int arg0) throws SocketException {
		super.setSendBufferSize(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setSoLinger(boolean, int)
	 */
	public void setSoLinger(boolean arg0, int arg1) throws SocketException {
		super.setSoLinger(arg0, arg1);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setSoTimeout(int)
	 */
	public synchronized void setSoTimeout(int arg0) throws SocketException {
		super.setSoTimeout(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setTcpNoDelay(boolean)
	 */
	public void setTcpNoDelay(boolean arg0) throws SocketException {
		super.setTcpNoDelay(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#setTrafficClass(int)
	 */
	public void setTrafficClass(int arg0) throws SocketException {
		super.setTrafficClass(arg0);
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#shutdownInput()
	 */
	public void shutdownInput() throws IOException {
		inputStream.close();
	}

	/* (non-Javadoc)
	 * @see java.net.Socket#shutdownOutput()
	 */
	public void shutdownOutput() throws IOException {
		// do nothing
	}

	/**
	 * A dummy OutputStream that allows us to fake output for a socket.
	 */
	public class DummyOutputStream extends OutputStream {
		/* (non-Javadoc)
		 * @see java.io.OutputStream#close()
		 */
		public void close() throws IOException {
			// do nothing
		}
		
		/* (non-Javadoc)
		 * @see java.io.OutputStream#flush()
		 */
		public void flush() throws IOException {
			// do nothing
		}
	
		/* (non-Javadoc)
		 * @see java.io.OutputStream#write(byte[], int, int)
		 */
		public void write(byte[] arg0, int arg1, int arg2) throws IOException {
			// do nothing
		}
	
		/* (non-Javadoc)
		 * @see java.io.OutputStream#write(byte[])
		 */
		public void write(byte[] arg0) throws IOException {
			// do nothing
		}

		/* (non-Javadoc)
		 * @see java.io.OutputStream#write(int)
		 */
		public void write(int arg0) throws IOException {
			// do nothing
		}
	}
}