X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fhandler%2FNetconfEXICodec.java;fp=opendaylight%2Fnetconf%2Fnetconf-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Futil%2Fhandler%2FNetconfEXICodec.java;h=c28db18901eac433cee067d997e3afa33124eb63;hp=0000000000000000000000000000000000000000;hb=7451e256fd9a658db243666bc7e734204519ceee;hpb=1e81fa45ab0ced56eef0518c7e7f87857724985b diff --git a/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfEXICodec.java b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfEXICodec.java new file mode 100644 index 0000000000..c28db18901 --- /dev/null +++ b/opendaylight/netconf/netconf-util/src/main/java/org/opendaylight/controller/netconf/util/handler/NetconfEXICodec.java @@ -0,0 +1,63 @@ +package org.opendaylight.controller.netconf.util.handler; + +import org.openexi.proc.HeaderOptionsOutputType; +import org.openexi.proc.common.AlignmentType; +import org.openexi.proc.common.EXIOptions; +import org.openexi.proc.common.EXIOptionsException; +import org.openexi.proc.common.GrammarOptions; +import org.openexi.proc.grammars.GrammarCache; +import org.openexi.sax.EXIReader; +import org.openexi.sax.Transmogrifier; + +import com.google.common.base.Preconditions; + +final class NetconfEXICodec { + /** + * 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. + */ + private static final boolean OUTPUT_EXI_COOKIE = true; + private final AlignmentType alignmentType; + private final EXIOptions exiOptions; + + public NetconfEXICodec(final AlignmentType alignmentType, final EXIOptions exiOptions) { + this.alignmentType = Preconditions.checkNotNull(alignmentType); + this.exiOptions = Preconditions.checkNotNull(exiOptions); + } + + private GrammarCache getGrammarCache() { + 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 new GrammarCache(null, go); + } + + EXIReader getReader() throws EXIOptionsException { + final EXIReader r = new EXIReader(); + r.setPreserveLexicalValues(exiOptions.getPreserveLexicalValues()); + r.setGrammarCache(getGrammarCache()); + return r; + } + + Transmogrifier getTransmogrifier() throws EXIOptionsException { + final Transmogrifier transmogrifier = new Transmogrifier(); + transmogrifier.setAlignmentType(alignmentType); + transmogrifier.setBlockSize(exiOptions.getBlockSize()); + transmogrifier.setGrammarCache(getGrammarCache()); + transmogrifier.setOutputCookie(OUTPUT_EXI_COOKIE); + transmogrifier.setOutputOptions(HeaderOptionsOutputType.all); + return transmogrifier; + } +}