You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2019/09/28 10:18:41 UTC

[jmeter] 04/04: Simplify method by extracting parts of code

This is an automated email from the ASF dual-hosted git repository.

fschumacher pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git

commit 598eb15b8ccb8ea0b1c9416367572884724cc969
Author: Felix Schumacher <fe...@internetallee.de>
AuthorDate: Sat Sep 28 12:17:56 2019 +0200

    Simplify method by extracting parts of code
---
 .../extractor/json/jmespath/JMESPathExtractor.java | 122 ++++++++++++---------
 1 file changed, 70 insertions(+), 52 deletions(-)

diff --git a/src/components/src/main/java/org/apache/jmeter/extractor/json/jmespath/JMESPathExtractor.java b/src/components/src/main/java/org/apache/jmeter/extractor/json/jmespath/JMESPathExtractor.java
index bdaa43c..5c411c6 100644
--- a/src/components/src/main/java/org/apache/jmeter/extractor/json/jmespath/JMESPathExtractor.java
+++ b/src/components/src/main/java/org/apache/jmeter/extractor/json/jmespath/JMESPathExtractor.java
@@ -68,69 +68,87 @@ public class JMESPathExtractor extends AbstractScopedTestElement
         final String jsonPathExpression = getJmesPathExpression().trim();
         clearOldRefVars(vars, refName);
         if (StringUtils.isEmpty(jsonResponse)) {
+            handleEmptyResponse(vars, refName, defaultValue);
+            return;
+        }
+
+        try {
+            JsonNode result = null;
+            JsonNode actualObj = OBJECT_MAPPER.readValue(jsonResponse, JsonNode.class);
+            result = JMESPathCache.getInstance().get(jsonPathExpression).search(actualObj);
+            if (result.isNull()) {
+                handleNullResult(vars, refName, defaultValue, matchNumber);
+                return;
+            }
+            List<String> resultList = splitJson(result);
+            // if more than one value extracted, suffix with "_index"
+            if (!resultList.isEmpty()) {
+                handleListResult(vars, refName, defaultValue, matchNumber, resultList);
+            } else {
+                // else just one value extracted
+                handleSingleResult(vars, refName, matchNumber, resultList);
+            }
+            vars.put(refName + REF_MATCH_NR, Integer.toString(resultList.size()));
+        } catch (Exception e) {
+            // if something wrong, default value added
             if (log.isDebugEnabled()) {
-                log.debug("Response or source variable is null or empty for {}", getName());
+                log.debug("Error processing JSON content in {}, message: {}", getName(), e.getLocalizedMessage(), e);
+            } else {
+                log.debug("Error processing JSON content in {}, message: {}", getName(), e.getLocalizedMessage());
             }
             vars.put(refName, defaultValue);
+        }
+    }
+
+    private void handleSingleResult(JMeterVariables vars, String refName, int matchNumber, List<String> resultList) {
+        String suffix = (matchNumber < 0) ? "_1" : "";
+        placeObjectIntoVars(vars, refName + suffix, resultList, 0);
+    }
+
+    private void handleListResult(JMeterVariables vars, String refName, String defaultValue, int matchNumber,
+            List<String> resultList) {
+        if (matchNumber < 0) {
+            // Extract all
+            int index = 1;
+            for (String extractedString : resultList) {
+                vars.put(refName + "_" + index, extractedString); // $NON-NLS-1$
+                index++;
+            }
+        } else if (matchNumber == 0) {
+            // Random extraction
+            int matchSize = resultList.size();
+            int matchNr = JMeterUtils.getRandomInt(matchSize);
+            placeObjectIntoVars(vars, refName, resultList, matchNr);
         } else {
-            try {
-                JsonNode result = null;
-                JsonNode actualObj = OBJECT_MAPPER.readValue(jsonResponse, JsonNode.class);
-                result = JMESPathCache.getInstance().get(jsonPathExpression).search(actualObj);
-                if (result.isNull()) {
-                    vars.put(refName, defaultValue);
-                    vars.put(refName + REF_MATCH_NR, "0"); //$NON-NLS-1$
-                    if (matchNumber < 0) {
-                        log.debug("No value extracted, storing empty in: {}", refName);
-                    }
-                } else {
-                    List<String> resultList = splitJson(result);
-                    // if more than one value extracted, suffix with "_index"
-                    if (resultList.size() > 1) {
-                        if (matchNumber < 0) {
-                            // Extract all
-                            int index = 1;
-                            for (String extractedString : resultList) {
-                                vars.put(refName + "_" + index, extractedString); // $NON-NLS-1$
-                                index++;
-                            }
-                        } else if (matchNumber == 0) {
-                            // Random extraction
-                            int matchSize = resultList.size();
-                            int matchNr = JMeterUtils.getRandomInt(matchSize);
-                            placeObjectIntoVars(vars, refName, resultList, matchNr);
-                        } else {
-                            // extract at position
-                            if (matchNumber > resultList.size()) {
-                                if (log.isDebugEnabled()) {
-                                    log.debug(
-                                            "matchNumber({}) exceeds number of items found({}), default value will be used",
-                                            matchNumber, resultList.size());
-                                }
-                                vars.put(refName, defaultValue);
-                            } else {
-                                placeObjectIntoVars(vars, refName, resultList, matchNumber - 1);
-                            }
-                        }
-                    } else {
-                        // else just one value extracted
-                        String suffix = (matchNumber < 0) ? "_1" : "";
-                        placeObjectIntoVars(vars, refName + suffix, resultList, 0);
-                    }
-                    vars.put(refName + REF_MATCH_NR, Integer.toString(resultList.size()));
-                }
-            } catch (Exception e) {
-                // if something wrong, default value added
+            // extract at position
+            if (matchNumber > resultList.size()) {
                 if (log.isDebugEnabled()) {
-                    log.debug("Error processing JSON content in {}, message: {}", getName(), e.getLocalizedMessage(), e);
-                } else {
-                    log.debug("Error processing JSON content in {}, message: {}", getName(), e.getLocalizedMessage());
+                    log.debug(
+                            "matchNumber({}) exceeds number of items found({}), default value will be used",
+                            Integer.valueOf(matchNumber), Integer.valueOf(resultList.size()));
                 }
                 vars.put(refName, defaultValue);
+            } else {
+                placeObjectIntoVars(vars, refName, resultList, matchNumber - 1);
             }
         }
     }
 
+    private void handleNullResult(JMeterVariables vars, String refName, String defaultValue, int matchNumber) {
+        vars.put(refName, defaultValue);
+        vars.put(refName + REF_MATCH_NR, "0"); //$NON-NLS-1$
+        if (matchNumber < 0) {
+            log.debug("No value extracted, storing empty in: {}", refName);
+        }
+    }
+
+    private void handleEmptyResponse(JMeterVariables vars, String refName, String defaultValue) {
+        if (log.isDebugEnabled()) {
+            log.debug("Response or source variable is null or empty for {}", getName());
+        }
+        vars.put(refName, defaultValue);
+    }
+
     private String getData(JMeterVariables vars, JMeterContext context) {
         String jsonResponse = null;
         if (isScopeVariable()) {