/*
* @(#) $Id: SocketSessionImpl.java 398039 2006-04-28 23:36:27Z proyal $
*
* Copyright 2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.openamq.bio;
import org.apache.mina.common.IoFilter.WriteRequest;
import org.apache.mina.common.IoFilterChain;
import org.apache.mina.common.IoHandler;
import org.apache.mina.common.IoService;
import org.apache.mina.common.IoSessionConfig;
import org.apache.mina.common.RuntimeIOException;
import org.apache.mina.common.TransportType;
import org.apache.mina.common.support.BaseIoSession;
import org.apache.mina.common.support.BaseIoSessionConfig;
import org.apache.mina.transport.socket.nio.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.SocketSessionConfigImpl;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.nio.channels.ByteChannel;
import java.nio.channels.SocketChannel;
/**
*/
class SocketSessionImpl extends BaseIoSession
{
private final IoService manager;
private final SocketSessionConfig config;
private final SocketFilterChain filterChain;
private final IoHandler handler;
private final SocketAddress remoteAddress;
private final SocketAddress localAddress;
private final SocketAddress serviceAddress;
private final Socket socket;
private final ByteChannel channel;
private final Reader reader;
private Thread runner;
private int readBufferSize;
/**
* Creates a new instance.
*/
SocketSessionImpl(IoService manager,
SocketSessionConfig config,
IoHandler handler,
ByteChannel channel,
SocketAddress serviceAddress) throws IOException
{
this.manager = manager;
this.filterChain = new SocketFilterChain(this);
this.handler = handler;
this.channel = channel;
if(channel instanceof SocketChannel)
{
socket = ((SocketChannel) channel).socket();
}
else if(channel instanceof SimpleSocketChannel)
{
socket = ((SimpleSocketChannel) channel).socket();
}
else
{
throw new IllegalArgumentException("Unrecognised channel type: " + channel.getClass());
}
this.remoteAddress = socket.getRemoteSocketAddress();
this.localAddress = socket.getLocalSocketAddress();
this.serviceAddress = serviceAddress;
this.config = new SessionConfigImpl(config);
reader = new Reader(handler, this);
}
void start()
{
//create & start thread for this...
runner = new Thread(reader);
runner.start();
}
void shutdown() throws IOException
{
filterChain.sessionClosed( this );
reader.stop();
channel.close();
}
ByteChannel getChannel()
{
return channel;
}
protected void write0(WriteRequest writeRequest)
{
filterChain.filterWrite(this, writeRequest);
}
protected void close0()
{
filterChain.filterClose(this);
super.close0();
}
protected void updateTrafficMask()
{
//TODO
}
public IoService getService()
{
return manager;
}
public IoSessionConfig getConfig()
{
return config;
}
public IoFilterChain getFilterChain()
{
return filterChain;
}
public IoHandler getHandler()
{
return handler;
}
public int getScheduledWriteRequests()
{
return 0;
}
public int getScheduledWriteBytes()
{
return 0;
}
public TransportType getTransportType()
{
return TransportType.SOCKET;
}
public SocketAddress getRemoteAddress()
{
return remoteAddress;
}
public SocketAddress getLocalAddress()
{
return localAddress;
}
public SocketAddress getServiceAddress()
{
return serviceAddress;
}
int getReadBufferSize()
{
return readBufferSize;
}
private class SessionConfigImpl extends BaseIoSessionConfig implements SocketSessionConfig
{
SessionConfigImpl()
{
}
SessionConfigImpl(SocketSessionConfig cfg)
{
setKeepAlive(cfg.isKeepAlive());
setOobInline(cfg.isOobInline());
setReceiveBufferSize(cfg.getReceiveBufferSize());
readBufferSize = cfg.getReceiveBufferSize();
setReuseAddress(cfg.isReuseAddress());
setSendBufferSize(cfg.getSendBufferSize());
setSoLinger(cfg.getSoLinger());
setTcpNoDelay(cfg.isTcpNoDelay());
if (getTrafficClass() != cfg.getTrafficClass())
{
setTrafficClass(cfg.getTrafficClass());
}
}
public boolean isKeepAlive()
{
try
{
return socket.getKeepAlive();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setKeepAlive(boolean on)
{
try
{
socket.setKeepAlive(on);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public boolean isOobInline()
{
try
{
return socket.getOOBInline();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setOobInline(boolean on)
{
try
{
socket.setOOBInline(on);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public boolean isReuseAddress()
{
try
{
return socket.getReuseAddress();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setReuseAddress(boolean on)
{
try
{
socket.setReuseAddress(on);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public int getSoLinger()
{
try
{
return socket.getSoLinger();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setSoLinger(int linger)
{
try
{
if (linger < 0)
{
socket.setSoLinger(false, 0);
}
else
{
socket.setSoLinger(true, linger);
}
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public boolean isTcpNoDelay()
{
try
{
return socket.getTcpNoDelay();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setTcpNoDelay(boolean on)
{
try
{
socket.setTcpNoDelay(on);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public int getTrafficClass()
{
if (SocketSessionConfigImpl.isGetTrafficClassAvailable())
{
try
{
return socket.getTrafficClass();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
else
{
return 0;
}
}
public void setTrafficClass(int tc)
{
if (SocketSessionConfigImpl.isSetTrafficClassAvailable())
{
try
{
socket.setTrafficClass(tc);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
}
public int getSendBufferSize()
{
try
{
return socket.getSendBufferSize();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setSendBufferSize(int size)
{
if (SocketSessionConfigImpl.isSetSendBufferSizeAvailable())
{
try
{
socket.setSendBufferSize(size);
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
}
public int getReceiveBufferSize()
{
try
{
return socket.getReceiveBufferSize();
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
public void setReceiveBufferSize(int size)
{
if (SocketSessionConfigImpl.isSetReceiveBufferSizeAvailable())
{
try
{
socket.setReceiveBufferSize(size);
SocketSessionImpl.this.readBufferSize = size;
}
catch (SocketException e)
{
throw new RuntimeIOException(e);
}
}
}
}
}