Tutorial Sample

<html>

<head>

<title>FME REST Demo - Run a workspace/item with web services</title>

</head>

<body>

<!-- This script will create a pop-up with the form for the data download request -->

<script type="text/javascript">

 

// pop-up window config

var width = 800;

var height = 600;

var token_ = "";

var outputWindow = null;

 

// request handler

var httpRequest;

if (window.XMLHttpRequest)

{

httpRequest = new XMLHttpRequest();

}

else

{

// for older versions of Internet Explorer

httpRequest = new ActiveXObject("MSXML2.XMLHTTP.3.0");

}

function getConnectionInfo()

{

var userid_ = window.prompt("UserId:");

if (userid_ != "")

{

var password_ = window.prompt("Password:");

// add code to get token

httpRequest.open("POST", "/fmetoken/service/generate", true);

httpRequest.setRequestHeader("Content-type","application/x-www-form-urlencoded");

var param = "user="+userid_+"&password="+password_+"&expiration=1&timeunit=hour";

httpRequest.setRequestHeader("Content-length", param.length);

httpRequest.setRequestHeader("Connection", "close");

httpRequest.onreadystatechange = function()

{

if (httpRequest.readyState == 4)

{

if (httpRequest.status == 200)

{

token_ = httpRequest.responseText;

 

outputWindow = window.open('about:blank','name','width=' + width + ',height=' + height);

// initialize the pop-up with a few empty elements

outputWindow.document.write("<html><body><form name='browseForm'></form><div id='parameters'></div></body></html>");

 

// start by showing the repositories

showRepositories();

}

else

{

window.alert("Error: Authentication failure.");

}

}

}

httpRequest.send(param);

}

}

 

/**

* Helper Method: Generate HTML code for a dropdown menu (<select> with <option>s)

* name (string) - identifies the dropdown

* onchange (string) - javascript to call once the dropdown has been changed

* uriNameValues (array) - contains the 'uri', used for the value, and the 'name' for display

*/

function dropdownHTML(name, onchange, uriNameValues)

{

var outputDoc = "<select name='" + name + "' onchange='" + onchange + "'>";

outputDoc += "<option value=''>-- Select One --</option>";

 

for (var i in uriNameValues)

{

outputDoc += "<option value='"

+ uriNameValues[i].uri + "'>"

+ uriNameValues[i].name + "</option>";

}

outputDoc += "</select>";

 

return outputDoc;

}

 

/**

* Shows a selection of repositories onto the form "browseForm"

* Also creates a div "workspaces" used to hold the workspaces, triggered by dropdown change event

*/

function showRepositories()

{

// url for repositories

httpRequest.open("GET", "/fmerest/repositories/.json?token=" + token_, true);

httpRequest.onreadystatechange = function()

{

if (httpRequest.readyState == 4 && httpRequest.status == 200)

{

// show each repository

var reply = eval("(" + httpRequest.responseText + ")");

var outputDoc = "Repository:";

// verify repositories exist

if (typeof(reply.serviceResponse.repositories) != 'undefined')

{

var repositories = reply.serviceResponse.repositories.repository;

outputDoc += dropdownHTML('repository', "window.opener.showWorkspaces()", repositories);

outputDoc += "<div id='workspaces'></div>";

}

else

{

outputDoc += "No Repositories";

}

// output into the window

outputWindow.document.browseForm.innerHTML = outputDoc;

outputWindow.focus();

}

}

// send a request so we get a reply

httpRequest.send(null);

}

/**

* Shows a selection of workspaces for the selected repository onto the form "browseForm"

* Also creates a div "services" used to hold the services, triggered by dropdown change event

*/

function showWorkspaces()

{

// get the repository URI from the drop down

var selectInput = outputWindow.document.browseForm.repository;

var repositoryURI = selectInput.options[selectInput.selectedIndex].value;

 

// make sure we have a uri

if (repositoryURI == "")

{

return false;

}

 

// url for specific repository

httpRequest.open("GET", repositoryURI + "/.json?token=" + token_, true);

httpRequest.onreadystatechange = function()

{

if (httpRequest.readyState == 4 && httpRequest.status == 200)

{

// generate an output message based on the response received

var reply = eval("(" + httpRequest.responseText + ")");

var outputDoc = "Workspaces:";

// check that workspaces exist

if (typeof(reply.serviceResponse.repository.workspaces) != 'undefined')

{

var workspaces = reply.serviceResponse.repository.workspaces.workspace;

outputDoc += dropdownHTML('workspace', "window.opener.showServices()", workspaces);

outputDoc += "<div id='services'></div>";

}

else

{

outputDoc += "No Workspaces Found<br/>";

}

 

outputWindow.document.getElementById('workspaces').innerHTML = outputDoc;

outputWindow.focus();

}

}

// send a request so we get a reply

httpRequest.send(null);

}

 

