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.
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;
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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;
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I tried that, but the summary portion did not work. The original part still works. Nothing in the logs.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Disregard my previous comment. It is working properly. Careless mistake on my end. Thanks for your help!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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()
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Can you post the full stack of the "com.atlassian.jira.issue.label.Label cannot be cast to java.util.Set" error?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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)
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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).
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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!
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.