/******************************************************************************* * Copyright (c) 2017 Synopsys, Inc * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Synopsys, Inc - initial implementation and documentation *******************************************************************************/ package jenkins.plugins.coverity; import java.util.ArrayList; import java.util.List; import org.kohsuke.stapler.DataBoundConstructor; import hudson.Util; public class InvocationAssistance { // deprecated fields which were removed in plugin version 1.9 private transient boolean isUsingMisra; private transient String misraConfigFile; private transient boolean isUsingPostCovBuildCmd; private transient String postCovBuildCmd; private transient boolean isUsingPostCovAnalyzeCmd; private transient String postCovAnalyzeCmd; private final String buildArguments; private final String analyzeArguments; private final String commitArguments; private List<String> javaWarFilesNames; private final List<JavaWarFile> javaWarFiles; private final boolean csharpMsvsca; private final String saOverride; private MisraConfig misraConfig; private final boolean isScriptSrc; private PostCovBuild postCovBuild; private PostCovAnalyze postCovAnalyze; /** * Absolute path to the intermediate directory that Coverity should use. Null to use the default. */ private final String intermediateDir; public boolean getUseAdvancedParser() { return useAdvancedParser; } private final boolean useAdvancedParser; @DataBoundConstructor public InvocationAssistance(PostCovBuild postCovBuild, PostCovAnalyze postCovAnalyze, boolean isScriptSrc, String buildArguments, String analyzeArguments, String commitArguments, String intermediateDir, MisraConfig misraConfig, List<JavaWarFile> javaWarFiles, boolean csharpMsvsca, String saOverride, boolean useAdvancedParser) { this.postCovBuild = postCovBuild; this.postCovAnalyze = postCovAnalyze; this.isScriptSrc = isScriptSrc; this.buildArguments = Util.fixEmpty(buildArguments); this.analyzeArguments = Util.fixEmpty(analyzeArguments); this.commitArguments = Util.fixEmpty(commitArguments); this.intermediateDir = Util.fixEmpty(intermediateDir); this.misraConfig = misraConfig; List<String> tempJavaWarFilesPaths = new ArrayList<String>(); if(javaWarFiles != null && !javaWarFiles.isEmpty()){ for(JavaWarFile javaWarFile : javaWarFiles){ tempJavaWarFilesPaths.add(javaWarFile.getWarFile()); } } this.javaWarFilesNames = tempJavaWarFilesPaths; this.javaWarFiles = javaWarFiles; this.csharpMsvsca = csharpMsvsca; this.saOverride = Util.fixEmpty(saOverride); this.useAdvancedParser = useAdvancedParser; } /** * Implement readResolve to update the de-serialized object in the case transient data was found. Transient fields * will be read during de-serialization and readResolve allow updating the InvocationAssistance object after being created. */ protected Object readResolve() { // Check for existing misraConfig if(isUsingMisra && misraConfigFile != null) { this.misraConfig = new MisraConfig(misraConfigFile); } // Check for existing postCovBuild if(isUsingPostCovBuildCmd && postCovBuildCmd != null) { this.postCovBuild = new PostCovBuild(postCovBuildCmd); } // Check for existing postCovAnalyze if(isUsingPostCovAnalyzeCmd && postCovAnalyzeCmd != null) { this.postCovAnalyze = new PostCovAnalyze(postCovAnalyzeCmd); } return this; } public String getPostCovBuildCmd() { return postCovBuild != null ? postCovBuild.getPostCovBuildCmd() : null; } public boolean getIsUsingPostCovBuildCmd() { return postCovBuild != null; } public boolean getIsUsingPostCovAnalyzeCmd() { return postCovAnalyze != null; } public String getPostCovAnalyzeCmd() { return postCovAnalyze != null ? postCovAnalyze.getPostCovAnalyzeCmd() : null; } public boolean getIsScriptSrc() { return isScriptSrc; } public String getBuildArguments() { return buildArguments; } public String getAnalyzeArguments() { return analyzeArguments; } public String getCommitArguments() { return commitArguments; } public String getIntermediateDir() { return intermediateDir; } public List<JavaWarFile> getJavaWarFiles() { return javaWarFiles; } public List<String> getJavaWarFilesNames() { return javaWarFilesNames; } public boolean getCsharpMsvsca() { return csharpMsvsca; } public String getSaOverride() { return saOverride; } public boolean getIsUsingMisra() { return misraConfig != null; } public String getMisraConfigFile(){ return misraConfig != null ? misraConfig.getMisraConfigFile() : null; } /** * For each variable in override, use that value, otherwise, use the value in this object. * * @param override source * @return a new, merged InvocationAssistance */ public InvocationAssistance merge(InvocationAssistance override) { String analyzeArguments = override.getAnalyzeArguments() != null ? override.getAnalyzeArguments() : getAnalyzeArguments(); String buildArguments = override.getBuildArguments() != null ? override.getBuildArguments() : getBuildArguments(); String commitArguments = override.getCommitArguments() != null ? override.getCommitArguments() : getCommitArguments(); String intermediateDir = override.getIntermediateDir() != null ? override.getIntermediateDir() : getIntermediateDir(); boolean csharpMsvsca = override.getCsharpMsvsca(); String saOverride = override.getSaOverride() != null ? override.getSaOverride() : getSaOverride(); MisraConfig misraConfig = override.isUsingMisra ? new MisraConfig(override.misraConfigFile) : null; boolean isScriptSrc = override.getIsScriptSrc(); PostCovBuild postBuild = override.isUsingPostCovBuildCmd ? new PostCovBuild(override.postCovBuildCmd) : null; PostCovAnalyze postCovAnalyze = override.isUsingPostCovAnalyzeCmd ? new PostCovAnalyze(override.postCovAnalyzeCmd) : null; List<JavaWarFile> javaWarFiles = override.getJavaWarFiles(); boolean useAdvancedParser = override.getUseAdvancedParser(); return new InvocationAssistance( postBuild, postCovAnalyze, isScriptSrc, buildArguments, analyzeArguments, commitArguments, intermediateDir, misraConfig, javaWarFiles, csharpMsvsca, saOverride, useAdvancedParser); } public String checkIAConfig(){ boolean delim = true; String errorText = "Errors with your \"Perform Coverity build/analyze/commit\" options: \n"; // Making sure they pick a test language if(getIsUsingMisra()){ if(getMisraConfigFile() == null){ delim = false; } else if (getMisraConfigFile().isEmpty()){ delim = false; } else if (getMisraConfigFile().trim().isEmpty()){ delim = false; } } if(delim){ errorText = "Pass"; } else { errorText += "[Error] No MISRA configuration file was specified. \n"; } return errorText; } }