...
The valueFormatter can also be used outside the JSON-generation.
3.1 - Data model
3.1.1 - JSON File model
The following tables are presented in the data model diagram below:
- CDR_FILE_DEF (class CdrFileDef)
- CDR_RECORD_DEF (class CdrRecordDef)
- DOCUMENT_DEF(class DocumentDef)
- JSON_TAG_DEF (class JSONTagDef)
- VALUE_FORMATTER (class ValueFormatter)
All the above mentioned classes are persistent.
Drawio diagramName JSON File definition model.drawio revision 1
3.1.2 - File Processor Model
3.2 - JSONTagDef
A record in the JSON_TAG_DEF defines a single tag (key/value pair) of the resulting JSON file, and it has the following attributes:
3.
...
2.1 - Columns
TAG_NAME | Name of the tag. For example currency, amount, Name, Voucher, Id, brand etc | ||||||||||||||||||||||||||||||||||||||||||||||||
MAP_KEY | Key to retrieve the correct component from the map. Example: HEADER or FILEDEF or RECORD_DEF or tag name of the parent record from which a child tag value can be obtained. HEADER holds the file source record. FILEDEF holds the current instance of JSONDocumenrFiller. RECORD_DEF holds the CDR_RECORD_DEF (with CODE = DETAIL) instance set up for this JSON Document export | ||||||||||||||||||||||||||||||||||||||||||||||||
VALUE_TYPE | Can be FIELD (if the value to print is a field of the map object) or METHOD (if the content is retrieved calling a specific method in the map object obtained via the key set in MAP_KEY). | ||||||||||||||||||||||||||||||||||||||||||||||||
FIELD_NAME | If the value type is FIELD then this specify the field to print in the JSON tag content. | ||||||||||||||||||||||||||||||||||||||||||||||||
METHOD_NAME | if the value type is METHOD, then this specify the method to invoke on the map object to retrieve the data to fill the content for the current tag. | ||||||||||||||||||||||||||||||||||||||||||||||||
JSON_DATA_TYPE | The data type with which the JSON field value should be represented while writing value to file. Possible value are OBJECT, ARRAY, STRING, NUMBER andBOOLEAN.
Please see: Value Formatter and How to use VALUE_FORMATTER and JSON_DATA_TYPE for more details Note: JSON Key names will always be surrounded by double quotes. This JSON_DATA_TYPE configuration settings are applicable only for values, not the keys.
| ||||||||||||||||||||||||||||||||||||||||||||||||
PARENT_ID | Defines the ID of the parent tag and therefore it is used to define the structure of the JSON-file. The parent ID for the root tag will be null. | ||||||||||||||||||||||||||||||||||||||||||||||||
FLUSH_CONTENT | if ‘Y’ the content generated in the outputStream will be flushed in the JSON-file when the end tag of the current tag is printed. | ||||||||||||||||||||||||||||||||||||||||||||||||
FORMATTER_ID | ID of appropriate VALUE_FORMATTER table entry that is suitable to format this field value. The value formatter used to format the JSON field value, before applying the JSON_DATA_TYPE. So, first the Value formatter is applied to the field value, and then the JSON_DATA_TYPE setting is applied. Please see: Value Formatter and How to use VALUE_FORMATTER and JSON_DATA_TYPE for more details | ||||||||||||||||||||||||||||||||||||||||||||||||
METHOD_INPUT | In some cases when the METHOD_NAME is invoked we also need some extra information that must be passed in the method. For instance in the cdr generation if we have a list of invoice detail lines inside the record tag we need to retrieve only the invoice detail lines related to that billing record and this can be done by defining in this field the tag name related to the object to pass: in this case it will be “Record”. | ||||||||||||||||||||||||||||||||||||||||||||||||
METHOD_INPUT_CLASS_NAME | This is the class name of the method_input field (“com.CDRator.billing.rating.BillingRecords” in this for example). | ||||||||||||||||||||||||||||||||||||||||||||||||
SEQ_ORDER | If a tag has more than one child, here we can specify the preferred order to print them. | ||||||||||||||||||||||||||||||||||||||||||||||||
RELOAD_METHOD | If the tag to print is related to a list (i.e. a list of records) then it is possible to load them in multiple batches. In the JSON file generation when the content of the current batch has been printed then we try to retrieve further elements using the reload method if set. |
3.
...
3 - DocumentDef
An DocumentDef models the definition for a document type for example JSON. Here a filler class can be defined that will contain the logic to fill the map with the data, the methods to be called and also the reload method.
3.
...
3.1 - Columns
DESCRIPTION | Short description of the document definition |
KEY | Unique key to retrieve the document definition |
FILLER_CLASS | Class name used to generate the map for this specific type of document. This class will also be part of the map (with key "FILEDEF") if it is needed to call methods inside the filler to retrieve data. |
ROOT_TAG_ID | Reference of the Root tag of the document. |
SQL_LOAD_RECORDS | Contains the SQL-query to obtain the records that should be exported to the file. This SQL-query string can contain the label <BILLING_SOURCE_ID> which will be replaced with appropriate value at run-time. |
SQL_RELOAD_RECORDS | Contains the SQL-query to load the next batch of records with ID greater than the last loaded maximum ID, which are to be exported into the JSON-file. This is used only if the reload_method is setup on at least one of the JSON_TAG_DEF entries. This SQL-query can contain the tags <BILLING_SOURCE_ID> and <MAX_LOADED_ID> labels which will be replaced with appropriate values at run-time |
3.
...
4 - DocumentFiller
An abstract class DocumentFiller has been defined with an abstract method populate that will generate the dataBeans map according to a context map.
...
Following Concrete sub-classes of DocumentFiller can be found in the FileProcessor Integration project. See JSONDocumentFiller for more details
3.
...
4.1 - JSONDocumentFiller
The JSONDocumentFiller class contains the logic for generating the JSON-files from data obtained by joining some database tables by executing the SQL-script configured via the corresponding DOCUMENT_DEF record. If the desired JSON-file format cannot be achieved with JSONDocumentFiller sub class, A new subclass of DocumentFiller must be created as per the requirements.
...
- The query from SQL_LOAD_RECORDS column is used to load the first batch of records (10000).
- If there are more records to be added to the same JSON file and the reload_method on one of the JSON_TAG_DEF entries is set to 'reloadRecords', the SQL from SQL_RELOAD_RECORDS column is used to load the next batches, with 10000 max rows selected in each subsequent batch, until all pending records have been added to the file.
3.
...
5 - ValueFormatter
The value formatter is used in order to be able to configure the formatting of field values. Here a formatter class and a pattern can formatter_expression can be specified that will be used to generate a string.
...
Value Formatter implementation | Description | Example |
---|---|---|
com.CDRator.billing.utils.formatter.DateFormatter | Used to format a Date object to a String according the pattern formatter_expression set on this Value_Formatter entry. | Input value Type: Date Patternformatter_expression: dd.MM.yyyy Input value: 26-11-2015 10:00:00 Result: 26.11.2015 |
com.CDRator.billing.utils.formatter.NumberFormatter | Used to format a Number to a String according the pattern formatter_expression set on this Value_Formatter entry. | Input value Type: any number type Patternformatter_expression: #,##0.00 Input value: 200 Result: 200.00 |
com.CDRator.billing.utils.formatter.XmlStringFormatter | Used to escape a String to be compatible with XML format | Input value Type: String Input value: x>y Result: x>y |
com.CDRator.billing.utils.formatter.JsonStringFormatter | Used to escape a String to be compatible with JSON format | Input value Type: String Input value: 'test' Result: \'test\' |
3.
...
5.1 - Columns
NAME | A unique name to distinguish different Formatters |
CODE | Formatter code |
DESCRIPTION | Describes the purpose of the formatter |
VALUE_CLASS | Defines the input for the formatter (i.e. java.util.Date or java.lang.Number or java.lang.String) Important Note: The formatter should be chosen based on the actual value type. If the value type is not compatible with the java type defined in VALUE_FORMATTER.VALUE_CLASS, the formatting fails and hence file generation fails.
|
FORMATTER_CLASS | Class used to format ( For example: com.CDRator.billing.utils.formatter.DateFormatter) |
FORMATTER_METHOD | Method name from the class defined in FORMATTER_CLASS, that should be executed to format the input value. Usually it is 'format'. |
FORMATTER_EXPRESSION | Pattern used to convert the object to formatted string. This is optional for the formatters that do not require a pattern to be defined. Examples:
|
NULL_VALUE | Value returned if the input object is null. This is optional and defaults to null. |
3.
...
5.2 - How to use VALUE_FORMATTER and JSON_DATA_TYPE to get desired result
It is possible to represent the field values in a JSON Document in different ways. If the value should be represented as a string, it will be surrounded by double quotes. If it has to be written to the JSON file as a Number, no double quotes will be placed around the value. If the value should be represented as a boolean, the boolean equivalent of the actual field value (i.e. true/false) will be written to the JSON file. Consider the following scenarios:
...
Scenario | Configuration |
---|---|
The actual field value is a Number type, but would like to write it as a String in the JSON file. For example : Actual field value = 100, but we want the value written to the JSON file to be : "100" | Value Formatter: No formatter (or) Number formatter with pattern formatter_expression containing no decimals JSON_DATA_TYPE: STRING |
The actual field value is a Number with no decimals, but would like to write it as a float value in the JSON file. For example : Actual field value = 100, but we want the value written to the JSON file to be : 100.00 | Value Formatter: Number formatter with pattern formatter_expression to convert to decimal format JSON_DATA_TYPE: NUMBER |
The actual field value is a String, but would like to write it as a Boolean in the JSON file. For example : Actual field value = "1"/1, but we want the value written to the JSON file to be : true | Value Formatter: No formatter needed JSON_DATA_TYPE: BOOLEAN |
The actual field value is a String type and contains some characters that should be escaped to be JSON compatible. For example: Actual field value = "Value with "quotes"", but we want the value to be escaped properly before writing it to the JSON file. | Value Formatter: JsonStringFormatter JSON_DATA_TYPE: STRING Actual field value = "Value with "quotes"" Result: "Value with \"quotes\"" |
...