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