This document details the Shared Groovy scripts feature of JMWE. Using this you can define global Groovy scripts that will be available from any Groovy script written in the Groovy console, post-functions, conditions and validators. This is useful for reusing complex/lengthy scripts across multiple workflow transitions. It is available under JMWE administration pages.
...
Creating Shared Groovy Scripts
Defining a static method
In this example, we will create a simple static method plusOne
in the Class Functions
. Create a shared script named Functions
with this script. Note, the name of the shared script can be used as the class.
...
When you test this script in the Groovy editor against any issue the tester will return 2
Defining a whole class
In this example, we will create a shared script named GreetMe
with the script:
Code Block | ||||
---|---|---|---|---|
| ||||
class GreetMe{ String aString = "Hello" String sayIt() { return aString; } } |
...
When you test this script in the Groovy editor against any issue the tester will return Hello
Defining another class inside the script
In this example, we will create a shared script named MyClasses
with the script:
Code Block | ||||
---|---|---|---|---|
| ||||
interface Animal { String getName() } class Cat implements Animal { String getName() { return "Cat" } } static String exec() { return new Cat().name } |
...
When you test this script in the Groovy editor against any issue the tester will return true
Defining a service with all desired methods
Global variables and functions used in the Shared Groovy scripts are not available to the calling methods and hence should be passed as parameters. The easiest approach to this is to define a class that will contain all the desired methods but not static methods. This will be like a "Service". For example:
Code Block | ||||
---|---|---|---|---|
| ||||
import com.atlassian.jira.issue.IssueManager
class MyService {
private Script baseScript;
public MyService(Script base) {
this.baseScript = base;
}
public String getIssueKey() {
return baseScript.issue.key;
}
public Issue getIssue(String key) {
return baseScript.getComponent(IssueManager).getIssueObject(key)
}
} |
And you can then use this "Service" from the main script:
Code Block | ||||
---|---|---|---|---|
| ||||
MyService utils = new MyService(this)
utils.issueKey
utils.getIssue("TEST-1") |
Use cases for Shared Groovy scripts
...
You can use this in a post-function to set a Date-time picker field. For example Set a Date time picker field to the Due date plus 5 days, excluding weekends. The script in the post-function will be:
Code Block | ||||
---|---|---|---|---|
| ||||
return AddDaysExcludingWeekends.addDays(issue.duedate,5) |
...
Create a shared validator that checks for attachments of a specific extension were added to the transition screen
Create a shared groovy script,
AttachmentValidator
, with the following script:Code Block language groovy linenumbers true import com.atlassian.jira.issue.IssueFieldConstants import com.atlassian.jira.issue.attachment.Attachment import com.atlassian.jira.issue.attachment.TemporaryWebAttachment import com.atlassian.jira.issue.attachment.TemporaryWebAttachmentManager class AttachmentValidator{ static fetchAttachments(issue,ext){ TemporaryWebAttachmentManager attachmentManager = ComponentAccessor.getComponent(TemporaryWebAttachmentManager) try { List<Long> ids = issue.getModifiedFields().get(IssueFieldConstants.ATTACHMENT).getNewValue(); if (ids) return ids.any { id -> def attachment = attachmentManager.getTemporaryWebAttachment(id).getOrNull() return attachment?.filename?.endsWith(ext) } } catch (Exception e) { } return false } }
- Save it.
Now you can use this in Scripted Groovy validator across transitions to validate the attachments added on the transition screen. Add the Scripted Groovy validator and call the method passing the issue
variable and extension as parameters.
Code Block | ||||
---|---|---|---|---|
| ||||
AttachmentValidator.fetchAttachments(issue,".pdf") |
...