Hi Community,
I've been struggling this problem for 2 days.
Here is my source code :
import com.atlassian.jira.bc.issue.IssueService;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.IssueInputParameters;
import com.atlassian.jira.project.Project;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.customfields.option.Option;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.util.ErrorCollection;
import com.atlassian.jira.event.type.EventDispatchOption;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.project.version.Version;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.link.IssueLink;
import com.atlassian.jira.issue.link.IssueLinkManager;
//parametrik
String testIssueTypeID = 68;
long nestPayProjectID = 10121;
long testNestPayProjectID = 13791;
long testQAProjectID = 13990;
long qaProjectID = 13093;
long cftestAkisiID = 10090;
long cfDomainsID = 13651;
long cfMainVersionID = 13552;
long cfUtilizationCategoryID = 11861;
long issueLinkDependsOnID = 10020;
long linkOrderNo = 1;
if(issue.getProjectId() == nestPayProjectID || issue.getProjectId() == testNestPayProjectID)//sadece "nestPay" veya "test nestPay" projesinde "QA projesi" issue'ları yaratılıyor.
{
IssueManager issueManager = ComponentAccessor.getIssueManager();
IssueService.CreateValidationResult createValidationResult;
IssueService.IssueResult createResult;
def created = false;
def linkManager = ComponentAccessor.getIssueLinkManager();
def issueService = ComponentAccessor.getIssueService();
def inputParameters = issueService.newIssueInputParameters();
def curAppUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser();
def assignee = ComponentAccessor.getUserManager().getUserByName("xyz");
def adminUser = ComponentAccessor.getUserManager().getUserByName("asd.dsa");
def cfTestAkisi = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(cftestAkisiID);
def cfDomain = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(cfDomainsID);
def cfMainVersion = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(cfMainVersionID);
def cfUtilizationCategory = ComponentAccessor.getCustomFieldManager().getCustomFieldObject(cfUtilizationCategoryID);
List<IssueLink> issueLinkList = new ArrayList<>();
issueLinkList.addAll(linkManager.getOutwardLinks(issue.getId()));
issueLinkList.addAll(linkManager.getInwardLinks(issue.getId()));
Map<Option, Boolean> issueLinkMap;
for (Iterator<IssueLink> iterator = issueLinkList.iterator(); iterator.hasNext();) {
IssueLink issueLink = (IssueLink) iterator.next();
Issue linkedIssue;
if (issueLink.getDestinationObject().getKey().startsWith("TQA")) {
log.warn("ISSUE: " + issueLink.getDestinationObject().getKey());
linkedIssue = issueLink.getDestinationObject();
} else if (issueLink.getSourceObject().getKey().startsWith("TQA")) {
log.warn("ISSUE: " + issueLink.getSourceObject().getKey());
linkedIssue = issueLink.getSourceObject();
}
log.warn("linkedIssue : " + linkedIssue);
log.warn("linkedIssueDomains : " + cfDomain.getValue(linkedIssue))
if(linkedIssue != null){
List<Option> linkedIssueDomains = (List<Option>)cfDomain.getValue(linkedIssue);
log.warn("linkedIssueDomains : " + linkedIssueDomains);
log.warn("linkedIssueDomain : " + linkedIssueDomains.iterator().next());
Option linkedIssueDomain = linkedIssueDomains.iterator().next();
issueLinkMap.put(linkedIssueDomain, true);
}
}
List<Option> domains = (List<Option>)cfDomain.getValue(issue);
Option utilizationCategory = (Option)cfUtilizationCategory.getValue(issue);
Collection<Version> fixVersions = issue.getFixVersions();
String mainVersion = fixVersions.iterator().next().toString();
log.warn(fixVersions);
log.warn(mainVersion);
log.warn("domains: " + domains)
for (Option domain : domains) {
if(issueLinkMap != null)
created = issueLinkMap.get(domain) != null ? true : false;
log.warn("created : " + created);
if(!created)
{
inputParameters.setProjectId(testQAProjectID)
.setIssueTypeId(testIssueTypeID)
.setSummary("Test for " + domain.getValue() + ": " + issue.getSummary())
.setReporterId(issue.getReporterId())
.setPriorityId(issue.getPriority().getId())
.setDescription(issue.getDescription())
.addCustomFieldValue(cftestAkisiID, cfTestAkisi.getValue(issue).toString())
.addCustomFieldValue(cfDomainsID, domain.getOptionId().toString())
.addCustomFieldValue(cfMainVersionID, mainVersion)
.addCustomFieldValue(cfUtilizationCategoryID, utilizationCategory.getOptionId().toString());
createValidationResult = issueService.validateCreate(curAppUser, inputParameters);
log.warn(cfTestAkisi.getValue(issue));
log.warn(domain);
log.warn(issue.getFixVersions());
log.warn(utilizationCategory.getValue());
log.warn(createValidationResult.isValid());
if (createValidationResult.isValid()) {
createResult = issueService.create(curAppUser, createValidationResult);
log.warn("issue created");
def createdIssue = createResult.getIssue();
ComponentAccessor.getIssueLinkManager().createIssueLink(issue.getId(), createdIssue.getId(), issueLinkDependsOnID, linkOrderNo, adminUser);
log.warn("issue linked");
}
else {
ErrorCollection errors = createValidationResult.getErrorCollection();
errors.getErrorMessages().each{log.warn(it)};
errors.getReasons().each{log.warn(it)};
errors.getErrors().each{k,v -> log.warn("Key : " + k + " Value : " + v)};
}
}
}
}
And here is my logs :
2017-12-26 10:34:35,368 WARN [workflow.ScriptWorkflowFunction]: ISSUE: TQA-64 2017-12-26 10:34:35,370 WARN [workflow.ScriptWorkflowFunction]: linkedIssue : TQA-64 2017-12-26 10:34:35,371 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomains : [TR] 2017-12-26 10:34:35,372 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomains : [TR] 2017-12-26 10:34:35,372 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomain : TR 2017-12-26 10:34:35,375 ERROR [workflow.ScriptWorkflowFunction]: ************************************************************************************* 2017-12-26 10:34:35,375 ERROR [workflow.ScriptWorkflowFunction]: Script function failed on issue: TNP-24, actionId: 161, file: <inline script> java.lang.NullPointerException: Cannot invoke method put() on null object at Script268.run(Script268.groovy:72)
Can you help me?
Hello,
I think the problem is because linkedIssueDomains.iterator().next() returns null.
You log "log.warn("linkedIssueDomain : " + linkedIssueDomains.iterator().next());"
The problem is that in the log it can be not null. But when you assign it to a value it can be null because iterator().next() takes the next element each time you call it. Rewrite it
Option linkedIssueDomain = linkedIssueDomains.iterator().next();
log.warn("linkedIssueDomain : " + linkedIssueDomain);
and have a look if linkedIssueDomain is null or not.
Thanks for quick response.
Strange things keep happening :)
Here how i changed the if block as you showed.
if(linkedIssue != null){
List<Option> linkedIssueDomains = (List<Option>)cfDomain.getValue(linkedIssue);
log.warn("linkedIssueDomains : " + linkedIssueDomains);
Option linkedIssueDomain = linkedIssueDomains.iterator().next();
log.warn("linkedIssueDomain : " + linkedIssueDomain);
issueLinkMap.put(linkedIssueDomain, true);
}
But still i keep getting the same error.
2017-12-26 11:35:34,103 WARN [workflow.ScriptWorkflowFunction]: ISSUE: TQA-64 2017-12-26 11:35:34,105 WARN [workflow.ScriptWorkflowFunction]: linkedIssue : TQA-64 2017-12-26 11:35:34,106 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomains : [TR] 2017-12-26 11:35:34,106 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomains : [TR] 2017-12-26 11:35:34,107 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomain : TR 2017-12-26 11:35:34,109 ERROR [workflow.ScriptWorkflowFunction]: ************************************************************************************* 2017-12-26 11:35:34,109 ERROR [workflow.ScriptWorkflowFunction]: Script function failed on issue: TNP-24, actionId: 161, file: <inline script> java.lang.NullPointerException: Cannot invoke method put() on null object at Script280.run(Script280.groovy:72)
By the way Line 72 is this:
issueLinkMap.put(linkedIssueDomain, true);
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Did you check in the log file? linkedIssueDomain is null or not?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
log file shows this
2017-12-26 11:35:34,107 WARN [workflow.ScriptWorkflowFunction]: linkedIssueDomain : TR
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
I found it. You did not initialize Map<Option, Boolean> issueLinkMap;
You should do like this
Map<Option, Boolean> issueLinkMap = new HashMap<Option, Boolean>();
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
oh gosh! How can i miss that.
Alexey thanks a lot. You saved me :)
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.