Author: pmouawad
Date: Mon Jan  7 09:44:03 2019
New Revision: 1850622

URL: http://svn.apache.org/viewvc?rev=1850622&view=rev
Log:
Bug 63060 - Report Generator: A generator should only check for folder/files it 
generates and only delete those ones
Bugzilla Id: 63060

Modified:
    
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/AbstractDataExporter.java
    
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java
    
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/TemplateVisitor.java
    jmeter/trunk/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
    jmeter/trunk/xdocs/changes.xml

Modified: 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/AbstractDataExporter.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/AbstractDataExporter.java?rev=1850622&r1=1850621&r2=1850622&view=diff
==============================================================================
--- 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/AbstractDataExporter.java
 (original)
+++ 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/AbstractDataExporter.java
 Mon Jan  7 09:44:03 2019
@@ -18,6 +18,8 @@
 package org.apache.jmeter.report.dashboard;
 
 import org.apache.commons.lang3.StringUtils;
+import org.apache.jmeter.report.config.ConfigurationException;
+import org.apache.jmeter.report.config.SubConfiguration;
 import org.apache.jmeter.report.processor.MapResultData;
 import org.apache.jmeter.report.processor.ResultData;
 import org.apache.jmeter.report.processor.ValueResultData;
@@ -26,6 +28,7 @@ import org.apache.jmeter.report.processo
  * The Class AbstractDataExporter provides a base class for DataExporter.
  */
 public abstract class AbstractDataExporter implements DataExporter {
+    private static final String INVALID_PROPERTY_CONFIG_FMT = "Wrong property 
\"%s\" in \"%s\" export configuration";
 
     private String name;
 
@@ -118,4 +121,14 @@ public abstract class AbstractDataExport
         this.name = name;
     }
 
+    protected <TProperty> TProperty getPropertyFromConfig(SubConfiguration cfg,
+            String property, TProperty defaultValue, Class<TProperty> clazz)
+                    throws ExportException {
+        try {
+            return cfg.getProperty(property, defaultValue, clazz);
+        } catch (ConfigurationException ex) {
+            throw new 
ExportException(String.format(INVALID_PROPERTY_CONFIG_FMT,
+                    property, getName()), ex);
+        }
+    }
 }

Modified: 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java?rev=1850622&r1=1850621&r2=1850622&view=diff
==============================================================================
--- 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java
 (original)
+++ 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java
 Mon Jan  7 09:44:03 2019
@@ -18,6 +18,7 @@
 package org.apache.jmeter.report.dashboard;
 
 import java.io.File;
+import java.io.FileFilter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.util.HashMap;
@@ -31,7 +32,6 @@ import org.apache.commons.lang3.StringUt
 import org.apache.commons.lang3.Validate;
 import org.apache.commons.text.StringEscapeUtils;
 import org.apache.jmeter.JMeter;
-import org.apache.jmeter.report.config.ConfigurationException;
 import org.apache.jmeter.report.config.ExporterConfiguration;
 import org.apache.jmeter.report.config.GraphConfiguration;
 import org.apache.jmeter.report.config.ReportGeneratorConfiguration;
