In SunbirdRC we can configure view templates (JSON transformers) which can be applied during runtime. It supports enabling/disabling properties in JSON responses. It also provides executing simple expressions and also supports creating custom provider functions.
Below is an example of a view template:
{
"id": "personDefaultView1",
"subject": "Person",
"fields": [
{
"name": "firstName",
"title": "NAME"
},
{
"name": "lastName",
"display": true
},
{
"name": "nationalIdentifier",
"title": "OS number",
"display": false,
"$comment": "This field is not displayable, but needed for internal referencing"
},
{
"title": "Name in passport",
"function": "#/functionDefinitions/concat($lastName, $firstName)",
"$comment": "This is a virtual field not defined in the schema"
},
{
"title": "Name as in DL",
"function": "#/functionDefinitions/userDefinedConcat($firstName, $lastName)",
"$comment": "This is a virtual field not defined in the schema"
}
],
"functionDefinitions": [
{
"name" : "concat",
"result": "arg1 + \", \" + arg2",
"$comment": "arg1 and arg2 will be populated with parameter values at runtime"
},
{
"name" : "userDefinedConcat",
"provider": "dev.sunbirdrc.provider.SampleViewFunctionProvider",
"$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. "
}
]
}
When the above template is applied for the below response payload:
{
"Person": {
"NAME": "Ram",
"lastName": "Moorthy",
"Name in passport": "Moorthy, Ram",
"Name as in DL": "Ram : Moorthy"
}
}
The view templates support configuring what fields should be displayed, changing the field names, and also performing functionalities on top of the fields.
In the above template, a field called firstName which is present in the entity is been renamed to NAME.
{
"name": "firstName",
"title": "NAME"
}
By default, all fields defined in the template are treated to be "display": true. If the fields are not supposed to be displayed then we can set "display": false
{
"name": "nationalIdentifier",
"title": "OS number",
"display": false,
"$comment": "This field is not displayable, but needed for internal referencing"
}
We can also define expressions or custom functions to perform complex/custom transformations.
{
"name" : "concat",
"result": "arg1 + \", \" + arg2",
"$comment": "arg1 and arg2 will be populated with parameter values at runtime"
},
In the above example, a custom JEXL expression to concatenate two fields is inline defined in the view template.
{
"title": "Name in passport",
"function": "#/functionDefinitions/concat($lastName, $firstName)",
"$comment": "This is a virtual field not defined in the schema"
},
The above code illustrates on how to call the inline-defined functions for a specific field.
We can also write Java code which can be used to perform custom/complex operations and also execute that in the view template.
{
"name" : "userDefinedConcat",
"provider": "dev.sunbirdrc.provider.SampleViewFunctionProvider",
"$comment" : "Complex operations that cannot be expressed easily in an in-line function definition can be implemented as a class. "
}
A custom provider function should implement IViewFunctionProvider
The view templates can be applied to both the GET APIs. We need to pass a viewTemplateId the header which contains the value of the view template file to be applied.
Similarly, SunbirdRC is shipped with another provider functions that can be used for transformation,
The above provider function will remove JSON paths from a nested object.
Example to demonstrate how to use the above function,