1 20 package org.apache.mina.handler; 21 22 import java.io.IOException ; 23 import java.io.InputStream ; 24 import java.io.OutputStream ; 25 import java.net.SocketTimeoutException ; 26 27 import org.apache.mina.common.ByteBuffer; 28 import org.apache.mina.common.IdleStatus; 29 import org.apache.mina.common.IoHandler; 30 import org.apache.mina.common.IoHandlerAdapter; 31 import org.apache.mina.common.IoSession; 32 import org.apache.mina.handler.support.IoSessionInputStream; 33 import org.apache.mina.handler.support.IoSessionOutputStream; 34 import org.apache.mina.util.SessionLog; 35 36 47 public abstract class StreamIoHandler extends IoHandlerAdapter { 48 private static final String KEY_IN = StreamIoHandler.class.getName() 49 + ".in"; 50 51 private static final String KEY_OUT = StreamIoHandler.class.getName() 52 + ".out"; 53 54 private int readTimeout; 55 56 private int writeTimeout; 57 58 protected StreamIoHandler() { 59 } 60 61 66 protected abstract void processStreamIo(IoSession session, InputStream in, 67 OutputStream out); 68 69 73 public int getReadTimeout() { 74 return readTimeout; 75 } 76 77 81 public void setReadTimeout(int readTimeout) { 82 this.readTimeout = readTimeout; 83 } 84 85 89 public int getWriteTimeout() { 90 return writeTimeout; 91 } 92 93 97 public void setWriteTimeout(int writeTimeout) { 98 this.writeTimeout = writeTimeout; 99 } 100 101 104 public void sessionOpened(IoSession session) { 105 session.setWriteTimeout(writeTimeout); 107 session.setIdleTime(IdleStatus.READER_IDLE, readTimeout); 108 109 InputStream in = new IoSessionInputStream(); 111 OutputStream out = new IoSessionOutputStream(session); 112 session.setAttribute(KEY_IN, in); 113 session.setAttribute(KEY_OUT, out); 114 processStreamIo(session, in, out); 115 } 116 117 120 public void sessionClosed(IoSession session) throws Exception { 121 final InputStream in = (InputStream ) session.getAttribute(KEY_IN); 122 final OutputStream out = (OutputStream ) session.getAttribute(KEY_OUT); 123 try { 124 in.close(); 125 } finally { 126 out.close(); 127 } 128 } 129 130 133 public void messageReceived(IoSession session, Object buf) { 134 final IoSessionInputStream in = (IoSessionInputStream) session 135 .getAttribute(KEY_IN); 136 in.write((ByteBuffer) buf); 137 } 138 139 142 public void exceptionCaught(IoSession session, Throwable cause) { 143 final IoSessionInputStream in = (IoSessionInputStream) session 144 .getAttribute(KEY_IN); 145 146 IOException e = null; 147 if (cause instanceof StreamIoException) { 148 e = (IOException ) cause.getCause(); 149 } else if (cause instanceof IOException ) { 150 e = (IOException ) cause; 151 } 152 153 if (e != null && in != null) { 154 in.throwException(e); 155 } else { 156 SessionLog.warn(session, "Unexpected exception.", cause); 157 session.close(); 158 } 159 } 160 161 164 public void sessionIdle(IoSession session, IdleStatus status) { 165 if (status == IdleStatus.READER_IDLE) { 166 throw new StreamIoException(new SocketTimeoutException ( 167 "Read timeout")); 168 } 169 } 170 171 private static class StreamIoException extends RuntimeException { 172 private static final long serialVersionUID = 3976736960742503222L; 173 174 public StreamIoException(IOException cause) { 175 super(cause); 176 } 177 } 178 } 179 | Popular Tags |