Groovy examples
What’s new?
From version 3.3.1, the method getExportedFile
from the interface ExportResult
is deprecated. The method getExportedReturnFile
should be used instead. This new method returns the export configuration file directly, so it is no longer necessary to write the XML string to a file.
Synchronous export example version 3.3.1 or newer
This example has a simple approach to error handling.
synchronous-export-example.groovy (v 3.3.1 or newer)
// Required Imports
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.task.TaskProgressSink
import com.awnaba.projectconfigurator.operationsapi.ProjectConfigExporter
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.awnaba.projectconfigurator.operationsapi.ConfigOpFullProcessResult
import com.awnaba.projectconfigurator.operationsapi.ReturnCode
// The required annotation to enable access to the functionality provided by the plugin within our script.
@WithPlugin("com.awnaba.projectconfigurator.projectconfigurator")
// Get an instance of the export method
ProjectConfigExporter exporter = ComponentAccessor.getOSGiComponentInstanceOfType(ProjectConfigExporter)
try {
// Define the project keys to be exported in the set below
Set<String> projectKeys = ["DEMO", "OTHER"].toSet()
// Define the options for how you want to configure the export.
Map<String, String> exportOptions = [
"filterCFMode" : "filterUnusedCFExtended", // Options: none, filterUnusedCFExtended, all
"jiraFilterExportMode" : "none", // Options: none, global, projects, global-or-projects, shared, all
"jiraDashboardExportMode": "none", // Options: none, global, projects, global-or-projects, shared, all
"agileBoardsExportMode" : "none", // Options: none, projects, all
"fileName" : "fileName"
]
// Run the export synchronously using the options specified above
ConfigOpFullProcessResult export = exporter.exportSynchronous(exportOptions, projectKeys, TaskProgressSink.NULL_SINK);
def exportFinalResult = export.getFinalResult()
def exportCall = export.getCallResult()
// Check if the export completed successfully and if so generate the XML file
// If the export failed notify the user
if (exportFinalResult == null || exportFinalResult.getReturnCode() != ProjectConfigExporter.ReturnOpCode.SUCCESS) {
return "The export did not complete successfully: " + exportFinalResult == null ? exportCall.getReturnCode() : exportFinalResult.getReturnCode()
} else {
// If the export was successful notify the user where the file is stored
return "Export file created at " + exportFinalResult.getExportedResultFile().toPath()
}
} catch (Exception e) {
return "An unexpected error occurred. Please check your atlassian-jira.log for more information" + "<br/>" + e
}
Synchronous export example version 3.0.5 or newer
From 3.0.4 to 3.0.5: method getExportedXML
from FinalResult
object is now called getExportedFile
to unify interface ExportResult
. This example has a simple approach to error handling.
synchronous-export-example.groovy (v 3.0.5 or newer)
// Required Imports
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.task.TaskProgressSink
import com.awnaba.projectconfigurator.operationsapi.ProjectConfigExporter
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.awnaba.projectconfigurator.operationsapi.ConfigOpFullProcessResult
import com.awnaba.projectconfigurator.operationsapi.ReturnCode
// The required annotation to enable access to the functionality provided by the plugin within our script.
@WithPlugin("com.awnaba.projectconfigurator.projectconfigurator")
// Get an instance of the export method
ProjectConfigExporter exporter = ComponentAccessor.getOSGiComponentInstanceOfType(ProjectConfigExporter)
try {
// Define the project keys to be exported in the set below
Set<String> projectKeys = ["DEMO", "OTHER"].toSet()
// Define the options for how you want to configure the export.
Map<String, String> exportOptions = [
"filterCFMode" : "filterUnusedCFExtended", // Options: none, filterUnusedCFExtended, all
"jiraFilterExportMode" : "none", // Options: none, global, projects, global-or-projects, shared, all
"jiraDashboardExportMode": "none", // Options: none, global, projects, global-or-projects, shared, all
"agileBoardsExportMode" : "none" // Options: none, projects, all
]
// Run the export synchronously using the options specified above
ConfigOpFullProcessResult export = exporter.exportSynchronous(exportOptions, projectKeys, TaskProgressSink.NULL_SINK);
def exportFinalResult = export.getFinalResult()
def exportCall = export.getCallResult()
// Check if the export completed successfully and if so generate the XML file
// If the export failed notify the user
if (exportFinalResult == null || exportFinalResult.getReturnCode() != ProjectConfigExporter.ReturnOpCode.SUCCESS) {
return "The export did not complete successfully: " + exportFinalResult == null ? exportCall.getReturnCode() : exportFinalResult.getReturnCode()
} else {
// If the export was successful write the XML out to a file and notify the user where the file is stored
// Define the path and export filename to be used below
File exportFile = new File("/tmp/export.xml")
// Write the generated xml out to a configuration export XML file.
exportFile.write(exportFinalResult.getExportedFile().toString())
// Return the location to the created export file
return "Export file created at " + exportFile
}
} catch (Exception e) {
return "An unexpected error occurred. Please check your atlassian-jira.log for more information" + "<br/>" + e
}
Synchronous export example version 3.0.4 or older
This example has a single approach to error handling.
synchronous-export-example.groovy (v 3.0.4 or older)
// Required Imports
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.task.TaskProgressSink
import com.awnaba.projectconfigurator.operationsapi.ProjectConfigExporter
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
// The required annotation to enable access to the functionality provided by the plugin within our script.
@WithPlugin("com.awnaba.projectconfigurator.projectconfigurator")
// Get an instance of the export method
ProjectConfigExporter exporter = ComponentAccessor.getOSGiComponentInstanceOfType(ProjectConfigExporter)
try {
// Define the project keys to be exported in the set below
Set projectKeys = ["DEMO", "DEMO1"]
// Define the options for how you want to configure the export.
Map<String, String> exportOptions = [
"filterCFMode" : "filterUnusedCFExtended", // Options: none, filterUnusedCFExtended, all
"jiraFilterExportMode" : "none", // Options: none, global, projects, global-or-projects, shared, all
"jiraDashboardExportMode": "none", // Options: none, global, projects, global-or-projects, shared, all
"agileBoardsExportMode" : "none" // Options: none, projects, all
]
// Run the export synchronously using the options specified above
def exportFinalResult = exporter.exportSynchronous(exportOptions, projectKeys, TaskProgressSink.NULL_SINK).getFinalResult()
// Check if the export completed successfully and if so generate the XML file
// If the export failed notify the user
if (exportFinalResult == null || exportFinalResult.getReturnCode() != ProjectConfigExporter.ReturnOpCode.SUCCESS) {
return "The export did not complete successfully"
} else {
// If the export was successful write the XML out to a file and notify the user where the file is stored
// Define the path and export filename to be used below
File exportFile = new File("/tmp/export.xml")
// Write the generated xml out to a configuration export XML file.
exportFile.write(exportFinalResult.getExportedXML())
// Return the location to the created export file
return "Export file created at " + exportFile
}
} catch (Exception e) {
return "An unexpected error occurred. Please check your atlassian-jira.log for more information" + "<br/>" + e
}
Synchronous import example
synchronous-import-example.groovy (all versions)
// Required Imports
import com.onresolve.scriptrunner.runner.customisers.WithPlugin
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.task.TaskProgressSink
import com.awnaba.projectconfigurator.operationsapi.ProjectConfigImporter
import com.awnaba.projectconfigurator.operationsapi.ConfigOpFullProcessResult
import com.awnaba.projectconfigurator.operationsapi.ConfigImportResult
import com.awnaba.projectconfigurator.operationsapi.ConfigOpCallResult
import java.io.Serializable;
// The required annotation to enable access to the functionality provided by the plugin within our script
@WithPlugin("com.awnaba.projectconfigurator.projectconfigurator")
// Get an instance of the import method
def importer = ComponentAccessor.getOSGiComponentInstanceOfType(ProjectConfigImporter.class)
// Specify the path to the export file
def importFile = "/tmp/import.xml"
// Perform the import if the file is valid
try {
// Extract the contents of the export file to a String that the import method can use
def fileContents = new File(importFile).text
String[] skipObjects = [new String()] as String[]
// Define the options for how you want to configure the export.
Map<String, Serializable> importOptions = new HashMap<String, Serializable>();
importOptions.put(ProjectConfigImporter.IS_SIMULATION, false)
importOptions.put(ProjectConfigImporter.CREATE_EXTRA_PROJECTS, false)
importOptions.put(ProjectConfigImporter.SMART_CF_CONTEXTS, false)
importOptions.put(ProjectConfigImporter.PUBLISH_DRAFTS, true)
importOptions.put(ProjectConfigImporter.SKIP_OBJECTS, skipObjects)
// Construct a new ConfigOpFullProcessResult object which will store the results of the configuration import
// Requires the following parameters of XML config, applyChanges,createExtraProjects,smartCFContexts,publishDrafts,continueOnDashboardFilterErrors,doNotLoadObjects as well as an instance of the TaskProgressSink object.
def importResult = importer.importConfigurationSynchronously(fileContents.toString(), importOptions, TaskProgressSink.NULL_SINK) as ConfigOpFullProcessResult<ProjectConfigImporter.ReturnCallCode, ? extends ConfigImportResult>
// Check if the import completed successfully and if so display the results
def callResult = importResult.getCallResult() as ConfigOpCallResult;
def callReturnCode = callResult.getReturnCode()
// If the import failed notify the user
// Possible return codes that can be checked = IMPORT_STARTED, NOT_LOGGED_IN, UNAUTHORIZED, UNLICENSED, ERROR_READING_CONFIG_FILE, IMPORT_ALREADY_RUNNING
if (callReturnCode!=null && callReturnCode != ProjectConfigImporter.ReturnCallCode.IMPORT_STARTED) {
return "The import did not launch successfully. Launching failed with a return code of " + callReturnCode.toString()
// If the import was successful display the results
} else {
// get the results of the import
ProjectConfigImporter.ReturnOpCode opCode = importResult.getFinalResult().getReturnCode()
String message = opCode==ProjectConfigImporter.ReturnOpCode.SUCCESS ? importResult.getFinalResult().getSuccessMessage() : "Import failed"
return opCode.name() + "<br/>" + message + "<br/><br/>" + importResult.getFinalResult().getLoadTrace().replaceAll("\n", "<br/>");
}
// If an invalid file is found print an exception on screen
} catch (FileNotFoundException e) {
return "You must provide a valid file: " + "<br/>" + e
}