Travis Yocum created AVRO-2493:
----------------------------------

             Summary: Unable to register Logical Type for custom Conversion 
class
                 Key: AVRO-2493
                 URL: https://issues.apache.org/jira/browse/AVRO-2493
             Project: Apache Avro
          Issue Type: Bug
          Components: java, logical types
    Affects Versions: 1.9.0
            Reporter: Travis Yocum


I have created a custom conversion class for Java's (1.8) 
java.time.OffsetDateTime.
{code:java}
public class OffsetDateTimeConversion extends Conversion<OffsetDateTime> {
    private static final DateTimeFormatter DATE_TIME_FORMATTER = 
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.nnnnnnZZZZZ");

    @Override
    public Class<OffsetDateTime> getConvertedType() {
        return OffsetDateTime.class;
    }

    @Override
    public String getLogicalTypeName() {
        return "offset-date-time";
    }

    @Override
    public OffsetDateTime fromCharSequence(CharSequence value, Schema schema, 
LogicalType type) {
        return OffsetDateTime.parse(value, DATE_TIME_FORMATTER);
    }

    @Override
    public CharSequence toCharSequence(OffsetDateTime value, Schema schema, 
LogicalType type) {
        return value.format(DATE_TIME_FORMATTER);
    }
}
{code}
 And my simple schema to test (including a field that uses the built-in 
"time-millis" converter in Avro 1.9 for testing purposes):

TimeTest.avsc

 
{code:java}
{
   "type": "record",
   "name": "TimeTest",
   "namespace": "time.test",
   "fields": [
      {
           "name": "createTime",
           "type": {
               "type": "int",
               "logicalType": "time-millis"
           }
      },
      {
           "name": "createDateTime",
           "type": {
               "type": "string",
               "logicalType": "offset-date-time"
           }
      }
   ]
}
{code}
 

I've also created a LogicalType for my conversion field that I need to register:

 
{code:java}
public class OffsetDateTimeLogicalType extends LogicalType {
    public static final String LOGICAL_DATE_TIME_NAME = "offset-date-time";

    public OffsetDateTimeLogicalType() {
        super(LOGICAL_DATE_TIME_NAME);
    }

    @Override
    public void validate(Schema schema) {
        super.validate(schema);
        if (schema.getType() != Schema.Type.STRING) {
            throw new IllegalArgumentException("Logical type 'offset-date-time' 
must be of type string");
        }
    }
}{code}
 

I've been debugging the avro-maven-plugin and have been able to pinpoint where 
my issue is occurring while parsing the schema:

 
{code:java}
// parse logical type if present
result.logicalType = LogicalTypes.fromSchemaIgnoreInvalid(result);
{code}
 

The schema's "logicalType" property is being set to null because it's not a 
registered logical type.

The code I need to execute is:

 
{code:java}
LogicalTypes.register(getLogicalTypeName(), schema -> new 
OffsetDateTimeLogicalType());
{code}
Without modifying the plugin code, I see no way to execute this register so 
that the Schema.parse method (which is called before the conversion class is 
executed) will recognize this LogicalType.

 

The plugin has a config property <enableDecimalLogicalType> to allow for 
registering the Decimal logical types but nothing to enable other logical types.

Am I missing something or is this a real issue?



--
This message was sent by Atlassian JIRA
(v7.6.14#76016)

Reply via email to