From d7f4e49f89a878008101b58eaa207f89068cabba Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Wed, 24 Oct 2018 14:10:00 +0400 Subject: Search unwrapped handlers by class --- src/org/traccar/BasePipelineFactory.java | 16 ++++++++++++++++ src/org/traccar/BaseProtocol.java | 2 +- src/org/traccar/BaseProtocolDecoder.java | 2 +- src/org/traccar/MainEventHandler.java | 5 ++--- src/org/traccar/WrapperInboundHandler.java | 4 ++++ src/org/traccar/WrapperOutboundHandler.java | 4 ++++ 6 files changed, 28 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/org/traccar/BasePipelineFactory.java b/src/org/traccar/BasePipelineFactory.java index d511af214..401c42d8b 100644 --- a/src/org/traccar/BasePipelineFactory.java +++ b/src/org/traccar/BasePipelineFactory.java @@ -44,6 +44,7 @@ import org.traccar.processing.ComputedAttributesHandler; import org.traccar.processing.CopyAttributesHandler; import java.net.InetSocketAddress; +import java.util.Map; public abstract class BasePipelineFactory extends ChannelInitializer { @@ -241,6 +242,21 @@ public abstract class BasePipelineFactory extends ChannelInitializer { } } + public static T getHandler(ChannelPipeline pipeline, Class clazz) { + for (Map.Entry handlerEntry : pipeline) { + ChannelHandler handler = handlerEntry.getValue(); + if (handler instanceof WrapperInboundHandler) { + handler = ((WrapperInboundHandler) handler).getWrappedHandler(); + } else if (handler instanceof WrapperOutboundHandler) { + handler = ((WrapperOutboundHandler) handler).getWrappedHandler(); + } + if (clazz.isAssignableFrom(handler.getClass())) { + return (T) handler; + } + } + return null; + } + @Override protected void initChannel(Channel channel) throws Exception { final ChannelPipeline pipeline = channel.pipeline(); diff --git a/src/org/traccar/BaseProtocol.java b/src/org/traccar/BaseProtocol.java index 4ece8f848..c0fd1e27f 100644 --- a/src/org/traccar/BaseProtocol.java +++ b/src/org/traccar/BaseProtocol.java @@ -93,7 +93,7 @@ public abstract class BaseProtocol implements Protocol { activeDevice.write(command); } else if (command.getType().equals(Command.TYPE_CUSTOM)) { String data = command.getString(Command.KEY_DATA); - if (activeDevice.getChannel().pipeline().get(StringEncoder.class) != null) { + if (BasePipelineFactory.getHandler(activeDevice.getChannel().pipeline(), StringEncoder.class) != null) { activeDevice.write(data); } else { activeDevice.write(Unpooled.wrappedBuffer(DataConverter.parseHex(data))); diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index 8f495900a..7d840960b 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -141,7 +141,7 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { } public DeviceSession getDeviceSession(Channel channel, SocketAddress remoteAddress, String... uniqueIds) { - if (channel != null && channel.pipeline().get(HttpRequestDecoder.class) != null + if (channel != null && BasePipelineFactory.getHandler(channel.pipeline(), HttpRequestDecoder.class) != null || config.getBoolean("decoder.ignoreSessionCache")) { long deviceId = findDeviceId(remoteAddress, uniqueIds); if (deviceId != 0) { diff --git a/src/org/traccar/MainEventHandler.java b/src/org/traccar/MainEventHandler.java index 4d54a6fe6..311a41f34 100644 --- a/src/org/traccar/MainEventHandler.java +++ b/src/org/traccar/MainEventHandler.java @@ -98,9 +98,8 @@ public class MainEventHandler extends ChannelInboundHandlerAdapter { LOGGER.info(formatChannel(ctx.channel()) + " disconnected"); closeChannel(ctx.channel()); - BaseProtocolDecoder protocolDecoder = ctx.pipeline().get(BaseProtocolDecoder.class); - if (ctx.pipeline().get(HttpRequestDecoder.class) == null - && !connectionlessProtocols.contains(protocolDecoder.getProtocolName())) { + if (BasePipelineFactory.getHandler(ctx.pipeline(), HttpRequestDecoder.class) == null + && !connectionlessProtocols.contains(ctx.pipeline().get(BaseProtocolDecoder.class).getProtocolName())) { Context.getConnectionManager().removeActiveDevice(ctx.channel()); } } diff --git a/src/org/traccar/WrapperInboundHandler.java b/src/org/traccar/WrapperInboundHandler.java index f81f97108..ca33d021f 100644 --- a/src/org/traccar/WrapperInboundHandler.java +++ b/src/org/traccar/WrapperInboundHandler.java @@ -22,6 +22,10 @@ public class WrapperInboundHandler implements ChannelInboundHandler { private ChannelInboundHandler handler; + public ChannelInboundHandler getWrappedHandler() { + return handler; + } + public WrapperInboundHandler(ChannelInboundHandler handler) { this.handler = handler; } diff --git a/src/org/traccar/WrapperOutboundHandler.java b/src/org/traccar/WrapperOutboundHandler.java index 99afd9774..0136c5b22 100644 --- a/src/org/traccar/WrapperOutboundHandler.java +++ b/src/org/traccar/WrapperOutboundHandler.java @@ -25,6 +25,10 @@ public class WrapperOutboundHandler implements ChannelOutboundHandler { private ChannelOutboundHandler handler; + public ChannelOutboundHandler getWrappedHandler() { + return handler; + } + public WrapperOutboundHandler(ChannelOutboundHandler handler) { this.handler = handler; } -- cgit v1.2.3