1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.core;
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.List;
26 import java.util.concurrent.TimeUnit;
27
28 import org.apache.mina.core.buffer.IoBuffer;
29 import org.apache.mina.core.future.IoFuture;
30 import org.apache.mina.core.future.WriteFuture;
31 import org.apache.mina.core.session.IoSession;
32
33
34
35
36
37
38
39
40 public class IoUtil {
41
42 private static final IoSession[] EMPTY_SESSIONS = new IoSession[0];
43
44
45
46
47
48
49 public static List<WriteFuture> broadcast(Object message, Collection<IoSession> sessions) {
50 List<WriteFuture> answer = new ArrayList<WriteFuture>(sessions.size());
51 broadcast(message, sessions.iterator(), answer);
52 return answer;
53 }
54
55
56
57
58
59
60 public static List<WriteFuture> broadcast(Object message, Iterable<IoSession> sessions) {
61 List<WriteFuture> answer = new ArrayList<WriteFuture>();
62 broadcast(message, sessions.iterator(), answer);
63 return answer;
64 }
65
66
67
68
69
70
71 public static List<WriteFuture> broadcast(Object message, Iterator<IoSession> sessions) {
72 List<WriteFuture> answer = new ArrayList<WriteFuture>();
73 broadcast(message, sessions, answer);
74 return answer;
75 }
76
77
78
79
80
81
82 public static List<WriteFuture> broadcast(Object message, IoSession... sessions) {
83 if (sessions == null) {
84 sessions = EMPTY_SESSIONS;
85 }
86
87 List<WriteFuture> answer = new ArrayList<WriteFuture>(sessions.length);
88 if (message instanceof IoBuffer) {
89 for (IoSession s: sessions) {
90 answer.add(s.write(((IoBuffer) message).duplicate()));
91 }
92 } else {
93 for (IoSession s: sessions) {
94 answer.add(s.write(message));
95 }
96 }
97 return answer;
98 }
99
100 private static void broadcast(Object message, Iterator<IoSession> sessions, Collection<WriteFuture> answer) {
101 if (message instanceof IoBuffer) {
102 while (sessions.hasNext()) {
103 IoSession s = sessions.next();
104 answer.add(s.write(((IoBuffer) message).duplicate()));
105 }
106 } else {
107 while (sessions.hasNext()) {
108 IoSession s = sessions.next();
109 answer.add(s.write(message));
110 }
111 }
112 }
113
114 public static void await(Iterable<? extends IoFuture> futures) throws InterruptedException {
115 for (IoFuture f: futures) {
116 f.await();
117 }
118 }
119
120 public static void awaitUninterruptably(Iterable<? extends IoFuture> futures) {
121 for (IoFuture f: futures) {
122 f.awaitUninterruptibly();
123 }
124 }
125
126 public static boolean await(Iterable<? extends IoFuture> futures, long timeout, TimeUnit unit) throws InterruptedException {
127 return await(futures, unit.toMillis(timeout));
128 }
129
130 public static boolean await(Iterable<? extends IoFuture> futures, long timeoutMillis) throws InterruptedException {
131 return await0(futures, timeoutMillis, true);
132 }
133
134 public static boolean awaitUninterruptibly(Iterable<? extends IoFuture> futures, long timeout, TimeUnit unit) {
135 return awaitUninterruptibly(futures, unit.toMillis(timeout));
136 }
137
138 public static boolean awaitUninterruptibly(Iterable<? extends IoFuture> futures, long timeoutMillis) {
139 try {
140 return await0(futures, timeoutMillis, false);
141 } catch (InterruptedException e) {
142 throw new InternalError();
143 }
144 }
145
146 private static boolean await0(Iterable<? extends IoFuture> futures, long timeoutMillis, boolean interruptable) throws InterruptedException {
147 long startTime = timeoutMillis <= 0 ? 0 : System.currentTimeMillis();
148 long waitTime = timeoutMillis;
149
150 boolean lastComplete = true;
151 Iterator<? extends IoFuture> i = futures.iterator();
152 while (i.hasNext()) {
153 IoFuture f = i.next();
154 do {
155 if (interruptable) {
156 lastComplete = f.await(waitTime);
157 } else {
158 lastComplete = f.awaitUninterruptibly(waitTime);
159 }
160
161 waitTime = timeoutMillis - (System.currentTimeMillis() - startTime);
162
163 if (lastComplete || waitTime <= 0) {
164 break;
165 }
166 } while (!lastComplete);
167
168 if (waitTime <= 0) {
169 break;
170 }
171 }
172
173 return lastComplete && !i.hasNext();
174 }
175
176 private IoUtil() {
177 }
178 }