Create
cancel
Showing results for 
Search instead for 
Did you mean: 
Sign up Log in

Table Grid Next Generation - Scrip runner Cloud Migration Script Error

Sami Ahmed Shaik
Contributor
November 25, 2023

Hello there,

We are utilizing the "Table Grid Next Generation" on our server and are in the process of validating the migration of our app's data to the cloud. The vendor has provided us with a sample script, but every time we attempt to execute it, we encounter an error.

Please consider the following script and let us know how to fix the error every time we face while executing the script.

 

Script:

import groovy.json.JsonSlurper;
import groovy.json.StreamingJsonBuilder;
import com.atlassian.jira.issue.CustomFieldManager;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.IssueManager;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.MutableIssue;
import com.atlassian.jira.user.util.UserManager;
import com.atlassian.jira.bc.issue.search.SearchService;
import com.atlassian.jira.jql.parser.JqlQueryParser;
import com.atlassian.jira.web.bean.PagerFilter;
import org.apache.commons.codec.binary.Base64;
import groovy.json.*;


////////////////////////////////////////////
// ***** CHANGE VARIABLES HERE *****
////////////////////////////////////////////

// Authorization
String authorizationStringServer = "xxxxxxxxx"
String authorizationStringCloud = "xxxxxxxx="
String authorizationStringCloudAccountID = "xxxxxxxx"
// Grid IDs
String gridCustomFieldIdServer = 12746
String gridIdCloud = "xxxxxxxx"
//Jira BASE URL
String jiraBaseURLServer = "http://jira.abctest.com"
String jqlQuery = 'visa-request is not empty'

////////////////////////////////////////////
// ***** CHANGE VARIABLES HERE *****
////////////////////////////////////////////

IssueManager issueManager = ComponentAccessor.getOSGiComponentInstanceOfType(IssueManager.class);
Collection<Long> ids = issueManager.getIssueIdsForProject(122504); // Get all issue IDs by the Project ID
Collection<Issue> issues = issueManager.getIssueObjects(ids);

StringBuilder responses = new StringBuilder()

def searchService = ComponentAccessor.getComponent(SearchService)
def loggedInUser = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def queryParser = ComponentAccessor.getComponent(JqlQueryParser)
def sb = new StringBuffer()

//your query goes here
def query = queryParser.parseQuery(jqlQuery)

//gets results of query
def search = searchService.search(loggedInUser, query, PagerFilter.getUnlimitedFilter())

//iterate over each returned issue
Collection<Issue> issues = search.results.key


