Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
breakoutModewide
languagegroovy
import org.slf4j.*;
import com.deniz.jira.versioning.*;
import com.deniz.jira.versioning.bundles.*;
import com.deniz.jira.versioning.bundles.events.*;
import com.atlassian.jira.bc.project.component.*;
import com.atlassian.jira.project.version.*;
import com.atlassian.jira.project.*;
import com.atlassian.jira.component.ComponentAccessor;

//please enable logging for package "com.deniz.jira.versioning.scripting" from Administration/System/Logging and Profiling
Logger log = LoggerFactory.getLogger(com.deniz.jira.versioning.scripting.ScriptingService.class);
    
def bundleService = ComponentAccessor.getOSGiComponentInstanceOfType(BundleService.class);
def projectManager = ComponentAccessor.getComponent(ProjectManager.class);
def versionManager = ComponentAccessor.getComponent(VersionManager.class);
def componentManager = ComponentAccessor.getComponent(ProjectComponentManager.class);

def targetProjectKeys = ["ERP", "CLG"];
def event = parameters.event;
def project = parameters.project;

targetProjectKeys.each { targetProjectKey ->
  log.debug("Checking for project:{}", targetProjectKey);
  
  def targetProject = projectManager.getProjectByCurrentKey(targetProjectKey);
  if (event instanceof BundleCreatedEvent) {
    def sourceBundle = event.getBundle();
    log.debug("a new bundle is created:{}", sourceBundle);
    BundleImp bundle = new BundleImp(sourceBundle);
    bundle.id = -1;
    bundle.projectId = targetProject.id;

    def sourceVersion = versionManager.getVersion(bundle.getVersionId());
    if (sourceVersion != null) {
      //version is optional for bundles.
      def targetProjectVersions = versionManager.getVersions(targetProject);
      def targetVersion = targetProjectVersions.find {v -> v.name.equals(sourceVersion.name)};
      if (targetVersion == null) {
        targetVersion = copyVersion(versionManager, targetProject, sourceVersion);
      }
      bundle.versionId = targetVersion.id;
    }
    bundleService.addBundle(bundle, false);
  } else if (event instanceof BundleContentAddedEvent) {
    def sourceBundleContent = event.bundleContent;
    log.debug("Component/Version is aded to bundle:{}", sourceBundleContent.bundleId);
    
    def sourceBundle = bundleService.getBundle(sourceBundleContent.bundleId);
    def bundlesWithSameName = bundleService.getBundles(sourceBundle.bundleName);
    targetBundle = bundlesWithSameName.find {b -> b.projectId == targetProject.id};
    if (targetBundle) {
      log.debug("Corresponding bundle in project {} is {}", targetProject.key, targetBundle.id);
      def sourceComponentVersion = versionManager.getVersion(sourceBundleContent.versionId);
      //clone version if necessary
      def targetProjectVersions = versionManager.getVersions(targetProject);
      def targetComponentVersion = targetProjectVersions.find {v -> v.name.equals(sourceComponentVersion.name)};
      if (targetComponentVersion == null) {
        targetComponentVersion = copyVersion(versionManager, targetProject, sourceComponentVersion);
      }
      //clone project if necessary
      def sourceComponent = componentManager.getProjectComponent(sourceBundleContent.componentId);
      def targetComponent = componentManager.findByComponentName(targetProject.id, sourceComponent.name);  
      if (targetComponent == null) {
        targetComponent = copyComponent(componentManager, targetProject, sourceComponent);
      }
      def bundleContent = new BundleContentImp();
      bundleContent.versionId = targetComponentVersion.id;
      bundleContent.componentId = targetComponent.id;
      bundleContent.bundleId = targetBundle.id;
      bundleService.addContentToBundle(bundleContent);
    }
  }
}

def copyVersion(versionManager, targetProject, sourceVersion) {
  log.debug("Creating target version '{}' in target project '{}'", sourceVersion.name, targetProject.key);
  return versionManager.createVersion(
    sourceVersion.name,
    sourceVersion.startDate,
    sourceVersion.releaseDate,
    sourceVersion.description,
    targetProject.id,
    null, //sequence
    sourceVersion.released
  );
}

def copyComponent(componentManager, targetProject, sourceComponent) {
  log.debug("Creating target component '{}' in target project '{}'", sourceComponent.name, targetProject.key);
  return componentManager.create(
    sourceComponent.name,
    sourceComponent.description,
    sourceComponent.lead,
    sourceComponent.assigneeType,
    targetProject.id
  );
}

...