/*
* The MIT License
*
* Copyright (c) 2010, Manufacture Française des Pneumatiques Michelin, Romain Seguy
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.michelin.cio.hudson.plugins.clearcaseucmbaseline;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.Descriptor.FormException;
import hudson.model.Hudson;
import hudson.model.ParameterDefinition;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.TaskListener;
import hudson.plugins.clearcase.AbstractClearCaseScm;
import hudson.scm.ChangeLogParser;
import hudson.scm.SCM;
import hudson.scm.SCMDescriptor;
import java.io.File;
import java.io.IOException;
import org.jvnet.localizer.ResourceBundleHolder;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.StaplerRequest;
/**
* This class is of no real use and is only there for a "ClearCase UCM baseline"
* option to be displayed in the "Source Code Management" section of the
* configuration screen of {@link AbstractProject}s.
*
* <p>If you refer to {@code ClearCaseUcmBaselineSCM/config.jelly} file, you'll
* see that there is no possibility to configure this option: This option is just
* there so that the user is displayed with a message saying that, if he wants
* to gets his data from a ClearCase UBM baseline, he has to actually add a
* "ClearCase UCM baseline" build parameter to get the real configuration fields
* (as defined in {@link ClearCaseUcmBaselineParameterDefinition}).</p>
*
* @see ClearCaseUcmBaselineParameterDefinition
*
* @author Romain Seguy (http://davadoc.deviantart.com)
*/
public class ClearCaseUcmBaselineSCM extends SCM {
public final static String CLEARCASE_BASELINE_ENVSTR = "CLEARCASE_BASELINE";
@DataBoundConstructor
public ClearCaseUcmBaselineSCM() {
}
/**
* This method does nothing except checking that a "ClearCase UCM baseline"
* parameter has been defined for the job (it not, the build will fail).
*/
@Override
public boolean checkout(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener, File changelogFile) throws IOException, InterruptedException {
// has the project some parameters?
ParametersDefinitionProperty params = (ParametersDefinitionProperty) build.getProject().getProperty(ParametersDefinitionProperty.class);
if(params == null) {
listener.fatalError("No parameters have been defined for this project: To use the ClearCase UCM baseline mode, you MUST add a '"
+ ClearCaseUcmBaselineParameterDefinition.PARAMETER_NAME
+ "' parameter to the project.");
return false;
}
// let's count the number of CC UCM baseline paramaters for the build:
// if we have more than 1, we'll make the job fail to avoid any issues
// with the environment variables
int clearCaseUcmBaselineParameters = 0;
for(ParameterDefinition pd : params.getParameterDefinitions()) {
if(pd.getName().equals(ClearCaseUcmBaselineParameterDefinition.PARAMETER_NAME)) {
if(!(pd instanceof ClearCaseUcmBaselineParameterDefinition)) {
// the parameter with the name ClearCase UCM baseline is NOT
// a real ClearCaseUcmBaselineParameterDefinition, we make
// the build fail
listener.fatalError("A parameter named '"
+ ClearCaseUcmBaselineParameterDefinition.PARAMETER_NAME
+ "' doesn't correspond to what's expected by "
+ Hudson.getInstance().getDescriptor(ClearCaseUcmBaselineSCM.class).getDisplayName()
+ " (e.g. you may have added a String parameter named '"
+ ClearCaseUcmBaselineParameterDefinition.PARAMETER_NAME
+ "'); Remove it from the project configuration before trying to run the build again.");
return false;
}
clearCaseUcmBaselineParameters++;
}
}
if(clearCaseUcmBaselineParameters > 1) {
listener.fatalError("More than two '"
+ ClearCaseUcmBaselineParameterDefinition.PARAMETER_NAME
+ "' parameters have been defined for this project: Aborting the build to avoid any conflict with the "
+ AbstractClearCaseScm.CLEARCASE_VIEWNAME_ENVSTR
+ " and "
+ AbstractClearCaseScm.CLEARCASE_VIEWPATH_ENVSTR
+ " environment variables; Edit the project configuration and remove one of them before trying to run the build again.");
return false;
}
// everything is fine (well, for the moment)
return true;
}
@Override
public ChangeLogParser createChangeLogParser() {
return null;
}
@Override
public DescriptorImpl getDescriptor() {
return (DescriptorImpl) super.getDescriptor();
}
@Override
public boolean pollChanges(AbstractProject project, Launcher launcher, FilePath workspace, TaskListener listener) throws IOException, InterruptedException {
return false;
}
@Extension
public static class DescriptorImpl extends SCMDescriptor<ClearCaseUcmBaselineSCM> {
public DescriptorImpl() {
super(ClearCaseUcmBaselineSCM.class, null);
load();
}
@Override
public String getDisplayName() {
return ResourceBundleHolder.get(ClearCaseUcmBaselineParameterDefinition.class).format("DisplayName");
}
@Override
public SCM newInstance(StaplerRequest req) throws FormException {
return new ClearCaseUcmBaselineSCM();
}
}
}