1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.example.sumup;
21
22 import org.apache.mina.common.IdleStatus;
23 import org.apache.mina.common.IoHandler;
24 import org.apache.mina.common.IoHandlerAdapter;
25 import org.apache.mina.common.IoSession;
26 import org.apache.mina.example.sumup.message.AddMessage;
27 import org.apache.mina.example.sumup.message.ResultMessage;
28 import org.apache.mina.util.SessionLog;
29
30 /**
31 * {@link IoHandler} for SumUp server.
32 *
33 * @author The Apache Directory Project (mina-dev@directory.apache.org)
34 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (Fri, 13 Jul 2007) $
35 */
36 public class ServerSessionHandler extends IoHandlerAdapter {
37 public void sessionOpened(IoSession session) {
38 // set idle time to 60 seconds
39 session.setIdleTime(IdleStatus.BOTH_IDLE, 60);
40
41 // initial sum is zero
42 session.setAttachment(new Integer(0));
43 }
44
45 public void messageReceived(IoSession session, Object message) {
46 // client only sends AddMessage. otherwise, we will have to identify
47 // its type using instanceof operator.
48 AddMessage am = (AddMessage) message;
49
50 // add the value to the current sum.
51 int sum = ((Integer) session.getAttachment()).intValue();
52 int value = am.getValue();
53 long expectedSum = (long) sum + value;
54 if (expectedSum > Integer.MAX_VALUE || expectedSum < Integer.MIN_VALUE) {
55 // if the sum overflows or underflows, return error message
56 ResultMessage rm = new ResultMessage();
57 rm.setSequence(am.getSequence()); // copy sequence
58 rm.setOk(false);
59 session.write(rm);
60 } else {
61 // sum up
62 sum = (int) expectedSum;
63 session.setAttachment(new Integer(sum));
64
65 // return the result message
66 ResultMessage rm = new ResultMessage();
67 rm.setSequence(am.getSequence()); // copy sequence
68 rm.setOk(true);
69 rm.setValue(sum);
70 session.write(rm);
71 }
72 }
73
74 public void sessionIdle(IoSession session, IdleStatus status) {
75 SessionLog.info(session, "Disconnecting the idle.");
76 // disconnect an idle client
77 session.close();
78 }
79
80 public void exceptionCaught(IoSession session, Throwable cause) {
81 // close the connection on exceptional situation
82 session.close();
83 }
84 }