Sample Apex Code for Custom Functions

Develop Apex classes to implement custom functions for use with Omnistudio Data Mappers and Integration Procedures. A sample Apex class implements three methods that can be called as custom functions in Omnistudio formulas. The class includes code that passes a list to a custom function.

Data Mappers and Integration Procedures can invoke these functions to convert a list to an array, replace one character with another, or reformat phone numbers. The class and invokeMethod of custom functions must be global.

The convert function

The first custom function, convert, converts a list of values without keys to an array of values with keys. The function signature is:

FUNCTION('MyCustomFunctions', 'convert', LIST(%Inputlist%), %ListKey%)

If the list key is "Item" and the input list is:

{
  "InputList": [ "abc", "def", "ghi" ]
}

The result is:

{
  [
    {
      "Item": "abc"
    },
    {
      "Item": "def"
    },
    {
      "Item": "ghi"
    }
  ]
}

The replace function

The second function, replace, replaces a character in a string with another character. The function signature is:

FUNCTION('MyCustomFunctions', 'replace', %InputString%, %ToReplace%, %ReplaceWith%)

If the input string is my-input-string, the character to replace is -, and the character to replace it with is _, the result is my_input_string.

The formatPhoneNumber function

The third function, formatPhoneNumber, converts a phone number to the format (nnn) nnn-nnnn. The number must have no country code, a 3-digit area code, a three-digit exchange, and an overall length of at least nine digits. The function signature is:

FUNCTION('MyCustomFunctions', 'formatPhoneNumber', %Phone%)

If the input is 123.456.7890, 123-456-7890, or 1234567890, the result is (123) 456-7890.

Passing a list to a custom function

If input to your custom function is of the type List<Object>, Apex saves the input to a VLOCITY-FORMULA-LIST key. To retrieve the input, use code that retrieves this key.

static List<Map<String, Object>> FUNCTION(List<Object> inputs)
{
  List<Object> listInput = ((Map<String, Object>)inputs[0]).get('VLOCITY-FORMULA-LIST');
  Object variableInput = inputs[1];
              
  // Rest of function
}

For a working example that passes a list to a custom function, see the implementation of the convert function in the example code.

The Apex class

The custom functions just described are defined as methods of the class MyCustomFunctions. For more information about calling custom functions and examples of the three custom functions defined in the class, see Omnistudio Invocation Functions.

global class MyCustomFunctions implements Callable
{
        
    /*
     * input  - arguments - List<Object> of arguments passed to the function
     * output - result    - The function supports single Object values, List<Object>,
     *                      or Map<String, Object>
     */
        
    public Object call(String action, Map<String, Object> args)
    {
        Map<String, Object> input = (Map<String, Object>) args.get('input');
        Map<String, Object> output = (Map<String, Object>) args.get('output');
        Map<String, Object> options = (Map<String, Object>) args.get('options');
        return invokeMethod(action, input, output, options);
    }
        
    global Boolean invokeMethod(String methodName, Map<String, Object> inputs,
        Map<String, Object> output, Map<String, Object> options)
    {
        if (methodName == 'convert') {
            List<Object> arguments = (List<Object>) inputs.get('arguments');
            output.put('result', convert(arguments));
        } else if (methodName == 'replace') {
            List<Object> arguments = (List<Object>) inputs.get('arguments');
            output.put('result', replace(arguments));
        } else if (methodName == 'formatPhoneNumber') {
            List<Object> arguments = (List<Object>) inputs.get('arguments');
            output.put('result', formatPhoneNumber(arguments));
        }
        return true;
    }
        
    private LIST<Map<String, Object>> convert(List<Object> arguments)
    {
        try {
            LIST<Map<String, Object>> result = new LIST<Map<String, Object>>();
            Map<String, Object> inputlist = (Map<String, Object>) arguments[0];
            String key = (String) arguments[1];
            List<Object> listofElements = (List<Object>) inputlist.get('VLOCITY-FORMULA-LIST');
            for (Object str : listofElements) {
                result.add(new Map<String, Object>{key => str});
            }
            return result;
        } catch(Exception e) {
            return new LIST<Map<String, Object>>(); 
        }
    }
        
    private String replace(List<Object> arguments)
    {
        String result = '';
        String inputlist = (String) arguments[0];
        String toreplace = (String) arguments[1];
        String replaceby = (String) arguments[2];
        result = inputlist.replaceAll(toreplace, replaceby);
        return result;
    }
        
    public string formatPhoneNumber(List<Object> arguments)
    {
        String Phoneno = arguments[0] + '';
        String formattedPhone = Phoneno.replaceAll('[^0-9+]', '');
        String NewFormat;
        if (String.isNotBlank(formattedPhone) && formattedPhone.length() >= 9) {
            String first = formattedPhone.subString(0, 3);
            String second = formattedPhone.subString(3, 6);
            String third = formattedPhone.subString(6);
            NewFormat = '(' + first + ')' + ' ' + second + '-' + third;
        }
        return NewFormat;
    }
        
}