Set Field Value to constant or Groovy expression with 3rd party label field?

I am using an addon called Label Manager that uses a CustomFieldType class which extends the Label Type "LabelsCFType". I cannot seem to get it to work using a script with an if statement.

If I have it like this it works:
Type = groovy expression
Value = ["my_label_1"]

Like this it doesn't:
if(issue.get("customfield_18275") ==
"ITAM-Request") {return ["Internal_Tools-RequestIT"];}

I do not see any errors or other information when looking at the logs.

2 answers

1 accepted

Accepted Answer
1 vote

Ok, so after all this back and forth, the answer is:

import com.atlassian.jira.issue.label.Label;
for (label in issue.get("customfield_18275"))
  if (label.getLabel() == "ITAM-Request")
    return [new Label(null, null, "Internal_Tools-RequestIT")] as Set;
return null;

I have one follow up question to this. If I wanted to add another line, in addition to what I have already, where it sets this 3rd party label based on what the summary is, how would I do that?

I tried this:

import com.atlassian.jira.issue.label.Label;
for (label in issue.get("customfield_18275"))
  if (label.getLabel() == "ITAM-Request")
    return [new Label(null, null, "Internal_Tools-RequestIT")] as Set;
return null;
if (issue.get("summary") == "automated decommission process")return [new Label(null, null, "Security-Decommission")] as Set;

Try this:

import com.atlassian.jira.issue.label.Label;
def res=[];
for (label in issue.get("customfield_18275"))
  if (label.getLabel() == "ITAM-Request")
    res.push(new Label(null, null, "Internal_Tools-RequestIT"));
if (issue.get("summary") == "automated decommission process")
  res.push(new Label(null, null, "Security-Decommission"));
return res as Set;

I tried that, but the summary portion did not work. The original part still works. Nothing in the logs.

Disregard my previous comment. It is working properly. Careless mistake on my end. Thanks for your help!

Hi Cole, 

this is because your custom field is an extension of the LabelsCFType and if you look at https://innovalog.atlassian.net/wiki/display/KB/Using+issue.get%28%3Cfield_name%3E%29+in+scripts, you'll notice that issue.get() returns a Set<Label>, not a String. So you'll need to iterate over the set and, for each value, compare its getName() with "ITAM-Request" (using the equals() method, not "==" which returns true only if two Objects are the same):

for (label : issue.get("customfield_18275"))
  if (label.getName().equals("ITAM-Request"))
    return "Internal_Tools-RequestIT";
return null;

By the way, why are you returning an array? What kind of calculated field are you using?

Thanks for the reply, David. I tried what your code and got an error.

 

2017-02-10 09:17:13,939 ajp-nio-8009-exec-52 WARN adamsco 557x930187x1 ir9690 10.30.29.82 /secure/WorkflowUIDispatcher.jspa [c.i.j.plugins.functions.SetFieldValueFunction] Error while executing SetFieldValueFunction: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
    Script1.groovy: 1: Java-style for-each statement requires a type declaration.;
       solution: Use the 'in' keyword, as for (x in y) {...} @ line 1, column 12.
       for (label : issue.get("customfield_18275"))
                  ^
    1 error
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
Script1.groovy: 1: Java-style for-each statement requires a type declaration.;
   solution: Use the 'in' keyword, as for (x in y) {...} @ line 1, column 12.
   for (label : issue.get("customfield_18275"))
              ^
1 error
        at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309)
        at org.codehaus.groovy.control.ErrorCollector.addFatalError(ErrorCollector.java:149)
        at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:119)
        at org.codehaus.groovy.control.ErrorCollector.addError(ErrorCollector.java:131)
        at org.codehaus.groovy.control.SourceUnit.addError(SourceUnit.java:359)
        at org.codehaus.groovy.antlr.AntlrParserPlugin.transformCSTIntoAST(AntlrParserPlugin.java:142)
        at org.codehaus.groovy.antlr.AntlrParserPlugin.parseCST(AntlrParserPlugin.java:108)
        at org.codehaus.groovy.control.SourceUnit.parse(SourceUnit.java:236)
        at org.codehaus.groovy.control.CompilationUnit$1.call(CompilationUnit.java:162)
        at org.codehaus.groovy.control.CompilationUnit.applyToSourceUnits(CompilationUnit.java:912)
        at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:574)
        at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:550)
        at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:527)
        at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:279)
        at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:258)
        at groovy.lang.GroovyShell.parseClass(GroovyShell.java:613)
        at groovy.lang.GroovyShell.parse(GroovyShell.java:625)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:516)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
        at com.innovalog.jmwe.plugins.functions.SetFieldValueFunction.executeFunction(SetFieldValueFunction.java:76)
        at com.innovalog.jmwe.plugins.functions.AbstractPreserveChangesPostFunction.execute(AbstractPreserveChangesPostFunction.java:124)
        at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:1050)
        at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1446)
        at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:564)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowActionInsideTxn(OSWorkflowManager.java:826)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowAction(OSWorkflowManager.java:786)
        at com.atlassian.jira.bc.issue.DefaultIssueService.transition(DefaultIssueService.java:484)
        at com.atlassian.jira.web.action.workflow.SimpleWorkflowAction.doExecute(SimpleWorkflowAction.java:28)
        ... 1 filtered
        at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
        ... 7 filtered
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        ... 55 filtered
        at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:59)
        ... 23 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 42 filtered
        at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
        ... 20 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 21 filtered
        at com.valiantys.jira.plugins.sql.service.servicedesk.ContextListenerServletFilter.doFilter(ContextListenerServletFilter.java:24)
        ... 3 filtered
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:169)
        at com.atlassian.servicedesk.internal.util.scala.ScalaJavaInterOp$1.apply(ScalaJavaInterOp.java:25)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil$.outOfCustomerContext(CustomerContextUtil.scala:48)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil.outOfCustomerContext(CustomerContextUtil.scala)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.outOfCustomerContext(CustomerContextServiceImpl.java:24)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:164)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:120)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:112)
        ... 12 filtered
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
        at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:85)
        at net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:105)
        ... 44 filtered
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

 

