X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-codec-gson%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fcodec%2Fgson%2FJSONCodecFactory.java;h=1d6ffc827724a1670da028bdc5a34cc9810ccc43;hb=e704e6a6d1cc4db7ac1e1f53b54ec3bf51aaecc3;hp=3766169f3c8ad8a57919f0006773ab9bf105460e;hpb=a8b36814f85ef7a6d52ed57990142741324d6cc7;p=yangtools.git diff --git a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java index 3766169f3c..1d6ffc8277 100644 --- a/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java +++ b/yang/yang-data-codec-gson/src/main/java/org/opendaylight/yangtools/yang/data/codec/gson/JSONCodecFactory.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.data.codec.gson; import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; +import com.google.common.base.Verify; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; @@ -20,9 +21,11 @@ import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition; +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.LeafrefTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.IdentityrefType; -import org.opendaylight.yangtools.yang.model.util.InstanceIdentifierType; +import org.opendaylight.yangtools.yang.model.util.DerivedType; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,7 +54,7 @@ public final class JSONCodecFactory { } @Override - public void serializeToWriter(JsonWriter writer, Object value) throws IOException { + public void serializeToWriter(final JsonWriter writer, final Object value) throws IOException { // NOOP since codec is unkwown. LOG.warn("Call of the serializeToWriter method on JSONCodecFactory.NULL_CODEC object. No operation performed."); } @@ -78,7 +81,7 @@ public final class JSONCodecFactory { private JSONCodecFactory(final SchemaContext context) { this.schemaContext = Preconditions.checkNotNull(context); - iidCodec = new JSONStringInstanceIdentifierCodec(context); + iidCodec = new JSONStringInstanceIdentifierCodec(context, this); } /** @@ -91,41 +94,36 @@ public final class JSONCodecFactory { return new JSONCodecFactory(context); } - private static TypeDefinition resolveBaseTypeFrom(final TypeDefinition type) { - TypeDefinition superType = type; - while (superType.getBaseType() != null) { - superType = superType.getBaseType(); - } - return superType; - } - @SuppressWarnings("unchecked") - private JSONCodec createCodec(DataSchemaNode key, TypeDefinition type) { - TypeDefinition baseType = resolveBaseTypeFrom(type); - if (baseType instanceof LeafrefTypeDefinition) { - return createReferencedTypeCodec(key, (LeafrefTypeDefinition) baseType); - } else if (baseType instanceof IdentityrefType) { - final JSONCodec jsonStringIdentityrefCodec = new JSONStringIdentityrefCodec(schemaContext, - key.getQName().getModule()); + private JSONCodec createCodec(final DataSchemaNode key, final TypeDefinition type) { + final TypeDefinition normalizedType = DerivedType.from(type); + if (normalizedType instanceof LeafrefTypeDefinition) { + return createReferencedTypeCodec(key, (LeafrefTypeDefinition) normalizedType); + } else if (normalizedType instanceof IdentityrefTypeDefinition) { + final JSONCodec jsonStringIdentityrefCodec = + new JSONStringIdentityrefCodec(schemaContext, key.getQName().getModule()); return (JSONCodec) jsonStringIdentityrefCodec; } - return createFromSimpleType(type); + return createFromSimpleType(normalizedType); } - private JSONCodec createReferencedTypeCodec(DataSchemaNode schema, - LeafrefTypeDefinition type) { + private JSONCodec createReferencedTypeCodec(final DataSchemaNode schema, + final LeafrefTypeDefinition type) { // FIXME: Verify if this does indeed support leafref of leafref - TypeDefinition referencedType = + final TypeDefinition referencedType = SchemaContextUtil.getBaseTypeForLeafRef(type, getSchemaContext(), schema); - return createFromSimpleType(referencedType); + Verify.verifyNotNull(referencedType, "Unable to find base type for leafref node '%s'.", schema.getPath()); + return createCodec(schema, referencedType); } @SuppressWarnings("unchecked") - private JSONCodec createFromSimpleType(TypeDefinition type) { - final TypeDefinition baseType = resolveBaseTypeFrom(type); - if (baseType instanceof InstanceIdentifierType) { + private JSONCodec createFromSimpleType(final TypeDefinition type) { + if (type instanceof InstanceIdentifierTypeDefinition) { return (JSONCodec) iidCodec; } + if (type instanceof EmptyTypeDefinition) { + return JSONEmptyCodec.INSTANCE; + } final TypeDefinitionAwareCodec codec = TypeDefinitionAwareCodec.from(type); if (codec == null) { @@ -140,7 +138,7 @@ public final class JSONCodecFactory { return schemaContext; } - JSONCodec codecFor(DataSchemaNode schema) { + JSONCodec codecFor(final DataSchemaNode schema) { return codecs.getUnchecked(schema); }