Update customfields throw subtask

Deleted user June 1, 2017

Hi guys,

I am trying to develop a groovy script for a post function but I am completely blocked and need your help.

The goal of my script is throw a subtask, update two customfields (checkbox) of the parent issue.

The update of my "customfield2" works well but I have this error message for for the second customfield ("customfield3" in the code) :

java.lang.ClassCastException: com.atlassian.jira.bc.project.component.ProjectComponentImpl cannot be cast to com.atlassian.jira.issue.customfields.option.Option
at com.atlassian.jira.issue.customfields.impl.MultiSelectCFType.convertTypeToDbValue(MultiSelectCFType.java:82)
at com.atlassian.jira.issue.customfields.impl.AbstractMultiCFType.convertTypesToDbObjects(AbstractMultiCFType.java:190)
at com.atlassian.jira.issue.customfields.impl.AbstractMultiCFType.updateValue(AbstractMultiCFType.java:142)
at com.atlassian.jira.issue.customfields.impl.AbstractMultiCFType.updateValue(AbstractMultiCFType.java:39)
at com.atlassian.jira.issue.fields.CustomFieldImpl.updateValue(CustomFieldImpl.java:464)
at com.atlassian.jira.issue.fields.CustomFieldImpl.updateValue(CustomFieldImpl.java:434)
at com.atlassian.jira.issue.fields.OrderableField$updateValue.call(Unknown Source)
at Script49.run(Script49.groovy:59)

My "newList" object is a list as cf2, so I don't understand my error.

Thanks for your help.

Here is my code :

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.bc.project.component.ProjectComponent
import org.apache.commons.collections.ListUtils

OptionsManager optionsManager = ComponentAccessor.getOptionsManager()
IssueManager issueManager = ComponentAccessor.getIssueManager()
ComponentManager componentManager = ComponentManager.getInstance()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

//MutableIssue issue = issue
def issue = ComponentAccessor.getIssueManager().getIssueObject("USER-2387")
def parentIssue  = issue.getParentObject()



CustomField customField2 = customFieldManager.getCustomFieldObject((long)21740); // Using These Applications Prod
CustomField customField3 = customFieldManager.getCustomFieldObject((long)22900); // Used These Applications Prod
def cf2 = parentIssue?.getCustomFieldValue(customField2)
def cf3 = parentIssue?.getCustomFieldValue(customField3)

def componentValue = issue.getComponents()*.name


def changeHolder = new DefaultIssueChangeHolder();

//fieldConfig1 = customField2.getRelevantConfig(parentIssue)
//fieldConfig2 = customField3.getRelevantConfig(parentIssue)

if(customField2 != null){

    for (int i = 0; i < cf2.size(); i++) {
        for (int j = 0; j < componentValue.size(); j++) {
            if((String)cf2.get(i)==componentValue.get(j)){
                cf2.remove(i)
            }
        }
    }

    if(cf2.size()!=0) {
        customField2.updateValue(null, parentIssue, new ModifiedValue(parentIssue.getCustomFieldValue(customField2), cf2), changeHolder)
    }
    else{
        customField2.updateValue(null, parentIssue, new ModifiedValue(parentIssue.getCustomFieldValue(customField2), null), changeHolder)
    }


    if(cf3!=null){

        List<Option> newList = ListUtils.union((List<Option>)componentValue,(List<Option>)cf3)
        customField3.updateValue(null, parentIssue, new ModifiedValue(cf3, newList), changeHolder)
    }
    else {

        customField3.updateValue(null, parentIssue, new ModifiedValue(parentIssue.getCustomFieldValue(customField3), componentValue), changeHolder)

    }
}

//parentIssue.store()

1 answer

1 accepted

0 votes
Answer accepted
Nic Brough -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.
June 1, 2017

Have a look at the objects you are working with here.  A "component" is not an "option" in terms of objects.  They have a lot in common, but not enough that you can just start adding components to a select list as though it's an option.

