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

org.apache.mina.transport.socket.AbstractDatagramSessionConfig Maven / Gradle / Ivy

/**
 * Copyright 2007-2015, Kaazing Corporation. All rights reserved.
 *
 * Licensed 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.apache.mina.transport.socket;

import org.apache.mina.core.session.AbstractIoSessionConfig;
import org.apache.mina.core.session.IoSessionConfig;

/**
 * TODO Add documentation
 * 
 * @author Apache MINA Project
 */
public abstract class AbstractDatagramSessionConfig extends
        AbstractIoSessionConfig implements DatagramSessionConfig {

    private static final boolean DEFAULT_CLOSE_ON_PORT_UNREACHABLE = true;

    private boolean closeOnPortUnreachable = DEFAULT_CLOSE_ON_PORT_UNREACHABLE;
    
    protected AbstractDatagramSessionConfig() {
        // Do nothing
    }

    @Override
    protected void doSetAll(IoSessionConfig config) {
        if (!(config instanceof DatagramSessionConfig)) {
            return;
        }
        
        if (config instanceof AbstractDatagramSessionConfig) {
            // Minimize unnecessary system calls by checking all 'propertyChanged' properties.
            AbstractDatagramSessionConfig cfg = (AbstractDatagramSessionConfig) config;
            if (cfg.isBroadcastChanged()) {
                setBroadcast(cfg.isBroadcast());
            }
            if (cfg.isReceiveBufferSizeChanged()) {
                setReceiveBufferSize(cfg.getReceiveBufferSize());
            }
            if (cfg.isReuseAddressChanged()) {
                setReuseAddress(cfg.isReuseAddress());
            }
            if (cfg.isSendBufferSizeChanged()) {
                setSendBufferSize(cfg.getSendBufferSize());
            }
            if (cfg.isTrafficClassChanged() && getTrafficClass() != cfg.getTrafficClass()) {
                setTrafficClass(cfg.getTrafficClass());
            }
        } else {
            DatagramSessionConfig cfg = (DatagramSessionConfig) config;
            setBroadcast(cfg.isBroadcast());
            setReceiveBufferSize(cfg.getReceiveBufferSize());
            setReuseAddress(cfg.isReuseAddress());
            setSendBufferSize(cfg.getSendBufferSize());
            if (getTrafficClass() != cfg.getTrafficClass()) {
                setTrafficClass(cfg.getTrafficClass());
            }
        }
    }
    
    /**
     * Returns true if and only if the broadcast property
     * has been changed by its setter method.  The system call related with
     * the property is made only when this method returns true.  By
     * default, this method always returns true to simplify implementation
     * of subclasses, but overriding the default behavior is always encouraged.
     */
    protected boolean isBroadcastChanged() {
        return true;
    }

    /**
     * Returns true if and only if the receiveBufferSize property
     * has been changed by its setter method.  The system call related with
     * the property is made only when this method returns true.  By
     * default, this method always returns true to simplify implementation
     * of subclasses, but overriding the default behavior is always encouraged.
     */
    protected boolean isReceiveBufferSizeChanged() {
        return true;
    }

    /**
     * Returns true if and only if the reuseAddress property
     * has been changed by its setter method.  The system call related with
     * the property is made only when this method returns true.  By
     * default, this method always returns true to simplify implementation
     * of subclasses, but overriding the default behavior is always encouraged.
     */
    protected boolean isReuseAddressChanged() {
        return true;
    }

    /**
     * Returns true if and only if the sendBufferSize property
     * has been changed by its setter method.  The system call related with
     * the property is made only when this method returns true.  By
     * default, this method always returns true to simplify implementation
     * of subclasses, but overriding the default behavior is always encouraged.
     */
    protected boolean isSendBufferSizeChanged() {
        return true;
    }

    /**
     * Returns true if and only if the trafficClass property
     * has been changed by its setter method.  The system call related with
     * the property is made only when this method returns true.  By
     * default, this method always returns true to simplify implementation
     * of subclasses, but overriding the default behavior is always encouraged.
     */
    protected  boolean isTrafficClassChanged() {
        return true;
    }
    
    /**
     * {@inheritDoc}
     */
    public boolean isCloseOnPortUnreachable() {
        return closeOnPortUnreachable;
    }

    /**
     * {@inheritDoc}
     */
    public void setCloseOnPortUnreachable(boolean closeOnPortUnreachable) {
        this.closeOnPortUnreachable = closeOnPortUnreachable;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy