<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>