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