openrewrite / rewrite

Automated mass refactoring of source code.
https://docs.openrewrite.org
Apache License 2.0
2.09k stars 312 forks source link

JavaTemplate Issue discovered with `src/main/java/org/apache/jmeter/reporters/Summariser.java` #2215

Closed pway99 closed 1 year ago

pway99 commented 1 year ago

Problem

image

Expected behavior

Describe what you expected to see.

Example diff

       private static final Map<String, Totals> ACCUMULATORS = new ConcurrentHashMap<>();

     //@GuardedBy("LOCK")
-    private static int INSTANCE_COUNT; // number of active tests
+    private static int instanceCount; // number of active tests

     /*
      * Cached copy of Totals for this instance.
        * However the contents do need to be synchronized.
      */
     //@GuardedBy("myTotals")
-    private transient Totals myTotals = null;
+    private transient Totals myTotals;

     // Name of the accumulator. Set up by testStarted().
     private transient String myName;
           super();
         synchronized (LOCK) {
             ACCUMULATORS.clear();
-            INSTANCE_COUNT=0;
+            instanceCount=0;
         }
     }
       private static class Totals {

         /** Time of last summary (to prevent double reporting) */
-        private long last = 0;
+        private long last;

         private final SummariserRunningSample delta = new SummariserRunningSample("DELTA");
                       .append(System.currentTimeMillis()).append("|")
                     .append(summariserRunningSample.getElapsed()).append("|")
                     .append(summariserRunningSample.getNumSamples()).append("|")
-                    .append(new BigDecimal(summariserRunningSample.getRate()).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue()).append("|")
+                    .append(/*~~(java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
+  java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
+  java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
+  java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
+  java.base/java.util.Objects.checkIndex(Objects.java:359)
+  java.base/java.util.ArrayList.get(ArrayList.java:427)
+  org.openrewrite.java.internal.template.JavaTemplateParser.compileTemplate(JavaTemplateParser.java:247)
+  org.openrewrite.java.internal.template.JavaTemplateParser.parseMethodArguments(JavaTemplateParser.java:197)
+  org.openrewrite.java.JavaTemplate$2.visitMethodInvocation(JavaTemplate.java:433)
+  ...)~~>*/new BigDecimal(summariserRunningSample.getRate()).setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue()).append("|")
                     .append(summariserRunningSample.getAverage()).append("|")
                     .append(summariserRunningSample.getMin()).append("|")
                     .append(summariserRunningSample.getMax()).append("|")
                   myTotals = new Totals();
                 ACCUMULATORS.put(myName, myTotals);
             }
-            INSTANCE_COUNT++;
+            instanceCount++;
         }
     }
       public void testEnded(String host) {
         Set<Entry<String, Totals>> totals = null;
         synchronized (LOCK) {
-            INSTANCE_COUNT--;
-            if (INSTANCE_COUNT <= 0){
+            instanceCount--;
+            if (instanceCount <= 0){
                 totals = ACCUMULATORS.entrySet();
             }
         }

Recipes in example diff:

pway99 commented 1 year ago

fixed by https://github.com/openrewrite/rewrite/commit/ebe6cee589b476409d36d7795606d4431656c995