Skip to main content

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 UPLOAD
var $repositoryName = "test";  // CHANGE FOR YOUR REPO NAME, THIS CONF MUST BE IN THE USER ACCOUNT USED TO LOGIN
var $username = "appvance";
var $password = "appvance";

login("http://my-aiq-controller.appvance.com:8080", $username, $password);   // CHANGE FOR YOUR AIQ SERVER DNS

var 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 UPLOAD
var 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: June 02, 2023

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