I suspect you probably need to parse your component list, looking at the name of the component, then, for each one found, look for it in the list of possible options and then add a new option of the matching value to the custom field.

Deleted user June 1, 2017

Thank you Nic for your answer, I have update my code. No more error but still a problem :

when my customfield is empty (case of the else), I success to update the value (alright).

But in the first case (case of the if, when my customfield already contains value(s)) my customfield is not update even if my object "newList" contains well the new values that I want to assign to my customfield.

Do you have an idea ? 

Here is my code :

if(cf3!=null){

List<String> newList = ListUtils.union((List<String>)componentValue,(List<String>)cf3)
for(int i = 0;i<newList.size();i++) {
yes = [optionsManager.getOptions(fieldConfig2).getOptionForValue((String)newList.get(i), null)]
customField3.updateValue(null, parentIssue, new ModifiedValue(cf3, yes), changeHolder)
}


}
else {

for(int i = 0;i<componentValue.size();i++) {
yes = [optionsManager.getOptions(fieldConfig2).getOptionForValue((String)componentValue.get(i), null)]
customField3.updateValue(null, parentIssue, new ModifiedValue(cf3, yes), changeHolder)
}
}
Deleted user June 2, 2017

Hi guys, 

I have found my error, I put my code here, it could maybe help someone ;)

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.issue.customfields.option.Option
import com.atlassian.jira.issue.util.DefaultIssueChangeHolder
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.ModifiedValue
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.bc.project.component.ProjectComponent
import org.apache.commons.collections.ListUtils

OptionsManager optionsManager = ComponentAccessor.getOptionsManager()
IssueManager issueManager = ComponentAccessor.getIssueManager()
ComponentManager componentManager = ComponentManager.getInstance()
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

MutableIssue issue = issue
//def issue = ComponentAccessor.getIssueManager().getIssueObject("USER-2387")
def parentIssue  = issue.getParentObject()



CustomField customField2 = customFieldManager.getCustomFieldObject((long)21740); // Using These Applications Prod
CustomField customField3 = customFieldManager.getCustomFieldObject((long)22900); // Used These Applications Prod
def cf2 = parentIssue?.getCustomFieldValue(customField2)
def cf3 = parentIssue?.getCustomFieldValue(customField3)

def componentValue = issue.getComponents()*.name


def changeHolder = new DefaultIssueChangeHolder();

fieldConfig1 = customField2.getRelevantConfig(parentIssue)
fieldConfig2 = customField3.getRelevantConfig(parentIssue)

if(customField2 != null){

    for (int i = 0; i < cf2.size(); i++) {
        for (int j = 0; j < componentValue.size(); j++) {
            if((String)cf2.get(i)==componentValue.get(j)){
                cf2.remove(i)
            }
        }
    }

    if(cf2.size()!=0) {
        customField2.updateValue(null, parentIssue, new ModifiedValue(parentIssue.getCustomFieldValue(customField2), cf2), changeHolder)
    }
    else{
        customField2.updateValue(null, parentIssue, new ModifiedValue(parentIssue.getCustomFieldValue(customField2), null), changeHolder)
    }


    if(cf3!=null){

        List<String> newList = ListUtils.union((List<String>)componentValue,(List<String>)cf3)
        ArrayList yes = new ArrayList<>()
        for(int i = 0;i<newList.size();i++) {
            yes.add(optionsManager.getOptions(fieldConfig2).getOptionForValue((String)newList.get(i), null))
        }
        customField3.updateValue(null, parentIssue, new ModifiedValue(cf3, yes), changeHolder)

    }
    else {

        for(int i = 0;i<componentValue.size();i++) {
            yes = [optionsManager.getOptions(fieldConfig2).getOptionForValue((String)componentValue.get(i), null)]
            customField3.updateValue(null, parentIssue, new ModifiedValue(cf3, yes), changeHolder)
        }
    }
}

parentIssue.store()

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events