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.spring.container.ContainerManager;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Closeables;
import org.apache.commons.lang.StringUtils;
import org.jfrog.bamboo.context.AbstractBuildContext;
import org.jfrog.bamboo.context.GradleBuildContext;
import org.jfrog.bamboo.release.action.ModuleVersionHolder;
import org.jfrog.bamboo.release.action.ReleaseAndPromotionAction;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/**
* @author Tomer Cohen
*/
public class GradleVersionHelper extends VersionHelper {
protected GradleVersionHelper(AbstractBuildContext context) {
super(context);
}
@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 gradlePropertiesFile = new File(directory, "gradle/gradle.properties");
if (gradlePropertiesFile.exists()) {
Properties props = new Properties();
FileInputStream stream = null;
try {
stream = new FileInputStream(gradlePropertiesFile);
props.load(stream);
} finally {
Closeables.closeQuietly(stream);
}
result = context.releaseManagementContext.filterPropsForRelease(Maps.fromProperties(props));
}
for (ModuleVersionHolder holder : result) {
holder.setReleaseValue(calculateReleaseVersion(holder.getOriginalValue()));
if (!holder.isReleaseProp()) {
holder.setNextIntegValue(calculateNextVersion(holder.getReleaseValue()));
}
}
return result;
}
@Override
public void addVersionFieldsToConfiguration(Map parameters, Map<String, String> configuration,
String useCurrentVersion, Map<String, String> taskConfiguration) {
if (Boolean.valueOf(useCurrentVersion)) {
return;
}
GradleBuildContext buildContext = new GradleBuildContext(taskConfiguration);
String releaseProps = buildContext.getReleaseProps();
String[] split = StringUtils.split(releaseProps, ", ");
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);
configuration.put(ReleaseAndPromotionAction.RELEASE_PROP_KEY + "." + index,
String.valueOf(isReleaseProp(split, 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++;
}
}
index = 0;
String[] nextIntegrationKeys = (String[]) parameters.get(ReleaseAndPromotionAction.NEXT_INTEG_KEY);
if (nextIntegrationKeys != null) {
for (String key : nextIntegrationKeys) {
configuration.put(ReleaseAndPromotionAction.NEXT_INTEG_KEY + "." + index, key);
configuration.put(ReleaseAndPromotionAction.RELEASE_PROP_KEY + "." + index, "false");
index++;
}
}
index = 0;
String[] releaseValueKeys = (String[]) parameters.get(ReleaseAndPromotionAction.RELEASE_VALUE_KEY);
if (releaseValueKeys != null) {
for (String key : releaseValueKeys) {
configuration.put(ReleaseAndPromotionAction.RELEASE_VALUE_KEY + "." + index, key);
index++;
}
}
}
private boolean isReleaseProp(String[] releaseProps, String prop) {
for (String releaseProp : releaseProps) {
if (StringUtils.equals(releaseProp, prop)) {
return true;
}
}
return false;
}
}