001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: *
019: */
020: package org.apache.mina.common;
021:
022: import java.nio.channels.SelectionKey;
023:
024: /**
025: * A type-safe mask that is used to control the traffic of {@link IoSession}
026: * with {@link IoSession#setTrafficMask(TrafficMask)}.
027: *
028: * @author The Apache MINA Project (dev@mina.apache.org)
029: * @version $Rev: 576217 $, $Date: 2007-09-16 17:55:27 -0600 (Sun, 16 Sep 2007) $
030: */
031: public class TrafficMask {
032: /**
033: * This mask suspends both reads and writes.
034: */
035: public static final TrafficMask NONE = new TrafficMask(0, "none");
036:
037: /**
038: * This mask suspends writes, and resumes reads if reads were suspended.
039: */
040: public static final TrafficMask READ = new TrafficMask(
041: SelectionKey.OP_READ, "read");
042:
043: /**
044: * This mask suspends reads, and resumes writes if writes were suspended.
045: */
046: public static final TrafficMask WRITE = new TrafficMask(
047: SelectionKey.OP_WRITE, "write");
048:
049: /**
050: * This mask resumes both reads and writes if any of them were suspended.
051: */
052: public static final TrafficMask ALL = new TrafficMask(
053: SelectionKey.OP_READ | SelectionKey.OP_WRITE, "all");
054:
055: /**
056: * Returns an appropriate {@link TrafficMask} instance from the
057: * specified <tt>interestOps</tt>.
058: * @see SelectionKey
059: */
060: public static TrafficMask getInstance(int interestOps) {
061: boolean read = (interestOps & SelectionKey.OP_READ) != 0;
062: boolean write = (interestOps & SelectionKey.OP_WRITE) != 0;
063: if (read) {
064: if (write) {
065: return ALL;
066: } else {
067: return READ;
068: }
069: } else if (write) {
070: return WRITE;
071: } else {
072: return NONE;
073: }
074: }
075:
076: private final int interestOps;
077:
078: private final String name;
079:
080: private TrafficMask(int interestOps, String name) {
081: this .interestOps = interestOps;
082: this .name = name;
083: }
084:
085: /**
086: * Returns the name of this mask.
087: */
088: public String getName() {
089: return name;
090: }
091:
092: /**
093: * Returns <tt>true</tt> if this mask allows a read operation.
094: */
095: public boolean isReadable() {
096: return (interestOps & SelectionKey.OP_READ) != 0;
097: }
098:
099: /**
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: @Override
145: public String toString() {
146: return name;
147: }
148: }
|