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

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


The following commit(s) were added to refs/heads/master by this push:
     new 049697b00b fix: support unmodifiable collections as input for 
CollectionProperty
049697b00b is described below

commit 049697b00b2b37e212cb8beb274bc78808964529
Author: Vladimir Sitnikov <[email protected]>
AuthorDate: Fri Jun 16 09:28:50 2023 +0300

    fix: support unmodifiable collections as input for CollectionProperty
    
    Previously, CollectionProperty.normalizeCollection failed to create a copy
    of the input collection, and it resulted in null value.
    
    How we create ArrayList or LinkedHashSet instead.
---
 .../testelement/property/AbstractProperty.java     | 21 +++++++++++--
 .../testelement/property/CollectionPropertyTest.kt | 34 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 2 deletions(-)

diff --git 
a/src/core/src/main/java/org/apache/jmeter/testelement/property/AbstractProperty.java
 
b/src/core/src/main/java/org/apache/jmeter/testelement/property/AbstractProperty.java
index 0b0ff4ef6c..5c6fcb8dc1 100644
--- 
a/src/core/src/main/java/org/apache/jmeter/testelement/property/AbstractProperty.java
+++ 
b/src/core/src/main/java/org/apache/jmeter/testelement/property/AbstractProperty.java
@@ -17,8 +17,12 @@
 
 package org.apache.jmeter.testelement.property;
 
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.jmeter.testelement.TestElement;
 import org.slf4j.Logger;
@@ -296,13 +300,26 @@ public abstract class AbstractProperty implements 
JMeterProperty {
      */
     protected Collection<JMeterProperty> normalizeList(Collection<?> coll) {
         try {
-            @SuppressWarnings("unchecked") // empty collection
-            Collection<JMeterProperty> newColl = 
coll.getClass().getDeclaredConstructor().newInstance();
+            Collection<JMeterProperty> newColl;
+            try {
+                @SuppressWarnings("unchecked")
+                Collection<JMeterProperty> tmp = 
coll.getClass().getDeclaredConstructor().newInstance();
+                newColl = tmp;
+            } catch (Exception e) {
+                if (coll instanceof List) {
+                    newColl = new ArrayList<>(coll.size());
+                } else if (coll instanceof Set) {
+                    newColl = new LinkedHashSet<>();
+                } else {
+                    throw e;
+                }
+            }
             for (Object item : coll) {
                 newColl.add(convertObject(item));
             }
             return newColl;
         } catch (Exception e) {// should not happen
+            // TODO: replace with throwing an error, however it might break 
backward compatibility
             log.error("Cannot create copy of {}", coll.getClass(), e);
             return null;
         }
diff --git 
a/src/core/src/test/java/org/apache/jmeter/testelement/property/CollectionPropertyTest.kt
 
b/src/core/src/test/java/org/apache/jmeter/testelement/property/CollectionPropertyTest.kt
new file mode 100644
index 0000000000..57d6c73b7c
--- /dev/null
+++ 
b/src/core/src/test/java/org/apache/jmeter/testelement/property/CollectionPropertyTest.kt
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.testelement.property
+
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+
+class CollectionPropertyTest {
+    @Test
+    fun `creates with immutable list`() {
+        val inputValues = listOf(1, 2)
+        val prop = CollectionProperty("property_name", inputValues)
+        Assertions.assertEquals(
+            inputValues.toString(),
+            (prop.objectValue as? List<*>).toString(),
+            "CollectionProperty should contain the same elements as in the 
input"
+        )
+    }
+}

Reply via email to