# Sample Service Suite Scripts

Here are some Service Suite samples scripts that can be used as a reference.

### Basic Authentication

```

```

```
/** * btoa * @param st  * @returns base64 encoded string */ function btoa(st) {    return Java.type("java.util.Base64").getEncoder().encode(st);}var $username = "admin";var $password = "Password@1";var $TOKEN = "Basic "+btoa($username+":"+$password);addGlobalHeader("authorization", $TOKEN);var url = "https://someServer.com/api/somecall";var data = {"short_description":"some data",    "description":"some description"};var call = createPost(url, data);call.addHeader("Content-Type", "application/json");var resp = process(call);
```

```

```

### Demosite

```
var formPage = get("https://demosite.appvance.com/products/ruby-on-rails-tote");log(getCookies("https://demosite.appvance.com/"));var token = extract("html",formPage,'//form[@action="/orders/populate"]/input[@name="authenticity_token"]/@value');log("Extracted token: "+token); var form = formData();form.put("authenticity_token",token);form.put("utf-8",decodeURIComponent("%E2%9C%93"));form.put("variant_id","1");form.put("quantity","1");form.put("button",""); var postData = createPost("https://demosite.appvance.com/orders/populate",form);var purchaseResults = process(postData); log("response:\n"+purchaseResults.getDataString()); assertContains(get("https://demosite.appvance.com/cart?variant_id=1").getDataString(),"Ruby on Rails Tote");assertContains(get("https://demosite.appvance.com/cart_link").getDataString(),"$15.99");
```

### Login to AIQ

```
$baseURL = "http://localhost:8080";var $loginForm = formData();$loginForm.put("username","appvance");$loginForm.put("password","appvance");var $call = createPost($baseURL+"/AppvanceServer/rest/admin/loggin", $loginForm);var $resp = process($call);var $json = JSON.parse($resp.getDataString());if ($json.logged) {  var $jsession = getCookieValue($baseURL,"JSESSIONID");  addGlobalHeader("cookie","JSESSIONID="+$jsession);  // adding global cookie for JSESSIONID  log("Logged In, JSESSIONID: "+$jsesssion);} else {  log("Unsuccessful login");}
```

### ServiceSuite and XML

```
var payload = "<xml><username>John</username><id>123-1341-123</id></xml>";var call = createPost("https://example.com/getAddress", payload, "text/xml");var result = process(call);var address1 = extract("XML", result, "//Address1");var city = extract("XML", result, "//City");var state = extract("XML", result, "//ST");
```

### Upload a file to AIQ repository

```
const $boundary = "AIQ-DS-BOUNDARY";function login($baseURL, $username, $password) {    var $loginForm = formData();    $loginForm.put("username",$username);    $loginForm.put("password",$password);    var $call = createPost($baseURL + "/AppvanceServer/rest/admin/logginForServices", $loginForm);    var $resp = process($call).getDataString();    if ($resp.indexOf("true") != -1) {         var $jsession = getCookieValue($baseURL,"JSESSIONID");        addGlobalHeader("cookie","JSESSION=" + $jsession);        log("Login successful")        return true;    } else {        log("Login was NOT successful")        return false;    }}function createMultipartPayload($filename) {    var header = '--' + $boundary + '\n' +        'Content-Disposition: form-data; name="file"; filename="' + $filename + '"\r\n' +        'Content-Type: application/octet-stream\r\n\r\n';    var headerBytes = new Array(header.length);    for (var i = 0; i < header.length; ++i) {        headerBytes[i] = header.charCodeAt(i);    }    var docBytes = readBytes($filename);    var footer = '\r\n--' + $boundary + "--\r\n";    var footerBytes = new Array(footer.length);    for (var i = 0; i < footer.length; ++i) {        footerBytes[i] = footer.charCodeAt(i);    }    return headerBytes.concat(docBytes).concat(footerBytes);}var $filename = "test2.js";    // CHANGE FOR YOUR FILE TO UPLOADvar $repositoryName = "test";  // CHANGE FOR YOUR REPO NAME, THIS CONF MUST BE IN THE USER ACCOUNT USED TO LOGINvar $username = "appvance";var $password = "appvance";login("http://my-aiq-controller.appvance.com:8080", $username, $password);   // CHANGE FOR YOUR AIQ SERVER DNSvar data = createMultipartPayload($filename);log(data.length, $username, $password);var call= createPost("http://localhost:8080/AppvanceServer/rest/file/uploadFile?&commitMessage=Appvance+skip+commit&path=REPOSITORY/"+$repositoryName+"/"+$filename, data, "multipart/form-data", " boundary=" + $boundary);var resp = process(call);log(resp.getDataString())
```

