package org.jfrog.bamboo.util.version; import com.atlassian.bamboo.plan.Plan; import com.atlassian.bamboo.plan.PlanKeys; import com.atlassian.bamboo.repository.RepositoryException; import com.atlassian.bamboo.storage.StorageLocationService; import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext; import com.atlassian.spring.container.ContainerManager; import com.google.common.collect.Lists; import com.google.common.io.CharStreams; import com.google.common.io.Closeables; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.jfrog.bamboo.context.AbstractBuildContext; import org.jfrog.bamboo.release.action.ModuleVersionHolder; import org.jfrog.bamboo.release.action.ReleaseAndPromotionAction; import org.jfrog.bamboo.release.provider.ReleaseProvider; import org.jfrog.build.api.Build; import org.jfrog.build.api.Module; import org.jfrog.build.extractor.BuildInfoExtractorUtils; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import java.util.Map; import java.util.zip.GZIPInputStream; /** * @author Tomer Cohen */ public class MavenVersionHelper extends VersionHelper { private static final Logger log = Logger.getLogger(MavenVersionHelper.class); private final CapabilityContext capabilityContext; protected MavenVersionHelper(AbstractBuildContext context, CapabilityContext capabilityContext) { super(context); this.capabilityContext = capabilityContext; } @Override public List<ModuleVersionHolder> filterPropertiesForRelease(Plan plan, int latestBuildNumberWithBi) throws RepositoryException, IOException { List<ModuleVersionHolder> result = Lists.newArrayList(); final StorageLocationService storageLocationService = (StorageLocationService) ContainerManager.getComponent("storageLocationService"); File directory = storageLocationService.getDefaultArtifactDirectoryBuilder().getBuildDirectory(PlanKeys.getPlanResultKey(plan.getKey(), latestBuildNumberWithBi)); File buildInfoFile = new File(directory, "buildInfo/build-info.json.zip"); if (buildInfoFile.exists()) { InputStreamReader reader = null; try { reader = new InputStreamReader(new GZIPInputStream(new FileInputStream(buildInfoFile))); String buildInfoString = CharStreams.toString(reader); Build build = BuildInfoExtractorUtils.jsonStringToBuildInfo(buildInfoString); List<Module> modules = build.getModules(); for (Module module : modules) { String id = module.getId(); String[] split = StringUtils.split(id, ":"); ModuleVersionHolder holder = new ModuleVersionHolder(split[0] + ":" + split[1], split[2]); holder.setReleaseValue(calculateReleaseVersion(holder.getOriginalValue())); holder.setNextIntegValue(calculateNextVersion(holder.getReleaseValue())); result.add(holder); } } finally { Closeables.closeQuietly(reader); } } return result; } @Override public void addVersionFieldsToConfiguration(Map parameters, Map<String, String> configuration, String versionConfiguration, Map<String, String> taskConfiguration) { if (versionConfiguration.equals(ReleaseProvider.CFG_USE_EXISTING_VERSION)) { return; } if (versionConfiguration.equals(ReleaseProvider.CFG_ONE_VERSION)) { addGlobalVersion(parameters, configuration); } if (versionConfiguration.equals(ReleaseProvider.CFG_VERSION_PER_MODULE)) { addPerModuleVersioning(parameters, configuration); } } private void addPerModuleVersioning(Map parameters, Map<String, String> configuration) { int index = 0; String[] moduleKeys = (String[]) parameters.get(ReleaseAndPromotionAction.MODULE_KEY); if (moduleKeys != null) { for (String key : moduleKeys) { configuration.put(ReleaseAndPromotionAction.MODULE_KEY + "." + index, key); index++; } } index = 0; String[] originalValues = (String[]) parameters.get(ReleaseAndPromotionAction.CURRENT_VALUE_KEY); if (originalValues != null) { for (String key : originalValues) { configuration.put(ReleaseAndPromotionAction.CURRENT_VALUE_KEY + "." + index, key); index++; } } String[] nextIntegrationKeys = (String[]) parameters.get(ReleaseAndPromotionAction.NEXT_INTEG_KEY); if (nextIntegrationKeys != null) { for (index = 1; index < nextIntegrationKeys.length; index++) { String key = nextIntegrationKeys[index]; configuration.put(ReleaseAndPromotionAction.NEXT_INTEG_KEY + "." + (index - 1), key); } } String[] releaseValueKeys = (String[]) parameters.get(ReleaseAndPromotionAction.RELEASE_VALUE_KEY); if (releaseValueKeys != null) { for (index = 1; index < releaseValueKeys.length; index++) { String key = releaseValueKeys[index]; configuration.put(ReleaseAndPromotionAction.RELEASE_VALUE_KEY + "." + (index - 1), key); } } } private void addGlobalVersion(Map parameters, Map<String, String> configuration) { int index = 0; String[] moduleKeys = (String[]) parameters.get(ReleaseAndPromotionAction.MODULE_KEY); if (moduleKeys != null) { String[] releaseValueKeys = (String[]) parameters.get(ReleaseAndPromotionAction.RELEASE_VALUE_KEY); String[] nextIntegrationKeys = (String[]) parameters.get(ReleaseAndPromotionAction.NEXT_INTEG_KEY); for (String key : moduleKeys) { configuration.put(ReleaseAndPromotionAction.MODULE_KEY + "." + index, key); configuration.put(ReleaseAndPromotionAction.RELEASE_VALUE_KEY + "." + index, releaseValueKeys[0]); configuration.put(ReleaseAndPromotionAction.NEXT_INTEG_KEY + "." + index, nextIntegrationKeys[0]); index++; } } } }