/* * Path: /auto/scheduleBuild * * POST to create automation requests to schedule builds. */ public void doScheduleBuild(StaplerRequest request, StaplerResponse response) throws Exception { requirePOST(); OSLC4JUnmarshaller unmarshaller = OSLC4JContext.newInstance().createUnmarshaller(); String contentType = request.getContentType(); if (contentType == null) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } unmarshaller.setMediaType(MediaType.valueOf(contentType)); final AutomationRequest autoRequest = unmarshaller.unmarshal(request.getInputStream(), AutomationRequest.class); if (autoRequest == null) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } Link planLink = autoRequest.getExecutesAutomationPlan(); if (planLink == null) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } URI planURI = planLink.getValue(); String jobName = getJobNameFromURI(planURI); if (jobName == null) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } Job<?, ?> job = getJob(jobName); if (job == null) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } if (!job.isBuildable()) { throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } if (!(job instanceof AbstractProject)) { LOG.log( Level.WARNING, "Cannot schedule builds for jobs that don't extend AbstractProject: " + jobName); throw HttpResponses.status(HttpServletResponse.SC_BAD_REQUEST); } AbstractProject<?, ?> project = (AbstractProject<?, ?>) job; int nextBuildNumber = project.getNextBuildNumber(); Cause cause = new Cause() { @Override public String getShortDescription() { String description = autoRequest.getDescription(); return description != null ? description : "OSLC Automation Request"; } }; ParameterInstance[] parameters = autoRequest.getInputParameters(); boolean suceeded; if (parameters.length == 0) { suceeded = project.scheduleBuild(cause); } else { List<ParameterValue> values = getParameterValues(project, parameters); suceeded = project.scheduleBuild2(project.getQuietPeriod(), cause, new ParametersAction(values)) != null; } if (!suceeded) { // Build already queued. LOG.log( Level.WARNING, "Automation request rejected (409 conflict) since build is already queued: " + jobName); throw HttpResponses.status(HttpServletResponse.SC_CONFLICT); } URI requestURI = getAutoRequestURI(job, nextBuildNumber); response.setStatus(HttpServletResponse.SC_CREATED); response.setHeader("Location", requestURI.toString()); }