All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.littleshoot.mina.common.TrafficMask Maven / Gradle / Ivy

There is a newer version: 1.4
Show newest version
/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *  
 *    http://www.apache.org/licenses/LICENSE-2.0
 *  
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License. 
 *  
 */
package org.littleshoot.mina.common;

import java.nio.channels.SelectionKey;

/**
 * A type-safe mask that is used to control the traffic of {@link IoSession}
 * with {@link IoSession#setTrafficMask(TrafficMask)}.
 *
 * @author The Apache Directory Project ([email protected])
 * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (Fri, 13 Jul 2007) $
 */
public class TrafficMask {
    /**
     * This mask suspends both reads and writes.
     */
    public static final TrafficMask NONE = new TrafficMask(0, "none");

    /**
     * This mask suspends writes, and resumes reads if reads were suspended.
     */
    public static final TrafficMask READ = new TrafficMask(
            SelectionKey.OP_READ, "read");

    /**
     * This mask suspends reads, and resumes writes if writes were suspended.
     */
    public static final TrafficMask WRITE = new TrafficMask(
            SelectionKey.OP_WRITE, "write");

    /**
     * This mask resumes both reads and writes if any of them were suspended.
     */
    public static final TrafficMask ALL = new TrafficMask(SelectionKey.OP_READ
            | SelectionKey.OP_WRITE, "all");

    /**
     * Returns an appropriate {@link TrafficMask} instance from the
     * specified interestOps.
     * @see SelectionKey
     */
    public static TrafficMask getInstance(int interestOps) {
        boolean read = (interestOps & SelectionKey.OP_READ) != 0;
        boolean write = (interestOps & SelectionKey.OP_WRITE) != 0;
        if (read) {
            if (write) {
                return ALL;
            } else {
                return READ;
            }
        } else if (write) {
            return WRITE;
        } else {
            return NONE;
        }
    }

    private final int interestOps;

    private final String name;

    private TrafficMask(int interestOps, String name) {
        this.interestOps = interestOps;
        this.name = name;
    }

    /**
     * Returns the name of this mask.
     */
    public String getName() {
        return name;
    }

    /**
     * Returns true if this mask allows a read operation.
     */
    public boolean isReadable() {
        return (interestOps & SelectionKey.OP_READ) != 0;
    }

    /**
     * Returns true if this mask allows a write operation.
     */
    public boolean isWritable() {
        return (interestOps & SelectionKey.OP_WRITE) != 0;
    }

    /**
     * Returns an interestOps of {@link SelectionKey} for this mask.
     */
    public int getInterestOps() {
        return interestOps;
    }

    /**
     * Peforms an AND operation on this mask with the specified
     * mask and returns the result.
     */
    public TrafficMask and(TrafficMask mask) {
        return getInstance(interestOps & mask.interestOps);
    }

    /**
     * Peforms an OR operation on this mask with the specified
     * mask and returns the result.
     */
    public TrafficMask or(TrafficMask mask) {
        return getInstance(interestOps | mask.interestOps);
    }

    /**
     * Returns a negated mask of this one.
     */
    public TrafficMask not() {
        return getInstance(~interestOps);
    }

    /**
     * Peforms an XOR operation on this mask with the specified
     * mask and returns the result.
     */
    public TrafficMask xor(TrafficMask mask) {
        return getInstance(interestOps ^ mask.interestOps);
    }

    public String toString() {
        return name;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy