接口 ChannelHandlerContext 提供的功能是统一管理这些ChannelHandler,使其能够和这个ChannelPipeline及其他Handler进行交互,一个handler可以往上流或者下流发送一个ChannelEvent,动态修改其所属的Channelpipeline。
充当链表节点的 DefaultChannelHandlerContext 里面的重要成员有: 链表指针next , prev, 以及是否能够处理downStream,upStream事件的布尔变量。
private
final
class
DefaultChannelHandlerContext
implements
ChannelHandlerContext {
volatile
DefaultChannelHandlerContext
next
;
volatile
DefaultChannelHandlerContext
prev
;
private
final
String
name
;
private
final
ChannelHandler
handler
;
private
final
boolean
canHandleUpstream
;
private
final
boolean
canHandleDownstream
;
private
volatile
Object
attachment
;
DefaultChannelHandlerContext(
DefaultChannelHandlerContext prev, DefaultChannelHandlerContext next,
String name, ChannelHandler handler) {
if
(name ==
null
) {
throw
new
NullPointerException(
"name"
);
}
if
(handler ==
null
) {
throw
new
NullPointerException(
"handler"
);
}
canHandleUpstream
= handler
instanceof
ChannelUpstreamHandler;
canHandleDownstream
= handler
instanceof
ChannelDownstreamHandler;
if
(!
canHandleUpstream
&& !
canHandleDownstream
) {
throw
new
IllegalArgumentException(
"handler must be either "
+
ChannelUpstreamHandler.
class
.getName() +
" or "
+
ChannelDownstreamHandler.
class
.getName() +
'.'
);
}
this
.
prev
= prev;
this
.
next
= next;
this
.
name
= name;
this
.
handler
= handler;
}
public
Channel getChannel() {
return
getPipeline().getChannel();
}
public
ChannelPipeline getPipeline() {
return
DefaultChannelPipeline.
this
;
}
public
boolean
canHandleDownstream() {
return
canHandleDownstream
;
}
public
boolean
canHandleUpstream() {
return
canHandleUpstream
;
}
public
ChannelHandler getHandler() {
return
handler
;
}
public
String getName() {
return
name
;
}
public
Object getAttachment() {
return
attachment
;
}
public
void
setAttachment(Object attachment) {
this
.
attachment
= attachment;
}
public
void
sendDownstream(ChannelEvent e) {
DefaultChannelHandlerContext prev = getActualDownstreamContext(
this
.
prev
);
if
(prev ==
null
) {
try
{
getSink().eventSunk( DefaultChannelPipeline.
this
, e);
}
catch
(Throwable t) {
notifyHandlerException(e, t);
}
}
else
{
DefaultChannelPipeline.
this
.sendDownstream(prev, e);
}
}
public
void
sendUpstream(ChannelEvent e) {
DefaultChannelHandlerContext next = getActualUpstreamContext(
this
.
next
);
if
(next !=
null
) {
DefaultChannelPipeline.
this
.sendUpstream(next, e);
}
}
}