Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

Add mail with Cascading Field Script Runner

Write HangOuts May 11, 2020

Good afternoon, I'm setting this script with script runner so that when I receive a mail, I'd be able to get an issue with a default field cascading. This is the error that appears in the log when trying to receive the e-mail:

"java.lang.NullPointerException: Cannot invoke method getRelevantConfig() on null object"

 

And this is the script:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils
import com.atlassian.jira.issue.ModifiedValue

import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.config.PriorityManager

def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.getProjectManager()
def issueFactory = ComponentAccessor.getIssueFactory()
def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor)

def subject = message.getSubject() as String
def issue = ServiceUtils.findIssueObjectInString(subject)

if (issue) {
return
}

ApplicationUser user = userManager.getUserByName("username")
ApplicationUser reporter = messageUserProcessor.getAuthorFromSender(message) ?: user
def project = projectManager.getProjectObjByKey("projectkey")


def priorities = ComponentAccessor.getComponent(PriorityManager).priorities
def priority = priorities.findByName("Medium")
//Config for the cascading flied
def changeHolder = new DefaultIssueChangeHolder()
def cascadeCf = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(10308)
def fieldConfig = cascadeCf.getRelevantConfig(issue)
def parentOption = ComponentAccessor.getOptionsManager().getOptions(fieldConfig)?.find { it.toString() == 'GDS' }
def childOption = ComponentAccessor.getOptionsManager().findByParentId(parentOption.optionId)?.find { it.toString() == 'GDSOPTION1' }
def newValue = [:]
newValue.put(null, parentOption)
newValue.put("1", childOption)

//END
def issueObject = issueFactory.getIssue()

cascadeCf.updateValue(null, issueObject, new ModifiedValue(issue.getCustomFieldValue(cascadeCf), newValue),changeHolder)
issueObject.setPriorityId(priority.id)

issueObject.setProjectObject(project)
issueObject.setSummary(subject)
issueObject.setDescription(MailUtils.getBody(message))
issueObject.setIssueTypeId(project.issueTypes.find { it.name == "Task" }.id)
issueObject.setReporter(reporter)

messageHandlerContext.createIssue(user, issueObject)

---------------------------------------

 

Thank you

 

1 answer

0 votes
Write HangOuts May 11, 2020

I have also tryed this other one:

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.service.util.ServiceUtils
import com.atlassian.jira.service.util.handler.MessageUserProcessor
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.util.UserManager
import com.atlassian.mail.MailUtils

import com.atlassian.jira.config.PriorityManager

import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.project.Project
import com.atlassian.jira.issue.watchers.WatcherManager

def userManager = ComponentAccessor.getComponent(UserManager)
def projectManager = ComponentAccessor.getProjectManager()
def issueFactory = ComponentAccessor.getIssueFactory()
def messageUserProcessor = ComponentAccessor.getComponent(MessageUserProcessor)

def subject = message.getSubject() as String
def issue = ServiceUtils.findIssueObjectInString(subject)

def customFieldManager = ComponentAccessor.customFieldManager
def optionsManager = ComponentAccessor.optionsManager
def issueManager = ComponentAccessor.issueManager

if (issue) {
return
}

ApplicationUser user = userManager.getUserByName("username")
ApplicationUser reporter = messageUserProcessor.getAuthorFromSender(message) ?: user
def project = projectManager.getProjectObjByKey("projectkey")

def customField = customFieldManager.getCustomFieldObjectsByName("[FieldCascadingname")[0]
def fieldConfig = customField.getRelevantConfig(issue)

def options = optionsManager.getOptions(fieldConfig)
def parentOption = options.find { it.value == "GDS" }
def childOption = parentOption?.childOptions?.find { it.value == "GDSOption1" }
def newValues = [:]


def issueObject = issueFactory.getIssue()
def priorities = ComponentAccessor.getComponent(PriorityManager).priorities
def priority = priorities.findByName("Medium")

issueObject.setPriorityId(priority.id)

issueObject.setProjectObject(project)
issueObject.setSummary(subject)
issueObject.setDescription(MailUtils.getBody(message))
issueObject.setIssueTypeId(project.issueTypes.find { it.name == "Task" }.id)
issueObject.setReporter(reporter)
newValues.put(null, parentOption)
newValues.put("1", childOption)

issueObject.setCustomFieldValue(customField, newValues)

messageHandlerContext.createIssue(user, issueObject)

 

And then get this error:

ERROR anonymous TESTSCRIPTRUNNER [c.o.scriptrunner.mail.MailHandler] Failed to execute email handler 'TESTSCRIPTRUNNER(as provided on first page)' on message with subject 'test'

groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method com.atlassian.jira.issue.fields.ImmutableCustomField#getRelevantConfig.
Cannot resolve which method to invoke for [null] due to overlapping prototypes between:
[interface com.atlassian.jira.issue.context.IssueContext]
[interface com.atlassian.jira.issue.Issue]
[interface com.atlassian.jira.issue.context.JiraContextNode]
at Script571.run(Script571.groovy:39)


Thank you very much!

achoudhary June 24, 2022

Any luck on this one? I am also not able to set cascade field value here

Suggest an answer

Log in or Sign up to answer