You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@avro.apache.org by "Oscar Westra van Holthe - Kind (Jira)" <ji...@apache.org> on 2022/11/03 08:35:00 UTC

[jira] [Updated] (AVRO-3660) SpecificRecord java data generator helper method - should I contribute?

     [ https://issues.apache.org/jira/browse/AVRO-3660?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Oscar Westra van Holthe - Kind updated AVRO-3660:
-------------------------------------------------
    Attachment: AVRO-3660_Alternative_implementation.patch

> SpecificRecord java data generator helper method - should I contribute?
> -----------------------------------------------------------------------
>
>                 Key: AVRO-3660
>                 URL: https://issues.apache.org/jira/browse/AVRO-3660
>             Project: Apache Avro
>          Issue Type: Improvement
>          Components: java
>    Affects Versions: 1.11.1
>            Reporter: Kristian Rickert
>            Priority: Trivial
>         Attachments: AVRO-3660_Alternative_implementation.patch
>
>
> I'm not sure if this is useful or if there's already something there for Avro - but I wrote a simple helper method for Java users that allows for RandomData to return a specific data type when given a class.  
> So when I'm writing tests for my schema data, I generate the SpecificRecord classes by doing this:
> Given: generated classes with avro in java.
> In this case, imagine there's a generated class called {{Article}}
> What this does:
> {code:java}
>  Article randomArticleData = specificAvroRecordGenerator(Article.class){code}
> I'm aware the RandomData class can create GenericData, but I've found this method to be very useful when writing code that goes to a queue to test and end-to-end transport without having to write too much code.
> However, i'm not sure if something is already in the repo that does this.
> So here's my implementation:
> {code:java}
> public static <T extends SpecificRecordBase> T specificAvroRecordGenerator(Class<T> avroClassType) {
>     try {
>         Field field = avroClassType.getDeclaredField("SCHEMA$");
>         return specificAvroRecordGenerator((Schema)field.get(null));
>     } catch (IllegalAccessException | NoSuchFieldException e) {
>         throw new RuntimeException(e);
>     }
> }
> @SuppressWarnings("unchecked")
> public static <T extends SpecificRecordBase> T specificAvroRecordGenerator(Schema schema) {
>         GenericRecord test =
>                 (GenericRecord)new RandomData(schema, 1)
>                         .iterator().next();
>         return (T) SpecificData.get().deepCopy(test.getSchema(), test);
> }{code}
> The good: it works
> The bad:  it uses reflection because the current RandomData class outputs generic data classes instead.
> I don't think that is necessarily bad.  But I think it's a really useful set of 2 methods.  I saw a couple people on stackoverflow inquire about it.
>  
> So my two questions: 
> 1) is there a simple method that already does this and I can't find it?
> 2) is there an easier way to do this?
> I'd be happy to contribute.  Let me know if I should



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