I prepare listener of rank change event with scriptrunner. I change rank from Structure by drag&drop of rows, structure is sorted by rank.
When I read structure in main thread in listener and get data, then I see that sequence of rows is old. If then I run the same script from console then sequence of rows is new.
Now I think script from listener executes before rebuild of structure in main thread. But if I try to make new thread, make sleep and then try to read structure I get nothing.
Please help. I am not sure that I work in new thread in right way.
In atlassan-jira.log there is no log entry for line "log.info "Structures - "+structures+"\n"'
Code
import com.almworks.jira.structure.api.StructureComponents
import com.almworks.jira.structure.api.permissions.PermissionLevel
import com.onresolve.scriptrunner.runner.customisers.PluginModule
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import org.apache.log4j.*;
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.util.thread.JiraThreadLocalUtil
Thread.start{
def jtlu = ComponentAccessor.getComponent(JiraThreadLocalUtil)
jtlu.preCall()
try {
@WithPlugin("com.almworks.jira.structure")
@PluginModule
StructureComponents structureComponents
IssueManager issueManager = ComponentAccessor.getIssueManager()
MutableIssue issue = issueManager.getIssueObject(event.getIssueId())
log.setLevel(Level.ALL)
log.info "Start\n"
log.debug("New thread start")
Thread.sleep(1000)
log.debug("New thread start2")
def String structureName="Test"
def structures = structureComponents.getStructureManager().getStructuresByName(structureName, PermissionLevel.VIEW);
log.info "Structures - "+structures+"\n"
def long structureId;
log.info "new structure finished in new thread\n"
}
finally {
jtlu.postCall(log)
}
}
Thread.sleep(3000)
If I move block below out of new thread block, than structures is empty
@WithPlugin("com.almworks.jira.structure")
@PluginModule
StructureComponents structureComponents
I've answered this question in our ServiceDesk, let me publish the answer here as well:
The reason for such behavior is that StructureManager.getStructuresByName returns a list of structures accessible to the current user at some permission level. The current user is kept in a thread-local variable. As the current user is not specified, the list is empty.
To find a user:
import com.atlassian.jira.user.util.UserManager @PluginModule UserManager userManager def user = userManager.getUserByKey("admin")
To execute code under a user authority:
def structures = StructureAuth.sudo(user, false, { structureComponents.getStructureManager().getStructuresByName(structureName, PermissionLevel.VIEW) });
Regards,
Egor Tasa
ALM Works
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.