
* DOCS - Prepare 1.7 Release and 1.8 SNAPSHOT * DOCS - Prepare 1.7 Release and 1.8 SNAPSHOT
5.5 KiB
title | slug |
---|---|
Create the Java ClassConverter | /developers/contribute/developing-a-new-connector/create-java-class-converter |
Create the Java ClassConverter
If and only if you had to use the oneOf
property type on your connector's JSON Schema you also need to implement a Java ClassConverter to be able to instantiate the correct class from the configuration.
Without this, Java doesn't know the proper Class to instantiate and it wouldn't work as expected.
{% note %}
This is necessary even if you are indirectly using a oneOf
property by referencing another JSON Schema that uses it.
{% /note %}
Implementing your ClassConverter
In order to implement the ClassConverter
you need to create a new file within
openmetadata-service/src/main/java/org/openmetadata/service/secrets/converter
There you should create a new public class that extends ClassConverter
. The easiest way to achieve this is to use another ClassConverter
as a reference.
Example - MysqlConnectionClassConverter.java
Here we will see how to create a ClassConverter for the MysqlConnection, where we define the authType
using the oneOf
attribute.
{% note %}
The file will be shortened and parts of it will be replaced with ...
for readability.
{% /note %}
{% codePreview %}
{% codeInfoContainer %}
{% codeInfo srNumber=1 %}
Before anything else you need to remember to import the needed classes.
In this example we need to import the MysqlConnection
itself and both the IamAuthConfig
and basicAuth
. It is important to remember that this classes are generated from the JSON Schema and can be found within openmetadata-spec/target/classes/org/openmetadata/schema/services/connections
.
If you remember from Define the JSON Schema, the MysqlConnection uses oneOf
to define the authType
property:
...
"authType": {
"title": "Auth Configuration Type",
"description": "Choose Auth Config Type.",
"oneOf": [
{
"$ref": "./common/basicAuth.json"
},
{
"$ref": "./common/iamAuthConfig.json"
}
]
},
...
{% /codeInfo %}
{% codeInfo srNumber=2 %}
With the needed imports in place, now it is time to extend the ClassConverter
class to create the MysqlConnectionClassConverter
.
We are overriding the convert
method and going the following:
- Creating a
MysqlConnection
instance from the json object received - Getting the
AuthType
configuration and trying to use it to instantiate either abasicAuth
or aIamAuthConfig
. The first success will be returned. - We set the
AuthType
to be this newly instantaited class - We return the
MysqlConnection
instance.
{% /codeInfo %}
{% /codeInfoContainer %}
{% codeBlock fileName="DatabaseServiceUtils.ts" %}
...
package org.openmetadata.service.secrets.converter;
import java.util.List;
import org.openmetadata.schema.services.connections.database.MysqlConnection;
import org.openmetadata.schema.services.connections.database.common.IamAuthConfig;
import org.openmetadata.schema.services.connections.database.common.basicAuth;
import org.openmetadata.service.util.JsonUtils;
/** Converter class to get an `MysqlConnectionClassConverter` object. */
public class MysqlConnectionClassConverter extends ClassConverter {
private static final List<Class<?>> CONFIG_SOURCE_CLASSES =
List.of(basicAuth.class, IamAuthConfig.class);
public MysqlConnectionClassConverter() {
super(MysqlConnection.class);
}
@Override
public Object convert(Object object) {
MysqlConnection mysqlConnection = (MysqlConnection) JsonUtils.convertValue(object, this.clazz);
tryToConvert(mysqlConnection.getAuthType(), CONFIG_SOURCE_CLASSES)
.ifPresent(mysqlConnection::setAuthType);
return mysqlConnection;
}
}
{% /codeBlock %} {% /codePreview %}
Making your ClassConverter visible
Now that your ClassConverter is implemented you need to add it to the ClassconverterFactory.java
file, located in the same path.
Example - MysqlConnectionClassconverter
{% note %}
The file will be shortened and parts of it will be replaced with ...
for readability.
{% /note %}
{% codePreview %}
{% codeInfoContainer %}
{% codeInfo srNumber=3 %}
Before anything else you need to remember to import your ClassConverter
{% /codeInfo %}
{% codeInfo srNumber=4 %}
Now you just need to add a new Map.entry
to the converterMap
.
{% /codeInfo %}
{% /codeInfoContainer %}
{% codeBlock fileName="DatabaseServiceUtils.ts" %}
...
import org.openmetadata.schema.services.connections.database.MysqlConnection;
...
public final class ClassConverterFactory {
...
static {
converterMap =
Map.ofEntries(
...
Map.entry(MysqlConnection.class, new MysqlConnectionClassConverter()));
}
...
}
{% /codeBlock %} {% /codePreview %}
Next Step
Now that the code is ready, let's learn how to test it!
{%inlineCallout color="violet-70" bold="Test It" icon="MdArrowForward" href="/developers/contribute/developing-a-new-connector/test-it"%} Learn how to test your new connector! {%/inlineCallout%}