...
- Java syntax supported by the version of JDK used
- Usage of all libraries that Joget used. For details please refer to NOTICE.txt in the release installer/bundle.
- Usage of all Joget Workflow Utility and Service Methods.
- Usage of Hash Variable.
Usages
Use as Form Load Binder
Anchor | ||||
---|---|---|---|---|
|
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 org.joget.apps.form.model.FormRow object.
...
Code Block | ||
---|---|---|
| ||
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); |
...
- 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. All FormRow objects are expected to have "value" and "label" property.
...
- values - Dependency values of the controlling field. (java.lang.String[])
Expected
...
Return Object:
- 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.
...
- 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
...
Return Object:
- Same org.joget.apps.form.model.FormRowSet object which stored.
...
- 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
...
Return Object:
- A boolean value to indicate the validation pass or fail.
...
- 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.
...
Code Block |
---|
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.plugin.base.PluginManager; import org.joget.apps.form.model.FormLoadBinder; public FormRowSet load(Element element, String primaryKey, FormData formData) { String defaultFormDefId = "default_grid_entry"; //change this to the form id used to store default grid data String formDefId = "grid_entry"; //change this to the form id used to store grid data String foreignKey = "fk"; //change this to the foreign key FormRowSet f = new FormRowSet(); f.setMultiRow(true); // Reuse Multi Row Binder to load data PluginManager pluginManager = (PluginManager) FormUtil.getApplicationContext().getBean("pluginManager"); FormLoadBinder binder = (FormLoadBinder) pluginManager.getPlugin("org.joget.plugin.enterprise.MultirowFormBinder"); //Load from the grid table binder.setProperty("formDefId", formDefId); binder.setProperty("foreignKey", foreignKey); f = binder.load(element, primaryKey, formData); //if no grid data is retrieved, get from default table if (f == null || f.isEmpty()) { binder.setProperty("formDefId", defaultFormDefId); //set the foreign key value to empty f = binder.load(element, "", formData); } return f; } //call load method with injected variable return load(element, primaryKey, formData); |
...
- 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.
...
Code Block |
---|
import java.util.HashSet;
import java.util.Set;
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;
import org.joget.commons.util.StringUtil;
import org.joget.directory.model.Role;
import org.joget.directory.model.User;
import org.joget.directory.dao.RoleDao;
import org.joget.directory.dao.UserDao;
import org.joget.directory.model.service.DirectoryUtil;
import org.joget.directory.model.service.UserSecurity;
public FormRowSet store(Element element, FormRowSet rows, FormData formData) {
try {
UserSecurity us = DirectoryUtil.getUserSecurity();
RoleDao roleDao = (RoleDao) AppUtil.getApplicationContext().getBean("roleDao");
UserDao userDao = (UserDao) AppUtil.getApplicationContext().getBean("userDao");
for (FormRow row : rows) {
//Get the submitted data for each grid row
String username = row.getProperty("username");
String firstName = row.getProperty("firstName");
String lastName = row.getProperty("lastName");
String email = row.getProperty("email");
String password = row.getProperty("password");
User user = new User();
user.setId(username);
user.setUsername(username);
user.setTimeZone("0");
user.setActive(1);
user.setFirstName(firstName);
user.setLastName(lastName);
user.setEmail(email);
//Check if there is user security implementation, using it to encrypt password
if (us != null) {
user.setPassword(us.encryptPassword(username, password));
} else {
user.setPassword(StringUtil.md5Base16(password));
}
user.setConfirmPassword(password);
//set user role
Set roleSet = new HashSet();
roleSet.add(roleDao.getRole("ROLE_USER"));
user.setRoles(roleSet);
userDao.addUser(user);
if (us != null) {
us.insertUserPostProcessing(user);
}
}
} catch (Exception e) {
LogUtil.error("Sample app - Bulk Create Users form", e, "Store user error!!");
}
return rows;
}
//call store method with injected variable
return store(element, rows, formData); |
...
- 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.
...
Validate the sum of a column values are less than 1000.
Code Block |
---|
importimport java.util.Arrays; import org.joget.apps.app.service.AppUtil; import org.joget.apps.form.model.Element; import org.joget.apps.form.model.Form; 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; public boolean validate(Element element, FormRowSet rows, FormData formData) { boolean result = true; if (rows != null && !rows.isEmpty()) { int total = 0; //Sum the values from column "amount" for (FormRow row : rows) { try { int amount = Integer.parseInt(row.getProperty("amount")); total += amount; } catch (Exception e) {} } //if amount larger than 1000 if (total > 1000) { String id = FormUtil.getElementParameterName(element); formData.addFormError(id, "Total amount should not larger than 1000!!!!"); result = false; } } return result; } //call validate method with injected variable return validate(element, rows, formData); |
...
- 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.
...
- 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:
- None
Samples:
Reuse Email tool to send separate email to each users.
Code Block |
---|
|
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:
Randomly assign an user in a department to a workflow activity.
The following script is for a form not mapped to workflow assignment, therefore workflowAssignment is not available.
Code Block | ||
---|---|---|
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.service.AppPluginUtil;
import org.joget.apps.app.service.AppUtil | ||
Code Block | ||
| ||
import java.util.ArrayList; import java.util.Collection; import org.joget.appsplugin.appbase.service.AppUtilApplicationPlugin; import org.joget.directoryplugin.modelbase.UserPlugin; import org.joget.directoryplugin.modelbase.service.ExtDirectoryManagerPluginManager; import org.joget.plugin.workflowproperty.model.WorkflowActivityPropertyEditable; public CollectionObject getAssignees(WorkflowActivity activityexecute(AppDefinition appDef, HttpServletRequest request) { CollectionString[] assigneesemails = new ArrayList() String[]{"test1@joget.org", "test2@joget.org"}; ExtDirectoryManager//Reuse directoryManagerEmail =Tool (ExtDirectoryManager) pluginManager.getBean("directoryManager"); to send separated email to a list of users; StringPlugin deptIdplugin = "D-005"pluginManager.getPlugin("org.joget.apps.app.lib.EmailTool"); //Get total user in department default properties (SMTP setting) for email tool LongMap totalpropertiesMap = directoryManagerAppPluginUtil.getTotalUsersgetDefaultProperties(nullplugin, null, deptId, null, null, nullappDef, null); propertiesMap.put("pluginManager", pluginManager); //Get random number from 0 to the total number of users in departmentpropertiesMap.put("appDef", appDef); propertiesMap.put("request", request); intApplicationPlugin randomemailTool = (intApplicationPlugin) (Math.random() * total)plugin; //Getsend usersemail using directory manager for (String email Collection: userListemails) = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1{ propertiesMap.put("toSpecific", email); for(Object u : userList){ User user = (User) u propertiesMap.put("subject", "This is a test email for " + email); assigneespropertiesMap.add(user.getUsername()put("message", "Email content for " + email); } return assignees; } //callset getAssigneesproperties methodand withexecute injected the tool ((PropertyEditable) emailTool).setProperties(propertiesMap); emailTool.execute(propertiesMap); } return null; } //call execute method with injected variable return getAssignees(workflowActivityexecute(appDef, request); |
Use as Process
...
Participant
Injected Variables:
- workflowAssignment - The workflow tool activity assignment object. (org.joget.workflow.model.WorkflowAssignment)
- pluginManager - Plugin Manager service bean for convenient pluginManager - Plugin Manager service bean for convenient usage. (org.joget.plugin.base.PluginManager)
- appDef - App definition of the processworkflowActivity - Workflow Activity that trying to retrieves assignee. (org.joget.apps.appworkflow.model.AppDefinitionWorkflowActivity)
- request - Http Request object of current HTTP Request. Not available if the tool is trigger by Deadline. (javax.servlet.http.HttpServletRequest)
Expected Return Object:
- None
Samples:
...
Expected Return Object:
- A java.util.Collection of username in java.lang.String to be assign to the Workflow Activity.
Samples:
Randomly assign an user in a department to a workflow activity.
Code Block | ||
---|---|---|
| ||
|
Use as Userview Permission
Injected Variables:
...
import java.util.ArrayList; import java.util.Collection; import org.joget.apps.app.service.AppUtil; import org.joget.directory.model.User |
...
;
import org.joget.directory.model.service.ExtDirectoryManager;
import org.joget.workflow.model.WorkflowActivity;
public Collection getAssignees(WorkflowActivity activity) {
Collection assignees = new ArrayList();
ExtDirectoryManager directoryManager = (ExtDirectoryManager) pluginManager.getBean("directoryManager");
String deptId = "D-005";
//Get total user in department
Long total = directoryManager.getTotalUsers(null, null, deptId, null, null, null, null);
//Get random number from 0 to the total number of users in department
int random = (int) (Math.random() * total);
//Get users using directory manager
Collection userList = directoryManager.getUsers(null, null, deptId, null, null, null, null, "firstName", false, random, 1);
for(Object u : userList){
User user = (User) u;
assignees.add(user.getUsername());
}
return assignees;
}
//call getAssignees method with injected variable
return getAssignees(workflowActivity); |
Use as Process Tool
Anchor | ||||
---|---|---|---|---|
|
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:
- None
Samples:
Start a new process in the same app with current record id.
Code Block | ||
---|---|---|
| ||
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.joget.apps.app.model.AppDefinition;
import org.joget.apps.app.service.AppService;
import org.joget.apps.app.service.AppUtil;
import org.joget.workflow.model.service.WorkflowManager;
import org.joget.workflow.model.WorkflowAssignment;
import org.joget.workflow.model.WorkflowProcess;
public Object execute(WorkflowAssignment assignment, AppDefinition appDef, HttpServletRequest request) {
AppService appService = (AppService) AppUtil.getApplicationContext().getBean("appService");
WorkflowManager workflowManager = (WorkflowManager) AppUtil.getApplicationContext().getBean("workflowManager");
//get current record id
String recordId = appService.getOriginProcessId(assignment.getProcessId());
//get process
WorkflowProcess process = appService.getWorkflowProcessForApp(appDef.getAppId(), appDef.getVersion().toString(), "process2");
//start process
workflowManager.processStart(process.getId(), null, null, null, recordId, false);
return null;
}
//call execute method with injected variable
return execute(workflowAssignment, appDef, request); |
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:
Check the user is in a group and is an admin user.
Code Block | ||
---|---|---|
| ||
import java.util.Collection;
import java.util.Map;
import org.joget.apps.app.service.AppUtil;
import org.joget.directory.model.Group;
import org.joget.directory.model.User;
import org.joget.directory.model.service.ExtDirectoryManager;
import org.joget.workflow.model.service.WorkflowUserManager;
import org.joget.workflow.util.WorkflowUtil;
public boolean isAuthorized(User user, Map params) {
//if no logged in user
if (user == null) {
return false;
}
//check current user is admin
boolean isAdmin = WorkflowUtil.isCurrentUserInRole(WorkflowUserManager.ROLE_ADMIN);
//check current user is in group "G-001"
boolean inGroup = false;
ExtDirectoryManager directoryManager = (ExtDirectoryManager) AppUtil.getApplicationContext().getBean("directoryManager");
Collection groups = directoryManager.getGroupByUsername(user.getUsername());
if (groups != null) {
String groupId = "G-001";
for (Group g : groups) {
if (groupId.equals(g.getId())) {
inGroup = true;
}
}
}
return isAdmin && inGroup;
}
//call isAuthorized method with injected variable
return isAuthorized(user, requestParams); |
Expected Return Object:
- A boolean value to indicate the user is authorized.
Samples:
Check the user is in a group and is an admin user.
Code Block | ||
---|---|---|
| ||
|
Best Practices
1. Only import classes that are needed
...
If your script need to reuse for multiple times in an app or can be used by others app in future development, please consider to make your Bean Shell script as a plugin instead of copy and paste it multiple times across your app. Bean Shell script is harder to maintain in this case. Imagine that you want to make a change, you will have to update all the places that are using the same script as well. Beside that, a normal plugin implementation will have better performance than a script running by a Bean Shell interpreter.
8. Reuse existing plugins in your code to make it cleaner and easy to maintain
If partial of your script can be done by existing plugins in Joget Workflow, you can reuse the plugin in stead of writting it again.
To reuse a plugin, you can retrieve the plugin using PluginManager, then set it properties and execute it.
Example:
More samples
Children Display |
---|