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 AbstractSocketSessionConfig extends AbstractIoSessionConfig implements SocketSessionConfig {
31
32 protected AbstractSocketSessionConfig() {
33 // Do nothing
34 }
35
36 @Override
37 protected final void doSetAll(IoSessionConfig config) {
38 if (!(config instanceof SocketSessionConfig)) {
39 return;
40 }
41
42 if (config instanceof AbstractSocketSessionConfig) {
43 // Minimize unnecessary system calls by checking all 'propertyChanged' properties.
44 AbstractSocketSessionConfig cfg = (AbstractSocketSessionConfig) config;
45 if (cfg.isKeepAliveChanged()) {
46 setKeepAlive(cfg.isKeepAlive());
47 }
48 if (cfg.isOobInlineChanged()) {
49 setOobInline(cfg.isOobInline());
50 }
51 if (cfg.isReceiveBufferSizeChanged()) {
52 setReceiveBufferSize(cfg.getReceiveBufferSize());
53 }
54 if (cfg.isReuseAddressChanged()) {
55 setReuseAddress(cfg.isReuseAddress());
56 }
57 if (cfg.isSendBufferSizeChanged()) {
58 setSendBufferSize(cfg.getSendBufferSize());
59 }
60 if (cfg.isSoLingerChanged()) {
61 setSoLinger(cfg.getSoLinger());
62 }
63 if (cfg.isTcpNoDelayChanged()) {
64 setTcpNoDelay(cfg.isTcpNoDelay());
65 }
66 if (cfg.isTrafficClassChanged() && getTrafficClass() != cfg.getTrafficClass()) {
67 setTrafficClass(cfg.getTrafficClass());
68 }
69 } else {
70 SocketSessionConfig cfg = (SocketSessionConfig) config;
71 setKeepAlive(cfg.isKeepAlive());
72 setOobInline(cfg.isOobInline());
73 setReceiveBufferSize(cfg.getReceiveBufferSize());
74 setReuseAddress(cfg.isReuseAddress());
75 setSendBufferSize(cfg.getSendBufferSize());
76 setSoLinger(cfg.getSoLinger());
77 setTcpNoDelay(cfg.isTcpNoDelay());
78 if (getTrafficClass() != cfg.getTrafficClass()) {
79 setTrafficClass(cfg.getTrafficClass());
80 }
81 }
82 }
83
84 /**
85 * Returns <tt>true</tt> if and only if the <tt>keepAlive</tt> property
86 * has been changed by its setter method. The system call related with
87 * the property is made only when this method returns <tt>true</tt>. By
88 * default, this method always returns <tt>true</tt> to simplify implementation
89 * of subclasses, but overriding the default behavior is always encouraged.
90 */
91 protected boolean isKeepAliveChanged() {
92 return true;
93 }
94
95 /**
96 * Returns <tt>true</tt> if and only if the <tt>oobInline</tt> property
97 * has been changed by its setter method. The system call related with
98 * the property is made only when this method returns <tt>true</tt>. By
99 * default, this method always returns <tt>true</tt> to simplify implementation
100 * of subclasses, but overriding the default behavior is always encouraged.
101 */
102 protected boolean isOobInlineChanged() {
103 return true;
104 }
105
106 /**
107 * Returns <tt>true</tt> if and only if the <tt>receiveBufferSize</tt> property
108 * has been changed by its setter method. The system call related with
109 * the property is made only when this method returns <tt>true</tt>. By
110 * default, this method always returns <tt>true</tt> to simplify implementation
111 * of subclasses, but overriding the default behavior is always encouraged.
112 */
113 protected boolean isReceiveBufferSizeChanged() {
114 return true;
115 }
116
117 /**
118 * Returns <tt>true</tt> if and only if the <tt>reuseAddress</tt> property
119 * has been changed by its setter method. The system call related with
120 * the property is made only when this method returns <tt>true</tt>. By
121 * default, this method always returns <tt>true</tt> to simplify implementation
122 * of subclasses, but overriding the default behavior is always encouraged.
123 */
124 protected boolean isReuseAddressChanged() {
125 return true;
126 }
127
128 /**
129 * Returns <tt>true</tt> if and only if the <tt>sendBufferSize</tt> property
130 * has been changed by its setter method. The system call related with
131 * the property is made only when this method returns <tt>true</tt>. By
132 * default, this method always returns <tt>true</tt> to simplify implementation
133 * of subclasses, but overriding the default behavior is always encouraged.
134 */
135 protected boolean isSendBufferSizeChanged() {
136 return true;
137 }
138
139 /**
140 * Returns <tt>true</tt> if and only if the <tt>soLinger</tt> property
141 * has been changed by its setter method. The system call related with
142 * the property is made only when this method returns <tt>true</tt>. By
143 * default, this method always returns <tt>true</tt> to simplify implementation
144 * of subclasses, but overriding the default behavior is always encouraged.
145 */
146 protected boolean isSoLingerChanged() {
147 return true;
148 }
149
150 /**
151 * Returns <tt>true</tt> if and only if the <tt>tcpNoDelay</tt> property
152 * has been changed by its setter method. The system call related with
153 * the property is made only when this method returns <tt>true</tt>. By
154 * default, this method always returns <tt>true</tt> to simplify implementation
155 * of subclasses, but overriding the default behavior is always encouraged.
156 */
157 protected boolean isTcpNoDelayChanged() {
158 return true;
159 }
160
161 /**
162 * Returns <tt>true</tt> if and only if the <tt>trafficClass</tt> property
163 * has been changed by its setter method. The system call related with
164 * the property is made only when this method returns <tt>true</tt>. By
165 * default, this method always returns <tt>true</tt> to simplify implementation
166 * of subclasses, but overriding the default behavior is always encouraged.
167 */
168 protected boolean isTrafficClassChanged() {
169 return true;
170 }
171 }