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