BUG-1440: cache codecs 22/10522/2
authorRobert Varga <rovarga@cisco.com>
Sat, 30 Aug 2014 18:03:02 +0000 (20:03 +0200)
committerRobert Varga <rovarga@cisco.com>
Sun, 31 Aug 2014 01:01:19 +0000 (03:01 +0200)
Building a codec up is a bit expensive, so let's cache the objects while
we're decoding them.

Change-Id: I0697d018fe3937b8caf97518fd7a5d22ba832c51
Signed-off-by: Robert Varga <rovarga@cisco.com>
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JsonParserStream.java
yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/helpers/RestCodecFactory.java

index 18232ff77ec4d0e971cf21df382322d0e6c922e2..96d336276136d477132512769c1f9c92fcec0b99 100644 (file)
@@ -34,7 +34,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
-import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.gson.helpers.IdentityValuesDTO;
@@ -207,12 +206,7 @@ public final class JsonParserStream implements Closeable, Flushable {
             inputValue = value;
         }
 
-        // FIXME: extract this as a cacheable context?
-        final Codec<Object, Object> codec = codecs.codecFor(typeDefinition);
-        if (codec == null) {
-            return null;
-        }
-        return codec.deserialize(inputValue);
+        return codecs.codecFor(typeDefinition).deserialize(inputValue);
     }
 
     private static TypeDefinition<? extends Object> typeDefinition(final DataSchemaNode node) {
index 94bba9224311cf0829cc443b960bdb4b22ea6918..ba3283133370b59be269067cfa4d4055490362dd 100644 (file)
@@ -9,6 +9,9 @@ package org.opendaylight.yangtools.yang.data.codec.gson.helpers;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Preconditions;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 
 import org.opendaylight.yangtools.concepts.Codec;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
@@ -18,6 +21,13 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
  */
 @Beta
 public final class RestCodecFactory {
+    private final LoadingCache<TypeDefinition<?>, Codec<Object, Object>> codecs =
+            CacheBuilder.newBuilder().softValues().build(new CacheLoader<TypeDefinition<?>, Codec<Object, Object>>() {
+        @Override
+        public Codec<Object, Object> load(final TypeDefinition<?> key) throws Exception {
+            return new ObjectCodec(utils, key);
+        }
+    });
     private final SchemaContextUtils utils;
 
     private RestCodecFactory(final SchemaContextUtils utils) {
@@ -29,7 +39,6 @@ public final class RestCodecFactory {
     }
 
     public final Codec<Object, Object> codecFor(final TypeDefinition<?> typeDefinition) {
-        // FIXME: implement loadingcache
-        return new ObjectCodec(utils, typeDefinition);
+        return codecs.getUnchecked(typeDefinition);
     }
 }