/* * Channel.java February 2007 * * Copyright (C) 2007, Niall Gallagher <niallg@users.sf.net> * * 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.simpleframework.transport; import java.nio.channels.SocketChannel; import java.util.Map; import javax.net.ssl.SSLEngine; import org.simpleframework.transport.trace.Trace; /** * The <code>Channel</code> interface represents a connected channel through * which data can be sent and received. Typically a channel will have a * connected TCP socket, which can be used to determine when the channel is read * ready, and write ready. A channel can also contain a bag of attributes used * to describe the connection. * <p> * Reading and writing to a channel is performed using two special interfaces. * The first is the <code>Cursor</code> object which is used to read data from * the channel in a non-blocking manner. This can also be used to reset data if * it has read too much. To write the <code>Sender</code> can be used, this * provides a blocking interface much like a conventional output stream. * * @author Niall Gallagher */ public interface Channel { /** * This is used to determine if the channel is secure and that data read * from and data written to the request is encrypted. Channels transferred * over SSL are considered secure and will have this return true, otherwise * it will return false. * * @return true if this is secure for reading and writing */ boolean isSecure(); /** * This is the connected socket channel associated with this. In order to * determine if content can be read or written to or from the channel this * socket can be used with a selector. This provides a means to react to I/O * events as they occur rather than polling the channel which is generally * less performant. * * @return this returns the connected socket channel */ SocketChannel getSocket(); /** * This is used to acquire the SSL engine used for security. If the socket * is connected to an SSL transport this returns an SSL engine which can be * used to establish the secure connection and send and receive content over * that connection. If this is null then the socket represents a normal * transport. * * @return the SSL engine used to establish a secure transport */ SSLEngine getEngine(); /** * This gets the <code>Trace</code> object associated with the channel. The * trace is used to log various events for the life of the transaction such * as low level read and write events as well as milestone events and * errors. * * @return this returns the trace associated with the socket */ Trace getTrace(); /** * This provides the <code>Cursor</code> for this channel. The cursor * provides a resettable view of the input buffer and will allow the server * kernel to peek into the input buffer without having to take the data from * the input. This allows overflow to be pushed back on to the cursor for * subsequent reads. * * @return this returns the input cursor for the channel */ Cursor getCursor(); /** * This provides the <code>Sender</code> for the channel. This is used to * provide a blocking output mechanism for the channel. Enabling blocking * reads ensures that output buffering can be limited to an extent, which * ensures that memory remains low at high load periods. Writes to the * sender may result in the data being copied and queued until the socket is * write ready. * * @return this returns the output sender for this channel */ Sender getSender(); /** * This returns the <code>Map</code> of attributes used to hold connection * information for the channel. The attributes here are taken from the * pipeline attributes and may contain details such as SSL certificates or * other such useful information. * * @return returns the attributes associated with the channel */ Map getAttributes(); /** * Because the channel represents a duplex means of communication there * needs to be a means to close it down. This provides such a means. By * closing the channel the cursor and sender will no longer send or recieve * data to or from the network. The client will also be signaled that the * connection has been severed. */ void close(); }