I have a Jira service management custom field that stores an Insight object. This object type has in Insight an attribute of type "Object", and I need to remove its value when the issue transitions to an specific status.
There is an Insight postfunctions that allows to do this, but due to bug JSDSERVER-8437 it does not work when there is only one object stored on the attribute (which is my case). So I´m trying to write a groovy code to do this, but I´m stock receiving this error message as result:
class com.riadalabs.jira.plugins.insight.common.exception.GroovyInsightException
GroovyInsightException: ValidationInsightException: Validation errors were found: rlabs-insight-attribute-93: ErrorMessage{i18nKey='rlabs.insight.i18n.constraint.violation.ObjectAttributeValueBean.MinOne.value', parameters=[], additionalMessage=null}; '
The constraint violation confuses me as the attribute I´m trying to clean has 0 to 1 cardinality (in fact I can manually remove its value perfectly). Here the code I´m using, I´ll appreciate if you can help me find what I am doing wrong.
int insightSchemaID = 1;
int jiraCustomFieldIDForAffectedObject = 13813; // Jira custom field (Insight type) that stores the Insight object
int insightAtributoID = 93; // The Insight object attribute Id which value needs to be removed
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.event.type.EventDispatchOption;
import com.atlassian.jira.issue.context.IssueContextImpl;
import com.atlassian.jira.issue.fields.config.FieldConfig;
import java.util.ArrayList;
import java.util.stream.Collectors;
// Get Insight Object Facade from plugin accessor
Class objectFacadeClass = ComponentAccessor.getPluginAccessor().getClassLoader().findClass("com.riadalabs.jira.plugins.insight.channel.external.api.facade.ObjectFacade");
def objectFacade = ComponentAccessor.getOSGiComponentInstanceOfType(objectFacadeClass);
// Get Insight Object Type Facade from plugin accessor
Class objectTypeFacadeClass = ComponentAccessor.getPluginAccessor().getClassLoader().findClass("com.riadalabs.jira.plugins.insight.channel.external.api.facade.ObjectTypeFacade");
def objectTypeFacade = ComponentAccessor.getOSGiComponentInstanceOfType(objectTypeFacadeClass);
// Get Insight Object Attribute Facade from plugin accessor
Class objectTypeAttributeFacadeClass = ComponentAccessor.getPluginAccessor().getClassLoader().findClass("com.riadalabs.jira.plugins.insight.channel.external.api.facade.ObjectTypeAttributeFacade");
def objectTypeAttributeFacade = ComponentAccessor.getOSGiComponentInstanceOfType(objectTypeAttributeFacadeClass);
/* ------------------------------------------------------------- */
// 1. Get Jira Insight custom field value
/* ------------------------------------------------------------- */
CustomField disposalField = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(jiraCustomFieldIDForAffectedObject);
if (disposalField == null) {
return false;
}
def disposalID = disposalField.getValue(issue);
if (disposalID.isEmpty()) {
return false;
}
/* ------------------------------------------------------------------- */
// 2. Get the Insight object
/* ------------------------------------------------------------------- */
def obj = objectFacade.loadObjectBean(disposalID[0].id);
/* ------------------------------------------------------------------- */
// 3. Get the object attribute which value has to be removed
/* ------------------------------------------------------------------- */
def objAttrib = objectFacade.loadObjectAttributeBean(obj.getId(), insightAtributoID);
/* ------------------------------------------------------------------- */
// 4. Create the object type attribute to store
/* ------------------------------------------------------------------- */
def objectTypeAttributeBean = objectTypeAttributeFacade.loadObjectTypeAttributeBean(insightAtributoID);
def newObjectAttributeBean = obj.createObjectAttributeBean(objectTypeAttributeBean);
/* ------------------------------------------------------------------- */
// 5. Assign empty value to the atribute
/* ------------------------------------------------------------------- */
newObjectAttributeBean.setObjectAttributeValueBeans([]);
/* ------------------------------------------------------------------- */
// 6. Assign the attribute id to the object attribute
/* ------------------------------------------------------------------- */
// assign the id of the attribute (got in step 3)
newObjectAttributeBean.setId(objAttrib.getId());
/* ------------------------------------------------------------------- */
// 7. Object update
/* ------------------------------------------------------------------- */
objAttribute = objectFacade.storeObjectAttributeBean(newObjectAttributeBean);
Found the solution, no need to make an update, attribute value can be deleted directly through objectFacade.deleteObjectAttributeBean(objAttrib.getId())
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.