YANGTOOLS-766: introduce JSONCodecFactorySupplier
[yangtools.git] / yang / yang-data-util / src / main / java / org / opendaylight / yangtools / yang / data / util / codec / AbstractCodecFactory.java
index f7df44bbf717f41d7f3773893b86349397086818..ab52a2ec9baf448ebea40ed2c7ca40b25c1f3767 100644 (file)
@@ -16,7 +16,7 @@ import javax.annotation.concurrent.ThreadSafe;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.TypedSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
@@ -25,12 +25,18 @@ import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnknownTypeDefinition;
-import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +66,7 @@ public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
         return schemaContext;
     }
 
-    public final T codecFor(final TypedSchemaNode schema) {
+    public final T codecFor(final TypedDataSchemaNode schema) {
         /*
          * There are many trade-offs to be made here. We need the common case being as fast as possible while reusing
          * codecs as much as possible.
@@ -110,15 +116,29 @@ public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
 
     protected abstract T identityRefCodec(IdentityrefTypeDefinition type, QNameModule module);
 
+    // FIXME: there really are two favors, as 'require-instance true' needs to be validated. In order to deal
+    //        with that, though, we need access to the current data store.
     protected abstract T instanceIdentifierCodec(InstanceIdentifierTypeDefinition type);
 
-    protected abstract T intCodec(IntegerTypeDefinition<?, ?> type);
+    protected abstract T int8Codec(Int8TypeDefinition type);
+
+    protected abstract T int16Codec(Int16TypeDefinition type);
+
+    protected abstract T int32Codec(Int32TypeDefinition type);
+
+    protected abstract T int64Codec(Int64TypeDefinition type);
 
     protected abstract T decimalCodec(DecimalTypeDefinition type);
 
     protected abstract T stringCodec(StringTypeDefinition type);
 
-    protected abstract T uintCodec(UnsignedIntegerTypeDefinition<?, ?> type);
+    protected abstract T uint8Codec(Uint8TypeDefinition type);
+
+    protected abstract T uint16Codec(Uint16TypeDefinition type);
+
+    protected abstract T uint32Codec(Uint32TypeDefinition type);
+
+    protected abstract T uint64Codec(Uint64TypeDefinition type);
 
     protected abstract T unionCodec(UnionTypeDefinition type, List<T> codecs);
 
@@ -137,10 +157,22 @@ public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
         final T ret;
         if (type instanceof StringTypeDefinition) {
             ret = stringCodec((StringTypeDefinition) type);
-        } else if (type instanceof IntegerTypeDefinition) {
-            ret = intCodec((IntegerTypeDefinition<?, ?>) type);
-        } else if (type instanceof UnsignedIntegerTypeDefinition) {
-            ret = uintCodec((UnsignedIntegerTypeDefinition<?, ?>) type);
+        } else if (type instanceof Int8TypeDefinition) {
+            ret = int8Codec((Int8TypeDefinition) type);
+        } else if (type instanceof Int16TypeDefinition) {
+            ret = int16Codec((Int16TypeDefinition) type);
+        } else if (type instanceof Int32TypeDefinition) {
+            ret = int32Codec((Int32TypeDefinition) type);
+        } else if (type instanceof Int64TypeDefinition) {
+            ret = int64Codec((Int64TypeDefinition) type);
+        } else if (type instanceof Uint8TypeDefinition) {
+            ret = uint8Codec((Uint8TypeDefinition) type);
+        } else if (type instanceof Uint16TypeDefinition) {
+            ret = uint16Codec((Uint16TypeDefinition) type);
+        } else if (type instanceof Uint32TypeDefinition) {
+            ret = uint32Codec((Uint32TypeDefinition) type);
+        } else if (type instanceof Uint64TypeDefinition) {
+            ret = uint64Codec((Uint64TypeDefinition) type);
         } else if (type instanceof BooleanTypeDefinition) {
             ret = booleanCodec((BooleanTypeDefinition) type);
         } else if (type instanceof DecimalTypeDefinition) {
@@ -179,7 +211,7 @@ public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
         return true;
     }
 
-    private T createComplexCodecFor(final TypedSchemaNode schema, final TypeDefinition<?> type) {
+    private T createComplexCodecFor(final TypedDataSchemaNode schema, final TypeDefinition<?> type) {
         if (type instanceof UnionTypeDefinition) {
             return createComplexUnion(schema, (UnionTypeDefinition) type);
         } else if (type instanceof LeafrefTypeDefinition) {
@@ -213,7 +245,7 @@ public abstract class AbstractCodecFactory<T extends TypeAwareCodec<?, ?, ?>> {
         return unionCodec(union, codecs);
     }
 
-    private T createComplexUnion(final TypedSchemaNode schema, final UnionTypeDefinition union) {
+    private T createComplexUnion(final TypedDataSchemaNode schema, final UnionTypeDefinition union) {
         final List<TypeDefinition<?>> types = union.getTypes();
         final List<T> codecs = new ArrayList<>(types.size());