You are viewing an old version of this page. View the current version.
Compare with Current
View Page History
« Previous
Version 10
Next »
What is it for?
- Joget Workflow provided Bean Shell implementation as several Plugin Types. Please refer to usages section.
- BeanShell is a small, embeddable Java source interpreter with object scripting language features written in Java.
- BeanShell dynamically executes standard Java syntax in runtime.
- By using BeanShell Plugin, you can type in valid Java codes in plugin configuration and the statements will be executed when the plugin is triggered.
- No compilation cycle is needed.
What is the code syntax?
Usages
Injected Variables:
element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
primaryKey - The primary key provided by the element to load data. (java.lang.String)
formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Outcome:
- An org.joget.apps.form.model.FormRowSet object which contains one org.joget.apps.form.model.FormRow object.
Samples:
Load user data using jdbc.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.commons.util.LogUtil;
public FormRowSet load(Element element, String username, FormData formData) {
FormRowSet rows = new FormRowSet();
if (username != null && !username.isEmpty()) {
Connection con = null;
try {
// retrieve connection from the default datasource
DataSource ds = (DataSource)AppUtil.getApplicationContext().getBean("setupDataSource");
con = ds.getConnection();
// execute SQL query
if(!con.isClosed()) {
PreparedStatement stmt = con.prepareStatement("SELECT username, firstName, lastName, email from dir_user where username=?");
stmt.setObject(1, username);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
FormRow row = new FormRow();
System.out.println(rs.getObject("username") );
row.setProperty("username", (rs.getObject("username") != null)?rs.getObject("username").toString():"");
row.setProperty("firstName", (rs.getObject("firstName") != null)?rs.getObject("firstName").toString():"");
row.setProperty("lastName", (rs.getObject("lastName") != null)?rs.getObject("lastName").toString():"");
row.setProperty("email", (rs.getObject("email") != null)?rs.getObject("email").toString():"");
rows.add(row);
break;
}
}
} catch(Exception e) {
LogUtil.error("Sample app - Form 1", e, "Error loading user data in load binder");
} finally {
//always close the connection after used
try {
if(con != null) {
con.close();
}
} catch(SQLException e) {/* ignored */}
}
}
return rows;
}
//call load method with injected variable
return load(element, primaryKey, formData);
Injected Variables:
- element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
- primaryKey - The primary key provided by the element to load data. (java.lang.String)
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Outcome:
- An org.joget.apps.form.model.FormRowSet object which contains one or more org.joget.apps.form.model.FormRow object. All FormRow objects are expected to have "value" and "label" property.
Samples:
Load time zone as the select box options.
import java.util.Map;
import org.joget.apps.app.service.AppUtil;
import org.joget.apps.form.model.Element;
import org.joget.apps.form.model.FormData;
import org.joget.apps.form.model.FormRow;
import org.joget.apps.form.model.FormRowSet;
import org.joget.apps.form.service.FormUtil;
import org.joget.commons.util.TimeZoneUtil;
public FormRowSet load(Element element, String username, FormData formData) {
FormRowSet rows = new FormRowSet();
//Get timezones using timezone util
for(Map.Entry entry : TimeZoneUtil.getList().entrySet()){
FormRow option = new FormRow();
option.setProperty(FormUtil.PROPERTY_VALUE, (String) entry.getKey());
option.setProperty(FormUtil.PROPERTY_LABEL, (String) entry.getValue());
rows.add(option);
}
return rows;
}
//call load method with injected variable
return load(element, primaryKey, formData);
Injected Variables:
- values - Dependency values of the controlling field. (java.lang.String[])
Expected Outcome:
- An org.joget.apps.form.model.FormRowSet object which contains one or more org.joget.apps.form.model.FormRow object. All FormRow objects are expected to have "value" and "label" property.
Samples:
Injected Variables:
- element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
- rows - Data to be store. Contains only one org.joget.apps.form.model.FormRow object. (org.joget.apps.form.model.FormRowSet)
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Outcome:
- Same org.joget.apps.form.model.FormRowSet object which stored.
Samples:
Injected Variables:
- element - Element that this validator is tie to. (org.joget.apps.form.model.Element)
- values - The submitted values of the element. (java.lang.String[])
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Outcome:
- A boolean value to indicate the validation pass or fail.
Samples:
Injected Variables:
- element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
- primaryKey - The primary key provided by the element to load data. (java.lang.String)
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Return Object:
- An org.joget.apps.form.model.FormRowSet object which contains one or more org.joget.apps.form.model.FormRow object.
Samples:
Injected Variables:
- element - Element that this binder is tie to. (org.joget.apps.form.model.Element)
- rows - Data to be store. Contains one or more org.joget.apps.form.model.FormRow object. (org.joget.apps.form.model.FormRowSet)
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Return Object:
- Same org.joget.apps.form.model.FormRowSet object which stored.
Samples:
Injected Variables:
- element - Element that this validator is tie to. (org.joget.apps.form.model.Element)
- rows - Submitted data. Contains one or more org.joget.apps.form.model.FormRow object. (org.joget.apps.form.model.FormRowSet)
- formData - The data holder of the whole form. (org.joget.apps.form.model.FormData)
Expected Return Object:
- A boolean value to indicate the validation pass or fail.
Samples:
Injected Variables:
- user - User object of current logged in user (org.joget.directory.model.User)
- requestParams - Request parameters map of current HTTP Request (java.util.Map)
Expected Return Object:
- A boolean value to indicate the user is authorized.
Samples:
Use as Form Post Submission Processing Tool
Injected Variables:
- workflowAssignment - The workflow activity assignment object of the saving form. Null when the form is not an assignment form. (org.joget.workflow.model.WorkflowAssignment)
- pluginManager - Plugin Manager service bean for convenient usage. (org.joget.plugin.base.PluginManager)
- appDef - App definition of the process. (org.joget.apps.app.model.AppDefinition)
- request - Http Request object of current Http Request. (javax.servlet.http.HttpServletRequest)
Expected Return Object:
Samples:
Use as Process Participant
Injected Variables:
- pluginManager - Plugin Manager service bean for convenient usage. (org.joget.plugin.base.PluginManager)
- workflowActivity - Workflow Activity that trying to retrieves assignee. (org.joget.workflow.model.WorkflowActivity)
Expected Return Object:
- A java.util.Collection of username in java.lang.String to be assign to the Workflow Activity.
Samples:
Injected Variables:
- workflowAssignment - The workflow tool activity assignment object. (org.joget.workflow.model.WorkflowAssignment)
- pluginManager - Plugin Manager service bean for convenient usage. (org.joget.plugin.base.PluginManager)
- appDef - App definition of the process. (org.joget.apps.app.model.AppDefinition)
- request - Http Request object of current HTTP Request. Not available if the tool is trigger by Deadline. (javax.servlet.http.HttpServletRequest)
Expected Return Object:
Samples:
Use as Userview Permission
Injected Variables:
- user - User object of current logged in user (org.joget.directory.model.User)
- requestParams - Request parameters map of current HTTP Request (java.util.Map)
Expected Return Object:
- A boolean value to indicate the user is authorized.
Samples:
Best Practices
1. Only import classes that are needed
Do not use wildcard in import statement. It giving a very bad performance in Bean Shell interpreter to search the whole package and loads it in memory.
Don't:
Do:
import java.util.Collection;
2. Do not need to mention the type of element of a collections
Bean Shell interpreter cannot recognise the element type syntax of collections class like Collection, Map, List, Set and etc.
Don't:
Map<String, String> map = new HashMap<String, String>();
Do:
3. Indents your script nicely and follows the Java Code Conventions
It will make yours and others life easier to maintain and review the script whenever necessary as Joget Workflow provided flexibility to adapt change quickly.
4. Write your script in functions
If your script is pretty long and some parts of the script are reusable, please make use of function to write your script. It provided better reading and performance.
It will helps you and others to understand what is the purpose for the script quickly.
6. Catch the exceptions and give a meaningful message in log.
If you are using a lot of Bean Shell Scripting in your app, a meaningful log message can help you to locate your issue quickly.
Don't
try {
//do something
} catch (Exception e) {
LogUtil.error("BeanShell", e, "Error executing script");
}
Do:
try {
//do something
} catch (Exception e) {
LogUtil.error("CRM app - Backend userview", e, "Error retrieving user department in Report category permission");
}
More samples