1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *
19 */
20 package org.apache.mina.common;
21
22 import java.nio.channels.SelectionKey;
23
24 /**
25 * A type-safe mask that is used to control the traffic of {@link IoSession}
26 * with {@link IoSession#setTrafficMask(TrafficMask)}.
27 *
28 * @author The Apache Directory Project (mina-dev@directory.apache.org)
29 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (Fri, 13 Jul 2007) $
30 */
31 public class TrafficMask {
32 /**
33 * This mask suspends both reads and writes.
34 */
35 public static final TrafficMask NONE = new TrafficMask(0, "none");
36
37 /**
38 * This mask suspends writes, and resumes reads if reads were suspended.
39 */
40 public static final TrafficMask READ = new TrafficMask(
41 SelectionKey.OP_READ, "read");
42
43 /**
44 * This mask suspends reads, and resumes writes if writes were suspended.
45 */
46 public static final TrafficMask WRITE = new TrafficMask(
47 SelectionKey.OP_WRITE, "write");
48
49 /**
50 * This mask resumes both reads and writes if any of them were suspended.
51 */
52 public static final TrafficMask ALL = new TrafficMask(SelectionKey.OP_READ
53 | SelectionKey.OP_WRITE, "all");
54
55 /**
56 * Returns an appropriate {@link TrafficMask} instance from the
57 * specified <tt>interestOps</tt>.
58 * @see SelectionKey
59 */
60 public static TrafficMask getInstance(int interestOps) {
61 boolean read = (interestOps & SelectionKey.OP_READ) != 0;
62 boolean write = (interestOps & SelectionKey.OP_WRITE) != 0;
63 if (read) {
64 if (write) {
65 return ALL;
66 } else {
67 return READ;
68 }
69 } else if (write) {
70 return WRITE;
71 } else {
72 return NONE;
73 }
74 }
75
76 private final int interestOps;
77
78 private final String name;
79
80 private TrafficMask(int interestOps, String name) {
81 this.interestOps = interestOps;
82 this.name = name;
83 }
84
85 /**
86 * Returns the name of this mask.
87 */
88 public String getName() {
89 return name;
90 }
91
92 /**
93 * Returns <tt>true</tt> if this mask allows a read operation.
94 */
95 public boolean isReadable() {
96 return (interestOps & SelectionKey.OP_READ) != 0;
97 }
98
99 /**
100 * Returns <tt>true</tt> if this mask allows a write operation.
101 */
102 public boolean isWritable() {
103 return (interestOps & SelectionKey.OP_WRITE) != 0;
104 }
105
106 /**
107 * Returns an interestOps of {@link SelectionKey} for this mask.
108 */
109 public int getInterestOps() {
110 return interestOps;
111 }
112
113 /**
114 * Peforms an <tt>AND</tt> operation on this mask with the specified
115 * <tt>mask</tt> and returns the result.
116 */
117 public TrafficMask and(TrafficMask mask) {
118 return getInstance(interestOps & mask.interestOps);
119 }
120
121 /**
122 * Peforms an <tt>OR</tt> operation on this mask with the specified
123 * <tt>mask</tt> and returns the result.
124 */
125 public TrafficMask or(TrafficMask mask) {
126 return getInstance(interestOps | mask.interestOps);
127 }
128
129 /**
130 * Returns a negated mask of this one.
131 */
132 public TrafficMask not() {
133 return getInstance(~interestOps);
134 }
135
136 /**
137 * Peforms an <tt>XOR</tt> operation on this mask with the specified
138 * <tt>mask</tt> and returns the result.
139 */
140 public TrafficMask xor(TrafficMask mask) {
141 return getInstance(interestOps ^ mask.interestOps);
142 }
143
144 public String toString() {
145 return name;
146 }
147 }