This section shows how to implement a basic transformation function for the EBX Data Exchange Add-on. This type of implementation requires the following:
A definition class to specify options for add-on transformation configuration requirements.
The class that contains the transformation logic. For example, how to convert data types or transform values.
The following code sample shows a definition class for an add-on transformation function:
public class NumToWeekdayTransformationDefinition implements TransformationDefinition
{
public String getCode()
{
return "numToweekday";
}
public UserMessage getLabel()
{
return UserMessage.createInfo("Num to Weekday transformation Function");
}
public UserMessage getDescription()
{
return UserMessage.createInfo(
"On import a number in the source is converted to its corresponding day of the week.");
}
public List<InputDefinition> getInputDefinitions()
{
List<InputDefinition> inputDefinitions = new ArrayList<InputDefinition>();
inputDefinitions.add(
new InputDefinition(
"String Input",
UserMessage.createInfo("Input is a String"),
SchemaTypeName.XS_STRING,
false));
return inputDefinitions;
}
public OutputDefinition getOutputDefinition()
{
return new OutputDefinition(
UserMessage.createInfo("A day of the week"),
SchemaTypeName.XS_STRING,
false);
}
public List<ParameterDefinition> getParameterDefinitions()
{
return new ArrayList<ParameterDefinition>();
}
//You can use this transformation definition to automatically detect the file type. Based on the type, it can return a different transformation.
public Transformation getTransformation(ServiceType serviceType)
{
switch (serviceType)
{
case SPREADSHEET_IMPORT:
return new ConvertNumToWeekday();
case CSV_IMPORT:
//Add your own transformation for CSV or other formats.
default:
return null;
}
}
public boolean isBidirectional()
{
return false;
}
public boolean isAggregation()
{
return false;
}
}
Note that as shown in the image, the methods shown above return values used by the add-on to define a transformation configuration.

The following code sample shows an implementation of a transformation that takes a numeric value in the source and outputs the value's corresponding day of the week in the target:
public class ConvertNumToWeekday implements Transformation<ImportTransformationExecutionContext>
{
private Locale locale;
public void setup(TransformationConfigurationContext configurationContext)
throws DataExchangeException
{
if (configurationContext == null)
{
throw new DataExchangeException(UserMessage.createError("Context is not initialized."));
}
this.locale = configurationContext.getSession().getLocale();
}
//This method gets the input data to transform and defines the transformation logic.
public Object execute(ImportTransformationExecutionContext executionContext)
throws DataExchangeException
{
if (executionContext == null)
{
throw new DataExchangeException(UserMessage.createError("Context is not initialized."));
}
//Obtain the value to import from the source application.
Object inputValue = executionContext.getInputValue();
if (inputValue == null)
{
return null;
}
//Performs a check on the target location.
SchemaNode schemaNode = null;
if (EBXField.class.isInstance(executionContext.getTargetField()))
{
EBXField ebxField = (EBXField) executionContext.getTargetField();
schemaNode = ebxField.getSchemaNode();
if (schemaNode.isComplex())
{
throw new DataExchangeException(
UserMessage.createError(
schemaNode.getLabel(this.locale)
+ " is a complex type node. The transformation function 'Convert an integer to a string and vice versa' only supports simple type node."));
}
}
//Sets how the data is transformed. In this case it is from one value to another. You could also specify that data types be transformed, values concatenated, etc.
try
{
switch (schemaNode.formatToXsString(inputValue))
{
case "1":
return "Monday";
case "2":
return "Tuesday";
case "3":
return "Wednesday";
case "4":
return "Thursday";
case "5":
return "Friday";
case "6":
return "Saturday";
case "7":
return "Sunday";
}
throw new DataExchangeException(UserMessage.createError("Invalid input data."));
}
catch (ClassCastException ex)
{
throw new DataExchangeException(ex);
}
catch (ConversionException ex)
{
throw new DataExchangeException(ex);
}
catch (Exception ex)
{
throw new DataExchangeException(ex);
}
}
}
See Deploying and Adding to the add-on's catalog for instructions on the next steps.