@@ -60,7 +60,13 @@ import freemarker.template.TemplateExcep
  * @since 3.0
  */
 public class HtmlTemplateExporter extends AbstractDataExporter {
-
+    private static final FileFilter HTML_REPORT_FILE_FILTER = 
+        file -> 
+            (file.isFile() && 
+                        file.getName().equals("index.html"))
+                    || (file.isDirectory() && 
+                            (file.getName().equals("content") ||
+                                    file.getName().startsWith("sbadmin2-")));
     private static final String CUSTOM_GRAPH_PREFIX = "custom_";
 
     /** Format used for non null check of parameters. */
@@ -83,16 +89,15 @@ public class HtmlTemplateExporter extend
 
     public static final String TIMESTAMP_FORMAT_MS = "ms";
     private static final String INVALID_TEMPLATE_DIRECTORY_FMT = "\"%s\" is 
not a valid template directory";
-    private static final String INVALID_PROPERTY_CONFIG_FMT = "Wrong property 
\"%s\" in \"%s\" export configuration";
 
     // Template directory
     private static final String TEMPLATE_DIR = "template_dir";
     private static final String TEMPLATE_DIR_NAME_DEFAULT = "report-template";
 
     // Output directory
-    private static final String OUTPUT_DIR = "output_dir";
+    static final String OUTPUT_DIR = "output_dir";
     // Default output folder name
-    private static final String OUTPUT_DIR_NAME_DEFAULT = "report-output";
+    static final String OUTPUT_DIR_NAME_DEFAULT = "report-output";
 
     /**
      * Adds to context the value surrounding it with quotes
@@ -326,17 +331,6 @@ public class HtmlTemplateExporter extend
         return timestamp;
     }
 
-    private <TProperty> TProperty getPropertyFromConfig(SubConfiguration cfg,
-            String property, TProperty defaultValue, Class<TProperty> clazz)
-                    throws ExportException {
-        try {
-            return cfg.getProperty(property, defaultValue, clazz);
-        } catch (ConfigurationException ex) {
-            throw new 
ExportException(String.format(INVALID_PROPERTY_CONFIG_FMT,
-                    property, getName()), ex);
-        }
-    }
-
     /*
      * (non-Javadoc)
      * 
@@ -379,7 +373,7 @@ public class HtmlTemplateExporter extend
             outputDir = new File(globallyDefinedOutputDir);
         }
         
-        JOrphanUtils.canSafelyWriteToFolder(outputDir);
+        JOrphanUtils.canSafelyWriteToFolder(outputDir, 
HTML_REPORT_FILE_FILTER);
 
         if (log.isInfoEnabled()) {
             log.info("Will generate dashboard in folder: {}", 
outputDir.getAbsolutePath());

Modified: 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/TemplateVisitor.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/TemplateVisitor.java?rev=1850622&r1=1850621&r2=1850622&view=diff
==============================================================================
--- 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/TemplateVisitor.java 
(original)
+++ 
jmeter/trunk/src/core/org/apache/jmeter/report/dashboard/TemplateVisitor.java 
Mon Jan  7 09:44:03 2019
@@ -31,9 +31,10 @@ import java.nio.file.SimpleFileVisitor;
 import java.nio.file.StandardCopyOption;
 import java.nio.file.attribute.BasicFileAttributes;
 
-import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.jmeter.report.core.DataContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import freemarker.template.Configuration;
 import freemarker.template.Template;
@@ -46,7 +47,7 @@ import freemarker.template.TemplateExcep
  * @since 3.0
  */
 public class TemplateVisitor extends SimpleFileVisitor<Path> {
-
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(TemplateVisitor.class);
     public static final String TEMPLATED_FILE_EXT = "fmkr";
 
     private final Path source;
@@ -88,8 +89,7 @@ public class TemplateVisitor extends Sim
         try {
             Files.copy(file, newDir);
         } catch (FileAlreadyExistsException ex) {
-            // Set directory empty
-            FileUtils.cleanDirectory(newDir.toFile());
+            LOGGER.info("Copying folder from '{}' to '{}', got message:{}, 
found non empty folder with following content {}, will be ignored", file, 
newDir, newDir.toFile().listFiles());
         }
         return FileVisitResult.CONTINUE;
     }

Modified: jmeter/trunk/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java?rev=1850622&r1=1850621&r2=1850622&view=diff
==============================================================================
--- jmeter/trunk/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java 
(original)
+++ jmeter/trunk/src/jorphan/org/apache/jorphan/util/JOrphanUtils.java Mon Jan  
7 09:44:03 2019
@@ -20,6 +20,7 @@ package org.apache.jorphan.util;
 
 import java.io.Closeable;
 import java.io.File;
+import java.io.FileFilter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -588,6 +589,8 @@ public final class JOrphanUtils {
     }
 
     /**
+     * Check whether we can write to a folder. 
+     * A folder can be written to if if does not contain any file or folder
      * Throw {@link IllegalArgumentException} if folder cannot be written to 
either:
      * <ul>
      *  <li>Because it exists but is not a folder</li>
@@ -595,18 +598,48 @@ public final class JOrphanUtils {
      *  <li>Because it does not exist but cannot be created</li>
      * </ul>
      * @param folder {@link File} 
-     * 
      * @throws IllegalArgumentException when folder can't be written to
      */
     public static void canSafelyWriteToFolder(File folder) {
-        canSafelyWriteToFolder(folder, false);
+        canSafelyWriteToFolder(folder, false, file -> true);
     }
+    
+    
+    /**
+     * Check whether we can write to a folder. 
+     * A folder can be written to if folder.listFiles(exporterFileFilter) does 
not return any file or folder.
+     * 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 using 
folder.listFiles(exporterFileFilter)</li>
+     *  <li>Because it does not exist but cannot be created</li>
+     * </ul>
+     * @param folder {@link File} 
+     * @param exporterFileFilter {@link FileFilter} used to 
+     * @throws IllegalArgumentException when folder can't be written to
+     */
+    public static void canSafelyWriteToFolder(File folder, FileFilter 
fileFilter) {
+        canSafelyWriteToFolder(folder, false, fileFilter);
+    }
+    
+    /**
+     * Check whether we can write to a folder.
+     * @param folder {@link File} 
+     * @param deleteFolderContent if true flag whether the folder should be 
emptied or a file with the same name deleted
+     * @throws IllegalArgumentException when folder can't be written to
+     * Throw {@link IllegalArgumentException} if folder cannot be written
+     */
+    public static void canSafelyWriteToFolder(File folder, boolean 
deleteFolderContent) {
+        canSafelyWriteToFolder(folder, deleteFolderContent, file -> true);
+    }
+
+    
     /**
      * Check whether we can write to a folder.
      *
      * @param folder which should be checked for writability and emptyness
      * @param deleteFolderIfExists flag whether the folder should be emptied 
or a file with the same name deleted
-     *
+     * @param exporterFileFilter {@link FileFilter}
      * @throws IllegalArgumentException when folder can't be written to. That 
could have the following reasons:
      * <ul>
      *  <li>it exists but is not a folder</li>
@@ -614,7 +647,7 @@ public final class JOrphanUtils {
      *  <li>it does not exist but cannot be created</li>
      * </ul>
      */
-    public static void canSafelyWriteToFolder(File folder, boolean 
deleteFolderIfExists) {
+    public static void canSafelyWriteToFolder(File folder, boolean 
deleteFolderIfExists, FileFilter exporterFileFilter) {
         if(folder.exists()) {
             if (folder.isFile()) {
                 if(deleteFolderIfExists) {
@@ -627,7 +660,7 @@ public final class JOrphanUtils {
                         +folder.getAbsolutePath()+"' as it is an existing 
file");
                 }
             } else {
-                File[] listedFiles = folder.listFiles();
+                File[] listedFiles = folder.listFiles(exporterFileFilter);
                 if(listedFiles != null && listedFiles.length > 0) {
                     if(deleteFolderIfExists) {
                         try {

Modified: jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1850622&r1=1850621&r2=1850622&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Mon Jan  7 09:44:03 2019
@@ -116,6 +116,7 @@ of previous time slot as a base. Startin
 <h3>Report / Dashboard</h3>
 <ul>
     <li><bug>62883</bug>Report / Dashboard : Change the way percentiles are 
computed for Response Time Percentiles Over Time (successful responses) 
graph</li>
+    <li><bug>63060</bug>Report Generator: A generator should only check for 
folder/files it generates and only delete those ones</li>
 </ul>
 
 <h3>General</h3>


Reply via email to