Java tutorial
/******************************************************************************* * Copyright (C) 2016 Black Duck Software, Inc. * http://www.blackducksoftware.com/ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 com.blackducksoftware.integration.hub.builder; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import com.blackducksoftware.integration.builder.AbstractBuilder; import com.blackducksoftware.integration.builder.ValidationResult; import com.blackducksoftware.integration.builder.ValidationResultEnum; import com.blackducksoftware.integration.builder.ValidationResults; import com.blackducksoftware.integration.hub.job.HubScanJobConfig; import com.blackducksoftware.integration.hub.job.HubScanJobFieldEnum; import com.google.common.collect.ImmutableList; public class HubScanJobConfigBuilder extends AbstractBuilder<HubScanJobFieldEnum, HubScanJobConfig> { public static final int DEFAULT_MEMORY_IN_MEGABYTES = 4096; public static final int DEFAULT_BOM_UPDATE_WAIT_TIME_IN_MINUTES = 5; public static final int MINIMUM_MEMORY_IN_MEGABYTES = 256; private String projectName; private String version; private String phase; private String distribution; private String workingDirectory; private boolean shouldGenerateRiskReport; private String maxWaitTimeForBomUpdate; private String scanMemory; private final Set<String> scanTargetPaths = new HashSet<>(); private boolean dryRun; private boolean disableScanTargetPathExistenceCheck; public HubScanJobConfigBuilder(final boolean shouldUseDefaultValues) { super(shouldUseDefaultValues); } @Override public ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> buildResults() { final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result = assertValid(); final ImmutableList<String> immutableScanTargetPaths = new ImmutableList.Builder<String>() .addAll(scanTargetPaths).build(); result.setConstructedObject(new HubScanJobConfig(projectName, version, phase, distribution, workingDirectory, NumberUtils.toInt(scanMemory), shouldGenerateRiskReport, NumberUtils.toInt(maxWaitTimeForBomUpdate), immutableScanTargetPaths, dryRun)); return result; } @Override public ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> assertValid() { final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result = new ValidationResults<>(); validateProjectAndVersion(result); validateScanMemory(result, DEFAULT_MEMORY_IN_MEGABYTES); validateShouldGenerateRiskReport(result); validateMaxWaitTimeForBomUpdate(result, DEFAULT_BOM_UPDATE_WAIT_TIME_IN_MINUTES); validateScanTargetPaths(result, workingDirectory); return result; } public void validateProjectAndVersion(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { if (dryRun) { result.addResult(HubScanJobFieldEnum.PROJECT, new ValidationResult(ValidationResultEnum.OK, "")); result.addResult(HubScanJobFieldEnum.VERSION, new ValidationResult(ValidationResultEnum.OK, "")); } else if (projectName == null && version == null) { result.addResult(HubScanJobFieldEnum.VERSION, new ValidationResult(ValidationResultEnum.WARN, "No Project name or Version were found. Any scans run will not be mapped to a Version.")); } else { validateProject(result); validateVersion(result); } } public void validateProject(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { if (projectName == null) { result.addResult(HubScanJobFieldEnum.PROJECT, new ValidationResult(ValidationResultEnum.ERROR, "No Project name was found.")); } else { result.addResult(HubScanJobFieldEnum.PROJECT, new ValidationResult(ValidationResultEnum.OK, "")); } } public void validateVersion(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { if (version == null) { result.addResult(HubScanJobFieldEnum.VERSION, new ValidationResult(ValidationResultEnum.ERROR, "No Version was found.")); } else { result.addResult(HubScanJobFieldEnum.VERSION, new ValidationResult(ValidationResultEnum.OK, "")); } } public void validateScanMemory(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { validateScanMemory(result, null); } private void validateScanMemory(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result, final Integer defaultScanMemory) { if (shouldUseDefaultValues() && defaultScanMemory != null) { final int scanMemoryInt = NumberUtils.toInt(scanMemory); if (scanMemoryInt < MINIMUM_MEMORY_IN_MEGABYTES && defaultScanMemory != null) { scanMemory = String.valueOf(defaultScanMemory); } return; } if (StringUtils.isBlank(scanMemory)) { result.addResult(HubScanJobFieldEnum.SCANMEMORY, new ValidationResult(ValidationResultEnum.ERROR, "No scan memory was specified.")); return; } int scanMemoryInt = 0; try { scanMemoryInt = stringToInteger(scanMemory); } catch (final IllegalArgumentException e) { result.addResult(HubScanJobFieldEnum.SCANMEMORY, new ValidationResult(ValidationResultEnum.ERROR, e.getMessage(), e)); return; } if (scanMemoryInt < MINIMUM_MEMORY_IN_MEGABYTES) { result.addResult(HubScanJobFieldEnum.SCANMEMORY, new ValidationResult(ValidationResultEnum.ERROR, "The minimum amount of memory for the scan is " + MINIMUM_MEMORY_IN_MEGABYTES + " MB.")); } else { result.addResult(HubScanJobFieldEnum.SCANMEMORY, new ValidationResult(ValidationResultEnum.OK, "")); } } public void validateShouldGenerateRiskReport( final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { if (dryRun) { result.addResult(HubScanJobFieldEnum.GENERATE_RISK_REPORT, new ValidationResult(ValidationResultEnum.OK, "")); } else if ((projectName == null || version == null) && shouldGenerateRiskReport) { result.addResult(HubScanJobFieldEnum.GENERATE_RISK_REPORT, new ValidationResult(ValidationResultEnum.ERROR, "To generate the Risk Report, you need to provide a Project name or version.")); } else { result.addResult(HubScanJobFieldEnum.GENERATE_RISK_REPORT, new ValidationResult(ValidationResultEnum.OK, "")); } } public void validateMaxWaitTimeForBomUpdate( final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { validateMaxWaitTimeForBomUpdate(result, null); } private void validateMaxWaitTimeForBomUpdate( final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result, final Integer defaultMaxWaitTime) { if (dryRun) { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult(ValidationResultEnum.OK, "")); } else { if (shouldUseDefaultValues() && defaultMaxWaitTime != null) { final int maxWaitTime = NumberUtils.toInt(maxWaitTimeForBomUpdate); if (maxWaitTime <= 0) { maxWaitTimeForBomUpdate = String.valueOf(defaultMaxWaitTime); } return; } if (StringUtils.isBlank(maxWaitTimeForBomUpdate)) { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult( ValidationResultEnum.ERROR, "No maximum wait time for the Bom Update found.")); return; } int maxWaitTime = -1; try { maxWaitTime = stringToInteger(maxWaitTimeForBomUpdate); } catch (final IllegalArgumentException e) { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult(ValidationResultEnum.ERROR, e.getMessage(), e)); return; } if (maxWaitTime <= 0) { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult(ValidationResultEnum.ERROR, "The maximum wait time for the BOM Update must be greater than 0.")); } else if (maxWaitTime < 2) { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult(ValidationResultEnum.WARN, "This wait time may be too short.")); } else { result.addResult(HubScanJobFieldEnum.MAX_WAIT_TIME_FOR_BOM_UPDATE, new ValidationResult(ValidationResultEnum.OK, "")); } } } /** * If running this validation outside of a Build, make sure you run * disableScanTargetPathExistenceCheck() because the targets may not exist * yet. * */ public void validateScanTargetPaths(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result) { validateScanTargetPaths(result, null); } private void validateScanTargetPaths(final ValidationResults<HubScanJobFieldEnum, HubScanJobConfig> result, final String defaultTargetPath) { if (scanTargetPaths.isEmpty() && defaultTargetPath != null) { scanTargetPaths.add(defaultTargetPath); } boolean valid = true; final Set<String> targetPaths = new HashSet<>(); for (final String currentTargetPath : scanTargetPaths) { String targetPath; if (StringUtils.isBlank(currentTargetPath) && defaultTargetPath != null) { targetPath = defaultTargetPath; } else { targetPath = currentTargetPath; } targetPaths.add(targetPath); if (!disableScanTargetPathExistenceCheck) { if (StringUtils.isNotBlank(targetPath)) { // If the targetPath is blank then it will be set to the // defaultTargetPath during the build // Since we dont know the defaultTargetPath at this point we // only validate non blank entries final File target = new File(targetPath); if (target == null || !target.exists()) { result.addResult(HubScanJobFieldEnum.TARGETS, new ValidationResult(ValidationResultEnum.ERROR, "The scan target '" + target.getAbsolutePath() + "' does not exist.")); valid = false; } String targetCanonicalPath; try { targetCanonicalPath = target.getCanonicalPath(); if (!targetCanonicalPath.startsWith(workingDirectory)) { result.addResult(HubScanJobFieldEnum.TARGETS, new ValidationResult(ValidationResultEnum.ERROR, "Can not scan targets outside the working directory.")); valid = false; } } catch (final IOException e) { result.addResult(HubScanJobFieldEnum.TARGETS, new ValidationResult(ValidationResultEnum.ERROR, "Could not get the canonical path for Target : " + targetPath)); valid = false; } } } } scanTargetPaths.clear(); scanTargetPaths.addAll(targetPaths); if (valid) { result.addResult(HubScanJobFieldEnum.TARGETS, new ValidationResult(ValidationResultEnum.OK, "")); } } public void setProjectName(final String projectName) { this.projectName = StringUtils.trimToNull(projectName); } public void setVersion(final String version) { this.version = StringUtils.trimToNull(version); } public void setPhase(final String phase) { this.phase = phase; } public void setDistribution(final String distribution) { this.distribution = distribution; } public void setShouldGenerateRiskReport(final boolean shouldGenerateRiskReport) { this.shouldGenerateRiskReport = shouldGenerateRiskReport; } public void setShouldGenerateRiskReport(final String shouldGenerateRiskReport) { final boolean shouldGenerateRiskReportValue = Boolean.valueOf(shouldGenerateRiskReport); setShouldGenerateRiskReport(shouldGenerateRiskReportValue); } public void setMaxWaitTimeForBomUpdate(final int maxWaitTimeForBomUpdate) { setMaxWaitTimeForBomUpdate(String.valueOf(maxWaitTimeForBomUpdate)); } public void setMaxWaitTimeForBomUpdate(final String maxWaitTimeForBomUpdate) { this.maxWaitTimeForBomUpdate = maxWaitTimeForBomUpdate; } public void setScanMemory(final int scanMemory) { setScanMemory(String.valueOf(scanMemory)); } public void setScanMemory(final String scanMemory) { this.scanMemory = scanMemory; } public void addScanTargetPath(final String scanTargetPath) { scanTargetPaths.add(scanTargetPath); } public void addAllScanTargetPaths(final List<String> scanTargetPaths) { this.scanTargetPaths.addAll(scanTargetPaths); } public void setDryRun(final boolean dryRun) { this.dryRun = dryRun; } public void setWorkingDirectory(final String workingDirectory) { this.workingDirectory = workingDirectory; } public void disableScanTargetPathExistenceCheck() { disableScanTargetPathExistenceCheck = true; } }