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