I added an "in" instead of the colon and got a new error:

2017-02-10 09:18:54,731 ajp-nio-8009-exec-66 WARN adamsco 558x930296x1 ir9690 10.30.29.82 /secure/WorkflowUIDispatcher.jspa [c.i.j.plugins.functions.SetFieldValueFunction] Error while executing SetFieldValueFunction: groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.label.Label.getName() is applicable for argument types: () values: []
    Possible solutions: getLabel(), getAt(java.lang.String), getClass(), getId(), getIssue()
groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.label.Label.getName() is applicable for argument types: () values: []
Possible solutions: getLabel(), getAt(java.lang.String), getClass(), getId(), getIssue()
        at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:55)
        at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:46)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)
        at Script1.run(Script1.groovy:2)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:518)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:556)
        at groovy.lang.GroovyShell.evaluate(GroovyShell.java:527)
        at com.innovalog.jmwe.plugins.functions.SetFieldValueFunction.executeFunction(SetFieldValueFunction.java:76)
        at com.innovalog.jmwe.plugins.functions.AbstractPreserveChangesPostFunction.execute(AbstractPreserveChangesPostFunction.java:124)
        at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:1050)
        at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1446)
        at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:564)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowActionInsideTxn(OSWorkflowManager.java:826)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowAction(OSWorkflowManager.java:786)
        at com.atlassian.jira.bc.issue.DefaultIssueService.transition(DefaultIssueService.java:484)
        at com.atlassian.jira.web.action.workflow.SimpleWorkflowAction.doExecute(SimpleWorkflowAction.java:28)
        ... 1 filtered
        at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
        ... 7 filtered
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        ... 55 filtered
        at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:59)
        ... 23 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 42 filtered
        at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
        ... 20 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 21 filtered
        at com.valiantys.jira.plugins.sql.service.servicedesk.ContextListenerServletFilter.doFilter(ContextListenerServletFilter.java:24)
        ... 3 filtered
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:169)
        at com.atlassian.servicedesk.internal.util.scala.ScalaJavaInterOp$1.apply(ScalaJavaInterOp.java:25)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil$.outOfCustomerContext(CustomerContextUtil.scala:48)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil.outOfCustomerContext(CustomerContextUtil.scala)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.outOfCustomerContext(CustomerContextServiceImpl.java:24)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:164)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:120)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:112)
        ... 12 filtered
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
        at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:85)
        at net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:105)
        ... 44 filtered
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

 

I'm really not trying to return an array. I was just trying out different things to see what worked. Basically I want this 3rd party label field to auto-populate based on what is in the basic label field.

Sorry about the errors, I didn't test the script but just wanted to point you in the right direction.

Just like the first error pointed you to the right solution, the second error also points to a solution: use getLabel() instead of getName().

So the Groovy script could look like:

for (label in issue.get("customfield_18275"))
  if (label.getValue() == "ITAM-Request")
    return "Internal_Tools-RequestIT";
return null;

Note that I replaced the equals method with == which works for Strings in Groovy (only in Groovy). I got confused before because I thought you were using JIRA Misc Custom Fields, which uses BeanShell (Java) instead of Groovy.

So I did try to use getLabel() instead of getName(), but I got another error.

com.atlassian.jira.issue.label.Label cannot be cast to java.util.Set

 

 

Using your script with the getValue I an error suggesting I use getLabel().

 

2017-02-10 09:47:06,198 ajp-nio-8009-exec-57 WARN adamsco 587x930979x1 ir9690 10.30.29.82 /secure/WorkflowUIDispatcher.jspa [c.i.j.plugins.functions.SetFieldValueFunction] Error while executing SetFieldValueFunction: groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.label.Label.getValue() is applicable for argument types: () values: []
    Possible solutions: getIssue(), getClass(), getLabel(), getAt(java.lang.String), getId()
groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.label.Label.getValue() is applicable for argument types: () values: []
Possible solutions: getIssue(), getClass(), getLabel(), getAt(java.lang.String), getId()

Can you post the full stack of the "com.atlassian.jira.issue.label.Label cannot be cast to java.util.Set" error?

Sure.

