From 2cac343db119a395c80054e45999263a32a994c0 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 17 Jan 2018 19:38:27 +0100 Subject: [PATCH] NETCONF-241: Switch to using Exificient Exificient has a bit nicer API, it is available from maven central and has a friendly (MIT) license, plus the source code is on GitHub. Switch to using it instead of OpenEXI. Change-Id: I2cb7bf244361b021afb4cdc275e2442f5b778056 Signed-off-by: Robert Varga Signed-off-by: Andrej Mak --- .../netconf/odl-netconf-netty-util/pom.xml | 5 + ...NetconfClientSessionNegotiatorFactory.java | 30 +-- .../NetconfClientSessionNegotiatorTest.java | 9 +- .../client/NetconfClientSessionTest.java | 14 +- .../impl/NetconfServerSessionTest.java | 4 +- netconf/netconf-netty-util/pom.xml | 32 +--- .../nettyutil/AbstractNetconfSession.java | 21 +-- .../nettyutil/handler/NetconfEXICodec.java | 80 +++----- .../handler/NetconfEXIToMessageDecoder.java | 12 +- .../handler/NetconfMessageToEXIEncoder.java | 35 ++-- .../nettyutil/handler/exi/EXIParameters.java | 173 ++++++++++++++---- .../handler/exi/NetconfStartExiMessage.java | 80 +++----- .../nettyutil/AbstractNetconfSessionTest.java | 4 +- .../handler/NetconfEXIHandlersTest.java | 27 +-- .../handler/exi/EXIParametersTest.java | 40 ++-- .../exi/NetconfStartExiMessageTest.java | 25 ++- 16 files changed, 290 insertions(+), 301 deletions(-) diff --git a/features/netconf/odl-netconf-netty-util/pom.xml b/features/netconf/odl-netconf-netty-util/pom.xml index 8af9b981fd..d149855f0d 100644 --- a/features/netconf/odl-netconf-netty-util/pom.xml +++ b/features/netconf/odl-netconf-netty-util/pom.xml @@ -90,5 +90,10 @@ ${project.groupId} netconf-netty-util + + com.siemens.ct.exi + exificient + 0.9.7 + diff --git a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java index b1767f9fdd..8123e5999e 100644 --- a/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java +++ b/netconf/netconf-client/src/main/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorFactory.java @@ -11,6 +11,9 @@ package org.opendaylight.netconf.client; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.siemens.ct.exi.CodingMode; +import com.siemens.ct.exi.FidelityOptions; +import com.siemens.ct.exi.exceptions.UnsupportedOption; import io.netty.channel.Channel; import io.netty.util.Timer; import io.netty.util.concurrent.Promise; @@ -21,13 +24,11 @@ import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage; import org.opendaylight.protocol.framework.SessionListenerFactory; import org.opendaylight.protocol.framework.SessionNegotiator; import org.opendaylight.protocol.framework.SessionNegotiatorFactory; -import org.openexi.proc.common.AlignmentType; -import org.openexi.proc.common.EXIOptions; -import org.openexi.proc.common.EXIOptionsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,25 +53,24 @@ public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorF private static final Logger LOG = LoggerFactory.getLogger(NetconfClientSessionNegotiatorFactory.class); private static final String START_EXI_MESSAGE_ID = "default-start-exi"; - private static final EXIOptions DEFAULT_OPTIONS; + private static final EXIParameters DEFAULT_OPTIONS; private final Optional additionalHeader; private final long connectionTimeoutMillis; private final Timer timer; - private final EXIOptions options; + private final EXIParameters options; static { - final EXIOptions opts = new EXIOptions(); + final FidelityOptions fidelity = FidelityOptions.createDefault(); try { - opts.setPreserveDTD(true); - opts.setPreserveNS(true); - opts.setPreserveLexicalValues(true); - opts.setAlignmentType(AlignmentType.byteAligned); - } catch (EXIOptionsException e) { - throw new ExceptionInInitializerError(e); + fidelity.setFidelity(FidelityOptions.FEATURE_DTD, true); + fidelity.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, true); + fidelity.setFidelity(FidelityOptions.FEATURE_PREFIX, true); + } catch (UnsupportedOption e) { + LOG.warn("Failed to set fidelity options, continuing", e); } - DEFAULT_OPTIONS = opts; + DEFAULT_OPTIONS = new EXIParameters(CodingMode.BYTE_PACKED, fidelity); } private final Set clientCapabilities; @@ -90,13 +90,13 @@ public class NetconfClientSessionNegotiatorFactory implements SessionNegotiatorF public NetconfClientSessionNegotiatorFactory(final Timer timer, final Optional additionalHeader, - final long connectionTimeoutMillis, final EXIOptions exiOptions) { + final long connectionTimeoutMillis, final EXIParameters exiOptions) { this(timer, additionalHeader, connectionTimeoutMillis, exiOptions, EXI_CLIENT_CAPABILITIES); } public NetconfClientSessionNegotiatorFactory(final Timer timer, final Optional additionalHeader, - final long connectionTimeoutMillis, final EXIOptions exiOptions, + final long connectionTimeoutMillis, final EXIParameters exiOptions, final Set capabilities) { this.timer = Preconditions.checkNotNull(timer); this.additionalHeader = additionalHeader; diff --git a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java index 63c24c2419..79b13a233c 100644 --- a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java +++ b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionNegotiatorTest.java @@ -50,10 +50,10 @@ import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader import org.opendaylight.netconf.nettyutil.handler.ChunkedFramingMechanismEncoder; import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToHelloMessageDecoder; import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToMessageDecoder; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage; import org.opendaylight.netconf.util.messages.NetconfMessageUtil; import org.opendaylight.netconf.util.test.XmlFileLoader; -import org.openexi.proc.common.EXIOptions; import org.w3c.dom.Document; public class NetconfClientSessionNegotiatorTest { @@ -157,7 +157,7 @@ public class NetconfClientSessionNegotiatorTest { @Test public void testNetconfClientSessionNegotiator() throws Exception { - Promise promise = mock(Promise.class); + Promise promise = mock(Promise.class); doReturn(promise).when(promise).setSuccess(anyObject()); NetconfClientSessionNegotiator negotiator = createNetconfClientSessionNegotiator(promise, null); @@ -170,9 +170,8 @@ public class NetconfClientSessionNegotiatorTest { @Test public void testNetconfClientSessionNegotiatorWithEXI() throws Exception { - Promise promise = mock(Promise.class); - EXIOptions exiOptions = new EXIOptions(); - NetconfStartExiMessage exiMessage = NetconfStartExiMessage.create(exiOptions, "msg-id"); + Promise promise = mock(Promise.class); + NetconfStartExiMessage exiMessage = NetconfStartExiMessage.create(EXIParameters.empty(), "msg-id"); doReturn(promise).when(promise).setSuccess(anyObject()); NetconfClientSessionNegotiator negotiator = createNetconfClientSessionNegotiator(promise, exiMessage); diff --git a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionTest.java b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionTest.java index e292ec644b..d45bf67fcf 100644 --- a/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionTest.java +++ b/netconf/netconf-client/src/test/java/org/opendaylight/netconf/client/NetconfClientSessionTest.java @@ -26,7 +26,7 @@ import org.mockito.MockitoAnnotations; import org.opendaylight.netconf.nettyutil.handler.NetconfEXICodec; import org.opendaylight.netconf.nettyutil.handler.NetconfEXIToMessageDecoder; import org.opendaylight.netconf.nettyutil.handler.NetconfMessageToEXIEncoder; -import org.openexi.proc.common.EXIOptions; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; public class NetconfClientSessionTest { @@ -43,18 +43,18 @@ public class NetconfClientSessionTest { @Test public void testNetconfClientSession() throws Exception { - NetconfClientSessionListener sessionListener = mock(NetconfClientSessionListener.class); - long sessId = 20L; - Collection caps = Lists.newArrayList("cap1", "cap2"); + final NetconfClientSessionListener sessionListener = mock(NetconfClientSessionListener.class); + final long sessId = 20L; + final Collection caps = Lists.newArrayList("cap1", "cap2"); - NetconfEXICodec codec = new NetconfEXICodec(new EXIOptions()); - ChannelPipeline pipeline = mock(ChannelPipeline.class); + final NetconfEXICodec codec = NetconfEXICodec.forParameters(EXIParameters.empty()); + final ChannelPipeline pipeline = mock(ChannelPipeline.class); Mockito.doReturn(pipeline).when(channel).pipeline(); Mockito.doReturn(channelHandler).when(pipeline).replace(anyString(), anyString(), any(ChannelHandler.class)); Mockito.doReturn("").when(channelHandler).toString(); - NetconfClientSession session = new NetconfClientSession(sessionListener, channel, sessId, caps); + final NetconfClientSession session = new NetconfClientSession(sessionListener, channel, sessId, caps); final NetconfMessageToEXIEncoder exiEncoder = NetconfMessageToEXIEncoder.create(codec); final NetconfEXIToMessageDecoder exiDecoder = NetconfEXIToMessageDecoder.create(codec); session.addExiHandlers(exiDecoder, exiEncoder); diff --git a/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/NetconfServerSessionTest.java b/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/NetconfServerSessionTest.java index 01320b4ec1..3d44cdb23e 100644 --- a/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/NetconfServerSessionTest.java +++ b/netconf/netconf-impl/src/test/java/org/opendaylight/netconf/impl/NetconfServerSessionTest.java @@ -31,11 +31,11 @@ import org.opendaylight.netconf.nettyutil.handler.NetconfEXIToMessageDecoder; import org.opendaylight.netconf.nettyutil.handler.NetconfMessageToEXIEncoder; import org.opendaylight.netconf.nettyutil.handler.NetconfMessageToXMLEncoder; import org.opendaylight.netconf.nettyutil.handler.NetconfXMLToMessageDecoder; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.netconf.notifications.NetconfNotification; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.extension.rev131210.NetconfTcp; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfSsh; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.sessions.Session; -import org.openexi.proc.common.EXIOptions; import org.w3c.dom.Document; public class NetconfServerSessionTest { @@ -179,7 +179,7 @@ public class NetconfServerSessionTest { new NetconfXMLToMessageDecoder()); channel.pipeline().addLast(AbstractChannelInitializer.NETCONF_MESSAGE_ENCODER, new NetconfMessageToXMLEncoder()); - final NetconfEXICodec codec = new NetconfEXICodec(new EXIOptions()); + final NetconfEXICodec codec = NetconfEXICodec.forParameters(EXIParameters.empty()); session.addExiHandlers(NetconfEXIToMessageDecoder.create(codec), NetconfMessageToEXIEncoder.create(codec)); } diff --git a/netconf/netconf-netty-util/pom.xml b/netconf/netconf-netty-util/pom.xml index 8a9b5717d2..3a7a6434a8 100644 --- a/netconf/netconf-netty-util/pom.xml +++ b/netconf/netconf-netty-util/pom.xml @@ -39,14 +39,9 @@ import - openexi - nagasena - 0000.0002.0062.0 - - - openexi - nagasena-rta - 0000.0002.0062.0 + com.siemens.ct.exi + exificient + 0.9.7 @@ -79,12 +74,13 @@ 1.6.0 - openexi - nagasena + com.siemens.ct.exi + exificient - openexi - nagasena-rta + xml-apis + xml-apis + 1.4.01 org.slf4j @@ -107,18 +103,6 @@ - - org.apache.maven.plugins - maven-jar-plugin - - - - test-jar - - package - - - org.apache.maven.plugins maven-checkstyle-plugin diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSession.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSession.java index b1c1203c4f..fdcd7e6479 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSession.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSession.java @@ -7,6 +7,8 @@ */ package org.opendaylight.netconf.nettyutil; +import com.siemens.ct.exi.exceptions.EXIException; +import com.siemens.ct.exi.exceptions.UnsupportedOption; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; @@ -27,8 +29,6 @@ import org.opendaylight.netconf.nettyutil.handler.NetconfEXIToMessageDecoder; import org.opendaylight.netconf.nettyutil.handler.NetconfMessageToEXIEncoder; import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.protocol.framework.AbstractProtocolSession; -import org.openexi.proc.common.EXIOptionsException; -import org.openexi.sax.TransmogrifierException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -82,7 +82,7 @@ public abstract class AbstractNetconfSession() { @Override - public void operationComplete(Future future) throws Exception { + public void operationComplete(final Future future) throws Exception { if (future.isSuccess()) { proxyFuture.setSuccess(); } else { @@ -147,24 +147,17 @@ public abstract class AbstractNetconfSession GRAMMAR_CACHES = - CacheBuilder.newBuilder().weakValues().build(new CacheLoader() { + private static final LoadingCache CODECS = + CacheBuilder.newBuilder().weakValues().build(new CacheLoader() { @Override - public GrammarCache load(final Short key) { - return new GrammarCache(key); + public NetconfEXICodec load(final EXIParameters key) { + return new NetconfEXICodec(key.getFactory()); } }); - /** - * Grammar cache acts as a template and is duplicated by the Transmogrifier and the Reader - * before use. It is safe to reuse a single instance. - */ - private final GrammarCache exiGrammarCache; - private final EXIOptions exiOptions; + private final SAXFactory exiFactory; - public NetconfEXICodec(final EXIOptions exiOptions) { - this.exiOptions = Preconditions.checkNotNull(exiOptions); - this.exiGrammarCache = createGrammarCache(exiOptions); + private NetconfEXICodec(final EXIFactory exiFactory) { + this.exiFactory = new SAXFactory(Preconditions.checkNotNull(exiFactory)); } - private static GrammarCache createGrammarCache(final EXIOptions exiOptions) { - short go = GrammarOptions.DEFAULT_OPTIONS; - if (exiOptions.getPreserveComments()) { - go = GrammarOptions.addCM(go); - } - if (exiOptions.getPreserveDTD()) { - go = GrammarOptions.addDTD(go); - } - if (exiOptions.getPreserveNS()) { - go = GrammarOptions.addNS(go); - } - if (exiOptions.getPreservePIs()) { - go = GrammarOptions.addPI(go); - } - - return GRAMMAR_CACHES.getUnchecked(go); + public static NetconfEXICodec forParameters(final EXIParameters parameters) { + return CODECS.getUnchecked(parameters); } - EXIReader getReader() throws EXIOptionsException { - final EXIReader r = new EXIReader(); - r.setPreserveLexicalValues(exiOptions.getPreserveLexicalValues()); - r.setGrammarCache(exiGrammarCache); - r.setEntityResolver(ENTITY_RESOLVER); - return r; + XMLReader getReader() throws EXIException { + final XMLReader reader = exiFactory.createEXIReader(); + reader.setEntityResolver(ENTITY_RESOLVER); + return reader; } - Transmogrifier getTransmogrifier() throws EXIOptionsException, TransmogrifierException { - final Transmogrifier transmogrifier = new Transmogrifier(); - transmogrifier.setAlignmentType(exiOptions.getAlignmentType()); - transmogrifier.setBlockSize(exiOptions.getBlockSize()); - transmogrifier.setGrammarCache(exiGrammarCache); - transmogrifier.setOutputCookie(OUTPUT_EXI_COOKIE); - transmogrifier.setOutputOptions(HeaderOptionsOutputType.all); - transmogrifier.setResolveExternalGeneralEntities(false); - return transmogrifier; + SAXEncoder getWriter() throws EXIException { + final SAXEncoder writer = exiFactory.createEXIWriter(); + return writer; } } diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java index 99d791642a..94287cc186 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIToMessageDecoder.java @@ -8,6 +8,7 @@ package org.opendaylight.netconf.nettyutil.handler; import com.google.common.base.Preconditions; +import com.siemens.ct.exi.exceptions.EXIException; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufUtil; @@ -25,13 +26,12 @@ import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.sax.TransformerHandler; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.yangtools.util.xml.UntrustedXML; -import org.openexi.proc.common.EXIOptionsException; -import org.openexi.sax.EXIReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; public final class NetconfEXIToMessageDecoder extends ByteToMessageDecoder { @@ -53,21 +53,21 @@ public final class NetconfEXIToMessageDecoder extends ByteToMessageDecoder { * which means that {@link #decode(ChannelHandlerContext, ByteBuf, List)} * cannot be invoked concurrently. Hence we can reuse the reader. */ - private final EXIReader reader; + private final XMLReader reader; private final DocumentBuilder documentBuilder; - private NetconfEXIToMessageDecoder(final EXIReader reader) { + private NetconfEXIToMessageDecoder(final XMLReader reader) { this.reader = Preconditions.checkNotNull(reader); this.documentBuilder = UntrustedXML.newDocumentBuilder(); } - public static NetconfEXIToMessageDecoder create(final NetconfEXICodec codec) throws EXIOptionsException { + public static NetconfEXIToMessageDecoder create(final NetconfEXICodec codec) throws EXIException { return new NetconfEXIToMessageDecoder(codec.getReader()); } @Override protected void decode(final ChannelHandlerContext ctx, final ByteBuf in, final List out) - throws EXIOptionsException, IOException, SAXException, TransformerConfigurationException { + throws IOException, SAXException, TransformerConfigurationException { /* * Note that we could loop here and process all the messages, but we can't do that. * The reason is operation, which has the contract of immediately stopping diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java index e874ab3a40..0493805db1 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/NetconfMessageToEXIEncoder.java @@ -8,6 +8,8 @@ package org.opendaylight.netconf.nettyutil.handler; import com.google.common.base.Preconditions; +import com.siemens.ct.exi.api.sax.SAXEncoder; +import com.siemens.ct.exi.exceptions.EXIException; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufOutputStream; import io.netty.channel.ChannelHandlerContext; @@ -19,46 +21,31 @@ import javax.xml.transform.TransformerException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXResult; import org.opendaylight.netconf.api.NetconfMessage; -import org.openexi.proc.common.EXIOptionsException; -import org.openexi.sax.Transmogrifier; -import org.openexi.sax.TransmogrifierException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.xml.sax.ContentHandler; public final class NetconfMessageToEXIEncoder extends MessageToByteEncoder { private static final Logger LOG = LoggerFactory.getLogger(NetconfMessageToEXIEncoder.class); - /** - * This class is not marked as shared, so it can be attached to only a single channel, - * which means that {@link #encode(ChannelHandlerContext, NetconfMessage, ByteBuf)} - * cannot be invoked concurrently. Hence we can reuse the transmogrifier. - */ - private final Transmogrifier transmogrifier; + private final NetconfEXICodec codec; - private NetconfMessageToEXIEncoder(final Transmogrifier transmogrifier) { - this.transmogrifier = Preconditions.checkNotNull(transmogrifier); + private NetconfMessageToEXIEncoder(final NetconfEXICodec codec) { + this.codec = Preconditions.checkNotNull(codec); } - public static NetconfMessageToEXIEncoder create(final NetconfEXICodec codec) - throws EXIOptionsException, TransmogrifierException { - return new NetconfMessageToEXIEncoder(codec.getTransmogrifier()); + public static NetconfMessageToEXIEncoder create(final NetconfEXICodec codec) { + return new NetconfMessageToEXIEncoder(codec); } @Override protected void encode(final ChannelHandlerContext ctx, final NetconfMessage msg, final ByteBuf out) - throws EXIOptionsException, IOException, TransformerException, TransmogrifierException { + throws IOException, TransformerException, EXIException { LOG.trace("Sent to encode : {}", msg); try (OutputStream os = new ByteBufOutputStream(out)) { - transmogrifier.setOutputStream(os); - final ContentHandler handler = transmogrifier.getSAXTransmogrifier(); + final SAXEncoder encoder = codec.getWriter(); + encoder.setOutputStream(os); final Transformer transformer = ThreadLocalTransformers.getDefaultTransformer(); - transformer.transform(new DOMSource(msg.getDocument()), new SAXResult(handler)); - } finally { - // Make sure we do not retain any reference to state by removing - // the output stream reference and resetting internal state. - transmogrifier.setOutputStream(null); - transmogrifier.getSAXTransmogrifier(); + transformer.transform(new DOMSource(msg.getDocument()), new SAXResult(encoder)); } } } diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParameters.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParameters.java index f63a1e0ae1..088f638aa6 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParameters.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParameters.java @@ -7,40 +7,73 @@ */ package org.opendaylight.netconf.nettyutil.handler.exi; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; +import com.siemens.ct.exi.CodingMode; +import com.siemens.ct.exi.EXIFactory; +import com.siemens.ct.exi.EncodingOptions; +import com.siemens.ct.exi.FidelityOptions; +import com.siemens.ct.exi.exceptions.UnsupportedOption; +import com.siemens.ct.exi.helpers.DefaultEXIFactory; +import java.util.Objects; import org.opendaylight.controller.config.util.xml.XmlElement; -import org.openexi.proc.common.AlignmentType; -import org.openexi.proc.common.EXIOptions; -import org.openexi.proc.common.EXIOptionsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; import org.w3c.dom.NodeList; public final class EXIParameters { - private static final String EXI_PARAMETER_ALIGNMENT = "alignment"; - static final String EXI_PARAMETER_BYTE_ALIGNED = "byte-aligned"; - static final String EXI_PARAMETER_BIT_PACKED = "bit-packed"; - static final String EXI_PARAMETER_COMPRESSED = "compressed"; - static final String EXI_PARAMETER_PRE_COMPRESSION = "pre-compression"; + private static final Logger LOG = LoggerFactory.getLogger(EXIParameters.class); + + static final String EXI_PARAMETER_ALIGNMENT = "alignment"; + private static final String EXI_PARAMETER_BYTE_ALIGNED = "byte-aligned"; + private static final String EXI_PARAMETER_BIT_PACKED = "bit-packed"; + private static final String EXI_PARAMETER_COMPRESSED = "compressed"; + private static final String EXI_PARAMETER_PRE_COMPRESSION = "pre-compression"; - private static final String EXI_PARAMETER_FIDELITY = "fidelity"; + static final String EXI_PARAMETER_FIDELITY = "fidelity"; private static final String EXI_FIDELITY_DTD = "dtd"; private static final String EXI_FIDELITY_LEXICAL_VALUES = "lexical-values"; private static final String EXI_FIDELITY_COMMENTS = "comments"; private static final String EXI_FIDELITY_PIS = "pis"; private static final String EXI_FIDELITY_PREFIXES = "prefixes"; - private final EXIOptions options; - private static final Logger LOG = LoggerFactory.getLogger(EXIParameters.class); + private static final EncodingOptions ENCODING_OPTIONS; + + static { + final EncodingOptions opts = EncodingOptions.createDefault(); + try { + opts.setOption(EncodingOptions.RETAIN_ENTITY_REFERENCE); + opts.setOption(EncodingOptions.INCLUDE_OPTIONS); + + /** + * NETCONF is XML environment, so the use of EXI cookie is not really needed. Adding it + * decreases efficiency of encoding by adding human-readable 4 bytes "EXI$" to the head + * of the stream. This is really useful, so let's output it now. + */ + opts.setOption(EncodingOptions.INCLUDE_COOKIE); + } catch (final UnsupportedOption e) { + throw new ExceptionInInitializerError(e); + } + + ENCODING_OPTIONS = opts; + } + + private final FidelityOptions fidelityOptions; + private final CodingMode codingMode; + + public EXIParameters(final CodingMode codingMode, final FidelityOptions fidelityOptions) { + this.fidelityOptions = Preconditions.checkNotNull(fidelityOptions); + this.codingMode = Preconditions.checkNotNull(codingMode); + } - private EXIParameters(final EXIOptions options) { - this.options = Preconditions.checkNotNull(options); + @VisibleForTesting + public static EXIParameters empty() { + return new EXIParameters(CodingMode.BIT_PACKED, FidelityOptions.createDefault()); } - @SuppressWarnings("checkstyle:FallThrough") - public static EXIParameters fromXmlElement(final XmlElement root) throws EXIOptionsException { - final EXIOptions options = new EXIOptions(); + public static EXIParameters fromXmlElement(final XmlElement root) throws UnsupportedOption { + final CodingMode coding; final NodeList alignmentElements = root.getElementsByTagName(EXI_PARAMETER_ALIGNMENT); if (alignmentElements.getLength() > 0) { final Element alignmentElement = (Element) alignmentElements.item(0); @@ -48,48 +81,108 @@ public final class EXIParameters { switch (alignmentTextContent) { case EXI_PARAMETER_BYTE_ALIGNED: - options.setAlignmentType(AlignmentType.byteAligned); + coding = CodingMode.BYTE_PACKED; break; case EXI_PARAMETER_COMPRESSED: - options.setAlignmentType(AlignmentType.compress); + coding = CodingMode.COMPRESSION; break; case EXI_PARAMETER_PRE_COMPRESSION: - options.setAlignmentType(AlignmentType.preCompress); + coding = CodingMode.PRE_COMPRESSION; + break; + case EXI_PARAMETER_BIT_PACKED: + coding = CodingMode.BIT_PACKED; break; default: LOG.warn("Unexpected value in alignmentTextContent: {} , using default value", alignmentTextContent); - case EXI_PARAMETER_BIT_PACKED: - options.setAlignmentType(AlignmentType.bitPacked); + coding = CodingMode.BIT_PACKED; break; } } else { - options.setAlignmentType(AlignmentType.bitPacked); + coding = CodingMode.BIT_PACKED; } + final FidelityOptions fidelity = FidelityOptions.createDefault(); final NodeList fidelityElements = root.getElementsByTagName(EXI_PARAMETER_FIDELITY); if (fidelityElements.getLength() > 0) { final Element fidelityElement = (Element) fidelityElements.item(0); - if (fidelityElement.getElementsByTagName(EXI_FIDELITY_DTD).getLength() > 0) { - options.setPreserveDTD(true); - } - if (fidelityElement.getElementsByTagName(EXI_FIDELITY_LEXICAL_VALUES).getLength() > 0) { - options.setPreserveLexicalValues(true); - } - if (fidelityElement.getElementsByTagName(EXI_FIDELITY_COMMENTS).getLength() > 0) { - options.setPreserveComments(true); - } - if (fidelityElement.getElementsByTagName(EXI_FIDELITY_PIS).getLength() > 0) { - options.setPreservePIs(true); - } - if (fidelityElement.getElementsByTagName(EXI_FIDELITY_PREFIXES).getLength() > 0) { - options.setPreserveNS(true); - } + + fidelity.setFidelity(FidelityOptions.FEATURE_DTD, + fidelityElement.getElementsByTagName(EXI_FIDELITY_DTD).getLength() > 0); + fidelity.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, + fidelityElement.getElementsByTagName(EXI_FIDELITY_LEXICAL_VALUES).getLength() > 0); + fidelity.setFidelity(FidelityOptions.FEATURE_COMMENT, + fidelityElement.getElementsByTagName(EXI_FIDELITY_COMMENTS).getLength() > 0); + fidelity.setFidelity(FidelityOptions.FEATURE_PI, + fidelityElement.getElementsByTagName(EXI_FIDELITY_PIS).getLength() > 0); + fidelity.setFidelity(FidelityOptions.FEATURE_PREFIX, + fidelityElement.getElementsByTagName(EXI_FIDELITY_PREFIXES).getLength() > 0); + } + + return new EXIParameters(coding, fidelity); + } + + public EXIFactory getFactory() { + final EXIFactory factory = DefaultEXIFactory.newInstance(); + factory.setCodingMode(codingMode); + factory.setEncodingOptions(ENCODING_OPTIONS); + factory.setFidelityOptions(fidelityOptions); + return factory; + } + + @Override + public int hashCode() { + return Objects.hash(fidelityOptions, codingMode); + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof EXIParameters)) { + return false; + } + final EXIParameters other = (EXIParameters) obj; + return codingMode == other.codingMode && fidelityOptions.equals(other.fidelityOptions); + } + + String getAlignment() { + switch (codingMode) { + case BIT_PACKED: + return EXI_PARAMETER_BIT_PACKED; + case BYTE_PACKED: + return EXI_PARAMETER_BYTE_ALIGNED; + case COMPRESSION: + return EXI_PARAMETER_COMPRESSED; + case PRE_COMPRESSION: + return EXI_PARAMETER_PRE_COMPRESSION; + default: + throw new IllegalStateException("Unhandled coding mode " + codingMode); } - return new EXIParameters(options); } - public EXIOptions getOptions() { - return options; + private String fidelityString(final String feature, final String string) { + return fidelityOptions.isFidelityEnabled(feature) ? string : null; + } + + String getPreserveComments() { + return fidelityString(FidelityOptions.FEATURE_COMMENT, EXI_FIDELITY_COMMENTS); + } + + String getPreserveDTD() { + return fidelityString(FidelityOptions.FEATURE_DTD, EXI_FIDELITY_DTD); + } + + String getPreserveLexicalValues() { + return fidelityString(FidelityOptions.FEATURE_LEXICAL_VALUE, EXI_FIDELITY_LEXICAL_VALUES); + } + + String getPreservePIs() { + return fidelityString(FidelityOptions.FEATURE_PI, EXI_FIDELITY_PIS); + } + + String getPreservePrefixes() { + return fidelityString(FidelityOptions.FEATURE_PREFIX, EXI_FIDELITY_PREFIXES); } } diff --git a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java index 7e7dad3163..f7524f8fbf 100644 --- a/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java +++ b/netconf/netconf-netty-util/src/main/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessage.java @@ -8,14 +8,12 @@ package org.opendaylight.netconf.nettyutil.handler.exi; -import com.google.common.collect.Lists; +import com.google.common.annotations.VisibleForTesting; +import java.util.ArrayList; import java.util.List; import org.opendaylight.controller.config.util.xml.XmlUtil; import org.opendaylight.netconf.api.NetconfMessage; import org.opendaylight.netconf.api.xml.XmlNetconfConstants; -import org.openexi.proc.common.EXIOptions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -23,29 +21,23 @@ import org.w3c.dom.Element; * Start-exi netconf message. */ public final class NetconfStartExiMessage extends NetconfMessage { - + @VisibleForTesting public static final String START_EXI = "start-exi"; - public static final String ALIGNMENT_KEY = "alignment"; - public static final String FIDELITY_KEY = "fidelity"; - public static final String COMMENTS_KEY = "comments"; - public static final String DTD_KEY = "dtd"; - public static final String LEXICAL_VALUES_KEY = "lexical-values"; - public static final String PIS_KEY = "pis"; - public static final String PREFIXES_KEY = "prefixes"; - private static final Logger LOG = LoggerFactory.getLogger(NetconfStartExiMessage.class); + private NetconfStartExiMessage(final Document doc) { super(doc); } - public static NetconfStartExiMessage create(final EXIOptions exiOptions, final String messageId) { + public static NetconfStartExiMessage create(final EXIParameters exiOptions, final String messageId) { final Document doc = XmlUtil.newDocument(); final Element rpcElement = doc.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, XmlNetconfConstants.RPC_KEY); rpcElement.setAttributeNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0, XmlNetconfConstants.MESSAGE_ID, messageId); - // TODO draft http://tools.ietf.org/html/draft-varga-netconf-exi-capability-02#section-3.5.1 has no namespace for start-exi element in xml + // TODO draft http://tools.ietf.org/html/draft-varga-netconf-exi-capability-02#section-3.5.1 has no namespace + // for start-exi element in xml final Element startExiElement = doc.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, START_EXI); @@ -58,17 +50,17 @@ public final class NetconfStartExiMessage extends NetconfMessage { return new NetconfStartExiMessage(doc); } - private static void addFidelity(final EXIOptions exiOptions, final Document doc, final Element startExiElement) { - final List fidelityElements = Lists.newArrayList(); - createFidelityElement(doc, fidelityElements, exiOptions.getPreserveComments(), COMMENTS_KEY); - createFidelityElement(doc, fidelityElements, exiOptions.getPreserveDTD(), DTD_KEY); - createFidelityElement(doc, fidelityElements, exiOptions.getPreserveLexicalValues(), LEXICAL_VALUES_KEY); - createFidelityElement(doc, fidelityElements, exiOptions.getPreservePIs(), PIS_KEY); - createFidelityElement(doc, fidelityElements, exiOptions.getPreserveNS(), PREFIXES_KEY); + private static void addFidelity(final EXIParameters exiOptions, final Document doc, final Element startExiElement) { + final List fidelityElements = new ArrayList<>(5); + createFidelityElement(doc, fidelityElements, exiOptions.getPreserveComments()); + createFidelityElement(doc, fidelityElements, exiOptions.getPreserveDTD()); + createFidelityElement(doc, fidelityElements, exiOptions.getPreserveLexicalValues()); + createFidelityElement(doc, fidelityElements, exiOptions.getPreservePIs()); + createFidelityElement(doc, fidelityElements, exiOptions.getPreservePrefixes()); if (!fidelityElements.isEmpty()) { final Element fidelityElement = doc.createElementNS( - XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, FIDELITY_KEY); + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, EXIParameters.EXI_PARAMETER_FIDELITY); for (final Element element : fidelityElements) { fidelityElement.appendChild(element); } @@ -76,45 +68,19 @@ public final class NetconfStartExiMessage extends NetconfMessage { } } - @SuppressWarnings("checkstyle:FallThrough") - private static void addAlignment(final EXIOptions exiOptions, final Document doc, final Element startExiElement) { + private static void addAlignment(final EXIParameters exiOptions, final Document doc, + final Element startExiElement) { final Element alignmentElement = doc.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, - ALIGNMENT_KEY); - - String alignmentString; - switch (exiOptions.getAlignmentType()) { - case byteAligned: { - alignmentString = EXIParameters.EXI_PARAMETER_BYTE_ALIGNED; - break; - } - case compress: { - alignmentString = EXIParameters.EXI_PARAMETER_COMPRESSED; - break; - } - case preCompress: { - alignmentString = EXIParameters.EXI_PARAMETER_PRE_COMPRESSION; - break; - } - default: - LOG.warn("Unexpected value in EXI alignment type: {} , using default value", - exiOptions.getAlignmentType()); - case bitPacked: { - alignmentString = EXIParameters.EXI_PARAMETER_BIT_PACKED; - break; - } - } + EXIParameters.EXI_PARAMETER_ALIGNMENT); - alignmentElement.setTextContent(alignmentString); + alignmentElement.setTextContent(exiOptions.getAlignment()); startExiElement.appendChild(alignmentElement); } - private static void createFidelityElement(final Document doc, final List fidelityElements, - final boolean fidelity, final String fidelityName) { - - if (fidelity) { - fidelityElements.add(doc.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, - fidelityName)); + private static void createFidelityElement(final Document doc, final List elements, + final String fidelity) { + if (fidelity != null) { + elements.add(doc.createElementNS(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_EXI_1_0, fidelity)); } - } } diff --git a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionTest.java b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionTest.java index f1dad80c6c..c372ecb34c 100644 --- a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionTest.java +++ b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/AbstractNetconfSessionTest.java @@ -42,8 +42,8 @@ import org.opendaylight.netconf.api.NetconfSessionListener; import org.opendaylight.netconf.api.NetconfTerminationReason; import org.opendaylight.netconf.api.messages.NetconfHelloMessage; import org.opendaylight.netconf.api.messages.NetconfHelloMessageAdditionalHeader; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; import org.opendaylight.netconf.nettyutil.handler.exi.NetconfStartExiMessage; -import org.openexi.proc.common.EXIOptions; public class AbstractNetconfSessionTest { @@ -142,7 +142,7 @@ public class AbstractNetconfSessionTest { TestingNetconfSession testingNetconfSession = new TestingNetconfSession(listener, channel, 1L); testingNetconfSession = spy(testingNetconfSession); - testingNetconfSession.startExiCommunication(NetconfStartExiMessage.create(new EXIOptions(), "4")); + testingNetconfSession.startExiCommunication(NetconfStartExiMessage.create(EXIParameters.empty(), "4")); verify(testingNetconfSession).addExiHandlers(any(ByteToMessageDecoder.class), any(MessageToByteEncoder.class)); } diff --git a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIHandlersTest.java b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIHandlersTest.java index b1b6e6d56a..a6c5f0d3a4 100644 --- a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIHandlersTest.java +++ b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/NetconfEXIHandlersTest.java @@ -12,23 +12,23 @@ import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import com.google.common.collect.Lists; +import com.siemens.ct.exi.api.sax.SAXEncoder; +import com.siemens.ct.exi.exceptions.EXIException; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.List; +import javax.xml.transform.TransformerException; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.config.util.xml.XmlUtil; import org.opendaylight.netconf.api.NetconfMessage; -import org.openexi.proc.common.EXIOptions; -import org.openexi.proc.common.EXIOptionsException; -import org.openexi.sax.Transmogrifier; -import org.openexi.sax.TransmogrifierException; -import org.xml.sax.InputSource; +import org.opendaylight.netconf.nettyutil.handler.exi.EXIParameters; public class NetconfEXIHandlersTest { @@ -40,20 +40,21 @@ public class NetconfEXIHandlersTest { @Before public void setUp() throws Exception { - final NetconfEXICodec codec = new NetconfEXICodec(new EXIOptions()); + final NetconfEXICodec codec = NetconfEXICodec.forParameters(EXIParameters.empty()); netconfMessageToEXIEncoder = NetconfMessageToEXIEncoder.create(codec); netconfEXIToMessageDecoder = NetconfEXIToMessageDecoder.create(codec); msg = new NetconfMessage(XmlUtil.readXmlToDocument(msgAsString)); - this.msgAsExi = msgToExi(msgAsString, codec); + this.msgAsExi = msgToExi(msg, codec); } - private static byte[] msgToExi(final String msgAsString,final NetconfEXICodec codec) - throws EXIOptionsException, TransmogrifierException, IOException { + private static byte[] msgToExi(final NetconfMessage msg, final NetconfEXICodec codec) + throws IOException, EXIException, TransformerException { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - final Transmogrifier transmogrifier = codec.getTransmogrifier(); - transmogrifier.setOutputStream(byteArrayOutputStream); - transmogrifier.encode(new InputSource(new ByteArrayInputStream(msgAsString.getBytes()))); + final SAXEncoder encoder = codec.getWriter(); + encoder.setOutputStream(byteArrayOutputStream); + ThreadLocalTransformers.getDefaultTransformer().transform(new DOMSource(msg.getDocument()), + new SAXResult(encoder)); return byteArrayOutputStream.toByteArray(); } diff --git a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParametersTest.java b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParametersTest.java index f14e0995b0..272d5b30e4 100644 --- a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParametersTest.java +++ b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/EXIParametersTest.java @@ -10,14 +10,15 @@ package org.opendaylight.netconf.nettyutil.handler.exi; import static org.junit.Assert.assertEquals; +import com.siemens.ct.exi.CodingMode; +import com.siemens.ct.exi.EXIFactory; +import com.siemens.ct.exi.FidelityOptions; import java.util.Arrays; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.opendaylight.controller.config.util.xml.XmlElement; import org.opendaylight.controller.config.util.xml.XmlUtil; -import org.openexi.proc.common.AlignmentType; -import org.openexi.proc.common.EXIOptions; @RunWith(Parameterized.class) public class EXIParametersTest { @@ -42,26 +43,27 @@ public class EXIParametersTest { + "\n" + "\n"; - final EXIOptions fullOptions = new EXIOptions(); - fullOptions.setAlignmentType(AlignmentType.byteAligned); - fullOptions.setPreserveLexicalValues(true); - fullOptions.setPreserveDTD(true); - fullOptions.setPreserveComments(true); - fullOptions.setPreserveNS(true); - fullOptions.setPreservePIs(true); + final FidelityOptions fullOptions = FidelityOptions.createDefault(); + fullOptions.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_DTD, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_COMMENT, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_PREFIX, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_PI, true); return Arrays.asList(new Object[][]{ - {noChangeXml, new EXIOptions()}, - {fullOptionsXml, fullOptions}, + {noChangeXml, CodingMode.BIT_PACKED, FidelityOptions.createDefault()}, + {fullOptionsXml, CodingMode.BYTE_PACKED, fullOptions}, }); } private final String sourceXml; - private final EXIOptions exiOptions; + private final CodingMode coding; + private final FidelityOptions fidelity; - public EXIParametersTest(final String sourceXml, final EXIOptions exiOptions) { + public EXIParametersTest(final String sourceXml, final CodingMode coding, final FidelityOptions fidelity) { this.sourceXml = sourceXml; - this.exiOptions = exiOptions; + this.coding = coding; + this.fidelity = fidelity; } @Test @@ -71,12 +73,8 @@ public class EXIParametersTest { XmlElement.fromDomElement( XmlUtil.readXmlToElement(sourceXml))); - - assertEquals(opts.getOptions().getAlignmentType(), exiOptions.getAlignmentType()); - assertEquals(opts.getOptions().getPreserveComments(), exiOptions.getPreserveComments()); - assertEquals(opts.getOptions().getPreserveLexicalValues(), exiOptions.getPreserveLexicalValues()); - assertEquals(opts.getOptions().getPreserveNS(), exiOptions.getPreserveNS()); - assertEquals(opts.getOptions().getPreserveDTD(), exiOptions.getPreserveDTD()); - assertEquals(opts.getOptions().getPreserveNS(), exiOptions.getPreserveNS()); + final EXIFactory factory = opts.getFactory(); + assertEquals(fidelity, factory.getFidelityOptions()); + assertEquals(coding, factory.getCodingMode()); } } \ No newline at end of file diff --git a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageTest.java b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageTest.java index d7ccba6f3b..f2adab8190 100644 --- a/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageTest.java +++ b/netconf/netconf-netty-util/src/test/java/org/opendaylight/netconf/nettyutil/handler/exi/NetconfStartExiMessageTest.java @@ -10,14 +10,14 @@ package org.opendaylight.netconf.nettyutil.handler.exi; import static org.junit.Assert.assertTrue; +import com.siemens.ct.exi.CodingMode; +import com.siemens.ct.exi.FidelityOptions; import java.util.Arrays; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.openexi.proc.common.AlignmentType; -import org.openexi.proc.common.EXIOptions; @RunWith(Parameterized.class) public class NetconfStartExiMessageTest { @@ -46,24 +46,23 @@ public class NetconfStartExiMessageTest { + "\n" + ""; - final EXIOptions fullOptions = new EXIOptions(); - fullOptions.setAlignmentType(AlignmentType.byteAligned); - fullOptions.setPreserveLexicalValues(true); - fullOptions.setPreserveDTD(true); - fullOptions.setPreserveComments(true); - fullOptions.setPreserveNS(true); - fullOptions.setPreservePIs(true); + final FidelityOptions fullOptions = FidelityOptions.createDefault(); + fullOptions.setFidelity(FidelityOptions.FEATURE_LEXICAL_VALUE, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_DTD, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_COMMENT, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_PREFIX, true); + fullOptions.setFidelity(FidelityOptions.FEATURE_PI, true); return Arrays.asList(new Object[][]{ - {noChangeXml, new EXIOptions()}, - {fullOptionsXml, fullOptions}, + {noChangeXml, EXIParameters.empty()}, + {fullOptionsXml, new EXIParameters(CodingMode.BYTE_PACKED, fullOptions)}, }); } private final String controlXml; - private final EXIOptions exiOptions; + private final EXIParameters exiOptions; - public NetconfStartExiMessageTest(final String controlXml, final EXIOptions exiOptions) { + public NetconfStartExiMessageTest(final String controlXml, final EXIParameters exiOptions) { this.controlXml = controlXml; this.exiOptions = exiOptions; } -- 2.36.6