/**

* Shows a selection of services for the selected workspace onto the form "browseForm"

* Also creates a div "parameters" used to hold the published parameters, triggered by dropdown change event

*/

function showServices()

{

// get the workspace URI from the drop down

var selectInput = outputWindow.document.browseForm.workspace;

var workspaceURI = selectInput.options[selectInput.selectedIndex].value;

 

// make sure we have a uri

if (workspaceURI == "")

{

return;

}

 

// url for specific repository

httpRequest.open("GET", workspaceURI + "/.json?token=" + token_, true);

httpRequest.onreadystatechange = function()

{

if (httpRequest.readyState == 4 && httpRequest.status == 200)

{

// generate an output message based on the response received

var reply = eval("(" + httpRequest.responseText + ")");

var outputDoc = "Services:";

// check that there are services available for this workspace

if (typeof(reply.serviceResponse.workspace.services.service) != 'undefined')

{

var services = reply.serviceResponse.workspace.services.service;

outputDoc += dropdownHTML('service', "window.opener.createForm()", services);

}

else

{

outputDoc += "No Services Available<br/>";

}

outputWindow.document.getElementById('services').innerHTML = outputDoc;

outputWindow.focus();

}

}

// send a request so we get a reply

httpRequest.send(null);

}

 

/**

* Creates a form used to submit to perform the selected service, based on the value selected

* by the "service" field in the "browseForm"

*/

function createForm()

{

// get the workspace URI from the drop down

var selectInput = outputWindow.document.browseForm.service;

var serviceURI = selectInput.options[selectInput.selectedIndex].value;

 

// make sure we have a uri

if (serviceURI == "")

{

return;

}

 

// url for specific repository

httpRequest.open("GET", serviceURI + "/.json?token=" + token_, true);

httpRequest.onreadystatechange = function()

{

if (httpRequest.readyState == 4 && httpRequest.status == 200)

{

// generate an output message based on the response received

var reply = eval("(" + httpRequest.responseText + ")");

var itemService = reply.serviceResponse.itemService;

var serviceName = itemService.service.name;

 

var outputDoc = "<h4>" + serviceName + "</h4>";

 

// generate form, post to the url specified by the reponse

outputDoc += "<form name='serviceForm' method='post' action='"

+ itemService.service.urlPattern + "/"

+ itemService.repository.name + "/"

+ itemService.item.name

+ "?token=" + token_

+ "'>";

 

// add service-specific parameters

if (serviceName == "fmedatadownload" || serviceName == "fmejobsubmitter")

{

outputDoc += "<label>Mode: </label>";

outputDoc += "<select name='opt_servicemode'>";

outputDoc += "<option value='sync'>sync</option>";

outputDoc += "<option value='async'>async</option>";

outputDoc += "</select><br/>";

 

outputDoc += "<label>Email to: </label>";

outputDoc += "<input type='text' size='50' name='opt_requesteremail'/><br/>";

}

 

parameters = itemService.item.parameters.parameter;

// if parameters is not an array, it's a single parameter

if (parameters.length == null)

{

parameters = itemService.item.parameters;

}

 

// add each parameter as a field in the form

for (var i in parameters)

{

var parameter = parameters[i];

outputDoc += "<label>" + parameter.description + "</label>";

// use <select> for single and multi-choice options

if (parameter.optionsType == "MULTICHOICE_CONFIG"

|| parameter.optionsType == "SINGLECHOICE_CONFIG")

{

// name based on response

outputDoc += "<select name='" + parameter.name + "'";

// allow multiple for multi-choice

if (parameter.optionsType == "MULTICHOICE_CONFIG")

{

outputDoc += " multiple='true' ";

}

outputDoc += ">";

// add each option

var options = parameter.options.option;

for (var j in options)

{

var value = options[j].value;

// use a display alias if possible

var display = (typeof(options[j].displayAlias) == "undefined")

? options[j].value

: options[j].displayAlias;

outputDoc += "<option value='" + value + "'";

// select the default value

if (parameter.defaultValue == value)

{

outputDoc += " selected='selected' ";

}

outputDoc += ">" + display + "</option>";

}

outputDoc += "</select>";

 

}

else

{

// for everything else, default to a text field

outputDoc += "<input type='text' size='50' name='"

+ parameter.name + "' value='" + parameter.defaultValue + "'>"

}

outputDoc += "<br/>";

}

outputDoc += "<input type='submit' value='Run'/>";

outputDoc += "</form>";

 

outputWindow.document.getElementById('parameters').innerHTML = outputDoc;

outputWindow.focus();

}

}

// send a request so we get a reply

httpRequest.send(null);

}

try {

getConnectionInfo();

} catch (Error) {

println("Application aborted!");

}

</script>

</body>

</html>