2017-02-10 09:50:30,988 ajp-nio-8009-exec-52 ERROR adamsco 590x931119x1 ir9690 10.30.29.82 /secure/WorkflowUIDispatcher.jspa [c.a.jira.workflow.OSWorkflowManager] Caught exception while attempting to perform action 31 from workflow 745075 on issue 'ITSD-33835'
java.lang.ClassCastException: com.atlassian.jira.issue.label.Label cannot be cast to java.util.Set
        at rs.codecentric.customfield.LabelITCFType.createValue(LabelITCFType.java:39)
        at com.atlassian.jira.issue.fields.CustomFieldImpl.createValue(CustomFieldImpl.java:731)
        at com.atlassian.jira.issue.fields.CustomFieldImpl.updateValue(CustomFieldImpl.java:448)
        at com.atlassian.jira.issue.fields.CustomFieldImpl.updateValue(CustomFieldImpl.java:434)
        at com.atlassian.jira.workflow.function.issue.GenerateChangeHistoryFunction.execute(GenerateChangeHistoryFunction.java:54)
        at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:1050)
        at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1446)
        at com.opensymphony.workflow.AbstractWorkflow.doAction(AbstractWorkflow.java:564)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowActionInsideTxn(OSWorkflowManager.java:826)
        at com.atlassian.jira.workflow.OSWorkflowManager.doWorkflowAction(OSWorkflowManager.java:786)
        at com.atlassian.jira.bc.issue.DefaultIssueService.transition(DefaultIssueService.java:484)
        at com.atlassian.jira.web.action.workflow.SimpleWorkflowAction.doExecute(SimpleWorkflowAction.java:28)
        ... 1 filtered
        at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63)
        ... 7 filtered
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
        ... 55 filtered
        at com.atlassian.greenhopper.jira.filters.ClassicBoardRouter.doFilter(ClassicBoardRouter.java:59)
        ... 23 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 42 filtered
        at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70)
        ... 20 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 3 filtered
        at org.kantega.atlaskerb.AtlasKerberosFilter.doFilter(AtlasKerberosFilter.java:80)
        ... 21 filtered
        at com.valiantys.jira.plugins.sql.service.servicedesk.ContextListenerServletFilter.doFilter(ContextListenerServletFilter.java:24)
        ... 3 filtered
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.lambda$invokeFilterChain$0(CustomerContextSettingFilter.java:169)
        at com.atlassian.servicedesk.internal.util.scala.ScalaJavaInterOp$1.apply(ScalaJavaInterOp.java:25)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil$.outOfCustomerContext(CustomerContextUtil.scala:48)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextUtil.outOfCustomerContext(CustomerContextUtil.scala)
        at com.atlassian.servicedesk.internal.utils.context.CustomerContextServiceImpl.outOfCustomerContext(CustomerContextServiceImpl.java:24)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.outOfCustomerContext(CustomerContextSettingFilter.java:164)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilterImpl(CustomerContextSettingFilter.java:120)
        at com.atlassian.servicedesk.internal.web.CustomerContextSettingFilter.doFilter(CustomerContextSettingFilter.java:112)
        ... 12 filtered
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:201)
        at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:178)
        at net.bull.javamelody.PluginMonitoringFilter.doFilter(PluginMonitoringFilter.java:85)
        at net.bull.javamelody.JiraMonitoringFilter.doFilter(JiraMonitoringFilter.java:105)
        ... 44 filtered
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

This means that this particular custom field type expects a Set<Label> as a value, but it has a buggy implementation of the getValueFromCustomFieldParams method. So, instead of returning a String, you should return a valid Label inside a Set:

for (label in issue.get("customfield_18275"))
  if (label.getValue() == "ITAM-Request")
    return ["Internal_Tools-RequestIT"] as Set;
return null;

I haven't tested it though (can't without that add-on)

This means that this custom field type expects a Set<Label> as a value but doesn't provide a proper implementation of the getValueFromCustomFieldParams method.

In that case, you need to return a Set<Label> from the Groovy script:

import com.atlassian.jira.issue.label.Label;
for (label in issue.get("customfield_18275"))
  if (label.getValue() == "ITAM-Request")
    return [new Label(null, null, "Internal_Tools-RequestIT")] as Set;
return null;

I haven't tested this script though (can't without the add-on that provides that special Labels type).

That works!

All I had to do was change the getValue() to getLabel() and it set the value on transition.

 

I appreciate your help David!

Suggest an answer

Log in or Sign up to answer
Community showcase
Published Monday in Jira Ops

Jira Ops Early Access Program Update #1: Announcing our next feature and a new integration

Thanks for signing up for Jira Ops! I’m Matt Ryall, leader for the Jira Ops product team at Atlassian. Since this is a brand new product, we’ll be delivering improvements quickly and sharing updates...

454 views 0 9
Read article

Atlassian User Groups

Connect with like-minded Atlassian users at free events near you!

Find a group

Connect with like-minded Atlassian users at free events near you!

Find my local user group

Unfortunately there are no AUG chapters near you at the moment.

Start an AUG

You're one step closer to meeting fellow Atlassian users at your local meet up. Learn more about AUGs

Groups near you