001    package toolbus.communication;
002    
003    import java.net.Socket;
004    import java.nio.channels.SocketChannel;
005    
006    import toolbus.logging.ILogger;
007    import toolbus.logging.IToolBusLoggerConstants;
008    import toolbus.logging.LoggerFactory;
009    
010    /**
011     * Interface that defines all methods that are required for connection handlers. They need to
012     * facilitate in obtaining a reference to read and write multiplexers and supply methods for closing
013     * a connection.
014     * 
015     * @author Arnold Lankamp
016     */
017    public abstract class AbstractConnectionHandler{
018            
019            /**
020             * Returns a reference to the read multiplexer.
021             * 
022             * @return A reference to the read multiplexer.
023             */
024            public abstract IReadMultiplexer getReadMultiplexer();
025            
026            /**
027             * Returns a reference to the write multiplexer.
028             * 
029             * @return A reference to the write multiplexer.
030             */
031            public abstract IWriteMultiplexer getWriteMultiplexer();
032            
033            /**
034             * Closes the connection associated with the given socket channel. This method executes a
035             * controlled shutdown of the connection. The socket channel will be deregistered (if needed)
036             * and will be closed.
037             * 
038             * @param socketChannel
039             *            The socket channel, who's associated socket should be closed.
040             */
041            public abstract void closeConnection(SocketChannel socketChannel);
042            
043            /**
044             * Closes the connection associated with the given socket channel. This method should be invoked
045             * after an error occurs during the usage of a socket / socket channel.
046             * 
047             * @param socketChannel
048             *            The socket channel, who's associated socket should be closed.
049             * @param socketIOHandler
050             *            The socket I/O handler associated with the connection that was disconnected.
051             */
052            public void closeDueToException(SocketChannel socketChannel, SocketIOHandler socketIOHandler){
053                    socketIOHandler.exceptionOccured();
054                    
055                    Socket socket = socketChannel.socket();
056                    LoggerFactory.log("The connection with the application running on: " + socket.getInetAddress().getHostName() + ":" + socket.getPort() + " will be closed, because it caused an exception.", ILogger.ERROR, IToolBusLoggerConstants.COMMUNICATION);
057                    
058                    closeConnection(socketChannel);
059            }
060            
061            /**
062             * Closes the connection associated with the given socket channel. This method should be invoked
063             * when an unexpected disconnect occurred on the given socket / socket channel.
064             * 
065             * @param socketChannel
066             *            The socket channel, who's associated socket should be closed.
067             * @param socketIOHandler
068             *            The socket I/O handler associated with the connection that was disconnected.
069             */
070            public void closeDueToDisconnect(SocketChannel socketChannel, SocketIOHandler socketIOHandler){
071                    socketIOHandler.exceptionOccured();
072                    
073                    Socket socket = socketChannel.socket();
074                    LoggerFactory.log("The application running on: " + socket.getInetAddress().getHostName() + ":" + socket.getPort() + ", was disconnected. The connection will now be closed.", ILogger.ERROR, IToolBusLoggerConstants.COMMUNICATION);
075                    
076                    closeConnection(socketChannel);
077            }
078    }