BUG-2459: cache GrammarCache 09/13309/20
authorRobert Varga <rovarga@cisco.com>
Tue, 2 Dec 2014 14:55:20 +0000 (15:55 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 16 Dec 2014 10:58:57 +0000 (11:58 +0100)
The GrammarCache without a schema is used as a template, so it is
expliticly okay to reuse it across multiple instances. Make sure we
reuse it as much as possible.

Change-Id: I0e642b1b580051e997de9602020ab0dace7dbcac
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/netconf/netconf-netty-util/src/main/java/org/opendaylight/controller/netconf/nettyutil/handler/NetconfEXICodec.java

index 30867bcd186390ff6d73c737a02d457c60955f92..8f67da670a9231369cc8914dfb490b02428d88a5 100644 (file)
@@ -30,13 +30,19 @@ public final class NetconfEXICodec {
         }
     };
 
+    /**
+     * 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;
 
     public NetconfEXICodec(final EXIOptions exiOptions) {
         this.exiOptions = Preconditions.checkNotNull(exiOptions);
+        this.exiGrammarCache = createGrammarCache(exiOptions);
     }
 
-    private GrammarCache getGrammarCache() {
+    private static GrammarCache createGrammarCache(final EXIOptions exiOptions) {
         short go = GrammarOptions.DEFAULT_OPTIONS;
         if (exiOptions.getPreserveComments()) {
             go = GrammarOptions.addCM(go);
@@ -51,13 +57,13 @@ public final class NetconfEXICodec {
             go = GrammarOptions.addPI(go);
         }
 
-        return new GrammarCache(null, go);
+        return new GrammarCache(go);
     }
 
     EXIReader getReader() throws EXIOptionsException {
         final EXIReader r = new EXIReader();
         r.setPreserveLexicalValues(exiOptions.getPreserveLexicalValues());
-        r.setGrammarCache(getGrammarCache());
+        r.setGrammarCache(exiGrammarCache);
         r.setEntityResolver(ENTITY_RESOLVER);
         return r;
     }
@@ -66,7 +72,7 @@ public final class NetconfEXICodec {
         final Transmogrifier transmogrifier = new Transmogrifier();
         transmogrifier.setAlignmentType(exiOptions.getAlignmentType());
         transmogrifier.setBlockSize(exiOptions.getBlockSize());
-        transmogrifier.setGrammarCache(getGrammarCache());
+        transmogrifier.setGrammarCache(exiGrammarCache);
         transmogrifier.setOutputCookie(OUTPUT_EXI_COOKIE);
         transmogrifier.setOutputOptions(HeaderOptionsOutputType.all);
         transmogrifier.setResolveExternalGeneralEntities(false);