package org.jfrog.bamboo.configuration; import com.atlassian.bamboo.configuration.AdministrationConfigurationAccessor; import com.atlassian.bamboo.plan.PlanKey; import com.atlassian.bamboo.utils.EscapeChars; import com.atlassian.spring.container.ContainerManager; import com.google.common.collect.Maps; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.io.IOUtils; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.ObjectMapper; import org.jfrog.bamboo.util.ConstantValues; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import static org.jfrog.bamboo.util.ConstantValues.ADMIN_CONFIG_SERVLET_CONTEXT_NAME; /** * A helper class to be used for the Artifactory tasks configuration. */ public class ConfigurationHelper implements Serializable { public static final String DEFAULT_JDK = "JAVA_HOME"; private static ConfigurationHelper instance = new ConfigurationHelper(); private AdministrationConfigurationAccessor administrationConfigurationAccessor; private HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); private ConfigurationHelper() { ContainerManager.autowireComponent(this); } public static ConfigurationHelper getInstance() { return instance; } public void setAdministrationConfigurationAccessor(AdministrationConfigurationAccessor administrationConfigurationAccessor) { this.administrationConfigurationAccessor = administrationConfigurationAccessor; } public Map<String, String> getAllVariables(PlanKey planKey) { HashMap<String, PlanKey> params = Maps.newHashMap(); params.put(ConstantValues.PLAN_KEY_PARAM, planKey); String requestUrl = prepareRequestUrl(ADMIN_CONFIG_SERVLET_CONTEXT_NAME, params); GetMethod getMethod = new GetMethod(requestUrl); InputStream responseStream = null; try { executeMethod(requestUrl, getMethod); JsonFactory jsonFactory = new JsonFactory(); ObjectMapper mapper = new ObjectMapper(); jsonFactory.setCodec(mapper); responseStream = getMethod.getResponseBodyAsStream(); if (responseStream == null) { return Maps.newHashMap(); } JsonParser parser = jsonFactory.createJsonParser(responseStream); return parser.readValueAs(Map.class); } catch (IOException e) { String message = "Failed while invoking URL " + requestUrl + " to get Bamboo variables. " + e.getMessage(); throw new RuntimeException(message, e); } finally { getMethod.releaseConnection(); IOUtils.closeQuietly(responseStream); } } private String prepareRequestUrl(String servletName, Map<String, PlanKey> params) { String bambooBaseUrl = administrationConfigurationAccessor.getAdministrationConfiguration().getBaseUrl(); StringBuilder builder = new StringBuilder(bambooBaseUrl); if (!bambooBaseUrl.endsWith("/")) { builder.append("/"); } StringBuilder requestUrlBuilder = builder.append("plugins/servlet/").append(servletName); if (params.size() != 0) { requestUrlBuilder.append("?"); for (Map.Entry<String, PlanKey> param : params.entrySet()) { if (!requestUrlBuilder.toString().endsWith("?")) { requestUrlBuilder.append("&"); } requestUrlBuilder.append(param.getKey()).append("=").append(EscapeChars.forFormSubmission(param.getValue().getKey())); } } return requestUrlBuilder.toString(); } /** * Executes the given HTTP method * * @param requestUrl Full request URL * @param getMethod HTTP GET method */ private void executeMethod(String requestUrl, GetMethod getMethod) throws IOException { int responseCode = httpClient.executeMethod(getMethod); if (responseCode == HttpStatus.SC_NOT_FOUND) { throw new IOException("Unable to find requested resource: " + requestUrl); } else if (responseCode != HttpStatus.SC_OK) { throw new IOException("Failed to retrieve requested resource: " + requestUrl + ". Response code: " + responseCode + ", Message: " + getMethod.getStatusText()); } } }