1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.mina.examples.sumup;
20
21 import org.apache.mina.common.IdleStatus;
22 import org.apache.mina.common.IoHandler;
23 import org.apache.mina.common.IoSession;
24 import org.apache.mina.examples.sumup.codec.SumUpProtocolCodecFactory;
25 import org.apache.mina.examples.sumup.message.AddMessage;
26 import org.apache.mina.examples.sumup.message.ResultMessage;
27 import org.apache.mina.filter.LoggingFilter;
28 import org.apache.mina.filter.codec.ProtocolCodecFactory;
29 import org.apache.mina.filter.codec.ProtocolCodecFilter;
30 import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
31 import org.apache.mina.util.SessionLog;
32
33 /***
34 * {@link IoHandler} for SumUp server.
35 *
36 * @author The Apache Directory Project
37 * @version $Rev: 355016 $, $Date: 2005-12-08 16:00:30 +0900 (Thu, 08 Dec 2005) $
38 */
39 public class ServerSessionHandler implements IoHandler
40 {
41 private final boolean useCustomCodec;
42
43 public ServerSessionHandler( boolean useCustomCodec )
44 {
45 this.useCustomCodec = useCustomCodec;
46 }
47
48 public void sessionCreated( IoSession session ) throws Exception
49 {
50 ProtocolCodecFactory codec;
51 if( useCustomCodec )
52 {
53 codec = new SumUpProtocolCodecFactory( true );
54 }
55 else
56 {
57 codec = new ObjectSerializationCodecFactory();
58 }
59
60 session.getFilterChain().addFirst(
61 "protocolFilter", new ProtocolCodecFilter( codec ) );
62 session.getFilterChain().addLast(
63 "logger", new LoggingFilter() );
64 }
65
66 public void sessionOpened( IoSession session )
67 {
68
69 session.setIdleTime( IdleStatus.BOTH_IDLE, 60 );
70
71
72 session.setAttachment( new Integer( 0 ) );
73 }
74
75 public void sessionClosed( IoSession session )
76 {
77 }
78
79 public void messageReceived( IoSession session, Object message )
80 {
81
82
83 AddMessage am = ( AddMessage ) message;
84
85
86 int sum = ( ( Integer ) session.getAttachment() ).intValue();
87 int value = am.getValue();
88 long expectedSum = ( long ) sum + value;
89 if( expectedSum > Integer.MAX_VALUE || expectedSum < Integer.MIN_VALUE )
90 {
91
92 ResultMessage rm = new ResultMessage();
93 rm.setSequence( am.getSequence() );
94 rm.setOk( false );
95 session.write( rm );
96 }
97 else
98 {
99
100 sum = ( int ) expectedSum;
101 session.setAttachment( new Integer( sum ) );
102
103
104 ResultMessage rm = new ResultMessage();
105 rm.setSequence( am.getSequence() );
106 rm.setOk( true );
107 rm.setValue( sum );
108 session.write( rm );
109 }
110 }
111
112 public void messageSent( IoSession session, Object message )
113 {
114 }
115
116 public void sessionIdle( IoSession session, IdleStatus status )
117 {
118 SessionLog.info( session, "Disconnecting the idle." );
119
120 session.close();
121 }
122
123 public void exceptionCaught( IoSession session, Throwable cause )
124 {
125
126 session.close();
127 }
128 }