1 /*
2  * Copyright 2012 The Netty Project
3  *
4  * The Netty Project licenses this file to you under the Apache License,
5  * version 2.0 (the "License"); you may not use this file except in compliance
6  * with the License. You may obtain a copy of the License at:
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations
14  * under the License.
15  */

16 package io.netty.channel;
17
18 import io.netty.buffer.ByteBufAllocator;
19 import io.netty.util.AbstractConstant;
20 import io.netty.util.ConstantPool;
21 import io.netty.util.internal.ObjectUtil;
22
23 import java.net.InetAddress;
24 import java.net.NetworkInterface;
25
26 /**
27  * A {@link ChannelOption} allows to configure a {@link ChannelConfig} in a type-safe
28  * way. Which {@link ChannelOption} is supported depends on the actual implementation
29  * of {@link ChannelConfig} and may depend on the nature of the transport it belongs
30  * to.
31  *
32  * @param <T>   the type of the value which is valid for the {@link ChannelOption}
33  */

34 public class ChannelOption<T> extends AbstractConstant<ChannelOption<T>> {
35
36     private static final ConstantPool<ChannelOption<Object>> pool = new ConstantPool<ChannelOption<Object>>() {
37         @Override
38         protected ChannelOption<Object> newConstant(int id, String name) {
39             return new ChannelOption<Object>(id, name);
40         }
41     };
42
43     /**
44      * Returns the {@link ChannelOption} of the specified name.
45      */

46     @SuppressWarnings("unchecked")
47     public static <T> ChannelOption<T> valueOf(String name) {
48         return (ChannelOption<T>) pool.valueOf(name);
49     }
50
51     /**
52      * Shortcut of {@link #valueOf(String) valueOf(firstNameComponent.getName() + "#" + secondNameComponent)}.
53      */

54     @SuppressWarnings("unchecked")
55     public static <T> ChannelOption<T> valueOf(Class<?> firstNameComponent, String secondNameComponent) {
56         return (ChannelOption<T>) pool.valueOf(firstNameComponent, secondNameComponent);
57     }
58
59     /**
60      * Returns {@code trueif a {@link ChannelOption} exists for the given {@code name}.
61      */

62     public static boolean exists(String name) {
63         return pool.exists(name);
64     }
65
66     /**
67      * Creates a new {@link ChannelOption} for the given {@code name} or fail with an
68      * {@link IllegalArgumentException} if a {@link ChannelOption} for the given {@code name} exists.
69      *
70      * @deprecated use {@link #valueOf(String)}.
71      */

72     @Deprecated
73     @SuppressWarnings("unchecked")
74     public static <T> ChannelOption<T> newInstance(String name) {
75         return (ChannelOption<T>) pool.newInstance(name);
76     }
77
78     public static final ChannelOption<ByteBufAllocator> ALLOCATOR = valueOf("ALLOCATOR");
79     public static final ChannelOption<RecvByteBufAllocator> RCVBUF_ALLOCATOR = valueOf("RCVBUF_ALLOCATOR");
80     public static final ChannelOption<MessageSizeEstimator> MESSAGE_SIZE_ESTIMATOR = valueOf("MESSAGE_SIZE_ESTIMATOR");
81
82     public static final ChannelOption<Integer> CONNECT_TIMEOUT_MILLIS = valueOf("CONNECT_TIMEOUT_MILLIS");
83     /**
84      * @deprecated Use {@link MaxMessagesRecvByteBufAllocator}
85      * and {@link MaxMessagesRecvByteBufAllocator#maxMessagesPerRead(int)}.
86      */

87     @Deprecated
88     public static final ChannelOption<Integer> MAX_MESSAGES_PER_READ = valueOf("MAX_MESSAGES_PER_READ");
89     public static final ChannelOption<Integer> WRITE_SPIN_COUNT = valueOf("WRITE_SPIN_COUNT");
90     /**
91      * @deprecated Use {@link #WRITE_BUFFER_WATER_MARK}
92      */

93     @Deprecated
94     public static final ChannelOption<Integer> WRITE_BUFFER_HIGH_WATER_MARK = valueOf("WRITE_BUFFER_HIGH_WATER_MARK");
95     /**
96      * @deprecated Use {@link #WRITE_BUFFER_WATER_MARK}
97      */

98     @Deprecated
99     public static final ChannelOption<Integer> WRITE_BUFFER_LOW_WATER_MARK = valueOf("WRITE_BUFFER_LOW_WATER_MARK");
100     public static final ChannelOption<WriteBufferWaterMark> WRITE_BUFFER_WATER_MARK =
101             valueOf("WRITE_BUFFER_WATER_MARK");
102
103     public static final ChannelOption<Boolean> ALLOW_HALF_CLOSURE = valueOf("ALLOW_HALF_CLOSURE");
104     public static final ChannelOption<Boolean> AUTO_READ = valueOf("AUTO_READ");
105
106     /**
107      * If {@code true} then the {@link Channel} is closed automatically and immediately on write failure.
108      * The default value is {@code true}.
109      */

110     public static final ChannelOption<Boolean> AUTO_CLOSE = valueOf("AUTO_CLOSE");
111
112     public static final ChannelOption<Boolean> SO_BROADCAST = valueOf("SO_BROADCAST");
113     public static final ChannelOption<Boolean> SO_KEEPALIVE = valueOf("SO_KEEPALIVE");
114     public static final ChannelOption<Integer> SO_SNDBUF = valueOf("SO_SNDBUF");
115     public static final ChannelOption<Integer> SO_RCVBUF = valueOf("SO_RCVBUF");
116     public static final ChannelOption<Boolean> SO_REUSEADDR = valueOf("SO_REUSEADDR");
117     public static final ChannelOption<Integer> SO_LINGER = valueOf("SO_LINGER");
118     public static final ChannelOption<Integer> SO_BACKLOG = valueOf("SO_BACKLOG");
119     public static final ChannelOption<Integer> SO_TIMEOUT = valueOf("SO_TIMEOUT");
120
121     public static final ChannelOption<Integer> IP_TOS = valueOf("IP_TOS");
122     public static final ChannelOption<InetAddress> IP_MULTICAST_ADDR = valueOf("IP_MULTICAST_ADDR");
123     public static final ChannelOption<NetworkInterface> IP_MULTICAST_IF = valueOf("IP_MULTICAST_IF");
124     public static final ChannelOption<Integer> IP_MULTICAST_TTL = valueOf("IP_MULTICAST_TTL");
125     public static final ChannelOption<Boolean> IP_MULTICAST_LOOP_DISABLED = valueOf("IP_MULTICAST_LOOP_DISABLED");
126
127     public static final ChannelOption<Boolean> TCP_NODELAY = valueOf("TCP_NODELAY");
128
129     @Deprecated
130     public static final ChannelOption<Boolean> DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION =
131             valueOf("DATAGRAM_CHANNEL_ACTIVE_ON_REGISTRATION");
132
133     public static final ChannelOption<Boolean> SINGLE_EVENTEXECUTOR_PER_GROUP =
134             valueOf("SINGLE_EVENTEXECUTOR_PER_GROUP");
135
136     /**
137      * Creates a new {@link ChannelOption} with the specified unique {@code name}.
138      */

139     private ChannelOption(int id, String name) {
140         super(id, name);
141     }
142
143     @Deprecated
144     protected ChannelOption(String name) {
145         this(pool.nextId(), name);
146     }
147
148     /**
149      * Validate the value which is set for the {@link ChannelOption}. Sub-classes
150      * may override this for special checks.
151      */

152     public void validate(T value) {
153         ObjectUtil.checkNotNull(value, "value");
154     }
155 }
156