You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by mi...@apache.org on 2015/07/04 20:04:18 UTC

svn commit: r1689187 [23/32] - in /jmeter/branches/HC4: ./ bin/ bin/templates/ bin/testfiles/ docs/ docs/css/ docs/images/screenshots/ docs/images/screenshots/assertion/ docs/images/screenshots/changes/2.13/ docs/usermanual/ lib/ licenses/bin/ res/mave...

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/SamplerMetric.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/SamplerMetric.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/SamplerMetric.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/SamplerMetric.java Sat Jul  4 18:04:12 2015
@@ -29,8 +29,15 @@ import org.apache.jmeter.util.JMeterUtil
 public class SamplerMetric {
     private static final int SLIDING_WINDOW_SIZE = JMeterUtils.getPropDefault("backend_metrics_window", 100); //$NON-NLS-1$
     
+    // Response times for OK samples
     // Limit to sliding window of SLIDING_WINDOW_SIZE values 
-    private DescriptiveStatistics responsesStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+    private DescriptiveStatistics okResponsesStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+    // Response times for KO samples
+    // Limit to sliding window of SLIDING_WINDOW_SIZE values 
+    private DescriptiveStatistics koResponsesStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
+    // Response times for All samples
+    // Limit to sliding window of SLIDING_WINDOW_SIZE values 
+    private DescriptiveStatistics allResponsesStats = new DescriptiveStatistics(SLIDING_WINDOW_SIZE);
     private int successes;
     private int failures;
     /**
@@ -50,10 +57,13 @@ public class SamplerMetric {
             failures+=result.getErrorCount();
         }
         long time = result.getTime();
+        allResponsesStats.addValue(time);
         if(result.isSuccessful()) {
             // Should we also compute KO , all response time ?
             // only take successful requests for time computing
-            responsesStats.addValue(time);
+            okResponsesStats.addValue(time);
+        }else {
+            koResponsesStats.addValue(time);
         }
     }
     
@@ -68,12 +78,59 @@ public class SamplerMetric {
     }
 
     /**
+     * Get the number of total requests for the current time slot
+     * 
+     * @return number of total requests
+     */
+    public int getTotal() {
+        return successes+failures;
+    }
+    
+    /**
+     * Get the number of successful requests for the current time slot
+     * 
+     * @return number of successful requests
+     */
+    public int getSuccesses() {
+        return successes;
+    }
+
+    /**
+     * Get the number of failed requests for the current time slot
+     * 
+     * @return number of failed requests
+     */
+    public int getFailures() {
+        return failures;
+    }
+
+    /**
+     * Get the maximal elapsed time for requests within sliding window
+     * 
+     * @return the maximal elapsed time, or <code>0</code> if no requests have
+     *         been added yet
+     */
+    public double getOkMaxTime() {
+        return okResponsesStats.getMax();
+    }
+
+    /**
+     * Get the minimal elapsed time for requests within sliding window
+     * 
+     * @return the minTime, or {@link Long#MAX_VALUE} if no requests have been
+     *         added yet
+     */
+    public double getOkMinTime() {
+        return okResponsesStats.getMin();
+    }
+    
+    /**
      * Get the arithmetic mean of the stored values
      * 
      * @return The arithmetic mean of the stored values
      */
-    public double getMean() {
-        return responsesStats.getMean();
+    public double getOkMean() {
+        return okResponsesStats.getMean();
     }
     
     /**
@@ -84,45 +141,59 @@ public class SamplerMetric {
      * @return Returns an estimate for the requested percentile of the stored
      *         values.
      */
-    public double getPercentile(double percentile) {
-        return responsesStats.getPercentile(percentile);
+    public double getOkPercentile(double percentile) {
+        return okResponsesStats.getPercentile(percentile);
     }
 
     /**
-     * Get the number of total requests for the current time slot
+     * Get the maximal elapsed time for requests within sliding window
      * 
-     * @return number of total requests
+     * @return the maximal elapsed time, or <code>0</code> if no requests have
+     *         been added yet
      */
-    public int getTotal() {
-        return successes+failures;
+    public double getKoMaxTime() {
+        return koResponsesStats.getMax();
+    }
+
+    /**
+     * Get the minimal elapsed time for requests within sliding window
+     * 
+     * @return the minTime, or {@link Long#MAX_VALUE} if no requests have been
+     *         added yet
+     */
+    public double getKoMinTime() {
+        return koResponsesStats.getMin();
     }
     
     /**
-     * Get the number of successful requests for the current time slot
+     * Get the arithmetic mean of the stored values
      * 
-     * @return number of successful requests
+     * @return The arithmetic mean of the stored values
      */
-    public int getSuccesses() {
-        return successes;
+    public double getKoMean() {
+        return koResponsesStats.getMean();
     }
-
+    
     /**
-     * Get the number of failed requests for the current time slot
+     * Returns an estimate for the requested percentile of the stored values.
      * 
-     * @return number of failed requests
+     * @param percentile
+     *            the requested percentile (scaled from 0 - 100)
+     * @return Returns an estimate for the requested percentile of the stored
+     *         values.
      */
-    public int getFailures() {
-        return failures;
+    public double getKoPercentile(double percentile) {
+        return koResponsesStats.getPercentile(percentile);
     }
-
+    
     /**
      * Get the maximal elapsed time for requests within sliding window
      * 
      * @return the maximal elapsed time, or <code>0</code> if no requests have
      *         been added yet
      */
-    public double getMaxTime() {
-        return responsesStats.getMax();
+    public double getAllMaxTime() {
+        return allResponsesStats.getMax();
     }
 
     /**
@@ -131,7 +202,28 @@ public class SamplerMetric {
      * @return the minTime, or {@link Long#MAX_VALUE} if no requests have been
      *         added yet
      */
-    public double getMinTime() {
-        return responsesStats.getMin();
+    public double getAllMinTime() {
+        return allResponsesStats.getMin();
+    }
+    
+    /**
+     * Get the arithmetic mean of the stored values
+     * 
+     * @return The arithmetic mean of the stored values
+     */
+    public double getAllMean() {
+        return allResponsesStats.getMean();
+    }
+    
+    /**
+     * Returns an estimate for the requested percentile of the stored values.
+     * 
+     * @param percentile
+     *            the requested percentile (scaled from 0 - 100)
+     * @return Returns an estimate for the requested percentile of the stored
+     *         values.
+     */
+    public double getAllPercentile(double percentile) {
+        return allResponsesStats.getPercentile(percentile);
     }
 }

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/AbstractGraphiteMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/AbstractGraphiteMetricsSender.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/AbstractGraphiteMetricsSender.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/AbstractGraphiteMetricsSender.java Sat Jul  4 18:04:12 2015
@@ -31,8 +31,11 @@ import org.apache.commons.pool2.impl.Gen
 abstract class AbstractGraphiteMetricsSender implements GraphiteMetricsSender {
 
     /**
-     * @return GenericKeyedObjectPool
-     * 
+     * Create a new keyed pool of {@link SocketOutputStream}s using a
+     * {@link SocketOutputStreamPoolFactory}. The keys for the pool are
+     * {@link SocketConnectionInfos} instances.
+     *
+     * @return GenericKeyedObjectPool the newly generated pool
      */
     protected GenericKeyedObjectPool<SocketConnectionInfos, SocketOutputStream> createSocketOutputStreamPool() {
         GenericKeyedObjectPoolConfig config = new GenericKeyedObjectPoolConfig();
@@ -55,8 +58,10 @@ abstract class AbstractGraphiteMetricsSe
      * <li>'\\' by '-'</li>
      * <li>'.' by '_'</li>
      * </ul>
+     * 
      * @param s
-     * @return
+     *            text to be sanitized
+     * @return the sanitized text
      */
     static final String sanitizeString(String s) {
         // String#replace uses regexp

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/GraphiteBackendListenerClient.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/GraphiteBackendListenerClient.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/GraphiteBackendListenerClient.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/GraphiteBackendListenerClient.java Sat Jul  4 18:04:12 2015
@@ -45,22 +45,46 @@ import org.apache.log.Logger;
  */
 public class GraphiteBackendListenerClient extends AbstractBackendListenerClient implements Runnable {
     private static final int DEFAULT_PLAINTEXT_PROTOCOL_PORT = 2003;
-    private static final String CUMULATED_CONTEXT_NAME = "cumulated";
+    private static final String TEST_CONTEXT_NAME = "test";
+    private static final String ALL_CONTEXT_NAME = "all";
 
     private static final Logger LOGGER = LoggingManager.getLoggerForClass();
     private static final String DEFAULT_METRICS_PREFIX = "jmeter."; //$NON-NLS-1$
     private static final String CUMULATED_METRICS = "__cumulated__"; //$NON-NLS-1$
-    private static final String METRIC_MAX_ACTIVE_THREADS = "maxActiveThreads"; //$NON-NLS-1$
-    private static final String METRIC_MIN_ACTIVE_THREADS = "minActiveThreads"; //$NON-NLS-1$
-    private static final String METRIC_MEAN_ACTIVE_THREADS = "meanActiveThreads"; //$NON-NLS-1$
-    private static final String METRIC_STARTED_THREADS = "startedThreads"; //$NON-NLS-1$
-    private static final String METRIC_STOPPED_THREADS = "stoppedThreads"; //$NON-NLS-1$
-    private static final String METRIC_FAILED_REQUESTS = "failure"; //$NON-NLS-1$
-    private static final String METRIC_SUCCESSFUL_REQUESTS = "success"; //$NON-NLS-1$
-    private static final String METRIC_TOTAL_REQUESTS = "total"; //$NON-NLS-1$
+    // User Metrics
+    private static final String METRIC_MAX_ACTIVE_THREADS = "maxAT"; //$NON-NLS-1$
+    private static final String METRIC_MIN_ACTIVE_THREADS = "minAT"; //$NON-NLS-1$
+    private static final String METRIC_MEAN_ACTIVE_THREADS = "meanAT"; //$NON-NLS-1$
+    private static final String METRIC_STARTED_THREADS = "startedT"; //$NON-NLS-1$
+    private static final String METRIC_FINISHED_THREADS = "endedT"; //$NON-NLS-1$
+    
+    // Response time Metrics
+    private static final String METRIC_SEPARATOR = "."; //$NON-NLS-1$
+    private static final String METRIC_OK_PREFIX = "ok"; //$NON-NLS-1$
+    private static final String METRIC_KO_PREFIX = "ko"; //$NON-NLS-1$
+    private static final String METRIC_ALL_PREFIX = "a";
+
+    
+    private static final String METRIC_COUNT = "count"; //$NON-NLS-1$
     private static final String METRIC_MIN_RESPONSE_TIME = "min"; //$NON-NLS-1$
     private static final String METRIC_MAX_RESPONSE_TIME = "max"; //$NON-NLS-1$
-    private static final String METRIC_PERCENTILE_PREFIX = "percentile"; //$NON-NLS-1$
+    private static final String METRIC_PERCENTILE = "pct"; //$NON-NLS-1$
+    
+    private static final String METRIC_OK_COUNT             = METRIC_OK_PREFIX+METRIC_SEPARATOR+METRIC_COUNT;
+    private static final String METRIC_OK_MIN_RESPONSE_TIME = METRIC_OK_PREFIX+METRIC_SEPARATOR+METRIC_MIN_RESPONSE_TIME;
+    private static final String METRIC_OK_MAX_RESPONSE_TIME = METRIC_OK_PREFIX+METRIC_SEPARATOR+METRIC_MAX_RESPONSE_TIME;
+    private static final String METRIC_OK_PERCENTILE_PREFIX = METRIC_OK_PREFIX+METRIC_SEPARATOR+METRIC_PERCENTILE;
+
+    private static final String METRIC_KO_COUNT             = METRIC_KO_PREFIX+METRIC_SEPARATOR+METRIC_COUNT;
+    private static final String METRIC_KO_MIN_RESPONSE_TIME = METRIC_KO_PREFIX+METRIC_SEPARATOR+METRIC_MIN_RESPONSE_TIME;
+    private static final String METRIC_KO_MAX_RESPONSE_TIME = METRIC_KO_PREFIX+METRIC_SEPARATOR+METRIC_MAX_RESPONSE_TIME;
+    private static final String METRIC_KO_PERCENTILE_PREFIX = METRIC_KO_PREFIX+METRIC_SEPARATOR+METRIC_PERCENTILE;
+
+    private static final String METRIC_ALL_COUNT             = METRIC_ALL_PREFIX+METRIC_SEPARATOR+METRIC_COUNT;
+    private static final String METRIC_ALL_MIN_RESPONSE_TIME = METRIC_ALL_PREFIX+METRIC_SEPARATOR+METRIC_MIN_RESPONSE_TIME;
+    private static final String METRIC_ALL_MAX_RESPONSE_TIME = METRIC_ALL_PREFIX+METRIC_SEPARATOR+METRIC_MAX_RESPONSE_TIME;
+    private static final String METRIC_ALL_PERCENTILE_PREFIX = METRIC_ALL_PREFIX+METRIC_SEPARATOR+METRIC_PERCENTILE;
+
     private static final long ONE_SECOND = 1L;
     private static final int MAX_POOL_SIZE = 1;
     private static final String DEFAULT_PERCENTILES = "90;95;99";
@@ -73,7 +97,9 @@ public class GraphiteBackendListenerClie
     private String rootMetricsPrefix;
     private String samplersList = ""; //$NON-NLS-1$
     private Set<String> samplersToFilter;
-    private Map<String, Float> percentiles;
+    private Map<String, Float> okPercentiles;
+    private Map<String, Float> koPercentiles;
+    private Map<String, Float> allPercentiles;
     
 
     private GraphiteMetricsSender graphiteMetricsManager;
@@ -100,7 +126,7 @@ public class GraphiteBackendListenerClie
             for (Map.Entry<String, SamplerMetric> entry : getMetricsPerSampler().entrySet()) {
                 SamplerMetric metric = entry.getValue();
                 if(entry.getKey().equals(CUMULATED_METRICS)) {
-                    addMetrics(timestampInSeconds, CUMULATED_CONTEXT_NAME, metric);
+                    addMetrics(timestampInSeconds, ALL_CONTEXT_NAME, metric);
                 } else {
                     addMetrics(timestampInSeconds, AbstractGraphiteMetricsSender.sanitizeString(entry.getKey()), metric);                
                 }
@@ -108,11 +134,11 @@ public class GraphiteBackendListenerClie
                 metric.resetForTimeInterval();
             }
         }        
-        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MIN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMaxActiveThreads()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MAX_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMinActiveThreads()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_MEAN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMeanActiveThreads()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STARTED_THREADS, Integer.toString(getUserMetrics().getStartedThreads()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, CUMULATED_CONTEXT_NAME, METRIC_STOPPED_THREADS, Integer.toString(getUserMetrics().getFinishedThreads()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, TEST_CONTEXT_NAME, METRIC_MIN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMinActiveThreads()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, TEST_CONTEXT_NAME, METRIC_MAX_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMaxActiveThreads()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, TEST_CONTEXT_NAME, METRIC_MEAN_ACTIVE_THREADS, Integer.toString(getUserMetrics().getMeanActiveThreads()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, TEST_CONTEXT_NAME, METRIC_STARTED_THREADS, Integer.toString(getUserMetrics().getStartedThreads()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, TEST_CONTEXT_NAME, METRIC_FINISHED_THREADS, Integer.toString(getUserMetrics().getFinishedThreads()));
 
         graphiteMetricsManager.writeAndSendMetrics();
     }
@@ -126,17 +152,38 @@ public class GraphiteBackendListenerClie
      * @param metric {@link SamplerMetric}
      */
     private void addMetrics(long timestampInSeconds, String contextName, SamplerMetric metric) {
-        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_FAILED_REQUESTS, Integer.toString(metric.getFailures()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_SUCCESSFUL_REQUESTS, Integer.toString(metric.getSuccesses()));
-        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_TOTAL_REQUESTS, Integer.toString(metric.getTotal()));
-        // See https://issues.apache.org/bugzilla/show_bug.cgi?id=57350
+        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_OK_COUNT, Integer.toString(metric.getSuccesses()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_KO_COUNT, Integer.toString(metric.getFailures()));
+        graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_ALL_COUNT, Integer.toString(metric.getTotal()));
+        // See https://bz.apache.org/bugzilla/show_bug.cgi?id=57350
         if(metric.getTotal() > 0) { 
-            graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MIN_RESPONSE_TIME, Double.toString(metric.getMinTime()));
-            graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_MAX_RESPONSE_TIME, Double.toString(metric.getMaxTime()));
-            for (Map.Entry<String, Float> entry : percentiles.entrySet()) {
-                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, 
-                        entry.getKey(), 
-                        Double.toString(metric.getPercentile(entry.getValue().floatValue())));            
+            if(metric.getSuccesses()>0) {
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_OK_MIN_RESPONSE_TIME, Double.toString(metric.getOkMinTime()));
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_OK_MAX_RESPONSE_TIME, Double.toString(metric.getOkMaxTime()));
+                for (Map.Entry<String, Float> entry : okPercentiles.entrySet()) {
+                    graphiteMetricsManager.addMetric(timestampInSeconds, contextName, 
+                            entry.getKey(), 
+                            Double.toString(metric.getOkPercentile(entry.getValue().floatValue())));            
+                }
+            } 
+            if(metric.getFailures()>0) {
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_KO_MIN_RESPONSE_TIME, Double.toString(metric.getKoMinTime()));
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_KO_MAX_RESPONSE_TIME, Double.toString(metric.getKoMaxTime()));
+                for (Map.Entry<String, Float> entry : koPercentiles.entrySet()) {
+                    graphiteMetricsManager.addMetric(timestampInSeconds, contextName, 
+                            entry.getKey(), 
+                            Double.toString(metric.getKoPercentile(entry.getValue().floatValue())));            
+                }   
+            }
+            if(metric.getTotal()>0) {
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_ALL_MIN_RESPONSE_TIME, Double.toString(metric.getAllMinTime()));
+                graphiteMetricsManager.addMetric(timestampInSeconds, contextName, METRIC_ALL_MAX_RESPONSE_TIME, Double.toString(metric.getAllMaxTime()));
+                for (Map.Entry<String, Float> entry : allPercentiles.entrySet()) {
+                    graphiteMetricsManager.addMetric(timestampInSeconds, contextName, 
+                            entry.getKey(), 
+                            Double.toString(metric.getAllPercentile(entry.getValue().floatValue())));            
+                }   
+                
             }
         }
     }
@@ -182,15 +229,24 @@ public class GraphiteBackendListenerClie
         rootMetricsPrefix = context.getParameter("rootMetricsPrefix", DEFAULT_METRICS_PREFIX);
         String percentilesAsString = context.getParameter("percentiles", DEFAULT_METRICS_PREFIX);
         String[]  percentilesStringArray = percentilesAsString.split(SEPARATOR);
-        percentiles = new HashMap<String, Float>(percentilesStringArray.length);
+        okPercentiles = new HashMap<String, Float>(percentilesStringArray.length);
+        koPercentiles = new HashMap<String, Float>(percentilesStringArray.length);
+        allPercentiles = new HashMap<String, Float>(percentilesStringArray.length);
         DecimalFormat format = new DecimalFormat("0.##");
         for (int i = 0; i < percentilesStringArray.length; i++) {
             if(!StringUtils.isEmpty(percentilesStringArray[i].trim())) {
                 try {
                     Float percentileValue = Float.parseFloat(percentilesStringArray[i].trim());
-                    percentiles.put(
-                            METRIC_PERCENTILE_PREFIX+AbstractGraphiteMetricsSender.sanitizeString(format.format(percentileValue)),
+                    okPercentiles.put(
+                            METRIC_OK_PERCENTILE_PREFIX+AbstractGraphiteMetricsSender.sanitizeString(format.format(percentileValue)),
+                            percentileValue);
+                    koPercentiles.put(
+                            METRIC_KO_PERCENTILE_PREFIX+AbstractGraphiteMetricsSender.sanitizeString(format.format(percentileValue)),
                             percentileValue);
+                    allPercentiles.put(
+                            METRIC_ALL_PERCENTILE_PREFIX+AbstractGraphiteMetricsSender.sanitizeString(format.format(percentileValue)),
+                            percentileValue);
+
                 } catch(Exception e) {
                     LOGGER.error("Error parsing percentile:'"+percentilesStringArray[i]+"'", e);
                 }

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java Sat Jul  4 18:04:12 2015
@@ -109,6 +109,7 @@ class PickleGraphiteMetricsSender extend
 
                 out = socketOutputStreamPool.borrowObject(socketConnectionInfos);
                 out.write(header);
+                // pickleWriter is not closed as it would close the underlying pooled out
                 Writer pickleWriter = new OutputStreamWriter(out, CHARSET_NAME);
                 pickleWriter.write(payload);
                 pickleWriter.flush();

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/SocketOutputStreamPoolFactory.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/SocketOutputStreamPoolFactory.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/SocketOutputStreamPoolFactory.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/SocketOutputStreamPoolFactory.java Sat Jul  4 18:04:12 2015
@@ -25,6 +25,7 @@ import org.apache.commons.pool2.BaseKeye
 import org.apache.commons.pool2.KeyedPooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
 import org.apache.commons.pool2.impl.DefaultPooledObject;
+import org.apache.jorphan.util.JOrphanUtils;
 
 /**
  * Pool Factory of {@link SocketOutputStream}
@@ -51,8 +52,8 @@ public class SocketOutputStreamPoolFacto
     public void destroyObject(SocketConnectionInfos socketConnectionInfos, PooledObject<SocketOutputStream> socketOutputStream) throws Exception {
         super.destroyObject(socketConnectionInfos, socketOutputStream);
         SocketOutputStream outputStream = socketOutputStream.getObject();
-        outputStream.close();
-        outputStream.getSocket().close();
+        JOrphanUtils.closeQuietly(outputStream);
+        JOrphanUtils.closeQuietly(outputStream.getSocket());
     }
 
     /**

Modified: jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java (original)
+++ jmeter/branches/HC4/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java Sat Jul  4 18:04:12 2015
@@ -85,6 +85,7 @@ class TextGraphiteMetricsSender extends
             SocketOutputStream out = null;
             try {
                 out = socketOutputStreamPool.borrowObject(socketConnectionInfos);
+                // pw is not closed as it would close the underlying pooled out
                 PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, CHARSET_NAME), false);
                 for (MetricTuple metric: metrics) {
                     pw.printf("%s %s %d%n", metric.name, metric.value, Long.valueOf(metric.timestamp));

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/JMeter.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/JMeter.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/JMeter.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/JMeter.java Sat Jul  4 18:04:12 2015
@@ -31,7 +31,6 @@ import java.net.InetAddress;
 import java.net.MalformedURLException;
 import java.net.SocketException;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Enumeration;
@@ -54,6 +53,7 @@ import org.apache.commons.cli.avalon.CLO
 import org.apache.commons.cli.avalon.CLUtil;
 import org.apache.jmeter.control.ReplaceableController;
 import org.apache.jmeter.engine.ClientJMeterEngine;
+import org.apache.jmeter.engine.DistributedRunner;
 import org.apache.jmeter.engine.JMeterEngine;
 import org.apache.jmeter.engine.RemoteJMeterEngineImpl;
 import org.apache.jmeter.engine.StandardJMeterEngine;
@@ -244,14 +244,12 @@ public class JMeter implements JMeterPlu
         main.setVisible(true);
         ActionRouter.getInstance().actionPerformed(new ActionEvent(main, 1, ActionNames.ADD_ALL));
         if (testFile != null) {
-            FileInputStream reader = null;
             try {
                 File f = new File(testFile);
                 log.info("Loading file: " + f);
                 FileServer.getFileServer().setBaseForScript(f);
 
-                reader = new FileInputStream(f);
-                HashTree tree = SaveService.loadTree(reader);
+                HashTree tree = SaveService.loadTree(f);
 
                 GuiPackage.getInstance().setTestPlanFile(f.getAbsolutePath());
 
@@ -262,8 +260,6 @@ public class JMeter implements JMeterPlu
             } catch (Exception e) {
                 log.error("Failure loading test file", e);
                 JMeterUtils.reportErrorToUser(e.toString());
-            } finally {
-                JOrphanUtils.closeQuietly(reader);
             }
         } else {
             JTree jTree = GuiPackage.getInstance().getMainFrame().getTree();
@@ -331,6 +327,8 @@ public class JMeter implements JMeterPlu
             logProperty("os.arch"); //$NON-NLS-1$
             logProperty("os.version"); //$NON-NLS-1$
             logProperty("file.encoding"); // $NON-NLS-1$
+            log.info("Max memory     ="+ Runtime.getRuntime().maxMemory());
+            log.info("Available Processors ="+ Runtime.getRuntime().availableProcessors());
             log.info("Default Locale=" + Locale.getDefault().getDisplayName());
             log.info("JMeter  Locale=" + JMeterUtils.getLocale().getDisplayName());
             log.info("JMeterHome="     + JMeterUtils.getJMeterHome());
@@ -743,7 +741,6 @@ public class JMeter implements JMeterPlu
 
     // run test in batch mode
     private void runNonGui(String testFile, String logFile, boolean remoteStart, String remote_hosts_string) {
-        FileInputStream reader = null;
         try {
             File f = new File(testFile);
             if (!f.exists() || !f.isFile()) {
@@ -752,10 +749,7 @@ public class JMeter implements JMeterPlu
             }
             FileServer.getFileServer().setBaseForScript(f);
 
-            reader = new FileInputStream(f);
-            log.info("Loading file: " + f);
-
-            HashTree tree = SaveService.loadTree(reader);
+            HashTree tree = SaveService.loadTree(f);
 
             @SuppressWarnings("deprecation") // Deliberate use of deprecated ctor
             JMeterTreeModel treeModel = new JMeterTreeModel(new Object());// Create non-GUI version to avoid headless problems
@@ -811,42 +805,22 @@ public class JMeter implements JMeterPlu
                 engines.add(engine);
             } else {
                 java.util.StringTokenizer st = new java.util.StringTokenizer(remote_hosts_string, ",");//$NON-NLS-1$
-                List<String> failingEngines = new ArrayList<String>(st.countTokens());
+                List<String> hosts = new LinkedList<String>();
                 while (st.hasMoreElements()) {
-                    String el = (String) st.nextElement();
-                    println("Configuring remote engine for " + el);
-                    log.info("Configuring remote engine for " + el);
-                    JMeterEngine eng = doRemoteInit(el.trim(), tree);
-                    if (null != eng) {
-                        engines.add(eng);
-                    } else {
-                        failingEngines.add(el);
-                        println("Failed to configure "+el);
-                    }
-                }
-                if (engines.isEmpty()) {
-                    println("No remote engines were started.");
-                    return;
+                    hosts.add((String) st.nextElement());
                 }
-                if(failingEngines.size()>0) {
-                    throw new IllegalArgumentException("The following remote engines could not be configured:"+failingEngines);
-                }
-                println("Starting remote engines");
-                log.info("Starting remote engines");
-                long now=System.currentTimeMillis();
-                println("Starting the test @ "+new Date(now)+" ("+now+")");
-                for (JMeterEngine engine : engines) {
-                    engine.runTest();
-                }
-                println("Remote engines have been started");
-                log.info("Remote engines have been started");
+                
+                DistributedRunner distributedRunner=new DistributedRunner(this.remoteProps);
+                distributedRunner.setStdout(System.out);
+                distributedRunner.setStdErr(System.err);
+                distributedRunner.init(hosts, tree);
+                engines.addAll(distributedRunner.getEngines());
+                distributedRunner.start();
             }
             startUdpDdaemon(engines);
         } catch (Exception e) {
             System.out.println("Error in NonGUIDriver " + e.toString());
             log.error("Error in NonGUIDriver", e);
-        } finally {
-            JOrphanUtils.closeQuietly(reader);
         }
     }
 
@@ -929,22 +903,6 @@ public class JMeter implements JMeterPlu
         return rc;
     }
 
-    private JMeterEngine doRemoteInit(String hostName, HashTree testTree) {
-        JMeterEngine engine = null;
-        try {
-            engine = new ClientJMeterEngine(hostName);
-        } catch (Exception e) {
-            log.fatalError("Failure connecting to remote host: "+hostName, e);
-            System.err.println("Failure connecting to remote host: "+hostName+" "+e);
-            return null;
-        }
-        engine.configure(testTree);
-        if (!remoteProps.isEmpty()) {
-            engine.setProperties(remoteProps);
-        }
-        return engine;
-    }
-
     /*
      * Listen to test and handle tidyup after non-GUI test completes.
      * If running a remote test, then after waiting a few seconds for listeners to finish files,
@@ -1152,7 +1110,7 @@ public class JMeter implements JMeterPlu
 
     private static void waitForSignals(final List<JMeterEngine> engines, DatagramSocket socket) {
         byte[] buf = new byte[80];
-        System.out.println("Waiting for possible shutdown message on port "+socket.getLocalPort());
+        System.out.println("Waiting for possible Shutdown/StopTestNow/Heapdump message on port "+socket.getLocalPort());
         DatagramPacket request = new DatagramPacket(buf, buf.length);
         try {
             while(true) {

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/NewDriver.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/NewDriver.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/NewDriver.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/NewDriver.java Sat Jul  4 18:04:12 2015
@@ -253,12 +253,7 @@ public final class NewDriver {
         }
 
         try {
-            Class<?> initialClass;
-            if (args != null && args.length > 0 && args[0].equals("report")) {// $NON-NLS-1$
-                initialClass = loader.loadClass("org.apache.jmeter.JMeterReport");// $NON-NLS-1$
-            } else {
-                initialClass = loader.loadClass("org.apache.jmeter.JMeter");// $NON-NLS-1$
-            }
+            Class<?> initialClass = loader.loadClass("org.apache.jmeter.JMeter");// $NON-NLS-1$
             Object instance = initialClass.newInstance();
             Method startup = initialClass.getMethod("start", new Class[] { new String[0].getClass() });// $NON-NLS-1$
             startup.invoke(instance, new Object[] { args });

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/config/gui/RowDetailDialog.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/config/gui/RowDetailDialog.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/config/gui/RowDetailDialog.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/config/gui/RowDetailDialog.java Sat Jul  4 18:04:12 2015
@@ -76,13 +76,13 @@ public class RowDetailDialog extends JDi
     private JButton nextButton;
 
     private JButton previousButton;
-    
+
     private JButton closeButton;
 
     private ObjectTableModel tableModel;
 
     private int selectedRow;
-    
+
     private boolean textChanged = true; // change to false after the first insert
 
 
@@ -102,9 +102,7 @@ public class RowDetailDialog extends JDi
         JRootPane rootPane = new JRootPane();
         // Hide Window on ESC
         Action escapeAction = new AbstractAction("ESCAPE") {
-            /**
-             *
-             */
+
             private static final long serialVersionUID = -8699034338969407625L;
 
             @Override
@@ -114,9 +112,7 @@ public class RowDetailDialog extends JDi
         };
         // Do update on Enter
         Action enterAction = new AbstractAction("ENTER") {
-            /**
-             *
-             */
+
             private static final long serialVersionUID = -1529005452976176873L;
 
             @Override
@@ -198,22 +194,22 @@ public class RowDetailDialog extends JDi
     @Override
     public void actionPerformed(ActionEvent e) {
         String action = e.getActionCommand();
-        if(action.equals(CLOSE)) {
+        if (action.equals(CLOSE)) {
             this.setVisible(false);
         }
-        else if(action.equals(NEXT)) {
+        else if (action.equals(NEXT)) {
             selectedRow++;
             previousButton.setEnabled(true);
             nextButton.setEnabled(selectedRow < tableModel.getRowCount()-1);
             setValues(selectedRow);
         }
-        else if(action.equals(PREVIOUS)) {
+        else if (action.equals(PREVIOUS)) {
             selectedRow--;
             nextButton.setEnabled(true);
             previousButton.setEnabled(selectedRow > 0);
             setValues(selectedRow);
         }
-        else if(action.equals(UPDATE)) {
+        else if (action.equals(UPDATE)) {
             doUpdate(e);
         }
     }
@@ -265,5 +261,5 @@ public class RowDetailDialog extends JDi
     public void changedUpdate(DocumentEvent e) {
         changeLabelButton();
     }
-    
+
 }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestFragmentControllerGui.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestFragmentControllerGui.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestFragmentControllerGui.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestFragmentControllerGui.java Sat Jul  4 18:04:12 2015
@@ -46,6 +46,7 @@ public class TestFragmentControllerGui e
     @Override
     public TestElement createTestElement() {
         TestFragmentController controller = new TestFragmentController();
+        setEnabled(false);
         modifyTestElement(controller);
         return controller;
     }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestPlanGui.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestPlanGui.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestPlanGui.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/control/gui/TestPlanGui.java Sat Jul  4 18:04:12 2015
@@ -158,14 +158,14 @@ public class TestPlanGui extends Abstrac
         super.configure(el);
         if (el instanceof TestPlan) {
             TestPlan tp = (TestPlan) el;
-        functionalMode.setSelected(tp.isFunctionalMode());
-        serializedMode.setSelected(tp.isSerialized());
-        tearDownOnShutdown.setSelected(tp.isTearDownOnShutdown());
-        final JMeterProperty udv = tp.getUserDefinedVariablesAsProperty();
-        if (udv != null) {
-            argsPanel.configure((Arguments) udv.getObjectValue());
-        }
-        browseJar.setFiles(tp.getTestPlanClasspathArray());
+            functionalMode.setSelected(tp.isFunctionalMode());
+            serializedMode.setSelected(tp.isSerialized());
+            tearDownOnShutdown.setSelected(tp.isTearDownOnShutdown());
+            final JMeterProperty udv = tp.getUserDefinedVariablesAsProperty();
+            if (udv != null) {
+                argsPanel.configure((Arguments) udv.getObjectValue());
+            }
+            browseJar.setFiles(tp.getTestPlanClasspathArray());
         }
     }
 

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/engine/ClientJMeterEngine.java Sat Jul  4 18:04:12 2015
@@ -107,7 +107,7 @@ public class ClientJMeterEngine implemen
     public void runTest() throws JMeterEngineException {
         log.info("running clientengine run method");
         
-        // See https://issues.apache.org/bugzilla/show_bug.cgi?id=55510
+        // See https://bz.apache.org/bugzilla/show_bug.cgi?id=55510
         JMeterContextService.clearTotalThreads();
         HashTree testTree = test;
 
@@ -123,7 +123,7 @@ public class ClientJMeterEngine implemen
             /*
              * Add fix for Deadlocks, see:
              * 
-             * See https://issues.apache.org/bugzilla/show_bug.cgi?id=48350
+             * See https://bz.apache.org/bugzilla/show_bug.cgi?id=48350
             */
             File baseDirRelative = FileServer.getFileServer().getBaseDirRelative();
             String scriptName = FileServer.getFileServer().getScriptName();
@@ -197,4 +197,8 @@ public class ClientJMeterEngine implemen
     public boolean isActive() {
         return true;
     }
+
+    public String getHost() {
+        return host;
+    }
 }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/engine/RemoteJMeterEngineImpl.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/engine/RemoteJMeterEngineImpl.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/engine/RemoteJMeterEngineImpl.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/engine/RemoteJMeterEngineImpl.java Sat Jul  4 18:04:12 2015
@@ -91,6 +91,7 @@ public final class RemoteJMeterEngineImp
             if( host==null ) {
                 localHost = InetAddress.getLocalHost();
             } else {
+                log.info("Resolving by name the value of System property 'java.rmi.server.hostname':"+host);
                 localHost = InetAddress.getByName(host);
             }
         } catch (UnknownHostException e1) {

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java Sat Jul  4 18:04:12 2015
@@ -446,7 +446,7 @@ public class StandardJMeterEngine implem
         }
 
         notifyTestListenersOfEnd(testListeners);
-
+        JMeterContextService.endTest();
         if (JMeter.isNonGUI() && SYSTEM_EXIT_FORCED) {
             log.info("Forced JVM shutdown requested at end of test");
             System.exit(0);

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/functions/gui/FunctionHelper.java Sat Jul  4 18:04:12 2015
@@ -35,7 +35,6 @@ import javax.swing.JDialog;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JRootPane;
-import javax.swing.KeyStroke;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
@@ -69,31 +68,28 @@ public class FunctionHelper extends JDia
         init();
         JMeterUtils.addLocaleChangeListener(this);
     }
-    
+
     /**
      * Allow Dialog to be closed by ESC key
      */
     @Override
     protected JRootPane createRootPane() {
         JRootPane rootPane = new JRootPane();
-        KeyStroke stroke = KeyStrokes.ESC;
         javax.swing.Action escapeAction = new AbstractAction("ESCAPE") { 
-            /**
-             * 
-             */
+
             private static final long serialVersionUID = -4036804004190858925L;
 
             @Override
-            public void actionPerformed(ActionEvent actionEvent) { 
+            public void actionPerformed(ActionEvent actionEvent) {
                 setVisible(false);
             } 
         };
         rootPane.getActionMap().put(escapeAction.getValue(Action.NAME), escapeAction);
         InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
-        inputMap.put(stroke, escapeAction.getValue(Action.NAME));
+        inputMap.put(KeyStrokes.ESC, escapeAction.getValue(Action.NAME));
         return rootPane;
     }
-    
+
     private void init() {
         parameterPanel = new ArgumentsPanel(JMeterUtils.getResString("function_params"), false); //$NON-NLS-1$
         initializeFunctionList();
@@ -112,7 +108,7 @@ public class FunctionHelper extends JDia
         generateButton.addActionListener(this);
         resultsPanel.add(generateButton);
         this.getContentPane().add(resultsPanel, BorderLayout.SOUTH);
-        
+
         this.pack();
         ComponentUtil.centerComponentInWindow(this);
     }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/GuiPackage.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/GuiPackage.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/GuiPackage.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/GuiPackage.java Sat Jul  4 18:04:12 2015
@@ -351,13 +351,7 @@ public final class GuiPackage implements
                     "Missing jar? See log file." ,
                     JOptionPane.ERROR_MESSAGE);
             throw new RuntimeException(e.toString(), e); // Probably a missing jar
-        } catch (ClassNotFoundException e) {
-            log.error("Problem retrieving gui for " + objClass, e);
-            throw new RuntimeException(e.toString(), e); // Programming error: bail out.
-        } catch (InstantiationException e) {
-            log.error("Problem retrieving gui for " + objClass, e);
-            throw new RuntimeException(e.toString(), e); // Programming error: bail out.
-        } catch (IllegalAccessException e) {
+        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
             log.error("Problem retrieving gui for " + objClass, e);
             throw new RuntimeException(e.toString(), e); // Programming error: bail out.
         }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/LoggerPanel.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/LoggerPanel.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/LoggerPanel.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/LoggerPanel.java Sat Jul  4 18:04:12 2015
@@ -23,6 +23,7 @@ import java.awt.Insets;
 
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
 import javax.swing.ScrollPaneConstants;
 import javax.swing.SwingUtilities;
 
@@ -42,7 +43,7 @@ public class LoggerPanel extends JPanel
 
     private static final long serialVersionUID = 6911128494402594429L;
 
-    private JSyntaxTextArea textArea;
+    private final JTextArea textArea;
 
     private final PatternFormatter format;
 
@@ -50,8 +51,6 @@ public class LoggerPanel extends JPanel
     private static final int LOGGER_PANEL_MAX_LENGTH =
             JMeterUtils.getPropDefault("jmeter.loggerpanel.maxlength", 80000); // $NON-NLS-1$
     
-    private static final int LOGGER_PANEL_MAX_LINES_COUNT = LOGGER_PANEL_MAX_LENGTH / 80; // $NON-NLS-1$
-    
     // Make panel handle event even if closed
     private static final boolean LOGGER_PANEL_RECEIVE_WHEN_CLOSED =
             JMeterUtils.getPropDefault("jmeter.loggerpanel.enable_when_closed", true); // $NON-NLS-1$
@@ -60,27 +59,37 @@ public class LoggerPanel extends JPanel
      * Pane for display JMeter log file
      */
     public LoggerPanel() {
-        init();
+        textArea = init();
         format = new PatternFormatter(LoggingManager.DEFAULT_PATTERN + "\n"); // $NON-NLS-1$
     }
 
-    private void init() {
+    private JTextArea init() {
         this.setLayout(new BorderLayout());
+        final JScrollPane areaScrollPane;
+        final JTextArea jTextArea;
 
-        // TEXTAREA
-        textArea = new JSyntaxTextArea(15, 80, true);
-        textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE);
-        textArea.setCodeFoldingEnabled(false);
-        textArea.setAntiAliasingEnabled(false);
-        textArea.setEditable(false);
-        textArea.setLineWrap(false);
-        textArea.setLanguage("text");
-        textArea.setMargin(new Insets(2, 2, 2, 2)); // space between borders and text
-        JScrollPane areaScrollPane = new JTextScrollPane(textArea);
+        if (JMeterUtils.getPropDefault("loggerpanel.usejsyntaxtext", true)) {
+            // JSyntax Text Area
+            JSyntaxTextArea jSyntaxTextArea = new JSyntaxTextArea(15, 80, true);
+            jSyntaxTextArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE);
+            jSyntaxTextArea.setCodeFoldingEnabled(false);
+            jSyntaxTextArea.setAntiAliasingEnabled(false);
+            jSyntaxTextArea.setEditable(false);
+            jSyntaxTextArea.setLineWrap(false);
+            jSyntaxTextArea.setLanguage("text");
+            jSyntaxTextArea.setMargin(new Insets(2, 2, 2, 2)); // space between borders and text
+            areaScrollPane = new JTextScrollPane(jSyntaxTextArea);
+            jTextArea = jSyntaxTextArea;
+        } else {
+            // Plain text area
+            jTextArea =  new JTextArea(15, 80);
+            areaScrollPane = new JScrollPane(jTextArea);
+        }
 
         areaScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
         areaScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        this.add(areaScrollPane, BorderLayout.CENTER); 
+        this.add(areaScrollPane, BorderLayout.CENTER);
+        return jTextArea;
     }
 
     /* (non-Javadoc)

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/MainFrame.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/MainFrame.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/MainFrame.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/MainFrame.java Sat Jul  4 18:04:12 2015
@@ -47,11 +47,14 @@ import java.util.List;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import javax.swing.AbstractAction;
+import javax.swing.Action;
 import javax.swing.BorderFactory;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.DropMode;
 import javax.swing.ImageIcon;
+import javax.swing.InputMap;
 import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDialog;
@@ -63,6 +66,7 @@ import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.JSplitPane;
 import javax.swing.JTree;
+import javax.swing.KeyStroke;
 import javax.swing.MenuElement;
 import javax.swing.SwingUtilities;
 import javax.swing.tree.DefaultMutableTreeNode;
@@ -74,15 +78,19 @@ import javax.swing.tree.TreePath;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jmeter.gui.action.ActionNames;
 import org.apache.jmeter.gui.action.ActionRouter;
+import org.apache.jmeter.gui.action.KeyStrokes;
 import org.apache.jmeter.gui.action.LoadDraggedFile;
 import org.apache.jmeter.gui.tree.JMeterCellRenderer;
 import org.apache.jmeter.gui.tree.JMeterTreeListener;
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
 import org.apache.jmeter.gui.tree.JMeterTreeTransferHandler;
 import org.apache.jmeter.gui.util.EscapeDialog;
 import org.apache.jmeter.gui.util.JMeterMenuBar;
 import org.apache.jmeter.gui.util.JMeterToolBar;
+import org.apache.jmeter.gui.util.MenuFactory;
 import org.apache.jmeter.samplers.Clearable;
 import org.apache.jmeter.samplers.Remoteable;
+import org.apache.jmeter.save.SaveService;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestStateListener;
 import org.apache.jmeter.threads.JMeterContextService;
@@ -196,6 +204,7 @@ public class MainFrame extends JFrame im
 
         totalThreads = new JLabel("0"); // $NON-NLS-1$
         totalThreads.setToolTipText(JMeterUtils.getResString("total_threads_tooltip")); // $NON-NLS-1$
+
         activeThreads = new JLabel("0"); // $NON-NLS-1$
         activeThreads.setToolTipText(JMeterUtils.getResString("active_threads_tooltip")); // $NON-NLS-1$
 
@@ -206,9 +215,9 @@ public class MainFrame extends JFrame im
         warnIndicator.setContentAreaFilled(false);
         warnIndicator.setBorderPainted(false);
         warnIndicator.setCursor(new Cursor(Cursor.HAND_CURSOR));
-        
         warnIndicator.setToolTipText(JMeterUtils.getResString("error_indicator_tooltip")); // $NON-NLS-1$
         warnIndicator.addActionListener(this);
+
         errorsOrFatalsLabel = new JLabel("0"); // $NON-NLS-1$
         errorsOrFatalsLabel.setToolTipText(JMeterUtils.getResString("error_indicator_tooltip")); // $NON-NLS-1$
 
@@ -320,8 +329,8 @@ public class MainFrame extends JFrame im
         if (menuBar.isSelected()) {
             MenuElement[] menuElement = menuBar.getSubElements();
             if (menuElement != null) {
-                for (int i = 0; i < menuElement.length; i++) {
-                    JMenu menu = (JMenu) menuElement[i];
+                for (MenuElement element : menuElement) {
+                    JMenu menu = (JMenu) element;
                     if (menu.isSelected()) {
                         menu.setPopupMenuVisible(false);
                         menu.setSelected(false);
@@ -345,7 +354,7 @@ public class MainFrame extends JFrame im
         }
         stoppingMessage = new EscapeDialog(this, JMeterUtils.getResString("stopping_test_title"), true); //$NON-NLS-1$
         String label = JMeterUtils.getResString("stopping_test"); //$NON-NLS-1
-        if(!StringUtils.isEmpty(host)) {
+        if (!StringUtils.isEmpty(host)) {
             label = label + JMeterUtils.getResString("stopping_test_host")+ ": " + host;
         }
         JLabel stopLabel = new JLabel(label); //$NON-NLS-1$$NON-NLS-2$
@@ -356,7 +365,7 @@ public class MainFrame extends JFrame im
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
-                if (stoppingMessage != null) {// TODO - how can this be null?
+                if (stoppingMessage != null) { // TODO - how can this be null?
                     stoppingMessage.setVisible(true);
                 }
             }
@@ -409,7 +418,7 @@ public class MainFrame extends JFrame im
         activeThreads.setText("0"); // $NON-NLS-1$
         totalThreads.setText("0"); // $NON-NLS-1$
         menuBar.setRunning(true, host);
-        if(LOCAL.equals(host)) {
+        if (LOCAL.equals(host)) {
             toolbar.setLocalTestStarted(true);
         } else {
             toolbar.setRemoteTestStarted(true);
@@ -442,7 +451,7 @@ public class MainFrame extends JFrame im
             JMeterContextService.endTest();
         }
         menuBar.setRunning(false, host);
-        if(LOCAL.equals(host)) {
+        if (LOCAL.equals(host)) {
             toolbar.setLocalTestStarted(false);
         } else {
             toolbar.setRemoteTestStarted(false);
@@ -640,15 +649,63 @@ public class MainFrame extends JFrame im
         treevar.addTreeSelectionListener(treeListener);
         treevar.addMouseListener(treeListener);
         treevar.addKeyListener(treeListener);
-        
+
         // enable drag&drop, install a custom transfer handler
         treevar.setDragEnabled(true);
         treevar.setDropMode(DropMode.ON_OR_INSERT);
         treevar.setTransferHandler(new JMeterTreeTransferHandler());
 
+        addQuickComponentHotkeys(treevar);
+
         return treevar;
     }
 
+    private void addQuickComponentHotkeys(JTree treevar) {
+        Action quickComponent = new AbstractAction("Quick Component") {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                String propname = "gui.quick_" + actionEvent.getActionCommand();
+                String comp = JMeterUtils.getProperty(propname);
+                log.debug("Event " + propname + ": " + comp);
+
+                if (comp == null) {
+                    log.warn("No component set through property: " + propname);
+                    return;
+                }
+
+                GuiPackage guiPackage = GuiPackage.getInstance();
+                try {
+                    guiPackage.updateCurrentNode();
+                    TestElement testElement = guiPackage.createTestElement(SaveService.aliasToClass(comp));
+                    JMeterTreeNode parentNode = guiPackage.getCurrentNode();
+                    while (!MenuFactory.canAddTo(parentNode, testElement)) {
+                        parentNode = (JMeterTreeNode) parentNode.getParent();
+                    }
+                    if (parentNode.getParent() == null) {
+                        log.debug("Cannot add element on very top level");
+                    } else {
+                        JMeterTreeNode node = guiPackage.getTreeModel().addComponent(testElement, parentNode);
+                        guiPackage.getMainFrame().getTree().setSelectionPath(new TreePath(node.getPath()));
+                    }
+                } catch (Exception err) {
+                    log.warn("Failed to perform quick component add: " + comp, err); // $NON-NLS-1$
+                }
+            }
+        };
+
+        InputMap inputMap = treevar.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+        KeyStroke[] keyStrokes = new KeyStroke[]{KeyStrokes.CTRL_0,
+                KeyStrokes.CTRL_1, KeyStrokes.CTRL_2, KeyStrokes.CTRL_3,
+                KeyStrokes.CTRL_4, KeyStrokes.CTRL_5, KeyStrokes.CTRL_6,
+                KeyStrokes.CTRL_7, KeyStrokes.CTRL_8, KeyStrokes.CTRL_9,};
+        for (int n = 0; n < keyStrokes.length; n++) {
+            treevar.getActionMap().put(ActionNames.QUICK_COMPONENT + String.valueOf(n), quickComponent);
+            inputMap.put(keyStrokes[n], ActionNames.QUICK_COMPONENT + String.valueOf(n));
+        }
+    }
+
     /**
      * Create the tree cell renderer used to draw the nodes in the test tree.
      *
@@ -701,9 +758,9 @@ public class MainFrame extends JFrame im
         try {
             Transferable tr = dtde.getTransferable();
             DataFlavor[] flavors = tr.getTransferDataFlavors();
-            for (int i = 0; i < flavors.length; i++) {
+            for (DataFlavor flavor : flavors) {
                 // Check for file lists specifically
-                if (flavors[i].isFlavorJavaFileListType()) {
+                if (flavor.isFlavorJavaFileListType()) {
                     dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                     try {
                         openJmxFilesFromDragAndDrop(tr);
@@ -713,9 +770,7 @@ public class MainFrame extends JFrame im
                     return;
                 }
             }
-        } catch (UnsupportedFlavorException e) {
-            log.warn("Dnd failed" , e);
-        } catch (IOException e) {
+        } catch (UnsupportedFlavorException | IOException e) {
             log.warn("Dnd failed" , e);
         }
 
@@ -725,18 +780,18 @@ public class MainFrame extends JFrame im
         @SuppressWarnings("unchecked")
         List<File> files = (List<File>)
                 tr.getTransferData(DataFlavor.javaFileListFlavor);
-        if(files.isEmpty()) {
+        if (files.isEmpty()) {
             return false;
         }
         File file = files.get(0);
-        if(!file.getName().endsWith(".jmx")) {
+        if (!file.getName().endsWith(".jmx")) {
             log.warn("Importing file:" + file.getName()+ "from DnD failed because file extension does not end with .jmx");
             return false;
         }
 
         ActionEvent fakeEvent = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, ActionNames.OPEN);
         LoadDraggedFile.loadProject(fakeEvent, file);
-        
+
         return true;
     }
 
@@ -781,7 +836,7 @@ public class MainFrame extends JFrame im
     @Override
     public void clearData() {
         logPanel.clear();
-        if(DISPLAY_ERROR_FATAL_COUNTER) {
+        if (DISPLAY_ERROR_FATAL_COUNTER) {
             errorsAndFatalsCounterLogTarget.clearData();
         }
     }
@@ -791,7 +846,7 @@ public class MainFrame extends JFrame im
      */
     @Override
     public void actionPerformed(ActionEvent event) {
-        if(event.getSource()==warnIndicator) {
+        if (event.getSource() == warnIndicator) {
             ActionRouter.getInstance().doActionNow(new ActionEvent(event.getSource(), event.getID(), ActionNames.LOGGER_PANEL_ENABLE_DISABLE));
         }
     }
@@ -806,10 +861,8 @@ public class MainFrame extends JFrame im
                 final Field awtAppClassName = xtoolkit.getDeclaredField("awtAppClassName"); // $NON-NLS-1$
                 awtAppClassName.setAccessible(true);
                 awtAppClassName.set(null, DEFAULT_APP_NAME);
-            } catch (NoSuchFieldException nsfe) {
+            } catch (NoSuchFieldException | IllegalAccessException nsfe) {
                 log.warn("Error awt title: " + nsfe); // $NON-NLS-1$
-            } catch (IllegalAccessException iae) {
-                log.warn("Error awt title: " + iae); // $NON-NLS-1$
             }
        }
     }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/SavePropertyDialog.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/SavePropertyDialog.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/SavePropertyDialog.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/SavePropertyDialog.java Sat Jul  4 18:04:12 2015
@@ -114,9 +114,7 @@ public class SavePropertyDialog extends
                     if (!functors.containsKey(actionCommand)) {
                         functors.put(actionCommand, new Functor(actionCommand));
                     }
-                } catch (IllegalAccessException e) {
-                    log.warn("Problem creating save config dialog", e);
-                } catch (InvocationTargetException e) {
+                } catch (IllegalAccessException | InvocationTargetException e) {
                     log.warn("Problem creating save config dialog", e);
                 }
             }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/ActionNames.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/ActionNames.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/ActionNames.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/ActionNames.java Sat Jul  4 18:04:12 2015
@@ -97,6 +97,7 @@ public final class ActionNames {
     public static final String MOVE_RIGHT       = "move_right"; // $NON-NLS-1$
     public static final String UNDO             = "undo"; // $NON-NLS-1$
     public static final String REDO             = "redo"; // $NON-NLS-1$
+    public static final String QUICK_COMPONENT  = "quick_component"; // $NON-NLS-1$
 
     // Prevent instantiation
     private ActionNames(){

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/AddToTree.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/AddToTree.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/AddToTree.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/AddToTree.java Sat Jul  4 18:04:12 2015
@@ -45,7 +45,6 @@ public class AddToTree implements Comman
         commandSet = Collections.unmodifiableSet(commands);
     }
 
-
     public AddToTree() {
     }
 
@@ -76,7 +75,7 @@ public class AddToTree implements Comman
             log.error("", err); // $NON-NLS-1$
             String msg = err.getMessage();
             if (msg == null) {
-                msg=err.toString();
+                msg = err.toString();
             }
             JMeterUtils.reportErrorToUser(msg);
         }
@@ -84,7 +83,7 @@ public class AddToTree implements Comman
             log.error("", err); // $NON-NLS-1$
             String msg = err.getMessage();
             if (msg == null) {
-                msg=err.toString();
+                msg = err.toString();
             }
             JMeterUtils.reportErrorToUser(msg);
         }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/KeyStrokes.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/KeyStrokes.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/KeyStrokes.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/KeyStrokes.java Sat Jul  4 18:04:12 2015
