103928aee4356845252ac6b662d5c72c29903813eJake Slack//
203928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
303928aee4356845252ac6b662d5c72c29903813eJake Slack//  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
403928aee4356845252ac6b662d5c72c29903813eJake Slack//  ------------------------------------------------------------------------
503928aee4356845252ac6b662d5c72c29903813eJake Slack//  All rights reserved. This program and the accompanying materials
603928aee4356845252ac6b662d5c72c29903813eJake Slack//  are made available under the terms of the Eclipse Public License v1.0
703928aee4356845252ac6b662d5c72c29903813eJake Slack//  and Apache License v2.0 which accompanies this distribution.
803928aee4356845252ac6b662d5c72c29903813eJake Slack//
903928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Eclipse Public License is available at
1003928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.eclipse.org/legal/epl-v10.html
1103928aee4356845252ac6b662d5c72c29903813eJake Slack//
1203928aee4356845252ac6b662d5c72c29903813eJake Slack//      The Apache License v2.0 is available at
1303928aee4356845252ac6b662d5c72c29903813eJake Slack//      http://www.opensource.org/licenses/apache2.0.php
1403928aee4356845252ac6b662d5c72c29903813eJake Slack//
1503928aee4356845252ac6b662d5c72c29903813eJake Slack//  You may elect to redistribute this code under either of these licenses.
1603928aee4356845252ac6b662d5c72c29903813eJake Slack//  ========================================================================
1703928aee4356845252ac6b662d5c72c29903813eJake Slack//
1803928aee4356845252ac6b662d5c72c29903813eJake Slack
1903928aee4356845252ac6b662d5c72c29903813eJake Slackpackage org.eclipse.jetty.io.nio;
2003928aee4356845252ac6b662d5c72c29903813eJake Slack
2103928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.io.IOException;
2203928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.nio.ByteBuffer;
2303928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.nio.channels.SelectionKey;
2403928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.nio.channels.SocketChannel;
2503928aee4356845252ac6b662d5c72c29903813eJake Slackimport java.util.List;
2603928aee4356845252ac6b662d5c72c29903813eJake Slack
2703928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.Buffer;
2803928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.io.NetworkTrafficListener;
2903928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Log;
3003928aee4356845252ac6b662d5c72c29903813eJake Slackimport org.eclipse.jetty.util.log.Logger;
3103928aee4356845252ac6b662d5c72c29903813eJake Slack
3203928aee4356845252ac6b662d5c72c29903813eJake Slackpublic class NetworkTrafficSelectChannelEndPoint extends SelectChannelEndPoint
3303928aee4356845252ac6b662d5c72c29903813eJake Slack{
3403928aee4356845252ac6b662d5c72c29903813eJake Slack    private static final Logger LOG = Log.getLogger(NetworkTrafficSelectChannelEndPoint.class);
3503928aee4356845252ac6b662d5c72c29903813eJake Slack
3603928aee4356845252ac6b662d5c72c29903813eJake Slack    private final List<NetworkTrafficListener> listeners;
3703928aee4356845252ac6b662d5c72c29903813eJake Slack
3803928aee4356845252ac6b662d5c72c29903813eJake Slack    public NetworkTrafficSelectChannelEndPoint(SocketChannel channel, SelectorManager.SelectSet selectSet, SelectionKey key, int maxIdleTime, List<NetworkTrafficListener> listeners) throws IOException
3903928aee4356845252ac6b662d5c72c29903813eJake Slack    {
4003928aee4356845252ac6b662d5c72c29903813eJake Slack        super(channel, selectSet, key, maxIdleTime);
4103928aee4356845252ac6b662d5c72c29903813eJake Slack        this.listeners = listeners;
4203928aee4356845252ac6b662d5c72c29903813eJake Slack    }
4303928aee4356845252ac6b662d5c72c29903813eJake Slack
4403928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
4503928aee4356845252ac6b662d5c72c29903813eJake Slack    public int fill(Buffer buffer) throws IOException
4603928aee4356845252ac6b662d5c72c29903813eJake Slack    {
4703928aee4356845252ac6b662d5c72c29903813eJake Slack        int read = super.fill(buffer);
4803928aee4356845252ac6b662d5c72c29903813eJake Slack        notifyIncoming(buffer, read);
4903928aee4356845252ac6b662d5c72c29903813eJake Slack        return read;
5003928aee4356845252ac6b662d5c72c29903813eJake Slack    }
5103928aee4356845252ac6b662d5c72c29903813eJake Slack
5203928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
5303928aee4356845252ac6b662d5c72c29903813eJake Slack    public int flush(Buffer buffer) throws IOException
5403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
5503928aee4356845252ac6b662d5c72c29903813eJake Slack        int position = buffer.getIndex();
5603928aee4356845252ac6b662d5c72c29903813eJake Slack        int written = super.flush(buffer);
5703928aee4356845252ac6b662d5c72c29903813eJake Slack        notifyOutgoing(buffer, position, written);
5803928aee4356845252ac6b662d5c72c29903813eJake Slack        return written;
5903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
6003928aee4356845252ac6b662d5c72c29903813eJake Slack
6103928aee4356845252ac6b662d5c72c29903813eJake Slack    @Override
6203928aee4356845252ac6b662d5c72c29903813eJake Slack    protected int gatheringFlush(Buffer header, ByteBuffer bbuf0, Buffer buffer, ByteBuffer bbuf1) throws IOException
6303928aee4356845252ac6b662d5c72c29903813eJake Slack    {
6403928aee4356845252ac6b662d5c72c29903813eJake Slack        int headerPosition = header.getIndex();
6503928aee4356845252ac6b662d5c72c29903813eJake Slack        int headerLength = header.length();
6603928aee4356845252ac6b662d5c72c29903813eJake Slack        int bufferPosition = buffer.getIndex();
6703928aee4356845252ac6b662d5c72c29903813eJake Slack        int written = super.gatheringFlush(header, bbuf0, buffer,bbuf1);
6803928aee4356845252ac6b662d5c72c29903813eJake Slack        notifyOutgoing(header, headerPosition, written > headerLength ? headerLength : written);
6903928aee4356845252ac6b662d5c72c29903813eJake Slack        notifyOutgoing(buffer, bufferPosition, written > headerLength ? written - headerLength : 0);
7003928aee4356845252ac6b662d5c72c29903813eJake Slack        return written;
7103928aee4356845252ac6b662d5c72c29903813eJake Slack    }
7203928aee4356845252ac6b662d5c72c29903813eJake Slack
7303928aee4356845252ac6b662d5c72c29903813eJake Slack    public void notifyOpened()
7403928aee4356845252ac6b662d5c72c29903813eJake Slack    {
7503928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listeners != null && !listeners.isEmpty())
7603928aee4356845252ac6b662d5c72c29903813eJake Slack        {
7703928aee4356845252ac6b662d5c72c29903813eJake Slack            for (NetworkTrafficListener listener : listeners)
7803928aee4356845252ac6b662d5c72c29903813eJake Slack            {
7903928aee4356845252ac6b662d5c72c29903813eJake Slack                try
8003928aee4356845252ac6b662d5c72c29903813eJake Slack                {
8103928aee4356845252ac6b662d5c72c29903813eJake Slack                    listener.opened(_socket);
8203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
8303928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (Exception x)
8403928aee4356845252ac6b662d5c72c29903813eJake Slack                {
8503928aee4356845252ac6b662d5c72c29903813eJake Slack                    LOG.warn(x);
8603928aee4356845252ac6b662d5c72c29903813eJake Slack                }
8703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
8803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
8903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
9003928aee4356845252ac6b662d5c72c29903813eJake Slack
9103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void notifyIncoming(Buffer buffer, int read)
9203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
9303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listeners != null && !listeners.isEmpty() && read > 0)
9403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
9503928aee4356845252ac6b662d5c72c29903813eJake Slack            for (NetworkTrafficListener listener : listeners)
9603928aee4356845252ac6b662d5c72c29903813eJake Slack            {
9703928aee4356845252ac6b662d5c72c29903813eJake Slack                try
9803928aee4356845252ac6b662d5c72c29903813eJake Slack                {
9903928aee4356845252ac6b662d5c72c29903813eJake Slack                    Buffer view = buffer.asReadOnlyBuffer();
10003928aee4356845252ac6b662d5c72c29903813eJake Slack                    listener.incoming(_socket, view);
10103928aee4356845252ac6b662d5c72c29903813eJake Slack                }
10203928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (Exception x)
10303928aee4356845252ac6b662d5c72c29903813eJake Slack                {
10403928aee4356845252ac6b662d5c72c29903813eJake Slack                    LOG.warn(x);
10503928aee4356845252ac6b662d5c72c29903813eJake Slack                }
10603928aee4356845252ac6b662d5c72c29903813eJake Slack            }
10703928aee4356845252ac6b662d5c72c29903813eJake Slack        }
10803928aee4356845252ac6b662d5c72c29903813eJake Slack    }
10903928aee4356845252ac6b662d5c72c29903813eJake Slack
11003928aee4356845252ac6b662d5c72c29903813eJake Slack    public void notifyOutgoing(Buffer buffer, int position, int written)
11103928aee4356845252ac6b662d5c72c29903813eJake Slack    {
11203928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listeners != null && !listeners.isEmpty() && written > 0)
11303928aee4356845252ac6b662d5c72c29903813eJake Slack        {
11403928aee4356845252ac6b662d5c72c29903813eJake Slack            for (NetworkTrafficListener listener : listeners)
11503928aee4356845252ac6b662d5c72c29903813eJake Slack            {
11603928aee4356845252ac6b662d5c72c29903813eJake Slack                try
11703928aee4356845252ac6b662d5c72c29903813eJake Slack                {
11803928aee4356845252ac6b662d5c72c29903813eJake Slack                    Buffer view = buffer.asReadOnlyBuffer();
11903928aee4356845252ac6b662d5c72c29903813eJake Slack                    view.setGetIndex(position);
12003928aee4356845252ac6b662d5c72c29903813eJake Slack                    view.setPutIndex(position + written);
12103928aee4356845252ac6b662d5c72c29903813eJake Slack                    listener.outgoing(_socket, view);
12203928aee4356845252ac6b662d5c72c29903813eJake Slack                }
12303928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (Exception x)
12403928aee4356845252ac6b662d5c72c29903813eJake Slack                {
12503928aee4356845252ac6b662d5c72c29903813eJake Slack                    LOG.warn(x);
12603928aee4356845252ac6b662d5c72c29903813eJake Slack                }
12703928aee4356845252ac6b662d5c72c29903813eJake Slack            }
12803928aee4356845252ac6b662d5c72c29903813eJake Slack        }
12903928aee4356845252ac6b662d5c72c29903813eJake Slack    }
13003928aee4356845252ac6b662d5c72c29903813eJake Slack
13103928aee4356845252ac6b662d5c72c29903813eJake Slack    public void notifyClosed()
13203928aee4356845252ac6b662d5c72c29903813eJake Slack    {
13303928aee4356845252ac6b662d5c72c29903813eJake Slack        if (listeners != null && !listeners.isEmpty())
13403928aee4356845252ac6b662d5c72c29903813eJake Slack        {
13503928aee4356845252ac6b662d5c72c29903813eJake Slack            for (NetworkTrafficListener listener : listeners)
13603928aee4356845252ac6b662d5c72c29903813eJake Slack            {
13703928aee4356845252ac6b662d5c72c29903813eJake Slack                try
13803928aee4356845252ac6b662d5c72c29903813eJake Slack                {
13903928aee4356845252ac6b662d5c72c29903813eJake Slack                    listener.closed(_socket);
14003928aee4356845252ac6b662d5c72c29903813eJake Slack                }
14103928aee4356845252ac6b662d5c72c29903813eJake Slack                catch (Exception x)
14203928aee4356845252ac6b662d5c72c29903813eJake Slack                {
14303928aee4356845252ac6b662d5c72c29903813eJake Slack                    LOG.warn(x);
14403928aee4356845252ac6b662d5c72c29903813eJake Slack                }
14503928aee4356845252ac6b662d5c72c29903813eJake Slack            }
14603928aee4356845252ac6b662d5c72c29903813eJake Slack        }
14703928aee4356845252ac6b662d5c72c29903813eJake Slack    }
14803928aee4356845252ac6b662d5c72c29903813eJake Slack}
149