- public static final TypeDefinitionAwareCodec<?> from(TypeDefinition<?> typeDefinition) {
- while(typeDefinition.getBaseType() != null) {
- typeDefinition = typeDefinition.getBaseType();
- }
-
- if (BINARY_QNAME.equals(typeDefinition.getQName())) {
- return new BinaryCodec(typeDefinition);
- }
- if (BITS_QNAME.equals(typeDefinition.getQName())) {
- return new BitsCodec(typeDefinition);
- }
- if (BOOLEAN_QNAME.equals(typeDefinition.getQName())) {
- return new BooleanCodec(typeDefinition);
- }
- if (DECIMAL64_QNAME.equals(typeDefinition.getQName())) {
- return new DecimalCodec(typeDefinition);
- }
- if (EMPTY_QNAME.equals(typeDefinition.getQName())) {
- return new EmptyCodec(typeDefinition);
- }
- if (ENUMERATION_QNAME.equals(typeDefinition.getQName())) {
- return new EnumCodec(typeDefinition);
- }
- if (INT8_QNAME.equals(typeDefinition.getQName())) {
- return new Int8Codec(typeDefinition);
- }
- if (INT16_QNAME.equals(typeDefinition.getQName())) {
- return new Int16Codec(typeDefinition);
- }
- if (INT32_QNAME.equals(typeDefinition.getQName())) {
- return new Int32Codec(typeDefinition);
- }
- if (INT64_QNAME.equals(typeDefinition.getQName())) {
- return new Int64Codec(typeDefinition);
- }
- if (STRING_QNAME.equals(typeDefinition.getQName())) {
- return new StringCodec(typeDefinition);
- }
- if (UINT8_QNAME.equals(typeDefinition.getQName())) {
- return new Uint8Codec(typeDefinition);
- }
- if (UINT16_QNAME.equals(typeDefinition.getQName())) {
- return new Uint16Codec(typeDefinition);
- }
- if (UINT32_QNAME.equals(typeDefinition.getQName())) {
- return new Uint32Codec(typeDefinition);
- }
- if (UINT64_QNAME.equals(typeDefinition.getQName())) {
- return new Uint64Codec(typeDefinition);
- }
- return null;
+ @SuppressWarnings("unchecked")
+ public static final <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(final T typeDefinition) {
+ T superType = typeDefinition;
+ while (superType.getBaseType() != null) {
+ superType = superType.getBaseType();
+ }
+
+ @SuppressWarnings("rawtypes")
+ TypeDefinitionAwareCodec codec = null;
+
+ if (superType instanceof BinaryTypeDefinition) {
+ codec = BINARY_DEFAULT_CODEC;
+ } else if (superType instanceof BitsTypeDefinition) {
+ codec = new BitsCodecStringImpl( Optional.of( (BitsTypeDefinition)superType ) );
+ } else if (superType instanceof BooleanTypeDefinition) {
+ codec = BOOLEAN_DEFAULT_CODEC;
+ } else if (superType instanceof DecimalTypeDefinition) {
+ codec = DECIMAL64_DEFAULT_CODEC;
+ } else if (superType instanceof EmptyTypeDefinition) {
+ codec = EMPTY_DEFAULT_CODEC;
+ } else if (superType instanceof EnumTypeDefinition) {
+ codec = new EnumCodecStringImpl( Optional.of( (EnumTypeDefinition)superType ) );
+ } else if (superType instanceof IntegerTypeDefinition) {
+ if (INT8_QNAME.equals(superType.getQName())) {
+ codec = INT8_DEFAULT_CODEC;
+ } else if (INT16_QNAME.equals(superType.getQName())) {
+ codec = INT16_DEFAULT_CODEC;
+ } else if (INT32_QNAME.equals(superType.getQName())) {
+ codec = INT32_DEFAULT_CODEC;
+ } else if (INT64_QNAME.equals(superType.getQName())) {
+ codec = INT64_DEFAULT_CODEC;
+ }
+ } else if (superType instanceof StringTypeDefinition) {
+ codec = STRING_DEFAULT_CODEC;
+ } else if (superType instanceof UnionTypeDefinition) {
+ codec = new UnionCodecStringImpl( Optional.of( (UnionTypeDefinition)superType ) );
+ } else if (superType instanceof UnsignedIntegerTypeDefinition) {
+ if (UINT8_QNAME.equals(superType.getQName())) {
+ codec = UINT8_DEFAULT_CODEC;
+ }
+ if (UINT16_QNAME.equals(superType.getQName())) {
+ codec = UINT16_DEFAULT_CODEC;
+ }
+ if (UINT32_QNAME.equals(superType.getQName())) {
+ codec = UINT32_DEFAULT_CODEC;
+ }
+ if (UINT64_QNAME.equals(superType.getQName())) {
+ codec = UINT64_DEFAULT_CODEC;
+ }
+ }
+
+ return codec;