X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-netty-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fnettyutil%2Fhandler%2FNetconfEXIToMessageDecoder.java;h=db265dee4096d10a141f876038603b52c7c10479;hb=55e9adf851ad40cc3c128ffab5292eb1e6c61221;hp=77d33e18313d84b96202a9105453e7d06720ca3a;hpb=940603a5319c9a0eff30e92f2dc83817974d7f78;p=controller.git diff --git a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java index 77d33e1831..db265dee40 100644 --- a/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java +++ b/opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java @@ -33,11 +33,19 @@ public final class NetconfEXIToMessageDecoder extends ByteToMessageDecoder { private static final Logger LOG = LoggerFactory.getLogger(NetconfEXIToMessageDecoder.class); private static final SAXTransformerFactory FACTORY = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); + /** + * This class is not marked as shared, so it can be attached to only a single channel, + * which means that {@link #decode(ChannelHandlerContext, ByteBuf, List)} + * cannot be invoked concurrently. Hence we can reuse the reader. + */ + private final EXIReader reader; - private final NetconfEXICodec codec; + private NetconfEXIToMessageDecoder(final EXIReader reader) { + this.reader = Preconditions.checkNotNull(reader); + } - public NetconfEXIToMessageDecoder(final NetconfEXICodec codec) { - this.codec = Preconditions.checkNotNull(codec); + public static NetconfEXIToMessageDecoder create(final NetconfEXICodec codec) throws EXIOptionsException { + return new NetconfEXIToMessageDecoder(codec.getReader()); } @Override @@ -59,15 +67,15 @@ public final class NetconfEXIToMessageDecoder extends ByteToMessageDecoder { LOG.trace("Received to decode: {}", ByteBufUtil.hexDump(in)); } - final EXIReader r = codec.getReader(); final TransformerHandler handler = FACTORY.newTransformerHandler(); - r.setContentHandler(handler); + reader.setContentHandler(handler); final DOMResult domResult = new DOMResult(); handler.setResult(domResult); try (final InputStream is = new ByteBufInputStream(in)) { - r.parse(new InputSource(is)); + // Performs internal reset before doing anything + reader.parse(new InputSource(is)); } out.add(new NetconfMessage((Document) domResult.getNode()));