@Override
  public Iterable<RestEntry<JsonObject>> convertRecord(Void outputSchema, GenericRecord inputRecord, WorkUnitState workUnit)
      throws DataConversionException {

    Config srcConfig = ConfigFactory.parseString(inputRecord.toString(),
                                                 ConfigParseOptions.defaults().setSyntax(ConfigSyntax.JSON));

    String resourceKey = workUnit.getProp(CONVERTER_AVRO_REST_ENTRY_RESOURCE_KEY, "");
    if(!StringUtils.isEmpty(resourceKey)) {
      final String dummyKey = "DUMMY";
      Config tmpConfig = ConfigFactory.parseString(dummyKey + "=" + resourceKey).resolveWith(srcConfig);
      resourceKey = tmpConfig.getString(dummyKey);
    }

    String hoconInput = workUnit.getProp(CONVERTER_AVRO_REST_JSON_ENTRY_TEMPLATE);
    if(StringUtils.isEmpty(hoconInput)) {
      return new SingleRecordIterable<>(new RestEntry<>(resourceKey, parser.parse(inputRecord.toString()).getAsJsonObject()));
    }

    Config destConfig = ConfigFactory.parseString(hoconInput).resolveWith(srcConfig);
    JsonObject json = parser.parse(destConfig.root().render(ConfigRenderOptions.concise())).getAsJsonObject();
    return new SingleRecordIterable<>(new RestEntry<>(resourceKey, json));
  }
@ Override public Iterable < RestEntry < JsonObject > > convertRecord ( Void outputSchema , GenericRecord inputRecord , WorkUnitState workUnit ) throws DataConversionException { Config srcConfig = ConfigFactory . parseString ( inputRecord . toString ( ) , ConfigParseOptions . defaults ( ) . setSyntax ( ConfigSyntax . JSON ) ) ; String resourceKey = workUnit . getProp ( CONVERTER_AVRO_REST_ENTRY_RESOURCE_KEY , "" ) ; if ( ! StringUtils . isEmpty ( resourceKey ) ) { final String dummyKey = "DUMMY" ; Config tmpConfig = ConfigFactory . parseString ( dummyKey + "=" + resourceKey ) . resolveWith ( srcConfig ) ; resourceKey = tmpConfig . getString ( dummyKey ) ; } String hoconInput = workUnit . getProp ( CONVERTER_AVRO_REST_JSON_ENTRY_TEMPLATE ) ; if ( StringUtils . isEmpty ( hoconInput ) ) { return new SingleRecordIterable < > ( new RestEntry < > ( resourceKey , parser . parse ( inputRecord . toString ( ) ) . getAsJsonObject ( ) ) ) ; } Config destConfig = ConfigFactory . parseString ( hoconInput ) . resolveWith ( srcConfig ) ; JsonObject json = parser . parse ( destConfig . root ( ) . render ( ConfigRenderOptions . concise ( ) ) ) . getAsJsonObject ( ) ; return new SingleRecordIterable < > ( new RestEntry < > ( resourceKey , json ) ) ; }
Use resource key(Optional) and rest json entry as a template and fill in template using Avro as a reference.
e.g:
Rest JSON entry HOCON template:
AccountId=${sf_account_id},Member_Id__c=${member_id}
Avro:
{"sf_account_id":{"string":"0016000000UiCYHAA3"},"member_id":{"long":296458833}}

Converted Json:
{"AccountId":"0016000000UiCYHAA3","Member_Id__c":296458833}

As it's template based approach, it can produce nested JSON structure even Avro is flat (or vice versa).

e.g:
Rest resource template:
/sobject/account/memberId/${member_id}
Avro:
{"sf_account_id":{"string":"0016000000UiCYHAA3"},"member_id":{"long":296458833}}
Converted resource:
/sobject/account/memberId/296458833

Converted resource will be used to form end point.
http://www.server.com:9090/sobject/account/memberId/296458833

{@inheritDoc}
@see org.apache.gobblin.converter.Converter#convertRecord(java.lang.Object, java.lang.Object, org.apache.gobblin.configuration.WorkUnitState)