package hudson.plugins.collabnet.documentuploader; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import hudson.Extension; import hudson.model.*; import hudson.plugins.collabnet.util.CNFormFieldValidator; import hudson.plugins.collabnet.util.CommonUtil; import hudson.plugins.promoted_builds.Promotion; import hudson.util.FormValidation; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import javax.servlet.ServletException; import java.io.IOException; import java.util.Map; /** * File pattern to upload * * @author Kohsuke Kawaguchi */ public class FilePattern extends AbstractDescribableImpl<FilePattern> { public final String value; @DataBoundConstructor public FilePattern(String value) { this.value = value; } public String interpret(AbstractBuild<?,?> build, TaskListener listener) throws IOException, InterruptedException { Map<String, String> envVars; if (Hudson.getInstance().getPlugin("promoted-builds") != null && build.getClass().equals(Promotion.class)) { // if this is a promoted build, get the env vars from // the original build Promotion promotion = Promotion.class.cast(build); envVars = promotion.getTarget().getEnvironment(listener); } else { envVars = build.getEnvironment(listener); } //XXX should this use envVars instead of build.getEnv.... ? return CommonUtil.getInterpreted(envVars, value); } @Override public boolean equals(Object that) { return value.equals(((FilePattern)that).value); } @Override public int hashCode() { return value.hashCode(); } @Extension public static class DescriptorImpl extends Descriptor<FilePattern> { public String getDisplayName() { return ""; } /** * Form validation for the file patterns. * * @throws IOException * @throws ServletException */ public FormValidation doCheckValue(@QueryParameter String value) throws FormValidation { return CNFormFieldValidator.unrequiredInterpretedCheck(value, "file patterns"); } } /** * To remain backward compatible with the earlier string-only serialization format. */ public static final class ConverterImpl implements Converter { public ConverterImpl() { } public boolean canConvert(Class type) { return type==FilePattern.class; } public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { FilePattern src = (FilePattern) source; writer.setValue(src.value); } public Object unmarshal(HierarchicalStreamReader reader, final UnmarshallingContext context) { return new FilePattern(reader.getValue()); } } }