b563bff000df4d720b0586ed984715f7ddd97887
[yangtools.git] / data / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / TypeDefinitionAwareCodec.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.yang.data.impl.codec;
9
10 import static java.util.Objects.requireNonNull;
11
12 import java.util.Optional;
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.eclipse.jdt.annotation.Nullable;
15 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
16 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
19 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
20 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.Int16TypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.Int32TypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.type.Int64TypeDefinition;
25 import org.opendaylight.yangtools.yang.model.api.type.Int8TypeDefinition;
26 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
27 import org.opendaylight.yangtools.yang.model.api.type.Uint16TypeDefinition;
28 import org.opendaylight.yangtools.yang.model.api.type.Uint32TypeDefinition;
29 import org.opendaylight.yangtools.yang.model.api.type.Uint64TypeDefinition;
30 import org.opendaylight.yangtools.yang.model.api.type.Uint8TypeDefinition;
31 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
32
33 public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> extends AbstractDataStringCodec<J> {
34     private final @NonNull Class<J> inputClass;
35     private final @Nullable T typeDefinition;
36
37     // FIXME: reverse arguments
38     protected TypeDefinitionAwareCodec(final @Nullable T typeDefinition, final Class<J> outputClass) {
39         this.typeDefinition = typeDefinition;
40         this.inputClass = requireNonNull(outputClass);
41     }
42
43     @Override
44     public Class<J> getInputClass() {
45         return inputClass;
46     }
47
48     public Optional<T> getTypeDefinition() {
49         return Optional.ofNullable(typeDefinition);
50     }
51
52     @SuppressWarnings("unchecked")
53     public static TypeDefinitionAwareCodec<Object, ?> from(final TypeDefinition<?> typeDefinition) {
54         return (TypeDefinitionAwareCodec<Object, ?>) fromType(typeDefinition);
55     }
56
57     // FIXME: do we want an Optional or a throws instead of @Nullable here?
58     public static @Nullable TypeDefinitionAwareCodec<?, ?> fromType(final TypeDefinition<?> typeDefinition) {
59         if (typeDefinition instanceof BinaryTypeDefinition) {
60             return BinaryStringCodec.from((BinaryTypeDefinition)typeDefinition);
61         } else if (typeDefinition instanceof BitsTypeDefinition) {
62             return BitsStringCodec.from((BitsTypeDefinition)typeDefinition);
63         } else if (typeDefinition instanceof BooleanTypeDefinition) {
64             return BooleanStringCodec.from((BooleanTypeDefinition)typeDefinition);
65         } else if (typeDefinition instanceof DecimalTypeDefinition) {
66             return  DecimalStringCodec.from((DecimalTypeDefinition)typeDefinition);
67         } else if (typeDefinition instanceof EmptyTypeDefinition) {
68             return EmptyStringCodec.INSTANCE;
69         } else if (typeDefinition instanceof EnumTypeDefinition) {
70             return EnumStringCodec.from((EnumTypeDefinition)typeDefinition);
71         } else if (typeDefinition instanceof Int8TypeDefinition) {
72             return AbstractIntegerStringCodec.from((Int8TypeDefinition) typeDefinition);
73         } else if (typeDefinition instanceof Int16TypeDefinition) {
74             return AbstractIntegerStringCodec.from((Int16TypeDefinition) typeDefinition);
75         } else if (typeDefinition instanceof Int32TypeDefinition) {
76             return AbstractIntegerStringCodec.from((Int32TypeDefinition) typeDefinition);
77         } else if (typeDefinition instanceof Int64TypeDefinition) {
78             return AbstractIntegerStringCodec.from((Int64TypeDefinition) typeDefinition);
79         } else if (typeDefinition instanceof StringTypeDefinition) {
80             return StringStringCodec.from((StringTypeDefinition)typeDefinition);
81         } else if (typeDefinition instanceof UnionTypeDefinition) {
82             return UnionStringCodec.from((UnionTypeDefinition)typeDefinition);
83         } else if (typeDefinition instanceof Uint8TypeDefinition) {
84             return AbstractIntegerStringCodec.from((Uint8TypeDefinition) typeDefinition);
85         } else if (typeDefinition instanceof Uint16TypeDefinition) {
86             return AbstractIntegerStringCodec.from((Uint16TypeDefinition) typeDefinition);
87         } else if (typeDefinition instanceof Uint32TypeDefinition) {
88             return AbstractIntegerStringCodec.from((Uint32TypeDefinition) typeDefinition);
89         } else if (typeDefinition instanceof Uint64TypeDefinition) {
90             return AbstractIntegerStringCodec.from((Uint64TypeDefinition) typeDefinition);
91         } else {
92             return null;
93         }
94     }
95 }