2 * Copyright (c) 2013 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.impl.codec;
10 import com.google.common.base.Joiner;
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import com.google.common.base.Splitter;
14 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
15 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
16 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
19 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
20 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
25 import org.opendaylight.yangtools.yang.model.util.DerivedType;
27 public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> implements DataStringCodec<J> {
29 private static final TypeDefinitionAwareCodec<?,?> EMPTY_DEFAULT_CODEC = new EmptyStringCodec(Optional.<EmptyTypeDefinition>absent());
30 private final Optional<T> typeDefinition;
31 private final Class<J> inputClass;
34 public Class<J> getInputClass() {
38 protected TypeDefinitionAwareCodec(final Optional<T> typeDefinition, final Class<J> outputClass) {
39 Preconditions.checkArgument(outputClass != null, "Output class must be specified.");
40 this.typeDefinition = typeDefinition;
41 this.inputClass = outputClass;
44 public Optional<T> getTypeDefinition() {
45 return typeDefinition;
48 @SuppressWarnings({ "rawtypes", "unchecked" })
49 public static final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> from(final TypeDefinition typeDefinition) {
50 return fromType(typeDefinition);
53 @SuppressWarnings("unchecked")
54 public static final <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(final T typeDefinition) {
55 final T normalizedType = (T) DerivedType.from(typeDefinition);
56 @SuppressWarnings("rawtypes")
57 TypeDefinitionAwareCodec codec = null;
59 if (normalizedType instanceof BinaryTypeDefinition) {
60 codec = BinaryStringCodec.from((BinaryTypeDefinition)normalizedType);
61 } else if (normalizedType instanceof BitsTypeDefinition) {
62 codec = BitsStringCodec.from((BitsTypeDefinition)normalizedType);
63 } else if (normalizedType instanceof BooleanTypeDefinition) {
64 codec = BooleanStringCodec.from((BooleanTypeDefinition)normalizedType);
65 } else if (normalizedType instanceof DecimalTypeDefinition) {
66 codec = DecimalStringCodec.from((DecimalTypeDefinition)normalizedType);
67 } else if (normalizedType instanceof EmptyTypeDefinition) {
68 codec = EMPTY_DEFAULT_CODEC;
69 } else if (normalizedType instanceof EnumTypeDefinition) {
70 codec = EnumStringCodec.from((EnumTypeDefinition)normalizedType);
71 } else if (normalizedType instanceof IntegerTypeDefinition) {
72 codec = AbstractIntegerStringCodec.from((IntegerTypeDefinition) normalizedType);
73 } else if (normalizedType instanceof StringTypeDefinition) {
74 codec = StringStringCodec.from((StringTypeDefinition)normalizedType);
75 } else if (normalizedType instanceof UnionTypeDefinition) {
76 codec = UnionStringCodec.from((UnionTypeDefinition)normalizedType);
77 } else if (normalizedType instanceof UnsignedIntegerTypeDefinition) {
78 codec = AbstractIntegerStringCodec.from((UnsignedIntegerTypeDefinition) normalizedType);
84 public static class BooleanCodecStringImpl extends BooleanStringCodec{
85 protected BooleanCodecStringImpl(final Optional<BooleanTypeDefinition> typeDef) {
91 public static class Uint8CodecStringImpl extends Uint8StringCodec {
93 protected Uint8CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
99 public static class Uint16CodecStringImpl extends Uint16StringCodec {
100 protected Uint16CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
106 public static class Uint32CodecStringImpl extends Uint32StringCodec {
107 protected Uint32CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
113 public static class Uint64CodecStringImpl extends Uint64StringCodec {
114 protected Uint64CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
120 public static class StringCodecStringImpl extends StringStringCodec {
121 protected StringCodecStringImpl(final Optional<StringTypeDefinition> typeDef) {
122 super(typeDef.get());
127 public static class Int16CodecStringImpl extends Int16StringCodec {
128 protected Int16CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
134 public static class Int32CodecStringImpl extends Int32StringCodec {
135 protected Int32CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
142 public static class Int64CodecStringImpl extends Int64StringCodec {
143 protected Int64CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
150 public static class Int8CodecStringImpl extends Int8StringCodec {
152 protected Int8CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
159 public static class EmptyCodecStringImpl extends EmptyStringCodec {
160 protected EmptyCodecStringImpl(final Optional<EmptyTypeDefinition> typeDef) {
166 public static final class BinaryCodecStringImpl extends BinaryStringCodec {
167 protected BinaryCodecStringImpl(final Optional<BinaryTypeDefinition> typeDef) {
174 public static final class BitsCodecStringImpl extends BitsStringCodec {
176 public static final Joiner JOINER = Joiner.on(" ").skipNulls();
177 public static final Splitter SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
179 protected BitsCodecStringImpl(final Optional<BitsTypeDefinition> typeDef) {
185 public static class EnumCodecStringImpl extends EnumStringCodec {
187 protected EnumCodecStringImpl(final Optional<EnumTypeDefinition> typeDef) {
194 public static class DecimalCodecStringImpl extends DecimalStringCodec {
195 protected DecimalCodecStringImpl(final Optional<DecimalTypeDefinition> typeDef) {
201 public static class UnionCodecStringImpl extends UnionStringCodec {
202 protected UnionCodecStringImpl(final Optional<UnionTypeDefinition> typeDef) {