You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2015/02/23 21:18:45 UTC

svn commit: r1661763 - /jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java

Author: pmouawad
Date: Mon Feb 23 20:18:45 2015
New Revision: 1661763

URL: http://svn.apache.org/r1661763
Log:
[Bug 57605] When there is an error loading Test Plan, SaveService.loadTree returns null leading to NPE in callers
Retain backward compatibility as per sebb note
Bugzilla Id: 57605

Modified:
    jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java

Modified: jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java?rev=1661763&r1=1661762&r2=1661763&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/save/SaveService.java Mon Feb 23 20:18:45 2015
@@ -508,6 +508,24 @@ public class SaveService {
     /**
      * Load a Test tree (JMX file)
      * @param file the JMX file
+     * @return the loaded tree or null if an error occurs
+     * @throws IOException if there is a problem reading the file or processing it
+     * @deprecated use {@link SaveService}{@link #loadTree(File)}
+     */
+    public static HashTree loadTree(InputStream reader) throws IOException {
+        try {
+            return readTree(reader, null);
+        } catch(IllegalArgumentException e) {
+            log.error("Problem loading XML, message:"+e.getMessage(), e);
+            return null;
+        } finally {
+            JOrphanUtils.closeQuietly(reader);
+        }
+    }
+    
+    /**
+     * Load a Test tree (JMX file)
+     * @param file the JMX file
      * @return the loaded tree
      * @throws IOException if there is a problem reading the file or processing it
      */
@@ -516,38 +534,62 @@ public class SaveService {
         InputStream reader = null;
         try {
             reader = new FileInputStream(file);
-            if (!reader.markSupported()) {
-                reader = new BufferedInputStream(reader);
+            return readTree(reader, file);
+        } finally {
+            JOrphanUtils.closeQuietly(reader);
+        }
+    }
+
+    /**
+     * 
+     * @param reader {@link InputStream} 
+     * @param file the JMX file used only for debug, can be null
+     * @return the loaded tree
+     * @throws IOException if there is a problem reading the file or processing it
+     */
+    private static final HashTree readTree(InputStream reader, File file) throws IOException {
+        if (!reader.markSupported()) {
+            reader = new BufferedInputStream(reader);
+        }
+        reader.mark(Integer.MAX_VALUE);
+        ScriptWrapper wrapper = null;
+        try {
+            // Get the InputReader to use
+            InputStreamReader inputStreamReader = getInputStreamReader(reader);
+            wrapper = (ScriptWrapper) JMXSAVER.fromXML(inputStreamReader);
+            inputStreamReader.close();
+            if (wrapper == null){
+                log.error("Problem loading XML: see above.");
+                return null;
             }
-            reader.mark(Integer.MAX_VALUE);
-            ScriptWrapper wrapper = null;
-            try {
-                // Get the InputReader to use
-                InputStreamReader inputStreamReader = getInputStreamReader(reader);
-                wrapper = (ScriptWrapper) JMXSAVER.fromXML(inputStreamReader);
-                inputStreamReader.close();
-                if (wrapper == null){
-                    log.error("Problem loading XML: see above.");
-                    return null;
-                }
-                return wrapper.testPlan;
-            } catch (CannotResolveClassException e) {
-                if (e.getMessage().startsWith("node")) {
-                    log.info("Problem loading XML, trying Avalon format");
-                    reader.reset();
-                    return OldSaveService.loadSubTree(reader);                
-                }
+            return wrapper.testPlan;
+        } catch (CannotResolveClassException e) {
+            // FIXME We switching to JAVA7, use Multi-Catch Exceptions
+            if (e.getMessage().startsWith("node")) {
+                log.info("Problem loading XML, trying Avalon format");
+                reader.reset();
+                return OldSaveService.loadSubTree(reader);                
+            }
+            if(file != null) {
                 throw new IllegalArgumentException("Problem loading XML from:'"+file.getAbsolutePath()+"', cannot determine class for element: " + e, e);
-            } catch (NoClassDefFoundError e) {
+            } else {
+                throw new IllegalArgumentException("Problem loading XML, cannot determine class for element: " + e, e);
+            }
+        } catch (NoClassDefFoundError e) {
+            if(file != null) {
                 throw new IllegalArgumentException("Problem loading XML from:'"+file.getAbsolutePath()+"', missing class "+e , e);
-            } catch (ConversionException e) {
+            } else {
+                throw new IllegalArgumentException("Problem loading XML, missing class "+e , e);
+            }
+        } catch (ConversionException e) {
+            if(file != null) {
                 throw new IllegalArgumentException("Problem loading XML from:'"+file.getAbsolutePath()+"', conversion error "+e , e);
+            } else {
+                throw new IllegalArgumentException("Problem loading XML, conversion error "+e , e);
             }
-        } finally {
-            JOrphanUtils.closeQuietly(reader);
         }
-    }
 
+    }
     private static InputStreamReader getInputStreamReader(InputStream inStream) {
         // Check if we have a encoding to use from properties
         Charset charset = getFileEncodingCharset();