1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.example.localtime;
17
18 import org.jboss.netty.channel.ChannelEvent;
19 import org.jboss.netty.channel.ChannelHandlerContext;
20 import org.jboss.netty.channel.ChannelStateEvent;
21 import org.jboss.netty.channel.ExceptionEvent;
22 import org.jboss.netty.channel.MessageEvent;
23 import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
24 import org.jboss.netty.example.localtime.LocalTimeProtocol.Continent;
25 import org.jboss.netty.example.localtime.LocalTimeProtocol.DayOfWeek;
26 import org.jboss.netty.example.localtime.LocalTimeProtocol.LocalTime;
27 import org.jboss.netty.example.localtime.LocalTimeProtocol.LocalTimes;
28 import org.jboss.netty.example.localtime.LocalTimeProtocol.Location;
29 import org.jboss.netty.example.localtime.LocalTimeProtocol.Locations;
30
31 import java.util.Calendar;
32 import java.util.TimeZone;
33
34 import static java.util.Calendar.*;
35
36 public class LocalTimeServerHandler extends SimpleChannelUpstreamHandler {
37
38 @Override
39 public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
40 if (e instanceof ChannelStateEvent) {
41 System.err.println(e);
42 }
43 super.handleUpstream(ctx, e);
44 }
45
46 @Override
47 public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
48
49 Locations locations = (Locations) e.getMessage();
50 long currentTime = System.currentTimeMillis();
51
52 LocalTimes.Builder builder = LocalTimes.newBuilder();
53 for (Location l: locations.getLocationList()) {
54 TimeZone tz = TimeZone.getTimeZone(toString(l.getContinent()) + '/' + l.getCity());
55 Calendar calendar = getInstance(tz);
56 calendar.setTimeInMillis(currentTime);
57
58 builder.addLocalTime(LocalTime.newBuilder().
59 setYear(calendar.get(YEAR)).
60 setMonth(calendar.get(MONTH) + 1).
61 setDayOfMonth(calendar.get(DAY_OF_MONTH)).
62 setDayOfWeek(DayOfWeek.valueOf(calendar.get(DAY_OF_WEEK))).
63 setHour(calendar.get(HOUR_OF_DAY)).
64 setMinute(calendar.get(MINUTE)).
65 setSecond(calendar.get(SECOND)).build());
66 }
67
68 e.getChannel().write(builder.build());
69 }
70
71 @Override
72 public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
73 e.getCause().printStackTrace();
74 e.getChannel().close();
75 }
76
77 private static String toString(Continent c) {
78 return c.name().charAt(0) + c.name().toLowerCase().substring(1);
79 }
80 }