@@ -74,6 +74,18 @@ public final class KeyStrokes {
     public static final KeyStroke ALT_DOWN_ARROW    = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.ALT_DOWN_MASK);
     public static final KeyStroke ALT_LEFT_ARROW    = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.ALT_DOWN_MASK);
     public static final KeyStroke ALT_RIGHT_ARROW   = KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.ALT_DOWN_MASK);
+    
+    // component hotkeys
+    public static final KeyStroke CTRL_0   = KeyStroke.getKeyStroke(KeyEvent.VK_0, CONTROL_MASK);
+    public static final KeyStroke CTRL_1   = KeyStroke.getKeyStroke(KeyEvent.VK_1, CONTROL_MASK);
+    public static final KeyStroke CTRL_2   = KeyStroke.getKeyStroke(KeyEvent.VK_2, CONTROL_MASK);
+    public static final KeyStroke CTRL_3   = KeyStroke.getKeyStroke(KeyEvent.VK_3, CONTROL_MASK);
+    public static final KeyStroke CTRL_4   = KeyStroke.getKeyStroke(KeyEvent.VK_4, CONTROL_MASK);
+    public static final KeyStroke CTRL_5   = KeyStroke.getKeyStroke(KeyEvent.VK_5, CONTROL_MASK);
+    public static final KeyStroke CTRL_6   = KeyStroke.getKeyStroke(KeyEvent.VK_6, CONTROL_MASK);
+    public static final KeyStroke CTRL_7   = KeyStroke.getKeyStroke(KeyEvent.VK_7, CONTROL_MASK);
+    public static final KeyStroke CTRL_8   = KeyStroke.getKeyStroke(KeyEvent.VK_8, CONTROL_MASK);
+    public static final KeyStroke CTRL_9   = KeyStroke.getKeyStroke(KeyEvent.VK_9, CONTROL_MASK);
 
     /**
      * Check if an event matches the KeyStroke definition.

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/Load.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/Load.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/Load.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/Load.java Sat Jul  4 18:04:12 2015
@@ -20,9 +20,7 @@ package org.apache.jmeter.gui.action;
 
 import java.awt.event.ActionEvent;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -44,7 +42,6 @@ import org.apache.jmeter.testelement.Wor
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
 import org.apache.jorphan.logging.LoggingManager;
-import org.apache.jorphan.util.JOrphanUtils;
 import org.apache.log.Logger;
 
 import com.thoughtworks.xstream.converters.ConversionException;
@@ -81,10 +78,10 @@ public class Load implements Command {
             return;
         }
         final File selectedFile = chooser.getSelectedFile();
-        if(selectedFile != null) {
+        if (selectedFile != null) {
             final boolean merging = e.getActionCommand().equals(ActionNames.MERGE);
             // We must ask the user if it is ok to close current project
-            if(!merging) { // i.e. it is OPEN
+            if (!merging) { // i.e. it is OPEN
                 if (!Close.performAction(e)) {
                     return;
                 }
@@ -119,27 +116,26 @@ public class Load implements Command {
 
         final GuiPackage guiPackage = GuiPackage.getInstance();
         if (f != null) {
-            InputStream reader = null;
             try {
-                    if (merging) {
-                        log.info("Merging file: " + f);
-                    } else {
-                        log.info("Loading file: " + f);
-                        // TODO should this be done even if not a full test plan?
-                        // and what if load fails?
-                        if(setDetails) {
-                            FileServer.getFileServer().setBaseForScript(f);
-                        }
-                    }
-                    reader = new FileInputStream(f);
-                    final HashTree tree = SaveService.loadTree(reader);
-                    final boolean isTestPlan = insertLoadedTree(e.getID(), tree, merging);
-    
-                    // don't change name if merging
-                    if (!merging && isTestPlan && setDetails) {
-                        // TODO should setBaseForScript be called here rather than above?
-                        guiPackage.setTestPlanFile(f.getAbsolutePath());
+                if (merging) {
+                    log.info("Merging file: " + f);
+                } else {
+                    log.info("Loading file: " + f);
+                    // TODO should this be done even if not a full test plan?
+                    // and what if load fails?
+                    if (setDetails) {
+                        FileServer.getFileServer().setBaseForScript(f);
                     }
+                }
+                final HashTree tree = SaveService.loadTree(f);
+                final boolean isTestPlan = insertLoadedTree(e.getID(), tree, merging);
+
+                // don't change name if merging
+                if (!merging && isTestPlan && setDetails) {
+                    // TODO should setBaseForScript be called here rather than
+                    // above?
+                    guiPackage.setTestPlanFile(f.getAbsolutePath());
+                }
             } catch (NoClassDefFoundError ex) {// Allow for missing optional jars
                 reportError("Missing jar file", ex, true);
             } catch (ConversionException ex) {
@@ -149,8 +145,6 @@ public class Load implements Command {
                 reportError("Error reading file: ", ex, false);
             } catch (Exception ex) {
                 reportError("Unexpected error", ex, true);
-            } finally {
-                JOrphanUtils.closeQuietly(reader);
             }
             FileDialoger.setLastJFCDirectory(f.getParentFile().getAbsolutePath());
             guiPackage.updateCurrentGui();
@@ -204,7 +198,7 @@ public class Load implements Command {
         // Send different event wether we are merging a test plan into another test plan,
         // or loading a testplan from scratch
         ActionEvent actionEvent =
-            new ActionEvent(subTree.get(subTree.getArray()[subTree.size() - 1]), id, 
+            new ActionEvent(subTree.get(subTree.getArray()[subTree.size() - 1]), id,
                     merging ? ActionNames.SUB_TREE_MERGED : ActionNames.SUB_TREE_LOADED);
 
         ActionRouter.getInstance().actionPerformed(actionEvent);

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/LookAndFeelCommand.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/LookAndFeelCommand.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/LookAndFeelCommand.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/LookAndFeelCommand.java Sat Jul  4 18:04:12 2015
@@ -139,13 +139,7 @@ public class LookAndFeelCommand implemen
                 }
             }
             PREFS.put(USER_PREFS_KEY, className);
-        } catch (javax.swing.UnsupportedLookAndFeelException e) {
-            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
-        } catch (InstantiationException e) {
-            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
-        } catch (ClassNotFoundException e) {
-            JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
-        } catch (IllegalAccessException e) {
+        } catch (javax.swing.UnsupportedLookAndFeelException | InstantiationException | ClassNotFoundException | IllegalAccessException e) {
             JMeterUtils.reportErrorToUser("Look and Feel unavailable:" + e.toString());
         }
     }

Modified: jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/RemoteStart.java
URL: http://svn.apache.org/viewvc/jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/RemoteStart.java?rev=1689187&r1=1689186&r2=1689187&view=diff
==============================================================================
--- jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/RemoteStart.java (original)
+++ jmeter/branches/HC4/src/core/org/apache/jmeter/gui/action/RemoteStart.java Sat Jul  4 18:04:12 2015
@@ -20,26 +20,21 @@ package org.apache.jmeter.gui.action;
 
 import java.awt.Component;
 import java.awt.event.ActionEvent;
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.HashSet;
-import java.util.Map;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Set;
-
+import java.util.StringTokenizer;
 import org.apache.jmeter.JMeter;
-import org.apache.jmeter.engine.ClientJMeterEngine;
-import org.apache.jmeter.engine.JMeterEngine;
-import org.apache.jmeter.engine.JMeterEngineException;
+import org.apache.jmeter.engine.DistributedRunner;
 import org.apache.jmeter.gui.GuiPackage;
 import org.apache.jmeter.threads.RemoteThreadsListenerTestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
-import org.apache.jorphan.logging.LoggingManager;
-import org.apache.log.Logger;
 
 public class RemoteStart extends AbstractAction {
 
-    private static final Logger log = LoggingManager.getLoggerForClass();
-
     private static final String LOCAL_HOST = "127.0.0.1"; // $NON-NLS-1$
 
     private static final String REMOTE_HOSTS = "remote_hosts"; // $NON-NLS-1$ jmeter.properties
@@ -59,7 +54,7 @@ public class RemoteStart extends Abstrac
         commands.add(ActionNames.REMOTE_EXIT_ALL);
     }
 
-    private final Map<String, JMeterEngine> remoteEngines = new HashMap<String, JMeterEngine>();
+    private DistributedRunner distributedRunner = new DistributedRunner();
 
     public RemoteStart() {
     }
@@ -72,123 +67,37 @@ public class RemoteStart extends Abstrac
         }
         String action = e.getActionCommand();
         if (action.equals(ActionNames.REMOTE_STOP)) {
-            doRemoteStop(name, true);
+            GuiPackage.getInstance().getMainFrame().showStoppingMessage(name);
+            distributedRunner.stop(Arrays.asList(name));
         } else if (action.equals(ActionNames.REMOTE_SHUT)) {
-            doRemoteStop(name, false);
+            GuiPackage.getInstance().getMainFrame().showStoppingMessage(name);
+            distributedRunner.shutdown(Arrays.asList(name));
         } else if (action.equals(ActionNames.REMOTE_START)) {
             popupShouldSave(e);
-            doRemoteInit(name);
-            doRemoteStart(name);
+            distributedRunner.init(Arrays.asList(name), getTestTree());
+            distributedRunner.start(Arrays.asList(name));
         } else if (action.equals(ActionNames.REMOTE_START_ALL)) {
             popupShouldSave(e);
-            String remote_hosts_string = JMeterUtils.getPropDefault(REMOTE_HOSTS, LOCAL_HOST);
-            java.util.StringTokenizer st = new java.util.StringTokenizer(remote_hosts_string, REMOTE_HOSTS_SEPARATOR);
-            while (st.hasMoreElements()) {
-                String el = (String) st.nextElement();
-                doRemoteInit(el.trim());
-            }
-            st = new java.util.StringTokenizer(remote_hosts_string, REMOTE_HOSTS_SEPARATOR);
-            while (st.hasMoreElements()) {
-                String el = (String) st.nextElement();
-                doRemoteStart(el.trim());
-            }
+            distributedRunner.init(getRemoteHosts(), getTestTree());
+            distributedRunner.start();
         } else if (action.equals(ActionNames.REMOTE_STOP_ALL)) {
-            doRemoteStopAll(true);
+            distributedRunner.stop(getRemoteHosts());
         } else if (action.equals(ActionNames.REMOTE_SHUT_ALL)) {
-            doRemoteStopAll(false);
+            distributedRunner.shutdown(getRemoteHosts());
         } else if (action.equals(ActionNames.REMOTE_EXIT)) {
-            doRemoteExit(name);
+            distributedRunner.exit(Arrays.asList(name));
         } else if (action.equals(ActionNames.REMOTE_EXIT_ALL)) {
-            String remote_hosts_string = JMeterUtils.getPropDefault(REMOTE_HOSTS, LOCAL_HOST);
-            java.util.StringTokenizer st = new java.util.StringTokenizer(remote_hosts_string, REMOTE_HOSTS_SEPARATOR);
-            while (st.hasMoreElements()) {
-                String el = (String) st.nextElement();
-                doRemoteExit(el.trim());
-            }
+            distributedRunner.exit(getRemoteHosts());
         }
     }
 
-    private void doRemoteStopAll(boolean now) {
+    private List<String> getRemoteHosts() {
         String remote_hosts_string = JMeterUtils.getPropDefault(REMOTE_HOSTS, LOCAL_HOST);
-        java.util.StringTokenizer st = new java.util.StringTokenizer(remote_hosts_string, REMOTE_HOSTS_SEPARATOR);
-        while (st.hasMoreElements()) {
-            String el = (String) st.nextElement();
-            doRemoteStop(el.trim(), now);
-        }
-    }
-
-    /**
-     * Stops a remote testing engine
-     *
-     * @param name
-     *            the DNS name or IP address of the remote testing engine
-     *
-     */
-    private void doRemoteStop(String name, boolean now) {
-        GuiPackage.getInstance().getMainFrame().showStoppingMessage(name);
-        JMeterEngine engine = remoteEngines.get(name);
-        // Engine may be null if it has not correctly started
-        if(engine != null) {
-            engine.stopTest(now);
-        }
-    }
-
-    /**
-     * Exits a remote testing engine
-     *
-     * @param name
-     *            the DNS name or IP address of the remote testing engine
-     *
-     */
-    private void doRemoteExit(String name) {
-        JMeterEngine engine = remoteEngines.get(name);
-        if (engine == null) {
-            return;
-        }
-        // GuiPackage.getInstance().getMainFrame().showStoppingMessage(name);
-        engine.exit();
-    }
-
-    /**
-     * Starts a remote testing engine
-     *
-     * @param name
-     *            the DNS name or IP address of the remote testing engine
-     *
-     */
-    private void doRemoteStart(String name) {
-        JMeterEngine engine = remoteEngines.get(name);
-        if (engine != null) {
-            try {
-                engine.runTest();
-            } catch (IllegalStateException e) {
-                JMeterUtils.reportErrorToUser(e.getMessage(),JMeterUtils.getResString("remote_error_starting")); // $NON-NLS-1$
-            } catch (JMeterEngineException e) {
-                JMeterUtils.reportErrorToUser(e.getMessage(),JMeterUtils.getResString("remote_error_starting")); // $NON-NLS-1$
-            }
-        }
-    }
-
-    /**
-     * Initializes remote engines
-     */
-    private void doRemoteInit(String name) {
-        JMeterEngine engine = remoteEngines.get(name);
-        if (engine == null) {
-            try {
-                log.info("Initialising remote engine: "+name);
-                engine = new ClientJMeterEngine(name);
-                remoteEngines.put(name, engine);
-            } catch (Exception ex) {
-                log.error("Failed to initialise remote engine", ex);
-                JMeterUtils.reportErrorToUser(ex.getMessage(),
-                        JMeterUtils.getResString("remote_error_init") + ": " + name); // $NON-NLS-1$ $NON-NLS-2$
-                return;
-            }
-        } else {
-            engine.reset();
-        }
-        initEngine(engine);
+        StringTokenizer st = new StringTokenizer(remote_hosts_string, REMOTE_HOSTS_SEPARATOR);
+        List<String> list = new LinkedList<String>();
+        while (st.hasMoreElements())
+            list.add((String) st.nextElement());
+        return list;
     }
 
     @Override
@@ -196,19 +105,13 @@ public class RemoteStart extends Abstrac
         return commands;
     }
 
-    /**
-     * Initializes test on engine.
-     *
-     * @param engine
-     *            remote engine object
-     */
-    private void initEngine(JMeterEngine engine) {
+    private HashTree getTestTree() {
         GuiPackage gui = GuiPackage.getInstance();
         HashTree testTree = gui.getTreeModel().getTestPlan();
         JMeter.convertSubTree(testTree);
         testTree.add(testTree.getArray()[0], gui.getMainFrame());
         // Used for remote notification of threads start/stop,see BUG 54152
         testTree.add(testTree.getArray()[0], new RemoteThreadsListenerTestElement());
-        engine.configure(testTree);
+        return testTree;
     }
 }