import com.atlassian.crowd.embedded.api.User
import com.atlassian.jira.bc.issue.link.IssueLinkService
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.IssueManager
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.link.LinkCollection
import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.user.ApplicationUsers
import com.atlassian.plugin.PluginAccessor
// save debug messages
StringBuilder result = new StringBuilder();
// get an issue
IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class);
//
Issue issue = issueManager.getIssueObject("TEST-1");
// find TGE custom field
PluginAccessor pluginAccessor = ComponentAccessor.getPluginAccessor();
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager();
CustomField tgeCustomField = customFieldManager.getCustomFieldObjectByName("TGE_TEST");
Long tgeCustomFieldId = tgeCustomField.getIdAsLong();
// get current user
JiraAuthenticationContext jiraAuthenticationContext = ComponentAccessor.getOSGiComponentInstanceOfType(JiraAuthenticationContext.class);
Object userObject = jiraAuthenticationContext.getLoggedInUser();
ApplicationUser applicationUser = userObject instanceof ApplicationUser ? (ApplicationUser) userObject : ApplicationUsers.from(userObject);
User user = userObject instanceof ApplicationUser ? ((ApplicationUser) userObject).getDirectoryUser() : (User) userObject;
// read grid data from the original issue
Class dataManagerClass = pluginAccessor.getClassLoader().findClass("com.idalko.jira.plugins.igrid.api.data.TGEGridTableDataManager");
def tgeGridDataManager = ComponentAccessor.getOSGiComponentInstanceOfType(dataManagerClass);
List<Map<String, Object>> gridData = null;
try {
def callResult = tgeGridDataManager.readGridData(issue.getId(), tgeCustomFieldId, null, null, 0, 1000, user);
gridData = callResult.getValues();
result.append("Grid ID=" + tgeCustomFieldId + " content: " + gridData + "\n");
} catch (Exception e) {
result.append("Grid ID=" + tgeCustomFieldId + " data cannot be retrieved: " + e.getMessage() + "\n");
}
if (gridData != null) {
// get the list of grid columns
Class tgeConfigManagerClass = pluginAccessor.getClassLoader().findClass("com.idalko.jira.plugins.igrid.api.config.grid.TGEGridConfigManager");
def tgeConfigManager = ComponentAccessor.getOSGiComponentInstanceOfType(tgeConfigManagerClass);
def tgeGrid = tgeConfigManager.getGridConfigOrNull(tgeCustomFieldId);
def columnConfigs = tgeGrid.getColumnConfigs();
List<String> columnConfigNames = new LinkedList<String>();
for (def columnConfig : columnConfigs) {
String columnConfigName = columnConfig.getConfigName();
columnConfigNames.add(columnConfigName);
}
result.append("Grid ID=" + tgeCustomFieldId + " has following columns: " + columnConfigNames + "\n");
// transform fetched data
List<Map<String, Object>> gridDataToAdd = new LinkedList<Map<String, Object>>();
for (Map<String, Object> gridRow : gridData) {
Map<String, Object> rowToAdd = new HashMap<String, Object>();
for (String columnName : columnConfigNames) {
def columnValue = gridRow.get(columnName);
if (columnValue instanceof Map) {
columnValue = columnValue.get("value");
}
rowToAdd.put(columnName, columnValue);
}
gridDataToAdd.add(rowToAdd);
}
result.append("Transformed data to add: " + gridDataToAdd + "\n");
// find cloned issues by link reference "Cloners"
IssueLinkService issueLinkService = ComponentAccessor.getOSGiComponentInstanceOfType(IssueLinkService.class);
IssueLinkService.IssueLinkResult issueLinks = issueLinkService.getIssueLinks(userObject, issue);
LinkCollection linkCollection = issueLinks.getLinkCollection();
List<Issue> clonedIssues = linkCollection.getInwardIssues("Cloners");
result.append(clonedIssues.size() + " cloned issues found for issue " + issue.getKey() + "\n");
// add copied grid data to cloned issue
for (Issue clonedIssue : clonedIssues) {
try {
tgeGridDataManager.addRows(clonedIssue.getId(), tgeCustomFieldId, gridDataToAdd, user);
result.append("Grid rows are added to " + clonedIssue.getKey() + " issue.\n");
} catch (Exception e) {
result.append("Grids rows cannot be added due to error: " + e.getMessage() + "!\n");
}
}
}
println(result.toString());
return result.toString(); |