How to validate the values contained in a multi-select list

Ismael Jimoh
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 14, 2024

I have written a post function script to check the value of a multi-select list and when I check the field value, I see the option I want but when I attempt to use the contains() or any.equals() methods to validate this in an if/else statement, I am getting a false even when the value should throw a true.

Please find my script below:

import java.util.ArrayList

import com.atlassian.jira.issue.fields.CustomField

import com.atlassian.jira.issue.CustomFieldManager

import com.atlassian.jira.issue.MutableIssue

import com.atlassian.jira.component.ComponentAccessor

import com.atlassian.jira.issue.IssueManager

IssueManager issueManger = ComponentAccessor.getIssueManager()

MutableIssue curEpicIssue = issue

CustomFieldManager cfManager = ComponentAccessor.getCustomFieldManager()

CustomField productLineField = cfManager.getCustomFieldObject('customfield_17003')

ArrayList<String> productLineFieldValue = curEpicIssue.getCustomFieldValue(productLineField) //Multi select list field

log.warn("Current Issue " + curEpicIssue)

log.warn("Current Issue's issue type " + curEpicIssue.getIssueType().getName())

log.warn("Value from the Product Line Field " + productLineFieldValue)

log.warn("Class of the Product Line Field " + productLineFieldValue.getClass())

log.warn("Size of the Product Line Field " + productLineFieldValue.size())

log.warn("Does the Product Line field contain the value Others? " + productLineFieldValue.contains("Others")) //any().toString().equals("Others"))

log.warn("Does the Product Line field contain the value identity? " + productLineFieldValue.contains("Identity"))

if(productLineFieldValue){

productLineFieldValue.each {

log.warn("The following values are contained in the Product Line field's array: $it.value")

}

}

 

and the result returned is below

 

2024-05-14 10:29:04,367 WARN [runner.ScriptBindingsManager]: Current Issue OPM-15035

2024-05-14 10:29:04,367 WARN [runner.ScriptBindingsManager]: Current Issue's issue type: Epic

2024-05-14 10:29:04,367 WARN [runner.ScriptBindingsManager]: Value from the Product Line Field: [Others]

2024-05-14 10:29:04,367 WARN [runner.ScriptBindingsManager]: Class of the Product Line Field: class java.util.ArrayList

2024-05-14 10:29:04,367 WARN [runner.ScriptBindingsManager]: Size of the Product Line Field: 1

2024-05-14 10:29:04,368 WARN [runner.ScriptBindingsManager]: Does the Product Line field contain the value Others? false

2024-05-14 10:29:04,368 WARN [runner.ScriptBindingsManager]: Does the Product Line field contain the value identity? false

2024-05-14 10:29:04,369 WARN [runner.ScriptBindingsManager]: The following values are contained in the Product Line field's array: Others

 

From what I see, it contains my expected value but I still get a false when checking if it contains the value others.

2 answers

2 accepted

1 vote
Answer accepted
Ram Kumar Aravindakshan _Adaptavist_
Community Leader
Community Leader
Community Leaders are connectors, ambassadors, and mentors. On the online community, they serve as thought leaders, product experts, and moderators.
May 14, 2024

Hi @Ismael Jimoh

For your requirement, I suggest changing your approach and use ScriptRunner's HAPI feature to simplify your code.

So in your case, if you intend to perform a validation on the values selected, you can try something like: 

def multiSelectValue = issue.getCustomFieldValue('Multi-Select') as String //change the field name

if (multiSelectValue.contains('Value1') || multiSelectValue.contains('Value2') || multiSelectValue.contains('Value3') ) { //change the values

multiSelectValue.each {

log.warn("The following values are contained in the Product Line field's array: $it.value")
}

}

Please note that the sample working code above is not 100% exact to your environment. Hence you will need to make the required modifications.

I hope this helps to solve your issue. :-)

Thank you and Kind regards,
Ram

1 vote
Answer accepted
Radek Dostál
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 14, 2024

This part is incorrect:

ArrayList<String> productLineFieldValue = curEpicIssue.getCustomFieldValue(productLineField)

 

It's not a list of String values, it's a list of LazyLoadedOption (https://docs.atlassian.com/software/jira/docs/api/9.4.18/com/atlassian/jira/issue/customfields/option/LazyLoadedOption.html)

 

It shows values in log because of it's toString method:

public String toString() {
return this.getValue();
}

 

Try switching this:

log.warn("Does the Product Line field contain the value Others? " + productLineFieldValue.contains("Others"))

To:

log.warn("Does the Product Line field contain the value Others? " + productLineFieldValue.stream().anyMatch(v -> v.getValue().equals("Others")))

 

Groovy-wise you could convert the lazyloadedoptions to string using for example

List<String> actualStringValues = curEpicIssue.getCustomFieldValue(productLineField)*.getValue()

 

Keep in mind though that Issue#getCustomFieldValue() can return null - so to avoid NPE's I'd recommend something similar to:

List<LazyLoadedOption> productLineFieldValue = (List<LazyLoadedOption>) curEpicIssue.getCustomFieldValue(productLineField)
List<String> productLineFieldStringValues = productLineFieldValue != null ? productLineFieldValue.stream().map(v -> v.getValue()).collect(Collectors.toList()) : Collections.emptyList()

 

Ismael Jimoh
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 14, 2024

Thanks a lot  @Radek Dostál  .

I will give this a shot. I had assumed that the options would be strings which now thinking of it makes no sense.

I will make the necessary adjustments and keep you updated.

@Ram Kumar Aravindakshan _Adaptavist_, I am not fully used to Hapi hence I went with the classic groovy/java approach which I am more conversant with.

I will have a look at your suggestion.

Thanks again.

Ismael Jimoh
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 16, 2024

Thanks a lot both of you.

I went with @Ram Kumar Aravindakshan _Adaptavist_ solution as it was the faster fix for the issue.

Thanks again both of you.

Suggest an answer

Log in or Sign up to answer