### Upload the File to an application

```
/** * Creates a multipart payload from file contentes **/function createMultipartPayload($filename) {    var header = '--' + $boundary + '\n' +        'Content-Disposition: form-data; name="file"; filename="' + $filename + '"\r\n' +        'Content-Type: application/octet-stream\r\n\r\n';    var headerBytes = new Array(header.length);    for (var i = 0; i < header.length; ++i) {        headerBytes[i] = header.charCodeAt(i);    }    var docBytes = readBytes($filename);    var footer = '\r\n--' + $boundary + "--\r\n";    var footerBytes = new Array(footer.length);    for (var i = 0; i < footer.length; ++i) {        footerBytes[i] = footer.charCodeAt(i);    }    return headerBytes.concat(docBytes).concat(footerBytes);}/* * Uploads a file to $SERVER */function uploadFile($filename) {   var data = createMultipartPayload($filename);   var url = $SERVER+ "/upload/"+$filename+"?filename="+$filename;   log("url: "+url);   var call= createPut(url, data, "multipart/form-data", " boundary=" + $boundary);   return process(call).getDataString();}const $boundary = "AIQ-DS-BOUNDARY";const $SERVER = "http://xxxx.eu-west-2.elb.amazonaws.com";var $filename = "test2.js";    // CHANGE FOR YOUR FILE TO UPLOADvar result = uploadFile($filename);log(result);
```

### Send an email with a custom timestamp in the Subject

```
var date = new Date();var formatDate = date.getDate() + "-" + date.getMonth() + "-" + date.getYear() + " " + date.toLocaleTimeString();var graphService = createOAuthMailClient("email", "clientID", "secretKey", "tenantID");var msg = graphService.createMailMessage("Message generated " + formatDate, "Test body email.");msg.addTo(["to@test.com"]);var sent = graphService.sendMessage(msg);if (!sent) {    throw new Error('An error occurred while sending the email.');} else {    log("Email sent.");}
```

### Extract value from receive email’s subject

```
var graphService = createOAuthMailClient("email", "clientID", "secretKey", "tenantID");var unreadList = graphService.getUnreadMessages();var unreadCount = unreadList.size();if (unreadCount > 0) {  var i = 0; //first unread email  log("Id: " + unreadList.get(i).id);  log("From: " + unreadList.get(i).from.emailAddress.address);  log("Subject: " + unreadList.get(i).subject);      var subject = unreadList.get(i).subject;  var startIndex = subject.lastIndexOf("Ref. ") + 5;  var refCode = subject.substr(startIndex, 8);  log("Ref code: " + refCode);
```

### Compare email’s body

```
var expectedBody = "This is an automated acknowledgement to let you know that your correspondence to the Appvance Information Rights Team has been received.Any request for personal data will be handled as a data subject access request.";  var body = unreadList.get(i).body.content.replace(/(\r\n|\n|\r)/gm,""); //remove line break and spaces.  body = body.substr(0,body.indexOf("uk")+2); //trim to remove links at the end  log("Email have the expected content: " + (body === expectedBody));} else {    log("There's no unread messages.");}
```

###   
Utility Functions

