2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.codec.gson;
10 import com.google.common.annotations.Beta;
11 import com.google.common.cache.CacheBuilder;
12 import com.google.common.cache.CacheLoader;
13 import com.google.common.cache.LoadingCache;
15 import org.opendaylight.yangtools.concepts.Codec;
16 import org.opendaylight.yangtools.yang.data.api.codec.LeafrefCodec;
17 import org.opendaylight.yangtools.yang.data.impl.codec.TypeDefinitionAwareCodec;
18 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
19 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
20 import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.util.IdentityrefType;
22 import org.opendaylight.yangtools.yang.model.util.InstanceIdentifierType;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
27 * This class is implementation-internal and subject to change. Please do not use it.
30 final class CodecFactory {
31 private static final Logger LOG = LoggerFactory.getLogger(CodecFactory.class);
32 private static final Codec<?, ?> LEAFREF_DEFAULT_CODEC = new LeafrefCodec<String>() {
34 public String serialize(final Object data) {
35 return String.valueOf(data);
39 public Object deserialize(final String data) {
43 private static final Codec<?, ?> NULL_CODEC = new Codec<Object, Object>() {
45 public Object deserialize(final Object input) {
50 public Object serialize(final Object input) {
56 private static TypeDefinition<?> resolveBaseTypeFrom(final TypeDefinition<?> type) {
57 TypeDefinition<?> superType = type;
58 while (superType.getBaseType() != null) {
59 superType = superType.getBaseType();
64 private final LoadingCache<TypeDefinition<?>, Codec<?, ?>> codecs =
65 CacheBuilder.newBuilder().softValues().build(new CacheLoader<TypeDefinition<?>, Codec<?, ?>>() {
67 public Codec<?, ?> load(final TypeDefinition<?> key) throws Exception {
68 final TypeDefinition<?> type = resolveBaseTypeFrom(key);
70 if (type instanceof InstanceIdentifierType) {
73 if (type instanceof IdentityrefType) {
76 if (type instanceof LeafrefTypeDefinition) {
77 return LEAFREF_DEFAULT_CODEC;
80 final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> codec = TypeDefinitionAwareCodec.from(type);
82 LOG.debug("Codec for type \"{}\" is not implemented yet.", type.getQName().getLocalName());
90 private final Codec<?, ?> iidCodec;
91 private final Codec<?, ?> idrefCodec;
93 private CodecFactory(final SchemaContext context) {
94 iidCodec = new JSONStringInstanceIdentifierCodec(context);
95 idrefCodec = new JSONStringIdentityrefCodec(context);
98 public static CodecFactory create(final SchemaContext context) {
99 return new CodecFactory(context);
102 @SuppressWarnings("unchecked")
103 public final Codec<Object, Object> codecFor(final TypeDefinition<?> typeDefinition) {
104 return (Codec<Object, Object>) codecs.getUnchecked(typeDefinition);