diff --git a/pom.xml b/pom.xml index 40e298a2..1d0a9e88 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ - 9.6.0 + 10.2.0 ${bamboo.version} ${project.groupId}.${project.artifactId} @@ -36,14 +36,15 @@ version and not as a key regarding the Atlassian plugin descriptor --> ${project.groupId}.${project.artifactId}-${project.version} UTF-8 - 11 + 17 ${java.version} ${java.version} true - 2.41.14 + 2.41.22 4.33.13 - 8.11.4 + 9.1.4 + 5.0.2 @@ -113,6 +114,7 @@ commons-codec commons-codec 1.16.0 + test javax.servlet @@ -170,6 +172,10 @@ guava com.google.guava + + com.google.code.findbugs + jsr305 + @@ -209,6 +215,10 @@ com.google.guava guava + + com.google.code.findbugs + jsr305 + @@ -221,6 +231,10 @@ org.slf4j slf4j-simple + + com.google.code.findbugs + jsr305 + @@ -241,6 +255,14 @@ org.slf4j slf4j-simple + + com.google.code.findbugs + jsr305 + + + guava + com.google.guava + @@ -269,18 +291,40 @@ org.codehaus.groovy groovy-all + + com.google.code.findbugs + jsr305 + + + guava + com.google.guava + + + org.jfrog.artifactory.client + artifactory-java-client-api + 2.17.0 + test + com.fasterxml.jackson.core jackson-core - 2.14.1 + 2.17.2 + provided com.fasterxml.jackson.core jackson-databind - 2.14.1 + 2.17.2 + provided + + + com.fasterxml.jackson.core + jackson-annotations + 2.17.2 + provided @@ -306,6 +350,10 @@ org.slf4j slf4j-log4j12 + + com.google.code.findbugs + jsr305 + @@ -344,6 +392,10 @@ com.tek42.perforce p4java + + com.google.code.findbugs + jsr305 + @@ -357,6 +409,10 @@ com.tek42.perforce p4java + + com.google.code.findbugs + jsr305 + @@ -445,6 +501,12 @@ atlassian-plugins-osgi 7.1.1 provided + + + com.google.code.findbugs + jsr305 + + @@ -455,9 +517,9 @@ com.atlassian.plugin - atlassian-spring-scanner-runtime - 1.2.13 - runtime + atlassian-spring-scanner-annotation + ${atlassian.spring.scanner.version} + provided @@ -493,7 +555,6 @@ ${bamboo.version} ${bamboo.data.version} - true ${basedir}/src/test/resources/bamboo-home.zip -Xms512m -Xmx1024m -server -Datlassian.bamboo.build.disable=true -Datlassian.bamboo.branch.detection.disable=true @@ -502,7 +563,19 @@ the active branch ${git.branch} - false + + ${atlassian.plugin.key} + ${atlassian.plugin.key} + * + + + + !com.opensymphony.*, + !org.objectweb.asm.*, + *;resolution:="optional", + + true + bamboo @@ -536,7 +609,7 @@ com.atlassian.plugin atlassian-spring-scanner-maven-plugin - 1.2.13 + ${atlassian.spring.scanner.version} @@ -688,7 +761,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.13.0 ${java.version} ${java.version} diff --git a/src/main/java/org/jfrog/bamboo/admin/ArtifactoryConfigServlet.java b/src/main/java/org/jfrog/bamboo/admin/ArtifactoryConfigServlet.java index 354b5d6a..371360f2 100644 --- a/src/main/java/org/jfrog/bamboo/admin/ArtifactoryConfigServlet.java +++ b/src/main/java/org/jfrog/bamboo/admin/ArtifactoryConfigServlet.java @@ -16,6 +16,7 @@ package org.jfrog.bamboo.admin; +import com.atlassian.plugin.spring.scanner.annotation.imports.BambooImport; import com.atlassian.sal.api.user.UserManager; import com.atlassian.sal.api.user.UserProfile; import org.apache.commons.httpclient.HttpStatus; @@ -26,6 +27,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; +import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -44,9 +46,10 @@ public class ArtifactoryConfigServlet extends HttpServlet { private static final Logger log = LogManager.getLogger(ArtifactoryConfigServlet.class); private ServerConfigManager serverConfigManager; - private final UserManager userManager; + private UserManager userManager; - public ArtifactoryConfigServlet(ServerConfigManager serverConfigManager, UserManager userManager) { + @Inject + public ArtifactoryConfigServlet(@BambooImport UserManager userManager, ServerConfigManager serverConfigManager) { this.userManager = userManager; this.serverConfigManager = serverConfigManager; } diff --git a/src/main/java/org/jfrog/bamboo/admin/ArtifactoryServerConfigAction.java b/src/main/java/org/jfrog/bamboo/admin/ArtifactoryServerConfigAction.java index 3f82b62f..1d16d3c9 100644 --- a/src/main/java/org/jfrog/bamboo/admin/ArtifactoryServerConfigAction.java +++ b/src/main/java/org/jfrog/bamboo/admin/ArtifactoryServerConfigAction.java @@ -28,6 +28,7 @@ import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; +import javax.inject.Inject; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -48,15 +49,17 @@ public class ArtifactoryServerConfigAction extends BambooActionSupport implement private String password; private int timeout; private String isSendTest; + @Inject + private ServerConfigManager serverConfigManager; - - private transient ServerConfigManager serverConfigManager; - - public ArtifactoryServerConfigAction(ServerConfigManager serverConfigManager) { - this.serverConfigManager = serverConfigManager; + public ArtifactoryServerConfigAction() { mode = "add"; timeout = 300; - } + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } @Override public void validate() { @@ -80,6 +83,10 @@ public String doAdd() throws Exception { return INPUT; } + public String create() throws Exception { + return doCreate(); + } + public String doCreate() throws Exception { if (isTesting()) { testConnection(); @@ -91,15 +98,22 @@ public String doCreate() throws Exception { return SUCCESS; } - public String doEdit() throws Exception { + public String edit() throws IllegalArgumentException { + return doEdit(); + } + + public String doEdit() throws IllegalArgumentException { ServerConfig serverConfig = serverConfigManager.getServerConfigById(serverId); if (serverConfig == null) { throw new IllegalArgumentException("Could not find Artifactory server configuration by the ID " + serverId); } updateFieldsFromServerConfig(serverConfig); return INPUT; - } + } + public String update() throws Exception { + return doUpdate(); + } public String doUpdate() throws Exception { // Decrypt password from UI, if encrypted. @@ -114,6 +128,10 @@ public String doUpdate() throws Exception { return SUCCESS; } + public String delete() throws Exception { + return doDelete(); + } + public String doDelete() throws Exception { serverConfigManager.deleteServerConfiguration(getServerId()); return SUCCESS; diff --git a/src/main/java/org/jfrog/bamboo/admin/BuildServlet.java b/src/main/java/org/jfrog/bamboo/admin/BuildServlet.java index 849fbf6b..260ac5b8 100644 --- a/src/main/java/org/jfrog/bamboo/admin/BuildServlet.java +++ b/src/main/java/org/jfrog/bamboo/admin/BuildServlet.java @@ -28,6 +28,7 @@ import org.apache.logging.log4j.Logger; import org.jfrog.bamboo.util.ConstantValues; +import javax.inject.Inject; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -43,11 +44,16 @@ public class BuildServlet extends HttpServlet { private static final Logger log = LogManager.getLogger(BuildServlet.class); + @Inject private PlanManager planManager; - private final UserManager userManager; + @Inject + private UserManager userManager; - public BuildServlet(UserManager userManager) { - planManager = (PlanManager) ContainerManager.getComponent("planManager"); + public void setPlanManager(PlanManager planManager) { + this.planManager = planManager; + } + + public void setUserManager(UserManager userManager) { this.userManager = userManager; } diff --git a/src/main/java/org/jfrog/bamboo/admin/ExistingArtifactoryServerAction.java b/src/main/java/org/jfrog/bamboo/admin/ExistingArtifactoryServerAction.java index b609bdd3..07494405 100644 --- a/src/main/java/org/jfrog/bamboo/admin/ExistingArtifactoryServerAction.java +++ b/src/main/java/org/jfrog/bamboo/admin/ExistingArtifactoryServerAction.java @@ -20,6 +20,7 @@ import com.atlassian.bamboo.ww2.actions.admin.user.AbstractEntityPagerSupport; import com.atlassian.bamboo.ww2.aware.permissions.GlobalAdminSecurityAware; +import javax.inject.Inject; import java.util.List; /** @@ -29,11 +30,12 @@ */ public class ExistingArtifactoryServerAction extends AbstractEntityPagerSupport implements GlobalAdminSecurityAware { - private ServerConfigManager serverConfigManager; + @Inject + private ServerConfigManager serverConfigManager; - public ExistingArtifactoryServerAction(ServerConfigManager serverConfigManager) { - this.serverConfigManager = serverConfigManager; - } + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } public String doBrowse() throws Exception { return super.execute(); diff --git a/src/main/java/org/jfrog/bamboo/admin/ServerConfigManager.java b/src/main/java/org/jfrog/bamboo/admin/ServerConfigManager.java index 79ec1d7d..6867b43d 100644 --- a/src/main/java/org/jfrog/bamboo/admin/ServerConfigManager.java +++ b/src/main/java/org/jfrog/bamboo/admin/ServerConfigManager.java @@ -16,376 +16,37 @@ package org.jfrog.bamboo.admin; -import com.atlassian.bamboo.bandana.BambooBandanaContext; -import com.atlassian.bamboo.bandana.PlanAwareBandanaContext; -import com.atlassian.bamboo.variable.CustomVariableContext; -import com.atlassian.bandana.BandanaManager; -import com.atlassian.spring.container.ContainerManager; -import com.google.common.collect.Lists; -import org.apache.commons.lang.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; -import org.jetbrains.annotations.Nullable; -import org.jfrog.bamboo.security.EncryptionHelper; -import org.jfrog.bamboo.util.BuildInfoLog; -import org.jfrog.bamboo.util.TaskUtils; -import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; -import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; -import org.springframework.beans.factory.annotation.Autowired; +import com.fasterxml.jackson.core.JsonProcessingException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.Serializable; import java.io.UnsupportedEncodingException; -import java.lang.reflect.Field; -import java.nio.charset.StandardCharsets; -import java.util.Base64; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicLong; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; /** * Global Artifactory server configuration manager * * @author Noam Y. Tenne */ -public class ServerConfigManager implements Serializable { - - private transient Logger log = LogManager.getLogger(ServerConfigManager.class); - - private static final String ARTIFACTORY_CONFIG_KEY = "org.jfrog.bamboo.server.configurations.v2"; - private final List configuredServers = new CopyOnWriteArrayList<>(); - private BandanaManager bandanaManager = null; - private AtomicLong nextAvailableId = new AtomicLong(0); - private CustomVariableContext customVariableContext; - - - public List getAllServerConfigs() { - return Lists.newArrayList(configuredServers); - } - - public ServerConfig getServerConfigById(long id) { - for (ServerConfig configuredServer : configuredServers) { - if (configuredServer.getId() == id) { - return configuredServer; - } - } - - return null; - } - - public static ServerConfigManager getInstance() { - ServerConfigManager serverConfigManager = new ServerConfigManager(); - ContainerManager.autowireComponent(serverConfigManager); - return serverConfigManager; - } - - public void addServerConfiguration(ServerConfig serverConfig) { - serverConfig.setId(nextAvailableId.getAndIncrement()); - configuredServers.add(serverConfig); - try { - persist(); - } catch (IllegalAccessException | UnsupportedEncodingException e) { - log.error("Could not add Artifactory configuration.", e); - } - } - - public void deleteServerConfiguration(final long id) { - for (ServerConfig configuredServer : configuredServers) { - if (configuredServer.getId() == id) { - configuredServers.remove(configuredServer); - try { - persist(); - } catch (IllegalAccessException | UnsupportedEncodingException e) { - log.error("Could not delete Artifactory configuration.", e); - } - break; - } - } - } - - public void updateServerConfiguration(ServerConfig updated) { - for (ServerConfig configuredServer : configuredServers) { - if (configuredServer.getId() == updated.getId()) { - configuredServer.setUrl(updated.getUrl()); - configuredServer.setUsername(updated.getUsername()); - configuredServer.setPassword(updated.getPassword()); - configuredServer.setTimeout(updated.getTimeout()); - try { - persist(); - } catch (IllegalAccessException | UnsupportedEncodingException e) { - log.error("Could not update Artifactory configuration.", e); - } - break; - } - } - } - - @Autowired - public void setBandanaManager(BandanaManager bandanaManager) { - this.bandanaManager = bandanaManager; - try { - setArtifactoryServers(bandanaManager); - } catch (InstantiationException | IllegalAccessException | IOException e) { - log.error("Could not load Artifactory configuration.", e); - } - } - - private void setArtifactoryServers(BandanaManager bandanaManager) - throws IOException, InstantiationException, IllegalAccessException { - - String existingArtifactoryConfig = (String) bandanaManager.getValue(PlanAwareBandanaContext.GLOBAL_CONTEXT, ARTIFACTORY_CONFIG_KEY); - if (StringUtils.isNotBlank(existingArtifactoryConfig)) { - List serverConfigList = getServersFromXml(existingArtifactoryConfig); - for (Object serverConfig : serverConfigList) { - // Because of some class loader issues we had to get a workaround, - // we serialize and deserialize the serverConfig object. - ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); - String json = ow.writeValueAsString(serverConfig); - ServerConfig tempServerConfig = new ObjectMapper().readValue(json, ServerConfig.class); - - if (nextAvailableId.get() <= tempServerConfig.getId()) { - nextAvailableId.set(tempServerConfig.getId() + 1); - } - - configuredServers.add(new ServerConfig(tempServerConfig.getId(), tempServerConfig.getUrl(), tempServerConfig.getUsername(), - EncryptionHelper.decrypt(tempServerConfig.getPassword()), tempServerConfig.getTimeout())); - } - } - } - - public List getDeployableRepos(long serverId) { - return getDeployableRepos(serverId, null, null); - } - - public List getDeployableRepos(long serverId, HttpServletRequest req, HttpServletResponse resp) { - ServerConfig serverConfig = getServerConfigById(serverId); - if (serverConfig == null) { - log.error("Error while retrieving target repository list: Could not find Artifactory server " + - "configuration by the ID " + serverId); - return Lists.newArrayList(); - } - ArtifactoryManagerBuilder managerBuilder; - - String serverUrl = substituteVariables(serverConfig.getUrl()); - String username = null; - String password = null; - if (req != null) { - username = req.getParameter("user"); - password = req.getParameter("password"); - } - if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { - password = EncryptionHelper.decryptIfNeeded(password); - } else { - username = serverConfig.getUsername(); - password = serverConfig.getPassword(); - } - username = substituteVariables(username); - password = substituteVariables(password); - - if (StringUtils.isBlank(username)) { - managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, - "", "", serverConfig.getTimeout()), new BuildInfoLog(log)); - } else { - managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, username, - password, serverConfig.getTimeout()), new BuildInfoLog(log)); - } - - try (ArtifactoryManager client = managerBuilder.build()) { - return client.getLocalRepositoriesKeys(); - } catch (IOException ioe) { - log.error("Error while retrieving target repository list from: " + serverUrl, ioe); - try { - if (resp != null && ioe.getMessage().contains("401")) - resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); - if (resp != null && ioe.getMessage().contains("404")) - resp.sendError(HttpServletResponse.SC_NOT_FOUND); - } catch (IOException e) { - log.error("Error while sending error to response", e); - } - - return Lists.newArrayList(); - } - } - - /** - * Substitute (replace) Bamboo variable names with their defined values - */ - public String substituteVariables(String s) { - return s != null ? customVariableContext.substituteString(s) : null; - } - - public List getResolvingRepos(long serverId, HttpServletRequest req, HttpServletResponse resp) { - ServerConfig serverConfig = getServerConfigById(serverId); - if (serverConfig == null) { - log.error("Error while retrieving resolving repository list: Could not find Artifactory server " + - "configuration by the ID " + serverId); - return Lists.newArrayList(); - } - ArtifactoryManagerBuilder managerBuilder; - - String serverUrl = substituteVariables(serverConfig.getUrl()); - String username; - String password; - if (StringUtils.isNotBlank(req.getParameter("user")) && StringUtils.isNotBlank(req.getParameter("password"))) { - username = substituteVariables(req.getParameter("user")); - password = substituteVariables(EncryptionHelper.decryptIfNeeded(req.getParameter("password"))); - } else { - username = substituteVariables(serverConfig.getUsername()); - password = substituteVariables(serverConfig.getPassword()); - } - - if (StringUtils.isBlank(username)) { - managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, - "", "", serverConfig.getTimeout()), new BuildInfoLog(log)); - } else { - managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, username, - password, serverConfig.getTimeout()), new BuildInfoLog(log)); - } - - managerBuilder.setConnectionTimeout(serverConfig.getTimeout()); - - try (ArtifactoryManager client = managerBuilder.build()) { - return client.getVirtualRepositoriesKeys(); - } catch (IOException ioe) { - log.error("Error while retrieving resolving repository list from: " + serverUrl, ioe); - try { - if (ioe.getMessage().contains("401")) - resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); - if (ioe.getMessage().contains("404")) - resp.sendError(HttpServletResponse.SC_NOT_FOUND); - } catch (IOException e) { - log.error("Error while sending error to response", e); - } - return Lists.newArrayList(); - } - } - - private synchronized void persist() throws IllegalAccessException, UnsupportedEncodingException { - List serverConfigs = Lists.newArrayList(); - - for (ServerConfig serverConfig : configuredServers) { - serverConfigs.add(new ServerConfig(serverConfig.getId(), serverConfig.getUrl(), serverConfig.getUsername(), - EncryptionHelper.encryptForConfig(serverConfig.getPassword()), serverConfig.getTimeout())); - } - String serverConfigsString = toXMLString(serverConfigs); - bandanaManager.setValue(PlanAwareBandanaContext.GLOBAL_CONTEXT, ARTIFACTORY_CONFIG_KEY, serverConfigsString); - } - - @Autowired - public void setCustomVariableContext(CustomVariableContext customVariableContext) { - this.customVariableContext = customVariableContext; - } - - public class BandanaContext extends PlanAwareBandanaContext{ - - public BandanaContext(@Nullable BambooBandanaContext parentContext, long planId, long chanId, @Nullable String pluginKey) { - super(parentContext, planId, chanId, pluginKey); - } - } +public interface ServerConfigManager { - private List getServersFromXml(String stringXml) throws IllegalAccessException, InstantiationException { - List serverConfigs = Lists.newArrayList(); - List stringServerConfigs = findAllObjects(ServerConfig.class, stringXml); - for (String stringServerConfig : stringServerConfigs) { - serverConfigs.add(getObjectFromStringXml(stringServerConfig, ServerConfig.class)); - } - return serverConfigs; - } + List getAllServerConfigs(); - private T getObjectFromStringXml(String stringT, Class tClass) throws IllegalAccessException, InstantiationException { - T object = tClass.newInstance(); - boolean accsessable; - String value; - for (Field field : tClass.getDeclaredFields()) { - accsessable = field.isAccessible(); - field.setAccessible(true); - value = findFirstObject(field.getName(), stringT, true); - if (field.getType().equals(long.class)) { - field.set(object, Long.parseLong(value)); - } else if (field.getType().equals(int.class)) { - field.set(object, Integer.parseInt(value)); - } else { - field.set(object, findFirstObject(field.getName(), stringT, true)); - } - field.setAccessible(accsessable); - } - return object; - } + ServerConfig getServerConfigById(long id); - private List findAllObjects(Class providedClass, String scannedString) { - List foundStrings = Lists.newArrayList(); - String foundString = findFirstObject(providedClass.getSimpleName(), scannedString, false); - while (!"".equals(foundString)) { - foundStrings.add(foundString); - scannedString = scannedString.replaceFirst(foundString, ""); - foundString = findFirstObject(providedClass.getSimpleName(), scannedString, false); - } - return foundStrings; - } + void addServerConfiguration(ServerConfig serverConfig); - /** - * Returns the found string or empty string if not found - * @param objectToFind - * @param stringToScan - * @return - */ - private String findFirstObject(String objectToFind, String stringToScan, boolean dataOnly) { - String patternString = String.format("<%s>?(.*?)", objectToFind, objectToFind); - Pattern pattern = Pattern.compile(patternString); - Matcher matcher = pattern.matcher(stringToScan); - if (matcher.find()) { - if (dataOnly) { - return new String(Base64.getDecoder().decode(matcher.group(1).getBytes())); - } - return matcher.group(0); - } - return ""; - } + void deleteServerConfiguration(final long id); - private String toXMLString(List serverConfigs) throws IllegalAccessException, UnsupportedEncodingException { - StringBuilder stringBuilder = new StringBuilder(); - openTag(stringBuilder, "List"); - for (ServerConfig serverConfig : serverConfigs) { - stringBuilder.append(toXMLString(serverConfig)); - } - closeTag(stringBuilder, "List"); - return stringBuilder.toString(); - } + void updateServerConfiguration(ServerConfig updated); - private String toXMLString(Object object) throws IllegalAccessException, UnsupportedEncodingException { - StringBuilder stringBuilder = new StringBuilder(); - openTag(stringBuilder, object.getClass().getSimpleName()); - for (Field field : object.getClass().getDeclaredFields()) { - field.setAccessible(true); - String value = field.get(object) == null ? "" : field.get(object).toString(); - appendAttribute(stringBuilder, field.getName(), value); - } - closeTag(stringBuilder, object.getClass().getSimpleName()); - return stringBuilder.toString(); - } + List getDeployableRepos(long serverId); - private void appendAttribute(StringBuilder stringBuilder, String field, String value) throws UnsupportedEncodingException { - openTag(stringBuilder, field); - // Encoding the value to Base64 to prevent saving special chars like % to the database - stringBuilder.append(Base64.getEncoder().encodeToString(value.getBytes(StandardCharsets.UTF_8))); - closeTag(stringBuilder, field); - } + List getDeployableRepos(long serverId, HttpServletRequest req, HttpServletResponse resp); - private void openTag(StringBuilder stringBuilder, String fieldName) { - stringBuilder.append("<"); - stringBuilder.append(fieldName); - stringBuilder.append(">"); - } + String substituteVariables(String s); + + List getResolvingRepos(long serverId, HttpServletRequest req, HttpServletResponse resp); - private void closeTag(StringBuilder stringBuilder, String fieldName) { - stringBuilder.append(""); - } + void persist() throws IllegalAccessException, UnsupportedEncodingException, JsonProcessingException; } diff --git a/src/main/java/org/jfrog/bamboo/admin/ServerConfigManagerImpl.java b/src/main/java/org/jfrog/bamboo/admin/ServerConfigManagerImpl.java new file mode 100644 index 00000000..aaa17522 --- /dev/null +++ b/src/main/java/org/jfrog/bamboo/admin/ServerConfigManagerImpl.java @@ -0,0 +1,393 @@ +/* + * Copyright (C) 2010 JFrog Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jfrog.bamboo.admin; + +import com.atlassian.bamboo.bandana.BambooBandanaContext; +import com.atlassian.bamboo.bandana.PlanAwareBandanaContext; +import com.atlassian.bamboo.variable.CustomVariableContext; +import com.atlassian.bandana.BandanaManager; +import com.atlassian.spring.container.ContainerManager; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; +import com.google.common.collect.Lists; +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import org.jetbrains.annotations.Nullable; +import org.jfrog.bamboo.security.EncryptionHelper; +import org.jfrog.bamboo.util.BuildInfoLog; +import org.jfrog.bamboo.util.TaskUtils; +import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; +import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.Serializable; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Global Artifactory server configuration manager + * + * @author Noam Y. Tenne + */ +@Component +public class ServerConfigManagerImpl implements ServerConfigManager { + + private transient Logger log = LogManager.getLogger(ServerConfigManager.class); + + private static final String ARTIFACTORY_CONFIG_KEY = "org.jfrog.bamboo.server.configurations.v2"; + private final List configuredServers = new CopyOnWriteArrayList<>(); + private BandanaManager bandanaManager; + private AtomicLong nextAvailableId = new AtomicLong(0); + private CustomVariableContext customVariableContext; + + @Inject + public ServerConfigManagerImpl(@ComponentImport BandanaManager bandanaManager, @ComponentImport CustomVariableContext customVariableContext) { + this.setBandanaManager(bandanaManager); + this.customVariableContext = customVariableContext; + } + + public List getAllServerConfigs() { + return Lists.newArrayList(configuredServers); + } + + public ServerConfig getServerConfigById(long id) { + for (ServerConfig configuredServer : configuredServers) { + if (configuredServer.getId() == id) { + return configuredServer; + } + } + + return null; + } + + public void addServerConfiguration(ServerConfig serverConfig) { + serverConfig.setId(nextAvailableId.getAndIncrement()); + configuredServers.add(serverConfig); + try { + persist(); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + log.error("Could not add Artifactory configuration.", e); + } + } + + public void deleteServerConfiguration(final long id) { + for (ServerConfig configuredServer : configuredServers) { + if (configuredServer.getId() == id) { + configuredServers.remove(configuredServer); + try { + persist(); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + log.error("Could not delete Artifactory configuration.", e); + } + break; + } + } + } + + public void updateServerConfiguration(ServerConfig updated) { + for (ServerConfig configuredServer : configuredServers) { + if (configuredServer.getId() == updated.getId()) { + configuredServer.setUrl(updated.getUrl()); + configuredServer.setUsername(updated.getUsername()); + configuredServer.setPassword(updated.getPassword()); + configuredServer.setTimeout(updated.getTimeout()); + try { + persist(); + } catch (IllegalAccessException | UnsupportedEncodingException e) { + log.error("Could not update Artifactory configuration.", e); + } + break; + } + } + } + + public void setBandanaManager(BandanaManager bandanaManager) { + this.bandanaManager = bandanaManager; + try { + setArtifactoryServers(bandanaManager); + } catch (InstantiationException | IllegalAccessException | IOException e) { + log.error("Could not load Artifactory configuration.", e); + } + } + + public void setCustomVariableContext(CustomVariableContext customVariableContext) { + this.customVariableContext = customVariableContext; + } + + + private void setArtifactoryServers(BandanaManager bandanaManager) + throws IOException, InstantiationException, IllegalAccessException { + + String existingArtifactoryConfig = (String) bandanaManager.getValue(PlanAwareBandanaContext.GLOBAL_CONTEXT, ARTIFACTORY_CONFIG_KEY); + if (StringUtils.isNotBlank(existingArtifactoryConfig)) { + List serverConfigList = getServersFromXml(existingArtifactoryConfig); + for (Object serverConfig : serverConfigList) { + // Because of some class loader issues we had to get a workaround, + // we serialize and deserialize the serverConfig object. + ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); + String json = ow.writeValueAsString(serverConfig); + ServerConfig tempServerConfig = new ObjectMapper().readValue(json, ServerConfig.class); + + if (nextAvailableId.get() <= tempServerConfig.getId()) { + nextAvailableId.set(tempServerConfig.getId() + 1); + } + + configuredServers.add(new ServerConfig(tempServerConfig.getId(), tempServerConfig.getUrl(), tempServerConfig.getUsername(), + EncryptionHelper.decrypt(tempServerConfig.getPassword()), tempServerConfig.getTimeout())); + } + } + } + + public List getDeployableRepos(long serverId) { + return getDeployableRepos(serverId, null, null); + } + + public List getDeployableRepos(long serverId, HttpServletRequest req, HttpServletResponse resp) { + ServerConfig serverConfig = getServerConfigById(serverId); + if (serverConfig == null) { + log.error("Error while retrieving target repository list: Could not find Artifactory server " + + "configuration by the ID " + serverId); + return Lists.newArrayList(); + } + ArtifactoryManagerBuilder managerBuilder; + + String serverUrl = substituteVariables(serverConfig.getUrl()); + String username = null; + String password = null; + if (req != null) { + username = req.getParameter("user"); + password = req.getParameter("password"); + } + if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)) { + password = EncryptionHelper.decryptIfNeeded(password); + } else { + username = serverConfig.getUsername(); + password = serverConfig.getPassword(); + } + username = substituteVariables(username); + password = substituteVariables(password); + + if (StringUtils.isBlank(username)) { + managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, + "", "", serverConfig.getTimeout()), new BuildInfoLog(log)); + } else { + managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, username, + password, serverConfig.getTimeout()), new BuildInfoLog(log)); + } + + try (ArtifactoryManager client = managerBuilder.build()) { + return client.getLocalRepositoriesKeys(); + } catch (IOException ioe) { + log.error("Error while retrieving target repository list from: " + serverUrl, ioe); + try { + if (resp != null && ioe.getMessage().contains("401")) + resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); + if (resp != null && ioe.getMessage().contains("404")) + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + } catch (IOException e) { + log.error("Error while sending error to response", e); + } + + return Lists.newArrayList(); + } + } + + /** + * Substitute (replace) Bamboo variable names with their defined values + */ + public String substituteVariables(String s) { + return s != null ? customVariableContext.substituteString(s) : null; + } + + public List getResolvingRepos(long serverId, HttpServletRequest req, HttpServletResponse resp) { + ServerConfig serverConfig = getServerConfigById(serverId); + if (serverConfig == null) { + log.error("Error while retrieving resolving repository list: Could not find Artifactory server " + + "configuration by the ID " + serverId); + return Lists.newArrayList(); + } + ArtifactoryManagerBuilder managerBuilder; + + String serverUrl = substituteVariables(serverConfig.getUrl()); + String username; + String password; + if (StringUtils.isNotBlank(req.getParameter("user")) && StringUtils.isNotBlank(req.getParameter("password"))) { + username = substituteVariables(req.getParameter("user")); + password = substituteVariables(EncryptionHelper.decryptIfNeeded(req.getParameter("password"))); + } else { + username = substituteVariables(serverConfig.getUsername()); + password = substituteVariables(serverConfig.getPassword()); + } + + if (StringUtils.isBlank(username)) { + managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, + "", "", serverConfig.getTimeout()), new BuildInfoLog(log)); + } else { + managerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder(new ServerConfig(serverConfig.getId(), serverUrl, username, + password, serverConfig.getTimeout()), new BuildInfoLog(log)); + } + + managerBuilder.setConnectionTimeout(serverConfig.getTimeout()); + + try (ArtifactoryManager client = managerBuilder.build()) { + return client.getVirtualRepositoriesKeys(); + } catch (IOException ioe) { + log.error("Error while retrieving resolving repository list from: " + serverUrl, ioe); + try { + if (ioe.getMessage().contains("401")) + resp.sendError(HttpServletResponse.SC_UNAUTHORIZED); + if (ioe.getMessage().contains("404")) + resp.sendError(HttpServletResponse.SC_NOT_FOUND); + } catch (IOException e) { + log.error("Error while sending error to response", e); + } + return Lists.newArrayList(); + } + } + + public synchronized void persist() throws IllegalAccessException, UnsupportedEncodingException { + List serverConfigs = Lists.newArrayList(); + + for (ServerConfig serverConfig : configuredServers) { + serverConfigs.add(new ServerConfig(serverConfig.getId(), serverConfig.getUrl(), serverConfig.getUsername(), + EncryptionHelper.encryptForConfig(serverConfig.getPassword()), serverConfig.getTimeout())); + } + String serverConfigsString = toXMLString(serverConfigs); + bandanaManager.setValue(PlanAwareBandanaContext.GLOBAL_CONTEXT, ARTIFACTORY_CONFIG_KEY, serverConfigsString); + } + + public class BandanaContext extends PlanAwareBandanaContext{ + + public BandanaContext(@Nullable BambooBandanaContext parentContext, long planId, long chanId, @Nullable String pluginKey) { + super(parentContext, planId, chanId, pluginKey); + } + } + + private List getServersFromXml(String stringXml) throws IllegalAccessException, InstantiationException { + List serverConfigs = Lists.newArrayList(); + List stringServerConfigs = findAllObjects(ServerConfig.class, stringXml); + for (String stringServerConfig : stringServerConfigs) { + serverConfigs.add(getObjectFromStringXml(stringServerConfig, ServerConfig.class)); + } + return serverConfigs; + } + + private T getObjectFromStringXml(String stringT, Class tClass) throws IllegalAccessException, InstantiationException { + T object = tClass.newInstance(); + boolean accsessable; + String value; + for (Field field : tClass.getDeclaredFields()) { + accsessable = field.isAccessible(); + field.setAccessible(true); + value = findFirstObject(field.getName(), stringT, true); + if (field.getType().equals(long.class)) { + field.set(object, Long.parseLong(value)); + } else if (field.getType().equals(int.class)) { + field.set(object, Integer.parseInt(value)); + } else { + field.set(object, findFirstObject(field.getName(), stringT, true)); + } + field.setAccessible(accsessable); + } + return object; + } + + private List findAllObjects(Class providedClass, String scannedString) { + List foundStrings = Lists.newArrayList(); + String foundString = findFirstObject(providedClass.getSimpleName(), scannedString, false); + while (!"".equals(foundString)) { + foundStrings.add(foundString); + scannedString = scannedString.replaceFirst(foundString, ""); + foundString = findFirstObject(providedClass.getSimpleName(), scannedString, false); + } + return foundStrings; + } + + /** + * Returns the found string or empty string if not found + * @param objectToFind + * @param stringToScan + * @return + */ + private String findFirstObject(String objectToFind, String stringToScan, boolean dataOnly) { + String patternString = String.format("<%s>?(.*?)", objectToFind, objectToFind); + Pattern pattern = Pattern.compile(patternString); + Matcher matcher = pattern.matcher(stringToScan); + if (matcher.find()) { + if (dataOnly) { + return new String(Base64.getDecoder().decode(matcher.group(1).getBytes())); + } + return matcher.group(0); + } + return ""; + } + + private String toXMLString(List serverConfigs) throws IllegalAccessException, UnsupportedEncodingException { + StringBuilder stringBuilder = new StringBuilder(); + openTag(stringBuilder, "List"); + for (ServerConfig serverConfig : serverConfigs) { + stringBuilder.append(toXMLString(serverConfig)); + } + closeTag(stringBuilder, "List"); + return stringBuilder.toString(); + } + + private String toXMLString(Object object) throws IllegalAccessException, UnsupportedEncodingException { + StringBuilder stringBuilder = new StringBuilder(); + openTag(stringBuilder, object.getClass().getSimpleName()); + for (Field field : object.getClass().getDeclaredFields()) { + field.setAccessible(true); + String value = field.get(object) == null ? "" : field.get(object).toString(); + appendAttribute(stringBuilder, field.getName(), value); + } + closeTag(stringBuilder, object.getClass().getSimpleName()); + return stringBuilder.toString(); + } + + private void appendAttribute(StringBuilder stringBuilder, String field, String value) throws UnsupportedEncodingException { + openTag(stringBuilder, field); + // Encoding the value to Base64 to prevent saving special chars like % to the database + stringBuilder.append(Base64.getEncoder().encodeToString(value.getBytes(StandardCharsets.UTF_8))); + closeTag(stringBuilder, field); + } + + private void openTag(StringBuilder stringBuilder, String fieldName) { + stringBuilder.append("<"); + stringBuilder.append(fieldName); + stringBuilder.append(">"); + } + + private void closeTag(StringBuilder stringBuilder, String fieldName) { + stringBuilder.append(""); + } +} diff --git a/src/main/java/org/jfrog/bamboo/builder/BaseBuildInfoHelper.java b/src/main/java/org/jfrog/bamboo/builder/BaseBuildInfoHelper.java index 91f1b264..80008ef2 100644 --- a/src/main/java/org/jfrog/bamboo/builder/BaseBuildInfoHelper.java +++ b/src/main/java/org/jfrog/bamboo/builder/BaseBuildInfoHelper.java @@ -70,7 +70,6 @@ public void init(BuildParamsOverrideManager buildParamsOverrideManager, BuildCon this.buildParamsOverrideManager = buildParamsOverrideManager; this.context = context; buildInfoLog = new BuildInfoLog(log, logger); - serverConfigManager = ServerConfigManager.getInstance(); ContainerManager.autowireComponent(this); httpClient = new HttpClient(); bambooBaseUrl = determineBambooBaseUrl(); diff --git a/src/main/java/org/jfrog/bamboo/builder/BuildInfoHelper.java b/src/main/java/org/jfrog/bamboo/builder/BuildInfoHelper.java index 4fe4b1c1..2386e5d2 100644 --- a/src/main/java/org/jfrog/bamboo/builder/BuildInfoHelper.java +++ b/src/main/java/org/jfrog/bamboo/builder/BuildInfoHelper.java @@ -46,9 +46,10 @@ public class BuildInfoHelper extends BaseBuildInfoHelper { private final String buildNumber; private final String vcsRevision; private final String vcsUrl; - private ServerConfig serverConfig; - - private BuildInfoHelper(String buildName, String buildNumber, Map env, String vcsRevision, String vcsUrl) { + private ServerConfig serverConfig; + + private BuildInfoHelper(String buildName, String buildNumber, Map env, String vcsRevision, String vcsUrl, ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; this.buildName = buildName; this.buildNumber = buildNumber; this.env = env; @@ -212,7 +213,7 @@ public ArtifactoryManagerBuilder getClientBuilder(BuildLogger buildLogger, Logge return TaskUtils.getArtifactoryManagerBuilderBuilder(serverConfig, bambooBuildInfoLog); } - private static BuildInfoHelper createBuildInfoHelper(String buildName, String buildNumber, CommonTaskContext taskContext, BuildContext buildContext, EnvironmentVariableAccessor environmentVariableAccessor, BuildParamsOverrideManager buildParamsOverrideManager, ServerConfig serverConfig) { + private static BuildInfoHelper createBuildInfoHelper(String buildName, String buildNumber, CommonTaskContext taskContext, BuildContext buildContext, EnvironmentVariableAccessor environmentVariableAccessor, BuildParamsOverrideManager buildParamsOverrideManager, ServerConfig serverConfig, ServerConfigManager serverConfigManager) { Map env = new HashMap<>(); env.putAll(environmentVariableAccessor.getEnvironment(taskContext)); env.putAll(environmentVariableAccessor.getEnvironment()); @@ -227,16 +228,15 @@ private static BuildInfoHelper createBuildInfoHelper(String buildName, String bu throw new IllegalArgumentException("Could not find Artifactory server. Please check the Artifactory server in the task configuration."); } - BuildInfoHelper buildInfoHelper = new BuildInfoHelper(buildName, buildNumber, env, vcsRevision, vcsUrl); + BuildInfoHelper buildInfoHelper = new BuildInfoHelper(buildName, buildNumber, env, vcsRevision, vcsUrl, serverConfigManager); buildInfoHelper.init(buildParamsOverrideManager, buildContext, taskContext.getBuildLogger()); return buildInfoHelper; } public static BuildInfoHelper createDeployBuildInfoHelper(String buildName, String buildNumber, CommonTaskContext taskContext, BuildContext buildContext, EnvironmentVariableAccessor environmentVariableAccessor, - long selectedServerId, String username, String password, BuildParamsOverrideManager buildParamsOverrideManager) { - ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(); + long selectedServerId, String username, String password, BuildParamsOverrideManager buildParamsOverrideManager, ServerConfigManager serverConfigManager) { ServerConfig selectedServerConfig = serverConfigManager.getServerConfigById(selectedServerId); - BuildInfoHelper buildInfoHelper = createBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, buildParamsOverrideManager, selectedServerConfig); + BuildInfoHelper buildInfoHelper = createBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, buildParamsOverrideManager, selectedServerConfig, serverConfigManager); buildInfoHelper.serverConfig = TaskUtils.getDeploymentServerConfig(username, password, serverConfigManager, selectedServerConfig, buildParamsOverrideManager); @@ -244,10 +244,9 @@ public static BuildInfoHelper createDeployBuildInfoHelper(String buildName, Stri return buildInfoHelper; } - public static BuildInfoHelper createResolveBuildInfoHelper(String buildName, String buildNumber, CommonTaskContext taskContext, BuildContext buildContext, EnvironmentVariableAccessor environmentVariableAccessor, long selectedServerId, String username, String password, BuildParamsOverrideManager buildParamsOverrideManager) { - ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(); + public static BuildInfoHelper createResolveBuildInfoHelper(String buildName, String buildNumber, CommonTaskContext taskContext, BuildContext buildContext, EnvironmentVariableAccessor environmentVariableAccessor, long selectedServerId, String username, String password, BuildParamsOverrideManager buildParamsOverrideManager, ServerConfigManager serverConfigManager) { ServerConfig selectedServerConfig = serverConfigManager.getServerConfigById(selectedServerId); - BuildInfoHelper buildInfoHelper = createBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, buildParamsOverrideManager, selectedServerConfig); + BuildInfoHelper buildInfoHelper = createBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, buildParamsOverrideManager, selectedServerConfig, serverConfigManager); buildInfoHelper.serverConfig = TaskUtils.getResolutionServerConfig(username, password, serverConfigManager, selectedServerConfig, buildParamsOverrideManager); diff --git a/src/main/java/org/jfrog/bamboo/builder/GradleDataHelper.java b/src/main/java/org/jfrog/bamboo/builder/GradleDataHelper.java index 5c0e6894..fc994833 100644 --- a/src/main/java/org/jfrog/bamboo/builder/GradleDataHelper.java +++ b/src/main/java/org/jfrog/bamboo/builder/GradleDataHelper.java @@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.GradleBuildContext; import org.jfrog.bamboo.util.BuildInfoLog; @@ -66,7 +67,8 @@ public class GradleDataHelper extends BaseBuildInfoHelper { private String resolverUsername; private String resolverPassword; - public GradleDataHelper(BuildParamsOverrideManager buildParamsOverrideManager, CommonTaskContext context, GradleBuildContext buildContext, AdministrationConfiguration administrationConfiguration, EnvironmentVariableAccessor envVarAccessor, String artifactoryPluginVersion, boolean aggregateBuildInfo) { + public GradleDataHelper(BuildParamsOverrideManager buildParamsOverrideManager, CommonTaskContext context, GradleBuildContext buildContext, AdministrationConfiguration administrationConfiguration, EnvironmentVariableAccessor envVarAccessor, String artifactoryPluginVersion, boolean aggregateBuildInfo, ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; super.init(buildParamsOverrideManager, ((TaskContext) context).getBuildContext(), context.getBuildLogger()); setAdministrationConfiguration(administrationConfiguration); diff --git a/src/main/java/org/jfrog/bamboo/builder/IvyDataHelper.java b/src/main/java/org/jfrog/bamboo/builder/IvyDataHelper.java index f1e3ee5b..0f1261de 100644 --- a/src/main/java/org/jfrog/bamboo/builder/IvyDataHelper.java +++ b/src/main/java/org/jfrog/bamboo/builder/IvyDataHelper.java @@ -4,6 +4,7 @@ import com.atlassian.bamboo.task.CommonTaskContext; import com.atlassian.bamboo.task.TaskContext; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.PackageManagersContext; import org.jfrog.build.extractor.clientConfiguration.ArtifactoryClientConfiguration; @@ -15,8 +16,8 @@ */ public class IvyDataHelper extends MavenAndIvyBuildInfoDataHelperBase { - public IvyDataHelper(BuildParamsOverrideManager buildParamsOverrideManager, CommonTaskContext context, PackageManagersContext buildContext, EnvironmentVariableAccessor envVarAccessor, String artifactoryPluginVersion, boolean aggregateBuildInfo) { - super(buildParamsOverrideManager, (TaskContext) context, buildContext, envVarAccessor, artifactoryPluginVersion, aggregateBuildInfo); + public IvyDataHelper(BuildParamsOverrideManager buildParamsOverrideManager, CommonTaskContext context, PackageManagersContext buildContext, EnvironmentVariableAccessor envVarAccessor, String artifactoryPluginVersion, boolean aggregateBuildInfo, ServerConfigManager serverConfigManager) { + super(buildParamsOverrideManager, (TaskContext) context, buildContext, envVarAccessor, artifactoryPluginVersion, aggregateBuildInfo, serverConfigManager); } @Override diff --git a/src/main/java/org/jfrog/bamboo/builder/MavenAndIvyBuildInfoDataHelperBase.java b/src/main/java/org/jfrog/bamboo/builder/MavenAndIvyBuildInfoDataHelperBase.java index 668bb8c2..909a9a43 100644 --- a/src/main/java/org/jfrog/bamboo/builder/MavenAndIvyBuildInfoDataHelperBase.java +++ b/src/main/java/org/jfrog/bamboo/builder/MavenAndIvyBuildInfoDataHelperBase.java @@ -28,6 +28,7 @@ import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.PackageManagersContext; import org.jfrog.bamboo.util.BuildInfoLog; @@ -62,7 +63,8 @@ public abstract class MavenAndIvyBuildInfoDataHelperBase extends BaseBuildInfoHe public MavenAndIvyBuildInfoDataHelperBase(BuildParamsOverrideManager buildParamsOverrideManager, TaskContext context, PackageManagersContext abstractBuildContext, EnvironmentVariableAccessor envVarAccessor, String artifactoryPluginVersion, - boolean aggregateBuildInfo) { + boolean aggregateBuildInfo, ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; BuildContext buildContext = context.getBuildContext(); super.init(buildParamsOverrideManager, context.getBuildContext(), context.getBuildLogger()); long selectedServerId = abstractBuildContext.getArtifactoryServerId(); diff --git a/src/main/java/org/jfrog/bamboo/builder/MavenDataHelper.java b/src/main/java/org/jfrog/bamboo/builder/MavenDataHelper.java index bac5ed6e..c859a200 100644 --- a/src/main/java/org/jfrog/bamboo/builder/MavenDataHelper.java +++ b/src/main/java/org/jfrog/bamboo/builder/MavenDataHelper.java @@ -5,6 +5,7 @@ import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.Maven3BuildContext; import org.jfrog.bamboo.context.PackageManagersContext; @@ -29,8 +30,8 @@ public class MavenDataHelper extends MavenAndIvyBuildInfoDataHelperBase { public MavenDataHelper(BuildParamsOverrideManager buildParamsOverrideManager, TaskContext context, PackageManagersContext buildContext, EnvironmentVariableAccessor envVarAccessor, - String artifactoryPluginVersion, boolean aggregateBuildInfo) { - super(buildParamsOverrideManager, context, buildContext, envVarAccessor, artifactoryPluginVersion, aggregateBuildInfo); + String artifactoryPluginVersion, boolean aggregateBuildInfo, ServerConfigManager serverConfigManager) { + super(buildParamsOverrideManager, context, buildContext, envVarAccessor, artifactoryPluginVersion, aggregateBuildInfo, serverConfigManager); long selectedServerId = buildContext.getArtifactoryServerId(); if (selectedServerId == -1) { // No deployment server configured, configure resolution server if needed. diff --git a/src/main/java/org/jfrog/bamboo/buildinfo/action/condition/BuildInfoActionCondition.java b/src/main/java/org/jfrog/bamboo/buildinfo/action/condition/BuildInfoActionCondition.java index 60c1b194..ff4189fd 100644 --- a/src/main/java/org/jfrog/bamboo/buildinfo/action/condition/BuildInfoActionCondition.java +++ b/src/main/java/org/jfrog/bamboo/buildinfo/action/condition/BuildInfoActionCondition.java @@ -22,9 +22,12 @@ import com.atlassian.bamboo.resultsummary.ResultsSummaryManager; import com.atlassian.plugin.PluginParseException; import com.atlassian.plugin.web.Condition; +import com.atlassian.plugin.spring.scanner.annotation.imports.BambooImport; import org.apache.commons.lang3.StringUtils; import org.jfrog.bamboo.util.ConstantValues; +import javax.inject.Inject; + import java.util.Map; /** @@ -53,7 +56,8 @@ public boolean shouldDisplay(Map context) { Boolean.valueOf(resultsSummary.getCustomBuildData().get(ConstantValues.BUILD_RESULT_COLLECTION_ACTIVATED_PARAM)); } - public void setResultsSummaryManager(ResultsSummaryManager resultsSummaryManager) { + @Inject + public BuildInfoActionCondition(@BambooImport ResultsSummaryManager resultsSummaryManager) { this.resultsSummaryManager = resultsSummaryManager; } } diff --git a/src/main/java/org/jfrog/bamboo/configuration/AbstractArtifactoryConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/AbstractArtifactoryConfiguration.java index 95e50afa..7794489d 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/AbstractArtifactoryConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/AbstractArtifactoryConfiguration.java @@ -8,6 +8,8 @@ import com.atlassian.bamboo.task.*; import com.atlassian.bamboo.v2.build.agent.capability.Requirement; import com.atlassian.bamboo.ww2.actions.build.admin.create.UIConfigSupport; +import com.atlassian.plugin.spring.scanner.annotation.imports.BambooImport; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import com.atlassian.sal.api.message.I18nResolver; import com.atlassian.spring.container.ContainerManager; import com.google.common.collect.ImmutableMap; @@ -27,6 +29,7 @@ import org.jfrog.bamboo.release.vcs.git.GitAuthenticationType; import org.jfrog.bamboo.security.EncryptionHelper; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -46,6 +49,8 @@ public abstract class AbstractArtifactoryConfiguration extends AbstractTaskConfigurator implements TaskTestResultsSupport, BuildTaskRequirementSupport { + @Inject + @ComponentImport protected I18nResolver i18nResolver; public static final String CFG_TEST_RESULTS_FILE_PATTERN_OPTION_CUSTOM = "customTestDirectory"; public static final String CFG_TEST_RESULTS_FILE_PATTERN_OPTION_STANDARD = "standardTestDirectory"; @@ -69,27 +74,32 @@ public abstract class AbstractArtifactoryConfiguration extends AbstractTaskConfi public static final Map CFG_SPEC_SOURCE = ImmutableMap.of(CFG_SPEC_SOURCE_JOB_CONFIGURATION, "Task configuration", CFG_SPEC_SOURCE_FILE, "File"); public static final Map SIGN_METHOD_MAP = ImmutableMap.of("false", "Don't Sign", "true", "Sign"); public static final String SIGN_METHOD_MAP_KEY = "signMethods"; + @Inject protected transient ServerConfigManager serverConfigManager; + @Inject + @ComponentImport protected transient CredentialsAccessor credentialsAccessor; - protected AdministrationConfiguration administrationConfiguration; + private AdministrationConfiguration administrationConfiguration; + @Inject + @BambooImport protected UIConfigSupport uiConfigSupport; - private final String builderContextPrefix; - private final String capabilityPrefix; private static final Logger log = LogManager.getLogger(AbstractArtifactoryConfiguration.class); protected TaskConfiguratorHelperImpl taskConfiguratorHelper = new TaskConfiguratorHelperImpl(); - protected AbstractArtifactoryConfiguration() { - this(null, null); - } - - protected AbstractArtifactoryConfiguration(String builderContextPrefix, @Nullable String capabilityPrefix) { - serverConfigManager = ServerConfigManager.getInstance(); + protected AdministrationConfiguration getAdministrationConfiguration() { if (administrationConfiguration == null) { administrationConfiguration = (AdministrationConfiguration) ContainerManager.getComponent("administrationConfiguration"); } - this.builderContextPrefix = builderContextPrefix; - this.capabilityPrefix = capabilityPrefix; + return administrationConfiguration; + } + + protected String getBuilderContextPrefix() { + return null; + } + + protected String getCapabilityPrefix() { + return null; } public String getTestDirectory(PackageManagersContext buildContext) { @@ -105,7 +115,6 @@ public String getTestDirectory(PackageManagersContext buildContext) { @Override public void populateContextForEdit(@NotNull Map context, @NotNull TaskDefinition taskDefinition) { super.populateContextForEdit(context, taskDefinition); - serverConfigManager = ServerConfigManager.getInstance(); populateContextForAllOperations(context); } @@ -126,7 +135,6 @@ public void populateLegacyContextForEdit(@NotNull Map context, @ @Override public void populateContextForCreate(@NotNull Map context) { super.populateContextForCreate(context); - serverConfigManager = ServerConfigManager.getInstance(); populateContextForAllOperations(context); } @@ -145,7 +153,7 @@ public void populateLegacyContextForCreate(@NotNull Map context) public Map generateTaskConfigMap(@NotNull ActionParametersMap params, @Nullable TaskDefinition previousTaskDefinition) { Map taskConfigMap = super.generateTaskConfigMap(params, previousTaskDefinition); - taskConfigMap.put("baseUrl", administrationConfiguration.getBaseUrl()); + taskConfigMap.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); return taskConfigMap; } @@ -154,13 +162,13 @@ public Map generateTaskConfigMap(@NotNull ActionParametersMap pa @Override public Set calculateRequirements(@NotNull TaskDefinition taskDefinition, @NotNull Job job) { Set requirements = Sets.newHashSet(); - if (StringUtils.isNotBlank(builderContextPrefix)) { + if (StringUtils.isNotBlank(getBuilderContextPrefix())) { taskConfiguratorHelper.addJdkRequirement(requirements, taskDefinition, - builderContextPrefix + TaskConfigConstants.CFG_JDK_LABEL); + getBuilderContextPrefix() + TaskConfigConstants.CFG_JDK_LABEL); if (!isUseWrapper(taskDefinition)) { - if (StringUtils.isNotBlank(capabilityPrefix)) { + if (StringUtils.isNotBlank(getCapabilityPrefix())) { taskConfiguratorHelper.addSystemRequirementFromConfiguration(requirements, taskDefinition, - builderContextPrefix + PackageManagersContext.EXECUTABLE, capabilityPrefix); + getBuilderContextPrefix() + PackageManagersContext.EXECUTABLE, getCapabilityPrefix()); } } } @@ -223,8 +231,8 @@ public void setCredentialsAccessor(final CredentialsAccessor credentialsAccessor this.credentialsAccessor = credentialsAccessor; } - public void setAdministrationConfiguration(AdministrationConfiguration administrationConfiguration) { - this.administrationConfiguration = administrationConfiguration; + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; } protected String readFileByKey(final ActionParametersMap params, String keyToRead) { diff --git a/src/main/java/org/jfrog/bamboo/configuration/AbstractDotNetBuildConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/AbstractDotNetBuildConfiguration.java index b93d4b4f..37d00046 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/AbstractDotNetBuildConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/AbstractDotNetBuildConfiguration.java @@ -28,16 +28,17 @@ public abstract class AbstractDotNetBuildConfiguration extends AbstractArtifacto private static final Map CFG_COMMAND_OPTIONS = ImmutableMap.of(CFG_COMMAND_RESTORE, "restore", CFG_COMMAND_PUSH, "push"); - public AbstractDotNetBuildConfiguration(String capability) { - super(DotNetBuildContext.PREFIX, capability); + @Override + protected String getBuilderContextPrefix() { + return DotNetBuildContext.PREFIX; } @Override public void populateContextForCreate(@NotNull Map context) { super.populateContextForCreate(context); populateCommandsContext(context); - context.put("adminConfig", administrationConfiguration); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("adminConfig", getAdministrationConfiguration()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); Plan plan = (Plan) context.get("plan"); context.put("build", plan); context.put("dummyList", Lists.newArrayList()); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDockerConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDockerConfiguration.java index bdc697a4..20156ad4 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDockerConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDockerConfiguration.java @@ -29,9 +29,15 @@ public class ArtifactoryDockerConfiguration extends AbstractArtifactoryConfigura private static final String KEY = "artifactoryDockerBuilder"; private static final Set FIELDS_TO_COPY = DockerBuildContext.getFieldsToCopy(); private static final Map CFG_DOCKER_COMMAND_OPTIONS = ImmutableMap.of(CFG_DOCKER_COMMAND_PULL, "pull", CFG_DOCKER_COMMAND_PUSH, "push"); + + @Override + protected String getBuilderContextPrefix() { + return DockerBuildContext.PREFIX; + } - public ArtifactoryDockerConfiguration() { - super(DockerBuildContext.PREFIX, CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".docker"); + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".docker"; } @Override @@ -41,8 +47,8 @@ public void populateContextForCreate(@NotNull Map context) { context.put("artifactoryDockerTask", this); context.put("builderType", this); context.put("builder", this); - context.put("adminConfig", administrationConfiguration); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("adminConfig", getAdministrationConfiguration()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); Plan plan = (Plan) context.get("plan"); context.put("build", plan); context.put("dummyList", Lists.newArrayList()); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDotNetCoreConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDotNetCoreConfiguration.java index f7ad5c6d..8a8252ec 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDotNetCoreConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryDotNetCoreConfiguration.java @@ -2,8 +2,10 @@ import com.atlassian.bamboo.v2.build.agent.capability.CapabilityDefaultsHelper; import org.jetbrains.annotations.NotNull; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.task.ArtifactoryDotNetCoreTask; +import javax.inject.Inject; import java.util.Map; /** @@ -15,8 +17,9 @@ public class ArtifactoryDotNetCoreConfiguration extends AbstractDotNetBuildConfi private static final String KEY = "artifactoryDotNetCoreBuilder"; - public ArtifactoryDotNetCoreConfiguration() { - super(CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".dotnet"); + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".dotnet"; } @Override diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryGradleConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryGradleConfiguration.java index 4fff7cb4..6121be03 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryGradleConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryGradleConfiguration.java @@ -32,8 +32,14 @@ public class ArtifactoryGradleConfiguration extends AbstractArtifactoryConfigura private static final String PUBLISH_FORK_COUNT_OPTIONS_KEY = "publishForkCountList"; private static final String PUBLISH_FORK_COUNT_KEY = "publishForkCount"; - public ArtifactoryGradleConfiguration() { - super(GradleBuildContext.PREFIX, CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".gradle"); + @Override + protected String getBuilderContextPrefix() { + return GradleBuildContext.PREFIX; + } + + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".gradle"; } @Override @@ -43,8 +49,8 @@ public void populateContextForCreate(@NotNull Map context) { context.put("artifactoryGradleTask", this); context.put("builderType", this); context.put("builder", this); - context.put("adminConfig", administrationConfiguration); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("adminConfig", getAdministrationConfiguration()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); Plan plan = (Plan) context.get("plan"); context.put("build", plan); context.put("dummyList", Lists.newArrayList()); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryIvyConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryIvyConfiguration.java index f2a7880d..09bef4e0 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryIvyConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryIvyConfiguration.java @@ -28,8 +28,14 @@ public class ArtifactoryIvyConfiguration extends AbstractArtifactoryConfiguratio protected static final String DEFAULT_TEST_REPORTS_XML = "**/test-reports/*.xml"; private static final Set FIELDS_TO_COPY = IvyBuildContext.getFieldsToCopy(); - public ArtifactoryIvyConfiguration() { - super(IvyBuildContext.PREFIX, CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".ivy"); + @Override + protected String getBuilderContextPrefix() { + return IvyBuildContext.PREFIX; + } + + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".ivy"; } @Override @@ -49,8 +55,8 @@ public void populateContextForCreate(@NotNull Map context) { context.put("artifactoryIvyTask", this); context.put("builderType", this); context.put("builder", this); - context.put("adminConfig", administrationConfiguration); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("adminConfig", getAdministrationConfiguration()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); context.put("build", context.get("plan")); context.put("dummyList", Lists.newArrayList()); context.put("serverConfigManager", serverConfigManager); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryMaven3Configuration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryMaven3Configuration.java index 227e89bc..de878bd8 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryMaven3Configuration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryMaven3Configuration.java @@ -30,8 +30,14 @@ public class ArtifactoryMaven3Configuration extends AbstractArtifactoryConfigura private static final Set FIELDS_TO_COPY = Maven3BuildContext.getFieldsToCopy(); private static final String DEFAULT_TEST_RESULTS_FILE_PATTERN = "**/target/surefire-reports/*.xml"; - public ArtifactoryMaven3Configuration() { - super(Maven3BuildContext.PREFIX, CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".maven"); + @Override + protected String getBuilderContextPrefix() { + return Maven3BuildContext.PREFIX; + } + + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".maven"; } @Override @@ -41,7 +47,7 @@ public void populateContextForCreate(@NotNull Map context) { context.put("maven3Task", this); context.put("builderType", this); context.put("builder", this); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); Plan plan = (Plan) context.get("plan"); context.put("build", plan); context.put("dummyList", Lists.newArrayList()); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNpmConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNpmConfiguration.java index 197e5be7..20eb95ee 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNpmConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNpmConfiguration.java @@ -31,8 +31,14 @@ public class ArtifactoryNpmConfiguration extends AbstractArtifactoryConfiguratio private static final Set FIELDS_TO_COPY = NpmBuildContext.getFieldsToCopy(); private static final Map CFG_NPM_COMMAND_OPTIONS = ImmutableMap.of(CFG_NPM_COMMAND_INSTALL, "install", CFG_NPM_COMMAND_PUBLISH, "pack and publish"); - public ArtifactoryNpmConfiguration() { - super(NpmBuildContext.PREFIX, CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".npm"); + @Override + protected String getBuilderContextPrefix() { + return NpmBuildContext.PREFIX; + } + + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".npm"; } @Override @@ -42,8 +48,8 @@ public void populateContextForCreate(@NotNull Map context) { context.put("artifactoryNpmTask", this); context.put("builderType", this); context.put("builder", this); - context.put("adminConfig", administrationConfiguration); - context.put("baseUrl", administrationConfiguration.getBaseUrl()); + context.put("adminConfig", getAdministrationConfiguration()); + context.put("baseUrl", getAdministrationConfiguration().getBaseUrl()); Plan plan = (Plan) context.get("plan"); context.put("build", plan); context.put("dummyList", Lists.newArrayList()); diff --git a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNugetConfiguration.java b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNugetConfiguration.java index f9af9113..5c986576 100644 --- a/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNugetConfiguration.java +++ b/src/main/java/org/jfrog/bamboo/configuration/ArtifactoryNugetConfiguration.java @@ -15,8 +15,9 @@ public class ArtifactoryNugetConfiguration extends AbstractDotNetBuildConfigurat private static final String KEY = "artifactoryNugetBuilder"; - public ArtifactoryNugetConfiguration() { - super(CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".nuget"); + @Override + protected String getCapabilityPrefix() { + return CapabilityDefaultsHelper.CAPABILITY_BUILDER_PREFIX + ".nuget"; } @Override diff --git a/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPostBuildCompleteAction.java b/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPostBuildCompleteAction.java index 9383146c..1bf20328 100644 --- a/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPostBuildCompleteAction.java +++ b/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPostBuildCompleteAction.java @@ -17,6 +17,7 @@ import org.jfrog.bamboo.release.provider.ReleaseProvider; import org.jfrog.bamboo.util.TaskDefinitionHelper; +import javax.inject.Inject; import java.util.List; import java.util.Map; @@ -29,8 +30,11 @@ public class ArtifactoryPostBuildCompleteAction extends AbstractBuildAction implements CustomBuildProcessor { private static final Logger log = LogManager.getLogger(ArtifactoryPostBuildCompleteAction.class); + @Inject private BuildLoggerManager buildLoggerManager; + @Inject private CustomVariableContext customVariableContext; + @Inject private CredentialsAccessor credentialsAccessor; @Override diff --git a/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPreBuildAction.java b/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPreBuildAction.java index 0dda7e41..0629da9a 100644 --- a/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPreBuildAction.java +++ b/src/main/java/org/jfrog/bamboo/release/action/ArtifactoryPreBuildAction.java @@ -7,6 +7,7 @@ import com.atlassian.bamboo.task.TaskDefinition; import com.atlassian.bamboo.v2.build.BuildContext; import com.atlassian.bamboo.variable.CustomVariableContext; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -15,6 +16,7 @@ import org.jfrog.bamboo.release.provider.ReleaseProvider; import org.jfrog.bamboo.util.TaskDefinitionHelper; +import javax.inject.Inject; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -29,8 +31,12 @@ public class ArtifactoryPreBuildAction extends AbstractBuildAction implements CustomPreBuildAction { private static final Logger log = LogManager.getLogger(ArtifactoryPreBuildAction.class); + @Inject + @ComponentImport private BuildLoggerManager buildLoggerManager; + @Inject private CustomVariableContext customVariableContext; + @Inject private CredentialsAccessor credentialsAccessor; @Override diff --git a/src/main/java/org/jfrog/bamboo/release/action/ReleasePromotionAction.java b/src/main/java/org/jfrog/bamboo/release/action/ReleasePromotionAction.java index c8f925e1..e1cafc5d 100644 --- a/src/main/java/org/jfrog/bamboo/release/action/ReleasePromotionAction.java +++ b/src/main/java/org/jfrog/bamboo/release/action/ReleasePromotionAction.java @@ -10,6 +10,7 @@ import com.atlassian.bamboo.plugin.RemoteAgentSupported; import com.atlassian.bamboo.repository.RepositoryException; import com.atlassian.bamboo.resultsummary.ResultsSummary; +import com.atlassian.bamboo.resultsummary.ResultsSummaryManager; import com.atlassian.bamboo.security.acegi.acls.BambooPermission; import com.atlassian.bamboo.task.TaskDefinition; import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext; @@ -43,6 +44,7 @@ import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; +import javax.inject.Inject; import java.io.IOException; import java.util.List; import java.util.Map; @@ -74,6 +76,7 @@ public class ReleasePromotionAction extends ViewBuildResults { private boolean promoting = true; private String promotionRepo = ""; private VariableDefinitionManager variableDefinitionManager; + private ResultsSummaryManager resultsSummaryManager; private String comment = ""; private String target = ""; private boolean useCopy; @@ -91,8 +94,10 @@ public class ReleasePromotionAction extends ViewBuildResults { private String releaseBranch; private List versions; - public ReleasePromotionAction() { - this.serverConfigManager = ServerConfigManager.getInstance(); + @Inject + public ReleasePromotionAction(ServerConfigManager serverConfigManager, ResultsSummaryManager resultsSummaryManager) { + this.serverConfigManager = serverConfigManager; + this.resultsSummaryManager = resultsSummaryManager; } @Override @@ -348,8 +353,7 @@ public List getPublishingRepos() { if (StringUtils.isBlank(serverId)) { return Lists.newArrayList(); } - ServerConfigManager component = ServerConfigManager.getInstance(); - return component.getDeployableRepos(Long.parseLong(serverId)); + return serverConfigManager.getDeployableRepos(Long.parseLong(serverId)); } public String getReleasePublishingRepo() { @@ -501,7 +505,6 @@ public String doPromote() throws IOException { log.error("You are not permitted to execute build promotion."); return ERROR; } - ServerConfigManager component = ServerConfigManager.getInstance(); TaskDefinition definition = getMavenOrGradleTaskDefinition(getImmutablePlan()); if (definition == null) { return ERROR; @@ -511,7 +514,7 @@ public String doPromote() throws IOException { log.error("No selected Artifactory server Id"); return ERROR; } - ServerConfig serverConfig = component.getServerConfigById(Long.parseLong(serverId)); + ServerConfig serverConfig = serverConfigManager.getServerConfigById(Long.parseLong(serverId)); if (serverConfig == null) { log.error("Error while retrieving target repository list: Could not find Artifactory server " + "configuration by the ID " + serverId); @@ -586,8 +589,7 @@ public List getPromotionRepos() { log.warn("No Artifactory server Id found"); return Lists.newArrayList(); } - ServerConfigManager component = ServerConfigManager.getInstance(); - return component.getDeployableRepos(Long.parseLong(selectedServerId)); + return serverConfigManager.getDeployableRepos(Long.parseLong(selectedServerId)); } /** diff --git a/src/main/java/org/jfrog/bamboo/release/action/condition/ReleasePromotionActionCondition.java b/src/main/java/org/jfrog/bamboo/release/action/condition/ReleasePromotionActionCondition.java index ff144987..065a9d21 100644 --- a/src/main/java/org/jfrog/bamboo/release/action/condition/ReleasePromotionActionCondition.java +++ b/src/main/java/org/jfrog/bamboo/release/action/condition/ReleasePromotionActionCondition.java @@ -7,9 +7,12 @@ import com.atlassian.bamboo.plan.branch.ChainBranch; import com.atlassian.bamboo.plugins.web.conditions.AbstractPlanPermissionCondition; import com.atlassian.bamboo.security.acegi.acls.BambooPermission; +import com.atlassian.bamboo.security.BambooPermissionManager; import com.atlassian.bamboo.task.TaskDefinition; +import com.atlassian.plugin.spring.scanner.annotation.imports.BambooImport; import org.jfrog.bamboo.context.PackageManagersContext; +import javax.inject.Inject; import java.util.List; import java.util.Map; @@ -20,9 +23,15 @@ * @author Tomer Cohen */ public class ReleasePromotionActionCondition extends AbstractPlanPermissionCondition { - + + @Inject + @BambooImport private PlanManager planManager; + @Inject + @BambooImport + private BambooPermissionManager bambooPermissionManager; + @Override public boolean shouldDisplay(Map context) { String planKeyStr = (String) context.get("planKey"); @@ -85,4 +94,8 @@ private Plan extractMasterPlanFromBranchPlan(PlanKey planKey) { public void setPlanManager(PlanManager planManager) { this.planManager = planManager; } + + public void setBambooPermissionManager(BambooPermissionManager bambooPermissionManager) { + this.bambooPermissionManager = bambooPermissionManager; + } } diff --git a/src/main/java/org/jfrog/bamboo/release/vcs/AbstractVcsCoordinator.java b/src/main/java/org/jfrog/bamboo/release/vcs/AbstractVcsCoordinator.java index 91c46652..3faae5ee 100644 --- a/src/main/java/org/jfrog/bamboo/release/vcs/AbstractVcsCoordinator.java +++ b/src/main/java/org/jfrog/bamboo/release/vcs/AbstractVcsCoordinator.java @@ -8,7 +8,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jfrog.bamboo.release.vcs.git.GitCoordinator; -import org.jfrog.bamboo.release.vcs.perforce.PerforceCoordinator; import java.io.File; import java.io.IOException; @@ -57,9 +56,6 @@ public static VcsCoordinator createVcsCoordinator(BuildContext context, if (VcsTypes.GIT.name().equals(configuration.get("artifactory.vcs.type"))) { return new GitCoordinator(context, combined, buildLogger, customVariableContext, credentialsAccessor); } - if (VcsTypes.PERFORCE.name().equals(configuration.get("artifactory.vcs.type"))) { - return new PerforceCoordinator(context, combined, buildLogger, customVariableContext, credentialsAccessor); - } throw new UnsupportedOperationException("This VCS type is not supported"); } diff --git a/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceCoordinator.java b/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceCoordinator.java deleted file mode 100644 index e48a1dfa..00000000 --- a/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceCoordinator.java +++ /dev/null @@ -1,145 +0,0 @@ -package org.jfrog.bamboo.release.vcs.perforce; - -import com.atlassian.bamboo.build.logger.BuildLogger; -import com.atlassian.bamboo.builder.BuildState; -import com.atlassian.bamboo.credentials.CredentialsAccessor; -import com.atlassian.bamboo.v2.build.BuildContext; -import com.atlassian.bamboo.v2.build.CurrentBuildResult; -import com.atlassian.bamboo.variable.CustomVariableContext; -import org.jfrog.bamboo.context.PackageManagersContext; -import org.jfrog.bamboo.release.vcs.AbstractVcsCoordinator; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -/** - * Perforce coordinator that will perform SCM operations that are specific to the Perforce SCM. - * - * @author Shay Yaakov - */ -public class PerforceCoordinator extends AbstractVcsCoordinator { - - private PerforceManager perforce; - - private final Map configuration; - private boolean tagCreated; - private int currentChangeListId; - - public PerforceCoordinator(BuildContext context, Map configuration, BuildLogger buildLogger, - CustomVariableContext customVariableContext, CredentialsAccessor credentialsAccessor) { - super(context, buildLogger, customVariableContext, credentialsAccessor); - this.configuration = configuration; - } - - @Override - public void prepare() throws IOException { - perforce = new PerforceManager(context, buildLogger); - perforce.prepare(); - } - - @Override - public void beforeReleaseVersionChange() throws IOException { - currentChangeListId = perforce.createNewChangeList(); - } - - @Override - public void afterSuccessfulReleaseVersionBuild() throws IOException, InterruptedException { - PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration); - PackageManagersContext.ReleaseManagementContext releaseManagementContext = context.releaseManagementContext; - String labelChangeListId = configuration.get("repository.revision.number"); - if (modifiedFilesForReleaseVersion) { - log("Submitting release version changes"); - labelChangeListId = currentChangeListId + ""; - perforce.commitWorkingCopy(currentChangeListId, releaseManagementContext.getTagComment()); - } else { - safeRevertWorkingCopy(); - currentChangeListId = perforce.getDefaultChangeListId(); - } - - if (releaseManagementContext.isCreateVcsTag()) { - log("Creating label: '" + releaseManagementContext.getTagUrl() + "' with change list id: " + labelChangeListId); - perforce.createTag(releaseManagementContext.getTagUrl(), releaseManagementContext.getTagComment(), - labelChangeListId); - tagCreated = true; - } - } - - @Override - public void beforeDevelopmentVersionChange() throws IOException { - currentChangeListId = perforce.getDefaultChangeListId(); - } - - @Override - public void afterDevelopmentVersionChange(boolean modified) throws IOException, InterruptedException { - super.afterDevelopmentVersionChange(modified); - PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration); - PackageManagersContext.ReleaseManagementContext releaseManagementContext = context.releaseManagementContext; - if (modified) { - log("Submitting next development version changes"); - perforce.commitWorkingCopy(currentChangeListId, releaseManagementContext.getNextDevelopmentComment()); - } else { - safeRevertWorkingCopy(); - currentChangeListId = perforce.getDefaultChangeListId(); - } - } - - @Override - public void edit(File file) throws IOException, InterruptedException { - log("Opening file: '" + file.getAbsolutePath() + "' for editing"); - perforce.edit(currentChangeListId, file); - } - - @Override - public void buildCompleted(BuildContext buildContext) throws IOException, InterruptedException { - PackageManagersContext context = PackageManagersContext.createContextFromMap(configuration); - CurrentBuildResult result = buildContext.getBuildResult(); - if (!BuildState.SUCCESS.equals(result.getBuildState())) { - safeRevertWorkingCopy(); - if (tagCreated) { - safeDeleteLabel(context.releaseManagementContext.getTagUrl()); - } - } else { - log("Closing connection to perforce server"); - perforce.closeConnection(); - } - } - - private void safeRevertWorkingCopy() { - log("Reverting local changes"); - try { - perforce.revertWorkingCopy(currentChangeListId); - } catch (Exception e) { - log("Failed to revert: " + e.getLocalizedMessage()); - } - } - - private void safeDeleteLabel(String label) throws IOException { - log("Deleting label '" + label + "'"); - try { - perforce.deleteLabel(label); - } catch (Exception e) { - log("Failed to delete label: " + e.getLocalizedMessage()); - } - } - - @Override - public String getRemoteUrlForPom() { - return null; - } - - @Override - public boolean isSubversion() { - return false; - } - - @Override - public int getCurrentChangeListId() { - return currentChangeListId; - } - - @Override - public void setCurrentChangeListId(int currentChangeListId) { - this.currentChangeListId = currentChangeListId; - } -} diff --git a/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceManager.java b/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceManager.java deleted file mode 100644 index 648fb47e..00000000 --- a/src/main/java/org/jfrog/bamboo/release/vcs/perforce/PerforceManager.java +++ /dev/null @@ -1,112 +0,0 @@ -package org.jfrog.bamboo.release.vcs.perforce; - -import com.atlassian.bamboo.build.logger.BuildLogger; -import com.atlassian.bamboo.repository.perforce.PerforceRepository; -import com.atlassian.bamboo.v2.build.BuildContext; -import org.apache.commons.lang.StringUtils; -import org.jfrog.bamboo.context.PackageManagersContext; -import org.jfrog.bamboo.release.vcs.AbstractVcsManager; -import org.jfrog.build.vcs.perforce.PerforceClient; - -import java.io.File; -import java.io.IOException; -import java.util.Map; - -/** - * Manager that manages the {@link PerforceRepository} - * - * @author Shay Yaakov - */ -public class PerforceManager extends AbstractVcsManager { - - private PerforceClient perforce; - private String port = ""; - private String client = ""; - private String username = ""; - private String password = ""; - - public PerforceManager(BuildContext context, BuildLogger buildLogger) { - super(context, buildLogger); - Map confMap = getTaskConfiguration(); - if (confMap != null) { - port = confMap.get(PackageManagersContext.VCS_PREFIX + PackageManagersContext.PERFORCE_PORT); - client = confMap.get(PackageManagersContext.VCS_PREFIX + PackageManagersContext.PERFORCE_CLIENT); - username = confMap.get(PackageManagersContext.VCS_PREFIX + PackageManagersContext.PERFORCE_USERNAME); - password = confMap.get(PackageManagersContext.VCS_PREFIX + PackageManagersContext.PERFORCE_PASSWORD); - } - } - - public void prepare() throws IOException { - PerforceClient.Builder builder = new PerforceClient.Builder(); - String hostAddress = port; - if (!hostAddress.contains(":")) { - hostAddress = "localhost:" + hostAddress; - } - builder.hostAddress(hostAddress).client(client); - if (!StringUtils.isEmpty(username)) { - builder.username(username).password(password); - } - String charset = System.getenv("P4CHARSET"); - if (!StringUtils.isBlank(charset)) { - builder.charset(charset); - } - perforce = builder.build(); - } - - public void commitWorkingCopy(int changeListId, String commitMessage) throws IOException { - perforce.commitWorkingCopy(changeListId, commitMessage); - } - - @Override - public void commitWorkingCopy(String commitMessage) throws IOException, InterruptedException { - throw new UnsupportedOperationException("Use the overloaded method"); - } - - public void createTag(String label, String commitMessage, String changeListId) throws IOException { - perforce.createLabel(label, commitMessage, changeListId); - } - - @Override - public void createTag(String tagUrl, String commitMessage) throws IOException, InterruptedException { - throw new UnsupportedOperationException("Use the overloaded method"); - } - - @Override - public String getRemoteUrl() { - throw new UnsupportedOperationException("Remote URL not supported"); - } - - public void revertWorkingCopy(int changeListId) throws IOException { - perforce.revertWorkingCopy(changeListId); - } - - public void deleteLabel(String tagUrl) throws IOException { - perforce.deleteLabel(tagUrl); - } - - public void edit(int changeListId, File releaseVersion) throws IOException { - perforce.editFile(changeListId, releaseVersion); - } - - /** - * Creates a new changelist and returns its id number - * - * @return The id of the newly created changelist - * @throws IOException In case of errors communicating with perforce server - */ - public int createNewChangeList() throws IOException { - return perforce.createNewChangeList(); - } - - public void deleteChangeList(int changeListId) throws IOException { - perforce.deleteChangeList(changeListId); - } - - public int getDefaultChangeListId() throws IOException { - return perforce.getDefaultChangeListId(); - } - - public void closeConnection() throws IOException { - perforce.closeConnection(); - } -} diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryCollectBuildIssuesTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryCollectBuildIssuesTask.java index c78f1913..a487ee04 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryCollectBuildIssuesTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryCollectBuildIssuesTask.java @@ -6,8 +6,10 @@ import com.atlassian.bamboo.v2.build.BuildContext; import com.atlassian.bamboo.variable.CustomVariableContext; import com.atlassian.spring.container.ContainerManager; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.CollectBuildIssuesContext; @@ -19,6 +21,7 @@ import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; import org.jfrog.build.extractor.issuesCollection.IssuesCollector; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.util.Map; @@ -26,14 +29,23 @@ import static org.jfrog.build.extractor.clientConfiguration.util.GitUtils.extractVcs; public class ArtifactoryCollectBuildIssuesTask extends ArtifactoryTaskType { - private final EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + @ComponentImport + private EnvironmentVariableAccessor environmentVariableAccessor; private CollectBuildIssuesContext collectBuildIssuesContext; + @Inject + @ComponentImport private CustomVariableContext customVariableContext; private BuildInfoHelper buildInfoHelper; + @Inject + private ServerConfigManager serverConfigManager; - public ArtifactoryCollectBuildIssuesTask(EnvironmentVariableAccessor environmentVariableAccessor) { + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { this.environmentVariableAccessor = environmentVariableAccessor; - ContainerManager.autowireComponent(this); + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; } @Override @@ -47,7 +59,7 @@ protected void initTask(@NotNull CommonTaskContext context) throws TaskException collectBuildIssuesContext.getBuildNumber(buildContext), taskContext, buildContext, environmentVariableAccessor, collectBuildIssuesContext.getArtifactoryServerId(), collectBuildIssuesContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), - collectBuildIssuesContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager); + collectBuildIssuesContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager, serverConfigManager); } @NotNull diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentDownloadTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentDownloadTask.java index c7e9f0fd..09bac493 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentDownloadTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentDownloadTask.java @@ -7,6 +7,7 @@ import com.atlassian.bamboo.task.TaskResult; import com.atlassian.bamboo.task.TaskResultBuilder; import com.atlassian.bamboo.variable.CustomVariableContext; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; import org.jfrog.bamboo.admin.ServerConfigManager; @@ -18,6 +19,7 @@ import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; import org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper; +import javax.inject.Inject; import java.io.IOException; import java.util.Map; @@ -27,10 +29,14 @@ * @author Yahav Itzhak */ public class ArtifactoryDeploymentDownloadTask extends ArtifactoryDeploymentTaskType { + @Inject + @ComponentImport private CustomVariableContext customVariableContext; private ServerConfig downloadServerConfig; private GenericContext genericContext; private String fileSpec; + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { @@ -54,7 +60,6 @@ public TaskResult runTask(@NotNull DeploymentTaskContext deploymentTaskContext) } private ServerConfig getArtifactoryServerConfig(BuildParamsOverrideManager buildParamsOverrideManager) { - ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(); ServerConfig selectedServerConfig = serverConfigManager.getServerConfigById(genericContext.getSelectedServerId()); if (selectedServerConfig == null) { throw new IllegalArgumentException("Could not find Artifactory server. Please check the Artifactory server in the task configuration."); @@ -79,6 +84,10 @@ public void setCustomVariableContext(CustomVariableContext customVariableContext this.customVariableContext = customVariableContext; } + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + @Override protected ServerConfig getUsageServerConfig() { return downloadServerConfig; diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentUploadTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentUploadTask.java index 69d30372..5fe64ed0 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentUploadTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDeploymentUploadTask.java @@ -6,6 +6,7 @@ import com.atlassian.bamboo.task.TaskResult; import com.atlassian.bamboo.task.TaskResultBuilder; import com.atlassian.bamboo.variable.CustomVariableContext; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; @@ -20,6 +21,7 @@ import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; import org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.util.HashMap; @@ -32,10 +34,15 @@ */ public class ArtifactoryDeploymentUploadTask extends ArtifactoryDeploymentTaskType { + @Inject + @ComponentImport private CustomVariableContext customVariableContext; private ServerConfig uploadServerConfig; private String fileSpec; + @Inject + private ServerConfigManager serverConfigManager; + @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); @@ -45,7 +52,7 @@ protected void initTask(@NotNull CommonTaskContext context) throws TaskException uploadServerConfig = TaskUtils.getResolutionServerConfig( deploymentUploadContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), deploymentUploadContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), - ServerConfigManager.getInstance(), selectedServerConfig, new BuildParamsOverrideManager(customVariableContext)); + serverConfigManager, selectedServerConfig, new BuildParamsOverrideManager(customVariableContext)); } @NotNull @@ -95,7 +102,6 @@ private void initFileSpec(CommonTaskContext context) throws IOException { * Get configurations of the selected server in the task definition. */ private ServerConfig getSelectedServerConfig(@NotNull CommonTaskContext deploymentTaskContext) { - ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(); String serverId = deploymentTaskContext.getConfigurationMap().get(ArtifactoryDeploymentUploadConfiguration.DEPLOYMENT_PREFIX + PackageManagersContext.SERVER_ID_PARAM); if (StringUtils.isBlank(serverId)) { // Compatibility with version 1.8.0 @@ -127,4 +133,8 @@ private Boolean isFileSpecInJobConfiguration(CommonTaskContext context) { public void setCustomVariableContext(CustomVariableContext customVariableContext) { this.customVariableContext = customVariableContext; } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } } \ No newline at end of file diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDockerTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDockerTask.java index 28f0c659..8dd36cdf 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDockerTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDockerTask.java @@ -5,8 +5,10 @@ import com.atlassian.bamboo.v2.build.BuildContext; import com.atlassian.bamboo.variable.CustomVariableContext; import com.atlassian.spring.container.ContainerManager; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.DockerBuildContext; @@ -16,14 +18,18 @@ import org.jfrog.build.extractor.docker.extractor.DockerPull; import org.jfrog.build.extractor.docker.extractor.DockerPush; +import javax.inject.Inject; import java.util.Map; /** * Created by Bar Belity on 09/10/2020. */ public class ArtifactoryDockerTask extends ArtifactoryTaskType { - private final EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + @ComponentImport + private EnvironmentVariableAccessor environmentVariableAccessor; private BuildParamsOverrideManager buildParamsOverrideManager; + @Inject private CustomVariableContext customVariableContext; private Map environmentVariables; private DockerBuildContext dockerBuildContext; @@ -32,10 +38,8 @@ public class ArtifactoryDockerTask extends ArtifactoryTaskType { private String buildName; private ArtifactoryManagerBuilder artifactoryManagerBuilder; - public ArtifactoryDockerTask(EnvironmentVariableAccessor environmentVariableAccessor) { - this.environmentVariableAccessor = environmentVariableAccessor; - ContainerManager.autowireComponent(this); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { @@ -100,12 +104,12 @@ private void initBuildInfoHelper(BuildContext buildContext) { buildInfoHelper = BuildInfoHelper.createResolveBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, dockerBuildContext.getResolutionArtifactoryServerId(), dockerBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, false), - dockerBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager); + dockerBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager, serverConfigManager); } else { buildInfoHelper = BuildInfoHelper.createDeployBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, dockerBuildContext.getArtifactoryServerId(), dockerBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), - dockerBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager); + dockerBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager, serverConfigManager); } } @@ -113,6 +117,14 @@ public void setCustomVariableContext(CustomVariableContext customVariableContext this.customVariableContext = customVariableContext; } + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } + @Override protected ServerConfig getUsageServerConfig() { return buildInfoHelper.getServerConfig(); diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetCoreTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetCoreTask.java index 05fbfa48..a1030d9c 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetCoreTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetCoreTask.java @@ -1,11 +1,11 @@ package org.jfrog.bamboo.task; -import com.atlassian.bamboo.process.EnvironmentVariableAccessor; import com.atlassian.bamboo.task.CommonTaskContext; import com.atlassian.bamboo.task.TaskException; -import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext; import org.jetbrains.annotations.NotNull; +import javax.inject.Inject; + /** * Created by Bar Belity on 13/10/2020. */ @@ -14,10 +14,6 @@ public class ArtifactoryDotNetCoreTask extends ArtifactoryDotNetTaskBase { private static final String EXECUTABLE_NAME = "dotnet"; private static final String DOTNETCORE_KEY = "system.builder.dotnet."; - public ArtifactoryDotNetCoreTask(EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext) { - super(environmentVariableAccessor, capabilityContext); - } - @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { initTask(context, DOTNETCORE_KEY, EXECUTABLE_NAME, TASK_NAME, TaskType.DOTNET); diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetTaskBase.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetTaskBase.java index ff0aaf90..aaa9377e 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetTaskBase.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryDotNetTaskBase.java @@ -10,6 +10,7 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.DotNetBuildContext; @@ -21,6 +22,7 @@ import org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper; import org.jfrog.build.extractor.nuget.extractor.NugetRun; +import javax.inject.Inject; import java.io.File; import java.nio.file.Path; import java.util.HashMap; @@ -32,8 +34,11 @@ */ public abstract class ArtifactoryDotNetTaskBase extends ArtifactoryTaskType { - protected final EnvironmentVariableAccessor environmentVariableAccessor; - protected final CapabilityContext capabilityContext; + @Inject + protected EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + protected CapabilityContext capabilityContext; + @Inject protected CustomVariableContext customVariableContext; protected DotNetBuildContext dotNetBuildContext; protected BuildInfoHelper buildInfoHelper; @@ -51,6 +56,8 @@ public abstract class ArtifactoryDotNetTaskBase extends ArtifactoryTaskType { " }\n" + " ]\n" + "}"; + @Inject + private ServerConfigManager serverConfigManager; protected void initTask(CommonTaskContext context, String taskKey, String executable, String taskName, TaskType taskType) throws TaskException { super.initTask(context); @@ -96,12 +103,6 @@ public TaskResult runTask(@NotNull TaskContext taskContext) { return TaskResultBuilder.newBuilder(taskContext).success().build(); } - protected ArtifactoryDotNetTaskBase(EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext) { - this.environmentVariableAccessor = environmentVariableAccessor; - this.capabilityContext = capabilityContext; - ContainerManager.autowireComponent(this); - } - protected BuildInfo executeRestore() { ArtifactoryManagerBuilder artifactoryManagerBuilder = TaskUtils.getArtifactoryManagerBuilderBuilder( buildInfoHelper.getServerConfig(), new BuildInfoLog(log, logger)); @@ -164,12 +165,12 @@ protected void initBuildInfoHelper(BuildContext buildContext) { buildInfoHelper = BuildInfoHelper.createResolveBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, dotNetBuildContext.getResolutionArtifactoryServerId(), dotNetBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, false), - dotNetBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager); + dotNetBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager, serverConfigManager); } else { buildInfoHelper = BuildInfoHelper.createDeployBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, dotNetBuildContext.getArtifactoryServerId(), dotNetBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), - dotNetBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager); + dotNetBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager, serverConfigManager); } } @@ -177,6 +178,18 @@ public void setCustomVariableContext(CustomVariableContext customVariableContext this.customVariableContext = customVariableContext; } + public void setCapabilityContext(CapabilityContext capabilityContext) { + this.capabilityContext = capabilityContext; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } + @Override protected ServerConfig getUsageServerConfig() { return buildInfoHelper.getServerConfig(); diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericDeployTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericDeployTask.java index dc245fd8..3c6dd393 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericDeployTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericDeployTask.java @@ -7,19 +7,21 @@ import com.atlassian.bamboo.v2.build.CurrentBuildResult; import com.atlassian.bamboo.variable.CustomVariableContext; import com.atlassian.spring.container.ContainerManager; -import com.google.common.collect.HashMultimap; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.GenericContext; import org.jfrog.bamboo.util.FileSpecUtils; import org.jfrog.bamboo.util.TaskDefinitionHelper; import org.jfrog.bamboo.util.Utils; +import org.jfrog.build.api.multiMap.ListMultimap; +import org.jfrog.build.api.multiMap.Multimap; import org.jfrog.build.api.util.FileChecksumCalculator; import org.jfrog.build.extractor.ci.Artifact; import org.jfrog.build.extractor.ci.BuildInfo; @@ -29,6 +31,7 @@ import org.jfrog.build.extractor.clientConfiguration.util.PublishedItemsHelper; import org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.security.NoSuchAlgorithmException; @@ -45,23 +48,32 @@ */ public class ArtifactoryGenericDeployTask extends ArtifactoryTaskType { public static final String TASK_NAME = "artifactoryGenericTask"; - private final EnvironmentVariableAccessor environmentVariableAccessor; - private final BuildParamsOverrideManager buildParamsOverrideManager; + @Inject + @ComponentImport + private EnvironmentVariableAccessor environmentVariableAccessor; + private BuildParamsOverrideManager buildParamsOverrideManager; + @Inject + @ComponentImport private CustomVariableContext customVariableContext; private BuildInfoHelper buildInfoHelper; private GenericContext genericContext; private BuildContext buildContext; private String fileSpec; + @Inject + private ServerConfigManager serverConfigManager; - public ArtifactoryGenericDeployTask(EnvironmentVariableAccessor environmentVariableAccessor) { + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { this.environmentVariableAccessor = environmentVariableAccessor; - ContainerManager.autowireComponent(this); - this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext); } @Override public void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); + this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext); buildContext = ((TaskContext) taskContext).getBuildContext(); genericContext = new GenericContext(taskContext.getConfigurationMap()); Map runtimeContext = context.getRuntimeTaskContext(); @@ -70,7 +82,8 @@ public void initTask(@NotNull CommonTaskContext context) throws TaskException { genericContext.getSelectedServerId(), genericContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), genericContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), - buildParamsOverrideManager); + buildParamsOverrideManager, + serverConfigManager); } @Override @@ -160,7 +173,7 @@ private File getWorkingDirectory() { private Multimap buildTargetPathToFiles(File directory, GenericContext context) throws IOException { - Multimap result = HashMultimap.create(); + Multimap result = new ListMultimap<>(); String deployPattern = context.getDeployPattern(); deployPattern = StringUtils.replace(deployPattern, "\r\n", "\n"); deployPattern = StringUtils.replace(deployPattern, ",", "\n"); diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericResolveTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericResolveTask.java index 2b337b4d..86fb6200 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericResolveTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGenericResolveTask.java @@ -9,6 +9,7 @@ import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.GenericContext; @@ -22,6 +23,7 @@ import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; import org.jfrog.build.extractor.clientConfiguration.util.spec.SpecsHelper; +import javax.inject.Inject; import java.io.IOException; import java.util.List; import java.util.Map; @@ -31,22 +33,21 @@ */ public class ArtifactoryGenericResolveTask extends ArtifactoryTaskType { - private final EnvironmentVariableAccessor environmentVariableAccessor; - private final BuildParamsOverrideManager buildParamsOverrideManager; + @Inject + private EnvironmentVariableAccessor environmentVariableAccessor; + private BuildParamsOverrideManager buildParamsOverrideManager; + @Inject private CustomVariableContext customVariableContext; private BuildInfoHelper buildInfoHelper; private GenericContext genericContext; private String fileSpec; - - public ArtifactoryGenericResolveTask(EnvironmentVariableAccessor environmentVariableAccessor) { - this.environmentVariableAccessor = environmentVariableAccessor; - ContainerManager.autowireComponent(this); - this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); + this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext); BuildContext buildContext = ((TaskContext) context).getBuildContext(); genericContext = new GenericContext(context.getConfigurationMap()); Map runtimeContext = context.getRuntimeTaskContext(); @@ -54,7 +55,7 @@ protected void initTask(@NotNull CommonTaskContext context) throws TaskException genericContext.getBuildNumber(buildContext), context, buildContext, environmentVariableAccessor, genericContext.getSelectedServerId(), genericContext.getOverriddenUsername(runtimeContext, buildInfoLog, false), - genericContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager); + genericContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager, serverConfigManager); } @NotNull @@ -110,4 +111,12 @@ private void initFileSpec(CommonTaskContext context, BuildLogger logger) throws public void setCustomVariableContext(CustomVariableContext customVariableContext) { this.customVariableContext = customVariableContext; } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } } diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGradleTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGradleTask.java index 3dc267ca..cf424f0a 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryGradleTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryGradleTask.java @@ -16,6 +16,7 @@ import org.apache.tools.ant.types.Commandline; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuilderDependencyHelper; import org.jfrog.bamboo.builder.GradleDataHelper; import org.jfrog.bamboo.context.GradleBuildContext; @@ -27,6 +28,7 @@ import org.jfrog.build.extractor.ci.BuildInfoFields; import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -50,32 +52,28 @@ public class ArtifactoryGradleTask extends BaseJavaBuildTask { public static final String EXECUTABLE_WRAPPER_NAME = SystemUtils.IS_OS_WINDOWS ? "./gradlew.bat" : "./gradlew"; public static final String EXECUTABLE_NAME = SystemUtils.IS_OS_WINDOWS ? "gradle.bat" : "gradle"; private static final String GRADLE_KEY = "system.builder.gradle."; + @Inject private AdministrationConfiguration administrationConfiguration; - private final BuilderDependencyHelper dependencyHelper; - private final CapabilityContext capabilityContext; + private BuilderDependencyHelper dependencyHelper; + @Inject + private CapabilityContext capabilityContext; private GradleBuildContext gradleBuildContext; private GradleDataHelper gradleDataHelper; private String artifactoryPluginVersion; private String gradleDependenciesDir; - - public ArtifactoryGradleTask(final ProcessService processService, - final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext, - TestCollationService testCollationService) { - super(testCollationService, environmentVariableAccessor, processService); - this.capabilityContext = capabilityContext; - dependencyHelper = new BuilderDependencyHelper("artifactoryGradleBuilder"); - ContainerManager.autowireComponent(dependencyHelper); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); + dependencyHelper = new BuilderDependencyHelper("artifactoryGradleBuilder"); artifactoryPluginVersion = Utils.getPluginVersion(pluginAccessor); gradleBuildContext = createBuildContext(context); initEnvironmentVariables(gradleBuildContext); aggregateBuildInfo = gradleBuildContext.shouldAggregateBuildInfo(context); gradleDataHelper = new GradleDataHelper(buildParamsOverrideManager, context, gradleBuildContext, - administrationConfiguration, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo); + administrationConfiguration, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo, serverConfigManager); } @Override @@ -240,4 +238,12 @@ private String extractGradleDependencies(long artifactoryServerId, GradleBuildCo public void setAdministrationConfiguration(AdministrationConfiguration administrationConfiguration) { this.administrationConfiguration = administrationConfiguration; } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setCapabilityContext(CapabilityContext capabilityContext) { + this.capabilityContext = capabilityContext; + } } diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryIvyTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryIvyTask.java index 72f9eb03..be661afa 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryIvyTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryIvyTask.java @@ -16,6 +16,7 @@ import org.apache.tools.ant.types.Commandline; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuilderDependencyHelper; import org.jfrog.bamboo.builder.IvyDataHelper; import org.jfrog.bamboo.builder.MavenAndIvyBuildInfoDataHelperBase; @@ -24,6 +25,7 @@ import org.jfrog.bamboo.util.TaskUtils; import org.jfrog.bamboo.util.Utils; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.util.Arrays; @@ -41,26 +43,18 @@ public class ArtifactoryIvyTask extends BaseJavaBuildTask { public static final String TASK_NAME = "artifactoryIvyTask"; public static final String EXECUTABLE_NAME = SystemUtils.IS_OS_WINDOWS ? "ant.bat" : "ant"; private static final String IVY_KEY = "system.builder.ivy."; - private final EnvironmentVariableAccessor environmentVariableAccessor; - private final CapabilityContext capabilityContext; - private final BuilderDependencyHelper dependencyHelper; + private CapabilityContext capabilityContext; + private BuilderDependencyHelper dependencyHelper; private IvyBuildContext ivyBuildContext; private MavenAndIvyBuildInfoDataHelperBase ivyDataHelper; private String artifactoryPluginVersion; - - public ArtifactoryIvyTask(final ProcessService processService, - final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext, - TestCollationService testCollationService) { - super(testCollationService, environmentVariableAccessor, processService); - this.environmentVariableAccessor = environmentVariableAccessor; - this.capabilityContext = capabilityContext; - dependencyHelper = new BuilderDependencyHelper("artifactoryIvyBuilder"); - ContainerManager.autowireComponent(dependencyHelper); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); + dependencyHelper = new BuilderDependencyHelper("artifactoryIvyBuilder"); Map combinedMap = Maps.newHashMap(); combinedMap.putAll(context.getConfigurationMap()); combinedMap.putAll(((TaskContext)context).getBuildContext().getBuildDefinition().getCustomConfiguration()); @@ -68,7 +62,7 @@ protected void initTask(@NotNull CommonTaskContext context) throws TaskException initEnvironmentVariables(ivyBuildContext); aggregateBuildInfo = ivyBuildContext.shouldAggregateBuildInfo(context, ivyBuildContext.getArtifactoryServerId()); artifactoryPluginVersion = Utils.getPluginVersion(pluginAccessor); - ivyDataHelper = new IvyDataHelper(buildParamsOverrideManager, context, ivyBuildContext, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo); + ivyDataHelper = new IvyDataHelper(buildParamsOverrideManager, context, ivyBuildContext, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo, serverConfigManager); } @Override @@ -177,4 +171,12 @@ private String extractIvyDependencies(long artifactoryServerId, IvyBuildContext return dependencyHelper.downloadDependenciesAndGetPath(bambooTmp, getPlanKey(customVariableContext), context, PluginProperties.getPluginProperty(PluginProperties.IVY_DEPENDENCY_FILENAME_KEY)); } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setCapabilityContext(CapabilityContext capabilityContext) { + this.capabilityContext = capabilityContext; + } } diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryMaven3Task.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryMaven3Task.java index b9d9457e..b631dfb4 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryMaven3Task.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryMaven3Task.java @@ -15,6 +15,7 @@ import org.apache.tools.ant.types.Commandline; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuilderDependencyHelper; import org.jfrog.bamboo.builder.MavenDataHelper; import org.jfrog.bamboo.context.Maven3BuildContext; @@ -22,6 +23,7 @@ import org.jfrog.bamboo.util.TaskUtils; import org.jfrog.bamboo.util.Utils; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -44,32 +46,24 @@ public class ArtifactoryMaven3Task extends BaseJavaBuildTask { public static final String TASK_NAME = "maven3Task"; - private final EnvironmentVariableAccessor environmentVariableAccessor; - private final BuilderDependencyHelper dependencyHelper; - private final CapabilityContext capabilityContext; + private BuilderDependencyHelper dependencyHelper; + private CapabilityContext capabilityContext; private Maven3BuildContext mavenBuildContext; private MavenDataHelper mavenDataHelper; private String artifactoryPluginVersion; - - public ArtifactoryMaven3Task(final ProcessService processService, - final EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext, - TestCollationService testCollationService) { - super(testCollationService, environmentVariableAccessor, processService); - this.environmentVariableAccessor = environmentVariableAccessor; - this.capabilityContext = capabilityContext; - this.dependencyHelper = new BuilderDependencyHelper("artifactoryMaven3Builder"); - ContainerManager.autowireComponent(dependencyHelper); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext taskContext) throws TaskException { super.initTask(taskContext); + this.dependencyHelper = new BuilderDependencyHelper("artifactoryMaven3Builder"); artifactoryPluginVersion = Utils.getPluginVersion(pluginAccessor); mavenBuildContext = createBuildContext(taskContext); initEnvironmentVariables(mavenBuildContext); aggregateBuildInfo = mavenBuildContext.shouldAggregateBuildInfo(taskContext); mavenDataHelper = new MavenDataHelper(buildParamsOverrideManager, (TaskContext) taskContext, - mavenBuildContext, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo); + mavenBuildContext, environmentVariableAccessor, artifactoryPluginVersion, aggregateBuildInfo, serverConfigManager); } @Override @@ -418,4 +412,12 @@ private String getMavenHome(Maven3BuildContext context) { private String getStringWithoutNewLines(String stringToModify) { return StringUtils.replaceChars(stringToModify, "\r\n", " "); } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setCapabilityContext(CapabilityContext capabilityContext) { + this.capabilityContext = capabilityContext; + } } diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryNpmTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryNpmTask.java index 3e34876e..dc0ff226 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryNpmTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryNpmTask.java @@ -9,6 +9,7 @@ import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.NpmBuildContext; @@ -20,6 +21,7 @@ import org.jfrog.build.extractor.npm.extractor.NpmInstallCi; import org.jfrog.build.extractor.npm.extractor.NpmPublish; +import javax.inject.Inject; import java.io.File; import java.nio.file.Path; import java.util.Map; @@ -29,9 +31,12 @@ public class ArtifactoryNpmTask extends ArtifactoryTaskType { private static final String NPM_KEY = "system.builder.npm."; private static final String EXECUTABLE_NAME = "npm"; - private final EnvironmentVariableAccessor environmentVariableAccessor; - private final CapabilityContext capabilityContext; + @Inject + private EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + private CapabilityContext capabilityContext; private BuildParamsOverrideManager buildParamsOverrideManager; + @Inject private CustomVariableContext customVariableContext; private Map environmentVariables; private NpmBuildContext npmBuildContext; @@ -39,12 +44,8 @@ public class ArtifactoryNpmTask extends ArtifactoryTaskType { private String buildNumber; private String buildName; private Path packagePath; - - public ArtifactoryNpmTask(EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext) { - this.environmentVariableAccessor = environmentVariableAccessor; - this.capabilityContext = capabilityContext; - ContainerManager.autowireComponent(this); - } + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { @@ -98,12 +99,12 @@ private void initBuildInfoHelper(BuildContext buildContext) { buildInfoHelper = BuildInfoHelper.createResolveBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, npmBuildContext.getResolutionArtifactoryServerId(), npmBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, false), - npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager); + npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, false), buildParamsOverrideManager, serverConfigManager); } else { buildInfoHelper = BuildInfoHelper.createDeployBuildInfoHelper(buildName, buildNumber, taskContext, buildContext, environmentVariableAccessor, npmBuildContext.getArtifactoryServerId(), npmBuildContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), - npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager); + npmBuildContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager, serverConfigManager); } } @@ -148,6 +149,18 @@ public void setCustomVariableContext(CustomVariableContext customVariableContext this.customVariableContext = customVariableContext; } + public void setCapabilityContext(CapabilityContext capabilityContext) { + this.capabilityContext = capabilityContext; + } + + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } + public Map getEnv() throws TaskException { Map env = TaskUtils.getEnvironmentVariables(npmBuildContext, environmentVariableAccessor); // Npm commands expect the npm executable to be in "PATH". diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryNugetTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryNugetTask.java index aafd308f..f73fe117 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryNugetTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryNugetTask.java @@ -1,9 +1,7 @@ package org.jfrog.bamboo.task; -import com.atlassian.bamboo.process.EnvironmentVariableAccessor; import com.atlassian.bamboo.task.CommonTaskContext; import com.atlassian.bamboo.task.TaskException; -import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext; import org.jetbrains.annotations.NotNull; /** @@ -14,10 +12,6 @@ public class ArtifactoryNugetTask extends ArtifactoryDotNetTaskBase { private static final String EXECUTABLE_NAME = "nuget"; private static final String NUGET_KEY = "system.builder.nuget."; - public ArtifactoryNugetTask(EnvironmentVariableAccessor environmentVariableAccessor, final CapabilityContext capabilityContext) { - super(environmentVariableAccessor, capabilityContext); - } - @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { initTask(context, NUGET_KEY, EXECUTABLE_NAME, TASK_NAME, TaskType.NUGET); diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryPublishBuildInfoTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryPublishBuildInfoTask.java index 3d8fc585..a14d3090 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryPublishBuildInfoTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryPublishBuildInfoTask.java @@ -8,6 +8,7 @@ import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jfrog.bamboo.admin.ServerConfig; +import org.jfrog.bamboo.admin.ServerConfigManager; import org.jfrog.bamboo.builder.BuildInfoHelper; import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.PublishBuildInfoContext; @@ -20,6 +21,7 @@ import org.jfrog.build.extractor.clientConfiguration.ArtifactoryManagerBuilder; import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; +import javax.inject.Inject; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -34,19 +36,26 @@ public class ArtifactoryPublishBuildInfoTask extends ArtifactoryTaskType { public static final String TASK_NAME = "artifactoryPublishBuildInfoTask"; - private final EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + private EnvironmentVariableAccessor environmentVariableAccessor; + @Inject private CustomVariableContext customVariableContext; private BuildInfoHelper buildInfoHelper; - - public ArtifactoryPublishBuildInfoTask(EnvironmentVariableAccessor environmentVariableAccessor) { - this.environmentVariableAccessor = environmentVariableAccessor; - ContainerManager.autowireComponent(this); - } + @Inject + private ServerConfigManager serverConfigManager; public void setCustomVariableContext(CustomVariableContext customVariableContext) { this.customVariableContext = customVariableContext; } + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } + @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { super.initTask(context); @@ -58,7 +67,7 @@ protected void initTask(@NotNull CommonTaskContext context) throws TaskException publishBuildInfoContext.getBuildNumber(buildContext), context, buildContext, environmentVariableAccessor, publishBuildInfoContext.getArtifactoryServerId(), publishBuildInfoContext.getOverriddenUsername(runtimeContext, buildInfoLog, true), - publishBuildInfoContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager); + publishBuildInfoContext.getOverriddenPassword(runtimeContext, buildInfoLog, true), buildParamsOverrideManager, serverConfigManager); } @NotNull diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryTaskBase.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryTaskBase.java index 4c62a23d..398a50eb 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryTaskBase.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryTaskBase.java @@ -4,6 +4,7 @@ import com.atlassian.bamboo.task.CommonTaskContext; import com.atlassian.bamboo.task.TaskException; import com.atlassian.plugin.PluginAccessor; +import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -13,6 +14,7 @@ import org.jfrog.build.api.util.Log; import org.jfrog.build.extractor.usageReport.UsageReporter; +import javax.inject.Inject; import java.io.File; /** @@ -21,6 +23,8 @@ public abstract class ArtifactoryTaskBase { protected static final Logger log = LogManager.getLogger(ArtifactoryTaskBase.class); + @Inject + @ComponentImport protected PluginAccessor pluginAccessor; protected CommonTaskContext taskContext; // True if the task is attending to be run in a Docker container diff --git a/src/main/java/org/jfrog/bamboo/task/ArtifactoryXrayScanTask.java b/src/main/java/org/jfrog/bamboo/task/ArtifactoryXrayScanTask.java index a76ca329..e6f29821 100644 --- a/src/main/java/org/jfrog/bamboo/task/ArtifactoryXrayScanTask.java +++ b/src/main/java/org/jfrog/bamboo/task/ArtifactoryXrayScanTask.java @@ -13,6 +13,7 @@ import org.jfrog.build.client.artifactoryXrayResponse.Summary; import org.jfrog.build.extractor.clientConfiguration.client.artifactory.ArtifactoryManager; +import javax.inject.Inject; import java.io.IOException; import java.util.Map; @@ -20,9 +21,12 @@ * Created by Bar Belity on 24/05/2018. */ public class ArtifactoryXrayScanTask extends ArtifactoryTaskType { + @Inject private CustomVariableContext customVariableContext; private ServerConfig xrayServerConfig; private XrayScanContext xrayContext; + @Inject + private ServerConfigManager serverConfigManager; @Override protected void initTask(@NotNull CommonTaskContext context) throws TaskException { @@ -54,6 +58,10 @@ public void setCustomVariableContext(CustomVariableContext customVariableContext this.customVariableContext = customVariableContext; } + public void setServerConfigManager(ServerConfigManager serverConfigManager) { + this.serverConfigManager = serverConfigManager; + } + @Override protected ServerConfig getUsageServerConfig() { return xrayServerConfig; @@ -93,7 +101,6 @@ private Summary getSummaryFromResponse(ArtifactoryXrayResponse buildScanResult) } private void setXrayServerConfigurations(XrayScanContext xrayContext) { - ServerConfigManager serverConfigManager = ServerConfigManager.getInstance(); xrayServerConfig = serverConfigManager.getServerConfigById(xrayContext.getArtifactoryServerId()); if (xrayServerConfig == null) { throw new IllegalArgumentException("Could not find Artifactory server. Please check the Artifactory server in the task configuration."); diff --git a/src/main/java/org/jfrog/bamboo/task/BaseJavaBuildTask.java b/src/main/java/org/jfrog/bamboo/task/BaseJavaBuildTask.java index 4f844684..3dbe81af 100644 --- a/src/main/java/org/jfrog/bamboo/task/BaseJavaBuildTask.java +++ b/src/main/java/org/jfrog/bamboo/task/BaseJavaBuildTask.java @@ -23,6 +23,7 @@ import org.jfrog.bamboo.util.TaskUtils; import org.jfrog.build.extractor.ci.BuildInfoFields; +import javax.inject.Inject; import java.io.File; import java.io.IOException; import java.util.List; @@ -42,30 +43,42 @@ public abstract class BaseJavaBuildTask extends ArtifactoryTaskType { public static final String JAVA_HOME = "JAVA_HOME"; protected Map environmentVariables; - protected final EnvironmentVariableAccessor environmentVariableAccessor; - private final TestCollationService testCollationService; + @Inject + protected EnvironmentVariableAccessor environmentVariableAccessor; + @Inject + private TestCollationService testCollationService; protected BuildParamsOverrideManager buildParamsOverrideManager; + @Inject protected CustomVariableContext customVariableContext; - private final ProcessService processService; + @Inject + private ProcessService processService; String buildInfoPropertiesFile; boolean activateBuildInfoRecording; boolean aggregateBuildInfo; - final File bambooTmp; + File bambooTmp; - protected BaseJavaBuildTask(TestCollationService testCollationService, - EnvironmentVariableAccessor environmentVariableAccessor, ProcessService processService) { - ContainerManager.autowireComponent(this); - this.testCollationService = testCollationService; - this.processService = processService; - this.environmentVariableAccessor = environmentVariableAccessor; + @Override + protected void initTask(@NotNull CommonTaskContext context) throws TaskException { this.buildParamsOverrideManager = new BuildParamsOverrideManager(customVariableContext); - this.bambooTmp = getBambooTmp(customVariableContext); + this.bambooTmp = getBambooTmp(customVariableContext); } public void setCustomVariableContext(CustomVariableContext customVariableContext) { this.customVariableContext = customVariableContext; } + public void setTestCollationService(TestCollationService testCollationService) { + this.testCollationService = testCollationService; + } + + public void setCProcessService(ProcessService processService) { + this.processService = processService; + } + + public void setEnvironmentVariableAccessor(EnvironmentVariableAccessor environmentVariableAccessor) { + this.environmentVariableAccessor = environmentVariableAccessor; + } + void initEnvironmentVariables(PackageManagersContext buildContext) { environmentVariables = TaskUtils.getEnvironmentVariables(buildContext, environmentVariableAccessor); } diff --git a/src/main/java/org/jfrog/bamboo/util/TaskUtils.java b/src/main/java/org/jfrog/bamboo/util/TaskUtils.java index 659d384b..5680f4e3 100644 --- a/src/main/java/org/jfrog/bamboo/util/TaskUtils.java +++ b/src/main/java/org/jfrog/bamboo/util/TaskUtils.java @@ -7,9 +7,7 @@ import com.atlassian.bamboo.v2.build.agent.capability.CapabilityContext; import com.atlassian.bamboo.v2.build.agent.capability.ReadOnlyCapabilitySet; import com.atlassian.bamboo.variable.CustomVariableContext; -import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Maps; -import com.google.common.collect.Multimaps; import org.apache.commons.lang.SystemUtils; import org.apache.commons.lang3.StringUtils; import org.apache.tools.ant.types.Commandline; @@ -19,6 +17,8 @@ import org.jfrog.bamboo.configuration.BuildParamsOverrideManager; import org.jfrog.bamboo.context.PackageManagersContext; import org.jfrog.bamboo.util.version.VcsHelper; +import org.jfrog.build.api.multiMap.ListMultimap; +import org.jfrog.build.api.multiMap.Multimap; import org.jfrog.build.api.util.Log; import org.jfrog.build.extractor.BuildInfoExtractorUtils; import org.jfrog.build.extractor.ci.BuildInfo; @@ -296,10 +296,10 @@ public static Map getEnvironmentVariables(PackageManagersContext * * @return Map containing all properties. */ - public static ArrayListMultimap getCommonArtifactPropertiesMap(BuildInfoHelper buildInfoHelper) { + public static Multimap getCommonArtifactPropertiesMap(BuildInfoHelper buildInfoHelper) { Map propertiesMap = new HashMap<>(); buildInfoHelper.addCommonProperties(propertiesMap); - return ArrayListMultimap.create(Multimaps.forMap(propertiesMap)); + return new ListMultimap(propertiesMap); } /** diff --git a/src/main/resources/META-INF/spring/spring-scanner.xml b/src/main/resources/META-INF/spring/spring-scanner.xml new file mode 100644 index 00000000..8fbe42d9 --- /dev/null +++ b/src/main/resources/META-INF/spring/spring-scanner.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/src/main/resources/atlassian-plugin.xml b/src/main/resources/atlassian-plugin.xml index 722ebb3c..da0fba48 100644 --- a/src/main/resources/atlassian-plugin.xml +++ b/src/main/resources/atlassian-plugin.xml @@ -29,10 +29,6 @@ - - -