```
/** * btoa * @param st  * @returns base64 encoded string */ function btoa(st) {    return Java.type(java.util.Base64).getEncoder().encode(st);}/** * atob * @param st  * @returns decoded base64 string */function atob(st) {    return Java.type(java.util.Base64).getDecoder().decode(st);}/** *  * @param length number * @returns random number of length number of digits */function randomNumber(length) {    var result = '';    for (var i = 0; i < length; i++) {        result += Math.floor(Math.random() * 10);    }    return result;}/** * Extracts catching an exception and returning NOT_FOUND string if target is not found. * @param {string} format ("HTML","HTTP","PDF","CSV","Excel","TEXT","STRING") * @param {HttpResponse} response  * @param {string} target  * @returns  */function extractOrNotFound(format, response, target) {    const NOT_FOUND = "Not found.";    var value;    try {        value = extract(format, response, target);        if (typeof value == "undefined") {            return NOT_FOUND;        }        return value;    } catch (e) {        return NOT_FOUND;    }}/** * SSN * @returns random string matching social security number format */function SSN() {    var result = '';    result = randomNumber(3) + "-" + randomNumber(2) + "-" + randomNumber(4);    return result;}// *************************************************************************// parseCurrencyStringToNumber//// Parse a currency string to a number, $1,245.50 -> 1245.5// ************************************************************************function parseCurrencyStringToNumber(currency) {    if (typeof currency == "undefined" || currency == "") {        log("Warning in parseCurrencyStringToNumber, expecting a number but got undefined or empty.");        return -1;    }    if (currency == "0") {        return 0;    }    if (currency.indexOf("(") !== -1) {        currency = "-" + currency.replace(/[(|)]+/g, "")    }    return Number(String(currency).replace(/[^0-9.-]+/g, ""));}// *************************************************************************// parseNumberToCurrency//// Parse a number to a string currency with commas, 1245.5  -> $1,245.50 // ************************************************************************function parseNumberToCurrency(aNumber) {    if (aNumber == 0) {        return ("$0.00");    };    var tempST = String(aNumber).replace(/[^0-9.-]+/g, "");    try {        var tempNumber = Number(parseFloat(tempST).toFixed(2));        var tempLocale = tempNumber.toLocaleString(undefined, { minimumFractionDigits: 2 });        return "$" + tempLocale;    } catch (e) {        log("Error converting to currency [" + aNumber + "], isNAN: " + isNaN(aNumber) + " - " + e.message);        return "NA";    }}/** * dateToString * @param day  * @returns  */function dateToString(day) {    var dd = String(day.getDate()).padStart(2, '0');    var mm = String(day.getMonth() + 1).padStart(2, '0'); //January is 0!    var yyyy = day.getFullYear();    return mm + '/' + dd + '/' + yyyy;;}function getTodayDate() {    var now = java.time.LocalDateTime.now();    var formatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy");    return now.withHour(0).withMinute(0).withSecond(0).format(formatter);}function getYesterdayDate() {   var now = java.time.LocalDateTime.now();   var formatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy");   return now.minus(1, java.time.temporal.ChronoUnit.DAYS).withHour(0).withMinute(0)                .withSecond(0).format(formatter);}function getTomorrowDate() {   var now = java.time.LocalDateTime.now();   var formatter = java.time.format.DateTimeFormatter.ofPattern("MM/dd/yyyy");   return now.plus(1, java.time.temporal.ChronoUnit.DAYS).withHour(0).withMinute(0)                .withSecond(0).format(formatter);}/** * getDateISOString * @returns  */function getDateISOString() {    var st = new Date().toISOString();    return st.replace(/\-/g, "_").replace(/\:/g, "_").replace(/\./g, "_");}/** * dateOneMonthAfter * @param $date  * @returns  */function dateOneMonthAfter($date) {    var day = new Date(Date.parse($date));    day.setMonth(day.getMonth() + 1);    day.setTime(day.getTime() + TIME_OFFSET);    return dateToString(day);}/** * dateOneYearAfter * @param $date  * @returns  */function dateOneYearAfter($date) {    var day = new Date(Date.parse($date));    day.setFullYear(day.getFullYear() + 1);    day.setTime(day.getTime() + TIME_OFFSET);    return dateToString(day);}/** * randomLastName * @returns  */ function randomLastName() {    var sylabs = 2 + Math.floor(Math.random() * 2)    var result = '';    var characters = 'bccdfghjkllmnnprrssttvwyz';    var vocals = 'aeioeua';    var charactersLength = characters.length;    result += "SBCLKJMCH".charAt(Math.floor(Math.random() * 9));    result += vocals.charAt(Math.floor(Math.random() * 7));    sylabs--;    for (var i = 0; i < sylabs; i++) {        result += characters.charAt(Math.floor(Math.random() * charactersLength));        result += vocals.charAt(Math.floor(Math.random() * 7));    }    result += characters.charAt(Math.floor(Math.random() * charactersLength));    return result;}
```

```

```

---

Last updated: October 15, 2026

If you have any feedback on this topic, please contact us at <documentation@appvance.ai>