View Javadoc

    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.transport.socket;
    21
    22  import org.apache.mina.core.session.AbstractIoSessionConfig;
    23  import org.apache.mina.core.session.IoSessionConfig;
    24
    25  /**
    26   * TODO Add documentation
    27   *
    28   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
    29   */
    30  public abstract class AbstractDatagramSessionConfig extends AbstractIoSessionConfig implements DatagramSessionConfig {
    31
    32      private static final boolean DEFAULT_CLOSE_ON_PORT_UNREACHABLE = true;
    33
    34      private boolean closeOnPortUnreachable = DEFAULT_CLOSE_ON_PORT_UNREACHABLE;
    35
    36      protected AbstractDatagramSessionConfig() {
    37          // Do nothing
    38      }
    39
    40      @Override
    41      protected void doSetAll(IoSessionConfig config) {
    42          if (!(config instanceof DatagramSessionConfig)) {
    43              return;
    44          }
    45
    46          if (config instanceof AbstractDatagramSessionConfig) {
    47              // Minimize unnecessary system calls by checking all 'propertyChanged' properties.
    48              AbstractDatagramSessionConfig cfg = (AbstractDatagramSessionConfig) config;
    49              if (cfg.isBroadcastChanged()) {
    50                  setBroadcast(cfg.isBroadcast());
    51              }
    52              if (cfg.isReceiveBufferSizeChanged()) {
    53                  setReceiveBufferSize(cfg.getReceiveBufferSize());
    54              }
    55              if (cfg.isReuseAddressChanged()) {
    56                  setReuseAddress(cfg.isReuseAddress());
    57              }
    58              if (cfg.isSendBufferSizeChanged()) {
    59                  setSendBufferSize(cfg.getSendBufferSize());
    60              }
    61              if (cfg.isTrafficClassChanged() && getTrafficClass() != cfg.getTrafficClass()) {
    62                  setTrafficClass(cfg.getTrafficClass());
    63              }
    64          } else {
    65              DatagramSessionConfig cfg = (DatagramSessionConfig) config;
    66              setBroadcast(cfg.isBroadcast());
    67              setReceiveBufferSize(cfg.getReceiveBufferSize());
    68              setReuseAddress(cfg.isReuseAddress());
    69              setSendBufferSize(cfg.getSendBufferSize());
    70              if (getTrafficClass() != cfg.getTrafficClass()) {
    71                  setTrafficClass(cfg.getTrafficClass());
    72              }
    73          }
    74      }
    75
    76      /**
    77       * Returns <tt>true</tt> if and only if the <tt>broadcast</tt> property
    78       * has been changed by its setter method.  The system call related with
    79       * the property is made only when this method returns <tt>true</tt>.  By
    80       * default, this method always returns <tt>true</tt> to simplify implementation
    81       * of subclasses, but overriding the default behavior is always encouraged.
    82       */
    83      protected boolean isBroadcastChanged() {
    84          return true;
    85      }
    86
    87      /**
    88       * Returns <tt>true</tt> if and only if the <tt>receiveBufferSize</tt> property
    89       * has been changed by its setter method.  The system call related with
    90       * the property is made only when this method returns <tt>true</tt>.  By
    91       * default, this method always returns <tt>true</tt> to simplify implementation
    92       * of subclasses, but overriding the default behavior is always encouraged.
    93       */
    94      protected boolean isReceiveBufferSizeChanged() {
    95          return true;
    96      }
    97
    98      /**
    99       * Returns <tt>true</tt> if and only if the <tt>reuseAddress</tt> property
    100      * has been changed by its setter method.  The system call related with
    101      * the property is made only when this method returns <tt>true</tt>.  By
    102      * default, this method always returns <tt>true</tt> to simplify implementation
    103      * of subclasses, but overriding the default behavior is always encouraged.
    104      */
    105     protected boolean isReuseAddressChanged() {
    106         return true;
    107     }
    108
    109     /**
    110      * Returns <tt>true</tt> if and only if the <tt>sendBufferSize</tt> property
    111      * has been changed by its setter method.  The system call related with
    112      * the property is made only when this method returns <tt>true</tt>.  By
    113      * default, this method always returns <tt>true</tt> to simplify implementation
    114      * of subclasses, but overriding the default behavior is always encouraged.
    115      */
    116     protected boolean isSendBufferSizeChanged() {
    117         return true;
    118     }
    119
    120     /**
    121      * Returns <tt>true</tt> if and only if the <tt>trafficClass</tt> property
    122      * has been changed by its setter method.  The system call related with
    123      * the property is made only when this method returns <tt>true</tt>.  By
    124      * default, this method always returns <tt>true</tt> to simplify implementation
    125      * of subclasses, but overriding the default behavior is always encouraged.
    126      */
    127     protected boolean isTrafficClassChanged() {
    128         return true;
    129     }
    130
    131     /**
    132      * {@inheritDoc}
    133      */
    134     public boolean isCloseOnPortUnreachable() {
    135         return closeOnPortUnreachable;
    136     }
    137
    138     /**
    139      * {@inheritDoc}
    140      */
    141     public void setCloseOnPortUnreachable(boolean closeOnPortUnreachable) {
    142         this.closeOnPortUnreachable = closeOnPortUnreachable;
    143     }
    144 }