Bug 62243 - Dashboard : make option "--forceDeleteResultFile"/"-f" option delete folder referenced by "-o" option

Bugzilla Id: 62243

git-svn-id: https://svn.apache.org/repos/asf/jmeter/trunk@1828168 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Philippe Mouawad 2018-04-02 13:38:08 +00:00
parent 128812f7c3
commit 63eaf76bf3
4 changed files with 45 additions and 12 deletions

View File

@ -278,7 +278,7 @@ public class JMeter implements JMeterPlugin {
private static final CLOptionDescriptor D_FORCE_DELETE_RESULT_FILE = private static final CLOptionDescriptor D_FORCE_DELETE_RESULT_FILE =
new CLOptionDescriptor("forceDeleteResultFile", new CLOptionDescriptor("forceDeleteResultFile",
CLOptionDescriptor.ARGUMENT_DISALLOWED, FORCE_DELETE_RESULT_FILE, CLOptionDescriptor.ARGUMENT_DISALLOWED, FORCE_DELETE_RESULT_FILE,
"force delete existing results files before start the test"); "force delete existing results files and web report folder if present before starting the test");
private static final String[][] DEFAULT_ICONS = { private static final String[][] DEFAULT_ICONS = {
{ "org.apache.jmeter.control.gui.TestPlanGui", "org/apache/jmeter/images/beaker.gif" }, //$NON-NLS-1$ $NON-NLS-2$ { "org.apache.jmeter.control.gui.TestPlanGui", "org/apache/jmeter/images/beaker.gif" }, //$NON-NLS-1$ $NON-NLS-2$
@ -517,14 +517,14 @@ public class JMeter implements JMeterPlugin {
CLOption testReportOpt = parser.getArgumentById(REPORT_GENERATING_OPT); CLOption testReportOpt = parser.getArgumentById(REPORT_GENERATING_OPT);
if (testReportOpt != null) { // generate report from existing file if (testReportOpt != null) { // generate report from existing file
String reportFile = testReportOpt.getArgument(); String reportFile = testReportOpt.getArgument();
extractAndSetReportOutputFolder(parser); extractAndSetReportOutputFolder(parser, false);
ReportGenerator generator = new ReportGenerator(reportFile, null); ReportGenerator generator = new ReportGenerator(reportFile, null);
generator.generate(); generator.generate();
} else if (parser.getArgumentById(NONGUI_OPT) == null) { // not non-GUI => GUI } else if (parser.getArgumentById(NONGUI_OPT) == null) { // not non-GUI => GUI
startGui(testFile); startGui(testFile);
startOptionalServers(); startOptionalServers();
} else { // NON-GUI must be true } else { // NON-GUI must be true
extractAndSetReportOutputFolder(parser); extractAndSetReportOutputFolder(parser, deleteResultFile);
CLOption rem = parser.getArgumentById(REMOTE_OPT_PARAM); CLOption rem = parser.getArgumentById(REMOTE_OPT_PARAM);
if (rem == null) { if (rem == null) {
@ -562,14 +562,14 @@ public class JMeter implements JMeterPlugin {
* @param parser {@link CLArgsParser} * @param parser {@link CLArgsParser}
* @throws IllegalArgumentException * @throws IllegalArgumentException
*/ */
private void extractAndSetReportOutputFolder(CLArgsParser parser) { private void extractAndSetReportOutputFolder(CLArgsParser parser, boolean deleteResultFile) {
CLOption reportOutputFolderOpt = parser CLOption reportOutputFolderOpt = parser
.getArgumentById(REPORT_OUTPUT_FOLDER_OPT); .getArgumentById(REPORT_OUTPUT_FOLDER_OPT);
if(reportOutputFolderOpt != null) { if(reportOutputFolderOpt != null) {
String reportOutputFolder = parser.getArgumentById(REPORT_OUTPUT_FOLDER_OPT).getArgument(); String reportOutputFolder = parser.getArgumentById(REPORT_OUTPUT_FOLDER_OPT).getArgument();
File reportOutputFolderAsFile = new File(reportOutputFolder); File reportOutputFolderAsFile = new File(reportOutputFolder);
JOrphanUtils.canSafelyWriteToFolder(reportOutputFolderAsFile); JOrphanUtils.canSafelyWriteToFolder(reportOutputFolderAsFile, deleteResultFile);
final String reportOutputFolderAbsPath = reportOutputFolderAsFile.getAbsolutePath(); final String reportOutputFolderAbsPath = reportOutputFolderAsFile.getAbsolutePath();
log.info("Setting property '{}' to:'{}'", JMETER_REPORT_OUTPUT_DIR_PROPERTY, reportOutputFolderAbsPath); log.info("Setting property '{}' to:'{}'", JMETER_REPORT_OUTPUT_DIR_PROPERTY, reportOutputFolderAbsPath);
JMeterUtils.setProperty(JMETER_REPORT_OUTPUT_DIR_PROPERTY, reportOutputFolderAbsPath); JMeterUtils.setProperty(JMETER_REPORT_OUTPUT_DIR_PROPERTY, reportOutputFolderAbsPath);

View File

@ -31,6 +31,7 @@ import java.util.Map;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
/** /**
@ -43,7 +44,6 @@ import org.apache.commons.lang3.StringUtils;
public final class JOrphanUtils { public final class JOrphanUtils {
private static final int DEFAULT_CHUNK_SIZE = 4096; private static final int DEFAULT_CHUNK_SIZE = 4096;
/** /**
* Private constructor to prevent instantiation. * Private constructor to prevent instantiation.
*/ */
@ -593,20 +593,52 @@ public final class JOrphanUtils {
* <li>Because it exists but is not empty</li> * <li>Because it exists but is not empty</li>
* <li>Because it does not exist but cannot be created</li> * <li>Because it does not exist but cannot be created</li>
* </ul> * </ul>
* @param folder {@link File} * @param folder {@link File}
*
* @throws IllegalArgumentException when folder can't be written to * @throws IllegalArgumentException when folder can't be written to
*/ */
public static void canSafelyWriteToFolder(File folder) public static void canSafelyWriteToFolder(File folder) {
throws IllegalArgumentException { canSafelyWriteToFolder(folder, false);
}
/**
* Throw {@link IllegalArgumentException} if folder cannot be written to either:
* <ul>
* <li>Because it exists but is not a folder</li>
* <li>Because it exists but is not empty</li>
* <li>Because it does not exist but cannot be created</li>
* </ul>
* @param folder {@link File}
* @param deleteFolderIfExists
*
* @throws IllegalArgumentException when folder can't be written to
*/
public static void canSafelyWriteToFolder(File folder, boolean deleteFolderIfExists) {
if(folder.exists()) { if(folder.exists()) {
if (folder.isFile()) { if (folder.isFile()) {
throw new IllegalArgumentException("Cannot write to '" if(deleteFolderIfExists) {
if(!folder.delete()) {
throw new IllegalArgumentException("Cannot write to '"
+folder.getAbsolutePath()+"' as it is an existing file and delete failed");
}
} else {
throw new IllegalArgumentException("Cannot write to '"
+folder.getAbsolutePath()+"' as it is an existing file"); +folder.getAbsolutePath()+"' as it is an existing file");
}
} else { } else {
File[] listedFiles = folder.listFiles(); File[] listedFiles = folder.listFiles();
if(listedFiles != null && listedFiles.length > 0) { if(listedFiles != null && listedFiles.length > 0) {
throw new IllegalArgumentException("Cannot write to '" if(deleteFolderIfExists) {
try {
FileUtils.deleteDirectory(folder);
folder.mkdir();
} catch(IOException ex) {
throw new IllegalArgumentException("Cannot write to '"
+folder.getAbsolutePath()+"' as folder is not empty and cleanup failed with error:"+ex.getMessage(), ex);
}
} else {
throw new IllegalArgumentException("Cannot write to '"
+folder.getAbsolutePath()+"' as folder is not empty"); +folder.getAbsolutePath()+"' as folder is not empty");
}
} }
} }
} else { } else {

View File

@ -121,6 +121,7 @@ this behaviour, set <code>httpclient.reset_state_on_thread_group_iteration=false
<h3>Report / Dashboard</h3> <h3>Report / Dashboard</h3>
<ul> <ul>
<li><bug>62243</bug>Dashboard : make option "<code>--forceDeleteResultFile</code>"/"<code>-f</code>" option delete folder referenced by "<code>-o</code>" option</li>
</ul> </ul>
<h3>General</h3> <h3>General</h3>

View File

@ -764,7 +764,7 @@ These are shown below.</p>
-S, --systemPropertyFile &lt;argument&gt; -S, --systemPropertyFile &lt;argument&gt;
additional system property file(s) additional system property file(s)
-f, --forceDeleteResultFile -f, --forceDeleteResultFile
force delete existing results files before start the test force delete existing results files and web report folder if present before starting the test
-L, --loglevel &lt;argument&gt;=&lt;value&gt; -L, --loglevel &lt;argument&gt;=&lt;value&gt;
[category=]level e.g. jorphan=INFO, jmeter.util=DEBUG or com.example.foo=WARN [category=]level e.g. jorphan=INFO, jmeter.util=DEBUG or com.example.foo=WARN
-r, --runremote -r, --runremote