Deprecated process features

This section describes little-used features of the process support that have been superceded.

Sub processes

Each process can also be called as a script. In this case, it looks for the action in the config attribute for an initial action to run, rather than the request attribute. (It uses the presence of the data attribute to determine whether to look in the requests attribute or the config attribute.)

The sub process may change the data. The state and return values from the last script in the sub process will be the state and return value from the sub process.

A task script may invoke an action on its own process using the following:

application.put('config',{action:requiredAction});
application.call(application.get('process'));

Application attributes, such as data and request, will be available to the action.

The same convention can be used to invoke a process through application call() or execute(), for example the following code executes the process associated with a node and runs the display action.

application.put('config',{action:'display'});
application.execute(context);

Data persistence

Of itself, a process does not persist data, though the tasks are free to write data as required. However, standard tasks are available to assist with data persistence.

Save data

Save the data attribute, either to the context node or to a temporary node.

Load data

Load previously saved data into the "data" attribute.

Delete data node

Delete the data node identified by application attribute "dataNode".

The data persistence tasks are useful when the process supports user interaction. In outline, to interact with the user:

  • Use Save data to save the data.
  • Run a task that creates a response with content. The links or forms with which the user restarts the process should pass the reference of the data node in the request parameter "data".
  • When restarting the process, use Load data to reload the saved data.

Process instance

The Process Instance can be used to create instances of processes. The process is run when the instance is executed. They provide a Data member for the process to save data.

Other types can be created based on Process Instance.

Progress indicator

More complex processes may benefit from a progress indicator to entertain and inform the user while the process is in progress.

See the Progress Indicator Script for general introduction to the progress indicator. Task scripts are available to support the progress indicator process.

Start progress

Start or restart a progress indicator, and set a redirect to the progress indicator node.

Show progress

Write a message to the progress indicator.

End progress

End the progress indicator, optionally redirecting to a URL.

Progress error

End the progress indicator with an error read from the application error fields, optionally redirecting to a URL

Render progress

Standard script to render the progress indicator. This must be present in the process with an action name of "renderProgress".

Check for progress indicator

Test whether a progress indicator should be shown.

Execute in background

Re-execute the current context in the background. This is used to continue the process in the background after starting a progress indicator.

End progress with execute

End the progress indicator, redirecting to an execute of the current context.

Response handling

Task scripts can output a response to the user in the standard way, setting the title, head and content of the response.

However, it is sometimes useful to bulid a response in one script and then output it in another. For example, it can be useful to build a response in a background script, and then end a progress indicator with a redirect to an action that shows the response. You can achieve this by saving the response to the data area, and then rebuliding the response from the data area later in the process.

Two tasks scripts are available.

Copy response to data

Copy a response to the data attribute.

Copy data to response

Recreate a response that has previously been copied to the data area.

Copy data to response can also be used to output a response built up by previous scripts in the data.response object. This can be useful if a process uses multiple tasks to build a page to send to the user.

Authority

Of itself, a process does nothing about authority. All the tasks run under the authority of whichever user called the process.

For executed scripts, it can be useful to run the process under the node owner's authority. You can achieve this by calling the process as a script from a wrapper script, and preceding the call with application.runAsOwner().

In many cases, the process will want to know about the original caller, and may want to call services using the original caller's credentials. In this case, the wrapper script can use the Caller Credentials Script. This provides two methods:

  • store() – store the current user as a Script User object in the application attribute "user" and their credentials as a Service Credentials object in application attribute "credentials".
  • remove() – cancel the credentials and remove the "user" and "credentials" application attributes.

The wrapper script below will run the process bound to 'process' as the node owner, but with access to the caller in the "user" and "credentials" attributes.

application.include(application.getBinding('scriptCallerCredentials')); // bind to Caller Credentials Script
CallerCredentials.store();
application.runAsOwner();
application.call(application.getBinding('process'));
CallerCredentials.remove();

Caller Credentials Script also provides more granular methods for storing and removing just the user or just the credentials.

Looking up processes using dynamic bindings

In complex solutions, processes and status rules (see below) may be identified by dynamic bindings.

Derive Process And Status Rules is a specialised type for creating a derivation field that will look up a process and status rules using dynamic bindings, and write them to Process and Status rules (library.process.StatusRulesLink, not library.process.StatusRules) respectively, taking defaults specified on the derivation field. Add this to the types in a solution so that the instances of those types will have Process and Status rules populated.