[ 
https://issues.apache.org/jira/browse/AVRO-2918?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17738989#comment-17738989
 ] 

Samael Bate edited comment on AVRO-2918 at 6/30/23 9:54 AM:
------------------------------------------------------------

I'd very much like Avro to support this. As a bit of a workaround I've had some 
luck using 
{{id "io.github.tunguski.interfacer" version "0.0.7"}} in my gradle build along 
with the avro gradle-plugin. interfacer allows me to post-process my generated 
Java sources and add Interfaces to classes that have been generated by avro 
types.
 
{code:java}
// The interfacer plugin allows us to post-process the generated Java source 
and apply interfaces defined in the src folder
tasks.register("avroInterfacer", pl.matsuo.interfacer.gradle.InterfacerTask) {
    dependsOn generate
    interfacePackage = 'com.domain.schema.core'
    interfacesDirectory = file('src/main/java')
    scanDirectory = file("build/generated/java")
} {code}
on the records I simply annotate them like {{@java-interface("UserAccount")}}
 
Unfortunately though the interfacer plugin only has one release and is a one 
person project. Ideally I'd like it if Avro itself could support something like 
this:
 
{code:java}
@interface("pubnub.core.PubNubMessage") // this interface can be defined 
elsewhere by me
record PubNubPayloadMessage {
    union {
       null,
       CustomerMessagePayload,
       SupportStaffL1Payload,
       SupportStaffL2Payload
    } payload = null;

    pubnub.core.PubNubMetadata metadata;
} {code}
where each of those payload records are annotated with 
@interface("pubnub.core.PubNubPayload").
 
today, if I call {{getPayload()}} the return type is {_}Object{_}, which we 
then have cast to the required payload type. 

Ideally it should be able to use generics so we can generate a 
PubNubPayloadMessage class that implements {{PubNubMessage<PubNubPayload>}} and 
have getPayload() return the right type.


was (Author: singingbush):
I'd very much like Avro to support this. As a bit of a workaround I've had some 
luck using 
{{id "io.github.tunguski.interfacer" version "0.0.7"}} in my gradle build along 
with the avro gradle-plugin. interfacer allows me to post-process my generated 
Java sources and add Interfaces to classes that have been generated by avro 
types.
 
{code:java}
// The interfacer plugin allows us to post-process the generated Java source 
and apply interfaces defined in the src folder
tasks.register("avroInterfacer", pl.matsuo.interfacer.gradle.InterfacerTask) {
    dependsOn generate
    interfacePackage = 'com.domain.schema.core'
    interfacesDirectory = file('src/main/java')
    scanDirectory = file("build/generated/java")
} {code}
on the records I simply annotate them like {{@java-interface("UserAccount")}}
 
Unfortunately though the interfacer plugin only has one release and is a one 
person project. Ideally I'd like it if Avro itself could support something like 
this:
 
{code:java}
@interface("pubnub.core.PubNubMessage") // this interface can be defined 
elsewhere by me
record PubNubPayloadMessage {
    union {
       null,
       CustomerMessagePayload,
       SupportStaffL1Payload,
       SupportStaffL2Payload
    } payload = null;

    pubnub.core.PubNubMetadata metadata;
} {code}
where each of those payload records are annotated with 
@interface("pubnub.core.PubNubPayload").
 
today, if I call {{getPayload()}} the return type is _Object_ but with this 
approach it would be _PubNubPayload_

> Schema polymorphism
> -------------------
>
>                 Key: AVRO-2918
>                 URL: https://issues.apache.org/jira/browse/AVRO-2918
>             Project: Apache Avro
>          Issue Type: New Feature
>          Components: logical types, misc, spec
>            Reporter: Jonathan Rapoport
>            Assignee: Christophe Le Saec
>            Priority: Critical
>              Labels: features, pull-request-available
>   Original Estimate: 96h
>          Time Spent: 10m
>  Remaining Estimate: 95h 50m
>
> Include the option to use named types as base types for a new schema. Allow 
> for MRO generation. Field inheritance. 
> The benefits of this approach include:
>  * Defining a schema as validation for a certain wire, and so allowing the 
> receiver to be certain of the structure of the data (this works today). 
> However, defining an extension of this schema, or certain schemas which can 
> be normalized to the original schema, but contain additional information, 
> will not allow it to be sent over the same wire.
>  * Backwards compatibility through inheritance - you never break the old 
> schema, thus allowing a long integration period, with no need to recode all 
> processes familiar with the schema. The new schema will simply inherit the 
> old one, and only add information.
>  * Allow for full data control through polymorphism, and the ability to 
> replace structures within any supported language. 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to