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 static java.util.Calendar.*;
19
20 import java.util.Calendar;
21 import java.util.TimeZone;
22 import java.util.logging.Level;
23 import java.util.logging.Logger;
24
25 import org.jboss.netty.channel.ChannelEvent;
26 import org.jboss.netty.channel.ChannelHandlerContext;
27 import org.jboss.netty.channel.ChannelStateEvent;
28 import org.jboss.netty.channel.ExceptionEvent;
29 import org.jboss.netty.channel.MessageEvent;
30 import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
31 import org.jboss.netty.example.localtime.LocalTimeProtocol.Continent;
32 import org.jboss.netty.example.localtime.LocalTimeProtocol.DayOfWeek;
33 import org.jboss.netty.example.localtime.LocalTimeProtocol.LocalTime;
34 import org.jboss.netty.example.localtime.LocalTimeProtocol.LocalTimes;
35 import org.jboss.netty.example.localtime.LocalTimeProtocol.Location;
36 import org.jboss.netty.example.localtime.LocalTimeProtocol.Locations;
37
38
39
40
41
42
43
44 public class LocalTimeServerHandler extends SimpleChannelUpstreamHandler {
45
46 private static final Logger logger = Logger.getLogger(
47 LocalTimeServerHandler.class.getName());
48
49 @Override
50 public void handleUpstream(
51 ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
52 if (e instanceof ChannelStateEvent) {
53 logger.info(e.toString());
54 }
55 super.handleUpstream(ctx, e);
56 }
57
58 @Override
59 public void messageReceived(
60 ChannelHandlerContext ctx, MessageEvent e) {
61
62 Locations locations = (Locations) e.getMessage();
63 long currentTime = System.currentTimeMillis();
64
65 LocalTimes.Builder builder = LocalTimes.newBuilder();
66 for (Location l: locations.getLocationList()) {
67 TimeZone tz = TimeZone.getTimeZone(
68 toString(l.getContinent()) + '/' + l.getCity());
69 Calendar calendar = Calendar.getInstance(tz);
70 calendar.setTimeInMillis(currentTime);
71
72 builder.addLocalTime(LocalTime.newBuilder().
73 setYear(calendar.get(YEAR)).
74 setMonth(calendar.get(MONTH) + 1).
75 setDayOfMonth(calendar.get(DAY_OF_MONTH)).
76 setDayOfWeek(DayOfWeek.valueOf(calendar.get(DAY_OF_WEEK))).
77 setHour(calendar.get(HOUR_OF_DAY)).
78 setMinute(calendar.get(MINUTE)).
79 setSecond(calendar.get(SECOND)).build());
80 }
81
82 e.getChannel().write(builder.build());
83 }
84
85 @Override
86 public void exceptionCaught(
87 ChannelHandlerContext ctx, ExceptionEvent e) {
88 logger.log(
89 Level.WARNING,
90 "Unexpected exception from downstream.",
91 e.getCause());
92 e.getChannel().close();
93 }
94
95 private static String toString(Continent c) {
96 return "" + c.name().charAt(0) + c.name().toLowerCase().substring(1);
97 }
98 }