1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.example.imagine.step3.server;
21
22 import java.awt.Color;
23 import java.awt.Font;
24 import java.awt.Graphics;
25 import java.awt.image.BufferedImage;
26
27 import javax.management.MBeanServer;
28 import javax.management.ObjectName;
29
30 import org.apache.mina.core.service.IoHandlerAdapter;
31 import org.apache.mina.core.session.IoSession;
32 import org.apache.mina.example.imagine.step1.ImageRequest;
33 import org.apache.mina.example.imagine.step1.ImageResponse;
34 import org.apache.mina.integration.jmx.IoSessionMBean;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38
39
40
41
42
43
44
45 public class ImageServerIoHandler extends IoHandlerAdapter {
46
47 private final static String characters = "mina rocks abcdefghijklmnopqrstuvwxyz0123456789";
48
49 public static final String INDEX_KEY = ImageServerIoHandler.class.getName() + ".INDEX";
50
51 private Logger logger = LoggerFactory.getLogger(this.getClass());
52
53 private MBeanServer mBeanServer;
54
55
56
57
58
59
60
61
62
63 public ImageServerIoHandler( MBeanServer mBeanServer ) {
64 this.mBeanServer = mBeanServer;
65 }
66
67
68
69
70
71
72
73 public void sessionCreated( IoSession session ) throws Exception
74 {
75
76
77 IoSessionMBean sessionMBean = new IoSessionMBean( session );
78
79
80 ObjectName sessionName = new ObjectName( session.getClass().getPackage().getName() +
81 ":type=session,name=" + session.getClass().getSimpleName() + "-" + session.getId());
82
83
84
85 mBeanServer.registerMBean( sessionMBean, sessionName );
86 }
87
88
89
90
91
92
93 public void sessionOpened(IoSession session) throws Exception {
94
95
96
97 session.setAttribute(INDEX_KEY, 0);
98 }
99
100
101
102
103
104
105
106 public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
107 logger.warn(cause.getMessage(), cause);
108 }
109
110
111
112
113
114
115 public void messageReceived(IoSession session, Object message) throws Exception {
116 ImageRequest request = (ImageRequest) message;
117 String text1 = generateString(session, request.getNumberOfCharacters());
118 String text2 = generateString(session, request.getNumberOfCharacters());
119 BufferedImage image1 = createImage(request, text1);
120 BufferedImage image2 = createImage(request, text2);
121 ImageResponse response = new ImageResponse(image1, image2);
122 session.write(response);
123 }
124
125
126
127
128
129
130
131
132
133
134
135 private BufferedImage createImage(ImageRequest request, String text) {
136 BufferedImage image = new BufferedImage(request.getWidth(), request.getHeight(), BufferedImage.TYPE_BYTE_INDEXED);
137 Graphics graphics = image.createGraphics();
138 graphics.setColor(Color.YELLOW);
139 graphics.fillRect(0, 0, image.getWidth(), image.getHeight());
140 Font serif = new Font("serif", Font.PLAIN, 30);
141 graphics.setFont(serif);
142 graphics.setColor(Color.BLUE);
143 graphics.drawString(text, 10, 50);
144 return image;
145 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159 private String generateString(IoSession session, int length) {
160 Integer index = (Integer) session.getAttribute(INDEX_KEY);
161 StringBuffer buffer = new StringBuffer(length);
162 while (buffer.length() < length) {
163 buffer.append(characters.charAt(index));
164 index++;
165 if (index >= characters.length()) {
166 index = 0;
167 }
168 }
169 session.setAttribute(INDEX_KEY, index);
170 return buffer.toString();
171 }
172
173 }