for (String issue : issues){

String issueKey = issue

//String issueKey = issue.getKey()

def baseURL = jiraBaseURLServer + "/rest/idalko-grid/1.0/api/grid/" + gridCustomFieldIdServer + "/issue/" + issueKey;
def baseURL2 = "https://databuckets.net/rest/tgc/api/v1/grids/" + gridIdCloud + "/issue/" + issueKey;
def instanceName = "----"

//Getting the Grid information from the Data Center Jira instance
URL url;
url = new URL(baseURL);

URLConnection connection = url.openConnection();
connection.setRequestMethod("GET")
connection.setRequestProperty("Authorization", authorizationStringServer)
connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8")
connection.connect();

String serverData = connection.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText(serverData)

Long gridRowsinCloud = -1; //create variable with invalid value just to signal exception and skip condition if failed

try {

// Geting Grid info from Cloud to see if it was already uploaded (avoid duplicates)

URL url3;
url3 = new URL(baseURL2);
URLConnection connection3 = url3.openConnection();
connection3.setRequestMethod("GET")
connection3.doOutput = true
connection3.setRequestProperty("Authorization", authorizationStringCloud)
connection3.connect();

responseCode = connection3.getResponseCode()

if(responseCode != 200){
responseMessage = connection3.getErrorStream().text;
}else{
String cloudData = connection3.getInputStream().getText();
def jsonSlurperAccount = new JsonSlurper()
def cloudjson = jsonSlurperAccount.parseText(cloudData)
//Long gridRowsinServer = object.rows.size();
gridRowsinCloud = cloudjson.rows.size(); //if it works, change value of variable
}


} catch(java.io.IOException ex) {

responses.append("!! exception !!");

}

// check if data was already uploaded
if(gridRowsinCloud == 0){
//if(gridRowsinServer > 0 && gridRowsinCloud == 0){

// Formatting the output so that it fits the POST request body formatting requirements
object.remove("customFieldId") //Removing Grid ID since does not need to be passed in the request body
object.rows.each { e -> //Going through all of the rows from the response


e.remove("order") // Removing order index
e.remove("rowId") // Removing Row ID since it will be automatically assigned
e.columns.each{ key, value -> // Unpacking the "columns" section into the previous level of JSON structure

if(value != null || !value.toString().equals("{}") || value != ""){

if(value instanceof String){
e.put(key, value)
}else if(value instanceof org.apache.groovy.json.internal.LazyMap){

if(value.keySet().contains("username")){

// Get user email to match with user in Cloud
def userManager = ComponentAccessor.getUserManager()
def user = userManager.getUserByName(value.username)

if(user != null){
String email = user.getEmailAddress()

// Getting new user info from Cloud based on email
URL urlAccountID
urlAccountID = new URL("https://${instanceName}.atlassian.net/rest/api/3/user/search?query=" + email.replace(" ","%20"));
URLConnection connection4 = urlAccountID.openConnection();
connection4.setRequestMethod("GET")
connection4.setRequestProperty("Authorization", authorizationStringCloudAccountID)
connection4.doOutput = true
connection4.connect();

String cloudData1 = connection4.getInputStream().getText()
def jsonSlurperAccount1 = new JsonSlurper()
def objectAccount1 = jsonSlurperAccount1.parseText(cloudData1)

if(objectAccount1[0] != null){
e.put(key, jsonSlurperAccount1.parseText('{"accountId":"' + objectAccount1[0].accountId+'"}'))
}
}
}
if(value.keySet().contains("label")){
e.put(key, value.label)
}
}else if(value.toString().length() != 2){
e.put(key, value.value)
}
}
}
e.remove("columns") // Removing the packed "columns" section as it is redundant and breaks the formatting
e.remove("Item Number") // Remove SEQUENCE type column from the data load
}


try {

// Uploading the grid data to the Cloud
URL url2;
url2 = new URL(baseURL2);
URLConnection connection2 = url2.openConnection();
connection2.setRequestMethod("POST")
connection2.doOutput = true
connection2.setRequestProperty("Authorization", authorizationStringCloud)
connection2.setRequestProperty("Content-Type", "application/json;charset=UTF-8")
connection2.outputStream.withWriter("UTF-8") { new StreamingJsonBuilder(it, object) }
connection2.connect();

responseCode = connection2.getResponseCode()

if(responseCode != 201){
responseMessage = connection2.getErrorStream().text + JsonOutput.toJson(object);
}else{
responseMessage = connection2.getResponseMessage();
}

responses.append( " || IssueKey: " + issueKey +
" ResponseCode:" + responseCode +
" ResponseMessage:" + responseMessage)

} catch(java.io.IOException ex) {

responses.append("!! exception !!");

}

responses.append("\n")

}
}

return responses

 

Error:

The script could not be compiled: <pre>org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script3.groovy: 54: The current scope already contains a variable of the name issues @ line 54, column 19. Collection<Issue> issues = search.results.key ^ 1 error </pre>.

 

 

0 answers

Suggest an answer

Log in or Sign up to answer
DEPLOYMENT TYPE
CLOUD
PRODUCT PLAN
PREMIUM
PERMISSIONS LEVEL
Product Admin
TAGS
AUG Leaders

Upcoming Jira Events