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 }