diff --git a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandler.java b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandler.java index c04c950f76..672ebd3083 100644 --- a/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandler.java +++ b/codec-http/src/main/java/io/netty/handler/codec/http/websocketx/WebSocketServerProtocolHandler.java @@ -61,7 +61,7 @@ public class WebSocketServerProtocolHandler extends WebSocketProtocolHandler { } private static final AttributeKey HANDSHAKER_ATTR_KEY = - AttributeKey.valueOf(WebSocketServerHandshaker.class.getName() + ".HANDSHAKER"); + AttributeKey.valueOf(WebSocketServerHandshaker.class, "HANDSHAKER"); private final String websocketPath; private final String subprotocols; diff --git a/codec/src/main/java/io/netty/handler/codec/DecoderResult.java b/codec/src/main/java/io/netty/handler/codec/DecoderResult.java index d9d10295ff..054d3e86a6 100644 --- a/codec/src/main/java/io/netty/handler/codec/DecoderResult.java +++ b/codec/src/main/java/io/netty/handler/codec/DecoderResult.java @@ -19,8 +19,8 @@ import io.netty.util.Signal; public class DecoderResult { - protected static final Signal SIGNAL_UNFINISHED = Signal.valueOf(DecoderResult.class.getName() + ".UNFINISHED"); - protected static final Signal SIGNAL_SUCCESS = Signal.valueOf(DecoderResult.class.getName() + ".SUCCESS"); + protected static final Signal SIGNAL_UNFINISHED = Signal.valueOf(DecoderResult.class, "UNFINISHED"); + protected static final Signal SIGNAL_SUCCESS = Signal.valueOf(DecoderResult.class, "SUCCESS"); public static final DecoderResult UNFINISHED = new DecoderResult(SIGNAL_UNFINISHED); public static final DecoderResult SUCCESS = new DecoderResult(SIGNAL_SUCCESS); diff --git a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java index dc442e01e0..4023a6e187 100644 --- a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java @@ -266,7 +266,7 @@ import java.util.List; */ public abstract class ReplayingDecoder extends ByteToMessageDecoder { - static final Signal REPLAY = Signal.valueOf(ReplayingDecoder.class.getName() + ".REPLAY"); + static final Signal REPLAY = Signal.valueOf(ReplayingDecoder.class, "REPLAY"); private final ReplayingDecoderBuffer replayable = new ReplayingDecoderBuffer(); private S state; diff --git a/codec/src/main/java/io/netty/handler/codec/marshalling/ContextBoundUnmarshallerProvider.java b/codec/src/main/java/io/netty/handler/codec/marshalling/ContextBoundUnmarshallerProvider.java index 333c9bded9..1be65630cc 100644 --- a/codec/src/main/java/io/netty/handler/codec/marshalling/ContextBoundUnmarshallerProvider.java +++ b/codec/src/main/java/io/netty/handler/codec/marshalling/ContextBoundUnmarshallerProvider.java @@ -35,7 +35,7 @@ import org.jboss.marshalling.Unmarshaller; public class ContextBoundUnmarshallerProvider extends DefaultUnmarshallerProvider { private static final AttributeKey UNMARSHALLER = AttributeKey.valueOf( - ContextBoundUnmarshallerProvider.class.getName() + ".UNMARSHALLER"); + ContextBoundUnmarshallerProvider.class, "UNMARSHALLER"); public ContextBoundUnmarshallerProvider(MarshallerFactory factory, MarshallingConfiguration config) { super(factory, config); diff --git a/codec/src/main/java/io/netty/handler/codec/serialization/CompatibleObjectEncoder.java b/codec/src/main/java/io/netty/handler/codec/serialization/CompatibleObjectEncoder.java index 505f154b92..81543b870c 100644 --- a/codec/src/main/java/io/netty/handler/codec/serialization/CompatibleObjectEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/serialization/CompatibleObjectEncoder.java @@ -37,7 +37,7 @@ import java.io.Serializable; public class CompatibleObjectEncoder extends MessageToByteEncoder { private static final AttributeKey OOS = - AttributeKey.valueOf(CompatibleObjectEncoder.class.getName() + ".OOS"); + AttributeKey.valueOf(CompatibleObjectEncoder.class, "OOS"); private final int resetInterval; private int writtenObjects; diff --git a/common/src/main/java/io/netty/util/AttributeKey.java b/common/src/main/java/io/netty/util/AttributeKey.java index 7d88910316..4d52b94207 100644 --- a/common/src/main/java/io/netty/util/AttributeKey.java +++ b/common/src/main/java/io/netty/util/AttributeKey.java @@ -39,6 +39,14 @@ public final class AttributeKey extends AbstractConstant> { return (AttributeKey) pool.valueOf(name); } + /** + * Shortcut of {@link #valueOf(String) valueOf(firstNameComponent.getName() + "#" + secondNameComponent)}. + */ + @SuppressWarnings("unchecked") + public static AttributeKey valueOf(Class firstNameComponent, String secondNameComponent) { + return (AttributeKey) pool.valueOf(firstNameComponent, secondNameComponent); + } + private AttributeKey(int id, String name) { super(id, name); } diff --git a/common/src/main/java/io/netty/util/ConstantPool.java b/common/src/main/java/io/netty/util/ConstantPool.java index c3498f9af7..13601e59e8 100644 --- a/common/src/main/java/io/netty/util/ConstantPool.java +++ b/common/src/main/java/io/netty/util/ConstantPool.java @@ -31,13 +31,36 @@ public abstract class ConstantPool> { private int nextId = 1; /** - * Creates a new or the existing {@link Constant} mapped to the specified {@code name}. + * Shortcut of {@link #valueOf(String) valueOf(firstNameComponent.getName() + "#" + secondNameComponent)}. + */ + public T valueOf(Class firstNameComponent, String secondNameComponent) { + if (firstNameComponent == null) { + throw new NullPointerException("firstNameComponent"); + } + if (secondNameComponent == null) { + throw new NullPointerException("secondNameComponent"); + } + + return valueOf(firstNameComponent.getName() + '#' + secondNameComponent); + } + + /** + * Returns the {@link Constant} which is assigned to the specified {@code name}. + * If there's no such {@link Constant}, a new one will be created and returned. + * Once created, the subsequent calls with the same {@code name} will always return the previously created one + * (i.e. singleton.) + * + * @param name the name of the {@link Constant} */ public T valueOf(String name) { if (name == null) { throw new NullPointerException("name"); } + if (name.isEmpty()) { + throw new IllegalArgumentException("empty name"); + } + synchronized (constants) { T c = constants.get(name); if (c == null) { diff --git a/common/src/main/java/io/netty/util/Signal.java b/common/src/main/java/io/netty/util/Signal.java index cb94eb2ea8..320c1d6e7b 100644 --- a/common/src/main/java/io/netty/util/Signal.java +++ b/common/src/main/java/io/netty/util/Signal.java @@ -38,6 +38,13 @@ public final class Signal extends Error implements Constant { return pool.valueOf(name); } + /** + * Shortcut of {@link #valueOf(String) valueOf(firstNameComponent.getName() + "#" + secondNameComponent)}. + */ + public static Signal valueOf(Class firstNameComponent, String secondNameComponent) { + return pool.valueOf(firstNameComponent, secondNameComponent); + } + private final int id; private final String name; diff --git a/common/src/main/java/io/netty/util/concurrent/DefaultPromise.java b/common/src/main/java/io/netty/util/concurrent/DefaultPromise.java index fcacd61832..bd0ad3e4c9 100644 --- a/common/src/main/java/io/netty/util/concurrent/DefaultPromise.java +++ b/common/src/main/java/io/netty/util/concurrent/DefaultPromise.java @@ -41,8 +41,8 @@ public class DefaultPromise extends AbstractFuture implements Promise { return 0; } }; - private static final Signal SUCCESS = Signal.valueOf(DefaultPromise.class.getName() + ".SUCCESS"); - private static final Signal UNCANCELLABLE = Signal.valueOf(DefaultPromise.class.getName() + ".UNCANCELLABLE"); + private static final Signal SUCCESS = Signal.valueOf(DefaultPromise.class, "SUCCESS"); + private static final Signal UNCANCELLABLE = Signal.valueOf(DefaultPromise.class, "UNCANCELLABLE"); private static final CauseHolder CANCELLATION_CAUSE_HOLDER = new CauseHolder(new CancellationException()); static { diff --git a/common/src/test/java/io/netty/util/ConstantPoolTest.java b/common/src/test/java/io/netty/util/ConstantPoolTest.java index 3c1c35aa65..9e22109f26 100644 --- a/common/src/test/java/io/netty/util/ConstantPoolTest.java +++ b/common/src/test/java/io/netty/util/ConstantPoolTest.java @@ -81,4 +81,10 @@ public class ConstantPoolTest { assertThat(array[3], is(sameInstance(d))); assertThat(array[4], is(sameInstance(e))); } + + @Test + public void testComposedName() { + TestConstant a = pool.valueOf(Object.class, "A"); + assertThat(a.name(), is("java.lang.Object#A")); + } } diff --git a/handler/src/main/java/io/netty/handler/traffic/AbstractTrafficShapingHandler.java b/handler/src/main/java/io/netty/handler/traffic/AbstractTrafficShapingHandler.java index 743a51527c..d69f5798d2 100644 --- a/handler/src/main/java/io/netty/handler/traffic/AbstractTrafficShapingHandler.java +++ b/handler/src/main/java/io/netty/handler/traffic/AbstractTrafficShapingHandler.java @@ -73,10 +73,10 @@ public abstract class AbstractTrafficShapingHandler extends ChannelDuplexHandler */ protected long checkInterval = DEFAULT_CHECK_INTERVAL; // default 1 s - private static final AttributeKey READ_SUSPENDED = AttributeKey.valueOf( - AbstractTrafficShapingHandler.class.getName() + ".READ_SUSPENDED"); - private static final AttributeKey REOPEN_TASK = AttributeKey.valueOf( - AbstractTrafficShapingHandler.class.getName() + ".REOPEN_TASK"); + private static final AttributeKey READ_SUSPENDED = + AttributeKey.valueOf(AbstractTrafficShapingHandler.class, "READ_SUSPENDED"); + private static final AttributeKey REOPEN_TASK = + AttributeKey.valueOf(AbstractTrafficShapingHandler.class, "REOPEN_TASK"); /** * diff --git a/transport-rxtx/src/main/java/io/netty/channel/rxtx/RxtxChannelOption.java b/transport-rxtx/src/main/java/io/netty/channel/rxtx/RxtxChannelOption.java index c63c8af1fc..8d76822e98 100644 --- a/transport-rxtx/src/main/java/io/netty/channel/rxtx/RxtxChannelOption.java +++ b/transport-rxtx/src/main/java/io/netty/channel/rxtx/RxtxChannelOption.java @@ -28,14 +28,16 @@ import static io.netty.channel.ChannelOption.*; public final class RxtxChannelOption { - public static final ChannelOption BAUD_RATE = valueOf("BAUD_RATE"); - public static final ChannelOption DTR = valueOf("DTR"); - public static final ChannelOption RTS = valueOf("RTS"); - public static final ChannelOption STOP_BITS = valueOf("STOP_BITS"); - public static final ChannelOption DATA_BITS = valueOf("DATA_BITS"); - public static final ChannelOption PARITY_BIT = valueOf("PARITY_BIT"); - public static final ChannelOption WAIT_TIME = valueOf("WAIT_TIME"); - public static final ChannelOption READ_TIMEOUT = valueOf("READ_TIMEOUT"); + private static final Class T = RxtxChannelOption.class; + + public static final ChannelOption BAUD_RATE = valueOf(T, "BAUD_RATE"); + public static final ChannelOption DTR = valueOf(T, "DTR"); + public static final ChannelOption RTS = valueOf(T, "RTS"); + public static final ChannelOption STOP_BITS = valueOf(T, "STOP_BITS"); + public static final ChannelOption DATA_BITS = valueOf(T, "DATA_BITS"); + public static final ChannelOption PARITY_BIT = valueOf(T, "PARITY_BIT"); + public static final ChannelOption WAIT_TIME = valueOf(T, "WAIT_TIME"); + public static final ChannelOption READ_TIMEOUT = valueOf(T, "READ_TIMEOUT"); private RxtxChannelOption() { } } diff --git a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelOption.java b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelOption.java index 127424397f..7e171e72ca 100644 --- a/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelOption.java +++ b/transport-sctp/src/main/java/io/netty/channel/sctp/SctpChannelOption.java @@ -27,14 +27,17 @@ import static io.netty.channel.ChannelOption.*; */ public final class SctpChannelOption { - public static final ChannelOption SCTP_DISABLE_FRAGMENTS = valueOf("SCTP_DISABLE_FRAGMENTS"); - public static final ChannelOption SCTP_EXPLICIT_COMPLETE = valueOf("SCTP_EXPLICIT_COMPLETE"); - public static final ChannelOption SCTP_FRAGMENT_INTERLEAVE = valueOf("SCTP_FRAGMENT_INTERLEAVE"); - public static final ChannelOption SCTP_INIT_MAXSTREAMS = valueOf("SCTP_INIT_MAXSTREAMS"); + private static final Class T = SctpChannelOption.class; - public static final ChannelOption SCTP_NODELAY = valueOf("SCTP_NODELAY"); - public static final ChannelOption SCTP_PRIMARY_ADDR = valueOf("SCTP_PRIMARY_ADDR"); - public static final ChannelOption SCTP_SET_PEER_PRIMARY_ADDR = valueOf("SCTP_SET_PEER_PRIMARY_ADDR"); + public static final ChannelOption SCTP_DISABLE_FRAGMENTS = valueOf(T, "SCTP_DISABLE_FRAGMENTS"); + public static final ChannelOption SCTP_EXPLICIT_COMPLETE = valueOf(T, "SCTP_EXPLICIT_COMPLETE"); + public static final ChannelOption SCTP_FRAGMENT_INTERLEAVE = valueOf(T, "SCTP_FRAGMENT_INTERLEAVE"); + public static final ChannelOption SCTP_INIT_MAXSTREAMS = valueOf(T, "SCTP_INIT_MAXSTREAMS"); + + public static final ChannelOption SCTP_NODELAY = valueOf(T, "SCTP_NODELAY"); + public static final ChannelOption SCTP_PRIMARY_ADDR = valueOf(T, "SCTP_PRIMARY_ADDR"); + public static final ChannelOption SCTP_SET_PEER_PRIMARY_ADDR = + valueOf(T, "SCTP_SET_PEER_PRIMARY_ADDR"); private SctpChannelOption() { } } diff --git a/transport-udt/src/main/java/io/netty/channel/udt/UdtChannelOption.java b/transport-udt/src/main/java/io/netty/channel/udt/UdtChannelOption.java index 6a9f838547..41a92a9c0f 100644 --- a/transport-udt/src/main/java/io/netty/channel/udt/UdtChannelOption.java +++ b/transport-udt/src/main/java/io/netty/channel/udt/UdtChannelOption.java @@ -25,29 +25,28 @@ import static io.netty.channel.ChannelOption.*; */ public final class UdtChannelOption { + private static final Class T = UdtChannelOption.class; + /** * See {@link OptionUDT#Protocol_Receive_Buffer_Size}. */ - public static final ChannelOption PROTOCOL_RECEIVE_BUFFER_SIZE = valueOf( - "PROTOCOL_RECEIVE_BUFFER_SIZE"); + public static final ChannelOption PROTOCOL_RECEIVE_BUFFER_SIZE = + valueOf(T, "PROTOCOL_RECEIVE_BUFFER_SIZE"); /** * See {@link OptionUDT#Protocol_Send_Buffer_Size}. */ - public static final ChannelOption PROTOCOL_SEND_BUFFER_SIZE = valueOf( - "PROTOCOL_SEND_BUFFER_SIZE"); + public static final ChannelOption PROTOCOL_SEND_BUFFER_SIZE = valueOf(T, "PROTOCOL_SEND_BUFFER_SIZE"); /** * See {@link OptionUDT#System_Receive_Buffer_Size}. */ - public static final ChannelOption SYSTEM_RECEIVE_BUFFER_SIZE = valueOf( - "SYSTEM_RECEIVE_BUFFER_SIZE"); + public static final ChannelOption SYSTEM_RECEIVE_BUFFER_SIZE = valueOf(T, "SYSTEM_RECEIVE_BUFFER_SIZE"); /** * See {@link OptionUDT#System_Send_Buffer_Size}. */ - public static final ChannelOption SYSTEM_SEND_BUFFER_SIZE = valueOf( - "SYSTEM_SEND_BUFFER_SIZE"); + public static final ChannelOption SYSTEM_SEND_BUFFER_SIZE = valueOf(T, "SYSTEM_SEND_BUFFER_SIZE"); private UdtChannelOption() { } } diff --git a/transport/src/main/java/io/netty/channel/ChannelOption.java b/transport/src/main/java/io/netty/channel/ChannelOption.java index 598d822957..3fdd1ad3c3 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOption.java +++ b/transport/src/main/java/io/netty/channel/ChannelOption.java @@ -39,11 +39,22 @@ public final class ChannelOption extends AbstractConstant> { } }; + /** + * Returns the {@link ChannelOption} of the specified name. + */ @SuppressWarnings("unchecked") public static ChannelOption valueOf(String name) { return (ChannelOption) pool.valueOf(name); } + /** + * Shortcut of {@link #valueOf(String) valueOf(firstNameComponent.getName() + "#" + secondNameComponent)}. + */ + @SuppressWarnings("unchecked") + public static ChannelOption valueOf(Class firstNameComponent, String secondNameComponent) { + return (ChannelOption) pool.valueOf(firstNameComponent, secondNameComponent); + } + public static final ChannelOption ALLOCATOR = valueOf("ALLOCATOR"); public static final ChannelOption RCVBUF_ALLOCATOR = valueOf("RCVBUF_ALLOCATOR"); public static final ChannelOption MESSAGE_SIZE_ESTIMATOR = valueOf("MESSAGE_SIZE_ESTIMATOR");