/* * 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.build.DefaultJob; import com.atlassian.bamboo.plan.Plan; import com.atlassian.bamboo.plan.PlanKey; import com.atlassian.bamboo.plan.PlanKeys; import com.atlassian.bamboo.plan.PlanManager; import com.atlassian.bamboo.variable.VariableDefinition; import com.atlassian.bamboo.variable.VariableDefinitionManager; import com.google.common.collect.Maps; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.map.ObjectMapper; import org.jfrog.bamboo.util.ConstantValues; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Map; /** * Exposes features of the Administration Configuration service to serve plugin modules which can't reach it. * * @author Noam Y. Tenne */ public class ArtifactoryAdminConfigServlet extends HttpServlet { private PlanManager planManager; private VariableDefinitionManager variableDefinitionManager; /** * Returns the global variable map in JSON format */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String planKey = req.getParameter(ConstantValues.PLAN_KEY_PARAM); Map<String, String> variables = getAllVariables(planKey); JsonFactory jsonFactory = new JsonFactory(); ObjectMapper mapper = new ObjectMapper(); jsonFactory.setCodec(mapper); PrintWriter writer = null; try { writer = resp.getWriter(); JsonGenerator jsonGenerator = jsonFactory.createJsonGenerator(writer); jsonGenerator.writeObject(variables); writer.flush(); } finally { IOUtils.closeQuietly(writer); } } /** * Gets all of Bamboo's variables. Plan variables override the global variables. * @param planKey The key of the relevant plan, so that this plan's variables are returned. * @return Map containing all variables. */ private Map<String, String> getAllVariables(String planKey) { Map<String, String> variableMap = Maps.newHashMap(); if (StringUtils.isNotBlank(planKey)) { PlanKey planKeyObj = PlanKeys.getPlanKey(planKey); Plan plan = planManager.getPlanByKey(planKeyObj); if (plan instanceof DefaultJob) { // Default jobs don't have any global vars, so fetch the actual plan itself instead plan = planManager.getPlanByKey(PlanKeys.getPlanKey(StringUtils.removeEnd(plan.getKey(), "-" + plan.getBuildKey()))); } appendVariableDefs(variableMap, variableDefinitionManager.getPlanVariables(plan)); appendVariableDefs(variableMap, variableDefinitionManager.getGlobalNotOverriddenVariables(plan)); } else { appendVariableDefs(variableMap, variableDefinitionManager.getGlobalVariables()); } return variableMap; } private void appendVariableDefs(Map<String, String> globalVariableMap, List<VariableDefinition> globalVariables) { for (VariableDefinition variableDefinition : globalVariables) { globalVariableMap.put(variableDefinition.getKey(), variableDefinition.getValue()); } } public void setPlanManager(PlanManager planManager) { this.planManager = planManager; } public void setVariableDefinitionManager(VariableDefinitionManager variableDefinitionManager) { this.variableDefinitionManager = variableDefinitionManager; } }